commandmate 0.42.1 → 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 +144 -144
- package/.next/app-path-routes-manifest.json +23 -23
- 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.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.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.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.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 +23 -23
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1501.js +4 -4
- 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/434.js +1 -1
- 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/8583.js +1 -1
- 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 +4 -4
- package/.next/server/chunks/964.js +1 -1
- 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-21fbf12d753b8d4d.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-8ff4c7c08ef1f621.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/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +9 -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/types/index.d.ts +2 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- 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/db/worktree-db.js +1 -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 +228 -9
- package/dist/server/src/lib/verification/env-snapshot.js +65 -1
- 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.42.2.json +20 -0
- 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-3c946bd2875391fd.js +0 -1
- /package/.next/static/{3M_S0B7dhEDdVE2XSJz1Y → BVkBYdceLRvMROqQIqeBx}/_buildManifest.js +0 -0
- /package/.next/static/{3M_S0B7dhEDdVE2XSJz1Y → BVkBYdceLRvMROqQIqeBx}/_ssgManifest.js +0 -0
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
exports.ENV_SNAPSHOT_RETENTION_MS = exports.ENV_SNAPSHOT_DIR_NAME = exports.VOLATILE_ENTRY_PATTERNS = exports.MCBD_SESSION_PREFIX = exports.COMMANDMATE_PROCESS_PATTERN = exports.DEFAULT_ENV_PROBE_DEPS = exports.ENV_PROBE_LABELS = exports.ENV_PROBE_IDS = exports.ENV_SNAPSHOT_VERSION = void 0;
|
|
26
|
+
exports.isCommandMateCommandLine = isCommandMateCommandLine;
|
|
26
27
|
exports.probeListeners = probeListeners;
|
|
27
28
|
exports.probeTmuxSessions = probeTmuxSessions;
|
|
28
29
|
exports.probeHomeEntries = probeHomeEntries;
|
|
@@ -109,8 +110,71 @@ exports.DEFAULT_ENV_PROBE_DEPS = {
|
|
|
109
110
|
* to "CommandMate 関連" for exactly that reason, so relevance is decided from
|
|
110
111
|
* the owning process's command line rather than from the port number — a
|
|
111
112
|
* developer's `commandmate start --port 3179` is as relevant as port 3000.
|
|
113
|
+
*
|
|
114
|
+
* This is only the vocabulary, and a cheap first filter. Matched against the
|
|
115
|
+
* whole command line it also hits a process that merely *mentions* a
|
|
116
|
+
* CommandMate path among its arguments — an editor's language server started
|
|
117
|
+
* with `--workspace_id …_commandmate_issue_2616` was recorded as a CommandMate
|
|
118
|
+
* listener and then read as "killed" when it exited (#2627). The decision is
|
|
119
|
+
* {@link isCommandMateCommandLine}'s, which looks only at the program.
|
|
112
120
|
*/
|
|
113
121
|
exports.COMMANDMATE_PROCESS_PATTERN = /commandmate|dist\/server\/server\.js|next-server|next (dev|start)|server\.ts/i;
|
|
122
|
+
/**
|
|
123
|
+
* Executables that run a script named by a later argument. CommandMate is
|
|
124
|
+
* never a native binary of its own: every shape it runs as is one of these
|
|
125
|
+
* with a CommandMate script, or a process title set by one of them.
|
|
126
|
+
*/
|
|
127
|
+
const SCRIPT_LAUNCHERS = new Set(['node', 'nodejs', 'bun', 'tsx', 'ts-node', 'npx', 'next']);
|
|
128
|
+
/** Executables that are CommandMate by their own name (process title or bin). */
|
|
129
|
+
const COMMANDMATE_EXECUTABLES = /^(commandmate(\.js)?|next-server)$/i;
|
|
130
|
+
/** A script argument that is CommandMate's server or CLI, judged by its path's end. */
|
|
131
|
+
function isCommandMateScript(token) {
|
|
132
|
+
const name = (0, path_1.basename)(token);
|
|
133
|
+
return (/(^|\/)dist\/server\/server\.js$/.test(token) ||
|
|
134
|
+
name === 'server.ts' ||
|
|
135
|
+
/^commandmate(\.js)?$/i.test(name));
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Whether a `ps` command line is a CommandMate process (#2627).
|
|
139
|
+
*
|
|
140
|
+
* Judged on the program, never on free-form arguments:
|
|
141
|
+
*
|
|
142
|
+
* - the executable itself (`next-server (v14…)`, a `commandmate` bin run
|
|
143
|
+
* directly) — its basename, so a directory called `commandmate` in the
|
|
144
|
+
* executable's *path* does not count either;
|
|
145
|
+
* - or, when the executable is a script launcher (`node`, `tsx`, `next`, …),
|
|
146
|
+
* its positional arguments matched as whole paths by their end:
|
|
147
|
+
* `…/dist/server/server.js`, `server.ts`, a `commandmate` bin, or `next`
|
|
148
|
+
* followed by `dev` / `start`.
|
|
149
|
+
*
|
|
150
|
+
* Flags are dropped before matching, `--workspace=/x/commandmate` included,
|
|
151
|
+
* and a positional counts only as a whole token: `/x/commandmate-issue-1` is a
|
|
152
|
+
* path that mentions CommandMate, not CommandMate. Any other executable —
|
|
153
|
+
* `language_server_macos_arm`, Chrome, postgres — is not CommandMate whatever
|
|
154
|
+
* its arguments say.
|
|
155
|
+
*
|
|
156
|
+
* Why not `ps -o comm=` (the executable alone): `node dist/server/server.js` is
|
|
157
|
+
* `node` there, indistinguishable from every other node process, so the
|
|
158
|
+
* production server itself would stop being recorded.
|
|
159
|
+
*/
|
|
160
|
+
function isCommandMateCommandLine(commandLine) {
|
|
161
|
+
if (!exports.COMMANDMATE_PROCESS_PATTERN.test(commandLine))
|
|
162
|
+
return false;
|
|
163
|
+
const [program, ...rest] = commandLine.trim().split(/\s+/);
|
|
164
|
+
if (!program)
|
|
165
|
+
return false;
|
|
166
|
+
const name = (0, path_1.basename)(program);
|
|
167
|
+
if (COMMANDMATE_EXECUTABLES.test(name))
|
|
168
|
+
return true;
|
|
169
|
+
if (!SCRIPT_LAUNCHERS.has(name.toLowerCase()))
|
|
170
|
+
return false;
|
|
171
|
+
const positionals = [name, ...rest.filter((token) => !token.startsWith('-'))];
|
|
172
|
+
return positionals.some((token, index) => {
|
|
173
|
+
if (index > 0 && isCommandMateScript(token))
|
|
174
|
+
return true;
|
|
175
|
+
return (0, path_1.basename)(token) === 'next' && /^(dev|start)$/.test(positionals[index + 1] ?? '');
|
|
176
|
+
});
|
|
177
|
+
}
|
|
114
178
|
/** `ps` line: leading pid, then the full command line. */
|
|
115
179
|
function parseProcessTable(stdout) {
|
|
116
180
|
const table = new Map();
|
|
@@ -213,7 +277,7 @@ async function probeListeners(deps) {
|
|
|
213
277
|
const table = parseProcessTable(processes.stdout);
|
|
214
278
|
const relevant = blocks.filter((block) => {
|
|
215
279
|
const commandLine = table.get(block.pid);
|
|
216
|
-
return commandLine !== undefined &&
|
|
280
|
+
return commandLine !== undefined && isCommandMateCommandLine(commandLine);
|
|
217
281
|
});
|
|
218
282
|
if (relevant.length === 0)
|
|
219
283
|
return ok([]);
|
|
@@ -96,11 +96,18 @@ exports.GRACEFUL_EXIT_FAILURE_REASONS = ['graceful_exit_timeout', 'port_orphaned
|
|
|
96
96
|
* | `manual` | claude | `⏸ manual mode on` |
|
|
97
97
|
* | `auto` | claude | `⏵⏵ auto mode on` |
|
|
98
98
|
* | `accept-edits` | claude / Command Code / agy | `⏵⏵ accept edits on`, `» accept edits on`, `accept-edits ·` |
|
|
99
|
-
* | `plan` | all
|
|
99
|
+
* | `plan` | all six | `⏸ plan mode on`, `plan mode`, `Plan mode (shift+tab to cycle)`, `plan`, `┃ Plan · <model>` |
|
|
100
100
|
* | `autopilot` | copilot | `autopilot` in the hint bar |
|
|
101
101
|
* | `bypass` | Command Code (NOT in its cycle) | `» permission bypass on` |
|
|
102
102
|
* | `dont-ask` | Command Code (NOT in its cycle) | `» don't-ask on` |
|
|
103
103
|
* | `default` | Command Code | `? for shortcuts` (its own row) |
|
|
104
|
+
* | `build` | OpenCode V2 (Issue #3038) | `┃ Build · <model>` under the composer |
|
|
105
|
+
*
|
|
106
|
+
* `build` is OpenCode V2's AGENT, not a permission mode, and it is its own id
|
|
107
|
+
* rather than `default` on purpose: the chip says what the pane says (#2592).
|
|
108
|
+
* OpenCode V2's `shift+tab` toggles `Build` ⇄ `Plan` agents, and the button
|
|
109
|
+
* carries the `opencodeAgentSwitch` note so the "permission mode" wording of
|
|
110
|
+
* its aria label is not the whole story.
|
|
104
111
|
*
|
|
105
112
|
* `bypass` and `dont-ask` are declared even though `shift+tab` cannot REACH
|
|
106
113
|
* them, and that is the point: a user who put Command Code in one of those from
|
|
@@ -118,6 +125,7 @@ exports.AGENT_MODE_IDS = [
|
|
|
118
125
|
'autopilot',
|
|
119
126
|
'bypass',
|
|
120
127
|
'dont-ask',
|
|
128
|
+
'build',
|
|
121
129
|
];
|
|
122
130
|
/**
|
|
123
131
|
* The verdict for a frame nothing in {@link AgentModeSpec.indicators} matched.
|
|
@@ -146,4 +154,4 @@ function isAgentModeId(value) {
|
|
|
146
154
|
* translated (`.eslintrc.json`'s i18n rule, Issue #1271), and because the tool
|
|
147
155
|
* declaring it has no way to call `useTranslations()`.
|
|
148
156
|
*/
|
|
149
|
-
exports.AGENT_MODE_NOTE_IDS = ['codexModelCoupled'];
|
|
157
|
+
exports.AGENT_MODE_NOTE_IDS = ['codexModelCoupled', 'opencodeAgentSwitch'];
|
|
@@ -418,11 +418,18 @@ export type ToolLivenessVerdict = {
|
|
|
418
418
|
* | `manual` | claude | `⏸ manual mode on` |
|
|
419
419
|
* | `auto` | claude | `⏵⏵ auto mode on` |
|
|
420
420
|
* | `accept-edits` | claude / Command Code / agy | `⏵⏵ accept edits on`, `» accept edits on`, `accept-edits ·` |
|
|
421
|
-
* | `plan` | all
|
|
421
|
+
* | `plan` | all six | `⏸ plan mode on`, `plan mode`, `Plan mode (shift+tab to cycle)`, `plan`, `┃ Plan · <model>` |
|
|
422
422
|
* | `autopilot` | copilot | `autopilot` in the hint bar |
|
|
423
423
|
* | `bypass` | Command Code (NOT in its cycle) | `» permission bypass on` |
|
|
424
424
|
* | `dont-ask` | Command Code (NOT in its cycle) | `» don't-ask on` |
|
|
425
425
|
* | `default` | Command Code | `? for shortcuts` (its own row) |
|
|
426
|
+
* | `build` | OpenCode V2 (Issue #3038) | `┃ Build · <model>` under the composer |
|
|
427
|
+
*
|
|
428
|
+
* `build` is OpenCode V2's AGENT, not a permission mode, and it is its own id
|
|
429
|
+
* rather than `default` on purpose: the chip says what the pane says (#2592).
|
|
430
|
+
* OpenCode V2's `shift+tab` toggles `Build` ⇄ `Plan` agents, and the button
|
|
431
|
+
* carries the `opencodeAgentSwitch` note so the "permission mode" wording of
|
|
432
|
+
* its aria label is not the whole story.
|
|
426
433
|
*
|
|
427
434
|
* `bypass` and `dont-ask` are declared even though `shift+tab` cannot REACH
|
|
428
435
|
* them, and that is the point: a user who put Command Code in one of those from
|
|
@@ -431,7 +438,7 @@ export type ToolLivenessVerdict = {
|
|
|
431
438
|
* 1.53.1, where `? for shortcuts` is drawn in every mode, that fall-through is
|
|
432
439
|
* a chip that says `default` while the agent bypasses permissions.
|
|
433
440
|
*/
|
|
434
|
-
export declare const AGENT_MODE_IDS: readonly ["default", "manual", "accept-edits", "plan", "auto", "autopilot", "bypass", "dont-ask"];
|
|
441
|
+
export declare const AGENT_MODE_IDS: readonly ["default", "manual", "accept-edits", "plan", "auto", "autopilot", "bypass", "dont-ask", "build"];
|
|
435
442
|
/** One permission mode a supported CLI can be in. */
|
|
436
443
|
export type AgentModeId = typeof AGENT_MODE_IDS[number];
|
|
437
444
|
/**
|
|
@@ -482,7 +489,7 @@ export interface AgentModeIndicator {
|
|
|
482
489
|
* translated (`.eslintrc.json`'s i18n rule, Issue #1271), and because the tool
|
|
483
490
|
* declaring it has no way to call `useTranslations()`.
|
|
484
491
|
*/
|
|
485
|
-
export declare const AGENT_MODE_NOTE_IDS: readonly ["codexModelCoupled"];
|
|
492
|
+
export declare const AGENT_MODE_NOTE_IDS: readonly ["codexModelCoupled", "opencodeAgentSwitch"];
|
|
486
493
|
/** Which caution one tool's mode button carries, if any. */
|
|
487
494
|
export type AgentModeNoteId = typeof AGENT_MODE_NOTE_IDS[number];
|
|
488
495
|
/**
|
|
@@ -516,7 +523,7 @@ export type AgentModeNoteId = typeof AGENT_MODE_NOTE_IDS[number];
|
|
|
516
523
|
*/
|
|
517
524
|
export interface AgentModeSpec {
|
|
518
525
|
/**
|
|
519
|
-
* The key that advances the cycle — `BTab` for all
|
|
526
|
+
* The key that advances the cycle — `BTab` for all six declaring tools.
|
|
520
527
|
*
|
|
521
528
|
* Declared rather than hard-coded so the invariant above is checkable, and so
|
|
522
529
|
* a tool that moves its binding changes one line.
|
|
@@ -554,10 +561,14 @@ export interface AgentModeSpec {
|
|
|
554
561
|
/**
|
|
555
562
|
* A caution this tool's button must carry, or `null`.
|
|
556
563
|
*
|
|
557
|
-
* codex
|
|
564
|
+
* codex: its modes are coupled to the model and reasoning effort
|
|
558
565
|
* (`xhigh` ⇄ `medium`, measured 2026-09-16), so one press of a button labelled
|
|
559
566
|
* "mode" also moves the model tier. Issue #2592 §「設計に効く事実」4 requires
|
|
560
567
|
* that be visible rather than discovered.
|
|
568
|
+
*
|
|
569
|
+
* OpenCode V2 (Issue #3038): its `shift+tab` switches the AGENT (`Build`,
|
|
570
|
+
* which edits, ⇄ `Plan`, which only reads) rather than a permission mode, so
|
|
571
|
+
* the note says what the button actually switches.
|
|
561
572
|
*/
|
|
562
573
|
readonly noteId: AgentModeNoteId | null;
|
|
563
574
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-tool-contracts.d.ts","sourceRoot":"","sources":["../../src/types/cli-tool-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAMnD;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,mDAAoD,CAAC;AAExF,2DAA2D;AAC3D,MAAM,MAAM,kBAAkB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,MAAM,WAAW,GACnB;IACE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEN,wBAAwB;AACxB,wBAAgB,OAAO,CACrB,IAAI,EAAE,kBAAkB,EACxB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAEvC;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAI3C;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,GAChB,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAEnD;AAED,yDAAyD;AACzD,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAE1F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,kBAAkB,CAE7E;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;CACxC;AAMD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,cAAc,GAAG,YAAY,CAAC;AAEjF;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAMD;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC;AAMD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,6BAA6B,qDAAsD,CAAC;AAEjG,4EAA4E;AAC5E,MAAM,MAAM,yBAAyB,GAAG,OAAO,6BAA6B,CAAC,MAAM,CAAC,CAAC;AAErF;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAA;CAAE,CAAC;AAMvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,6EAA6E;IAC7E,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,qEAAqE;IACrE,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C;;;;;;;;OAQG;IACH,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAMvD
|
|
1
|
+
{"version":3,"file":"cli-tool-contracts.d.ts","sourceRoot":"","sources":["../../src/types/cli-tool-contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -96,11 +96,18 @@ exports.GRACEFUL_EXIT_FAILURE_REASONS = ['graceful_exit_timeout', 'port_orphaned
|
|
|
96
96
|
* | `manual` | claude | `⏸ manual mode on` |
|
|
97
97
|
* | `auto` | claude | `⏵⏵ auto mode on` |
|
|
98
98
|
* | `accept-edits` | claude / Command Code / agy | `⏵⏵ accept edits on`, `» accept edits on`, `accept-edits ·` |
|
|
99
|
-
* | `plan` | all
|
|
99
|
+
* | `plan` | all six | `⏸ plan mode on`, `plan mode`, `Plan mode (shift+tab to cycle)`, `plan`, `┃ Plan · <model>` |
|
|
100
100
|
* | `autopilot` | copilot | `autopilot` in the hint bar |
|
|
101
101
|
* | `bypass` | Command Code (NOT in its cycle) | `» permission bypass on` |
|
|
102
102
|
* | `dont-ask` | Command Code (NOT in its cycle) | `» don't-ask on` |
|
|
103
103
|
* | `default` | Command Code | `? for shortcuts` (its own row) |
|
|
104
|
+
* | `build` | OpenCode V2 (Issue #3038) | `┃ Build · <model>` under the composer |
|
|
105
|
+
*
|
|
106
|
+
* `build` is OpenCode V2's AGENT, not a permission mode, and it is its own id
|
|
107
|
+
* rather than `default` on purpose: the chip says what the pane says (#2592).
|
|
108
|
+
* OpenCode V2's `shift+tab` toggles `Build` ⇄ `Plan` agents, and the button
|
|
109
|
+
* carries the `opencodeAgentSwitch` note so the "permission mode" wording of
|
|
110
|
+
* its aria label is not the whole story.
|
|
104
111
|
*
|
|
105
112
|
* `bypass` and `dont-ask` are declared even though `shift+tab` cannot REACH
|
|
106
113
|
* them, and that is the point: a user who put Command Code in one of those from
|
|
@@ -118,6 +125,7 @@ exports.AGENT_MODE_IDS = [
|
|
|
118
125
|
'autopilot',
|
|
119
126
|
'bypass',
|
|
120
127
|
'dont-ask',
|
|
128
|
+
'build',
|
|
121
129
|
];
|
|
122
130
|
/**
|
|
123
131
|
* The verdict for a frame nothing in {@link AgentModeSpec.indicators} matched.
|
|
@@ -146,4 +154,4 @@ function isAgentModeId(value) {
|
|
|
146
154
|
* translated (`.eslintrc.json`'s i18n rule, Issue #1271), and because the tool
|
|
147
155
|
* declaring it has no way to call `useTranslations()`.
|
|
148
156
|
*/
|
|
149
|
-
exports.AGENT_MODE_NOTE_IDS = ['codexModelCoupled'];
|
|
157
|
+
exports.AGENT_MODE_NOTE_IDS = ['codexModelCoupled', 'opencodeAgentSwitch'];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "commandmate",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.43.0",
|
|
4
4
|
"description": "A local control plane for agent CLIs — orchestration and visibility for Claude Code, Codex, Gemini CLI, and more across Git worktrees",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"!.next/cache",
|
|
34
34
|
"public/",
|
|
35
35
|
"scripts/hooks/",
|
|
36
|
+
"scripts/opencode-v2/",
|
|
36
37
|
".env.example",
|
|
37
38
|
"release-notes/"
|
|
38
39
|
],
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.42.2",
|
|
3
|
+
"date": "2026-09-28",
|
|
4
|
+
"highlight": {
|
|
5
|
+
"ja": "ブランチごとに選んだ既定のエージェントが、同期のたびに Claude に戻ってしまう問題を直しました。",
|
|
6
|
+
"en": "Fixed the default agent chosen for a branch switching back to Claude every time branches were synced."
|
|
7
|
+
},
|
|
8
|
+
"added": [],
|
|
9
|
+
"improved": [],
|
|
10
|
+
"fixed": [
|
|
11
|
+
{
|
|
12
|
+
"ja": "ブランチごとに選んだ既定のエージェントが、同期のたびに Claude に戻ってしまう問題を直しました。",
|
|
13
|
+
"en": "Fixed the default agent chosen for a branch switching back to Claude every time branches were synced."
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ja": "commandmate verify でタスクを指定できるようになり、完了済みのタスクを検証し直せるようになりました。",
|
|
17
|
+
"en": "commandmate verify can now take a task, so a finished task can be verified again."
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.43.0",
|
|
3
|
+
"date": "2026-09-30",
|
|
4
|
+
"highlight": {
|
|
5
|
+
"ja": "OpenCode V2 をエージェントとして使えるようになりました。起動・状態表示・承認や質問への応答・スケジュールまで、これまでの OpenCode と同じ場所で扱えます。",
|
|
6
|
+
"en": "OpenCode V2 is now available as an agent. Launching, status, answering approvals and questions, and schedules all work in the same places as the existing OpenCode."
|
|
7
|
+
},
|
|
8
|
+
"added": [
|
|
9
|
+
{
|
|
10
|
+
"ja": "OpenCode V2 をエージェントとして選べるようになり、起動・終了と状態の表示ができるようになりました。",
|
|
11
|
+
"en": "You can now choose OpenCode V2 as an agent, start and stop it, and see its status."
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"ja": "OpenCode V2 の承認と質問に、画面・スマホ・CLI・Auto-Yes から答えられるようになりました。",
|
|
15
|
+
"en": "You can now answer OpenCode V2 approvals and questions from the screen, your phone, the CLI, or Auto-Yes."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"ja": "OpenCode V2 の入力欄で「/」を打つと、スラッシュコマンドの候補が出るようになりました。",
|
|
19
|
+
"en": "Typing / in the OpenCode V2 input now shows slash command suggestions."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ja": "OpenCode V2 で、実際に返答したモデル名が画面と capture に出るようになりました。",
|
|
23
|
+
"en": "OpenCode V2 now shows the model that actually replied, on screen and in capture."
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"ja": "OpenCode V2 でも、エージェント切り替えやコマンドパレットのクイックキーが使えるようになりました。",
|
|
27
|
+
"en": "Quick keys such as agent switching and the command palette now work with OpenCode V2."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"ja": "OpenCode V2 のトークン・費用・コンテキストの使用量が、これまでの OpenCode と同じ場所に出るようになりました。",
|
|
31
|
+
"en": "OpenCode V2 token, cost, and context usage now appear in the same place as for the existing OpenCode."
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"ja": "スケジュールで OpenCode V2 を指定でき、モデルやエージェントなどの実行オプションも渡せるようになりました。",
|
|
35
|
+
"en": "Schedules can now run OpenCode V2 and pass run options such as the model and agent."
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"ja": "OpenCode V2 のダイアログカードに、モデルを切り替えるキーが出るようになりました。",
|
|
39
|
+
"en": "OpenCode V2 dialog cards now show the keys for switching models."
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"ja": "日次確認の対象に OpenCode V2 が加わりました。",
|
|
43
|
+
"en": "The daily health check now covers OpenCode V2."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"ja": "新しい commandmate reply コマンドで、セッションの最新の返答を読めるようになりました。",
|
|
47
|
+
"en": "The new commandmate reply command reads a session's latest reply."
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"improved": [
|
|
51
|
+
{
|
|
52
|
+
"ja": "OpenCode V2 の Build と Plan の切り替えが入力欄の横のボタンになり、今のエージェントが表示されるようになりました。",
|
|
53
|
+
"en": "Switching between Build and Plan in OpenCode V2 is now a button next to the input, and it shows the current agent."
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"ja": "Skill の互換表で、OpenCode V2 は Skill を足したあとに開始し直さなくてよいことを示すようにしました。",
|
|
57
|
+
"en": "The Skill compatibility table now shows that OpenCode V2 does not need a restart after a Skill is added."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"ja": "commandmate ask が、会話が長すぎてモデルの上限を超えたときに、完了ではなく失敗として返すようになりました。",
|
|
61
|
+
"en": "commandmate ask now reports a failure, not a completed turn, when the conversation is over the model's context limit."
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"ja": "起動したばかりの Command Code にすぐ送ったとき、「起動中」として返すようになりました。",
|
|
65
|
+
"en": "Sending to a Command Code session that has only just started is now reported as still starting."
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"fixed": [
|
|
69
|
+
{
|
|
70
|
+
"ja": "新しいセッションを起動した直後の送信が、約 1 分待たされて失敗することがある問題を直しました。",
|
|
71
|
+
"en": "Fixed the first send to a new session sometimes waiting about a minute and then failing."
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"ja": "起動直後の Claude で、使っているモデル名が表示されない問題を直しました。",
|
|
75
|
+
"en": "Fixed the model name not showing for a Claude session that had just started."
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"ja": "Auto-Yes が飛ばした画面の警告が、同じ画面の間に何度も出る問題を直しました。",
|
|
79
|
+
"en": "Fixed the warning for a screen Auto-Yes skipped repeating while the same screen stayed up."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"ja": "OpenCode V2 の返答が履歴に記録されない問題を直しました。",
|
|
83
|
+
"en": "Fixed OpenCode V2 replies not being recorded in History."
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"ja": "OpenCode V2 の返答に番号付きのリストがあると、応答待ちと誤って扱われ、Auto-Yes が番号を送ってしまう問題を直しました。",
|
|
87
|
+
"en": "Fixed numbered lists in OpenCode V2 replies being treated as a question, which made Auto-Yes send a number."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"ja": "OpenCode V2 でダイアログが開いたまま送信すると、本文が消える問題を直しました。",
|
|
91
|
+
"en": "Fixed the message being lost when sending while an OpenCode V2 dialog was open."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"ja": "OpenCode V2 で、引数なしのスラッシュコマンドが実行されない問題を直しました。",
|
|
95
|
+
"en": "Fixed OpenCode V2 slash commands without arguments not running."
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"ja": "OpenCode V2 の承認の文言や、保留中の承認への Auto-Yes の応答を直しました。",
|
|
99
|
+
"en": "Fixed OpenCode V2 approval wording and Auto-Yes answers to pending approvals."
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"ja": "OpenCode V2 の承認や質問を待つ間の注意文が、チャットに記録されてしまう問題を直しました。",
|
|
103
|
+
"en": "Fixed the notice shown while OpenCode V2 waits on an approval or question being recorded in the chat."
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"ja": "OpenCode V2 を起動すると、プロジェクトの package.json が書き換えられる問題を直しました。",
|
|
107
|
+
"en": "Fixed starting OpenCode V2 writing to the project's package.json."
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"ja": "OpenCode V2 を opencode という名前で入れている環境でも、正しく起動するようにしました。",
|
|
111
|
+
"en": "OpenCode V2 now starts correctly when it is installed under the name opencode."
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"ja": "OpenCode と OpenCode V2 を取り違えることがある問題を直しました。",
|
|
115
|
+
"en": "Fixed OpenCode and OpenCode V2 sometimes being mixed up."
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"ja": "OpenCode V2 のスケジュールが worktree で動くようにし、画面から作れてしまう不正なスケジュールを防ぎました。",
|
|
119
|
+
"en": "OpenCode V2 schedules now run in the worktree, and invalid schedules can no longer be created from the screen."
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"ja": "日次確認で、codex の更新ダイアログや設定ファイル、OpenCode のモデル選択と入力履歴の扱いに関する問題を直しました。",
|
|
123
|
+
"en": "Fixed daily health check issues with the codex update dialog and config file, and with OpenCode model selection and input history."
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"ja": "commandmate verify が、別の作業で一時的にできたファイルを自分の違反として数える問題を直しました。",
|
|
127
|
+
"en": "Fixed commandmate verify counting temporary files from other work as its own violations."
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
}
|
|
@@ -265,6 +265,20 @@ fi
|
|
|
265
265
|
if [ -n "$DETAIL" ]; then
|
|
266
266
|
BODY="$BODY,\"detail\":\"$(json_escape "$DETAIL")\""
|
|
267
267
|
fi
|
|
268
|
+
# Issue #2955. Claude names its model on `SessionStart` (`"model":
|
|
269
|
+
# "claude-sonnet-5-5"`, measured on 2.1.284), and `SessionStart` is the one
|
|
270
|
+
# Claude event that has to come through this script (http hooks are not
|
|
271
|
+
# supported there). Before #2955 the value was dropped here, so the server's
|
|
272
|
+
# model latch was never written for any claude session. Forwarded on
|
|
273
|
+
# session_start only — other tools' payloads keep the body they had — and
|
|
274
|
+
# omitted when the payload has none (`claude -p`, the `SessionStart` of
|
|
275
|
+
# `/clear`), where an empty value would read as "the model is unknown".
|
|
276
|
+
if [ "$EVENT" = "session_start" ] && [ -n "$HOOK_JSON" ]; then
|
|
277
|
+
MODEL="$(json_string_field "$HOOK_JSON" 'model')"
|
|
278
|
+
if [ -n "$MODEL" ]; then
|
|
279
|
+
BODY="$BODY,\"model\":\"$(json_escape "$MODEL")\""
|
|
280
|
+
fi
|
|
281
|
+
fi
|
|
268
282
|
BODY="$BODY}"
|
|
269
283
|
|
|
270
284
|
# Token via --header rather than the command line of a subprocess: argv is world
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# launch.sh — run an OpenCode V2 (`opencode2`) server and its TUI in ONE tmux
|
|
4
|
+
# pane, so the two live and die together (Issue #2934, Epic #2370 Phase 1).
|
|
5
|
+
#
|
|
6
|
+
# OpenCode 2's TUI does not host the API the way v1's does: the API is a
|
|
7
|
+
# separate `opencode2 serve`, and the TUI attaches to it with `--server`. If
|
|
8
|
+
# CommandMate started the server as a child of its own process, a CommandMate
|
|
9
|
+
# restart would take every agent's server down with it; if the server were
|
|
10
|
+
# started in the pane without a guard, closing the pane would leave the port
|
|
11
|
+
# bound (the #1905 failure, which v1 only avoided because its TUI WAS the
|
|
12
|
+
# server). So this wrapper owns both processes and a trap stops the server on
|
|
13
|
+
# every way out: the TUI exiting, `tmux kill-session` (SIGHUP), Ctrl-C (SIGINT)
|
|
14
|
+
# and SIGTERM.
|
|
15
|
+
#
|
|
16
|
+
# Usage:
|
|
17
|
+
# launch.sh --port <N> --password-file <path> --directory <path>
|
|
18
|
+
# [--executable <path>]
|
|
19
|
+
#
|
|
20
|
+
# The executable
|
|
21
|
+
# The OpenCode V2 binary to run for both the server and the TUI. CommandMate
|
|
22
|
+
# passes the absolute path it identified as OpenCode V2 by `--version`
|
|
23
|
+
# (Issue #2952), which may be named `opencode` as well as `opencode2`, and
|
|
24
|
+
# which the pane's own PATH might resolve differently. Omitted, it is
|
|
25
|
+
# `opencode2` looked up on PATH.
|
|
26
|
+
#
|
|
27
|
+
# The password
|
|
28
|
+
# CommandMate generates one per launch and writes it to a 0600 file under
|
|
29
|
+
# ~/.commandmate/opencode-v2/. It is read here and placed in the environment
|
|
30
|
+
# variable OPENCODE_SERVER_PASSWORD ONLY: it is never echoed, never passed as
|
|
31
|
+
# an argument (argv is readable by `ps`), and the readiness probe hands it to
|
|
32
|
+
# curl through `--config -` on stdin for the same reason. Accepted, and stated
|
|
33
|
+
# so nobody has to rediscover it: the serve and TUI processes carry it in their
|
|
34
|
+
# environment, and so does any shell tool the agent runs. The server listens on
|
|
35
|
+
# 127.0.0.1 only, so what the password protects stays inside the same OS user.
|
|
36
|
+
#
|
|
37
|
+
# Environment (tests only):
|
|
38
|
+
# CM_OPENCODE_V2_READY_TIMEOUT seconds to wait for the server (default 15)
|
|
39
|
+
#
|
|
40
|
+
# Exit codes: the TUI's own status when it exits; 64 usage error; 66 password
|
|
41
|
+
# file unreadable or empty; 69 the server did not answer in time; 129/130/143
|
|
42
|
+
# when stopped by SIGHUP / SIGINT / SIGTERM.
|
|
43
|
+
#
|
|
44
|
+
# Written for bash 3.2 (the macOS system bash): no associative arrays, no
|
|
45
|
+
# `mapfile`, no `${var^^}`, no `wait -n`.
|
|
46
|
+
|
|
47
|
+
set -u
|
|
48
|
+
|
|
49
|
+
PROGRAM_NAME="launch.sh"
|
|
50
|
+
READY_TIMEOUT_SECONDS="${CM_OPENCODE_V2_READY_TIMEOUT:-15}"
|
|
51
|
+
STOP_GRACE_TICKS=30 # x 0.1 s before SIGKILL
|
|
52
|
+
|
|
53
|
+
port=""
|
|
54
|
+
password_file=""
|
|
55
|
+
directory=""
|
|
56
|
+
executable=""
|
|
57
|
+
|
|
58
|
+
usage() {
|
|
59
|
+
echo "Usage: ${PROGRAM_NAME} --port <N> --password-file <path> --directory <path> [--executable <path>]" >&2
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
die() {
|
|
63
|
+
local code="$1"
|
|
64
|
+
shift
|
|
65
|
+
echo "${PROGRAM_NAME}: $*" >&2
|
|
66
|
+
exit "$code"
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
while [ $# -gt 0 ]; do
|
|
70
|
+
case "$1" in
|
|
71
|
+
--port)
|
|
72
|
+
[ $# -ge 2 ] || { usage; exit 64; }
|
|
73
|
+
port="$2"
|
|
74
|
+
shift 2
|
|
75
|
+
;;
|
|
76
|
+
--password-file)
|
|
77
|
+
[ $# -ge 2 ] || { usage; exit 64; }
|
|
78
|
+
password_file="$2"
|
|
79
|
+
shift 2
|
|
80
|
+
;;
|
|
81
|
+
--directory)
|
|
82
|
+
[ $# -ge 2 ] || { usage; exit 64; }
|
|
83
|
+
directory="$2"
|
|
84
|
+
shift 2
|
|
85
|
+
;;
|
|
86
|
+
--executable)
|
|
87
|
+
[ $# -ge 2 ] || { usage; exit 64; }
|
|
88
|
+
executable="$2"
|
|
89
|
+
[ -n "$executable" ] || { usage; exit 64; }
|
|
90
|
+
shift 2
|
|
91
|
+
;;
|
|
92
|
+
-h | --help)
|
|
93
|
+
usage
|
|
94
|
+
exit 0
|
|
95
|
+
;;
|
|
96
|
+
*)
|
|
97
|
+
usage
|
|
98
|
+
die 64 "unknown argument: $1"
|
|
99
|
+
;;
|
|
100
|
+
esac
|
|
101
|
+
done
|
|
102
|
+
|
|
103
|
+
if [ -z "$port" ] || [ -z "$password_file" ] || [ -z "$directory" ]; then
|
|
104
|
+
usage
|
|
105
|
+
exit 64
|
|
106
|
+
fi
|
|
107
|
+
case "$port" in
|
|
108
|
+
'' | *[!0-9]*) die 64 "--port must be a number: ${port}" ;;
|
|
109
|
+
esac
|
|
110
|
+
if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
|
111
|
+
die 64 "--port out of range: ${port}"
|
|
112
|
+
fi
|
|
113
|
+
case "$READY_TIMEOUT_SECONDS" in
|
|
114
|
+
'' | *[!0-9]*) READY_TIMEOUT_SECONDS=15 ;;
|
|
115
|
+
esac
|
|
116
|
+
[ -d "$directory" ] || die 64 "--directory is not a directory: ${directory}"
|
|
117
|
+
if [ -n "$executable" ]; then
|
|
118
|
+
{ [ -f "$executable" ] && [ -x "$executable" ]; } ||
|
|
119
|
+
die 64 "--executable is not an executable file: ${executable}"
|
|
120
|
+
else
|
|
121
|
+
executable="opencode2"
|
|
122
|
+
fi
|
|
123
|
+
[ -r "$password_file" ] || die 66 "password file is not readable: ${password_file}"
|
|
124
|
+
|
|
125
|
+
# `read` returns non-zero on a file without a trailing newline even though it
|
|
126
|
+
# filled the variable, so success is judged by the value, not the status.
|
|
127
|
+
OPENCODE_SERVER_PASSWORD=""
|
|
128
|
+
IFS= read -r OPENCODE_SERVER_PASSWORD <"$password_file" || true
|
|
129
|
+
[ -n "$OPENCODE_SERVER_PASSWORD" ] || die 66 "password file is empty: ${password_file}"
|
|
130
|
+
export OPENCODE_SERVER_PASSWORD
|
|
131
|
+
|
|
132
|
+
# Keep the user's project untouched (Issue #2957). On start the TUI checks for
|
|
133
|
+
# its own update by running `npm`/`pnpm`/`yarn`/`bun list -g` in the directory
|
|
134
|
+
# it was started from; where `pnpm`/`yarn` are corepack shims, corepack then
|
|
135
|
+
# writes a "packageManager" field into the nearest package.json (auto-pin).
|
|
136
|
+
# Measured with opencode2 v2.0.18: OPENCODE_DISABLE_AUTOUPDATE=1 stops those
|
|
137
|
+
# spawns altogether, and COREPACK_ENABLE_AUTO_PIN=0 keeps corepack from writing
|
|
138
|
+
# should any package manager run anyway. CommandMate reports updates itself.
|
|
139
|
+
export OPENCODE_DISABLE_AUTOUPDATE=1
|
|
140
|
+
export COREPACK_ENABLE_AUTO_PIN=0
|
|
141
|
+
|
|
142
|
+
server_url="http://127.0.0.1:${port}"
|
|
143
|
+
serve_pid=""
|
|
144
|
+
tui_pid=""
|
|
145
|
+
|
|
146
|
+
# Stop one child: SIGTERM, a short grace period, then SIGKILL, then reap it so
|
|
147
|
+
# the port is released before this script's own exit is observable.
|
|
148
|
+
# shellcheck disable=SC2329 # invoked from the EXIT trap via cleanup
|
|
149
|
+
stop_child() {
|
|
150
|
+
local pid="$1"
|
|
151
|
+
local ticks=0
|
|
152
|
+
[ -n "$pid" ] || return 0
|
|
153
|
+
kill -TERM "$pid" 2>/dev/null || true
|
|
154
|
+
while kill -0 "$pid" 2>/dev/null; do
|
|
155
|
+
if [ "$ticks" -ge "$STOP_GRACE_TICKS" ]; then
|
|
156
|
+
kill -KILL "$pid" 2>/dev/null || true
|
|
157
|
+
break
|
|
158
|
+
fi
|
|
159
|
+
sleep 0.1
|
|
160
|
+
ticks=$((ticks + 1))
|
|
161
|
+
done
|
|
162
|
+
wait "$pid" 2>/dev/null || true
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
# shellcheck disable=SC2329 # invoked by the EXIT trap
|
|
166
|
+
cleanup() {
|
|
167
|
+
local tui="$tui_pid"
|
|
168
|
+
local serve="$serve_pid"
|
|
169
|
+
tui_pid=""
|
|
170
|
+
serve_pid=""
|
|
171
|
+
stop_child "$tui"
|
|
172
|
+
stop_child "$serve"
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
trap cleanup EXIT
|
|
176
|
+
# Each signal becomes an ordinary exit, which runs the EXIT trap above exactly
|
|
177
|
+
# once. The TUI is waited on with `wait` (below) rather than run as a
|
|
178
|
+
# foreground command precisely so these fire immediately: bash defers a
|
|
179
|
+
# trapped signal until a foreground child returns, and a TUI that ignores the
|
|
180
|
+
# hangup would otherwise keep the server alive forever.
|
|
181
|
+
trap 'exit 129' HUP
|
|
182
|
+
trap 'exit 130' INT
|
|
183
|
+
trap 'exit 143' TERM
|
|
184
|
+
|
|
185
|
+
# The server's own output would only be painted over by the TUI's alternate
|
|
186
|
+
# screen, and with OPENCODE_SERVER_PASSWORD set it prints no secret anyway.
|
|
187
|
+
"$executable" serve --hostname 127.0.0.1 --port "$port" </dev/null >/dev/null 2>&1 &
|
|
188
|
+
serve_pid=$!
|
|
189
|
+
|
|
190
|
+
# Ready means `GET /openapi.json` answered 200 with our credentials. The
|
|
191
|
+
# credentials go to curl on stdin (`--config -`), never on its command line.
|
|
192
|
+
probe_ready() {
|
|
193
|
+
local code
|
|
194
|
+
code="$(printf 'user = "opencode:%s"\n' "$OPENCODE_SERVER_PASSWORD" |
|
|
195
|
+
curl --config - --silent --output /dev/null --write-out '%{http_code}' \
|
|
196
|
+
--max-time 1 "${server_url}/openapi.json" 2>/dev/null)" || true
|
|
197
|
+
[ "$code" = "200" ]
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
ready=0
|
|
201
|
+
deadline=$((SECONDS + READY_TIMEOUT_SECONDS))
|
|
202
|
+
while [ "$SECONDS" -lt "$deadline" ]; do
|
|
203
|
+
if ! kill -0 "$serve_pid" 2>/dev/null; then
|
|
204
|
+
die 69 "${executable} serve exited before answering on ${server_url}"
|
|
205
|
+
fi
|
|
206
|
+
if probe_ready; then
|
|
207
|
+
ready=1
|
|
208
|
+
break
|
|
209
|
+
fi
|
|
210
|
+
sleep 0.25
|
|
211
|
+
done
|
|
212
|
+
[ "$ready" -eq 1 ] || die 69 "${executable} serve did not answer on ${server_url} within ${READY_TIMEOUT_SECONDS}s"
|
|
213
|
+
|
|
214
|
+
# Asynchronous commands in a non-interactive shell get /dev/null as stdin
|
|
215
|
+
# unless they are given an explicit redirection, so the terminal is handed over
|
|
216
|
+
# on fd 3. The TUI still shares this script's process group, which is the
|
|
217
|
+
# pane's foreground group, so it keeps reading the terminal.
|
|
218
|
+
exec 3<&0
|
|
219
|
+
"$executable" --server "$server_url" "$directory" <&3 3<&- &
|
|
220
|
+
tui_pid=$!
|
|
221
|
+
exec 3<&-
|
|
222
|
+
|
|
223
|
+
status=0
|
|
224
|
+
wait "$tui_pid" || status=$?
|
|
225
|
+
tui_pid=""
|
|
226
|
+
exit "$status"
|