commandmate 0.33.3 → 0.34.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 +146 -146
- package/.next/app-path-routes-manifest.json +26 -26
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +2 -2
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +3 -3
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_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]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +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 +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 +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -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 +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_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 +2 -2
- 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 +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page_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.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +8 -8
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +26 -26
- package/.next/server/chunks/1501.js +4 -4
- package/.next/server/chunks/1886.js +2 -2
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/3077.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3323.js +1 -1
- package/.next/server/chunks/3480.js +2 -2
- package/.next/server/chunks/434.js +1 -0
- package/.next/server/chunks/4443.js +1 -1
- package/.next/server/chunks/4802.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/595.js +3 -3
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6286.js +7 -7
- package/.next/server/chunks/6337.js +1 -1
- package/.next/server/chunks/650.js +1 -1
- package/.next/server/chunks/663.js +1 -1
- package/.next/server/chunks/6677.js +25 -0
- package/.next/server/chunks/7075.js +1 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8583.js +1 -0
- package/.next/server/chunks/8807.js +10 -10
- package/.next/server/chunks/8918.js +4 -2
- package/.next/server/chunks/9080.js +1 -0
- package/.next/server/chunks/964.js +1 -0
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js +1 -1
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/2053-9ac860ab4e92ac89.js +1 -0
- package/.next/static/chunks/2652-18b8fea64413467e.js +1 -0
- package/.next/static/chunks/{4718-814f4ecfd7fcc513.js → 4718-29cfcfb806724d9a.js} +1 -1
- package/.next/static/chunks/{8361-9bb887203c456edb.js → 8361-0142beb59be2abf3.js} +1 -1
- package/.next/static/chunks/app/{page-022090bf6f932818.js → page-26a42881c8648cd3.js} +1 -1
- package/.next/static/chunks/app/sessions/page-a3ab6f122ec60d5a.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-60eab4e24c37cb77.js +1 -0
- package/.next/static/css/b09bede85744e1cf.css +1 -0
- package/.next/trace +13 -13
- package/README.md +141 -24
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +11 -2
- package/dist/cli/commands/remote.d.ts +93 -3
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +232 -9
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +8 -4
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +18 -0
- package/dist/cli/commands/wait.d.ts +18 -3
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +137 -2
- 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 +41 -1
- package/dist/cli/types/index.d.ts +9 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +11 -1
- package/dist/cli/utils/remote-state.d.ts +32 -0
- package/dist/cli/utils/remote-state.d.ts.map +1 -1
- package/dist/cli/utils/remote-state.js +12 -0
- package/dist/cli/utils/session-target.d.ts +23 -6
- package/dist/cli/utils/session-target.d.ts.map +1 -1
- package/dist/cli/utils/session-target.js +33 -5
- package/dist/server/locales/en/worktree.json +21 -2
- package/dist/server/locales/ja/worktree.json +21 -2
- package/dist/server/server.js +204 -16
- package/dist/server/src/config/schedule-config.js +45 -3
- package/dist/server/src/lib/cli-tools/antigravity.js +95 -10
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +377 -16
- package/dist/server/src/lib/cmate-parser.js +8 -1
- package/dist/server/src/lib/db/agent-instances-db.js +11 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +140 -19
- package/dist/server/src/lib/detection/tools/claude/detect.js +13 -2
- package/dist/server/src/lib/detection/tools/claude/picker-chrome.js +239 -0
- package/dist/server/src/lib/detection/tools/claude/prompt.js +74 -6
- package/dist/server/src/lib/hooks/sources/claude/history.js +391 -34
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +91 -0
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +6 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +114 -11
- package/dist/server/src/lib/polling/response-checker.js +82 -3
- package/dist/server/src/lib/relay/relay-session-ref.js +15 -8
- package/dist/server/src/lib/schedule-manager.js +178 -19
- package/dist/server/src/lib/session/ask-user-question-prompt.js +4 -2
- package/dist/server/src/lib/session/claude-executor.js +33 -2
- package/dist/server/src/lib/session/resolve-session-target.js +37 -9
- package/dist/server/src/lib/verification/env-clean-gate.js +81 -4
- package/dist/server/src/lib/ws-server.js +74 -5
- package/dist/server/src/types/agent-transcript.js +143 -1
- package/package.json +1 -1
- package/.next/server/chunks/1068.js +0 -1
- package/.next/server/chunks/6808.js +0 -1
- package/.next/server/chunks/7875.js +0 -25
- package/.next/server/chunks/9553.js +0 -1
- package/.next/static/chunks/2053-3f299a7a2c7d6767.js +0 -1
- package/.next/static/chunks/8772-9be53a530950d804.js +0 -1
- package/.next/static/chunks/app/sessions/page-584adf11ae51df10.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-3af707e74a75172b.js +0 -1
- package/.next/static/css/acd46e25427a2080.css +0 -1
- /package/.next/static/{9x6U1h52hH_r6pOsGwI_p → oDWX0JcwfhUYrMnnqDWVC}/_buildManifest.js +0 -0
- /package/.next/static/{9x6U1h52hH_r6pOsGwI_p → oDWX0JcwfhUYrMnnqDWVC}/_ssgManifest.js +0 -0
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* commandmate remote status # Provider / URL / expiry / pairing state
|
|
8
8
|
* commandmate remote stop # close the door, keeping the server running
|
|
9
9
|
*
|
|
10
|
+
* commandmate remote --auth remote-only # only the phone's route authenticates
|
|
11
|
+
*
|
|
10
12
|
* ## What lives here rather than in a Provider (§6.2)
|
|
11
13
|
*
|
|
12
14
|
* Two things, and both for the same reason — they are decisions about an
|
|
@@ -21,6 +23,17 @@
|
|
|
21
23
|
* Provider would have to re-derive interactive-vs-not per Provider, and its
|
|
22
24
|
* answer would be invisible to the caller that has to honour `--yes`.
|
|
23
25
|
*
|
|
26
|
+
* ## How far the token reaches (Issue #2489)
|
|
27
|
+
*
|
|
28
|
+
* `--auth all` (the default) authenticates every listener, which is what #1937
|
|
29
|
+
* shipped. `--auth remote-only` runs a SECOND loopback listener, points the
|
|
30
|
+
* Provider at that one alone, and exempts the original from authentication — so
|
|
31
|
+
* the phone still pairs and the PC in front of the machine keeps working. The
|
|
32
|
+
* exemption is decided by which listener a request arrived on, never by its
|
|
33
|
+
* source address: a Provider's upstream IS 127.0.0.1, so every IP- and
|
|
34
|
+
* header-based answer here fails open. See `src/lib/ws-server.ts`'s ingress
|
|
35
|
+
* section for the full argument.
|
|
36
|
+
*
|
|
24
37
|
* ## What this command deliberately does not have
|
|
25
38
|
*
|
|
26
39
|
* - **`--token`.** `remote` is the side that MINTS a token; one supplied from
|
|
@@ -34,10 +47,13 @@
|
|
|
34
47
|
* local session down along with the remote one (§5.3).
|
|
35
48
|
*/
|
|
36
49
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
-
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;
|
|
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;
|
|
38
51
|
exports.buildRemoteLaunchEnv = buildRemoteLaunchEnv;
|
|
39
52
|
exports.applyRemoteLaunchEnv = applyRemoteLaunchEnv;
|
|
40
53
|
exports.parsePairingDuration = parsePairingDuration;
|
|
54
|
+
exports.parseAuthScope = parseAuthScope;
|
|
55
|
+
exports.resolveEffectiveBind = resolveEffectiveBind;
|
|
56
|
+
exports.isLoopbackBind = isLoopbackBind;
|
|
41
57
|
exports.selectProvider = selectProvider;
|
|
42
58
|
exports.runRemoteUp = runRemoteUp;
|
|
43
59
|
exports.buildPairingUrl = buildPairingUrl;
|
|
@@ -56,6 +72,7 @@ const logger_1 = require("../utils/logger");
|
|
|
56
72
|
const prompt_1 = require("../utils/prompt");
|
|
57
73
|
const qr_terminal_1 = require("../utils/qr-terminal");
|
|
58
74
|
const remote_state_1 = require("../utils/remote-state");
|
|
75
|
+
const server_url_1 = require("../utils/server-url");
|
|
59
76
|
const security_logger_1 = require("../utils/security-logger");
|
|
60
77
|
const server_ready_1 = require("../utils/server-ready");
|
|
61
78
|
const remote_1 = require("../../lib/remote");
|
|
@@ -106,6 +123,12 @@ exports.PUBLIC_TUNNEL_PROVIDERS = ['cloudflare-quick'];
|
|
|
106
123
|
* put here would be readable by the very agents CommandMate is driving
|
|
107
124
|
* (§7.2).
|
|
108
125
|
*
|
|
126
|
+
* - `CM_AUTH_SCOPE` — the `--auth` value (#2489). Not a secret and not a path:
|
|
127
|
+
* the string `all` or `remote-only`, which is what `middleware.ts` and
|
|
128
|
+
* `ws-server.ts` read to decide whether the local listener may skip the
|
|
129
|
+
* token. Always exported, including for `all`, so the server is told what
|
|
130
|
+
* was chosen rather than inferring it from a missing variable.
|
|
131
|
+
*
|
|
109
132
|
* `tests/unit/cli/commands/remote-launch-env-1937.test.ts` holds the measured
|
|
110
133
|
* set to this declaration in BOTH directions, the way
|
|
111
134
|
* `agent-launch-plan-secrets-1933.test.ts` does for `prepareLaunch`. Adding a
|
|
@@ -115,6 +138,19 @@ exports.REMOTE_LAUNCH_ENV_KEYS = [
|
|
|
115
138
|
'CM_AUTH_TOKEN_HASH',
|
|
116
139
|
'CM_AUTH_EXPIRE',
|
|
117
140
|
'CM_REMOTE_PAIRING_FILE',
|
|
141
|
+
'CM_AUTH_SCOPE',
|
|
142
|
+
];
|
|
143
|
+
/**
|
|
144
|
+
* The measured set for `--auth remote-only` (Issue #2489).
|
|
145
|
+
*
|
|
146
|
+
* One key more than {@link REMOTE_LAUNCH_ENV_KEYS}, and declared separately
|
|
147
|
+
* rather than as an "optional extra" so the exact-set measurement keeps working
|
|
148
|
+
* in BOTH directions for BOTH modes. A conditional key checked against a single
|
|
149
|
+
* list would be a list that describes neither mode.
|
|
150
|
+
*/
|
|
151
|
+
exports.REMOTE_ONLY_LAUNCH_ENV_KEYS = [
|
|
152
|
+
...exports.REMOTE_LAUNCH_ENV_KEYS,
|
|
153
|
+
'CM_REMOTE_INGRESS_PORT',
|
|
118
154
|
];
|
|
119
155
|
/**
|
|
120
156
|
* Build the exact environment `remote` contributes to the server it starts.
|
|
@@ -124,15 +160,20 @@ exports.REMOTE_LAUNCH_ENV_KEYS = [
|
|
|
124
160
|
* {@link REMOTE_LAUNCH_ENV_KEYS} — "what did remote add" is otherwise only
|
|
125
161
|
* observable by diffing a global.
|
|
126
162
|
*
|
|
127
|
-
* @param input - Hash, expiry and
|
|
128
|
-
* @returns
|
|
163
|
+
* @param input - Hash, expiry, handoff path and auth scope
|
|
164
|
+
* @returns Those variables, and nothing else
|
|
129
165
|
*/
|
|
130
166
|
function buildRemoteLaunchEnv(input) {
|
|
131
|
-
|
|
167
|
+
const env = {
|
|
132
168
|
CM_AUTH_TOKEN_HASH: input.authTokenHash,
|
|
133
169
|
CM_AUTH_EXPIRE: input.authExpire,
|
|
134
170
|
CM_REMOTE_PAIRING_FILE: input.pairingFilePath,
|
|
171
|
+
CM_AUTH_SCOPE: input.authScope,
|
|
135
172
|
};
|
|
173
|
+
if (input.authScope === 'remote-only' && input.remoteIngressPort !== undefined) {
|
|
174
|
+
env.CM_REMOTE_INGRESS_PORT = String(input.remoteIngressPort);
|
|
175
|
+
}
|
|
176
|
+
return env;
|
|
136
177
|
}
|
|
137
178
|
/**
|
|
138
179
|
* Copy the launch env into `process.env`, where `daemon.ts` reads it.
|
|
@@ -187,6 +228,79 @@ function parsePairingDuration(value) {
|
|
|
187
228
|
}
|
|
188
229
|
return ms;
|
|
189
230
|
}
|
|
231
|
+
/**
|
|
232
|
+
* What the user may type after `--auth`, and the default when they type nothing.
|
|
233
|
+
*
|
|
234
|
+
* Issue #2489. `all` is the default deliberately: `remote-only` leaves every
|
|
235
|
+
* process on this machine — including the agents CommandMate itself runs in tmux
|
|
236
|
+
* — able to reach the API without a token, which is the same exposure as a
|
|
237
|
+
* CommandMate started without `--auth` at all, and weaker than `all`. Opting
|
|
238
|
+
* into that is the user's call to make, not a default to inherit.
|
|
239
|
+
*/
|
|
240
|
+
exports.REMOTE_AUTH_SCOPES = ['all', 'remote-only'];
|
|
241
|
+
/** Auth scope applied when `--auth` is not given (Issue #2489). */
|
|
242
|
+
exports.DEFAULT_REMOTE_AUTH_SCOPE = 'all';
|
|
243
|
+
/**
|
|
244
|
+
* Where the `remote-only` ingress listener lives (Issue #2489).
|
|
245
|
+
*
|
|
246
|
+
* The literal loopback address, matching `REMOTE_INGRESS_BIND` in `server.ts`:
|
|
247
|
+
* both Providers dial `http://127.0.0.1:<port>`, and the listener must not be
|
|
248
|
+
* reachable from anywhere else.
|
|
249
|
+
*/
|
|
250
|
+
exports.REMOTE_INGRESS_HOST = '127.0.0.1';
|
|
251
|
+
/**
|
|
252
|
+
* Loopback bind addresses that keep the local listener off the network.
|
|
253
|
+
*
|
|
254
|
+
* Issue #2489: `remote-only` makes the local listener unauthenticated, so it is
|
|
255
|
+
* refused when the server would bind anywhere a second machine can reach —
|
|
256
|
+
* otherwise "local means trusted" quietly becomes "the LAN means trusted".
|
|
257
|
+
* `server.ts` re-checks this against its own effective `CM_BIND`; this copy is
|
|
258
|
+
* what turns the mistake into an exit code instead of a degraded server.
|
|
259
|
+
*/
|
|
260
|
+
const LOOPBACK_BINDS = ['127.0.0.1', 'localhost', '::1', '[::1]'];
|
|
261
|
+
/**
|
|
262
|
+
* Parse an `--auth` value.
|
|
263
|
+
*
|
|
264
|
+
* @param value - Raw flag value; undefined means the flag was not given
|
|
265
|
+
* @returns The scope to use
|
|
266
|
+
* @throws Error naming the valid values, for CONFIG_ERROR
|
|
267
|
+
*/
|
|
268
|
+
function parseAuthScope(value) {
|
|
269
|
+
if (value === undefined)
|
|
270
|
+
return exports.DEFAULT_REMOTE_AUTH_SCOPE;
|
|
271
|
+
const normalized = value.trim().toLowerCase();
|
|
272
|
+
const match = exports.REMOTE_AUTH_SCOPES.find((scope) => scope === normalized);
|
|
273
|
+
if (match === undefined) {
|
|
274
|
+
throw new Error(`Unknown --auth value: "${value}". Valid values: ${exports.REMOTE_AUTH_SCOPES.join(', ')}.`);
|
|
275
|
+
}
|
|
276
|
+
return match;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* The bind address the server this session starts will actually listen on.
|
|
280
|
+
*
|
|
281
|
+
* Read through `loadEffectiveEnv()` rather than `process.env` because that is
|
|
282
|
+
* what `daemon.start()` hands the child: it layers `.env` OVER the exported
|
|
283
|
+
* environment, so a `CM_BIND=0.0.0.0` written in `~/.commandmate/.env` is
|
|
284
|
+
* invisible to `process.env` here and decisive for the server. Checking the
|
|
285
|
+
* wrong one is how this guard would pass while the thing it guards against
|
|
286
|
+
* happened anyway.
|
|
287
|
+
*
|
|
288
|
+
* This is the one place `remote` reads `CM_BIND`, and only in `remote-only`
|
|
289
|
+
* mode — §9.1's "remote neither reads nor writes CM_BIND" still holds for every
|
|
290
|
+
* other path, and `remote` never writes it.
|
|
291
|
+
*
|
|
292
|
+
* @returns The effective `CM_BIND`, defaulted the way `server.ts` defaults it
|
|
293
|
+
*/
|
|
294
|
+
function resolveEffectiveBind() {
|
|
295
|
+
return (0, server_url_1.loadEffectiveEnv)().CM_BIND || '127.0.0.1';
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* @param bind - An effective `CM_BIND` value
|
|
299
|
+
* @returns true when nothing outside this machine can reach that address
|
|
300
|
+
*/
|
|
301
|
+
function isLoopbackBind(bind) {
|
|
302
|
+
return LOOPBACK_BINDS.includes(bind.trim().toLowerCase());
|
|
303
|
+
}
|
|
190
304
|
/**
|
|
191
305
|
* Apply the Provider selection rule (§6.2).
|
|
192
306
|
*
|
|
@@ -376,6 +490,33 @@ async function runRemoteUp(options) {
|
|
|
376
490
|
logger.error(`Invalid --pairing-expires value: ${(0, types_1.getErrorMessage)(error)}`);
|
|
377
491
|
return types_1.ExitCode.CONFIG_ERROR;
|
|
378
492
|
}
|
|
493
|
+
// Issue #2489. Both checks happen BEFORE any Provider is probed: neither an
|
|
494
|
+
// unknown `--auth` value nor a LAN-facing bind should cost the user a
|
|
495
|
+
// `tailscale serve` that then has to be reverted.
|
|
496
|
+
let authScope;
|
|
497
|
+
try {
|
|
498
|
+
authScope = parseAuthScope(options.auth);
|
|
499
|
+
}
|
|
500
|
+
catch (error) {
|
|
501
|
+
logger.error((0, types_1.getErrorMessage)(error));
|
|
502
|
+
return types_1.ExitCode.CONFIG_ERROR;
|
|
503
|
+
}
|
|
504
|
+
if (authScope === 'remote-only') {
|
|
505
|
+
const bind = resolveEffectiveBind();
|
|
506
|
+
if (!isLoopbackBind(bind)) {
|
|
507
|
+
logger.error(`--auth remote-only requires a loopback CM_BIND, but this server would bind to ${bind}.`);
|
|
508
|
+
logger.info('In this mode the local listener answers without a token, so a non-loopback bind would ' +
|
|
509
|
+
'extend that to every host that can reach this machine.');
|
|
510
|
+
logger.info('Set CM_BIND=127.0.0.1, or run "commandmate remote --auth all".');
|
|
511
|
+
(0, security_logger_1.logSecurityEvent)({
|
|
512
|
+
timestamp: new Date().toISOString(),
|
|
513
|
+
command: 'remote',
|
|
514
|
+
action: 'failure',
|
|
515
|
+
details: `up: remote-only refused (CM_BIND=${bind})`,
|
|
516
|
+
});
|
|
517
|
+
return types_1.ExitCode.CONFIG_ERROR;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
379
520
|
// 1. Probe every Provider, then apply the selection rule here (§6.2).
|
|
380
521
|
const candidates = await (0, remote_1.detectRemoteProviders)();
|
|
381
522
|
const selection = selectProvider(candidates, options.provider);
|
|
@@ -416,9 +557,31 @@ async function runRemoteUp(options) {
|
|
|
416
557
|
const sessionToken = (0, auth_1.generateToken)();
|
|
417
558
|
const authTokenHash = (0, auth_1.hashToken)(sessionToken);
|
|
418
559
|
const pairing = (0, pairing_code_1.createPairingHandoff)({ ttlMs: pairingTtlMs, sessionToken });
|
|
560
|
+
// 4b. Issue #2489: in `remote-only` the Provider gets a socket of its own, so
|
|
561
|
+
// "which listener did this arrive on" can answer "does this need a token".
|
|
562
|
+
// Picked here rather than by the server because the Provider is started from
|
|
563
|
+
// this process and has to be pointed somewhere; the server re-validates the
|
|
564
|
+
// value and falls back to authenticating everything if it cannot use it.
|
|
565
|
+
let remoteIngressPort;
|
|
566
|
+
if (authScope === 'remote-only') {
|
|
567
|
+
try {
|
|
568
|
+
remoteIngressPort = await (0, remote_1.findFreeLoopbackPort)();
|
|
569
|
+
}
|
|
570
|
+
catch (error) {
|
|
571
|
+
logger.error(`Could not reserve a loopback port for the remote listener: ${(0, types_1.getErrorMessage)(error)}`);
|
|
572
|
+
(0, pairing_code_1.consumePairingHandoff)(pairing.filePath);
|
|
573
|
+
return types_1.ExitCode.START_FAILED;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
419
576
|
// 5. Start the server through the existing exit-free core. Not reimplemented:
|
|
420
577
|
// `runStart` already owns .env loading, port allocation and the daemon spawn.
|
|
421
|
-
const restoreEnv = applyRemoteLaunchEnv(buildRemoteLaunchEnv({
|
|
578
|
+
const restoreEnv = applyRemoteLaunchEnv(buildRemoteLaunchEnv({
|
|
579
|
+
authTokenHash,
|
|
580
|
+
authExpire: expires,
|
|
581
|
+
pairingFilePath: pairing.filePath,
|
|
582
|
+
authScope,
|
|
583
|
+
remoteIngressPort,
|
|
584
|
+
}));
|
|
422
585
|
logger.info('Starting the CommandMate server...');
|
|
423
586
|
const started = await (0, start_1.runStart)({ daemon: true, port: options.port });
|
|
424
587
|
if (!started.ok) {
|
|
@@ -442,11 +605,31 @@ async function runRemoteUp(options) {
|
|
|
442
605
|
return types_1.ExitCode.START_FAILED;
|
|
443
606
|
}
|
|
444
607
|
logger.success(`Server: ${started.url} (pid ${started.pid})`);
|
|
608
|
+
// 6b. Issue #2489: the remote listener is fatal in exactly the same way. The
|
|
609
|
+
// server refuses `remote-only` rather than dying when it cannot open this
|
|
610
|
+
// socket — it must not take the user's local session down — so its absence
|
|
611
|
+
// reaches us as a port that never answers, and publishing a URL that fronts
|
|
612
|
+
// it would hand the user a QR code for nothing. Roll the whole session back.
|
|
613
|
+
if (remoteIngressPort !== undefined) {
|
|
614
|
+
if (!(await (0, server_ready_1.waitForServer)(exports.REMOTE_INGRESS_HOST, remoteIngressPort))) {
|
|
615
|
+
logger.error(`The server did not open its remote listener on ${exports.REMOTE_INGRESS_HOST}:${remoteIngressPort} in time.`);
|
|
616
|
+
logger.info('Nothing was published. Re-run, or use "commandmate remote --auth all".');
|
|
617
|
+
await rollback(daemonManager, pairing.filePath, restoreEnv);
|
|
618
|
+
return types_1.ExitCode.START_FAILED;
|
|
619
|
+
}
|
|
620
|
+
logger.success(`Remote listener: ${exports.REMOTE_INGRESS_HOST}:${remoteIngressPort} (authentication required)`);
|
|
621
|
+
}
|
|
445
622
|
// 7. Open the outside door. The Provider is handed 127.0.0.1 explicitly; it
|
|
446
623
|
// never reads CM_BIND (§9.1).
|
|
624
|
+
//
|
|
625
|
+
// Issue #2489: in `remote-only` it is handed the SEPARATE loopback port
|
|
626
|
+
// instead. That substitution is the whole mechanism — the Provider reaches
|
|
627
|
+
// only the listener that always authenticates, and the port the user's own
|
|
628
|
+
// browser and CLI dial is never published.
|
|
629
|
+
const publishedPort = remoteIngressPort ?? endpoint.port;
|
|
447
630
|
let handle;
|
|
448
631
|
try {
|
|
449
|
-
handle = await provider.start({ port:
|
|
632
|
+
handle = await provider.start({ port: publishedPort, signal: new AbortController().signal });
|
|
450
633
|
}
|
|
451
634
|
catch (error) {
|
|
452
635
|
logger.error(`Provider ${provider.id} failed to start: ${(0, types_1.getErrorMessage)(error)}`);
|
|
@@ -472,7 +655,12 @@ async function runRemoteUp(options) {
|
|
|
472
655
|
expiresAt: now + expiresMs,
|
|
473
656
|
pairing: { filePath: pairing.filePath, expiresAt: pairing.expiresAt },
|
|
474
657
|
handle,
|
|
475
|
-
server: {
|
|
658
|
+
server: {
|
|
659
|
+
pid: started.pid ?? null,
|
|
660
|
+
port: endpoint.port,
|
|
661
|
+
remoteIngressPort: remoteIngressPort ?? null,
|
|
662
|
+
},
|
|
663
|
+
authScope,
|
|
476
664
|
};
|
|
477
665
|
try {
|
|
478
666
|
(0, remote_state_1.writeRemoteState)(state);
|
|
@@ -493,7 +681,7 @@ async function runRemoteUp(options) {
|
|
|
493
681
|
command: 'remote',
|
|
494
682
|
action: 'success',
|
|
495
683
|
// Neither the pairing code nor the token appears here (§5.2).
|
|
496
|
-
details: `up: provider=${handle.provider} port=${
|
|
684
|
+
details: `up: provider=${handle.provider} port=${publishedPort} auth=${authScope}`,
|
|
497
685
|
});
|
|
498
686
|
if (options.json) {
|
|
499
687
|
// NOT a pure-JSON stream, and saying so is better than implying otherwise:
|
|
@@ -504,13 +692,19 @@ async function runRemoteUp(options) {
|
|
|
504
692
|
console.log(JSON.stringify({
|
|
505
693
|
action: 'up',
|
|
506
694
|
provider: state.provider,
|
|
695
|
+
authScope: state.authScope ?? exports.DEFAULT_REMOTE_AUTH_SCOPE,
|
|
507
696
|
url: state.url,
|
|
508
697
|
// The one-time display, in the form a machine caller can use. `status`
|
|
509
698
|
// never emits this field - the code is shown by `up` or not at all.
|
|
510
699
|
pairingUrl,
|
|
511
700
|
expiresAt: new Date(state.expiresAt).toISOString(),
|
|
512
701
|
pairing: { expiresAt: new Date(state.pairing.expiresAt).toISOString() },
|
|
513
|
-
server: {
|
|
702
|
+
server: {
|
|
703
|
+
pid: state.server.pid,
|
|
704
|
+
port: state.server.port,
|
|
705
|
+
url: started.url,
|
|
706
|
+
remoteIngressPort: state.server.remoteIngressPort ?? null,
|
|
707
|
+
},
|
|
514
708
|
}, null, 2));
|
|
515
709
|
}
|
|
516
710
|
return types_1.ExitCode.SUCCESS;
|
|
@@ -685,6 +879,9 @@ async function runRemoteStatus(options) {
|
|
|
685
879
|
action: 'status',
|
|
686
880
|
remote: {
|
|
687
881
|
provider: state.provider,
|
|
882
|
+
// Issue #2489: what `--auth` this session ran with. A record written
|
|
883
|
+
// before #2489 has no such field and was, by construction, `all`.
|
|
884
|
+
authScope: state.authScope ?? exports.DEFAULT_REMOTE_AUTH_SCOPE,
|
|
688
885
|
// The URL is public information; the pairing code and the token are
|
|
689
886
|
// not, and neither appears here or anywhere else in `status` (§5.4).
|
|
690
887
|
url: state.url,
|
|
@@ -696,6 +893,10 @@ async function runRemoteStatus(options) {
|
|
|
696
893
|
state: pairing,
|
|
697
894
|
expiresAt: new Date(state.pairing.expiresAt).toISOString(),
|
|
698
895
|
},
|
|
896
|
+
server: {
|
|
897
|
+
port: state.server.port,
|
|
898
|
+
remoteIngressPort: state.server.remoteIngressPort ?? null,
|
|
899
|
+
},
|
|
699
900
|
},
|
|
700
901
|
server,
|
|
701
902
|
}, null, 2));
|
|
@@ -703,6 +904,7 @@ async function runRemoteStatus(options) {
|
|
|
703
904
|
else {
|
|
704
905
|
logger.info(`Provider: ${state.provider}`);
|
|
705
906
|
logger.info(`URL: ${state.url}`);
|
|
907
|
+
logger.info(`Auth scope: ${describeAuthScope(state)}`);
|
|
706
908
|
logger.info(`Remote expires: ${new Date(state.expiresAt).toISOString()} (${formatRemaining(state.expiresAt - now)})`);
|
|
707
909
|
logger.info(`Pairing: ${pairing}`);
|
|
708
910
|
logger.info(`Server: ${describeServer(server)}`);
|
|
@@ -718,6 +920,26 @@ async function runRemoteStatus(options) {
|
|
|
718
920
|
}
|
|
719
921
|
return types_1.ExitCode.SUCCESS;
|
|
720
922
|
}
|
|
923
|
+
/**
|
|
924
|
+
* Render the `Auth scope:` line (Issue #2489).
|
|
925
|
+
*
|
|
926
|
+
* `remote-only` says where the exemption applies as well as that it exists: the
|
|
927
|
+
* difference between the two ports is the entire security boundary, so a line
|
|
928
|
+
* that named only the mode would leave the reader to guess which socket is
|
|
929
|
+
* which.
|
|
930
|
+
*
|
|
931
|
+
* @param state - The recorded session
|
|
932
|
+
* @returns The text after `Auth scope:`
|
|
933
|
+
*/
|
|
934
|
+
function describeAuthScope(state) {
|
|
935
|
+
const scope = state.authScope ?? exports.DEFAULT_REMOTE_AUTH_SCOPE;
|
|
936
|
+
if (scope !== 'remote-only') {
|
|
937
|
+
return 'all (every request needs the paired token)';
|
|
938
|
+
}
|
|
939
|
+
const ingress = state.server.remoteIngressPort;
|
|
940
|
+
return (`remote-only (provider port ${ingress ?? 'unknown'} needs the paired token; ` +
|
|
941
|
+
`http://${exports.REMOTE_INGRESS_HOST}:${state.server.port} on this machine does not)`);
|
|
942
|
+
}
|
|
721
943
|
/**
|
|
722
944
|
* @param server - Daemon status, or null when there is no PID file
|
|
723
945
|
* @returns The `Server:` line
|
|
@@ -839,6 +1061,7 @@ function createRemoteCommand() {
|
|
|
839
1061
|
.option('--pairing-expires <duration>', `Pairing code TTL, 1m-24h (default: ${exports.DEFAULT_PAIRING_EXPIRES})`)
|
|
840
1062
|
.option('-p, --port <number>', 'Port for the server to expose', parseInt)
|
|
841
1063
|
.option('--yes', 'Approve creating a public tunnel without prompting (required when non-interactive)')
|
|
1064
|
+
.option('--auth <scope>', `How far authentication reaches: all or remote-only (default: ${exports.DEFAULT_REMOTE_AUTH_SCOPE})`)
|
|
842
1065
|
.option('--json', 'JSON output')
|
|
843
1066
|
// Deliberately absent: --token (remote mints its own; see the file header)
|
|
844
1067
|
// and every --auto-yes flag (§5.5).
|
|
@@ -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;AA2JpC,wBAAgB,oBAAoB,IAAI,OAAO,
|
|
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;AA2JpC,wBAAgB,oBAAoB,IAAI,OAAO,CA4K9C"}
|
|
@@ -207,10 +207,14 @@ function createRespondCommand() {
|
|
|
207
207
|
if (result && !result.success) {
|
|
208
208
|
// [DR2-06] Check reason for failure
|
|
209
209
|
const reason = result.reason || 'unknown';
|
|
210
|
-
// Issue #1681 / #1726: these
|
|
211
|
-
//
|
|
212
|
-
//
|
|
213
|
-
|
|
210
|
+
// Issue #1681 / #1726: these mean the server refused BEFORE sending,
|
|
211
|
+
// so the terminal is untouched — worth saying plainly, because the
|
|
212
|
+
// other reasons leave the answer's fate unknown. Issue #2486 adds
|
|
213
|
+
// `unsupported_dialog_layout`: a picker IS on screen but its layout
|
|
214
|
+
// could not be verified, and the server's message says what to do.
|
|
215
|
+
const refusedBeforeSending = reason === 'unresolvable_answer' ||
|
|
216
|
+
reason === 'answer_out_of_range' ||
|
|
217
|
+
reason === 'unsupported_dialog_layout';
|
|
214
218
|
// Issue #1898: the verdict was addressed to the agent's own API and
|
|
215
219
|
// the POST did not land. Distinct from the two above — the answer was
|
|
216
220
|
// resolved and an attempt was made — and distinct from a keystroke,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/send.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/send.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+MpC,wBAAgB,iBAAiB,IAAI,OAAO,CA0P3C"}
|
|
@@ -18,6 +18,16 @@ const instances_1 = require("./instances");
|
|
|
18
18
|
const relays_1 = require("./relays");
|
|
19
19
|
/** Auto-yes duration used when --duration is omitted. */
|
|
20
20
|
const DEFAULT_AUTO_YES_DURATION = '1h';
|
|
21
|
+
/**
|
|
22
|
+
* The message length `send` is verified to deliver whole (Issue #2464): the
|
|
23
|
+
* largest body sent through the paste path to claude, codex, command-code and
|
|
24
|
+
* antigravity and found byte-identical in each tool's own transcript
|
|
25
|
+
* (`docs/design/2464-long-body-repro-matrix.md`). Stated in `--help` so a
|
|
26
|
+
* caller can choose "put it in a file" instead. A documented guarantee, not an
|
|
27
|
+
* enforced cap: a longer message takes the same path and the same check.
|
|
28
|
+
*/
|
|
29
|
+
const SEND_VERIFIED_MAX_KIB = 48;
|
|
30
|
+
const SEND_VERIFIED_MAX_LINES = 240;
|
|
21
31
|
/**
|
|
22
32
|
* Code the send API returns when the session is blocked on a prompt (Issue
|
|
23
33
|
* #1708). Mirrors PROMPT_WAITING_CODE in src/lib/session/prompt-waiting-guard.ts;
|
|
@@ -172,6 +182,14 @@ no pane to scrape. Watch it with \`commandmate relays\`, withdraw it with
|
|
|
172
182
|
Exit 2 when the relay is refused: you are answering a relayed message already
|
|
173
183
|
(pass --allow-relay-chain), the chain would exceed 3 hops, or an open relay
|
|
174
184
|
between these two sessions exists. Nothing is sent in that case.
|
|
185
|
+
|
|
186
|
+
Message length (Issue #2464): up to ${SEND_VERIFIED_MAX_KIB} KiB and ${SEND_VERIFIED_MAX_LINES} lines is verified
|
|
187
|
+
to arrive whole on claude, codex, command-code and antigravity. A message over
|
|
188
|
+
512 bytes is pasted into the agent's composer as one bracketed paste, and Enter
|
|
189
|
+
waits until the composer shows all of it. If it never does, nothing is
|
|
190
|
+
submitted and send exits 99 with "Message body did not arrive intact" -- it
|
|
191
|
+
does not print "Message sent.". For a longer brief, write it to a file in the
|
|
192
|
+
worktree and send a short message that tells the agent to read that file.
|
|
175
193
|
`)
|
|
176
194
|
.action(async (worktreeId, message, options) => {
|
|
177
195
|
try {
|
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
* selection lists — Issue #1628 — and interactive frames the detection
|
|
9
9
|
* layer could not classify at all — Issue #1708. Both are reported as
|
|
10
10
|
* exit 10 with a distinguishing `type` rather than a new exit code, so
|
|
11
|
-
* callers that already branch on 10 keep working.
|
|
11
|
+
* callers that already branch on 10 keep working. Issue #2463: a prompt
|
|
12
|
+
* the target's own Auto-Yes is answering is held for --auto-yes-grace
|
|
13
|
+
* seconds before it is reported.)
|
|
12
14
|
* - 11: UPSTREAM_FAULT (--fail-on-upstream-fault only, Issue #1839: the agent
|
|
13
15
|
* came back to its composer with an upstream API failure on the frame)
|
|
14
16
|
* - 124: TIMEOUT (--timeout exceeded)
|
|
@@ -48,6 +50,18 @@ import { ApiClient } from '../utils/api-client';
|
|
|
48
50
|
* `"paths": {}`), so the test is the only thing holding the two together.
|
|
49
51
|
*/
|
|
50
52
|
export declare const TURN_OPENING_EVENT_TYPES: ReadonlySet<string>;
|
|
53
|
+
/**
|
|
54
|
+
* {@link pollWorktree}'s options: {@link WaitOptions} plus the Auto-Yes grace
|
|
55
|
+
* (Issue #2463).
|
|
56
|
+
*/
|
|
57
|
+
export interface PollWorktreeOptions extends WaitOptions {
|
|
58
|
+
/**
|
|
59
|
+
* `--auto-yes-grace`, in seconds; 0 turns the hold off. Absent means
|
|
60
|
+
* {@link AUTO_YES_GRACE_DEFAULT_SECONDS}, which is what `ask` gets: it calls
|
|
61
|
+
* {@link pollWorktree} without the flag.
|
|
62
|
+
*/
|
|
63
|
+
autoYesGrace?: number;
|
|
64
|
+
}
|
|
51
65
|
/**
|
|
52
66
|
* Poll a single worktree until completion, prompt, or timeout.
|
|
53
67
|
*
|
|
@@ -56,12 +70,13 @@ export declare const TURN_OPENING_EVENT_TYPES: ReadonlySet<string>;
|
|
|
56
70
|
* `send` + `wait` + "read the reply", and a private copy of the turn-boundary
|
|
57
71
|
* rules here (#1839's `basis`, #1975's unanswered-prompt hold, #1708's
|
|
58
72
|
* unclassified dwell) is a copy that would drift into reporting a completion
|
|
59
|
-
* this one refuses.
|
|
73
|
+
* this one refuses. #2463's Auto-Yes hold is shared the same way: `ask` passes
|
|
74
|
+
* no `autoYesGrace` and holds for the default.
|
|
60
75
|
*
|
|
61
76
|
* `options.instance` must already be a resolved instance ID — see
|
|
62
77
|
* {@link resolveWaitInstance}.
|
|
63
78
|
*/
|
|
64
|
-
export declare function pollWorktree(client: ApiClient, worktreeId: string, options:
|
|
79
|
+
export declare function pollWorktree(client: ApiClient, worktreeId: string, options: PollWorktreeOptions): Promise<{
|
|
65
80
|
exitCode: number;
|
|
66
81
|
output?: WaitPromptOutput;
|
|
67
82
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAMV,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAA+B,MAAM,qBAAqB,CAAC;AAwD7E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAIvD,CAAC;AA2dH;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAwCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAqb1D;AAwKD,wBAAgB,iBAAiB,IAAI,OAAO,CAsL3C"}
|