commandmate 0.42.2 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +148 -148
- package/.next/app-path-routes-manifest.json +25 -25
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +103 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -103
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +3 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +3 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -103
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +104 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +9 -9
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +25 -25
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1501.js +3 -3
- package/.next/server/chunks/1990.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/22.js +1 -1
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2404.js +4 -3
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/252.js +1 -1
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3730.js +1 -1
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4207.js +3 -3
- package/.next/server/chunks/5064.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/5742.js +1 -1
- package/.next/server/chunks/5775.js +1 -1
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6491.js +103 -0
- package/.next/server/chunks/6661.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +1 -1
- package/.next/server/chunks/7491.js +3 -0
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +2 -2
- package/.next/server/chunks/8673.js +6 -6
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8800.js +4 -3
- package/.next/server/chunks/8918.js +5 -5
- package/.next/server/chunks/9130.js +3 -3
- package/.next/server/chunks/{8052.js → 9353.js} +4 -2
- package/.next/server/chunks/9390.js +3 -0
- package/.next/server/chunks/9627.js +3 -3
- package/.next/server/chunks/967.js +1 -0
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
- package/.next/static/chunks/{2407-6b9e12c099fa598c.js → 2407-940df9b11fadafc6.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/5449-6cb80bab2bd06b79.js +1 -0
- package/.next/static/chunks/7705-1f58d4c03d991fcf.js +1 -0
- package/.next/static/chunks/8165-3525fb42f1b4976e.js +1 -0
- package/.next/static/chunks/app/{layout-5b95e1236dcd9ef6.js → layout-057c850cd0df978e.js} +1 -1
- package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-74aac15286504ef4.js +1 -0
- package/.next/static/chunks/app/skills/page-182e16168b2fc098.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/trace +13 -13
- package/README.md +3 -3
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +23 -149
- package/dist/cli/commands/reply.d.ts +40 -0
- package/dist/cli/commands/reply.d.ts.map +1 -0
- package/dist/cli/commands/reply.js +133 -0
- package/dist/cli/commands/wait.d.ts +5 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +10 -1
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +13 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +4 -0
- package/dist/cli/utils/reply-ledger.d.ts +95 -0
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -0
- package/dist/cli/utils/reply-ledger.js +187 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts +9 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -1
- package/dist/lib/cli-tools/copilot-executable.js +21 -5
- package/dist/lib/cli-tools/opencode-executable.d.ts +103 -0
- package/dist/lib/cli-tools/opencode-executable.d.ts.map +1 -0
- package/dist/lib/cli-tools/opencode-executable.js +179 -0
- package/dist/lib/cli-tools/types.d.ts +1 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/cli-tools/types.js +5 -1
- package/dist/lib/detection/tools/verified-against.d.ts +15 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +17 -1
- package/dist/lib/detection/version-probes.d.ts.map +1 -1
- package/dist/lib/detection/version-probes.js +14 -1
- package/dist/lib/session/tmux-session-surface.d.ts.map +1 -1
- package/dist/lib/session/tmux-session-surface.js +1 -1
- package/dist/server/locales/en/worktree.json +44 -14
- package/dist/server/locales/ja/worktree.json +44 -14
- package/dist/server/server.js +23 -0
- package/dist/server/src/config/cli-tool-timing-config.js +19 -1
- package/dist/server/src/config/detection-evidence-config.js +3 -0
- package/dist/server/src/config/schedule-config.js +55 -1
- package/dist/server/src/lib/auto-yes-poller.js +47 -4
- package/dist/server/src/lib/cli-tools/agent-mode-spec.js +54 -2
- package/dist/server/src/lib/cli-tools/base.js +6 -2
- package/dist/server/src/lib/cli-tools/command-code.js +55 -1
- package/dist/server/src/lib/cli-tools/composer-spec.js +10 -0
- package/dist/server/src/lib/cli-tools/copilot-executable.js +21 -5
- package/dist/server/src/lib/cli-tools/graceful-exit.js +15 -1
- package/dist/server/src/lib/cli-tools/index.js +3 -1
- package/dist/server/src/lib/cli-tools/install-hints.js +9 -3
- package/dist/server/src/lib/cli-tools/liveness-spec.js +19 -0
- package/dist/server/src/lib/cli-tools/manager.js +2 -0
- package/dist/server/src/lib/cli-tools/opencode-executable.js +179 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +369 -0
- package/dist/server/src/lib/cli-tools/opencode.js +29 -5
- package/dist/server/src/lib/cli-tools/types.js +5 -1
- package/dist/server/src/lib/cmate-cli-tool-parser.js +65 -7
- package/dist/server/src/lib/cmate-parser.js +12 -0
- package/dist/server/src/lib/cmate-validator.js +13 -1
- package/dist/server/src/lib/detection/cli-patterns.js +78 -2
- package/dist/server/src/lib/detection/model-info-extractor.js +79 -7
- package/dist/server/src/lib/detection/status-detector.js +10 -1
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +2 -1
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +253 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/dialog-title.js +48 -0
- package/dist/server/src/lib/detection/tools/registry.js +2 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +9 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +17 -1
- package/dist/server/src/lib/detection/upstream-faults.js +8 -0
- package/dist/server/src/lib/detection/version-probes.js +14 -1
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +36 -1
- package/dist/server/src/lib/hooks/sources/opencode/log-diagnosis.js +105 -0
- package/dist/server/src/lib/hooks/sources/opencode/source.js +7 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +422 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/decision-labels.js +24 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +421 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +271 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +165 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/payloads.js +351 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +230 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/reattach.js +149 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/runtime.js +180 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +182 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +295 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +455 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/tool-id.js +18 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +214 -0
- package/dist/server/src/lib/hooks/sources/registry.js +2 -0
- package/dist/server/src/lib/hooks/structured-decision-response.js +14 -5
- package/dist/server/src/lib/job-executor.js +2 -1
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +15 -1
- package/dist/server/src/lib/polling/structured-history-gate.js +19 -5
- package/dist/server/src/lib/relay/relay-delivery.js +4 -1
- package/dist/server/src/lib/session/agent-event-state.js +24 -0
- package/dist/server/src/lib/session/claude-executor.js +184 -10
- package/dist/server/src/lib/session/current-output-builder.js +27 -3
- package/dist/server/src/lib/session/send-user-message.js +4 -0
- package/dist/server/src/lib/session/structured-prompt.js +54 -0
- package/dist/server/src/lib/session/tmux-session-surface.js +1 -1
- package/dist/server/src/lib/skills/compatibility-matrix.js +65 -0
- package/dist/server/src/lib/tmux/tmux.js +48 -2
- package/dist/server/src/lib/verification/env-clean-gate.js +87 -5
- package/dist/server/src/types/cli-tool-contracts.js +10 -2
- package/dist/types/cli-tool-contracts.d.ts +16 -5
- package/dist/types/cli-tool-contracts.d.ts.map +1 -1
- package/dist/types/cli-tool-contracts.js +10 -2
- package/package.json +2 -1
- package/release-notes/0.43.0.json +130 -0
- package/scripts/hooks/cmate-agent-event.sh +14 -0
- package/scripts/opencode-v2/launch.sh +226 -0
- package/.next/server/chunks/4443.js +0 -3
- package/.next/server/chunks/5164.js +0 -1
- package/.next/server/chunks/650.js +0 -1
- package/.next/static/chunks/5449-550bd273dccc3ae4.js +0 -1
- package/.next/static/chunks/7705-2a2936551b0cf9a3.js +0 -1
- package/.next/static/chunks/8165-934ee7ff3b4ddfd4.js +0 -1
- package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-ab7e432b69fccb3b.js +0 -1
- package/.next/static/chunks/app/skills/page-56b4fa11223e0cbd.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-59f5337e031518c6.js +0 -1
- /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → BVkBYdceLRvMROqQIqeBx}/_buildManifest.js +0 -0
- /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → BVkBYdceLRvMROqQIqeBx}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Writing OpenCode V2's replies into conversation history (Issue #2940,
|
|
4
|
+
* Epic #2370 Phase 2's transcript, brought forward).
|
|
5
|
+
*
|
|
6
|
+
* Before this, the screen scraper was the only writer of an `opencode-v2`
|
|
7
|
+
* reply, and it never wrote one: its completion test is the home screen's
|
|
8
|
+
* composer placeholder (`Ask anything…`), which OpenCode V2 draws only before
|
|
9
|
+
* the first prompt. So History held the user's prompts and none of the
|
|
10
|
+
* answers.
|
|
11
|
+
*
|
|
12
|
+
* ## Pull on the turn's end, not a reassembled stream
|
|
13
|
+
*
|
|
14
|
+
* The SSE stream does carry the reply (`session.text.started|delta|ended`,
|
|
15
|
+
* `session.reasoning.*`, `session.tool.*`), but this reads it from
|
|
16
|
+
* `GET /api/session/{id}/message` instead, once the stream says the turn is
|
|
17
|
+
* over (`session.execution.succeeded` / `failed` / `interrupted`):
|
|
18
|
+
*
|
|
19
|
+
* - the document is the finished turn as the server stored it — no delta to
|
|
20
|
+
* reassemble, no frame whose loss corrupts a row, and nothing held in
|
|
21
|
+
* memory between frames;
|
|
22
|
+
* - it is idempotent by construction: every turn is keyed on its user
|
|
23
|
+
* message's id, so a repeated end-of-turn frame, a reconnect or two turns
|
|
24
|
+
* ending close together write each turn once;
|
|
25
|
+
* - and it recovers what the stream missed. A turn that ended while the
|
|
26
|
+
* connection was down is in the document the next time any turn of the
|
|
27
|
+
* session ends.
|
|
28
|
+
*
|
|
29
|
+
* ## One turn in the document
|
|
30
|
+
*
|
|
31
|
+
* Measured on 2.0.18 (`tests/fixtures/opencode-v2-history-2940`): messages are
|
|
32
|
+
* typed, and one turn is a `user` message, then one `assistant` message per
|
|
33
|
+
* model step (a tool-calling turn has several), then an `idle` message with the
|
|
34
|
+
* turn's `outcome`. Assistant messages carry no parent id, so the turn is
|
|
35
|
+
* recovered from the order alone: a turn opens at its `user` message and is
|
|
36
|
+
* closed by the `idle` that follows, or by the next `user` message. A turn that
|
|
37
|
+
* is still open is not written — the next end-of-turn reads it again.
|
|
38
|
+
*
|
|
39
|
+
* ## One row, one writer
|
|
40
|
+
*
|
|
41
|
+
* The row is `assistant` / `normal`, keyed `oc-turn:<user message id>` — the
|
|
42
|
+
* same key family v1's reader uses (`opencodeTurnRequestId`), so every surface
|
|
43
|
+
* that recognises an agent-authored turn recognises this one. The scraper
|
|
44
|
+
* stands down while the subscription is live
|
|
45
|
+
* (`isOpencodeV2StructuredHistoryLive`, via `lib/polling/structured-history-gate`).
|
|
46
|
+
*
|
|
47
|
+
* The body is rendered by v1's `renderOpencodeTurn` from the same part shape,
|
|
48
|
+
* so the text, the folded reasoning and the one-line tool summary look exactly
|
|
49
|
+
* like an OpenCode (v1) reply (#2041 / #2234 / #2272).
|
|
50
|
+
*
|
|
51
|
+
* ## The model that answered
|
|
52
|
+
*
|
|
53
|
+
* The same read also names the model of the newest assistant message
|
|
54
|
+
* (Issue #2964, {@link readLatestOpencodeV2AssistantModel}) and latches it
|
|
55
|
+
* where v1's hook-borne model goes, since no `session.*` frame carries one.
|
|
56
|
+
*
|
|
57
|
+
* ## Nothing here throws
|
|
58
|
+
*
|
|
59
|
+
* A failed fetch or write costs the row, never the subscription: the state the
|
|
60
|
+
* stream publishes is independent of it, and the scraper is no worse off than
|
|
61
|
+
* before. Database imports are dynamic for the reason v1's `./history` gives.
|
|
62
|
+
*
|
|
63
|
+
* @module lib/hooks/sources/opencode-v2/history
|
|
64
|
+
*/
|
|
65
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
66
|
+
if (k2 === undefined) k2 = k;
|
|
67
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
68
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
69
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
70
|
+
}
|
|
71
|
+
Object.defineProperty(o, k2, desc);
|
|
72
|
+
}) : (function(o, m, k, k2) {
|
|
73
|
+
if (k2 === undefined) k2 = k;
|
|
74
|
+
o[k2] = m[k];
|
|
75
|
+
}));
|
|
76
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
77
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
78
|
+
}) : function(o, v) {
|
|
79
|
+
o["default"] = v;
|
|
80
|
+
});
|
|
81
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
82
|
+
var ownKeys = function(o) {
|
|
83
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
84
|
+
var ar = [];
|
|
85
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
86
|
+
return ar;
|
|
87
|
+
};
|
|
88
|
+
return ownKeys(o);
|
|
89
|
+
};
|
|
90
|
+
return function (mod) {
|
|
91
|
+
if (mod && mod.__esModule) return mod;
|
|
92
|
+
var result = {};
|
|
93
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
94
|
+
__setModuleDefault(result, mod);
|
|
95
|
+
return result;
|
|
96
|
+
};
|
|
97
|
+
})();
|
|
98
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
99
|
+
exports.MAX_OPENCODE_V2_SYNCED_TURNS = exports.MAX_OPENCODE_V2_HISTORY_PAGES = exports.OPENCODE_V2_TURN_END_EVENT_TYPES = void 0;
|
|
100
|
+
exports.isOpencodeV2TurnEndEventType = isOpencodeV2TurnEndEventType;
|
|
101
|
+
exports.readOpencodeV2ContentPart = readOpencodeV2ContentPart;
|
|
102
|
+
exports.buildOpencodeV2TurnsFromMessages = buildOpencodeV2TurnsFromMessages;
|
|
103
|
+
exports.readLatestOpencodeV2AssistantModel = readLatestOpencodeV2AssistantModel;
|
|
104
|
+
exports.resetOpencodeV2HistoryQueue = resetOpencodeV2HistoryQueue;
|
|
105
|
+
exports.syncOpencodeV2History = syncOpencodeV2History;
|
|
106
|
+
const logger_1 = require("../../../../lib/logger");
|
|
107
|
+
const agent_event_state_1 = require("../../../../lib/session/agent-event-state");
|
|
108
|
+
const agent_transcript_1 = require("../../../../types/agent-transcript");
|
|
109
|
+
const event_mapper_1 = require("../event-mapper");
|
|
110
|
+
const transcript_1 = require("../opencode/transcript");
|
|
111
|
+
const client_1 = require("./client");
|
|
112
|
+
const secrets_1 = require("./secrets");
|
|
113
|
+
const tool_id_1 = require("./tool-id");
|
|
114
|
+
const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode-v2/history');
|
|
115
|
+
/** The stream events after which a turn's reply is read (Issue #2940). */
|
|
116
|
+
exports.OPENCODE_V2_TURN_END_EVENT_TYPES = [
|
|
117
|
+
'session.execution.succeeded',
|
|
118
|
+
'session.execution.failed',
|
|
119
|
+
'session.execution.interrupted',
|
|
120
|
+
];
|
|
121
|
+
/** Whether a frame `type` ends a turn. */
|
|
122
|
+
function isOpencodeV2TurnEndEventType(type) {
|
|
123
|
+
return type !== null && exports.OPENCODE_V2_TURN_END_EVENT_TYPES.includes(type);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Pages read, newest first, while looking for the newest turn's `user`
|
|
127
|
+
* message. A turn is one assistant message per model step, so one page of
|
|
128
|
+
* {@link OPENCODE_V2_MESSAGES_PAGE_SIZE} covers all but a very long tool loop;
|
|
129
|
+
* the bound keeps a session that never shows a `user` message from being read
|
|
130
|
+
* to the end.
|
|
131
|
+
*/
|
|
132
|
+
exports.MAX_OPENCODE_V2_HISTORY_PAGES = 5;
|
|
133
|
+
/** Cap on turns one sync writes, newest kept. */
|
|
134
|
+
exports.MAX_OPENCODE_V2_SYNCED_TURNS = 50;
|
|
135
|
+
function readFiniteNumber(value) {
|
|
136
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
137
|
+
}
|
|
138
|
+
function createdAtOf(message) {
|
|
139
|
+
const time = (0, event_mapper_1.isPlainObject)(message.time) ? message.time : null;
|
|
140
|
+
return readFiniteNumber(time?.created) ?? 0;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* One element of an assistant message's `content`, as v1's part shape.
|
|
144
|
+
*
|
|
145
|
+
* v2's content items have no id of their own (a tool item's `id` is the
|
|
146
|
+
* provider's call id), so the slot is `<message id>#<index>`, which is stable
|
|
147
|
+
* across re-reads of the same stored message.
|
|
148
|
+
*/
|
|
149
|
+
function readOpencodeV2ContentPart(messageId, index, item) {
|
|
150
|
+
if (!(0, event_mapper_1.isPlainObject)(item))
|
|
151
|
+
return null;
|
|
152
|
+
const type = (0, event_mapper_1.readStringField)(item, 'type');
|
|
153
|
+
if (!type)
|
|
154
|
+
return null;
|
|
155
|
+
const state = (0, event_mapper_1.isPlainObject)(item.state) ? item.state : null;
|
|
156
|
+
return {
|
|
157
|
+
id: `${messageId}#${index}`,
|
|
158
|
+
messageId,
|
|
159
|
+
type,
|
|
160
|
+
text: typeof item.text === 'string' ? item.text : null,
|
|
161
|
+
tool: type === 'tool' ? (0, event_mapper_1.readStringField)(item, 'name') : null,
|
|
162
|
+
status: state ? (0, event_mapper_1.readStringField)(state, 'status') : null,
|
|
163
|
+
title: state ? (0, event_mapper_1.readStringField)(state, 'title') : null,
|
|
164
|
+
error: state
|
|
165
|
+
? ((0, event_mapper_1.readStringField)(state, 'error') ?? (0, event_mapper_1.readNestedString)(state, ['error', 'message']))
|
|
166
|
+
: null,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Rebuild the turns of a session from `GET /api/session/{id}/message` entries.
|
|
171
|
+
*
|
|
172
|
+
* Order-agnostic: the entries are sorted oldest first by `time.created` (the
|
|
173
|
+
* id, which is time-ordered, breaks ties), so a desc page, an asc page or
|
|
174
|
+
* several pages concatenated give the same turns. Assistant messages before the
|
|
175
|
+
* first `user` message belong to a turn whose head is outside what was read,
|
|
176
|
+
* and are dropped rather than attached to nothing.
|
|
177
|
+
*
|
|
178
|
+
* Pure: no fetch, no database.
|
|
179
|
+
*/
|
|
180
|
+
function buildOpencodeV2TurnsFromMessages(entries, sessionId) {
|
|
181
|
+
const messages = entries
|
|
182
|
+
.filter(event_mapper_1.isPlainObject)
|
|
183
|
+
.filter((message) => (0, event_mapper_1.readStringField)(message, 'id') !== null)
|
|
184
|
+
.map((message, index) => ({ message, index }))
|
|
185
|
+
.sort((a, b) => {
|
|
186
|
+
const byTime = createdAtOf(a.message) - createdAtOf(b.message);
|
|
187
|
+
if (byTime !== 0)
|
|
188
|
+
return byTime;
|
|
189
|
+
const aId = (0, event_mapper_1.readStringField)(a.message, 'id') ?? '';
|
|
190
|
+
const bId = (0, event_mapper_1.readStringField)(b.message, 'id') ?? '';
|
|
191
|
+
return aId < bId ? -1 : aId > bId ? 1 : a.index - b.index;
|
|
192
|
+
})
|
|
193
|
+
.map(({ message }) => message);
|
|
194
|
+
const turns = [];
|
|
195
|
+
let open = null;
|
|
196
|
+
const close = (closed) => {
|
|
197
|
+
if (open)
|
|
198
|
+
turns.push({ ...open, closed });
|
|
199
|
+
open = null;
|
|
200
|
+
};
|
|
201
|
+
for (const message of messages) {
|
|
202
|
+
const id = (0, event_mapper_1.readStringField)(message, 'id');
|
|
203
|
+
const type = (0, event_mapper_1.readStringField)(message, 'type');
|
|
204
|
+
if (type === 'user') {
|
|
205
|
+
close(true);
|
|
206
|
+
open = {
|
|
207
|
+
accumulator: (0, transcript_1.createOpencodeTurn)(sessionId, id, createdAtOf(message)),
|
|
208
|
+
completedAt: null,
|
|
209
|
+
};
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (!open)
|
|
213
|
+
continue;
|
|
214
|
+
const current = open;
|
|
215
|
+
if (type === 'idle') {
|
|
216
|
+
close(true);
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (type !== 'assistant')
|
|
220
|
+
continue;
|
|
221
|
+
current.accumulator.assistantMessageIds.add(id);
|
|
222
|
+
const content = Array.isArray(message.content) ? message.content : [];
|
|
223
|
+
content.forEach((item, index) => {
|
|
224
|
+
const part = readOpencodeV2ContentPart(id, index, item);
|
|
225
|
+
if (part)
|
|
226
|
+
(0, transcript_1.addOpencodePart)(current.accumulator, part);
|
|
227
|
+
});
|
|
228
|
+
const time = (0, event_mapper_1.isPlainObject)(message.time) ? message.time : null;
|
|
229
|
+
const finished = readFiniteNumber(time?.completed) ?? readFiniteNumber(time?.created);
|
|
230
|
+
if (finished !== null && finished > (current.completedAt ?? 0))
|
|
231
|
+
current.completedAt = finished;
|
|
232
|
+
}
|
|
233
|
+
close(false);
|
|
234
|
+
return turns;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* The model the newest assistant message was answered by, or null
|
|
238
|
+
* (Issue #2964).
|
|
239
|
+
*
|
|
240
|
+
* `assistant.model` is `{ id, providerID }` (measured on 2.0.18,
|
|
241
|
+
* `tests/fixtures/opencode-v2-history-2940`). Only `id` is returned — v1's
|
|
242
|
+
* `frameModel` rule (#1783): every other tool reports the bare model, and
|
|
243
|
+
* `opencode/longcat-…` would make this one the odd one out.
|
|
244
|
+
*
|
|
245
|
+
* The reply, not the session's setting: Phase 0 saw a session created over the
|
|
246
|
+
* API run on a different model from the TUI's default, so the model worth
|
|
247
|
+
* showing is the one that actually answered. Newest by `time.created`, the id
|
|
248
|
+
* breaking ties, the order {@link buildOpencodeV2TurnsFromMessages} uses. An
|
|
249
|
+
* assistant message without a model id is skipped, not read as "unknown".
|
|
250
|
+
*
|
|
251
|
+
* Pure: no fetch, no state.
|
|
252
|
+
*/
|
|
253
|
+
function readLatestOpencodeV2AssistantModel(entries) {
|
|
254
|
+
let latest = null;
|
|
255
|
+
for (const entry of entries) {
|
|
256
|
+
if (!(0, event_mapper_1.isPlainObject)(entry) || (0, event_mapper_1.readStringField)(entry, 'type') !== 'assistant')
|
|
257
|
+
continue;
|
|
258
|
+
const model = (0, event_mapper_1.readNestedString)(entry, ['model', 'id']);
|
|
259
|
+
if (model === null)
|
|
260
|
+
continue;
|
|
261
|
+
const at = createdAtOf(entry);
|
|
262
|
+
const id = (0, event_mapper_1.readStringField)(entry, 'id') ?? '';
|
|
263
|
+
if (latest === null || at > latest.at || (at === latest.at && id > latest.id)) {
|
|
264
|
+
latest = { at, id, model };
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return latest?.model ?? null;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* One sync at a time per instance, on `globalThis` for #1736's reason. Two turn
|
|
271
|
+
* ends close together would otherwise race the existence check and insert the
|
|
272
|
+
* same turn twice.
|
|
273
|
+
*/
|
|
274
|
+
const queue = (globalThis.__opencodeV2HistoryQueue ??= new Map());
|
|
275
|
+
/** Forget queued syncs. Test seam. */
|
|
276
|
+
function resetOpencodeV2HistoryQueue() {
|
|
277
|
+
queue.clear();
|
|
278
|
+
}
|
|
279
|
+
function serialize(key, work) {
|
|
280
|
+
const previous = queue.get(key) ?? Promise.resolve();
|
|
281
|
+
const result = previous.then(work, work);
|
|
282
|
+
const settled = result.then(() => undefined, () => undefined);
|
|
283
|
+
queue.set(key, settled);
|
|
284
|
+
void settled.then(() => {
|
|
285
|
+
if (queue.get(key) === settled)
|
|
286
|
+
queue.delete(key);
|
|
287
|
+
});
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
290
|
+
/** Read newest-first pages until the newest turn's `user` message is in view. */
|
|
291
|
+
async function readRecentMessages(port, password, sessionId) {
|
|
292
|
+
const entries = [];
|
|
293
|
+
let cursor = null;
|
|
294
|
+
for (let page = 0; page < exports.MAX_OPENCODE_V2_HISTORY_PAGES; page += 1) {
|
|
295
|
+
const result = await (0, client_1.fetchOpencodeV2SessionMessagesPage)(port, password, sessionId, cursor);
|
|
296
|
+
if (result === null)
|
|
297
|
+
return page === 0 ? null : entries;
|
|
298
|
+
entries.push(...result.data);
|
|
299
|
+
const sawUser = result.data.some((entry) => (0, event_mapper_1.isPlainObject)(entry) && (0, event_mapper_1.readStringField)(entry, 'type') === 'user');
|
|
300
|
+
if (sawUser || result.next === null || result.data.length === 0)
|
|
301
|
+
break;
|
|
302
|
+
cursor = result.next;
|
|
303
|
+
}
|
|
304
|
+
return entries;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Write one rendered turn, unless its row is already there.
|
|
308
|
+
*
|
|
309
|
+
* @returns Whether a row was written
|
|
310
|
+
*/
|
|
311
|
+
async function writeOpencodeV2Turn(target, rendered, timestampMs) {
|
|
312
|
+
const instanceId = target.instanceId ?? target.cliToolId;
|
|
313
|
+
if (rendered.body.length === 0) {
|
|
314
|
+
logger.info('opencode-v2-history-turn-empty', {
|
|
315
|
+
worktreeId: target.worktreeId,
|
|
316
|
+
instanceId,
|
|
317
|
+
sessionId: rendered.sessionId,
|
|
318
|
+
});
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
if (rendered.unknownPartTypes.length > 0) {
|
|
322
|
+
logger.info('opencode-v2-history-unknown-parts', {
|
|
323
|
+
worktreeId: target.worktreeId,
|
|
324
|
+
instanceId,
|
|
325
|
+
sessionId: rendered.sessionId,
|
|
326
|
+
partTypes: rendered.unknownPartTypes,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
const requestId = (0, agent_transcript_1.opencodeTurnRequestId)(rendered.userMessageId);
|
|
330
|
+
const [{ getDbInstance }, { createMessage, findMessageByRequestId }, { broadcastMessage }] = await Promise.all([
|
|
331
|
+
Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
|
|
332
|
+
Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
|
|
333
|
+
Promise.resolve().then(() => __importStar(require('../../../../lib/ws-server'))),
|
|
334
|
+
]);
|
|
335
|
+
const db = getDbInstance();
|
|
336
|
+
if (findMessageByRequestId(db, target.worktreeId, requestId))
|
|
337
|
+
return false;
|
|
338
|
+
const message = createMessage(db, {
|
|
339
|
+
worktreeId: target.worktreeId,
|
|
340
|
+
role: 'assistant',
|
|
341
|
+
content: rendered.body,
|
|
342
|
+
messageType: 'normal',
|
|
343
|
+
timestamp: new Date(timestampMs > 0 ? timestampMs : Date.now()),
|
|
344
|
+
cliToolId: target.cliToolId,
|
|
345
|
+
instanceId,
|
|
346
|
+
requestId,
|
|
347
|
+
});
|
|
348
|
+
broadcastMessage('message', { worktreeId: target.worktreeId, message });
|
|
349
|
+
logger.info('opencode-v2-history-turn-saved', {
|
|
350
|
+
worktreeId: target.worktreeId,
|
|
351
|
+
instanceId,
|
|
352
|
+
sessionId: rendered.sessionId,
|
|
353
|
+
requestId,
|
|
354
|
+
bodyLength: rendered.body.length,
|
|
355
|
+
textParts: rendered.textParts,
|
|
356
|
+
toolParts: rendered.toolParts,
|
|
357
|
+
});
|
|
358
|
+
return true;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Record every closed turn of a session that History does not have yet.
|
|
362
|
+
*
|
|
363
|
+
* Called when the instance's stream says a turn of `sessionId` ended. Never
|
|
364
|
+
* throws; a failure is logged and costs only the rows.
|
|
365
|
+
*
|
|
366
|
+
* @param target - The instance the stream belongs to
|
|
367
|
+
* @param port - Its server
|
|
368
|
+
* @param sessionId - `ses_…` from the end-of-turn frame
|
|
369
|
+
* @returns How many rows were written
|
|
370
|
+
*/
|
|
371
|
+
function syncOpencodeV2History(target, port, sessionId) {
|
|
372
|
+
return serialize((0, secrets_1.opencodeV2KeyOf)(target), async () => {
|
|
373
|
+
const instanceId = target.instanceId ?? target.cliToolId;
|
|
374
|
+
try {
|
|
375
|
+
const password = (0, secrets_1.readOpencodeV2Password)(target);
|
|
376
|
+
if (password === null) {
|
|
377
|
+
logger.info('opencode-v2-history-unavailable', {
|
|
378
|
+
worktreeId: target.worktreeId,
|
|
379
|
+
instanceId,
|
|
380
|
+
reason: 'password-file-missing',
|
|
381
|
+
});
|
|
382
|
+
return 0;
|
|
383
|
+
}
|
|
384
|
+
const entries = await readRecentMessages(port, password, sessionId);
|
|
385
|
+
if (entries === null) {
|
|
386
|
+
logger.warn('opencode-v2-history-unavailable', {
|
|
387
|
+
worktreeId: target.worktreeId,
|
|
388
|
+
instanceId,
|
|
389
|
+
port,
|
|
390
|
+
sessionId,
|
|
391
|
+
reason: 'messages-unreadable',
|
|
392
|
+
});
|
|
393
|
+
return 0;
|
|
394
|
+
}
|
|
395
|
+
// Issue #2964: the model that answered, onto the hook latch the UI and
|
|
396
|
+
// `capture --json` read. Before the rows, so a failed write cannot cost it.
|
|
397
|
+
(0, agent_event_state_1.recordAgentReportedModel)(target.worktreeId, tool_id_1.OPENCODE_V2_CLI_TOOL_ID, target.instanceId ?? tool_id_1.OPENCODE_V2_CLI_TOOL_ID, readLatestOpencodeV2AssistantModel(entries));
|
|
398
|
+
const closed = buildOpencodeV2TurnsFromMessages(entries, sessionId).filter((turn) => turn.closed);
|
|
399
|
+
const kept = closed.slice(-exports.MAX_OPENCODE_V2_SYNCED_TURNS);
|
|
400
|
+
let written = 0;
|
|
401
|
+
// Oldest first, so the rows go in in conversation order.
|
|
402
|
+
for (const turn of kept) {
|
|
403
|
+
const rendered = (0, transcript_1.renderOpencodeTurn)(turn.accumulator);
|
|
404
|
+
const at = Math.max(turn.accumulator.startedAt, turn.completedAt ?? 0);
|
|
405
|
+
if (await writeOpencodeV2Turn(target, rendered, at))
|
|
406
|
+
written += 1;
|
|
407
|
+
}
|
|
408
|
+
return written;
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
logger.error('opencode-v2-history-sync-failed', {
|
|
412
|
+
worktreeId: target.worktreeId,
|
|
413
|
+
instanceId,
|
|
414
|
+
port,
|
|
415
|
+
sessionId,
|
|
416
|
+
error: error instanceof Error ? error.message : String(error),
|
|
417
|
+
});
|
|
418
|
+
return 0;
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
}
|