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
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HTTP client for an OpenCode V2 server CommandMate started (Issue #2934).
|
|
4
|
+
*
|
|
5
|
+
* Three calls, all to the loopback server `scripts/opencode-v2/launch.sh` runs
|
|
6
|
+
* in the instance's pane:
|
|
7
|
+
*
|
|
8
|
+
* - {@link probeOpencodeV2Server}: `GET /openapi.json` — the same request the
|
|
9
|
+
* wrapper waits on before it starts the TUI;
|
|
10
|
+
* - {@link openOpencodeV2EventStream}: `GET /api/event`, the SSE stream the
|
|
11
|
+
* subscription reads its state from;
|
|
12
|
+
* - {@link fetchOpencodeV2SessionMessagesPage}: `GET /api/session/{id}/message`,
|
|
13
|
+
* the stored turns History is written from (Issue #2940);
|
|
14
|
+
* - the approval and question calls (Issue #2945): list what is pending
|
|
15
|
+
* (`GET /api/permission/request`, `GET /api/form`,
|
|
16
|
+
* `GET /api/session/{id}/form`) and answer it
|
|
17
|
+
* (`POST …/permission/{requestID}/reply`, `POST …/form/{formID}/reply`).
|
|
18
|
+
*
|
|
19
|
+
* All authenticate with Basic `opencode:<password>`, the password read from
|
|
20
|
+
* the instance's file (`./secrets`) at call time. The value is put into a
|
|
21
|
+
* header and nowhere else — never into a URL, an error message or a log field.
|
|
22
|
+
*
|
|
23
|
+
* Wire format measured on 2.0.18 (#2370 Phase 0): every frame is one
|
|
24
|
+
* `data: {id, created?, type, location?, data, durable?}` line, and between
|
|
25
|
+
* frames the server sends `: heartbeat` comment lines. An unauthenticated
|
|
26
|
+
* request to any route answers 401.
|
|
27
|
+
*
|
|
28
|
+
* @module lib/hooks/sources/opencode-v2/client
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.OPENCODE_V2_CONTEXT_MESSAGE_WINDOW = exports.MAX_OPENCODE_V2_DECISION_BODY_CHARS = exports.OPENCODE_V2_DECISION_TIMEOUT_MS = exports.OPENCODE_V2_MESSAGES_PAGE_SIZE = exports.MAX_OPENCODE_V2_MESSAGES_BODY_CHARS = exports.OPENCODE_V2_MESSAGES_TIMEOUT_MS = exports.MAX_OPENCODE_V2_SSE_FRAME_CHARS = exports.OPENCODE_V2_PROBE_TIMEOUT_MS = exports.OPENCODE_V2_SERVER_USER = exports.OPENCODE_V2_SERVER_HOST = void 0;
|
|
32
|
+
exports.opencodeV2BaseUrl = opencodeV2BaseUrl;
|
|
33
|
+
exports.opencodeV2AuthorizationHeader = opencodeV2AuthorizationHeader;
|
|
34
|
+
exports.probeOpencodeV2Server = probeOpencodeV2Server;
|
|
35
|
+
exports.createOpencodeV2SseParser = createOpencodeV2SseParser;
|
|
36
|
+
exports.parseOpencodeV2Frame = parseOpencodeV2Frame;
|
|
37
|
+
exports.openOpencodeV2EventStream = openOpencodeV2EventStream;
|
|
38
|
+
exports.iterateOpencodeV2Stream = iterateOpencodeV2Stream;
|
|
39
|
+
exports.fetchOpencodeV2SessionMessagesPage = fetchOpencodeV2SessionMessagesPage;
|
|
40
|
+
exports.fetchOpencodeV2PendingPermissions = fetchOpencodeV2PendingPermissions;
|
|
41
|
+
exports.fetchOpencodeV2PendingForms = fetchOpencodeV2PendingForms;
|
|
42
|
+
exports.fetchOpencodeV2SessionForms = fetchOpencodeV2SessionForms;
|
|
43
|
+
exports.replyOpencodeV2Permission = replyOpencodeV2Permission;
|
|
44
|
+
exports.replyOpencodeV2Form = replyOpencodeV2Form;
|
|
45
|
+
exports.fetchOpencodeV2Session = fetchOpencodeV2Session;
|
|
46
|
+
exports.fetchOpencodeV2RecentMessages = fetchOpencodeV2RecentMessages;
|
|
47
|
+
exports.fetchOpencodeV2Models = fetchOpencodeV2Models;
|
|
48
|
+
const event_mapper_1 = require("../event-mapper");
|
|
49
|
+
/** The only host OpenCode V2 servers are started on and dialled at. */
|
|
50
|
+
exports.OPENCODE_V2_SERVER_HOST = '127.0.0.1';
|
|
51
|
+
/** The Basic-auth user name `opencode2 serve` expects. */
|
|
52
|
+
exports.OPENCODE_V2_SERVER_USER = 'opencode';
|
|
53
|
+
/** How long one probe may take before it counts as unreachable. */
|
|
54
|
+
exports.OPENCODE_V2_PROBE_TIMEOUT_MS = 2_000;
|
|
55
|
+
/**
|
|
56
|
+
* Largest frame accepted off the stream, in characters.
|
|
57
|
+
*
|
|
58
|
+
* `permission.asked` carries a unified diff in `metadata.files[].patch`, so a
|
|
59
|
+
* frame is not small; but a frame that never ends must not grow without bound
|
|
60
|
+
* inside a long-lived server process either.
|
|
61
|
+
*/
|
|
62
|
+
exports.MAX_OPENCODE_V2_SSE_FRAME_CHARS = 4 * 1024 * 1024;
|
|
63
|
+
/** Base URL of an instance's server. */
|
|
64
|
+
function opencodeV2BaseUrl(port) {
|
|
65
|
+
return `http://${exports.OPENCODE_V2_SERVER_HOST}:${port}`;
|
|
66
|
+
}
|
|
67
|
+
/** The `Authorization` header value for a password. */
|
|
68
|
+
function opencodeV2AuthorizationHeader(password) {
|
|
69
|
+
return `Basic ${Buffer.from(`${exports.OPENCODE_V2_SERVER_USER}:${password}`).toString('base64')}`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Whether the server on `port` is up and accepts `password`.
|
|
73
|
+
*
|
|
74
|
+
* `rejected` is the answer that matters for reattachment: something is
|
|
75
|
+
* listening, but not a server holding this instance's password — a different
|
|
76
|
+
* process took the port, and subscribing to it would read someone else's
|
|
77
|
+
* events.
|
|
78
|
+
*/
|
|
79
|
+
async function probeOpencodeV2Server(port, password) {
|
|
80
|
+
try {
|
|
81
|
+
const response = await fetch(`${opencodeV2BaseUrl(port)}/openapi.json`, {
|
|
82
|
+
headers: { Authorization: opencodeV2AuthorizationHeader(password) },
|
|
83
|
+
redirect: 'error',
|
|
84
|
+
signal: AbortSignal.timeout(exports.OPENCODE_V2_PROBE_TIMEOUT_MS),
|
|
85
|
+
});
|
|
86
|
+
await response.body?.cancel().catch(() => { });
|
|
87
|
+
return response.status === 200
|
|
88
|
+
? { kind: 'healthy' }
|
|
89
|
+
: { kind: 'rejected', status: response.status };
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return { kind: 'unreachable' };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** A fresh {@link OpencodeV2SseParser}. */
|
|
96
|
+
function createOpencodeV2SseParser() {
|
|
97
|
+
let buffer = '';
|
|
98
|
+
let data = [];
|
|
99
|
+
let dataChars = 0;
|
|
100
|
+
let oversized = false;
|
|
101
|
+
let oversizedCount = 0;
|
|
102
|
+
const dispatch = (items) => {
|
|
103
|
+
if (oversized)
|
|
104
|
+
oversizedCount += 1;
|
|
105
|
+
else if (data.length > 0)
|
|
106
|
+
items.push({ kind: 'frame', data: data.join('\n') });
|
|
107
|
+
data = [];
|
|
108
|
+
dataChars = 0;
|
|
109
|
+
oversized = false;
|
|
110
|
+
};
|
|
111
|
+
const takeLine = (line, items) => {
|
|
112
|
+
if (line === '') {
|
|
113
|
+
dispatch(items);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (line.startsWith(':')) {
|
|
117
|
+
items.push({ kind: 'heartbeat' });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (!line.startsWith('data:'))
|
|
121
|
+
return;
|
|
122
|
+
if (oversized)
|
|
123
|
+
return;
|
|
124
|
+
const value = line.slice(5).replace(/^ /, '');
|
|
125
|
+
dataChars += value.length;
|
|
126
|
+
if (dataChars > exports.MAX_OPENCODE_V2_SSE_FRAME_CHARS) {
|
|
127
|
+
oversized = true;
|
|
128
|
+
data = [];
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
data.push(value);
|
|
132
|
+
};
|
|
133
|
+
return {
|
|
134
|
+
push(chunk) {
|
|
135
|
+
const items = [];
|
|
136
|
+
buffer += chunk;
|
|
137
|
+
let newline = buffer.search(/\r?\n|\r/);
|
|
138
|
+
while (newline !== -1) {
|
|
139
|
+
const line = buffer.slice(0, newline);
|
|
140
|
+
const width = buffer.startsWith('\r\n', newline) ? 2 : 1;
|
|
141
|
+
buffer = buffer.slice(newline + width);
|
|
142
|
+
takeLine(line, items);
|
|
143
|
+
newline = buffer.search(/\r?\n|\r/);
|
|
144
|
+
}
|
|
145
|
+
if (buffer.length > exports.MAX_OPENCODE_V2_SSE_FRAME_CHARS) {
|
|
146
|
+
// One unterminated line longer than any frame: drop it rather than
|
|
147
|
+
// hold it. The event it belongs to is counted as oversized.
|
|
148
|
+
buffer = '';
|
|
149
|
+
oversized = true;
|
|
150
|
+
}
|
|
151
|
+
return items;
|
|
152
|
+
},
|
|
153
|
+
flush() {
|
|
154
|
+
const items = [];
|
|
155
|
+
if (buffer !== '')
|
|
156
|
+
takeLine(buffer, items);
|
|
157
|
+
buffer = '';
|
|
158
|
+
dispatch(items);
|
|
159
|
+
return items;
|
|
160
|
+
},
|
|
161
|
+
oversizedFrames() {
|
|
162
|
+
return oversizedCount;
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/** JSON object, or null for anything else. */
|
|
167
|
+
function parseOpencodeV2Frame(raw) {
|
|
168
|
+
try {
|
|
169
|
+
const parsed = JSON.parse(raw);
|
|
170
|
+
return (0, event_mapper_1.isPlainObject)(parsed) ? parsed : null;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Open `GET /api/event`.
|
|
178
|
+
*
|
|
179
|
+
* Resolves once the response headers are in — the instant the server has
|
|
180
|
+
* accepted the subscription — and rejects on anything but a `200
|
|
181
|
+
* text/event-stream`, so the caller's reconnect loop is the only error path.
|
|
182
|
+
*
|
|
183
|
+
* @param port - The instance's server
|
|
184
|
+
* @param password - The instance's password
|
|
185
|
+
* @param signal - Aborted to close the stream
|
|
186
|
+
*/
|
|
187
|
+
async function openOpencodeV2EventStream(port, password, signal) {
|
|
188
|
+
const response = await fetch(`${opencodeV2BaseUrl(port)}/api/event`, {
|
|
189
|
+
signal,
|
|
190
|
+
redirect: 'error',
|
|
191
|
+
headers: {
|
|
192
|
+
Accept: 'text/event-stream',
|
|
193
|
+
Authorization: opencodeV2AuthorizationHeader(password),
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
if (!response.ok || !response.body) {
|
|
197
|
+
await response.body?.cancel().catch(() => { });
|
|
198
|
+
throw new Error(`opencode2 /api/event responded ${response.status}`);
|
|
199
|
+
}
|
|
200
|
+
const contentType = response.headers.get('content-type')?.split(';')[0]?.trim().toLowerCase();
|
|
201
|
+
if (contentType !== 'text/event-stream') {
|
|
202
|
+
await response.body.cancel().catch(() => { });
|
|
203
|
+
throw new Error(`opencode2 /api/event answered ${contentType ?? 'no content-type'}`);
|
|
204
|
+
}
|
|
205
|
+
return iterateOpencodeV2Stream(response.body.getReader());
|
|
206
|
+
}
|
|
207
|
+
/** Parse an open body into items until it ends. */
|
|
208
|
+
async function* iterateOpencodeV2Stream(reader) {
|
|
209
|
+
const decoder = new TextDecoder();
|
|
210
|
+
const parser = createOpencodeV2SseParser();
|
|
211
|
+
const convert = function* (items) {
|
|
212
|
+
for (const item of items) {
|
|
213
|
+
if (item.kind === 'heartbeat') {
|
|
214
|
+
yield item;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const frame = parseOpencodeV2Frame(item.data);
|
|
218
|
+
if (frame)
|
|
219
|
+
yield { kind: 'frame', frame };
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
try {
|
|
223
|
+
for (;;) {
|
|
224
|
+
const { done, value } = await reader.read();
|
|
225
|
+
if (done)
|
|
226
|
+
break;
|
|
227
|
+
yield* convert(parser.push(decoder.decode(value, { stream: true })));
|
|
228
|
+
}
|
|
229
|
+
yield* convert(parser.flush());
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
await reader.cancel().catch(() => { });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** How long one `GET /api/session/{id}/message` may take (Issue #2940). */
|
|
236
|
+
exports.OPENCODE_V2_MESSAGES_TIMEOUT_MS = 5_000;
|
|
237
|
+
/** Largest `/message` response body accepted, in characters (Issue #2940). */
|
|
238
|
+
exports.MAX_OPENCODE_V2_MESSAGES_BODY_CHARS = 8 * 1024 * 1024;
|
|
239
|
+
/** Messages asked for per page (Issue #2940). */
|
|
240
|
+
exports.OPENCODE_V2_MESSAGES_PAGE_SIZE = 100;
|
|
241
|
+
/**
|
|
242
|
+
* One page of `GET /api/session/{id}/message` (Issue #2940).
|
|
243
|
+
*
|
|
244
|
+
* Measured on 2.0.18: `{data: [...], cursor: {previous, next}}`, newest first
|
|
245
|
+
* with `order=desc`. `cursor.next` walks towards older messages and must be
|
|
246
|
+
* sent without `order`.
|
|
247
|
+
*
|
|
248
|
+
* @param cursor - `cursor.next` of the previous page, or null for the newest page
|
|
249
|
+
* @returns The page, or null when the server did not answer it (any status but
|
|
250
|
+
* 200, a timeout, a body that is not the expected object). Never throws.
|
|
251
|
+
*/
|
|
252
|
+
async function fetchOpencodeV2SessionMessagesPage(port, password, sessionId, cursor) {
|
|
253
|
+
const query = new URLSearchParams({ limit: String(exports.OPENCODE_V2_MESSAGES_PAGE_SIZE) });
|
|
254
|
+
if (cursor === null)
|
|
255
|
+
query.set('order', 'desc');
|
|
256
|
+
else
|
|
257
|
+
query.set('cursor', cursor);
|
|
258
|
+
try {
|
|
259
|
+
const response = await fetch(`${opencodeV2BaseUrl(port)}/api/session/${encodeURIComponent(sessionId)}/message?${query}`, {
|
|
260
|
+
headers: {
|
|
261
|
+
Accept: 'application/json',
|
|
262
|
+
Authorization: opencodeV2AuthorizationHeader(password),
|
|
263
|
+
},
|
|
264
|
+
redirect: 'error',
|
|
265
|
+
signal: AbortSignal.timeout(exports.OPENCODE_V2_MESSAGES_TIMEOUT_MS),
|
|
266
|
+
});
|
|
267
|
+
if (response.status !== 200) {
|
|
268
|
+
await response.body?.cancel().catch(() => { });
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
const text = await response.text();
|
|
272
|
+
if (text.length > exports.MAX_OPENCODE_V2_MESSAGES_BODY_CHARS)
|
|
273
|
+
return null;
|
|
274
|
+
const parsed = JSON.parse(text);
|
|
275
|
+
if (!(0, event_mapper_1.isPlainObject)(parsed) || !Array.isArray(parsed.data))
|
|
276
|
+
return null;
|
|
277
|
+
const next = (0, event_mapper_1.isPlainObject)(parsed.cursor) && typeof parsed.cursor.next === 'string'
|
|
278
|
+
? parsed.cursor.next
|
|
279
|
+
: null;
|
|
280
|
+
return { data: parsed.data, next };
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// =============================================================================
|
|
287
|
+
// Approvals and questions (Issue #2945)
|
|
288
|
+
// =============================================================================
|
|
289
|
+
/** How long one approval / question request may take (Issue #2945). */
|
|
290
|
+
exports.OPENCODE_V2_DECISION_TIMEOUT_MS = 5_000;
|
|
291
|
+
/** Largest approval / question response body accepted, in characters (Issue #2945). */
|
|
292
|
+
exports.MAX_OPENCODE_V2_DECISION_BODY_CHARS = 4 * 1024 * 1024;
|
|
293
|
+
/**
|
|
294
|
+
* One authenticated JSON request to an instance's server.
|
|
295
|
+
*
|
|
296
|
+
* @returns The status and parsed body, or null when nothing answered (refused
|
|
297
|
+
* connection, timeout, a body over the bound or not JSON). Never throws.
|
|
298
|
+
*/
|
|
299
|
+
async function requestOpencodeV2(port, password, method, path, body) {
|
|
300
|
+
try {
|
|
301
|
+
const response = await fetch(`${opencodeV2BaseUrl(port)}${path}`, {
|
|
302
|
+
method,
|
|
303
|
+
headers: {
|
|
304
|
+
Accept: 'application/json',
|
|
305
|
+
Authorization: opencodeV2AuthorizationHeader(password),
|
|
306
|
+
...(body === undefined ? {} : { 'Content-Type': 'application/json' }),
|
|
307
|
+
},
|
|
308
|
+
...(body === undefined ? {} : { body: JSON.stringify(body) }),
|
|
309
|
+
redirect: 'error',
|
|
310
|
+
signal: AbortSignal.timeout(exports.OPENCODE_V2_DECISION_TIMEOUT_MS),
|
|
311
|
+
});
|
|
312
|
+
const text = await response.text();
|
|
313
|
+
if (text.length > exports.MAX_OPENCODE_V2_DECISION_BODY_CHARS)
|
|
314
|
+
return null;
|
|
315
|
+
return { status: response.status, body: text === '' ? null : JSON.parse(text) };
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/** The `data` array of a 200 list response, or null. */
|
|
322
|
+
function listData(response) {
|
|
323
|
+
if (response === null || response.status !== 200)
|
|
324
|
+
return null;
|
|
325
|
+
return (0, event_mapper_1.isPlainObject)(response.body) && Array.isArray(response.body.data)
|
|
326
|
+
? response.body.data
|
|
327
|
+
: null;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* `GET /api/permission/request` — every approval the server is waiting on
|
|
331
|
+
* (`Permission.Request[]`). The server is the instance's own, so "every" is
|
|
332
|
+
* this instance's.
|
|
333
|
+
*
|
|
334
|
+
* @returns The entries, or null when the server did not answer the list
|
|
335
|
+
*/
|
|
336
|
+
async function fetchOpencodeV2PendingPermissions(port, password) {
|
|
337
|
+
return listData(await requestOpencodeV2(port, password, 'GET', '/api/permission/request'));
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* `GET /api/form` — every question (`Form.Info[]`) the server is waiting on.
|
|
341
|
+
*
|
|
342
|
+
* @returns The entries, or null when the server did not answer the list
|
|
343
|
+
*/
|
|
344
|
+
async function fetchOpencodeV2PendingForms(port, password) {
|
|
345
|
+
return listData(await requestOpencodeV2(port, password, 'GET', '/api/form'));
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* `GET /api/session/{id}/form` — the questions one session is waiting on.
|
|
349
|
+
*
|
|
350
|
+
* Where a question's fields are read from when a `form.created` frame arrives
|
|
351
|
+
* without them (2.0.18 sends the form in the frame as `data.form`).
|
|
352
|
+
*
|
|
353
|
+
* @returns The entries, or null when the server did not answer the list
|
|
354
|
+
*/
|
|
355
|
+
async function fetchOpencodeV2SessionForms(port, password, sessionId) {
|
|
356
|
+
return listData(await requestOpencodeV2(port, password, 'GET', `/api/session/${encodeURIComponent(sessionId)}/form`));
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* `POST /api/session/{sessionID}/permission/{requestID}/reply`.
|
|
360
|
+
*
|
|
361
|
+
* Measured on 2.0.18: 204, then `permission.replied` on the stream and the
|
|
362
|
+
* TUI's dialog closes.
|
|
363
|
+
*
|
|
364
|
+
* @returns Whether the server accepted the reply (2xx)
|
|
365
|
+
*/
|
|
366
|
+
async function replyOpencodeV2Permission(port, password, sessionId, requestId, decision, message) {
|
|
367
|
+
const response = await requestOpencodeV2(port, password, 'POST', `/api/session/${encodeURIComponent(sessionId)}/permission/${encodeURIComponent(requestId)}/reply`, message === undefined ? { decision } : { decision, message });
|
|
368
|
+
return response !== null && response.status >= 200 && response.status < 300;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* `POST /api/session/{sessionID}/form/{formID}/reply` with `{answer}`.
|
|
372
|
+
*
|
|
373
|
+
* Measured on 2.0.18: 204, then `form.replied`. A value the form does not
|
|
374
|
+
* accept answers 400 (`FormInvalidAnswerError`).
|
|
375
|
+
*
|
|
376
|
+
* @returns Whether the server accepted the answer (2xx)
|
|
377
|
+
*/
|
|
378
|
+
async function replyOpencodeV2Form(port, password, sessionId, formId, answer) {
|
|
379
|
+
const response = await requestOpencodeV2(port, password, 'POST', `/api/session/${encodeURIComponent(sessionId)}/form/${encodeURIComponent(formId)}/reply`, { answer });
|
|
380
|
+
return response !== null && response.status >= 200 && response.status < 300;
|
|
381
|
+
}
|
|
382
|
+
// =============================================================================
|
|
383
|
+
// Session usage (Issue #2981)
|
|
384
|
+
// =============================================================================
|
|
385
|
+
/** Messages asked for when only the newest assistant message is wanted (Issue #2981). */
|
|
386
|
+
exports.OPENCODE_V2_CONTEXT_MESSAGE_WINDOW = 20;
|
|
387
|
+
/**
|
|
388
|
+
* `GET /api/session/{id}` — the session's `Session.Info`, cumulative `cost` and
|
|
389
|
+
* `tokens` included. Measured on 2.0.18: `{data: {...}}`.
|
|
390
|
+
*
|
|
391
|
+
* @returns The `data` object, or null when the server did not answer it
|
|
392
|
+
*/
|
|
393
|
+
async function fetchOpencodeV2Session(port, password, sessionId) {
|
|
394
|
+
const response = await requestOpencodeV2(port, password, 'GET', `/api/session/${encodeURIComponent(sessionId)}`);
|
|
395
|
+
if (response === null || response.status !== 200)
|
|
396
|
+
return null;
|
|
397
|
+
return (0, event_mapper_1.isPlainObject)(response.body) && (0, event_mapper_1.isPlainObject)(response.body.data)
|
|
398
|
+
? response.body.data
|
|
399
|
+
: null;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* The newest {@link OPENCODE_V2_CONTEXT_MESSAGE_WINDOW} entries of
|
|
403
|
+
* `GET /api/session/{id}/message`, newest first.
|
|
404
|
+
*
|
|
405
|
+
* @returns The entries, or null when the server did not answer the list
|
|
406
|
+
*/
|
|
407
|
+
async function fetchOpencodeV2RecentMessages(port, password, sessionId) {
|
|
408
|
+
const query = new URLSearchParams({
|
|
409
|
+
limit: String(exports.OPENCODE_V2_CONTEXT_MESSAGE_WINDOW),
|
|
410
|
+
order: 'desc',
|
|
411
|
+
});
|
|
412
|
+
return listData(await requestOpencodeV2(port, password, 'GET', `/api/session/${encodeURIComponent(sessionId)}/message?${query}`));
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* `GET /api/model` — the models the server offers, each with
|
|
416
|
+
* `limit: { context, output, input? }` (2.0.18).
|
|
417
|
+
*
|
|
418
|
+
* @returns The entries, or null when the server did not answer the list
|
|
419
|
+
*/
|
|
420
|
+
async function fetchOpencodeV2Models(port, password) {
|
|
421
|
+
return listData(await requestOpencodeV2(port, password, 'GET', '/api/model'));
|
|
422
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenCode V2's own words for the three approval verdicts (Issue #2945 D1).
|
|
4
|
+
*
|
|
5
|
+
* The shared list (`STRUCTURED_DECISION_OPTIONS` in `lib/session/structured-prompt`)
|
|
6
|
+
* is v1's: `Allow once` / `Allow always` / `Reject`. OpenCode V2's TUI draws
|
|
7
|
+
* `Allow once Always allow Reject` (measured on 2.0.18, #2370 Phase 0) — the
|
|
8
|
+
* middle words the other way round — and a card that says one thing while the
|
|
9
|
+
* pane beside it says another makes the operator stop and check which is right.
|
|
10
|
+
* So the surfaces show v2's words for a v2 approval, keyed by the wire reply
|
|
11
|
+
* (`once` / `always` / `reject`), which is what the number still sends.
|
|
12
|
+
*
|
|
13
|
+
* A pure module with no imports, so the browser bundle can read it.
|
|
14
|
+
*
|
|
15
|
+
* @module lib/hooks/sources/opencode-v2/decision-labels
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.OPENCODE_V2_DECISION_LABELS = void 0;
|
|
19
|
+
/** Label per wire reply, in the order v2's TUI draws them. Untranslated, as v1's are. */
|
|
20
|
+
exports.OPENCODE_V2_DECISION_LABELS = {
|
|
21
|
+
once: 'Allow once',
|
|
22
|
+
always: 'Always allow',
|
|
23
|
+
reject: 'Reject',
|
|
24
|
+
};
|