Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
135 commits
Select commit Hold shift + click to select a range
2d2339d
feat(app): draggable project rows (#38055)
arvsrn Jul 21, 2026
cb562b2
chore: generate
opencode-agent[bot] Jul 21, 2026
abc4b83
Zen: gemini 3.6 flash and 3.5 flash lite
fwang Jul 21, 2026
21c4c93
fix(ui): improve progress circle contrast (#38101)
dbpolito Jul 21, 2026
b513faf
fix(app): support nested slash command autocomplete (#38097)
dbpolito Jul 21, 2026
5f241f1
chore: generate
opencode-agent[bot] Jul 21, 2026
0317531
zen: add laguna-2-2.1
fwang Jul 21, 2026
c40e3e7
zen: add security check
fwang Jul 21, 2026
76ced54
chore: generate
opencode-agent[bot] Jul 21, 2026
4438f69
zen: add security check
fwang Jul 21, 2026
130038e
fix(app): defer unavailable notification state (#38186)
opencode-agent[bot] Jul 22, 2026
c9db6e9
fix(app): show running shell command (#38080)
opencode-agent[bot] Jul 22, 2026
0a601cf
fix(docs): correct Kimi K2.7 Code request limits (#38248)
MrMushrooooom Jul 22, 2026
50eee1f
fix(provider): correct MiniMax M3 thinking variants (#38330)
rekram1-node Jul 22, 2026
411eff7
feat(go): add Hy3 to Go model lineup (#38349)
MrMushrooooom Jul 22, 2026
542ba88
fix(provider): select prompt cache keys by SDK (#38424)
rekram1-node Jul 23, 2026
fada1a5
fix(provider): serialize Mistral prompt cache keys (#38448)
rekram1-node Jul 23, 2026
92cede0
chore: update nix node_modules hashes
opencode-agent[bot] Jul 23, 2026
e45210c
chore(app): vendor v2 promise client (#38467)
Brendonovich Jul 23, 2026
84c79c1
chore: update nix node_modules hashes
opencode-agent[bot] Jul 23, 2026
d03e0c5
feat(app): add dual-server compatibility (#38462)
Brendonovich Jul 23, 2026
347510a
chore: generate
opencode-agent[bot] Jul 23, 2026
e59ba24
feat(app): support current event transport (#38464)
Brendonovich Jul 23, 2026
62e4641
chore: generate
opencode-agent[bot] Jul 23, 2026
20589d6
fix(provider): preserve Mistral reasoning history (#38453)
rekram1-node Jul 23, 2026
743f641
chore: update nix node_modules hashes
opencode-agent[bot] Jul 23, 2026
204f48d
docs(zen): add Ling 3.0 Flash free model (#38503)
MrMushrooooom Jul 24, 2026
37c263e
feat(app): project current server state (#38459)
Brendonovich Jul 24, 2026
adba484
chore: generate
opencode-agent[bot] Jul 24, 2026
db88c42
fix(app): hydrate v1 session progress (#38606)
Brendonovich Jul 24, 2026
ce9a875
feat(app): render current session timeline (#38466)
Brendonovich Jul 24, 2026
090a26a
chore: generate
opencode-agent[bot] Jul 24, 2026
29af2e3
feat(app): migrate session interactions (#38461)
Brendonovich Jul 24, 2026
386afb7
chore: generate
opencode-agent[bot] Jul 24, 2026
589ef16
refactor(app): split home view controllers (#38607)
Brendonovich Jul 24, 2026
5ce89dc
chore: generate
opencode-agent[bot] Jul 24, 2026
d07323e
feat(app): migrate discovery workflows (#38465)
Brendonovich Jul 24, 2026
2ea4bb7
chore: generate
opencode-agent[bot] Jul 24, 2026
a48912c
fix(app): restore directory-scoped session status for v1 servers (#38…
Brendonovich Jul 24, 2026
55f4a26
fix(app): preserve paginated timeline order (#38641)
Brendonovich Jul 24, 2026
3819848
feat(app): support current review data (#38460)
Brendonovich Jul 24, 2026
bce2992
chore: generate
opencode-agent[bot] Jul 24, 2026
ce7f54d
fix(app): make prompt input agent toggle reactive (#38653)
Brendonovich Jul 24, 2026
57ddfeb
fix(app): classify existing web profiles for layout transition (#38117)
dleopold Jul 24, 2026
c4545ab
chore: generate
opencode-agent[bot] Jul 24, 2026
91ed256
refactor(app): resolve server protocol state (#38648)
Brendonovich Jul 24, 2026
80a4fe8
fix(app): remove diff rendering from file-specific tabs (#38662)
Brendonovich Jul 24, 2026
3337495
chore: generate
opencode-agent[bot] Jul 24, 2026
aaa42fe
fix(app): isolate v2 servers from legacy layout (#38649)
Brendonovich Jul 24, 2026
67a0478
fix(app): gate config permission auto-accept (#38650)
Brendonovich Jul 24, 2026
ad78ef5
feat(app): support current pty transport (#38463)
Brendonovich Jul 24, 2026
ae4be98
chore: generate
opencode-agent[bot] Jul 24, 2026
b628066
fix(app): preserve inline file mentions (#38663)
Brendonovich Jul 24, 2026
9ba82a1
fix(app): gate legacy server features (#38651)
Brendonovich Jul 24, 2026
66495a2
chore: generate
opencode-agent[bot] Jul 24, 2026
909db63
fix(app): restore optimistic timeline state (#38693)
Brendonovich Jul 24, 2026
e639969
fix(opencode): preserve grep symlink paths (#38581)
remixz Jul 24, 2026
f516651
fix(opencode): preserve grep symlink paths (#38581)
remixz Jul 24, 2026
e62b09e
zen: opus 5
fwang Jul 24, 2026
553b42f
Merge branch 'dev' of github.com:anomalyco/opencode into dev
fwang Jul 24, 2026
4b19ea2
fix(llm): preserve response message phases (#38452)
rekram1-node Jul 24, 2026
53669ca
chore: generate
opencode-agent[bot] Jul 24, 2026
7840562
fix(llm): revert response message phases (#38761)
rekram1-node Jul 24, 2026
2b2aacc
fix(provider): generalize Claude adaptive thinking (#38757)
rekram1-node Jul 24, 2026
a85d8d2
sync release versions for v1.18.5
Jul 24, 2026
065dc27
fix(core): branch-keyed repository cache with gated reference readine…
kitlangton Jul 25, 2026
5e2a625
chore: generate
opencode-agent[bot] Jul 25, 2026
9e8b217
fix(app): refresh V1 providers after auth (#38786)
opencode-agent[bot] Jul 25, 2026
2b2b69d
fix(app): refresh V1 MCP state (#38816)
Brendonovich Jul 25, 2026
0a6637e
chore(app): vendor v2 client snapshot (#38818)
Brendonovich Jul 25, 2026
7534d23
chore: update nix node_modules hashes
opencode-agent[bot] Jul 25, 2026
7d8195e
fix(ui): keep mutable selects open (#39027)
ProdigyRahul Jul 27, 2026
1ad63cf
sync release versions for v1.18.6
Jul 27, 2026
759f6af
fix(app): add scroll to project selector dropdown (#39016)
david1gp Jul 27, 2026
7ffc22c
chore: generate
opencode-agent[bot] Jul 27, 2026
9ca2b44
Connect provider e2e test (#39039)
Brendonovich Jul 27, 2026
de78da8
chore: generate
opencode-agent[bot] Jul 27, 2026
09afffe
fix(app): preserve shadowed command owners (#39044)
Brendonovich Jul 27, 2026
a9afed0
fix(desktop): remove titlebar inset in fullscreen (#38793)
Hona Jul 27, 2026
35075bb
fix(desktop): install Electron before development (#39052)
Hona Jul 27, 2026
bc2d3df
sync release versions for v1.18.7
Jul 27, 2026
b06768a
feat(app): add project selector shortcut (#39074)
Brendonovich Jul 27, 2026
4469cec
refactor(app): move prompt effects into controller (#39073)
Brendonovich Jul 27, 2026
0b4edfc
chore: generate
opencode-agent[bot] Jul 27, 2026
e1c4194
refactor(app): extract tab rename adapter (#39079)
Brendonovich Jul 27, 2026
4f62295
fix(app): contain right panel suspense (#39080)
Brendonovich Jul 27, 2026
55b0211
feat(desktop): use bg layer 4 for v2 switch (#39085)
usrnk1 Jul 27, 2026
78f5764
fix(console): stabilize brand download icons in Safari (#39151)
opencode-agent[bot] Jul 27, 2026
a9bebd3
docs(zen): add Kimi K3 (#39152)
MrMushrooooom Jul 27, 2026
8e8d38c
fix(app): prevent freeze when closing projects (#39158)
Brendonovich Jul 27, 2026
8dc539b
fix(core): correct MCP environment field in built-in skill (#39175)
OpeOginni Jul 27, 2026
40e4d73
fix(console): avoid Safari brand icon repaint (#39154)
opencode-agent[bot] Jul 27, 2026
7ae1be5
fix(desktop): use channel database in local runs (#39209)
Hona Jul 28, 2026
1274408
fix(desktop): install AppStream metainfo in Linux packages (#36872)
develop7 Jul 28, 2026
91508f6
chore: generate
opencode-agent[bot] Jul 28, 2026
c39ad38
fix(app): refresh global provider state (#39220)
Brendonovich Jul 28, 2026
970c382
chore: generate
opencode-agent[bot] Jul 28, 2026
284e970
fix(app): use blue for server status attention (#39217)
Brendonovich Jul 28, 2026
029f5aa
chore: bump gitlab-ai-provider to 6.12.0 (#39096)
vglafirov Jul 28, 2026
b72d7b6
refactor(app): separate model selector controller and view (#39084)
Brendonovich Jul 28, 2026
3cc7016
chore: generate
opencode-agent[bot] Jul 28, 2026
3f9dad3
chore: update nix node_modules hashes
opencode-agent[bot] Jul 28, 2026
237e694
fix(app): expand Windows file tree folders (#39249)
opencode-agent[bot] Jul 28, 2026
87db7a7
fix(app): follow visual tab order (#39241)
Brendonovich Jul 28, 2026
9c8060d
refactor(app): extract keybind settings controller (#39226)
Brendonovich Jul 28, 2026
921b1c6
feat(mcp): upgrade client SDK to v2 (#39247)
rekram1-node Jul 28, 2026
d50b9e8
chore: generate
opencode-agent[bot] Jul 28, 2026
5e39051
fix(provider): omit deprecated Gemini sampling defaults (#38924)
opencode-agent[bot] Jul 28, 2026
172d08c
chore: update nix node_modules hashes
opencode-agent[bot] Jul 28, 2026
c3be6c4
fix(mcp): honor callback port in debug (#39259)
rekram1-node Jul 28, 2026
484f00e
fix(mcp): recover expired SDK sessions (#39265)
rekram1-node Jul 28, 2026
c8487ba
chore: update nix node_modules hashes
opencode-agent[bot] Jul 28, 2026
8021dbd
sync release versions for v1.18.8
Jul 28, 2026
d46be56
refactor(app): thin new session composition (#39227)
Brendonovich Jul 28, 2026
7dae9a1
chore: generate
opencode-agent[bot] Jul 28, 2026
95636bd
feat(desktop): collapse model provider sections (#39283)
usrnk1 Jul 28, 2026
8c81f9a
refactor(app): extract v2 settings controllers (#39228)
Brendonovich Jul 28, 2026
1ead8d8
fix(app): localize home session suspense (#39285)
Brendonovich Jul 28, 2026
9e432a6
feat(desktop): add opt-in v2 sidecar (#39286)
Brendonovich Jul 28, 2026
7c89824
fix(desktop): patch @dnd-kit/solid to preserve core scroll plugins (#…
roborew Jul 28, 2026
be93cec
fix(app): guard reentrant Solid cleanup (#39261)
opencode-agent[bot] Jul 28, 2026
e158758
chore: generate
opencode-agent[bot] Jul 28, 2026
7336cc5
chore: update nix node_modules hashes
opencode-agent[bot] Jul 28, 2026
017a597
feat(desktop): remove v2 vertical menu borders (#39317)
usrnk1 Jul 28, 2026
7edefb3
chore(mcp): upgrade client to 2.0.0 (#39369)
opencode-agent[bot] Jul 28, 2026
982a904
fix(mcp): restore legacy SDK compatibility (#39373)
rekram1-node Jul 28, 2026
d8a9d8a
chore: generate
opencode-agent[bot] Jul 28, 2026
f28d72d
chore: update nix node_modules hashes
opencode-agent[bot] Jul 28, 2026
a45c2b9
sync release versions for v1.18.9
Jul 28, 2026
f256a4c
fix(app): preserve agent picker for existing users (#39300)
Brendonovich Jul 29, 2026
8cbea4f
chore: generate
opencode-agent[bot] Jul 29, 2026
e8b0992
fix(app): defer model variant selector (#39445)
Brendonovich Jul 29, 2026
035a5a1
feat(desktop): refine tab states (#39472)
usrnk1 Jul 29, 2026
7565e03
chore: generate
opencode-agent[bot] Jul 29, 2026
b275e5f
Merge remote-tracking branch 'upstream/dev' into claude/amazing-goldb…
claude Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 0 additions & 4 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,6 @@ jobs:

build-electron:
needs:
- build-cli
- version
if: github.repository == 'anomalyco/opencode'
continue-on-error: false
Expand Down Expand Up @@ -316,10 +315,7 @@ jobs:
env:
OPENCODE_VERSION: ${{ needs.version.outputs.version }}
OPENCODE_CHANNEL: ${{ (github.ref_name == 'beta' && 'beta') || 'prod' }}
OPENCODE_CLI_ARTIFACT: ${{ (runner.os == 'Windows' && 'opencode-cli-windows') || 'opencode-cli' }}
RUST_TARGET: ${{ matrix.settings.target }}
GH_TOKEN: ${{ github.token }}
GITHUB_RUN_ID: ${{ github.run_id }}

- name: Build
run: bun run build
Expand Down
88 changes: 52 additions & 36 deletions bun.lock

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions nix/hashes.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"nodeModules": {
"x86_64-linux": "sha256-qt11SKmOjq0KU542QFbs+u7YyJicn4drCcwCdg325yk=",
"aarch64-linux": "sha256-z68doReXTrWS7HeiAjc0btIjAsvzeZZ7hXAlHr0c77Q=",
"aarch64-darwin": "sha256-PILYH1Pi8XBvSkuZ+1sNnUTao5kba+m5Z8iJKx6YXPo=",
"x86_64-darwin": "sha256-KpcJzP4m0SUavu/WaSffgzOxrHq8ljdy0GOzs9p16lo="
"x86_64-linux": "sha256-/ZtluLolVq1ZFAYgbDScze9GZR0NF9baRQXvfEoOnkI=",
"aarch64-linux": "sha256-kdh7Dpira7cx9lvtozFsjLrDqMBrUMcgxkhfsqrutws=",
"aarch64-darwin": "sha256-chPeMCX+8hvOQ32hTANIn7FmONsSv9t3dKTWTaHerjs=",
"x86_64-darwin": "sha256-rMc0dDZB+YbXrjYwXTIt7QvHUxSp//wDJQ5hUdR+LYM="
}
}
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,12 +140,14 @@
"@types/node": "catalog:"
},
"patchedDependencies": {
"@dnd-kit/dom@0.5.0": "patches/@dnd-kit%2Fdom@0.5.0.patch",
"@ff-labs/fff-bun@0.9.3": "patches/@ff-labs%2Ffff-bun@0.9.3.patch",
"@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch",
"@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch",
"@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch",
"solid-js@1.9.10": "patches/solid-js@1.9.10.patch",
"@ai-sdk/xai@3.0.102": "patches/@ai-sdk%2Fxai@3.0.102.patch",
"@ai-sdk/mistral@3.0.51": "patches/@ai-sdk%2Fmistral@3.0.51.patch",
"gcp-metadata@8.1.2": "patches/gcp-metadata@8.1.2.patch",
"pacote@21.5.0": "patches/pacote@21.5.0.patch",
"@ai-sdk/google@3.0.73": "patches/@ai-sdk%2Fgoogle@3.0.73.patch",
Expand Down
220 changes: 220 additions & 0 deletions packages/app/V1_API_MIGRATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
# V1 API Migration Checklist

The app is currently hybrid. In this document, V1 refers to the legacy unprefixed server APIs used by `@opencode-ai/sdk/v2`, despite the SDK package name.

## Events

- [x] Replace `GET /global/event` with `GET /api/event`.
- `src/context/server-sdk.tsx`
- [x] Reduce current granular session and message events into the existing app projections.
- `src/context/server-session-v2-reducer.ts`
- `src/context/server-session.ts`
- [ ] Remove transitional session event dependencies: `session.created`, `session.updated`, `session.diff`, `session.status`, `session.idle`, and `session.error`.
- `src/context/global-sync/event-reducer.ts`
- `src/context/server-session.ts`
- `src/context/notification.tsx`
- `src/pages/session/usage-exceeded-dialogs.tsx`
- [ ] Remove legacy message event compatibility: `message.updated`, `message.removed`, `message.part.updated`, `message.part.removed`, and `message.part.delta`.
- `src/context/global-sync/event-reducer.ts`
- `src/context/server-session.ts`
- [x] Adapt current permission and question events to the existing request model.
- `src/context/global-sync/event-reducer.ts`
- `src/context/permission.tsx`
- [x] Consume current file watcher events.
- `src/context/file.tsx`
- [x] Consume current VCS events.
- `src/context/global-sync/event-reducer.ts`
- `src/pages/session.tsx`
- [x] Consume current `pty.exited` events.
- `src/context/terminal.tsx`
- [ ] Migrate LSP and reference events.
- `src/context/global-sync/event-reducer.ts`

## Sessions

- [x] Replace `GET /session/status` with one server-scoped `GET /api/session/active` snapshot plus V2 execution events.
- `src/context/server-sync.tsx`
- [x] Migrate session listing from `GET /session`.
- `src/context/server-sync.tsx`
- `src/context/directory-sync.ts`
- `src/pages/layout.tsx`
- [x] Migrate the remaining direct session read from `GET /session/:sessionID`.
- `src/components/titlebar.tsx`
- [x] Migrate session updates from `PATCH /session/:sessionID`.
- `src/context/directory-sync.ts`
- `src/context/layout.tsx`
- `src/pages/home.tsx`
- `src/pages/layout.tsx`
- `src/pages/session/timeline/message-timeline.tsx`
- `src/components/titlebar-tab-nav.tsx`
- Renames use `POST /api/session/:sessionID/rename`; archival uses `POST /api/session/:sessionID/archive`.
- [x] Migrate session deletion from `DELETE /session/:sessionID`.
- `src/pages/session/timeline/message-timeline.tsx`
- [x] Remove session diff loading from `GET /session/:sessionID/diff`.
- Historical Session diffs remain unavailable until the current API defines their snapshot semantics.
- [x] Migrate abort from `POST /session/:sessionID/abort`.
- `src/components/prompt-input/submit.ts`
- `src/pages/session/use-session-commands.tsx`
- `src/pages/session.tsx`
- [x] Migrate revert and unrevert from `POST /session/:sessionID/revert` and `POST /session/:sessionID/unrevert`.
- `src/pages/session/use-session-commands.tsx`
- `src/pages/session.tsx`
- [x] Replace `POST /session/:sessionID/summarize` with the current compact API.
- `src/pages/session/use-session-commands.tsx`
- [x] Migrate slash commands from `POST /session/:sessionID/command`.
- `src/components/prompt-input/submit.ts`
- [x] Migrate shell execution from `POST /session/:sessionID/shell`.
- `src/components/prompt-input/submit.ts`
- [x] Migrate session fork from `POST /session/:sessionID/fork`.
- `src/components/dialog-fork.tsx`
- [ ] Migrate sharing from `POST /session/:sessionID/share` and `DELETE /session/:sessionID/share`.
- `src/pages/session/use-session-commands.tsx`
- `src/pages/session/timeline/message-timeline.tsx`
- Blocked: the current API has no sharing contract or implementation.

## Session Compatibility Fallbacks

These calls are retained as fallback adapters. The current production path supplies the current session and message APIs.

- [ ] Remove fallback `GET /session/:sessionID` after compatibility support is unnecessary.
- `src/context/server-session.ts`
- [ ] Remove fallback `GET /session/:sessionID/message` after compatibility support is unnecessary.
- `src/context/server-session.ts`
- [ ] Remove fallback `GET /session/:sessionID/message/:messageID` after compatibility support is unnecessary.
- `src/context/server-session.ts`

## Filesystem

- [ ] Migrate file listing from `GET /file`.
- `src/context/file.tsx`
- [ ] Migrate file reads from `GET /file/content`.
- `src/context/file.tsx`
- `src/pages/session/review-tab.tsx`
- `src/pages/session/v2/review-panel-v2.tsx`
- [x] Migrate path discovery from `GET /path` to `GET /api/path`.
- `src/context/global-sync/bootstrap.ts`
- `src/components/dialog-select-directory.tsx`
- `src/components/dialog-select-directory-v2.tsx`

## Projects And Worktrees

- [x] Migrate project listing from `GET /project` to `GET /api/project`.
- `src/context/global-sync/bootstrap.ts`
- [x] Migrate the current project lookup from `GET /project/current` to `GET /api/project/current`.
- `src/context/global-sync/bootstrap.ts`
- [ ] Migrate Git initialization from `POST /project/git/init`.
- `src/pages/session.tsx`
- [x] Migrate project updates from `PATCH /project/:projectID` to `PATCH /api/project/:projectID`.
- `src/context/layout.tsx`
- `src/components/edit-project.ts`
- `src/pages/layout.tsx`
- [ ] Migrate experimental worktree listing, creation, removal, and reset from `/experimental/worktree`.
- `src/pages/layout.tsx`
- `src/components/prompt-input/submit.ts`
- Listing now uses `GET /api/project/:projectID/directories`; create, removal, and reset remain.
- [ ] Migrate instance disposal from `POST /instance/dispose`.
- `src/pages/layout.tsx`

## VCS

- [x] Migrate repository information from `GET /vcs` to `GET /api/vcs`.
- `src/context/global-sync/bootstrap.ts`
- [x] Migrate diffs from `GET /vcs/diff` to `GET /api/vcs/diff`.
- `src/pages/session.tsx`
- [x] Migrate status from `GET /vcs/status` to `GET /api/vcs/status`.
- `src/pages/layout.tsx`

## Configuration And Authentication

- [ ] Migrate global configuration reads from `GET /global/config`.
- `src/context/global-sync/bootstrap.ts`
- [ ] Migrate directory configuration reads from `GET /config`.
- `src/context/global-sync/bootstrap.ts`
- [ ] Migrate global configuration updates from `PATCH /global/config`.
- `src/context/server-sync.tsx`
- [x] Migrate provider authentication method discovery from `GET /provider/auth` to `GET /api/integration/:integrationID`.
- `src/components/dialog-connect-provider.tsx`
- [x] Migrate built-in provider OAuth authorization and callbacks to `/api/integration/:integrationID/connect/oauth/*`.
- `src/components/dialog-connect-provider.tsx`
- [ ] Migrate remaining credentials from `PUT /auth/:providerID` and `DELETE /auth/:providerID`.
- Built-in provider key connections now use `POST /api/integration/:integrationID/connect/key`.
- `src/components/dialog-connect-provider.tsx`
- `src/components/dialog-custom-provider.tsx`
- `src/components/settings-providers.tsx`
- `src/components/settings-v2/providers.tsx`
- [ ] Migrate global disposal from `POST /global/dispose`.
- `src/components/dialog-connect-provider.tsx`
- `src/components/settings-providers.tsx`
- `src/components/settings-v2/providers.tsx`

## Permissions And Questions

- [x] Migrate permission listing from `GET /permission` to `GET /api/permission/request`.
- `src/context/global-sync/bootstrap.ts`
- `src/context/permission.tsx`
- [x] Migrate permission responses from `/session/:sessionID/permissions/:permissionID`.
- `src/context/permission.tsx`
- `src/pages/session/composer/session-composer-state.ts`
- [x] Migrate question listing from `GET /question` to `GET /api/question/request`.
- `src/context/global-sync/bootstrap.ts`
- [x] Migrate question replies and rejections from `/question/:requestID/*` to `/api/session/:sessionID/question/:requestID/*`.
- `src/pages/session/composer/session-question-dock.tsx`

## Commands, MCP, LSP, And References

- [x] Migrate command listing from `GET /command` to `GET /api/command`.
- `src/context/global-sync/bootstrap.ts`
- `src/context/server-sync.tsx`
- [x] Migrate MCP listing, connection, and disconnection from `/mcp` to `/api/mcp`.
- `src/context/server-sync.tsx`
- [ ] Replace legacy MCP authentication with the Integration OAuth workflow.
- `src/context/server-sync.tsx`
- [x] Migrate experimental resource listing from `GET /experimental/resource` to `GET /api/mcp/resource`.
- `src/context/server-sync.tsx`
- [ ] Migrate LSP status from `GET /lsp`.
- `src/context/server-sync.tsx`
- [x] Move `GET /api/reference` off the legacy generated SDK transport.
- `src/context/global-sync/bootstrap.ts`

## Search

- [x] Migrate global session search from `GET /experimental/session` to `GET /api/session`.
- `src/components/command-palette.ts`
- `src/components/dialog-command-palette-v2.tsx`

## PTY And Terminal

- [x] Migrate PTY creation, reads, updates, and deletion from `/pty` to `/api/pty`.
- `src/context/terminal.tsx`
- `src/components/terminal.tsx`
- [x] Migrate shell listing from `GET /pty/shells` to `GET /api/pty/shells`.
- `src/components/settings-general.tsx`
- `src/components/settings-v2/general.tsx`
- [x] Migrate connection tokens from `POST /pty/:ptyID/connect-token` to `POST /api/pty/:ptyID/connect-token`.
- `src/components/terminal.tsx`
- [x] Migrate the direct WebSocket connection from `/pty/:ptyID/connect` to `/api/pty/:ptyID/connect`.
- `src/components/terminal.tsx`

## Legacy Types And Adapters

These are not V1 network requests, but they keep the UI coupled to V1 data contracts.

- [ ] Replace the current-session-to-legacy-session adapter.
- `src/utils/session.ts`
- [ ] Replace the current-message-to-legacy-message-and-part adapter.
- `src/utils/session-message.ts`
- [ ] Replace current agent, provider, and model adapters to legacy SDK structures.
- `src/context/global-sync/utils.ts`
- [ ] Replace legacy `Session`, `Message`, `Part`, `PermissionRequest`, `QuestionRequest`, `Project`, `FileNode`, `FileDiffInfo`, and `Event` types throughout app state and rendering.
- [ ] Remove the `@opencode-ai/sdk` runtime dependency after all legacy calls and types are gone.
- `package.json`

## Test Infrastructure

- [ ] Replace V1 endpoint mocks with current API mocks.
- `e2e/utils/mock-server.ts`
- [x] Replace `/global/event` and `/event` interception with current event transport handling.
- `e2e/utils/sse-transport.ts`
- [ ] Replace `SessionV1` and legacy SDK fixtures in timeline performance tests.
- `e2e/performance/timeline-stability/fixture.ts`
- [ ] Remove remaining legacy SDK type fixtures from unit and browser tests.
2 changes: 2 additions & 0 deletions packages/app/e2e/performance/timeline-stability/fixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ export async function setupTimeline(
locale?: string
deviceScaleFactor?: number
seedHistory?: boolean
protocol?: "v1" | "v2"
} = {},
) {
const sessions = input.sessions ?? [session()]
Expand All @@ -114,6 +115,7 @@ export async function setupTimeline(
retry: input.eventRetry ?? 20,
})
await mockOpenCodeServer(page, {
protocol: input.protocol,
directory,
project: project(),
provider: provider(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,12 @@ const assistants = Array.from({ length: 14 }, (_, index) => {
const messages = [user, ...assistants]
const target = fixture.sessions.find((session) => session.id === fixture.targetID)!
const lastID = userID
const lastPartID = assistants.at(-1)!.parts.at(-1)!.id
const lastAssistant = assistants.at(-1)!
const lastPart = lastAssistant.parts.at(-1)!
const lastPartID =
lastPart.type === "tool"
? lastPart.id
: `${lastAssistant.info.id}:${lastPart.type}:${lastAssistant.parts.filter((part) => part.type === lastPart.type).length - 1}`

benchmark("hydrates an orphaned latest turn after a cold session click", async ({ browser, report }, testInfo) => {
benchmark.setTimeout(180_000)
Expand Down Expand Up @@ -107,9 +112,25 @@ async function trial(page: Page, mode: ParentHydrationBenchmarkMode) {
return { items: items.slice(start, end), cursor: start > 0 ? items[start]!.info.id : undefined }
},
})
await page.route(`**/session/${fixture.targetID}`, (route) =>
route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify(target) }),
)
await page.route(`**/session/${fixture.targetID}`, (route) => {
const current = new URL(route.request().url()).pathname.startsWith("/api/")
return route.fulfill({
status: 200,
contentType: "application/json",
body: JSON.stringify(
current
? {
data: {
...target,
cost: 0,
tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } },
location: { directory: target.directory },
},
}
: target,
),
})
})
await installStressSessionTabs(page, { sessionIDs: [fixture.sourceID] })
await page.goto(stressSessionHref(fixture.sourceID))
await expectSessionTitle(page, fixture.expected.sourceTitle)
Expand Down Expand Up @@ -144,8 +165,8 @@ async function trial(page: Page, mode: ParentHydrationBenchmarkMode) {
parent: requests.filter((request) => request.type === "parent").length,
}
if (mode === "candidate") {
expect(requestCounts.parent).toBe(1)
expect(historyGates).toBe(1)
expect(requestCounts.parent).toBe(0)
expect(historyGates).toBe(0)
}
return { metrics, requestCounts, historyGateCount: historyGates }
}
Loading