commandmate 0.42.2 → 0.44.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 +176 -176
- package/.next/app-path-routes-manifest.json +34 -34
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +15 -15
- 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.js.nft.json +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js.nft.json +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.js +2 -2
- package/.next/server/app/api/app/update/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +7 -7
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +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 +103 -1
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +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.nft.json +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 +103 -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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js.nft.json +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.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +34 -34
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1501.js +3 -3
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/22.js +1 -1
- package/.next/server/chunks/2283.js +15 -0
- 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/4802.js +1 -1
- package/.next/server/chunks/488.js +1 -0
- package/.next/server/chunks/5064.js +1 -1
- package/.next/server/chunks/5326.js +1 -1
- package/.next/server/chunks/5456.js +1 -1
- package/.next/server/chunks/5571.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/6401.js +1 -1
- package/.next/server/chunks/6474.js +14 -0
- package/.next/server/chunks/650.js +1 -1
- 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/6927.js +1 -0
- package/.next/server/chunks/7491.js +3 -0
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8543.js +1 -1
- package/.next/server/chunks/8581.js +2 -2
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -0
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8800.js +4 -3
- package/.next/server/chunks/8918.js +108 -6
- package/.next/server/chunks/9130.js +3 -3
- package/.next/server/chunks/{8052.js → 9353.js} +4 -2
- package/.next/server/chunks/9390.js +3 -0
- package/.next/server/chunks/9627.js +3 -3
- package/.next/server/chunks/967.js +1 -0
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js +2 -2
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/2053-85a974ddfe7498fe.js +1 -0
- package/.next/static/chunks/{2407-6b9e12c099fa598c.js → 2407-340774f1a24f2b45.js} +1 -1
- package/.next/static/chunks/5449-6cb80bab2bd06b79.js +1 -0
- package/.next/static/chunks/5521-c358c31f60e5e689.js +1 -0
- package/.next/static/chunks/591-0a45801e83f26f24.js +1 -0
- package/.next/static/chunks/8165-3853772f6ae1299b.js +1 -0
- package/.next/static/chunks/{8566-a6a7c70558927410.js → 8566-aeda747542072ace.js} +1 -1
- package/.next/static/chunks/8811-29eaa24237f48558.js +1 -0
- package/.next/static/chunks/{9619-22adf5367c4b7080.js → 9619-84aced0846cbe3ac.js} +1 -1
- package/.next/static/chunks/app/{layout-5b95e1236dcd9ef6.js → layout-0fc249fb7de75a27.js} +1 -1
- package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +1 -0
- package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-9ee7a381636e60cb.js +1 -0
- package/.next/static/chunks/app/skills/page-182e16168b2fc098.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +1 -0
- package/.next/static/css/38070d879efa1371.css +1 -0
- package/.next/trace +13 -13
- package/README.md +58 -620
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +23 -149
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +11 -1
- package/dist/cli/commands/docs.d.ts.map +1 -1
- package/dist/cli/commands/docs.js +5 -0
- package/dist/cli/commands/remote.d.ts +24 -1
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +155 -6
- 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/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +255 -112
- package/dist/cli/commands/stop.d.ts.map +1 -1
- package/dist/cli/commands/stop.js +53 -1
- package/dist/cli/commands/sync.js +3 -3
- 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/docs/setup-guide.d.ts +14 -0
- package/dist/cli/docs/setup-guide.d.ts.map +1 -0
- package/dist/cli/docs/setup-guide.js +366 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +4 -0
- package/dist/cli/types/api-responses.d.ts +11 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +2 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/daemon.d.ts +42 -2
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +222 -40
- package/dist/cli/utils/docs-reader.d.ts +6 -0
- package/dist/cli/utils/docs-reader.d.ts.map +1 -1
- package/dist/cli/utils/docs-reader.js +14 -13
- package/dist/cli/utils/npm-runner.d.ts +12 -0
- package/dist/cli/utils/npm-runner.d.ts.map +1 -1
- package/dist/cli/utils/npm-runner.js +36 -0
- package/dist/cli/utils/process-inspect.d.ts +55 -0
- package/dist/cli/utils/process-inspect.d.ts.map +1 -0
- package/dist/cli/utils/process-inspect.js +214 -0
- package/dist/cli/utils/remote-pairing.d.ts +68 -0
- package/dist/cli/utils/remote-pairing.d.ts.map +1 -0
- package/dist/cli/utils/remote-pairing.js +117 -0
- package/dist/cli/utils/reply-ledger.d.ts +95 -0
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -0
- package/dist/cli/utils/reply-ledger.js +187 -0
- package/dist/cli/utils/server-identity.d.ts +50 -0
- package/dist/cli/utils/server-identity.d.ts.map +1 -0
- package/dist/cli/utils/server-identity.js +118 -0
- package/dist/cli/utils/server-ready.d.ts +13 -0
- package/dist/cli/utils/server-ready.d.ts.map +1 -1
- package/dist/cli/utils/server-ready.js +16 -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/security/pairing-code.d.ts +2 -1
- package/dist/lib/security/pairing-code.d.ts.map +1 -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 +72 -20
- package/dist/server/locales/ja/worktree.json +72 -20
- 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/image-extensions.js +1 -0
- package/dist/server/src/config/schedule-config.js +55 -1
- package/dist/server/src/lib/auto-yes-poller.js +69 -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-plan-review.js +175 -0
- package/dist/server/src/lib/cli-tools/command-code.js +81 -2
- package/dist/server/src/lib/cli-tools/composer-spec.js +10 -0
- package/dist/server/src/lib/cli-tools/copilot-executable.js +21 -5
- package/dist/server/src/lib/cli-tools/graceful-exit.js +15 -1
- package/dist/server/src/lib/cli-tools/index.js +3 -1
- package/dist/server/src/lib/cli-tools/install-hints.js +9 -3
- package/dist/server/src/lib/cli-tools/liveness-spec.js +19 -0
- package/dist/server/src/lib/cli-tools/manager.js +2 -0
- package/dist/server/src/lib/cli-tools/opencode-executable.js +179 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +369 -0
- package/dist/server/src/lib/cli-tools/opencode.js +29 -5
- package/dist/server/src/lib/cli-tools/types.js +5 -1
- package/dist/server/src/lib/cmate-cli-tool-parser.js +65 -7
- package/dist/server/src/lib/cmate-parser.js +12 -0
- package/dist/server/src/lib/cmate-validator.js +13 -1
- package/dist/server/src/lib/detection/cli-patterns.js +172 -3
- 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/codex/detect.js +26 -0
- package/dist/server/src/lib/detection/tools/command-code/plan-review-state.js +75 -0
- 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/claude/transcript.js +33 -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 +186 -12
- package/dist/server/src/lib/session/claude-session.js +131 -15
- 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/session-start-error.js +20 -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/agent-state-paths.js +39 -0
- package/dist/server/src/lib/skills/compatibility-matrix.js +65 -0
- package/dist/server/src/lib/skills/receipt-owned-paths.js +118 -0
- package/dist/server/src/lib/tmux/tmux.js +73 -2
- package/dist/server/src/lib/verification/env-clean-gate.js +281 -10
- package/dist/server/src/lib/verification/gate-runner.js +29 -2
- package/dist/server/src/lib/verification/scope-gate.js +58 -4
- 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/docs/en/architecture.md +722 -0
- package/docs/en/user-guide/agents-guide.md +306 -0
- package/docs/en/user-guide/cli-setup-guide.md +676 -0
- package/docs/en/user-guide/cmate-schedules-guide.md +388 -0
- package/docs/en/user-guide/commands-guide.md +467 -0
- package/docs/en/user-guide/quick-start.md +231 -0
- package/docs/en/user-guide/webapp-guide.md +1020 -0
- package/docs/en/user-guide/workflow-examples.md +463 -0
- package/package.json +19 -7
- package/release-notes/0.43.0.json +130 -0
- package/release-notes/0.44.0.json +82 -0
- package/scripts/hooks/cmate-agent-event.sh +14 -0
- package/scripts/opencode-v2/launch.sh +226 -0
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/3707.js +0 -15
- package/.next/server/chunks/4443.js +0 -3
- package/.next/server/chunks/5164.js +0 -1
- package/.next/server/chunks/5742.js +0 -1
- package/.next/server/chunks/7004.js +0 -1
- package/.next/server/chunks/8673.js +0 -14
- package/.next/static/chunks/2039-117a361f795ddc4b.js +0 -1
- package/.next/static/chunks/2053-611dd27d42721b79.js +0 -1
- package/.next/static/chunks/3778-56f41fc2cecb8c43.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/sessions/page-1a8ba152bbcb9efb.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-ab7e432b69fccb3b.js +0 -1
- package/.next/static/chunks/app/skills/page-56b4fa11223e0cbd.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-59f5337e031518c6.js +0 -1
- package/.next/static/css/b3f433d52b8ed5c8.css +0 -1
- /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → wu7SUiHTirFcrpo5teyZ3}/_buildManifest.js +0 -0
- /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → wu7SUiHTirFcrpo5teyZ3}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Best-effort process inspection for stop/start (Issue #3087)
|
|
4
|
+
*
|
|
5
|
+
* - Zombies: `kill(pid, 0)` succeeds for a zombie, so without an init process
|
|
6
|
+
* (a container whose PID 1 never reaps) a stopped server's group looked alive
|
|
7
|
+
* forever. On Linux, /proc tells a zombie apart; elsewhere nothing is known
|
|
8
|
+
* and callers keep their signal-based answer.
|
|
9
|
+
* - Listeners: when something answers on the configured port but is not the
|
|
10
|
+
* server the PID file describes, the user is told which PID holds it.
|
|
11
|
+
*
|
|
12
|
+
* Every function here is read-only and never throws.
|
|
13
|
+
*
|
|
14
|
+
* @module process-inspect
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.parseProcStat = parseProcStat;
|
|
18
|
+
exports.isZombieProcess = isZombieProcess;
|
|
19
|
+
exports.listProcessGroupStates = listProcessGroupStates;
|
|
20
|
+
exports.isExitedState = isExitedState;
|
|
21
|
+
exports.findListeningPids = findListeningPids;
|
|
22
|
+
exports.describeProcess = describeProcess;
|
|
23
|
+
exports.describeListeners = describeListeners;
|
|
24
|
+
const child_process_1 = require("child_process");
|
|
25
|
+
const fs_1 = require("fs");
|
|
26
|
+
/** Process states that are no longer running code: zombie and dead. */
|
|
27
|
+
const EXITED_STATES = new Set(['Z', 'X', 'x']);
|
|
28
|
+
/**
|
|
29
|
+
* Parse `/proc/<pid>/stat`. The command name is parenthesised and may itself
|
|
30
|
+
* contain spaces or parentheses, so fields are read after the LAST `)`.
|
|
31
|
+
*/
|
|
32
|
+
function parseProcStat(content) {
|
|
33
|
+
const end = content.lastIndexOf(')');
|
|
34
|
+
if (end === -1)
|
|
35
|
+
return null;
|
|
36
|
+
const fields = content.slice(end + 1).trim().split(/\s+/);
|
|
37
|
+
// fields[0] = state, fields[1] = ppid, fields[2] = pgrp
|
|
38
|
+
const pgrp = parseInt(fields[2] ?? '', 10);
|
|
39
|
+
if (!fields[0] || Number.isNaN(pgrp))
|
|
40
|
+
return null;
|
|
41
|
+
return { state: fields[0], pgrp };
|
|
42
|
+
}
|
|
43
|
+
function readProcStat(pid) {
|
|
44
|
+
try {
|
|
45
|
+
return parseProcStat((0, fs_1.readFileSync)(`/proc/${pid}/stat`, 'utf-8'));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @returns true when /proc reports the process as a zombie (or dead); false when it is
|
|
53
|
+
* running, absent, or the platform has no /proc
|
|
54
|
+
*/
|
|
55
|
+
function isZombieProcess(pid) {
|
|
56
|
+
if (process.platform !== 'linux')
|
|
57
|
+
return false;
|
|
58
|
+
const stat = readProcStat(pid);
|
|
59
|
+
return stat !== null && EXITED_STATES.has(stat.state);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* States of every process whose process group is `pgid`.
|
|
63
|
+
*
|
|
64
|
+
* @returns the state letters (possibly empty), or null when /proc cannot be read
|
|
65
|
+
* (non-Linux), in which case nothing is known
|
|
66
|
+
*/
|
|
67
|
+
function listProcessGroupStates(pgid) {
|
|
68
|
+
if (process.platform !== 'linux')
|
|
69
|
+
return null;
|
|
70
|
+
let entries;
|
|
71
|
+
try {
|
|
72
|
+
entries = (0, fs_1.readdirSync)('/proc');
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
if (!Array.isArray(entries))
|
|
78
|
+
return null;
|
|
79
|
+
const states = [];
|
|
80
|
+
for (const entry of entries) {
|
|
81
|
+
if (!/^\d+$/.test(entry))
|
|
82
|
+
continue;
|
|
83
|
+
const stat = readProcStat(parseInt(entry, 10));
|
|
84
|
+
if (stat !== null && stat.pgrp === pgid) {
|
|
85
|
+
states.push(stat.state);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return states;
|
|
89
|
+
}
|
|
90
|
+
/** @returns true when a /proc state letter means the process no longer runs */
|
|
91
|
+
function isExitedState(state) {
|
|
92
|
+
return EXITED_STATES.has(state);
|
|
93
|
+
}
|
|
94
|
+
/** Socket inodes listening on `port` per /proc/net/tcp{,6} (state 0A = LISTEN). */
|
|
95
|
+
function listeningInodes(port) {
|
|
96
|
+
const inodes = new Set();
|
|
97
|
+
const hexPort = port.toString(16).toUpperCase().padStart(4, '0');
|
|
98
|
+
for (const table of ['/proc/net/tcp', '/proc/net/tcp6']) {
|
|
99
|
+
let content;
|
|
100
|
+
try {
|
|
101
|
+
content = (0, fs_1.readFileSync)(table, 'utf-8');
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
for (const line of String(content).split('\n').slice(1)) {
|
|
107
|
+
const fields = line.trim().split(/\s+/);
|
|
108
|
+
// sl local_address rem_address st tx:rx tr:when retrnsmt uid timeout inode
|
|
109
|
+
if (fields.length < 10)
|
|
110
|
+
continue;
|
|
111
|
+
const localPort = fields[1].split(':')[1];
|
|
112
|
+
if (localPort === hexPort && fields[3] === '0A') {
|
|
113
|
+
inodes.add(fields[9]);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return inodes;
|
|
118
|
+
}
|
|
119
|
+
function findListeningPidsLinux(port) {
|
|
120
|
+
const inodes = listeningInodes(port);
|
|
121
|
+
if (inodes.size === 0)
|
|
122
|
+
return [];
|
|
123
|
+
const pids = [];
|
|
124
|
+
let entries;
|
|
125
|
+
try {
|
|
126
|
+
entries = (0, fs_1.readdirSync)('/proc');
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
for (const entry of entries) {
|
|
132
|
+
if (!/^\d+$/.test(entry))
|
|
133
|
+
continue;
|
|
134
|
+
let fds;
|
|
135
|
+
try {
|
|
136
|
+
fds = (0, fs_1.readdirSync)(`/proc/${entry}/fd`);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
continue; // not ours to read, or gone
|
|
140
|
+
}
|
|
141
|
+
for (const fd of fds) {
|
|
142
|
+
let target;
|
|
143
|
+
try {
|
|
144
|
+
target = (0, fs_1.readlinkSync)(`/proc/${entry}/fd/${fd}`);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const match = /^socket:\[(\d+)\]$/.exec(target);
|
|
150
|
+
if (match && inodes.has(match[1])) {
|
|
151
|
+
pids.push(parseInt(entry, 10));
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return pids;
|
|
157
|
+
}
|
|
158
|
+
function findListeningPidsLsof(port) {
|
|
159
|
+
try {
|
|
160
|
+
const out = (0, child_process_1.execFileSync)('lsof', ['-nP', `-iTCP:${port}`, '-sTCP:LISTEN', '-t'], {
|
|
161
|
+
encoding: 'utf-8',
|
|
162
|
+
timeout: 3000,
|
|
163
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
164
|
+
});
|
|
165
|
+
return [...new Set(String(out).split('\n').map((l) => parseInt(l, 10)).filter((n) => !Number.isNaN(n)))];
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return []; // lsof exits 1 when nothing matches, or is not installed
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* PIDs listening on a TCP port: /proc on Linux, `lsof` elsewhere.
|
|
173
|
+
*
|
|
174
|
+
* @returns the PIDs found; empty when none are visible (another user's process, or no tool)
|
|
175
|
+
*/
|
|
176
|
+
function findListeningPids(port) {
|
|
177
|
+
return process.platform === 'linux' ? findListeningPidsLinux(port) : findListeningPidsLsof(port);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* One-line description of a process for an error message.
|
|
181
|
+
*
|
|
182
|
+
* @returns the command line, or null when it cannot be read
|
|
183
|
+
*/
|
|
184
|
+
function describeProcess(pid) {
|
|
185
|
+
try {
|
|
186
|
+
if (process.platform === 'linux') {
|
|
187
|
+
const cmdline = (0, fs_1.readFileSync)(`/proc/${pid}/cmdline`, 'utf-8').split('\0').filter(Boolean).join(' ');
|
|
188
|
+
return cmdline || null;
|
|
189
|
+
}
|
|
190
|
+
const out = (0, child_process_1.execFileSync)('ps', ['-o', 'command=', '-p', String(pid)], {
|
|
191
|
+
encoding: 'utf-8',
|
|
192
|
+
timeout: 3000,
|
|
193
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
194
|
+
}).trim();
|
|
195
|
+
return out || null;
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* "PID 875 (node dist/server/server.js), PID 876" — or null when no PID is visible.
|
|
203
|
+
*/
|
|
204
|
+
function describeListeners(port) {
|
|
205
|
+
const pids = findListeningPids(port);
|
|
206
|
+
if (pids.length === 0)
|
|
207
|
+
return null;
|
|
208
|
+
return pids
|
|
209
|
+
.map((pid) => {
|
|
210
|
+
const command = describeProcess(pid);
|
|
211
|
+
return command ? `PID ${pid} (${command.slice(0, 120)})` : `PID ${pid}`;
|
|
212
|
+
})
|
|
213
|
+
.join(', ');
|
|
214
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-issue the pairing code of a live `commandmate remote` session (Issue #3127).
|
|
3
|
+
*
|
|
4
|
+
* `remote up` shows the pairing link once, as a QR code, and keeps only the
|
|
5
|
+
* code's HASH on disk (`pairing-code.ts`). When that QR is lost — an agent's
|
|
6
|
+
* chat pane folds the output and cuts the QR off — the link cannot be shown
|
|
7
|
+
* again, because the plaintext code no longer exists anywhere. Before this
|
|
8
|
+
* module the only way back was `remote stop` + `remote`, which tears the
|
|
9
|
+
* Provider down and publishes a NEW URL.
|
|
10
|
+
*
|
|
11
|
+
* What this does instead: mint a fresh code and swap its hash into the
|
|
12
|
+
* existing handoff file, keeping the session token and the expiry. Nothing
|
|
13
|
+
* else changes — the server, the Provider and the public URL are untouched,
|
|
14
|
+
* and no new way in is created. The previous code stops working, because its
|
|
15
|
+
* hash is gone.
|
|
16
|
+
*
|
|
17
|
+
* ## Why the file is renamed away first
|
|
18
|
+
*
|
|
19
|
+
* The consumed flag is the ABSENCE of the handoff file: the server unlinks it
|
|
20
|
+
* on a successful pairing. A plain read-modify-write races with that — a
|
|
21
|
+
* pairing landing between our read and our write would see the file deleted,
|
|
22
|
+
* then recreated by us, and the already-paired session token would become
|
|
23
|
+
* pairable a second time. Renaming the file to a private name first is an
|
|
24
|
+
* atomic claim: if the rename fails with ENOENT the code was spent and we stop;
|
|
25
|
+
* if it succeeds the server can no longer consume it (it sees "absent", which
|
|
26
|
+
* answers 410 for the old code — the code we are about to replace anyway).
|
|
27
|
+
*
|
|
28
|
+
* ## Fail-closed
|
|
29
|
+
*
|
|
30
|
+
* Anything unreadable, malformed or already expired yields no code. A failure
|
|
31
|
+
* after the claim deletes the claimed file rather than guessing, so the worst
|
|
32
|
+
* case is "pairing is gone, run `remote stop` and `remote` again", never "a
|
|
33
|
+
* spent token is pairable again".
|
|
34
|
+
*/
|
|
35
|
+
/** Why no new code was issued. */
|
|
36
|
+
export type PairingReissueFailure =
|
|
37
|
+
/** The handoff file is absent: the code was used (or never written). */
|
|
38
|
+
'consumed'
|
|
39
|
+
/** The code's window has closed. */
|
|
40
|
+
| 'expired'
|
|
41
|
+
/** The file exists but could not be claimed or parsed. */
|
|
42
|
+
| 'unreadable'
|
|
43
|
+
/** Claimed, but the new code could not be written. The pairing is gone. */
|
|
44
|
+
| 'write-failed';
|
|
45
|
+
export type PairingReissueResult = {
|
|
46
|
+
ok: true;
|
|
47
|
+
/** Plaintext pairing code. Never persisted; the caller shows it and drops it. */
|
|
48
|
+
code: string;
|
|
49
|
+
/** Epoch ms, unchanged from the original code. */
|
|
50
|
+
expiresAt: number;
|
|
51
|
+
} | {
|
|
52
|
+
ok: false;
|
|
53
|
+
reason: PairingReissueFailure;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* @param filePath - Handoff file
|
|
57
|
+
* @returns The private name the file is claimed under while it is rewritten
|
|
58
|
+
*/
|
|
59
|
+
export declare function getReissueClaimPath(filePath: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Replace the pairing code of an unused handoff file with a fresh one.
|
|
62
|
+
*
|
|
63
|
+
* @param filePath - Absolute path of the handoff file (`state.pairing.filePath`)
|
|
64
|
+
* @param now - Epoch ms, injectable for tests
|
|
65
|
+
* @returns The new code and its (unchanged) expiry, or why there is none
|
|
66
|
+
*/
|
|
67
|
+
export declare function reissuePairingCode(filePath: string, now?: number): PairingReissueResult;
|
|
68
|
+
//# sourceMappingURL=remote-pairing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-pairing.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/remote-pairing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAYH,kCAAkC;AAClC,MAAM,MAAM,qBAAqB;AAC/B,wEAAwE;AACtE,UAAU;AACZ,oCAAoC;GAClC,SAAS;AACX,0DAA0D;GACxD,YAAY;AACd,2EAA2E;GACzE,cAAc,CAAC;AAEnB,MAAM,MAAM,oBAAoB,GAC5B;IACE,EAAE,EAAE,IAAI,CAAC;IACT,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AA+BD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,oBAAoB,CAmCnG"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Re-issue the pairing code of a live `commandmate remote` session (Issue #3127).
|
|
4
|
+
*
|
|
5
|
+
* `remote up` shows the pairing link once, as a QR code, and keeps only the
|
|
6
|
+
* code's HASH on disk (`pairing-code.ts`). When that QR is lost — an agent's
|
|
7
|
+
* chat pane folds the output and cuts the QR off — the link cannot be shown
|
|
8
|
+
* again, because the plaintext code no longer exists anywhere. Before this
|
|
9
|
+
* module the only way back was `remote stop` + `remote`, which tears the
|
|
10
|
+
* Provider down and publishes a NEW URL.
|
|
11
|
+
*
|
|
12
|
+
* What this does instead: mint a fresh code and swap its hash into the
|
|
13
|
+
* existing handoff file, keeping the session token and the expiry. Nothing
|
|
14
|
+
* else changes — the server, the Provider and the public URL are untouched,
|
|
15
|
+
* and no new way in is created. The previous code stops working, because its
|
|
16
|
+
* hash is gone.
|
|
17
|
+
*
|
|
18
|
+
* ## Why the file is renamed away first
|
|
19
|
+
*
|
|
20
|
+
* The consumed flag is the ABSENCE of the handoff file: the server unlinks it
|
|
21
|
+
* on a successful pairing. A plain read-modify-write races with that — a
|
|
22
|
+
* pairing landing between our read and our write would see the file deleted,
|
|
23
|
+
* then recreated by us, and the already-paired session token would become
|
|
24
|
+
* pairable a second time. Renaming the file to a private name first is an
|
|
25
|
+
* atomic claim: if the rename fails with ENOENT the code was spent and we stop;
|
|
26
|
+
* if it succeeds the server can no longer consume it (it sees "absent", which
|
|
27
|
+
* answers 410 for the old code — the code we are about to replace anyway).
|
|
28
|
+
*
|
|
29
|
+
* ## Fail-closed
|
|
30
|
+
*
|
|
31
|
+
* Anything unreadable, malformed or already expired yields no code. A failure
|
|
32
|
+
* after the claim deletes the claimed file rather than guessing, so the worst
|
|
33
|
+
* case is "pairing is gone, run `remote stop` and `remote` again", never "a
|
|
34
|
+
* spent token is pairable again".
|
|
35
|
+
*/
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.getReissueClaimPath = getReissueClaimPath;
|
|
38
|
+
exports.reissuePairingCode = reissuePairingCode;
|
|
39
|
+
const fs_1 = require("fs");
|
|
40
|
+
const auth_1 = require("../../lib/security/auth");
|
|
41
|
+
const pairing_code_1 = require("../../lib/security/pairing-code");
|
|
42
|
+
/**
|
|
43
|
+
* @param filePath - Handoff file
|
|
44
|
+
* @returns The private name the file is claimed under while it is rewritten
|
|
45
|
+
*/
|
|
46
|
+
function getReissueClaimPath(filePath) {
|
|
47
|
+
return `${filePath}.reissue-${process.pid}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Best-effort unlink. A missing file is the state we wanted.
|
|
51
|
+
*
|
|
52
|
+
* @param filePath - File to remove
|
|
53
|
+
*/
|
|
54
|
+
function removeQuietly(filePath) {
|
|
55
|
+
try {
|
|
56
|
+
(0, fs_1.unlinkSync)(filePath);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Already gone.
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Put a claimed file back where the server reads it. When that fails the
|
|
64
|
+
* claimed copy is deleted: an orphan holding the plaintext token is worse than
|
|
65
|
+
* a pairing that has to be started again.
|
|
66
|
+
*
|
|
67
|
+
* @param claimPath - Where the file was claimed to
|
|
68
|
+
* @param filePath - Where the server expects it
|
|
69
|
+
*/
|
|
70
|
+
function restoreClaim(claimPath, filePath) {
|
|
71
|
+
try {
|
|
72
|
+
(0, fs_1.renameSync)(claimPath, filePath);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
removeQuietly(claimPath);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Replace the pairing code of an unused handoff file with a fresh one.
|
|
80
|
+
*
|
|
81
|
+
* @param filePath - Absolute path of the handoff file (`state.pairing.filePath`)
|
|
82
|
+
* @param now - Epoch ms, injectable for tests
|
|
83
|
+
* @returns The new code and its (unchanged) expiry, or why there is none
|
|
84
|
+
*/
|
|
85
|
+
function reissuePairingCode(filePath, now = Date.now()) {
|
|
86
|
+
const claimPath = getReissueClaimPath(filePath);
|
|
87
|
+
try {
|
|
88
|
+
(0, fs_1.renameSync)(filePath, claimPath);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const code = error?.code;
|
|
92
|
+
return { ok: false, reason: code === 'ENOENT' ? 'consumed' : 'unreadable' };
|
|
93
|
+
}
|
|
94
|
+
const handoff = (0, pairing_code_1.readPairingHandoff)(claimPath);
|
|
95
|
+
if (handoff === null) {
|
|
96
|
+
restoreClaim(claimPath, filePath);
|
|
97
|
+
return { ok: false, reason: 'unreadable' };
|
|
98
|
+
}
|
|
99
|
+
if ((0, pairing_code_1.isPairingExpired)(handoff, now)) {
|
|
100
|
+
restoreClaim(claimPath, filePath);
|
|
101
|
+
return { ok: false, reason: 'expired' };
|
|
102
|
+
}
|
|
103
|
+
const code = (0, pairing_code_1.generatePairingCode)();
|
|
104
|
+
try {
|
|
105
|
+
(0, pairing_code_1.writePairingHandoff)(claimPath, {
|
|
106
|
+
pairingHash: (0, auth_1.hashToken)(code),
|
|
107
|
+
expiresAt: handoff.expiresAt,
|
|
108
|
+
sessionToken: handoff.sessionToken,
|
|
109
|
+
});
|
|
110
|
+
(0, fs_1.renameSync)(claimPath, filePath);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
removeQuietly(claimPath);
|
|
114
|
+
return { ok: false, reason: 'write-failed' };
|
|
115
|
+
}
|
|
116
|
+
return { ok: true, code, expiresAt: handoff.expiresAt };
|
|
117
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading an agent's reply out of the chat ledger (Issue #2376 / #2386 / #3039)
|
|
3
|
+
*
|
|
4
|
+
* `ask` reads the reply after its own turn; `reply` (Issue #3039) reads the
|
|
5
|
+
* latest reply of a turn somebody else sent — a worker told to "stop and
|
|
6
|
+
* report" by a supervisor nudge. Both mean the same thing by "the reply", so
|
|
7
|
+
* the rules live here once rather than in two commands that can drift:
|
|
8
|
+
*
|
|
9
|
+
* - only assistant rows in `GET /api/worktrees/:id/messages` are candidates,
|
|
10
|
+
* prompt rows excluded;
|
|
11
|
+
* - CommandMate's own furniture (`relay-sys:` / `model-changed:`) is never an
|
|
12
|
+
* answer;
|
|
13
|
+
* - a row a transcript reader wrote (`<tool>-turn:<id>`) wins over a scrape;
|
|
14
|
+
* - ANSI escapes and control bytes are dropped before the text is returned.
|
|
15
|
+
*
|
|
16
|
+
* What differs between the two callers — how long to hold out for a turn row,
|
|
17
|
+
* and whether an unmarked row may stand in for one — stays with the caller.
|
|
18
|
+
*/
|
|
19
|
+
import type { PromptMessageResponse } from '../types/api-responses';
|
|
20
|
+
import type { ApiClient } from './api-client';
|
|
21
|
+
/**
|
|
22
|
+
* Chat rows read back per request.
|
|
23
|
+
*
|
|
24
|
+
* Bounded because only the tail matters and an unbounded read of a long-running
|
|
25
|
+
* worktree's history is a large response for one line of answer. Generous
|
|
26
|
+
* enough that a turn which wrote several assistant rows (a tool-use narration
|
|
27
|
+
* followed by the summary) still has its last one inside the window.
|
|
28
|
+
*/
|
|
29
|
+
export declare const REPLY_LOOKBACK_MESSAGES = 30;
|
|
30
|
+
/**
|
|
31
|
+
* Tools whose reply CommandMate reads out of a transcript rather than a screen.
|
|
32
|
+
*
|
|
33
|
+
* For these five the ledger is authoritative and a row with no turn marker is
|
|
34
|
+
* by definition not the answer. For every other tool (copilot / gemini /
|
|
35
|
+
* vibe-local) the scraper's row is the only record there will ever be.
|
|
36
|
+
*
|
|
37
|
+
* Mirrors the five readers that live under `src/lib/hooks/sources/`.
|
|
38
|
+
*/
|
|
39
|
+
export declare const TRANSCRIPT_READER_TOOLS: ReadonlySet<string>;
|
|
40
|
+
/**
|
|
41
|
+
* A reply body fit to print, or `''` if nothing survived.
|
|
42
|
+
*
|
|
43
|
+
* Issue #2386 asked for this as a belt to the braces: the row the junk came
|
|
44
|
+
* from held RAW ANSI, and a caller that pipes a reply into a report or a commit
|
|
45
|
+
* message should never have to strip escape codes out of an agent's sentence.
|
|
46
|
+
*
|
|
47
|
+
* @param raw - Reply text as it arrived
|
|
48
|
+
*/
|
|
49
|
+
export declare function sanitizeReply(raw: string): string;
|
|
50
|
+
/** One assistant row that could be the reply. */
|
|
51
|
+
export interface ReplyCandidate {
|
|
52
|
+
/** Sanitized body. Never empty — an empty one is not a candidate. */
|
|
53
|
+
content: string;
|
|
54
|
+
/** Whether a transcript reader wrote it (see {@link isTurnRow}). */
|
|
55
|
+
fromTranscript: boolean;
|
|
56
|
+
/** The row's `request_id`, or null when the producer had none. */
|
|
57
|
+
requestId: string | null;
|
|
58
|
+
/** The row's own timestamp, as the messages route serialized it. */
|
|
59
|
+
at: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The rows that could be a reply written at or after `since`, oldest first.
|
|
63
|
+
*
|
|
64
|
+
* @param messages - Rows as the messages route serialized them
|
|
65
|
+
* @param since - Epoch ms; rows stamped earlier are not candidates
|
|
66
|
+
*/
|
|
67
|
+
export declare function replyCandidates(messages: PromptMessageResponse[], since: number): ReplyCandidate[];
|
|
68
|
+
/**
|
|
69
|
+
* The newest reply among `candidates`, or null.
|
|
70
|
+
*
|
|
71
|
+
* Newest first among the rows a reader wrote: a turn that emitted several
|
|
72
|
+
* assistant rows (a narration then the summary) still ends on its summary.
|
|
73
|
+
* When `turnRowsOnly` is false and no reader wrote anything, the newest row of
|
|
74
|
+
* any kind is taken — the only record a tool without a transcript has.
|
|
75
|
+
*
|
|
76
|
+
* @param candidates - Output of {@link replyCandidates}
|
|
77
|
+
* @param turnRowsOnly - Whether an unmarked (scraped) row may stand in
|
|
78
|
+
*/
|
|
79
|
+
export declare function pickLatestReply(candidates: ReplyCandidate[], turnRowsOnly: boolean): ReplyCandidate | null;
|
|
80
|
+
/**
|
|
81
|
+
* The recent chat rows for this instance. Throws what the API client throws.
|
|
82
|
+
*
|
|
83
|
+
* @param client - API client
|
|
84
|
+
* @param worktreeId - Worktree ID
|
|
85
|
+
* @param instanceId - Resolved instance ID, or undefined for every instance
|
|
86
|
+
*/
|
|
87
|
+
export declare function requestRecentMessages(client: ApiClient, worktreeId: string, instanceId: string | undefined): Promise<PromptMessageResponse[]>;
|
|
88
|
+
/**
|
|
89
|
+
* {@link requestRecentMessages}, or null if the rows cannot be read.
|
|
90
|
+
*
|
|
91
|
+
* For a caller whose turn already completed: a daemon that cannot serve the
|
|
92
|
+
* ledger is a reason to fall back, not a reason to lose the turn.
|
|
93
|
+
*/
|
|
94
|
+
export declare function fetchRecentMessages(client: ApiClient, worktreeId: string, instanceId: string | undefined): Promise<PromptMessageResponse[] | null>;
|
|
95
|
+
//# sourceMappingURL=reply-ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reply-ledger.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/reply-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AA4B1C;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAMtD,CAAC;AAcH;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAaD,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,cAAc,EAAE,OAAO,CAAC;IACxB,kEAAkE;IAClE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,qBAAqB,EAAE,EACjC,KAAK,EAAE,MAAM,GACZ,cAAc,EAAE,CAkBlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,cAAc,EAAE,EAC5B,YAAY,EAAE,OAAO,GACpB,cAAc,GAAG,IAAI,CAMvB;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAUlC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,CAMzC"}
|