Skip to content

feat!: drop laptop transcript sync, move to SDK 0.13.0 - #129

Merged
hbrooks merged 1 commit into
mainfrom
drop-laptop-sync-sdk-0.13.0
Aug 21, 2026
Merged

feat!: drop laptop transcript sync, move to SDK 0.13.0#129
hbrooks merged 1 commit into
mainfrom
drop-laptop-sync-sdk-0.13.0

Conversation

@hbrooks

@hbrooks hbrooks commented Aug 21, 2026

Copy link
Copy Markdown
Member

Summary

  • Removes laptop transcript sync whole: agent hook (install/uninstall/status/log/stats/enroll/unenroll), agent session sync, agent session handoff, src/lib/laptop.ts, and the enrolledRepos config field. The /sessions/sync and /sessions/laptop endpoints are gone server-side, so shipped CLIs 404 on every background sync.
  • Moves the git helpers the rest of the CLI still needs (repoFromCwd, repoFromRemoteUrl) out of laptop.ts into src/lib/git.ts.
  • Bumps @ellipsis-dev/sdk to 0.13.0 and migrates the session-shape changes that came with it.
  • Pads the chat header off the line above it (unrelated one-liner, bundled).

SDK 0.13.0 migration

Beyond the sync removal, 0.13.0 restructured sessions. Each break was a compile error after the bump:

Was Now
session.config_id session.agent.config_id / session.agent.config.ellipsis.name (via new sessionConfigName())
session.live_summary session.summary.description
start response resolved_config_name / resolution_source session.agent.source on the returned session
defaults.list() returning {defaults: [row]} {account, repositories} map
defaults.set() returning {default: row} the whole ladder
SessionSource including laptop removed; sessionSource() and the sidebar filter go with it

Behavior changes worth a look

  • agent config default list loses its STATUS and UPDATED columns: the ladder no longer carries broken or updated_at. It keeps CONFIG by joining agents.configs.list() client-side, at the cost of one extra request, rather than printing bare ids.
  • agent config default set echoes the rung it wrote from the request, since the response no longer names it.
  • The repo-rung lookup matches case-insensitively: repoFromCwd reads the case from your git remote while the server stores GitHub's spelling, so a direct index would silently miss the rung.

Test plan

  • npm run typecheck
  • npx vitest run (427 passed)
  • npm run build
  • agent config default / default list / default set against a real account, to confirm the joined-name table and the rung echo
  • agent session list --source rejects laptop with the shortened source list

Important

Removes laptop transcript sync and upgrades to SDK 0.13.0, which restructured sessions.

  • Deletes agent hook, agent session sync, agent session handoff commands and the enrolledRepos config field; git helpers move from src/lib/laptop.ts to src/lib/git.ts
  • Session shape: session.config_idsession.agent.config_id, session.live_summarysession.summary.description, SessionSource.laptop removed
  • API response shapes: defaults.list() returns {account, repositories} maps instead of {defaults: [...]}, and defaults.set() returns the ladder instead of a single row
  • agent config default list loses STATUS and UPDATED columns (now joined from agents.configs.list() client-side)
  • agent config default set echoes the rung from the request (no longer in response)
  • Repo-rung lookup now case-insensitive

This description was created by Ellipsis for 829bf87. It will automatically update as commits are pushed.

The /sessions/sync and /sessions/laptop endpoints are gone server-side, so
shipped CLIs 404 on every background sync. Removes the client half whole:
the hook install/enroll commands, the spool-and-retry plumbing, the local
redaction pass, and laptop to cloud handoff. The git helpers the rest of
the CLI still needs move to src/lib/git.ts.

SDK 0.13.0 also restructured sessions: the config identity moved under
session.agent, live_summary became summary.description, the start response
no longer resolves a config name, and the defaults ladder is a map instead
of a row list. Migrated each call site. "config default list" joins the
account's configs to keep showing names, since the ladder carries ids only.

Also pads the chat header off the line above it.
@hbrooks
hbrooks merged commit dfcb1b3 into main Aug 21, 2026
1 check passed

@ellipsis-dev ellipsis-dev Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Changes requested ❌ — 2 issues

Reviewed 829bf87 in 7 minutes, 53 seconds.
  • Reviewed 1 commit with 551 lines of code in 28 files
  • Ran 1 review agent producing 2 comments where 2 were posted
  • This pipeline runs no gatekeeper, so findings are posted as written.
  • View full details on ellipsis.dev

This review was created by Ellipsis. You can tag @ellipsis in this pull request.

Comment thread src/commands/session.tsx
// The connect UI shows the config in its footer meta line (anything
// printed before the app would land in scrollback); every other
// mode prints this note.
const resolvedConfigName = sessionConfigName(session)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line throws in all four session start prompt positional tests, which still pass — test/session.test.ts's fixture was not updated to the new agent shape, so session start's whole post-start path is now unexercised.

npx vitest run test/session.test.ts prints error: Cannot read properties of undefined (reading 'config') four times and exits 0: the fixture at test/session.test.ts:16 still carries the old top-level config_id: null with no agent, sessionConfigName dereferences session.agent.config, and runAction swallows the TypeError into console.error + process.exitCode. The tests assert only on the request body captured by the fetch mock, so the config note, --json print, and printSessionSummary are never reached. test/sessions.test.ts and test/screenshot.test.ts got the new agent stub; this fixture was missed.

Comment thread src/commands/config.ts
Comment on lines +281 to +282
const rung = repoRung ? `repo default for ${repo}` : 'account default'
console.log(`using config "${effective}" (${rung})`)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agent config default now prints the raw config id where it printed the config's name — using config "cfg_01K9..." (account default) instead of using config "code-reviewer". Same at line 352 for default set.

The ladder carries ids only, and effective is a bare id string; the old code printed defaultName(effective) = config_name ?? config_id. default list (line 316) went to the trouble of joining agents.configs.list() to keep names, so the two sibling commands now disagree on what they show for the same rung.

Suggested change
const rung = repoRung ? `repo default for ${repo}` : 'account default'
console.log(`using config "${effective}" (${rung})`)
const rung = repoRung ? `repo default for ${repo}` : 'account default'
const names = new Map(
(await api().agents.configs.list()).configs.map((c) => [c.id, configName(c)]),
)
console.log(`using config "${names.get(effective) ?? effective}" (${rung})`)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant