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,271 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Where OpenCode V2's mapped events enter CommandMate's agent-event state
|
|
4
|
+
* (Issue #2934, decision D5).
|
|
5
|
+
*
|
|
6
|
+
* - a turn boundary (`user_prompt_submit` / `stop`) is recorded as-is, and a
|
|
7
|
+
* `stop` also runs the same stop side effects every tool's `Stop` does
|
|
8
|
+
* (`applyAgentStopEvent`: task events, verification) so `commandmate wait`
|
|
9
|
+
* completes on it. A failed turn (`stop` / `error`) is logged as an error;
|
|
10
|
+
* - an approval request (Issue #2945 D1/D3) is adjudicated FIRST — Auto-Yes
|
|
11
|
+
* answers it over `…/permission/{id}/reply` through the same
|
|
12
|
+
* `adjudicatePendingPermission` v1 uses — and then recorded as a pending
|
|
13
|
+
* decision carrying its action, the rule `Always allow` would save and the
|
|
14
|
+
* diff, so the PC panel and the phone sheet can show what they are
|
|
15
|
+
* approving. `promptSettled` is whether the verdict was delivered; the
|
|
16
|
+
* `permission.replied` that follows any answer (ours, another client's, or
|
|
17
|
+
* the human's in the TUI) retires it by id;
|
|
18
|
+
* - a question (`form.created`, Issue #2945 D2) is recorded, its fields are
|
|
19
|
+
* read (off the frame's `data.form`, or `GET /api/session/{id}/form`) and
|
|
20
|
+
* published as the question's choices, the phone is notified the way v1's
|
|
21
|
+
* `question.asked` notifies it, and `form.replied` / `form.cancelled` retire
|
|
22
|
+
* it.
|
|
23
|
+
*
|
|
24
|
+
* Never throws: an ingest failure is logged and the scraper keeps deciding.
|
|
25
|
+
*
|
|
26
|
+
* @module lib/hooks/sources/opencode-v2/ingest
|
|
27
|
+
*/
|
|
28
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
29
|
+
if (k2 === undefined) k2 = k;
|
|
30
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
31
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
32
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
33
|
+
}
|
|
34
|
+
Object.defineProperty(o, k2, desc);
|
|
35
|
+
}) : (function(o, m, k, k2) {
|
|
36
|
+
if (k2 === undefined) k2 = k;
|
|
37
|
+
o[k2] = m[k];
|
|
38
|
+
}));
|
|
39
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
40
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
41
|
+
}) : function(o, v) {
|
|
42
|
+
o["default"] = v;
|
|
43
|
+
});
|
|
44
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
45
|
+
var ownKeys = function(o) {
|
|
46
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
47
|
+
var ar = [];
|
|
48
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
49
|
+
return ar;
|
|
50
|
+
};
|
|
51
|
+
return ownKeys(o);
|
|
52
|
+
};
|
|
53
|
+
return function (mod) {
|
|
54
|
+
if (mod && mod.__esModule) return mod;
|
|
55
|
+
var result = {};
|
|
56
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
57
|
+
__setModuleDefault(result, mod);
|
|
58
|
+
return result;
|
|
59
|
+
};
|
|
60
|
+
})();
|
|
61
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
62
|
+
exports.ingestOpencodeV2Event = ingestOpencodeV2Event;
|
|
63
|
+
const logger_1 = require("../../../../lib/logger");
|
|
64
|
+
const agent_event_types_1 = require("../../../../lib/hooks/agent-event-types");
|
|
65
|
+
const permission_adjudication_1 = require("../../../../lib/hooks/permission-adjudication");
|
|
66
|
+
const pending_decision_kind_1 = require("../../../../lib/hooks/pending-decision-kind");
|
|
67
|
+
const agent_event_state_1 = require("../../../../lib/session/agent-event-state");
|
|
68
|
+
const structured_prompt_1 = require("../../../../lib/session/structured-prompt");
|
|
69
|
+
const event_mapper_1 = require("../event-mapper");
|
|
70
|
+
const push_1 = require("../opencode/push");
|
|
71
|
+
const client_1 = require("./client");
|
|
72
|
+
const mappers_1 = require("./mappers");
|
|
73
|
+
const payloads_1 = require("./payloads");
|
|
74
|
+
const ports_1 = require("./ports");
|
|
75
|
+
const secrets_1 = require("./secrets");
|
|
76
|
+
const source_1 = require("./source");
|
|
77
|
+
const tool_id_1 = require("./tool-id");
|
|
78
|
+
const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode-v2/ingest');
|
|
79
|
+
async function applyStop(target, instanceId) {
|
|
80
|
+
const [{ getDbInstance }, { getWorktreeById }, { applyAgentStopEvent }] = await Promise.all([
|
|
81
|
+
Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
|
|
82
|
+
Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
|
|
83
|
+
Promise.resolve().then(() => __importStar(require('../../../../lib/hooks/agent-event-service'))),
|
|
84
|
+
]);
|
|
85
|
+
const db = getDbInstance();
|
|
86
|
+
const worktree = getWorktreeById(db, target.worktreeId) ?? null;
|
|
87
|
+
if (!worktree) {
|
|
88
|
+
logger.info('opencode-v2-stop-unresolved-target', { worktreeId: target.worktreeId });
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
await applyAgentStopEvent(db, worktree, tool_id_1.OPENCODE_V2_CLI_TOOL_ID, instanceId);
|
|
92
|
+
}
|
|
93
|
+
/** `GET /api/session/{id}/form`, the form with this id. */
|
|
94
|
+
async function loadFormFromServer(target, sessionId, formId) {
|
|
95
|
+
const port = (0, ports_1.getAssignedOpencodeV2Port)(target);
|
|
96
|
+
const password = (0, secrets_1.readOpencodeV2Password)(target);
|
|
97
|
+
if (port === null || password === null)
|
|
98
|
+
return null;
|
|
99
|
+
const forms = await (0, client_1.fetchOpencodeV2SessionForms)(port, password, sessionId);
|
|
100
|
+
const form = forms?.find((entry) => (0, event_mapper_1.isPlainObject)(entry) && entry.id === formId);
|
|
101
|
+
return (0, event_mapper_1.isPlainObject)(form) ? form : null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Judge one approval and deliver the verdict, before it is recorded
|
|
105
|
+
* (Issue #2945 D3; the order is v1's #1898 fix).
|
|
106
|
+
*
|
|
107
|
+
* `adjudicatePendingPermission` is the one shared adjudicator: with Auto-Yes
|
|
108
|
+
* off it abstains and nothing is sent; with it on it answers `once` unless a
|
|
109
|
+
* deny pattern or the execution contract withholds it.
|
|
110
|
+
*
|
|
111
|
+
* @returns Whether the dialog may be treated as closed
|
|
112
|
+
*/
|
|
113
|
+
async function adjudicatePermission(target, event, instanceId) {
|
|
114
|
+
const pending = (0, payloads_1.toOpencodeV2PendingPermission)(event.raw, event.receivedAt);
|
|
115
|
+
if (!pending) {
|
|
116
|
+
logger.info('opencode-v2-permission-unparsed', { worktreeId: target.worktreeId, instanceId });
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
const outcome = await (0, permission_adjudication_1.adjudicatePendingPermission)(source_1.opencodeV2AgentEventSource, target, pending, source_1.opencodeV2AgentEventSource.parsePermissionRequest(event.raw));
|
|
120
|
+
logger.info('opencode-v2-permission-decided', {
|
|
121
|
+
worktreeId: target.worktreeId,
|
|
122
|
+
instanceId,
|
|
123
|
+
decisionId: pending.id,
|
|
124
|
+
behavior: outcome.behavior,
|
|
125
|
+
reason: outcome.reason,
|
|
126
|
+
delivered: outcome.delivered,
|
|
127
|
+
settled: outcome.settled,
|
|
128
|
+
});
|
|
129
|
+
return outcome.settled;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The question a `form.created` frame opened, with its choices (Issue #2945 D2).
|
|
133
|
+
*
|
|
134
|
+
* The form is read off the frame — 2.0.18 sends the whole form as
|
|
135
|
+
* `data.form` (measured for this Issue) — and, when a frame arrives without
|
|
136
|
+
* it, from `GET /api/session/{id}/form`, the call Phase 0 answered it with.
|
|
137
|
+
*/
|
|
138
|
+
async function readQuestion(target, event, loadForm) {
|
|
139
|
+
const fromFrame = (0, payloads_1.parseOpencodeV2Form)(event.raw);
|
|
140
|
+
if (fromFrame)
|
|
141
|
+
return fromFrame;
|
|
142
|
+
const formId = (0, mappers_1.frameDecisionId)(event.raw);
|
|
143
|
+
const sessionId = (0, mappers_1.frameSessionId)(event.raw);
|
|
144
|
+
if (formId === null || sessionId === null)
|
|
145
|
+
return null;
|
|
146
|
+
const form = await loadForm(target, sessionId, formId);
|
|
147
|
+
return form ? (0, payloads_1.parseOpencodeV2Form)(form) : null;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Record one mapped event for the instance it arrived on.
|
|
151
|
+
*
|
|
152
|
+
* @param target - The instance whose server produced the event
|
|
153
|
+
* @param event - The normalized event
|
|
154
|
+
* @param stopEffect - What a `stop` runs after being recorded (tests replace it)
|
|
155
|
+
* @param loadForm - How a question's form is read (tests replace it)
|
|
156
|
+
*/
|
|
157
|
+
async function ingestOpencodeV2Event(target, event, stopEffect = applyStop, loadForm = loadFormFromServer) {
|
|
158
|
+
const instanceId = target.instanceId ?? tool_id_1.OPENCODE_V2_CLI_TOOL_ID;
|
|
159
|
+
try {
|
|
160
|
+
const delivery = (0, agent_event_state_1.classifyAgentEventDelivery)({
|
|
161
|
+
worktreeId: target.worktreeId,
|
|
162
|
+
cliToolId: tool_id_1.OPENCODE_V2_CLI_TOOL_ID,
|
|
163
|
+
instanceId,
|
|
164
|
+
event: event.event,
|
|
165
|
+
detail: event.detail,
|
|
166
|
+
sessionId: event.conversationId,
|
|
167
|
+
at: event.receivedAt,
|
|
168
|
+
// Issue #2945: the decision id, so two approvals a second apart are two
|
|
169
|
+
// approvals — not one and a repeat inside the time window.
|
|
170
|
+
identity: source_1.opencodeV2AgentEventSource.eventIdentityOf(event.raw),
|
|
171
|
+
identityKind: source_1.opencodeV2AgentEventSource.capabilities.eventIdentity,
|
|
172
|
+
});
|
|
173
|
+
if (delivery.duplicate) {
|
|
174
|
+
logger.info('opencode-v2-event-duplicate-dropped', {
|
|
175
|
+
worktreeId: target.worktreeId,
|
|
176
|
+
instanceId,
|
|
177
|
+
event: event.event,
|
|
178
|
+
detail: event.detail,
|
|
179
|
+
by: delivery.by,
|
|
180
|
+
});
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const record = {
|
|
184
|
+
event: event.event,
|
|
185
|
+
at: event.receivedAt,
|
|
186
|
+
detail: event.detail?.slice(0, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH) ?? null,
|
|
187
|
+
sessionId: event.conversationId,
|
|
188
|
+
message: null,
|
|
189
|
+
model: event.model,
|
|
190
|
+
};
|
|
191
|
+
const options = { sessionStartMayArriveLate: false };
|
|
192
|
+
if (event.event === 'notification' && event.detail === mappers_1.OPENCODE_V2_PERMISSION_DETAIL) {
|
|
193
|
+
record.decisionId = (0, mappers_1.frameDecisionId)(event.raw);
|
|
194
|
+
const subject = (0, payloads_1.readOpencodeV2PermissionSubject)(event.raw);
|
|
195
|
+
record.toolName = subject?.toolName ?? (0, mappers_1.framePermissionAction)(event.raw);
|
|
196
|
+
record.decisionPatterns = subject?.patterns ?? null;
|
|
197
|
+
// D1: the diff is what the card shows, carried as the record's message.
|
|
198
|
+
record.message =
|
|
199
|
+
(0, payloads_1.describeOpencodeV2Permission)(event.raw)?.slice(0, structured_prompt_1.MAX_STRUCTURED_PROMPT_MESSAGE_LENGTH) ??
|
|
200
|
+
null;
|
|
201
|
+
// D3: the verdict leaves BEFORE the record is written (v1's #1898 order).
|
|
202
|
+
record.promptSettled = await adjudicatePermission(target, event, instanceId);
|
|
203
|
+
(0, agent_event_state_1.recordAgentEvent)(target.worktreeId, tool_id_1.OPENCODE_V2_CLI_TOOL_ID, instanceId, record, options);
|
|
204
|
+
}
|
|
205
|
+
else if (event.event === 'notification' &&
|
|
206
|
+
event.detail === mappers_1.OPENCODE_V2_DECISION_SETTLED_DETAIL) {
|
|
207
|
+
record.decisionId = (0, mappers_1.frameDecisionId)(event.raw);
|
|
208
|
+
record.promptSettled = true;
|
|
209
|
+
(0, agent_event_state_1.recordAgentEvent)(target.worktreeId, tool_id_1.OPENCODE_V2_CLI_TOOL_ID, instanceId, record, options);
|
|
210
|
+
}
|
|
211
|
+
else if (event.event === 'notification' && event.detail === mappers_1.OPENCODE_V2_QUESTION_DETAIL) {
|
|
212
|
+
const spec = await readQuestion(target, event, loadForm);
|
|
213
|
+
record.message =
|
|
214
|
+
spec?.questions[0]?.question.slice(0, structured_prompt_1.MAX_STRUCTURED_PROMPT_MESSAGE_LENGTH) ?? null;
|
|
215
|
+
(0, agent_event_state_1.recordAgentEvent)(target.worktreeId, tool_id_1.OPENCODE_V2_CLI_TOOL_ID, instanceId, record, options);
|
|
216
|
+
// D2: the choices, for the panel's picker and `capture --prompts`. A form
|
|
217
|
+
// no surface can offer choices for still opens the wait below, and the
|
|
218
|
+
// human answers it in the TUI.
|
|
219
|
+
if (spec) {
|
|
220
|
+
(0, agent_event_state_1.recordAskUserQuestion)(target.worktreeId, tool_id_1.OPENCODE_V2_CLI_TOOL_ID, instanceId, spec, event.receivedAt);
|
|
221
|
+
}
|
|
222
|
+
(0, agent_event_state_1.reportQuestionPending)(target.worktreeId, tool_id_1.OPENCODE_V2_CLI_TOOL_ID, instanceId, {
|
|
223
|
+
toolName: pending_decision_kind_1.OPENCODE_QUESTION_TOOL_NAME,
|
|
224
|
+
decisionId: (0, mappers_1.frameDecisionId)(event.raw),
|
|
225
|
+
detail: mappers_1.OPENCODE_V2_QUESTION_DETAIL,
|
|
226
|
+
}, event.receivedAt);
|
|
227
|
+
logger.info('opencode-v2-question-recorded', {
|
|
228
|
+
worktreeId: target.worktreeId,
|
|
229
|
+
instanceId,
|
|
230
|
+
decisionId: (0, mappers_1.frameDecisionId)(event.raw),
|
|
231
|
+
parsed: spec !== null,
|
|
232
|
+
questionCount: spec?.questions.length ?? 0,
|
|
233
|
+
});
|
|
234
|
+
// After the record, for v1's reason (#2045): the notification must not
|
|
235
|
+
// describe a wait the rest of the process has not been told about yet.
|
|
236
|
+
await (0, push_1.notifyOpencodeQuestionPush)(target, instanceId, record.message, event.receivedAt);
|
|
237
|
+
}
|
|
238
|
+
else if (event.event === 'stop') {
|
|
239
|
+
if (event.detail === mappers_1.OPENCODE_V2_FAILED_DETAIL) {
|
|
240
|
+
record.message =
|
|
241
|
+
(0, mappers_1.frameFailureMessage)(event.raw)?.slice(0, structured_prompt_1.MAX_STRUCTURED_PROMPT_MESSAGE_LENGTH) ?? null;
|
|
242
|
+
logger.error('opencode-v2-turn-failed', {
|
|
243
|
+
worktreeId: target.worktreeId,
|
|
244
|
+
instanceId,
|
|
245
|
+
sessionId: event.conversationId,
|
|
246
|
+
message: record.message,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
(0, agent_event_state_1.recordAgentEvent)(target.worktreeId, tool_id_1.OPENCODE_V2_CLI_TOOL_ID, instanceId, record, options);
|
|
250
|
+
await stopEffect(target, instanceId);
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
(0, agent_event_state_1.recordAgentEvent)(target.worktreeId, tool_id_1.OPENCODE_V2_CLI_TOOL_ID, instanceId, record, options);
|
|
254
|
+
}
|
|
255
|
+
logger.info('opencode-v2-event-received', {
|
|
256
|
+
worktreeId: target.worktreeId,
|
|
257
|
+
instanceId,
|
|
258
|
+
type: (0, mappers_1.frameType)(event.raw),
|
|
259
|
+
event: event.event,
|
|
260
|
+
detail: event.detail,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
logger.error('opencode-v2-event-ingest-failed', {
|
|
265
|
+
worktreeId: target.worktreeId,
|
|
266
|
+
instanceId,
|
|
267
|
+
event: event.event,
|
|
268
|
+
error: error instanceof Error ? error.message : String(error),
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenCode V2's SSE vocabulary, mapped onto CommandMate's agent events
|
|
4
|
+
* (Issue #2934, decision D5).
|
|
5
|
+
*
|
|
6
|
+
* The envelope, measured on 2.0.18 (#2370 Phase 0):
|
|
7
|
+
* `{id, created?, type, location?, data, durable?}`. `location.directory` is
|
|
8
|
+
* present on some events and absent on others (`session.execution.succeeded`
|
|
9
|
+
* carries `durable` instead), so nothing here reads it: one instance owns one
|
|
10
|
+
* server, and every frame on that server's stream is that instance's.
|
|
11
|
+
*
|
|
12
|
+
* Phase 1 mapped the turn boundaries and the two kinds of "the agent is waiting
|
|
13
|
+
* for a human":
|
|
14
|
+
*
|
|
15
|
+
* | OpenCode V2 event | agent event |
|
|
16
|
+
* |-------------------------------------------------|--------------------------------------|
|
|
17
|
+
* | `session.execution.started` | `user_prompt_submit` → running |
|
|
18
|
+
* | `session.execution.succeeded` / `interrupted` | `stop` → ready |
|
|
19
|
+
* | `session.execution.failed` | `stop` (detail `error`) → ready |
|
|
20
|
+
* | `permission.asked` | `notification(permission_prompt)` |
|
|
21
|
+
* | `permission.replied` | `notification(permission_replied)` |
|
|
22
|
+
* | `form.created` | `notification(question_prompt)` |
|
|
23
|
+
* | `form.replied` / `form.cancelled` | `notification(permission_replied)` |
|
|
24
|
+
*
|
|
25
|
+
* Every other type is dropped before it reaches the normalizer
|
|
26
|
+
* ({@link isHandledOpencodeV2EventType}), so the unknown-event tally does not
|
|
27
|
+
* fill up with `session.reasoning.delta` and friends.
|
|
28
|
+
*
|
|
29
|
+
* `form.replied` / `form.cancelled` reuse `permission_replied` on purpose: that
|
|
30
|
+
* detail is the agent-event state's one "this decision is settled, retire it by
|
|
31
|
+
* id" signal, and a question is a decision exactly as an approval is.
|
|
32
|
+
*
|
|
33
|
+
* @module lib/hooks/sources/opencode-v2/mappers
|
|
34
|
+
*/
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.OPENCODE_V2_MAPPERS = exports.OPENCODE_V2_HANDLED_EVENT_TYPES = exports.OPENCODE_V2_FAILED_DETAIL = exports.OPENCODE_V2_DECISION_SETTLED_DETAIL = exports.OPENCODE_V2_QUESTION_DETAIL = exports.OPENCODE_V2_PERMISSION_DETAIL = void 0;
|
|
37
|
+
exports.isHandledOpencodeV2EventType = isHandledOpencodeV2EventType;
|
|
38
|
+
exports.frameType = frameType;
|
|
39
|
+
exports.frameData = frameData;
|
|
40
|
+
exports.frameSessionId = frameSessionId;
|
|
41
|
+
exports.frameDecisionId = frameDecisionId;
|
|
42
|
+
exports.opencodeV2EventIdentity = opencodeV2EventIdentity;
|
|
43
|
+
exports.framePermissionAction = framePermissionAction;
|
|
44
|
+
exports.frameFailureMessage = frameFailureMessage;
|
|
45
|
+
const agent_event_types_1 = require("../../../../lib/hooks/agent-event-types");
|
|
46
|
+
const event_mapper_1 = require("../event-mapper");
|
|
47
|
+
/** `notification` detail of an approval request. */
|
|
48
|
+
exports.OPENCODE_V2_PERMISSION_DETAIL = 'permission_prompt';
|
|
49
|
+
/** `notification` detail of a question (a `form`). */
|
|
50
|
+
exports.OPENCODE_V2_QUESTION_DETAIL = 'question_prompt';
|
|
51
|
+
/** `notification` detail that retires a decision — approval or question. */
|
|
52
|
+
exports.OPENCODE_V2_DECISION_SETTLED_DETAIL = agent_event_types_1.PERMISSION_REPLIED_DETAIL;
|
|
53
|
+
/** `stop` detail of a turn that ended in `session.execution.failed`. */
|
|
54
|
+
exports.OPENCODE_V2_FAILED_DETAIL = 'error';
|
|
55
|
+
/** The event types Phase 1 reads. Anything else is ignored. */
|
|
56
|
+
exports.OPENCODE_V2_HANDLED_EVENT_TYPES = [
|
|
57
|
+
'session.execution.started',
|
|
58
|
+
'session.execution.succeeded',
|
|
59
|
+
'session.execution.failed',
|
|
60
|
+
'session.execution.interrupted',
|
|
61
|
+
'permission.asked',
|
|
62
|
+
'permission.replied',
|
|
63
|
+
'form.created',
|
|
64
|
+
'form.replied',
|
|
65
|
+
'form.cancelled',
|
|
66
|
+
];
|
|
67
|
+
/** Whether a frame's `type` is one {@link OPENCODE_V2_MAPPERS} maps. */
|
|
68
|
+
function isHandledOpencodeV2EventType(type) {
|
|
69
|
+
return type !== null && exports.OPENCODE_V2_HANDLED_EVENT_TYPES.includes(type);
|
|
70
|
+
}
|
|
71
|
+
/** The frame's `type`, or null. */
|
|
72
|
+
function frameType(payload) {
|
|
73
|
+
return (0, event_mapper_1.readNestedString)(payload, ['type']);
|
|
74
|
+
}
|
|
75
|
+
/** The frame's `data` object (empty when absent). */
|
|
76
|
+
function frameData(payload) {
|
|
77
|
+
return (0, event_mapper_1.isPlainObject)(payload.data) ? payload.data : {};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The OpenCode session a frame belongs to.
|
|
81
|
+
*
|
|
82
|
+
* `data.sessionID` where the event carries it; otherwise the durable
|
|
83
|
+
* aggregate id (`durable.aggregateID`), which for the `session.*` events is the
|
|
84
|
+
* session. Used as the turn's conversation id, never for routing.
|
|
85
|
+
*/
|
|
86
|
+
function frameSessionId(payload) {
|
|
87
|
+
return ((0, event_mapper_1.readNestedString)(frameData(payload), ['sessionID']) ??
|
|
88
|
+
// Issue #2945: `form.created` nests the form — `data.form.sessionID`
|
|
89
|
+
// (measured on 2.0.18).
|
|
90
|
+
(0, event_mapper_1.readNestedString)(frameData(payload), ['form', 'sessionID']) ??
|
|
91
|
+
(0, event_mapper_1.readNestedString)(payload, ['durable', 'aggregateID']));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The id of the decision a frame opens or settles.
|
|
95
|
+
*
|
|
96
|
+
* `permission.asked` carries it as `data.id` (`per_…`), `form.created` as
|
|
97
|
+
* `data.form.id` (`frm_…`, the form is nested — measured, Issue #2945);
|
|
98
|
+
* `permission.replied` names it `data.requestID`; the form replies carry
|
|
99
|
+
* `data.id` and are read under the other spellings too.
|
|
100
|
+
*/
|
|
101
|
+
function frameDecisionId(payload) {
|
|
102
|
+
const data = frameData(payload);
|
|
103
|
+
switch (frameType(payload)) {
|
|
104
|
+
case 'permission.asked':
|
|
105
|
+
return (0, event_mapper_1.readNestedString)(data, ['id']);
|
|
106
|
+
case 'form.created':
|
|
107
|
+
// Measured on 2.0.18 (Issue #2945): the form is nested,
|
|
108
|
+
// `data.form.id`. `data.id` is read as well, for a frame that is not.
|
|
109
|
+
return (0, event_mapper_1.readNestedString)(data, ['form', 'id']) ?? (0, event_mapper_1.readNestedString)(data, ['id']);
|
|
110
|
+
case 'permission.replied':
|
|
111
|
+
return (0, event_mapper_1.readNestedString)(data, ['requestID']) ?? (0, event_mapper_1.readNestedString)(data, ['id']);
|
|
112
|
+
case 'form.replied':
|
|
113
|
+
case 'form.cancelled':
|
|
114
|
+
return ((0, event_mapper_1.readNestedString)(data, ['formID']) ??
|
|
115
|
+
(0, event_mapper_1.readNestedString)(data, ['id']) ??
|
|
116
|
+
(0, event_mapper_1.readNestedString)(data, ['requestID']));
|
|
117
|
+
default:
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The frame's own identity, for de-duplication (Issue #2945,
|
|
123
|
+
* `eventIdentity: 'permission-id'`).
|
|
124
|
+
*
|
|
125
|
+
* The decision id ({@link frameDecisionId}) — the `per_…` / `frm_…` the reply
|
|
126
|
+
* URL takes. An approval and the reply that settles it carry the SAME id, which
|
|
127
|
+
* is why `classifyAgentEventDelivery` keys on `(event, detail, identity)`
|
|
128
|
+
* rather than on the id alone. Every other frame (the `session.execution.*`
|
|
129
|
+
* boundaries) answers null and keeps the time window, as v1's `session.idle`
|
|
130
|
+
* does. The envelope's `evt_…` is not used, for v1's reason: nothing measured
|
|
131
|
+
* says it is unique per frame.
|
|
132
|
+
*/
|
|
133
|
+
function opencodeV2EventIdentity(payload) {
|
|
134
|
+
return (0, event_mapper_1.readEventIdentity)(frameDecisionId(payload));
|
|
135
|
+
}
|
|
136
|
+
/** The action an approval is for (`edit`, `shell`, …), or null. */
|
|
137
|
+
function framePermissionAction(payload) {
|
|
138
|
+
return (0, event_mapper_1.readNestedString)(frameData(payload), ['action']);
|
|
139
|
+
}
|
|
140
|
+
/** A human-readable reason a failed turn gives, or null. */
|
|
141
|
+
function frameFailureMessage(payload) {
|
|
142
|
+
const data = frameData(payload);
|
|
143
|
+
return ((0, event_mapper_1.readNestedString)(data, ['error', 'message']) ??
|
|
144
|
+
(0, event_mapper_1.readNestedString)(data, ['error', 'data', 'message']) ??
|
|
145
|
+
(0, event_mapper_1.readNestedString)(data, ['error', 'name']) ??
|
|
146
|
+
(0, event_mapper_1.readNestedString)(data, ['message']));
|
|
147
|
+
}
|
|
148
|
+
const OPENCODE_V2_BASE_MAPPERS = [
|
|
149
|
+
(0, event_mapper_1.whenNamed)('session.execution.started', 'user_prompt_submit'),
|
|
150
|
+
(0, event_mapper_1.whenNamed)('session.execution.succeeded', 'stop'),
|
|
151
|
+
(0, event_mapper_1.whenNamed)('session.execution.interrupted', 'stop'),
|
|
152
|
+
(0, event_mapper_1.whenNamed)('session.execution.failed', 'stop', exports.OPENCODE_V2_FAILED_DETAIL),
|
|
153
|
+
(0, event_mapper_1.whenNamed)('permission.asked', 'notification', exports.OPENCODE_V2_PERMISSION_DETAIL),
|
|
154
|
+
(0, event_mapper_1.whenNamed)('permission.replied', 'notification', exports.OPENCODE_V2_DECISION_SETTLED_DETAIL),
|
|
155
|
+
(0, event_mapper_1.whenNamed)('form.created', 'notification', exports.OPENCODE_V2_QUESTION_DETAIL),
|
|
156
|
+
(0, event_mapper_1.whenNamed)('form.replied', 'notification', exports.OPENCODE_V2_DECISION_SETTLED_DETAIL),
|
|
157
|
+
(0, event_mapper_1.whenNamed)('form.cancelled', 'notification', exports.OPENCODE_V2_DECISION_SETTLED_DETAIL),
|
|
158
|
+
];
|
|
159
|
+
/** The mappers, each stamping the frame's session as the conversation id. */
|
|
160
|
+
exports.OPENCODE_V2_MAPPERS = OPENCODE_V2_BASE_MAPPERS.map((mapper) => (type, payload) => {
|
|
161
|
+
const mapped = mapper(type, payload);
|
|
162
|
+
if (!mapped)
|
|
163
|
+
return null;
|
|
164
|
+
return { ...mapped, conversationId: mapped.conversationId ?? frameSessionId(payload) };
|
|
165
|
+
});
|