v1.17.9 merge — v2 architecture follow-ups (not shipped in PR #964)
PR #964 brings in OpenCode v1.17.9, which introduces a v2 architecture across new workspaces (packages/cli, packages/server, packages/core, the standalone v2 SDK, and v2-mode packages/tui hydration). These packages are not wired into the shipped @altimateai/altimate-code binary, which runs on the legacy Hono server + packages/opencode. The Codex reviewer raised the items below against that v2 code.
Tracking them here so the merge can land; they become actionable if/when we adopt the v2 runtime. Branding-related ones (Altimate CORS origins, .altimate-code config discovery, Altimate global paths) are tagged so they're not lost in that adoption.
Source: review threads on PR #964 (resolved there with a pointer to this issue).
packages/core (22)
- P1
packages/core/src/plugin/agent.ts:114 — Restore bash safety rules for V2 agents
- P1
packages/core/src/tool/read.ts:57 — Require external-directory approval for absolute reads
- P1
packages/core/src/tool/read.ts:58 — Gate absolute reads with external-directory policy
- P1
packages/core/src/tool/write.ts:78 — Gate V2 mutations with sensitive_write
- P2
packages/core/src/config.ts:182 — Discover .altimate-code config directories
- P2
packages/core/src/config.ts:182 — Discover the branded project config directory
- P2
packages/core/src/config.ts:204 — Load inline config supplied by SDK helpers
- P2
packages/core/src/database/migration.ts:215 — Recheck migration ownership inside each transaction
- P2
packages/core/src/global.ts:0 — Use Altimate global storage paths
- P2
packages/core/src/global.ts:0 — Use the fork's global app directory
- P2
packages/core/src/instruction-context.ts:55 — Load configured instruction sources
- P2
packages/core/src/project/copy.ts:179 — Seed v2 project roots before creating copies
- P2
packages/core/src/project/copy.ts:196 — Constrain project-copy names to the destination
- P2
packages/core/src/session.ts:207 — Record project directories when creating sessions
- P2
packages/core/src/session.ts:268 — Apply subpath filters when listing project sessions
- P2
packages/core/src/session.ts:268 — Apply the subpath filter when listing sessions
- P2
packages/core/src/session/projector.ts:425 — Roll v2 step usage into session totals
- P2
packages/core/src/session/runner/llm.ts:183 — Wait for plugin boot before selecting the runner agent
- P2
packages/core/src/state.ts:63 — Publish update events after committing rebuilt state
- P2
packages/core/src/tool/application-tools.ts:53 — Release public tool registrations with the scope
- P2
packages/core/src/tool/bash.ts:142 — Enforce external-directory approvals for bash arguments
- P2
packages/core/src/tool/builtins.ts:27 — Register a V2 task tool for subagents
packages/server (18)
- P1
packages/server/src/handlers.ts:51 — Wire SessionV2 to local execution
- P1
packages/server/src/handlers.ts:52 — Wire SessionV2 to the local executor
- P2
packages/server/src/cors.ts:3 — Allow Altimate hosted origins
- P2
packages/server/src/cors.ts:3 — Allow the branded web origin in CORS
- P2
packages/server/src/groups/event.ts:20 — Type SSE events as Event payloads
- P2
packages/server/src/groups/fs.ts:22 — Add a real path parameter for fs.read
- P2
packages/server/src/groups/fs.ts:22 — Expose the file path in the fs.read contract
- P2
packages/server/src/handlers/command.ts:8 — Wait for plugin boot before listing commands
- P2
packages/server/src/handlers/command.ts:8 — Wait for plugin boot before returning commands
- P2
packages/server/src/handlers/integration.ts:26 — Wait for plugin boot before listing integrations
- P2
packages/server/src/handlers/model.ts:22 — Only advertise models the runner can execute
- P2
packages/server/src/handlers/pty.ts:118 — Declare the PTY token header for SDK callers
- P2
packages/server/src/handlers/reference.ts:7 — Wait for plugin boot before listing references
- P2
packages/server/src/handlers/reference.ts:7 — Wait for reference plugins before listing references
- P2
packages/server/src/handlers/session.ts:73 — Honor client directory when creating sessions
- P2
packages/server/src/handlers/session.ts:73 — Honor request location when creating sessions
- P2
packages/server/src/handlers/skill.ts:7 — Wait for plugin boot before listing skills
- P2
packages/server/src/handlers/skill.ts:7 — Wait for skill plugins before listing skills
packages/cli (14)
- P1
packages/cli/src/commands/handlers/serve.ts:19 — Return an authenticated client from SDK server helper
- P1
packages/cli/src/tui.ts:23 — Don't mask provider hydration as empty
- P1
packages/cli/src/tui.ts:23 — Populate legacy bootstrap data from V2 APIs
- P1
packages/cli/src/tui.ts:8 — Pass the active cwd into the TUI client
- P2
packages/cli/package.json:8 — Add the opencode bin alias
- P2
packages/cli/package.json:8 — Expose the command that SDK helpers spawn
- P2
packages/cli/src/commands/commands.ts:8 — Declare TUI launch arguments on the root command
- P2
packages/cli/src/commands/handlers/serve.ts:19 — Expose serve credentials to SDK clients
- P2
packages/cli/src/commands/handlers/serve.ts:20 — Keep serve output compatible with SDK startup
- P2
packages/cli/src/commands/handlers/serve.ts:21 — Emit the startup line the SDK waits for
- P2
packages/cli/src/tui.ts:10 — Forward parsed CLI args into the TUI
- P2
packages/cli/src/tui.ts:10 — Pass the current directory into the TUI
- P2
packages/cli/src/tui.ts:15 — Load built-in TUI plugins in the v2 launcher
- P2
packages/cli/src/tui.ts:7 — Load the user's TUI configuration
packages/tui (21)
- P1
packages/tui/src/component/prompt/index.tsx:1089 — Send prompts through the V2 session route
- P1
packages/tui/src/component/prompt/index.tsx:1089 — Submit prompts through the v2 prompt endpoint
- P1
packages/tui/src/component/prompt/index.tsx:994 — Create new sessions through the v2 endpoint
- P1
packages/tui/src/context/project.tsx:42 — Bootstrap the TUI from implemented location routes
- P1
packages/tui/src/context/project.tsx:42 — Hydrate project state through implemented v2 APIs
- P1
packages/tui/src/context/sdk.tsx:139 — Subscribe to the v2 event stream
- P1
packages/tui/src/context/sync.tsx:709 — Hydrate open sessions through v2 APIs
- P1
packages/tui/src/context/sync.tsx:709 — Hydrate sessions through implemented V2 routes
- P1
packages/tui/src/routes/session/permission.tsx:432 — Reply to permissions through the v2 session endpoint
- P2
packages/tui/src/component/dialog-move-session.tsx:81 — Use an implemented route for project directories
- P2
packages/tui/src/component/dialog-provider.tsx:397 — Connect providers through v2 integration routes
- P2
packages/tui/src/component/dialog-session-list.tsx:250 — Route session deletion through a v2 endpoint
- P2
packages/tui/src/component/prompt/index.tsx:412 — Interrupt sessions through an implemented V2 route
- P2
packages/tui/src/component/prompt/move.tsx:131 — Move sessions through an implemented endpoint
- P2
packages/tui/src/component/prompt/move.tsx:36 — Create project copies without legacy generate-name
- P2
packages/tui/src/component/prompt/move.tsx:39 — Route copy-name generation to an implemented endpoint
- P2
packages/tui/src/context/sdk.tsx:142 — Subscribe to the V2 event stream
- P2
packages/tui/src/routes/session/index.tsx:584 — Compact sessions through the V2 session API
- P2
packages/tui/src/routes/session/permission.tsx:429 — Reply to V2 permission requests via the session API
- P2
packages/tui/src/routes/session/question.tsx:51 — Route question replies through the V2 session API
- P2
packages/tui/src/routes/session/question.tsx:54 — Answer questions through the v2 session endpoint
packages/sdk (1)
- P2
packages/sdk/js/src/v2/client.ts:37 — Only add location query fields where declared
package.json (2)
- P2
package.json:21 — Add new workspaces to the CI path filter
- P2
package.json:21 — Add new workspaces to the TS CI filter
Filed during PR #964 final review. Shipped-path findings from the same review were fixed in c44e0a967a (plugin non-function export guard; fff-bun patch re-key) or dispositioned as by-design (ACP YOLO opt-in; legacy-tool agent threading).
v1.17.9 merge — v2 architecture follow-ups (not shipped in PR #964)
PR #964 brings in OpenCode v1.17.9, which introduces a v2 architecture across new workspaces (
packages/cli,packages/server,packages/core, the standalone v2 SDK, and v2-modepackages/tuihydration). These packages are not wired into the shipped@altimateai/altimate-codebinary, which runs on the legacy Hono server +packages/opencode. The Codex reviewer raised the items below against that v2 code.Tracking them here so the merge can land; they become actionable if/when we adopt the v2 runtime. Branding-related ones (Altimate CORS origins,
.altimate-codeconfig discovery, Altimate global paths) are tagged so they're not lost in that adoption.Source: review threads on PR #964 (resolved there with a pointer to this issue).
packages/core(22)packages/core/src/plugin/agent.ts:114— Restore bash safety rules for V2 agentspackages/core/src/tool/read.ts:57— Require external-directory approval for absolute readspackages/core/src/tool/read.ts:58— Gate absolute reads with external-directory policypackages/core/src/tool/write.ts:78— Gate V2 mutations with sensitive_writepackages/core/src/config.ts:182— Discover.altimate-codeconfig directoriespackages/core/src/config.ts:182— Discover the branded project config directorypackages/core/src/config.ts:204— Load inline config supplied by SDK helperspackages/core/src/database/migration.ts:215— Recheck migration ownership inside each transactionpackages/core/src/global.ts:0— Use Altimate global storage pathspackages/core/src/global.ts:0— Use the fork's global app directorypackages/core/src/instruction-context.ts:55— Load configured instruction sourcespackages/core/src/project/copy.ts:179— Seed v2 project roots before creating copiespackages/core/src/project/copy.ts:196— Constrain project-copy names to the destinationpackages/core/src/session.ts:207— Record project directories when creating sessionspackages/core/src/session.ts:268— Apply subpath filters when listing project sessionspackages/core/src/session.ts:268— Apply the subpath filter when listing sessionspackages/core/src/session/projector.ts:425— Roll v2 step usage into session totalspackages/core/src/session/runner/llm.ts:183— Wait for plugin boot before selecting the runner agentpackages/core/src/state.ts:63— Publish update events after committing rebuilt statepackages/core/src/tool/application-tools.ts:53— Release public tool registrations with the scopepackages/core/src/tool/bash.ts:142— Enforce external-directory approvals for bash argumentspackages/core/src/tool/builtins.ts:27— Register a V2 task tool for subagentspackages/server(18)packages/server/src/handlers.ts:51— Wire SessionV2 to local executionpackages/server/src/handlers.ts:52— Wire SessionV2 to the local executorpackages/server/src/cors.ts:3— Allow Altimate hosted originspackages/server/src/cors.ts:3— Allow the branded web origin in CORSpackages/server/src/groups/event.ts:20— Type SSE events as Event payloadspackages/server/src/groups/fs.ts:22— Add a real path parameter for fs.readpackages/server/src/groups/fs.ts:22— Expose the file path in the fs.read contractpackages/server/src/handlers/command.ts:8— Wait for plugin boot before listing commandspackages/server/src/handlers/command.ts:8— Wait for plugin boot before returning commandspackages/server/src/handlers/integration.ts:26— Wait for plugin boot before listing integrationspackages/server/src/handlers/model.ts:22— Only advertise models the runner can executepackages/server/src/handlers/pty.ts:118— Declare the PTY token header for SDK callerspackages/server/src/handlers/reference.ts:7— Wait for plugin boot before listing referencespackages/server/src/handlers/reference.ts:7— Wait for reference plugins before listing referencespackages/server/src/handlers/session.ts:73— Honor client directory when creating sessionspackages/server/src/handlers/session.ts:73— Honor request location when creating sessionspackages/server/src/handlers/skill.ts:7— Wait for plugin boot before listing skillspackages/server/src/handlers/skill.ts:7— Wait for skill plugins before listing skillspackages/cli(14)packages/cli/src/commands/handlers/serve.ts:19— Return an authenticated client from SDK server helperpackages/cli/src/tui.ts:23— Don't mask provider hydration as emptypackages/cli/src/tui.ts:23— Populate legacy bootstrap data from V2 APIspackages/cli/src/tui.ts:8— Pass the active cwd into the TUI clientpackages/cli/package.json:8— Add the opencode bin aliaspackages/cli/package.json:8— Expose the command that SDK helpers spawnpackages/cli/src/commands/commands.ts:8— Declare TUI launch arguments on the root commandpackages/cli/src/commands/handlers/serve.ts:19— Expose serve credentials to SDK clientspackages/cli/src/commands/handlers/serve.ts:20— Keep serve output compatible with SDK startuppackages/cli/src/commands/handlers/serve.ts:21— Emit the startup line the SDK waits forpackages/cli/src/tui.ts:10— Forward parsed CLI args into the TUIpackages/cli/src/tui.ts:10— Pass the current directory into the TUIpackages/cli/src/tui.ts:15— Load built-in TUI plugins in the v2 launcherpackages/cli/src/tui.ts:7— Load the user's TUI configurationpackages/tui(21)packages/tui/src/component/prompt/index.tsx:1089— Send prompts through the V2 session routepackages/tui/src/component/prompt/index.tsx:1089— Submit prompts through the v2 prompt endpointpackages/tui/src/component/prompt/index.tsx:994— Create new sessions through the v2 endpointpackages/tui/src/context/project.tsx:42— Bootstrap the TUI from implemented location routespackages/tui/src/context/project.tsx:42— Hydrate project state through implemented v2 APIspackages/tui/src/context/sdk.tsx:139— Subscribe to the v2 event streampackages/tui/src/context/sync.tsx:709— Hydrate open sessions through v2 APIspackages/tui/src/context/sync.tsx:709— Hydrate sessions through implemented V2 routespackages/tui/src/routes/session/permission.tsx:432— Reply to permissions through the v2 session endpointpackages/tui/src/component/dialog-move-session.tsx:81— Use an implemented route for project directoriespackages/tui/src/component/dialog-provider.tsx:397— Connect providers through v2 integration routespackages/tui/src/component/dialog-session-list.tsx:250— Route session deletion through a v2 endpointpackages/tui/src/component/prompt/index.tsx:412— Interrupt sessions through an implemented V2 routepackages/tui/src/component/prompt/move.tsx:131— Move sessions through an implemented endpointpackages/tui/src/component/prompt/move.tsx:36— Create project copies without legacy generate-namepackages/tui/src/component/prompt/move.tsx:39— Route copy-name generation to an implemented endpointpackages/tui/src/context/sdk.tsx:142— Subscribe to the V2 event streampackages/tui/src/routes/session/index.tsx:584— Compact sessions through the V2 session APIpackages/tui/src/routes/session/permission.tsx:429— Reply to V2 permission requests via the session APIpackages/tui/src/routes/session/question.tsx:51— Route question replies through the V2 session APIpackages/tui/src/routes/session/question.tsx:54— Answer questions through the v2 session endpointpackages/sdk(1)packages/sdk/js/src/v2/client.ts:37— Only add location query fields where declaredpackage.json(2)package.json:21— Add new workspaces to the CI path filterpackage.json:21— Add new workspaces to the TS CI filterFiled during PR #964 final review. Shipped-path findings from the same review were fixed in
c44e0a967a(plugin non-function export guard; fff-bun patch re-key) or dispositioned as by-design (ACP YOLO opt-in; legacy-tool agent threading).