commandmate 0.43.0 → 0.44.1
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 +357 -361
- package/.next/app-path-routes-manifest.json +33 -33
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +3 -3
- 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.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.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 +2 -2
- 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.js +2 -2
- 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.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.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.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.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.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.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 -1
- 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.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.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.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 -1
- 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 +3 -3
- 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.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 +33 -33
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1501.js +3 -3
- package/.next/server/chunks/2119.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 +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4802.js +1 -1
- package/.next/server/chunks/488.js +1 -0
- package/.next/server/chunks/5326.js +1 -1
- package/.next/server/chunks/5456.js +1 -1
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.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 -0
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/{5742.js → 6927.js} +1 -1
- 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/8918.js +105 -3
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/967.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +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/{1642-767aed8e7c61ef7f.js → 1642-fb2e176aaadbd137.js} +1 -1
- package/.next/static/chunks/2053-85a974ddfe7498fe.js +1 -0
- package/.next/static/chunks/{2407-940df9b11fadafc6.js → 2407-f1f258d4a1d92620.js} +1 -1
- package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
- package/.next/static/chunks/344-e1cefd00787060e4.js +1 -0
- package/.next/static/chunks/3922.f45dcfc1e7da552a.js +1 -0
- package/.next/static/chunks/5521-c358c31f60e5e689.js +1 -0
- package/.next/static/chunks/591-308072f285c34787.js +1 -0
- package/.next/static/chunks/6654-ac431270fac1a283.js +1 -0
- package/.next/static/chunks/{8165-3525fb42f1b4976e.js → 8165-3853772f6ae1299b.js} +1 -1
- 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-6c17a271f7f98fbb.js} +1 -1
- package/.next/static/chunks/998-2eb5883186abd0bd.js +1 -0
- package/.next/static/chunks/app/layout-da66300cc20244ed.js +1 -0
- package/.next/static/chunks/app/more/{page-30057cf1e0762ad2.js → page-87c84987b2765213.js} +1 -1
- package/.next/static/chunks/app/{page-8483ba400af011f5.js → page-1b820c421db48c2c.js} +1 -1
- package/.next/static/chunks/app/review/page-95f749caae382f46.js +1 -0
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-74aac15286504ef4.js → page-9ee7a381636e60cb.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-040c5f0f585e6812.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
- package/.next/static/chunks/{webpack-49ade0526854dd4e.js → webpack-021f0741f22dd16a.js} +1 -1
- package/.next/static/css/38070d879efa1371.css +1 -0
- package/.next/trace +13 -13
- package/README.md +90 -605
- 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 +34 -1
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +171 -6
- 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.map +1 -1
- package/dist/cli/commands/wait.js +11 -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 +368 -0
- package/dist/cli/types/api-responses.d.ts +21 -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/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/detection/status-reason.d.ts +17 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +17 -0
- package/dist/lib/security/pairing-code.d.ts +2 -1
- package/dist/lib/security/pairing-code.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +41 -7
- package/dist/server/locales/ja/worktree.json +41 -7
- package/dist/server/src/config/image-extensions.js +1 -0
- package/dist/server/src/config/session-starting-config.js +75 -0
- package/dist/server/src/lib/auto-yes-poller.js +22 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +2 -1
- package/dist/server/src/lib/cli-tools/base.js +15 -1
- package/dist/server/src/lib/cli-tools/codex.js +3 -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 +30 -4
- package/dist/server/src/lib/cli-tools/copilot.js +2 -1
- package/dist/server/src/lib/cli-tools/gemini.js +2 -1
- package/dist/server/src/lib/cli-tools/liveness-spec.js +27 -9
- package/dist/server/src/lib/cli-tools/opencode-v2.js +2 -1
- package/dist/server/src/lib/cli-tools/opencode.js +2 -1
- package/dist/server/src/lib/cli-tools/vibe-local.js +2 -1
- package/dist/server/src/lib/detection/cli-patterns.js +94 -1
- package/dist/server/src/lib/detection/status-reason.js +17 -0
- package/dist/server/src/lib/detection/tool-liveness.js +3 -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/hooks/sources/claude/transcript.js +33 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +5 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -0
- package/dist/server/src/lib/session/claude-executor.js +2 -2
- package/dist/server/src/lib/session/claude-session.js +138 -16
- package/dist/server/src/lib/session/current-output-builder.js +49 -21
- package/dist/server/src/lib/session/launch-screen.js +57 -0
- package/dist/server/src/lib/session/session-start-error.js +20 -0
- package/dist/server/src/lib/session/session-starting-state.js +236 -0
- package/dist/server/src/lib/skills/agent-state-paths.js +39 -0
- package/dist/server/src/lib/skills/receipt-owned-paths.js +118 -0
- package/dist/server/src/lib/tmux/tmux.js +25 -0
- package/dist/server/src/lib/verification/env-clean-gate.js +195 -6
- package/dist/server/src/lib/verification/gate-runner.js +29 -2
- package/dist/server/src/lib/verification/scope-gate.js +58 -4
- 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 +18 -7
- package/release-notes/0.44.0.json +82 -0
- package/release-notes/0.44.1.json +54 -0
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/3707.js +0 -15
- package/.next/server/chunks/6491.js +0 -103
- 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/344-6f9fc1f38f01a839.js +0 -1
- package/.next/static/chunks/3778-56f41fc2cecb8c43.js +0 -1
- package/.next/static/chunks/3922.8e79fc89f593280b.js +0 -1
- package/.next/static/chunks/5449-6cb80bab2bd06b79.js +0 -1
- package/.next/static/chunks/6966-bb854d1145783a64.js +0 -1
- package/.next/static/chunks/7705-1f58d4c03d991fcf.js +0 -1
- package/.next/static/chunks/app/layout-057c850cd0df978e.js +0 -1
- package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +0 -1
- package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +0 -1
- package/.next/static/css/b3f433d52b8ed5c8.css +0 -1
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → 57lOiz8zSEHdw97XIm0af}/_buildManifest.js +0 -0
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → 57lOiz8zSEHdw97XIm0af}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/capture.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/capture.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAC;AAwVnE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAexB;AA2ED,wBAAgB,oBAAoB,IAAI,OAAO,CAoI9C"}
|
|
@@ -46,6 +46,9 @@ const MAX_FOLLOW_INTERVAL_MS = 60_000;
|
|
|
46
46
|
* keeps its own copy of the API shapes (see api-responses.ts).
|
|
47
47
|
*/
|
|
48
48
|
const UNCLASSIFIED_FRAME_TYPE = 'unclassified';
|
|
49
|
+
/** Shown by the default text mode when there is no transcript to print (Issue #3128). */
|
|
50
|
+
const EMPTY_TRANSCRIPT_HINT = 'No transcript yet. A prompt (e.g. "Trust this folder?") may be waiting on screen; '
|
|
51
|
+
+ 'read it with `commandmate capture <worktree-id> --instance <instance> --pane --tail 40`.';
|
|
49
52
|
/**
|
|
50
53
|
* Format capture output as JSON (excluding fullOutput for size).
|
|
51
54
|
*
|
|
@@ -493,7 +496,14 @@ function createCaptureCommand() {
|
|
|
493
496
|
}
|
|
494
497
|
else {
|
|
495
498
|
// Default: plain text output (content field)
|
|
496
|
-
|
|
499
|
+
// Issue #3128: no transcript yet (e.g. a trust-folder dialog before the
|
|
500
|
+
// first turn) reads as a dead session. Point at the pane, where it shows.
|
|
501
|
+
if (data.content.trim() === '') {
|
|
502
|
+
console.log(EMPTY_TRANSCRIPT_HINT);
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
console.log(data.content);
|
|
506
|
+
}
|
|
497
507
|
}
|
|
498
508
|
}
|
|
499
509
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsDpC;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CA8E3C"}
|
|
@@ -20,6 +20,7 @@ const commander_1 = require("commander");
|
|
|
20
20
|
const types_1 = require("../types");
|
|
21
21
|
const docs_reader_1 = require("../utils/docs-reader");
|
|
22
22
|
const agent_operations_1 = require("../docs/agent-operations");
|
|
23
|
+
const setup_guide_1 = require("../docs/setup-guide");
|
|
23
24
|
/**
|
|
24
25
|
* Sections this command carries itself (Issue #2376).
|
|
25
26
|
*
|
|
@@ -32,9 +33,13 @@ const agent_operations_1 = require("../docs/agent-operations");
|
|
|
32
33
|
*
|
|
33
34
|
* The next change to touch `docs-reader.ts` should fold this into
|
|
34
35
|
* `EMBEDDED_SECTIONS` and delete the three branches below.
|
|
36
|
+
*
|
|
37
|
+
* `setup` (Issue #3059) is the agent-facing setup guide, served on the site as
|
|
38
|
+
* `website/setup.md`; registered here for the same reason as `delegation`.
|
|
35
39
|
*/
|
|
36
40
|
const LOCAL_SECTIONS = {
|
|
37
41
|
delegation: agent_operations_1.AGENT_DELEGATION_GUIDE,
|
|
42
|
+
setup: setup_guide_1.SETUP_GUIDE,
|
|
38
43
|
};
|
|
39
44
|
/** Every section name, the reader's plus {@link LOCAL_SECTIONS}. */
|
|
40
45
|
function allSectionNames() {
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* commandmate remote # up (default): start, publish, show the QR
|
|
6
6
|
* commandmate remote status # Provider / URL / expiry / pairing state
|
|
7
7
|
* commandmate remote stop # close the door, keeping the server running
|
|
8
|
+
* commandmate remote pair # show a new pairing link, same URL (Issue #3127)
|
|
8
9
|
*
|
|
9
10
|
* commandmate remote --auth remote-only # only the phone's route authenticates
|
|
10
11
|
*
|
|
@@ -288,6 +289,16 @@ export declare function derivePairingState(handoffPresent: boolean, pairingExpir
|
|
|
288
289
|
* @returns e.g. `in 6h 12m`, or `expired`
|
|
289
290
|
*/
|
|
290
291
|
export declare function formatRemaining(ms: number): string;
|
|
292
|
+
/**
|
|
293
|
+
* The human-facing pairing expiry line shared by `remote` and `remote pair`
|
|
294
|
+
* (Issue #3156): local clock time, time left, and the single-use reminder, so
|
|
295
|
+
* whoever hands the link on can say when it stops working.
|
|
296
|
+
*
|
|
297
|
+
* @param expiresAt - Epoch ms the pairing code dies at
|
|
298
|
+
* @param now - Epoch ms, injectable for tests
|
|
299
|
+
* @returns e.g. `Pairing expires: 14:16 (in 9m), works once (2026-10-04T05:16:00.000Z)`
|
|
300
|
+
*/
|
|
301
|
+
export declare function formatPairingExpiryLine(expiresAt: number, now?: number): string;
|
|
291
302
|
/**
|
|
292
303
|
* Run the `status` flow (§5.4).
|
|
293
304
|
*
|
|
@@ -301,6 +312,28 @@ export declare function formatRemaining(ms: number): string;
|
|
|
301
312
|
* @returns The exit code the caller should terminate with
|
|
302
313
|
*/
|
|
303
314
|
export declare function runRemoteStatus(options: RemoteOptions): Promise<ExitCode>;
|
|
315
|
+
/**
|
|
316
|
+
* Printed with every re-issued link (Issue #3127). The link may stay behind in
|
|
317
|
+
* an agent's chat history, so its limits are said next to it.
|
|
318
|
+
*/
|
|
319
|
+
export declare const PAIRING_LINK_NOTICE: string;
|
|
320
|
+
/**
|
|
321
|
+
* `remote pair`: show a new pairing link for the live session (Issue #3127).
|
|
322
|
+
*
|
|
323
|
+
* The plaintext code from `remote up` is never stored, so "show it again"
|
|
324
|
+
* means minting a replacement and swapping its hash into the existing handoff
|
|
325
|
+
* file (`reissuePairingCode`). The server, the Provider and the published URL
|
|
326
|
+
* are left exactly as they are — no new way in is opened — and the session
|
|
327
|
+
* token is never printed: the only secret in the output is the one-time code.
|
|
328
|
+
*
|
|
329
|
+
* Refused unless the code is still unused: a consumed code means a device
|
|
330
|
+
* already holds the token, and an expired one closed its window on purpose.
|
|
331
|
+
* Both are answered with the `remote stop` -> `remote` route instead.
|
|
332
|
+
*
|
|
333
|
+
* @param options - Parsed command options (`--json`)
|
|
334
|
+
* @returns SUCCESS with a link, CONFIG_ERROR without one
|
|
335
|
+
*/
|
|
336
|
+
export declare function runRemotePair(options: RemoteOptions): Promise<ExitCode>;
|
|
304
337
|
/**
|
|
305
338
|
* Run the `stop` flow (§6.3-4).
|
|
306
339
|
*
|
|
@@ -321,7 +354,7 @@ export declare function runRemoteStop(options: RemoteOptions): Promise<ExitCode>
|
|
|
321
354
|
* future caller (a `quickstart --remote`, say) would compose, exactly as
|
|
322
355
|
* `runStart` / `startCommand` are split (#1195).
|
|
323
356
|
*
|
|
324
|
-
* @param action - `up` (default), `status` or `
|
|
357
|
+
* @param action - `up` (default), `status`, `stop` or `pair`
|
|
325
358
|
* @param options - Parsed command options
|
|
326
359
|
*/
|
|
327
360
|
export declare function remoteCommand(action: string | undefined, options: RemoteOptions): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/remote.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAmB,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAW9C,OAAO,EAKL,KAAK,eAAe,EAErB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EAIL,KAAK,iBAAiB,EAEtB,KAAK,gBAAgB,EAEtB,MAAM,kBAAkB,CAAC;AAQ1B,iFAAiF;AACjF,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,yEAAyE;AACzE,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAE7C,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,QAAY,CAAC;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,QAAsB,CAAC;AAEtD,0EAA0E;AAC1E,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAK9E,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,gBAAgB,EAAyB,CAAC;AAEzF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,sBAAsB,8FAKzB,CAAC;AAEX;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,wHAG9B,CAAC;AAEX,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,eAAe,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,SAAS,EAAE,eAAe,CAAC;IAC3B;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,2DAA2D;AAC3D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE7D;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWxF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,IAAI,CAY5E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgB1D;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,eAAe,EAA2B,CAAC;AAErF,mEAAmE;AACnE,eAAO,MAAM,yBAAyB,EAAE,eAAuB,CAAC;AAEhE;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAa/C;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,CAUzE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,gEAAgE;AAChE,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,8DAA8D;IAC9D,KAAK,CAAC,EAAE;QACN,QAAQ,EAAE,QAAQ,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,gFAAgF;QAChF,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,SAAS,iBAAiB,EAAE,EACxC,SAAS,CAAC,EAAE,MAAM,GACjB,iBAAiB,CA6CnB;AAqID;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CA0S3E;AA0BD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjE;AAoCD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,OAAO,EACvB,gBAAgB,EAAE,MAAM,EACxB,GAAG,GAAE,MAAmB,GACvB,YAAY,CAGd;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAI3F;AAkDD;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsF/E;AA+BD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,QAEwC,CAAC;AAWzE;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgF7E;AAuBD;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkD7E;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAwB7C"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* commandmate remote # up (default): start, publish, show the QR
|
|
7
7
|
* commandmate remote status # Provider / URL / expiry / pairing state
|
|
8
8
|
* commandmate remote stop # close the door, keeping the server running
|
|
9
|
+
* commandmate remote pair # show a new pairing link, same URL (Issue #3127)
|
|
9
10
|
*
|
|
10
11
|
* commandmate remote --auth remote-only # only the phone's route authenticates
|
|
11
12
|
*
|
|
@@ -47,7 +48,7 @@
|
|
|
47
48
|
* local session down along with the remote one (§5.3).
|
|
48
49
|
*/
|
|
49
50
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
-
exports.REMOTE_INGRESS_HOST = exports.DEFAULT_REMOTE_AUTH_SCOPE = exports.REMOTE_AUTH_SCOPES = exports.REMOTE_ONLY_LAUNCH_ENV_KEYS = exports.REMOTE_LAUNCH_ENV_KEYS = exports.PUBLIC_TUNNEL_PROVIDERS = exports.REMOTE_PROVIDER_ALIASES = exports.MAX_PAIRING_TTL_MS = exports.MIN_PAIRING_TTL_MS = exports.DEFAULT_PAIRING_EXPIRES = exports.DEFAULT_REMOTE_EXPIRES = void 0;
|
|
51
|
+
exports.PAIRING_LINK_NOTICE = exports.REMOTE_INGRESS_HOST = exports.DEFAULT_REMOTE_AUTH_SCOPE = exports.REMOTE_AUTH_SCOPES = exports.REMOTE_ONLY_LAUNCH_ENV_KEYS = exports.REMOTE_LAUNCH_ENV_KEYS = exports.PUBLIC_TUNNEL_PROVIDERS = exports.REMOTE_PROVIDER_ALIASES = exports.MAX_PAIRING_TTL_MS = exports.MIN_PAIRING_TTL_MS = exports.DEFAULT_PAIRING_EXPIRES = exports.DEFAULT_REMOTE_EXPIRES = void 0;
|
|
51
52
|
exports.buildRemoteLaunchEnv = buildRemoteLaunchEnv;
|
|
52
53
|
exports.applyRemoteLaunchEnv = applyRemoteLaunchEnv;
|
|
53
54
|
exports.parsePairingDuration = parsePairingDuration;
|
|
@@ -59,7 +60,9 @@ exports.runRemoteUp = runRemoteUp;
|
|
|
59
60
|
exports.buildPairingUrl = buildPairingUrl;
|
|
60
61
|
exports.derivePairingState = derivePairingState;
|
|
61
62
|
exports.formatRemaining = formatRemaining;
|
|
63
|
+
exports.formatPairingExpiryLine = formatPairingExpiryLine;
|
|
62
64
|
exports.runRemoteStatus = runRemoteStatus;
|
|
65
|
+
exports.runRemotePair = runRemotePair;
|
|
63
66
|
exports.runRemoteStop = runRemoteStop;
|
|
64
67
|
exports.remoteCommand = remoteCommand;
|
|
65
68
|
exports.createRemoteCommand = createRemoteCommand;
|
|
@@ -72,9 +75,11 @@ const logger_1 = require("../utils/logger");
|
|
|
72
75
|
const prompt_1 = require("../utils/prompt");
|
|
73
76
|
const qr_terminal_1 = require("../utils/qr-terminal");
|
|
74
77
|
const remote_state_1 = require("../utils/remote-state");
|
|
78
|
+
const remote_pairing_1 = require("../utils/remote-pairing");
|
|
75
79
|
const server_url_1 = require("../utils/server-url");
|
|
76
80
|
const security_logger_1 = require("../utils/security-logger");
|
|
77
81
|
const server_ready_1 = require("../utils/server-ready");
|
|
82
|
+
const server_identity_1 = require("../utils/server-identity");
|
|
78
83
|
const remote_1 = require("../../lib/remote");
|
|
79
84
|
const auth_1 = require("../../lib/security/auth");
|
|
80
85
|
const pairing_code_1 = require("../../lib/security/pairing-code");
|
|
@@ -410,7 +415,7 @@ function parseEndpoint(url) {
|
|
|
410
415
|
const port = parsed.port ? parseInt(parsed.port, 10) : parsed.protocol === 'https:' ? 443 : 80;
|
|
411
416
|
if (Number.isNaN(port))
|
|
412
417
|
return null;
|
|
413
|
-
return { host: parsed.hostname, port };
|
|
418
|
+
return { host: parsed.hostname, port, protocol: parsed.protocol === 'https:' ? 'https' : 'http' };
|
|
414
419
|
}
|
|
415
420
|
catch {
|
|
416
421
|
return null;
|
|
@@ -619,6 +624,33 @@ async function runRemoteUp(options) {
|
|
|
619
624
|
}
|
|
620
625
|
logger.success(`Remote listener: ${exports.REMOTE_INGRESS_HOST}:${remoteIngressPort} (authentication required)`);
|
|
621
626
|
}
|
|
627
|
+
// 6c. Issue #3087: a listening port is not proof that it is OUR server. An
|
|
628
|
+
// orphan from an earlier `start --daemon` (no authentication) can hold the
|
|
629
|
+
// port while the server started above dies on EADDRINUSE, and every TCP
|
|
630
|
+
// check passes against it. Before the irreversible step, the exact port to
|
|
631
|
+
// be published must refuse an unknown token (authentication is on) and
|
|
632
|
+
// accept the token minted above (only the server launched with its hash
|
|
633
|
+
// can). Anything short of both is a refusal: nothing is published.
|
|
634
|
+
const publishedHost = remoteIngressPort !== undefined ? exports.REMOTE_INGRESS_HOST : endpoint.host;
|
|
635
|
+
const identity = await (0, server_identity_1.verifyLaunchedServer)({
|
|
636
|
+
protocol: endpoint.protocol,
|
|
637
|
+
host: publishedHost,
|
|
638
|
+
port: remoteIngressPort ?? endpoint.port,
|
|
639
|
+
sessionToken,
|
|
640
|
+
});
|
|
641
|
+
if (!identity.ok) {
|
|
642
|
+
logger.error(`Refusing to publish: ${identity.reason}.`);
|
|
643
|
+
logger.info('Nothing was published. Another process may be holding the port (for example an earlier ' +
|
|
644
|
+
'CommandMate server that was not stopped). Stop it and re-run "commandmate remote".');
|
|
645
|
+
await rollback(daemonManager, pairing.filePath, restoreEnv);
|
|
646
|
+
(0, security_logger_1.logSecurityEvent)({
|
|
647
|
+
timestamp: new Date().toISOString(),
|
|
648
|
+
command: 'remote',
|
|
649
|
+
action: 'failure',
|
|
650
|
+
details: `up: listener identity not verified, nothing published (${provider.id})`,
|
|
651
|
+
});
|
|
652
|
+
return types_1.ExitCode.START_FAILED;
|
|
653
|
+
}
|
|
622
654
|
// 7. Open the outside door. The Provider is handed 127.0.0.1 explicitly; it
|
|
623
655
|
// never reads CM_BIND (§9.1).
|
|
624
656
|
//
|
|
@@ -675,6 +707,7 @@ async function runRemoteUp(options) {
|
|
|
675
707
|
const pairingUrl = buildPairingUrl(handle.url, pairing.code);
|
|
676
708
|
if (!options.json) {
|
|
677
709
|
announcePairing(pairingUrl);
|
|
710
|
+
logger.info(formatPairingExpiryLine(state.pairing.expiresAt, now));
|
|
678
711
|
}
|
|
679
712
|
(0, security_logger_1.logSecurityEvent)({
|
|
680
713
|
timestamp: new Date().toISOString(),
|
|
@@ -748,7 +781,7 @@ function buildPairingUrl(url, code) {
|
|
|
748
781
|
*
|
|
749
782
|
* @param pairingUrl - The `/login#code=` URL
|
|
750
783
|
*/
|
|
751
|
-
function announcePairing(pairingUrl) {
|
|
784
|
+
function announcePairing(pairingUrl, alwaysShowUrl = false) {
|
|
752
785
|
const qr = (0, qr_terminal_1.formatQrForTerminal)(pairingUrl, {
|
|
753
786
|
columns: process.stdout.columns,
|
|
754
787
|
color: process.stdout.isTTY === true,
|
|
@@ -761,6 +794,12 @@ function announcePairing(pairingUrl) {
|
|
|
761
794
|
else {
|
|
762
795
|
console.log(qr);
|
|
763
796
|
logger.info('Scan this with your phone. The code works once, and only until it expires.');
|
|
797
|
+
// Issue #3127: an agent's chat pane folds long output and cuts the QR off,
|
|
798
|
+
// so `remote pair` prints the link as text too.
|
|
799
|
+
if (alwaysShowUrl) {
|
|
800
|
+
logger.info('Or open this URL on the phone:');
|
|
801
|
+
logger.info(` ${pairingUrl}`);
|
|
802
|
+
}
|
|
764
803
|
}
|
|
765
804
|
logger.blank();
|
|
766
805
|
}
|
|
@@ -796,6 +835,20 @@ function formatRemaining(ms) {
|
|
|
796
835
|
return `in ${minutes}m`;
|
|
797
836
|
return `in ${hours}h ${minutes % 60}m`;
|
|
798
837
|
}
|
|
838
|
+
/**
|
|
839
|
+
* The human-facing pairing expiry line shared by `remote` and `remote pair`
|
|
840
|
+
* (Issue #3156): local clock time, time left, and the single-use reminder, so
|
|
841
|
+
* whoever hands the link on can say when it stops working.
|
|
842
|
+
*
|
|
843
|
+
* @param expiresAt - Epoch ms the pairing code dies at
|
|
844
|
+
* @param now - Epoch ms, injectable for tests
|
|
845
|
+
* @returns e.g. `Pairing expires: 14:16 (in 9m), works once (2026-10-04T05:16:00.000Z)`
|
|
846
|
+
*/
|
|
847
|
+
function formatPairingExpiryLine(expiresAt, now = Date.now()) {
|
|
848
|
+
const d = new Date(expiresAt);
|
|
849
|
+
const hhmm = `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;
|
|
850
|
+
return `Pairing expires: ${hhmm} (${formatRemaining(expiresAt - now)}), works once (${d.toISOString()})`;
|
|
851
|
+
}
|
|
799
852
|
/**
|
|
800
853
|
* Close the outside door for a recorded session.
|
|
801
854
|
*
|
|
@@ -908,6 +961,9 @@ async function runRemoteStatus(options) {
|
|
|
908
961
|
logger.info(`Remote expires: ${new Date(state.expiresAt).toISOString()} (${formatRemaining(state.expiresAt - now)})`);
|
|
909
962
|
logger.info(`Pairing: ${pairing}`);
|
|
910
963
|
logger.info(`Server: ${describeServer(server)}`);
|
|
964
|
+
if (!expired) {
|
|
965
|
+
logger.info(describePairingNextStep(pairing));
|
|
966
|
+
}
|
|
911
967
|
}
|
|
912
968
|
if (closed !== null && !options.json) {
|
|
913
969
|
if (closed.ok) {
|
|
@@ -931,6 +987,112 @@ async function runRemoteStatus(options) {
|
|
|
931
987
|
* @param state - The recorded session
|
|
932
988
|
* @returns The text after `Auth scope:`
|
|
933
989
|
*/
|
|
990
|
+
/**
|
|
991
|
+
* One line telling the user how to get a pairing link from this state
|
|
992
|
+
* (Issue #3127). `status` itself never prints a link or a code (§5.4).
|
|
993
|
+
*
|
|
994
|
+
* @param pairing - Derived pairing state
|
|
995
|
+
* @returns The hint line
|
|
996
|
+
*/
|
|
997
|
+
function describePairingNextStep(pairing) {
|
|
998
|
+
if (pairing === 'unused') {
|
|
999
|
+
return 'Lost the QR code? "commandmate remote pair" shows a new pairing link for the same URL.';
|
|
1000
|
+
}
|
|
1001
|
+
return PAIRING_RESTART_HINT;
|
|
1002
|
+
}
|
|
1003
|
+
/** What to do when no unused pairing code is left (Issue #3127). */
|
|
1004
|
+
const PAIRING_RESTART_HINT = 'To pair a device now, run "commandmate remote stop", then "commandmate remote" for a new QR code.';
|
|
1005
|
+
/**
|
|
1006
|
+
* Printed with every re-issued link (Issue #3127). The link may stay behind in
|
|
1007
|
+
* an agent's chat history, so its limits are said next to it.
|
|
1008
|
+
*/
|
|
1009
|
+
exports.PAIRING_LINK_NOTICE = 'This link works once and expires at the time shown. Any earlier pairing link no longer works. ' +
|
|
1010
|
+
'When you are done with remote access, run "commandmate remote stop".';
|
|
1011
|
+
/**
|
|
1012
|
+
* @param reason - Why no code was issued
|
|
1013
|
+
* @returns The pairing state to report for it
|
|
1014
|
+
*/
|
|
1015
|
+
function failureToPairingState(reason) {
|
|
1016
|
+
if (reason === 'consumed' || reason === 'expired')
|
|
1017
|
+
return reason;
|
|
1018
|
+
return 'unavailable';
|
|
1019
|
+
}
|
|
1020
|
+
/**
|
|
1021
|
+
* `remote pair`: show a new pairing link for the live session (Issue #3127).
|
|
1022
|
+
*
|
|
1023
|
+
* The plaintext code from `remote up` is never stored, so "show it again"
|
|
1024
|
+
* means minting a replacement and swapping its hash into the existing handoff
|
|
1025
|
+
* file (`reissuePairingCode`). The server, the Provider and the published URL
|
|
1026
|
+
* are left exactly as they are — no new way in is opened — and the session
|
|
1027
|
+
* token is never printed: the only secret in the output is the one-time code.
|
|
1028
|
+
*
|
|
1029
|
+
* Refused unless the code is still unused: a consumed code means a device
|
|
1030
|
+
* already holds the token, and an expired one closed its window on purpose.
|
|
1031
|
+
* Both are answered with the `remote stop` -> `remote` route instead.
|
|
1032
|
+
*
|
|
1033
|
+
* @param options - Parsed command options (`--json`)
|
|
1034
|
+
* @returns SUCCESS with a link, CONFIG_ERROR without one
|
|
1035
|
+
*/
|
|
1036
|
+
async function runRemotePair(options) {
|
|
1037
|
+
const state = (0, remote_state_1.readRemoteState)();
|
|
1038
|
+
const now = Date.now();
|
|
1039
|
+
const refuse = (pairing, message) => {
|
|
1040
|
+
if (options.json) {
|
|
1041
|
+
console.log(JSON.stringify({ action: 'pair', pairingUrl: null, pairing: { state: pairing }, error: message, hint: PAIRING_RESTART_HINT }, null, 2));
|
|
1042
|
+
}
|
|
1043
|
+
else {
|
|
1044
|
+
logger.error(message);
|
|
1045
|
+
logger.info(PAIRING_RESTART_HINT);
|
|
1046
|
+
}
|
|
1047
|
+
(0, security_logger_1.logSecurityEvent)({
|
|
1048
|
+
timestamp: new Date().toISOString(),
|
|
1049
|
+
command: 'remote',
|
|
1050
|
+
action: 'failure',
|
|
1051
|
+
details: `pair: not reissued (${pairing ?? 'no-remote-state'})`,
|
|
1052
|
+
});
|
|
1053
|
+
return types_1.ExitCode.CONFIG_ERROR;
|
|
1054
|
+
};
|
|
1055
|
+
if (state === null) {
|
|
1056
|
+
return refuse(null, 'No remote session is recorded, so there is no pairing to show.');
|
|
1057
|
+
}
|
|
1058
|
+
if (now > state.expiresAt) {
|
|
1059
|
+
return refuse(null, 'The remote session has expired.');
|
|
1060
|
+
}
|
|
1061
|
+
const pairing = derivePairingState((0, fs_1.existsSync)(state.pairing.filePath), state.pairing.expiresAt, now);
|
|
1062
|
+
if (pairing !== 'unused') {
|
|
1063
|
+
return refuse(pairing, pairing === 'consumed'
|
|
1064
|
+
? 'The pairing code has already been used.'
|
|
1065
|
+
: 'The pairing code has expired.');
|
|
1066
|
+
}
|
|
1067
|
+
const reissued = (0, remote_pairing_1.reissuePairingCode)(state.pairing.filePath, now);
|
|
1068
|
+
if (!reissued.ok) {
|
|
1069
|
+
return refuse(failureToPairingState(reissued.reason), `Could not issue a new pairing code (${reissued.reason}).`);
|
|
1070
|
+
}
|
|
1071
|
+
const pairingUrl = buildPairingUrl(state.url, reissued.code);
|
|
1072
|
+
const expiresAt = new Date(reissued.expiresAt).toISOString();
|
|
1073
|
+
(0, security_logger_1.logSecurityEvent)({
|
|
1074
|
+
timestamp: new Date().toISOString(),
|
|
1075
|
+
command: 'remote',
|
|
1076
|
+
action: 'success',
|
|
1077
|
+
// Neither the pairing code nor the token appears here (§5.2).
|
|
1078
|
+
details: `pair: reissued provider=${state.provider}`,
|
|
1079
|
+
});
|
|
1080
|
+
if (options.json) {
|
|
1081
|
+
console.log(JSON.stringify({
|
|
1082
|
+
action: 'pair',
|
|
1083
|
+
url: state.url,
|
|
1084
|
+
pairingUrl,
|
|
1085
|
+
pairing: { state: 'unused', expiresAt },
|
|
1086
|
+
notice: exports.PAIRING_LINK_NOTICE,
|
|
1087
|
+
}, null, 2));
|
|
1088
|
+
}
|
|
1089
|
+
else {
|
|
1090
|
+
announcePairing(pairingUrl, true);
|
|
1091
|
+
logger.info(formatPairingExpiryLine(reissued.expiresAt, now));
|
|
1092
|
+
logger.info(exports.PAIRING_LINK_NOTICE);
|
|
1093
|
+
}
|
|
1094
|
+
return types_1.ExitCode.SUCCESS;
|
|
1095
|
+
}
|
|
934
1096
|
function describeAuthScope(state) {
|
|
935
1097
|
const scope = state.authScope ?? exports.DEFAULT_REMOTE_AUTH_SCOPE;
|
|
936
1098
|
if (scope !== 'remote-only') {
|
|
@@ -1009,7 +1171,7 @@ async function runRemoteStop(options) {
|
|
|
1009
1171
|
* future caller (a `quickstart --remote`, say) would compose, exactly as
|
|
1010
1172
|
* `runStart` / `startCommand` are split (#1195).
|
|
1011
1173
|
*
|
|
1012
|
-
* @param action - `up` (default), `status` or `
|
|
1174
|
+
* @param action - `up` (default), `status`, `stop` or `pair`
|
|
1013
1175
|
* @param options - Parsed command options
|
|
1014
1176
|
*/
|
|
1015
1177
|
async function remoteCommand(action, options) {
|
|
@@ -1025,8 +1187,11 @@ async function remoteCommand(action, options) {
|
|
|
1025
1187
|
case 'stop':
|
|
1026
1188
|
exitCode = await runRemoteStop(options);
|
|
1027
1189
|
break;
|
|
1190
|
+
case 'pair':
|
|
1191
|
+
exitCode = await runRemotePair(options);
|
|
1192
|
+
break;
|
|
1028
1193
|
default:
|
|
1029
|
-
logger.error(`Unknown action '${action}'. Valid actions: up, status, stop.`);
|
|
1194
|
+
logger.error(`Unknown action '${action}'. Valid actions: up, status, stop, pair.`);
|
|
1030
1195
|
exitCode = types_1.ExitCode.CONFIG_ERROR;
|
|
1031
1196
|
}
|
|
1032
1197
|
}
|
|
@@ -1055,7 +1220,7 @@ function createRemoteCommand() {
|
|
|
1055
1220
|
const cmd = new commander_1.Command('remote');
|
|
1056
1221
|
cmd
|
|
1057
1222
|
.description('Expose this server to your phone over a provider tunnel and pair it with a QR code')
|
|
1058
|
-
.argument('[action]', 'up (default), status, or
|
|
1223
|
+
.argument('[action]', 'up (default), status, stop, or pair (show a new pairing link)')
|
|
1059
1224
|
.option('--provider <name>', 'Force a provider instead of choosing one (tailscale or cloudflare)')
|
|
1060
1225
|
.option('--expires <duration>', `Remote session TTL, 1h-30d (default: ${exports.DEFAULT_REMOTE_EXPIRES})`)
|
|
1061
1226
|
.option('--pairing-expires <duration>', `Pairing code TTL, 1m-24h (default: ${exports.DEFAULT_PAIRING_EXPIRES})`)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/respond.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/respond.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8apC,wBAAgB,oBAAoB,IAAI,OAAO,CA6F9C"}
|