commandmate 0.30.1 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +164 -164
- package/.next/app-path-routes-manifest.json +28 -28
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/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 +3 -3
- 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 +4 -4
- 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 +1 -1
- 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/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.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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.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/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_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 +4 -3
- 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 +4 -3
- 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.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.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_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.js +2 -2
- package/.next/server/app/chat/page.js.nft.json +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.js +2 -2
- package/.next/server/app/more/page.js.nft.json +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.js.nft.json +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.js +2 -2
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +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 +2 -2
- 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.js +2 -2
- package/.next/server/app/skills/installed/page.js.nft.json +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.js +1 -1
- package/.next/server/app/skills/page.js.nft.json +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 +10 -10
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +28 -28
- package/.next/server/chunks/1058.js +1 -1
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1262.js +1 -1
- package/.next/server/chunks/1886.js +3 -3
- package/.next/server/chunks/1990.js +103 -0
- package/.next/server/chunks/2119.js +1 -1
- 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/261.js +1 -1
- package/.next/server/chunks/3123.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3480.js +5 -4
- package/.next/server/chunks/4299.js +1 -1
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/4443.js +1 -5
- package/.next/server/chunks/5017.js +1 -1
- package/.next/server/chunks/5043.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/552.js +2 -2
- package/.next/server/chunks/6072.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/663.js +4 -3
- package/.next/server/chunks/6894.js +2 -2
- package/.next/server/chunks/7187.js +1 -0
- package/.next/server/chunks/7472.js +1 -1
- package/.next/server/chunks/{880.js → 7859.js} +6 -6
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8800.js +2 -2
- package/.next/server/chunks/8918.js +7 -0
- package/.next/server/chunks/9123.js +2 -2
- package/.next/server/chunks/9130.js +4 -4
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/9696.js +2 -2
- package/.next/server/chunks/9798.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/1783-11c9b4d8a52ebd91.js +1 -0
- package/.next/static/chunks/4718-de1224c9e8a6e7fc.js +1 -0
- package/.next/static/chunks/6022-2fa0b5a82d4ce7b6.js +1 -0
- package/.next/static/chunks/{5229-6c89475b61bd2c8b.js → 6170-951b9f5fe6b4b3b5.js} +1 -1
- package/.next/static/chunks/app/chat/{page-9aa2011410895b0d.js → page-37d7615d17d7e2a0.js} +1 -1
- package/.next/static/chunks/app/layout-4c2f21e3f653ee4c.js +1 -0
- package/.next/static/chunks/app/more/{page-333bba1c8bbc9c11.js → page-353a3924e6d7968e.js} +1 -1
- package/.next/static/chunks/app/{page-214f7ffa13a0cf10.js → page-c2bf871d953a1d6f.js} +1 -1
- package/.next/static/chunks/app/repositories/{page-4951cac905e50224.js → page-7d0f26df0537254c.js} +1 -1
- package/.next/static/chunks/app/review/{page-a0899b2d285318c3.js → page-e3f141b2829973e9.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-fb36145ec732092a.js → page-53f188ed9ca49e5f.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/{page-9099e26b60442873.js → page-80569b720aea59cc.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-182e32368696d824.js → page-dbd2690ad72da95b.js} +1 -1
- package/.next/static/chunks/app/skills/{page-d3fdc88239ebe0ab.js → page-dacd36f9c11aa7da.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-97205088520255a5.js +1 -0
- package/.next/static/css/5c13ea243dfdcb66.css +1 -0
- package/.next/trace +13 -13
- package/README.md +37 -11
- package/dist/cli/commands/attach.d.ts +50 -0
- package/dist/cli/commands/attach.d.ts.map +1 -0
- package/dist/cli/commands/attach.js +204 -0
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +114 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +23 -2
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +41 -1
- package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
- package/dist/cli/config/cli-dependencies.js +34 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +5 -0
- package/dist/cli/types/index.d.ts +36 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/config/tmux-pane-config.d.ts +153 -0
- package/dist/config/tmux-pane-config.d.ts.map +1 -0
- package/dist/config/tmux-pane-config.js +172 -0
- package/dist/lib/cli-tools/session-name.d.ts +44 -0
- package/dist/lib/cli-tools/session-name.d.ts.map +1 -0
- package/dist/lib/cli-tools/session-name.js +57 -0
- package/dist/lib/cli-tools/types.d.ts +1 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/cli-tools/types.js +6 -1
- package/dist/lib/cli-tools/validation.d.ts +34 -0
- package/dist/lib/cli-tools/validation.d.ts.map +1 -0
- package/dist/lib/cli-tools/validation.js +41 -0
- package/dist/lib/detection/status-reason.d.ts +18 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +18 -0
- package/dist/lib/detection/tools/verified-against.d.ts +57 -7
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +59 -8
- package/dist/lib/detection/version-probes.d.ts +26 -5
- package/dist/lib/detection/version-probes.d.ts.map +1 -1
- package/dist/lib/detection/version-probes.js +28 -6
- package/dist/lib/session/tmux-session-surface.d.ts +369 -0
- package/dist/lib/session/tmux-session-surface.d.ts.map +1 -0
- package/dist/lib/session/tmux-session-surface.js +525 -0
- package/dist/server/src/config/cli-tool-timing-config.js +12 -1
- package/dist/server/src/config/detection-evidence-config.js +5 -0
- package/dist/server/src/config/schedule-config.js +28 -1
- package/dist/server/src/lib/cli-tools/antigravity.js +2 -2
- package/dist/server/src/lib/cli-tools/base.js +13 -8
- package/dist/server/src/lib/cli-tools/claude.js +20 -0
- package/dist/server/src/lib/cli-tools/codex.js +205 -61
- package/dist/server/src/lib/cli-tools/command-code.js +349 -0
- package/dist/server/src/lib/cli-tools/composer-spec.js +6 -0
- package/dist/server/src/lib/cli-tools/copilot.js +2 -2
- package/dist/server/src/lib/cli-tools/gemini.js +2 -2
- package/dist/server/src/lib/cli-tools/graceful-exit.js +16 -1
- package/dist/server/src/lib/cli-tools/index.js +4 -1
- package/dist/server/src/lib/cli-tools/install-hints.js +131 -0
- package/dist/server/src/lib/cli-tools/liveness-spec.js +18 -0
- package/dist/server/src/lib/cli-tools/manager.js +2 -0
- package/dist/server/src/lib/cli-tools/opencode.js +2 -2
- package/dist/server/src/lib/cli-tools/start-availability.js +18 -11
- package/dist/server/src/lib/cli-tools/types.js +6 -1
- package/dist/server/src/lib/cli-tools/vibe-local.js +2 -2
- package/dist/server/src/lib/cmate-parser.js +6 -0
- package/dist/server/src/lib/detection/cli-patterns.js +441 -8
- package/dist/server/src/lib/detection/opencode-modal-overlay.js +66 -100
- package/dist/server/src/lib/detection/selection-shape.js +341 -0
- package/dist/server/src/lib/detection/sgr-background.js +210 -0
- package/dist/server/src/lib/detection/status-detector.js +6 -0
- package/dist/server/src/lib/detection/status-reason.js +18 -0
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -15
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +392 -0
- package/dist/server/src/lib/detection/tools/codex/detect.js +83 -2
- package/dist/server/src/lib/detection/tools/command-code/detect.js +159 -0
- package/dist/server/src/lib/detection/tools/registry.js +6 -4
- package/dist/server/src/lib/detection/tools/verified-against.js +59 -8
- package/dist/server/src/lib/detection/version-probes.js +28 -6
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +101 -21
- package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +39 -0
- package/dist/server/src/lib/hooks/sources/claude/history.js +245 -21
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +175 -13
- package/dist/server/src/lib/hooks/sources/codex/history.js +84 -15
- package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +130 -17
- package/dist/server/src/lib/hooks/sources/codex/relay-install.js +145 -0
- package/dist/server/src/lib/hooks/sources/command-code/history.js +865 -0
- package/dist/server/src/lib/hooks/sources/command-code/hooks-config.js +390 -0
- package/dist/server/src/lib/hooks/sources/command-code/source.js +290 -0
- package/dist/server/src/lib/hooks/sources/command-code/tool-id.js +18 -0
- package/dist/server/src/lib/hooks/sources/command-code/transcript.js +604 -0
- package/dist/server/src/lib/hooks/sources/index.js +3 -1
- package/dist/server/src/lib/hooks/sources/opencode/history.js +57 -3
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +24 -28
- package/dist/server/src/lib/hooks/sources/registry.js +4 -0
- package/dist/server/src/lib/hooks/sources/turn-body.js +77 -19
- package/dist/server/src/lib/hooks/stop-history-capture.js +58 -25
- package/dist/server/src/lib/job-executor.js +12 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +6 -0
- package/dist/server/src/lib/polling/response-checker.js +112 -7
- package/dist/server/src/lib/polling/structured-history-gate.js +15 -8
- package/dist/server/src/lib/realtime/types.js +15 -5
- package/dist/server/src/lib/response-cleaner.js +24 -1
- package/dist/server/src/lib/response-extractor.js +11 -0
- package/dist/server/src/lib/session/claude-executor.js +223 -4
- package/dist/server/src/lib/session/cli-session.js +52 -0
- package/dist/server/src/lib/session/tmux-session-surface.js +525 -0
- package/dist/server/src/lib/skills/compatibility-matrix.js +117 -1
- package/dist/server/src/lib/tmux/geometry-delegation.js +143 -0
- package/dist/server/src/lib/tmux/read-mode-pager.js +76 -10
- package/dist/server/src/lib/tmux/read-mode.js +44 -2
- package/dist/server/src/lib/tmux/session-hook-scripts.js +249 -0
- package/dist/server/src/lib/tmux/session-hooks.js +122 -0
- package/dist/server/src/lib/tmux/session-status-options.js +213 -0
- package/dist/server/src/lib/tmux/tmux.js +79 -2
- package/dist/server/src/lib/version-checker.js +110 -0
- package/dist/server/src/lib/ws-server.js +16 -10
- package/dist/server/src/types/agent-transcript.js +73 -1
- package/dist/server/src/types/terminal-keys.js +131 -3
- package/dist/types/terminal-keys.d.ts +100 -3
- package/dist/types/terminal-keys.d.ts.map +1 -1
- package/dist/types/terminal-keys.js +131 -3
- package/package.json +1 -1
- package/.next/server/chunks/3099.js +0 -5
- package/.next/server/chunks/7824.js +0 -1
- package/.next/static/chunks/3916-0e929d089282dc5d.js +0 -1
- package/.next/static/chunks/6022-7a7d1760fc9814c7.js +0 -1
- package/.next/static/chunks/6381-dbf04a99647f6018.js +0 -1
- package/.next/static/chunks/app/layout-6a26ea22d5cf03dc.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-aac399392ec8c273.js +0 -1
- package/.next/static/css/23f9c40ecc458c77.css +0 -1
- /package/.next/static/{pcpB4K6KreMzu2qbhvuRY → nXW4dPkpE_9xUf_9ySRff}/_buildManifest.js +0 -0
- /package/.next/static/{pcpB4K6KreMzu2qbhvuRY → nXW4dPkpE_9xUf_9ySRff}/_ssgManifest.js +0 -0
|
@@ -98,6 +98,21 @@ const MEASURED_DATE_2026_07_26 = '2026-07-26';
|
|
|
98
98
|
*/
|
|
99
99
|
const OPENCODE_EVIDENCE_SOURCE = 'https://github.com/Kewton/CommandMate/blob/main/docs/design/opencode-server-live-verification.md#11-issue-2036--2037-opencode-11822-2026-08-25';
|
|
100
100
|
const MEASURED_DATE_2026_08_25 = '2026-08-25';
|
|
101
|
+
/**
|
|
102
|
+
* Evidence reference for the Command Code 1.49.0 measurement (Issue #2302).
|
|
103
|
+
*
|
|
104
|
+
* The reference doc carries the harness, both controls and the raw CLI output,
|
|
105
|
+
* which is the half of a row a reader can actually check.
|
|
106
|
+
*/
|
|
107
|
+
const COMMAND_CODE_EVIDENCE_SOURCE = 'https://github.com/Kewton/CommandMate/blob/main/docs/reference/skill-agent-compatibility.md#8-command-code-probe-log-issue-2302';
|
|
108
|
+
const MEASURED_DATE_2026_09_05 = '2026-09-05';
|
|
109
|
+
/**
|
|
110
|
+
* Evidence reference for the Copilot 1.0.83 measurement (Issue #2302).
|
|
111
|
+
*
|
|
112
|
+
* The same probe log also carries a Gemini 0.58.0 discovery measurement that is
|
|
113
|
+
* deliberately *not* recorded as a row — see the `gemini` entry below.
|
|
114
|
+
*/
|
|
115
|
+
const OTHER_AGENTS_EVIDENCE_SOURCE = 'https://github.com/Kewton/CommandMate/blob/main/docs/reference/skill-agent-compatibility.md#9-gemini--copilot-probe-log-issue-2302';
|
|
101
116
|
function unmeasuredEntry(agent) {
|
|
102
117
|
return {
|
|
103
118
|
agent,
|
|
@@ -180,6 +195,16 @@ const AGENT_DISCOVERY_MATRIX = [
|
|
|
180
195
|
reloadKey: exports.AGENT_RELOAD_MESSAGE_KEYS.SESSION_RESTART_NO_SLASH,
|
|
181
196
|
skipReasonKey: null,
|
|
182
197
|
},
|
|
198
|
+
// Issue #2302 *did* measure gemini 0.58.0 — `gemini skills list --all`
|
|
199
|
+
// returns `.agents/skills` with an absolute path, and `.claude/skills`
|
|
200
|
+
// planted at the same moment does not appear. It is still recorded as
|
|
201
|
+
// unmeasured here, on purpose: the invocation axis could not be measured at
|
|
202
|
+
// all (sign-in fails with "This client is no longer supported for Gemini Code
|
|
203
|
+
// Assist for individuals", so the TUI never reaches a composer), and landing
|
|
204
|
+
// the half-row is a change to `tests/integration/skills-agent-discovery-probe.test.ts`,
|
|
205
|
+
// which pins gemini as its example of an Agent with no measurement. The
|
|
206
|
+
// probe log is kept so the next pass starts from evidence rather than zero:
|
|
207
|
+
// `docs/reference/skill-agent-compatibility.md` §9.1.
|
|
183
208
|
unmeasuredEntry('gemini'),
|
|
184
209
|
unmeasuredEntry('vibe-local'),
|
|
185
210
|
{
|
|
@@ -224,11 +249,102 @@ const AGENT_DISCOVERY_MATRIX = [
|
|
|
224
249
|
reloadKey: exports.AGENT_RELOAD_MESSAGE_KEYS.SESSION_RESTART,
|
|
225
250
|
skipReasonKey: null,
|
|
226
251
|
},
|
|
227
|
-
|
|
252
|
+
{
|
|
253
|
+
agent: 'copilot',
|
|
254
|
+
// Issue #2302, GitHub Copilot CLI 1.0.83. The only Agent so far measured to
|
|
255
|
+
// read *both* CommandMate install roots from one listing: `copilot skill
|
|
256
|
+
// list` returns `.github/skills` (positive control), `.agents/skills` and
|
|
257
|
+
// `.claude/skills`, and the byte-identical dual-root install appears once
|
|
258
|
+
// rather than twice.
|
|
259
|
+
//
|
|
260
|
+
// `copilot skill --help` claims those roots too. That claim is not the
|
|
261
|
+
// evidence — the probe Skills are, one per root with its own token.
|
|
262
|
+
discoveryRoots: [constants_1.SKILL_INSTALL_ROOT_PREFIX, constants_1.SKILL_CLAUDE_INSTALL_ROOT_PREFIX],
|
|
263
|
+
discovery: {
|
|
264
|
+
outcome: 'verified',
|
|
265
|
+
evidenceKind: 'mechanical',
|
|
266
|
+
labelKey: exports.AGENT_AXIS_OUTCOME_LABEL_KEYS.verified,
|
|
267
|
+
evidenceKindKey: exports.AGENT_EVIDENCE_KIND_LABEL_KEYS.mechanical,
|
|
268
|
+
limitationKey: null,
|
|
269
|
+
},
|
|
270
|
+
invocation: {
|
|
271
|
+
// Typing `/probe` in Copilot's own composer offers all four planted
|
|
272
|
+
// Skills, `.claude/skills` included. Controls: `/zzzznotacommand` matched
|
|
273
|
+
// nothing and `/hel` matched the built-in commands, so the palette was
|
|
274
|
+
// filtering rather than listing everything.
|
|
275
|
+
//
|
|
276
|
+
// Measured at the palette, which is what this axis is — the same standard
|
|
277
|
+
// the Claude row was measured to. The model was not signed in during the
|
|
278
|
+
// probe, so a Skill actually running end to end is *not* claimed here.
|
|
279
|
+
outcome: 'verified',
|
|
280
|
+
evidenceKind: 'mechanical',
|
|
281
|
+
labelKey: exports.AGENT_AXIS_OUTCOME_LABEL_KEYS.verified,
|
|
282
|
+
evidenceKindKey: exports.AGENT_EVIDENCE_KIND_LABEL_KEYS.mechanical,
|
|
283
|
+
limitationKey: null,
|
|
284
|
+
},
|
|
285
|
+
testedVersion: '1.0.83',
|
|
286
|
+
testedDate: MEASURED_DATE_2026_09_05,
|
|
287
|
+
evidenceSource: OTHER_AGENTS_EVIDENCE_SOURCE,
|
|
288
|
+
// Whether a Skill added mid-session is picked up was not measured.
|
|
289
|
+
reloadKey: exports.AGENT_RELOAD_MESSAGE_KEYS.UNKNOWN,
|
|
290
|
+
skipReasonKey: null,
|
|
291
|
+
},
|
|
228
292
|
// CommandMate's own slash palette serves `.agents/skills` entries to
|
|
229
293
|
// antigravity sessions (#1504). That is CommandMate injecting a command, not
|
|
230
294
|
// the Agent discovering a Skill, so it is not evidence for this table.
|
|
231
295
|
unmeasuredEntry('antigravity'),
|
|
296
|
+
{
|
|
297
|
+
agent: 'command-code',
|
|
298
|
+
// Issue #2250 left this row unmeasured; Issue #2302 measured it on 1.49.0.
|
|
299
|
+
//
|
|
300
|
+
// Of CommandMate's two install roots, Command Code reads `.agents/skills`
|
|
301
|
+
// and does not read `.claude/skills`. `cmd skills list -d` names the roots
|
|
302
|
+
// it looks in — project `.commandcode/skills` and `.agents/skills`, the same
|
|
303
|
+
// pair under `$HOME` — and `.claude/skills` is not among them. A probe Skill
|
|
304
|
+
// was planted in each root at the same moment, so the split is the Agent's
|
|
305
|
+
// and not the install's: `.commandcode/skills` is the positive control and
|
|
306
|
+
// came back listed, `.claude/skills` is the negative control and did not.
|
|
307
|
+
//
|
|
308
|
+
// The dual-root install (#1460) is therefore half-read and still correct:
|
|
309
|
+
// one byte-identical payload in both roots is listed exactly once, from
|
|
310
|
+
// `.agents/skills`. Naming the unread root here would render as "installed
|
|
311
|
+
// and invisible" for anyone reading the table to decide where to look.
|
|
312
|
+
discoveryRoots: [constants_1.SKILL_INSTALL_ROOT_PREFIX],
|
|
313
|
+
discovery: {
|
|
314
|
+
outcome: 'verified',
|
|
315
|
+
evidenceKind: 'mechanical',
|
|
316
|
+
labelKey: exports.AGENT_AXIS_OUTCOME_LABEL_KEYS.verified,
|
|
317
|
+
evidenceKindKey: exports.AGENT_EVIDENCE_KIND_LABEL_KEYS.mechanical,
|
|
318
|
+
limitationKey: null,
|
|
319
|
+
},
|
|
320
|
+
invocation: {
|
|
321
|
+
// The axis codex and opencode both fail, and Command Code passes: typing
|
|
322
|
+
// `/probe` in its own composer offers the installed Skills as `[skill]`
|
|
323
|
+
// rows, and `/skills` lists them under "Project skills" with an
|
|
324
|
+
// `[.agents]` badge. So no limitation is attached here — CommandMate's
|
|
325
|
+
// palette is a convenience for this Agent, not the only route in.
|
|
326
|
+
//
|
|
327
|
+
// Headless is where it was machine-checked: `cmd -p "/<name>"` emits
|
|
328
|
+
// `{"type":"skill_loaded","name":"<name>"}` before the run starts and the
|
|
329
|
+
// model then answers the Skill's token. `--no-skills` is the control that
|
|
330
|
+
// makes that event mean discovery rather than prompt text — same prompt,
|
|
331
|
+
// no event.
|
|
332
|
+
outcome: 'verified',
|
|
333
|
+
evidenceKind: 'mechanical',
|
|
334
|
+
labelKey: exports.AGENT_AXIS_OUTCOME_LABEL_KEYS.verified,
|
|
335
|
+
evidenceKindKey: exports.AGENT_EVIDENCE_KIND_LABEL_KEYS.mechanical,
|
|
336
|
+
limitationKey: null,
|
|
337
|
+
},
|
|
338
|
+
testedVersion: '1.49.0',
|
|
339
|
+
testedDate: MEASURED_DATE_2026_09_05,
|
|
340
|
+
evidenceSource: COMMAND_CODE_EVIDENCE_SOURCE,
|
|
341
|
+
// Also measured: a Skill planted into a *running* session shows up in the
|
|
342
|
+
// `/skills` picker, which rescans when opened, but not in the composer's
|
|
343
|
+
// slash completion, which is built once at session start. A restart is what
|
|
344
|
+
// makes both agree, so that is the instruction.
|
|
345
|
+
reloadKey: exports.AGENT_RELOAD_MESSAGE_KEYS.SESSION_RESTART,
|
|
346
|
+
skipReasonKey: null,
|
|
347
|
+
},
|
|
232
348
|
];
|
|
233
349
|
/** The measured matrix, in CLI-tool declaration order. */
|
|
234
350
|
function getSkillAgentMatrix() {
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Phase D of Issue #2317, server side: knowing when a human owns the geometry.
|
|
4
|
+
*
|
|
5
|
+
* `commandmate attach --live` hands a session's window from the pinned
|
|
6
|
+
* 200x1000 canvas to the attached terminal (`window-size latest`) so the agent
|
|
7
|
+
* re-lays-out and the transcript is actually readable, then pins it back on
|
|
8
|
+
* detach. While that handover is in force the session carries `@cm_delegated=1`,
|
|
9
|
+
* and the server has to behave differently in exactly two places:
|
|
10
|
+
*
|
|
11
|
+
* 1. **`reconcileSessionGeometry` must not resize.** Every `send` to a live
|
|
12
|
+
* session reaches `reconcileExistingSession()`, which would snap the window
|
|
13
|
+
* back to 200x1000 mid-read — the #1623 rejection note assumed this happened
|
|
14
|
+
* on every send and it does not, but it does happen on a session restart and
|
|
15
|
+
* on the reuse path, which is enough to break a delegated read.
|
|
16
|
+
* 2. **The poller must not save a scraped reply.** At 44 rows the frame is a
|
|
17
|
+
* fraction of the turn, and every extraction rule in `response-checker` was
|
|
18
|
+
* measured against the 1000-row canvas. claude — the only tool `--live`
|
|
19
|
+
* accepts — writes its History from its own transcript JSONL, so suppressing
|
|
20
|
+
* the scrape loses nothing and prevents a truncated reply being recorded.
|
|
21
|
+
*
|
|
22
|
+
* ## Why the flag is read from tmux rather than held in memory
|
|
23
|
+
*
|
|
24
|
+
* The delegation is performed by the CLI process (`commandmate attach --live`),
|
|
25
|
+
* which is not the server. The tmux session is the only thing both of them can
|
|
26
|
+
* see, and a user option on it is the cheapest shared channel that survives the
|
|
27
|
+
* CLI exiting, the server restarting, and a `client-detached` hook firing when
|
|
28
|
+
* neither is watching.
|
|
29
|
+
*
|
|
30
|
+
* ## Why the read is cached
|
|
31
|
+
*
|
|
32
|
+
* `checkForResponse` runs about every two seconds per active session. A
|
|
33
|
+
* `show-options` per poll would be one extra tmux round-trip per session per
|
|
34
|
+
* poll for a value that changes twice a day, so reads are memoised for
|
|
35
|
+
* {@link DELEGATION_TTL_MS}. The TTL is short enough that the restore edge is
|
|
36
|
+
* observed within one poll of the detach.
|
|
37
|
+
*/
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.DELEGATION_TTL_MS = void 0;
|
|
40
|
+
exports.isGeometryDelegated = isGeometryDelegated;
|
|
41
|
+
exports.probeGeometryDelegation = probeGeometryDelegation;
|
|
42
|
+
exports.hasHumanClientAttached = hasHumanClientAttached;
|
|
43
|
+
exports.forgetGeometryDelegation = forgetGeometryDelegation;
|
|
44
|
+
exports.resetGeometryDelegationState = resetGeometryDelegationState;
|
|
45
|
+
const child_process_1 = require("child_process");
|
|
46
|
+
const util_1 = require("util");
|
|
47
|
+
const tmux_session_surface_1 = require("../session/tmux-session-surface");
|
|
48
|
+
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
49
|
+
/** tmux calls here are interactive-latency, not long-running. */
|
|
50
|
+
const TMUX_TIMEOUT = 5000;
|
|
51
|
+
/**
|
|
52
|
+
* How long a delegation read is reused.
|
|
53
|
+
*
|
|
54
|
+
* One second, against a ~2s poll: short enough that the poll after a detach sees
|
|
55
|
+
* the restore, long enough that the several readers of one session in one poll
|
|
56
|
+
* (the status helper, the response checker) share a single tmux round-trip.
|
|
57
|
+
*/
|
|
58
|
+
exports.DELEGATION_TTL_MS = 1000;
|
|
59
|
+
const cache = globalThis.__cmGeometryDelegationCache ??
|
|
60
|
+
(globalThis.__cmGeometryDelegationCache = new Map());
|
|
61
|
+
const lastObserved = globalThis.__cmGeometryDelegationEdge ??
|
|
62
|
+
(globalThis.__cmGeometryDelegationEdge = new Map());
|
|
63
|
+
/**
|
|
64
|
+
* Whether `@cm_delegated` is set to `1` on a session.
|
|
65
|
+
*
|
|
66
|
+
* Never throws: a session that has gone away, or a tmux that is not running, is
|
|
67
|
+
* "not delegated" — the answer that leaves every caller on its normal path.
|
|
68
|
+
*
|
|
69
|
+
* @param sessionName - Target session
|
|
70
|
+
* @param now - Epoch ms, injectable for tests
|
|
71
|
+
*/
|
|
72
|
+
async function isGeometryDelegated(sessionName, now = Date.now()) {
|
|
73
|
+
const cached = cache.get(sessionName);
|
|
74
|
+
if (cached && now - cached.readAt < exports.DELEGATION_TTL_MS)
|
|
75
|
+
return cached.delegated;
|
|
76
|
+
let delegated = false;
|
|
77
|
+
try {
|
|
78
|
+
const { stdout } = await execFileAsync('tmux', (0, tmux_session_surface_1.buildShowSessionOptionValueArgs)(sessionName, tmux_session_surface_1.CM_DELEGATED_OPTION), { timeout: TMUX_TIMEOUT });
|
|
79
|
+
delegated = stdout.trim() === '1';
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// THE ORDINARY CASE, not an error path. Measured on tmux 3.5a: asking for a
|
|
83
|
+
// user option a session does not carry exits NON-ZERO with
|
|
84
|
+
// `invalid option: @cm_delegated` — it is not an empty string and it is not
|
|
85
|
+
// exit 0. So "this session has never been delegated" arrives here, and it
|
|
86
|
+
// arrives here on every poll of every session, which is why nothing is
|
|
87
|
+
// logged. A session that is gone, and a tmux that is not running, land in
|
|
88
|
+
// the same place and mean the same thing.
|
|
89
|
+
delegated = false;
|
|
90
|
+
}
|
|
91
|
+
cache.set(sessionName, { delegated, readAt: now });
|
|
92
|
+
return delegated;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Read the delegation flag and report the release edge.
|
|
96
|
+
*
|
|
97
|
+
* The edge is what the poller needs: on restore the pane goes back to 1000 rows,
|
|
98
|
+
* so a `last_captured_line` recorded against a 44-row frame indexes into
|
|
99
|
+
* nothing. Resetting the cursor at that moment is what closes both the
|
|
100
|
+
* double-save window (a cursor too low re-saves) and the never-save window (a
|
|
101
|
+
* cursor too high suppresses forever).
|
|
102
|
+
*
|
|
103
|
+
* @param sessionName - Target session
|
|
104
|
+
* @param now - Epoch ms, injectable for tests
|
|
105
|
+
*/
|
|
106
|
+
async function probeGeometryDelegation(sessionName, now = Date.now()) {
|
|
107
|
+
const delegated = await isGeometryDelegated(sessionName, now);
|
|
108
|
+
const previous = lastObserved.get(sessionName) ?? false;
|
|
109
|
+
lastObserved.set(sessionName, delegated);
|
|
110
|
+
return { delegated, released: previous && !delegated };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Whether any NON-control-mode client is attached to the session.
|
|
114
|
+
*
|
|
115
|
+
* Used by `reconcileSessionGeometry` as the second half of its skip condition:
|
|
116
|
+
* `@cm_delegated` says "a `--live` attach is in force", this says "somebody is
|
|
117
|
+
* looking at it right now". A control-mode client — CommandMate's own transport
|
|
118
|
+
* — never counts, which is what keeps the server from treating its own
|
|
119
|
+
* connection as a reason to stop pinning the canvas.
|
|
120
|
+
*
|
|
121
|
+
* Never throws; an unreadable client list is "nobody is attached".
|
|
122
|
+
*/
|
|
123
|
+
async function hasHumanClientAttached(sessionName) {
|
|
124
|
+
try {
|
|
125
|
+
const { stdout } = await execFileAsync('tmux', (0, tmux_session_surface_1.buildListClientsArgs)(sessionName), {
|
|
126
|
+
timeout: TMUX_TIMEOUT,
|
|
127
|
+
});
|
|
128
|
+
return (0, tmux_session_surface_1.countHumanClients)(stdout) > 0;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** Drop every memo for a session — call when it is known to be gone. */
|
|
135
|
+
function forgetGeometryDelegation(sessionName) {
|
|
136
|
+
cache.delete(sessionName);
|
|
137
|
+
lastObserved.delete(sessionName);
|
|
138
|
+
}
|
|
139
|
+
/** Test seam: drop every memo, for suites that drive several sessions. */
|
|
140
|
+
function resetGeometryDelegationState() {
|
|
141
|
+
cache.clear();
|
|
142
|
+
lastObserved.clear();
|
|
143
|
+
}
|
|
@@ -112,18 +112,31 @@ exports.PAGER_SCRIPT_FILENAME = 'cm-read-pane.sh';
|
|
|
112
112
|
* stopped.
|
|
113
113
|
*/
|
|
114
114
|
exports.PAGER_SCRIPT = `#!/bin/sh
|
|
115
|
-
# CommandMate reading mode (Issue #1623) — generated file, edits are overwritten.
|
|
115
|
+
# CommandMate reading mode (Issue #1623; --follow added by #2317) — generated file, edits are overwritten.
|
|
116
116
|
#
|
|
117
117
|
# Renders the transcript of a CommandMate tmux session with layout-only blank rows
|
|
118
118
|
# squeezed away, so a pager lands on the composer instead of hundreds of rows of
|
|
119
119
|
# padding. Invoked by \`prefix+g\` through \`display-popup -E\`; also runnable by hand:
|
|
120
120
|
#
|
|
121
121
|
# sh ~/.commandmate/bin/${exports.PAGER_SCRIPT_FILENAME} mcbd-claude-my-worktree
|
|
122
|
+
# sh ~/.commandmate/bin/${exports.PAGER_SCRIPT_FILENAME} --follow mcbd-claude-my-worktree
|
|
122
123
|
#
|
|
123
|
-
#
|
|
124
|
+
# Without --follow the popup is a SNAPSHOT. Press the key again to refresh it.
|
|
125
|
+
# With --follow (Issue #2317 Phase C) it redraws every CM_READ_FOLLOW_INTERVAL
|
|
126
|
+
# seconds and closes on \`q\`. Neither mode alters the pane, the window or the
|
|
127
|
+
# session — the popup is per-client and leaves nothing behind when it closes.
|
|
124
128
|
set -u
|
|
125
129
|
|
|
126
|
-
|
|
130
|
+
FOLLOW=0
|
|
131
|
+
SESSION=""
|
|
132
|
+
for arg in "$@"; do
|
|
133
|
+
case "$arg" in
|
|
134
|
+
--follow|-f) FOLLOW=1 ;;
|
|
135
|
+
-*) ;;
|
|
136
|
+
*) if [ -z "$SESSION" ]; then SESSION="$arg"; fi ;;
|
|
137
|
+
esac
|
|
138
|
+
done
|
|
139
|
+
|
|
127
140
|
if [ -z "$SESSION" ]; then
|
|
128
141
|
SESSION=$(tmux display-message -p '#{session_name}' 2>/dev/null) || SESSION=""
|
|
129
142
|
fi
|
|
@@ -137,6 +150,65 @@ case "$LINES_BACK" in
|
|
|
137
150
|
''|*[!0-9]*) LINES_BACK=1000 ;;
|
|
138
151
|
esac
|
|
139
152
|
|
|
153
|
+
# LC_ALL is pinned for awk ONLY (not for less, which still renders UTF-8 box
|
|
154
|
+
# drawing in the user's locale). Under gawk in a UTF-8 locale, sprintf("%c",194)
|
|
155
|
+
# yields U+00C2 rather than the byte 0xC2 and the NBSP fold below silently stops
|
|
156
|
+
# matching. See SQUEEZE_AWK_LOCALE in read-mode-pager.ts.
|
|
157
|
+
cm_read_render() {
|
|
158
|
+
tmux capture-pane -pe -t "=$SESSION:" -S "-$LINES_BACK" -E - \\
|
|
159
|
+
| LC_ALL=${exports.SQUEEZE_AWK_LOCALE} awk '${exports.SQUEEZE_AWK_PROGRAM}'
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if [ "$FOLLOW" = "1" ]; then
|
|
163
|
+
INTERVAL="\${CM_READ_FOLLOW_INTERVAL:-2}"
|
|
164
|
+
case "$INTERVAL" in
|
|
165
|
+
''|*[!0-9]*) INTERVAL=2 ;;
|
|
166
|
+
esac
|
|
167
|
+
if [ "$INTERVAL" -lt 1 ]; then INTERVAL=1; fi
|
|
168
|
+
# The key check below waits 0.2s per tick (stty \`time 2\`), so one tick is a
|
|
169
|
+
# fifth of a second and the key is answered long before the next redraw.
|
|
170
|
+
TICKS=$((INTERVAL * 5))
|
|
171
|
+
|
|
172
|
+
OLD_STTY=$(stty -g 2>/dev/null) || OLD_STTY=""
|
|
173
|
+
cm_read_restore_tty() {
|
|
174
|
+
if [ -n "$OLD_STTY" ]; then stty "$OLD_STTY" 2>/dev/null || true; fi
|
|
175
|
+
printf '\\033[?25h'
|
|
176
|
+
}
|
|
177
|
+
trap 'cm_read_restore_tty' EXIT
|
|
178
|
+
trap 'cm_read_restore_tty; exit 0' INT TERM
|
|
179
|
+
# \`min 0 time 2\` is what makes a single-byte read non-blocking-with-a-deadline:
|
|
180
|
+
# it returns after 0.2s with nothing when no key was pressed. Without it the
|
|
181
|
+
# loop would either block forever on the key or busy-spin between redraws.
|
|
182
|
+
if [ -n "$OLD_STTY" ]; then stty -icanon -echo min 0 time 2 2>/dev/null || true; fi
|
|
183
|
+
printf '\\033[?25l'
|
|
184
|
+
|
|
185
|
+
ROWS=$(tput lines 2>/dev/null) || ROWS=40
|
|
186
|
+
case "$ROWS" in
|
|
187
|
+
''|*[!0-9]*) ROWS=40 ;;
|
|
188
|
+
esac
|
|
189
|
+
BODY_ROWS=$((ROWS - 2))
|
|
190
|
+
if [ "$BODY_ROWS" -lt 1 ]; then BODY_ROWS=1; fi
|
|
191
|
+
|
|
192
|
+
while :; do
|
|
193
|
+
FRAME=$(cm_read_render | tail -n "$BODY_ROWS")
|
|
194
|
+
printf '\\033[H\\033[2J%s\\n' "$FRAME"
|
|
195
|
+
printf '\\033[7m[CommandMate] following %s — press q to close\\033[0m' "$SESSION"
|
|
196
|
+
TICK=0
|
|
197
|
+
while [ "$TICK" -lt "$TICKS" ]; do
|
|
198
|
+
if [ -n "$OLD_STTY" ]; then
|
|
199
|
+
KEY=$(dd bs=1 count=1 2>/dev/null)
|
|
200
|
+
case "$KEY" in
|
|
201
|
+
q|Q) exit 0 ;;
|
|
202
|
+
esac
|
|
203
|
+
else
|
|
204
|
+
sleep 1
|
|
205
|
+
TICK="$TICKS"
|
|
206
|
+
fi
|
|
207
|
+
TICK=$((TICK + 1))
|
|
208
|
+
done
|
|
209
|
+
done
|
|
210
|
+
fi
|
|
211
|
+
|
|
140
212
|
if [ -n "\${CM_READ_PAGER:-}" ]; then
|
|
141
213
|
PAGER_CMD="$CM_READ_PAGER"
|
|
142
214
|
elif command -v less >/dev/null 2>&1; then
|
|
@@ -145,13 +217,7 @@ else
|
|
|
145
217
|
PAGER_CMD="cat"
|
|
146
218
|
fi
|
|
147
219
|
|
|
148
|
-
|
|
149
|
-
# drawing in the user's locale). Under gawk in a UTF-8 locale, sprintf("%c",194)
|
|
150
|
-
# yields U+00C2 rather than the byte 0xC2 and the NBSP fold below silently stops
|
|
151
|
-
# matching. See SQUEEZE_AWK_LOCALE in read-mode-pager.ts.
|
|
152
|
-
tmux capture-pane -pe -t "=$SESSION:" -S "-$LINES_BACK" -E - \\
|
|
153
|
-
| LC_ALL=${exports.SQUEEZE_AWK_LOCALE} awk '${exports.SQUEEZE_AWK_PROGRAM}' \\
|
|
154
|
-
| $PAGER_CMD
|
|
220
|
+
cm_read_render | $PAGER_CMD
|
|
155
221
|
|
|
156
222
|
# Without a pager the popup would close before anything could be read.
|
|
157
223
|
if [ "$PAGER_CMD" = "cat" ]; then
|
|
@@ -45,9 +45,11 @@
|
|
|
45
45
|
* (`CM_READ_MODE=off` + restart), not a shutdown side effect.
|
|
46
46
|
*/
|
|
47
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
exports.DEFAULT_READ_MODE_KEY = exports.MCBD_SESSION_PREFIX = void 0;
|
|
48
|
+
exports.READ_MODE_FOLLOW_ENV = exports.DEFAULT_READ_MODE_KEY = exports.MCBD_SESSION_PREFIX = void 0;
|
|
49
49
|
exports.getPagerScriptPath = getPagerScriptPath;
|
|
50
50
|
exports.isReadModeEnabled = isReadModeEnabled;
|
|
51
|
+
exports.isReadModeFollowEnabled = isReadModeFollowEnabled;
|
|
52
|
+
exports.buildPopupCommand = buildPopupCommand;
|
|
51
53
|
exports.resolveReadModeKey = resolveReadModeKey;
|
|
52
54
|
exports.quoteForTmuxCommand = quoteForTmuxCommand;
|
|
53
55
|
exports.buildBindKeyArgs = buildBindKeyArgs;
|
|
@@ -79,6 +81,26 @@ const TMUX_TIMEOUT = 5000;
|
|
|
79
81
|
exports.MCBD_SESSION_PREFIX = 'mcbd-';
|
|
80
82
|
/** Key bound under the prefix table when `CM_READ_MODE_KEY` is unset. */
|
|
81
83
|
exports.DEFAULT_READ_MODE_KEY = 'g';
|
|
84
|
+
/**
|
|
85
|
+
* Environment variable that makes `prefix + <key>` open the FOLLOWING popup
|
|
86
|
+
* instead of the snapshot one (Issue #2317, Phase C).
|
|
87
|
+
*
|
|
88
|
+
* ## Why one key and an option, rather than a second binding
|
|
89
|
+
*
|
|
90
|
+
* Issue #2317 offers two shapes for the follow mode — a second bound key
|
|
91
|
+
* (`CM_READ_MODE_FOLLOW_KEY`, default `G`) or a switch — and leaves the choice
|
|
92
|
+
* to implementation. This is the switch, for a reason that outlives the choice:
|
|
93
|
+
* a `bind-key` writes the tmux server's GLOBAL prefix table, which every session
|
|
94
|
+
* on the machine inherits including ones CommandMate knows nothing about. #2317
|
|
95
|
+
* 決定事項 2 says the new surface must stay session-scoped; a SECOND global key
|
|
96
|
+
* would have doubled the one global intervention the feature was allowed to
|
|
97
|
+
* keep. An environment variable costs no key table at all.
|
|
98
|
+
*
|
|
99
|
+
* The follow popup remains reachable two other ways with no key at all:
|
|
100
|
+
* `commandmate capture <id> --pane --follow`, and the opt-in
|
|
101
|
+
* `CM_READ_MODE_AUTO_POPUP=on`, which opens it on attach.
|
|
102
|
+
*/
|
|
103
|
+
exports.READ_MODE_FOLLOW_ENV = 'CM_READ_MODE_FOLLOW';
|
|
82
104
|
/**
|
|
83
105
|
* Accepted `CM_READ_MODE_KEY` values: a single alphanumeric, an F-key, either
|
|
84
106
|
* optionally with a `C-` / `M-` / `S-` modifier. Deliberately narrow — a typo
|
|
@@ -104,6 +126,26 @@ function isReadModeEnabled() {
|
|
|
104
126
|
const raw = (process.env.CM_READ_MODE ?? '').trim().toLowerCase();
|
|
105
127
|
return raw !== 'off' && raw !== '0' && raw !== 'false';
|
|
106
128
|
}
|
|
129
|
+
/** True when the operator asked `prefix + <key>` to follow rather than snapshot. */
|
|
130
|
+
function isReadModeFollowEnabled() {
|
|
131
|
+
return (process.env[exports.READ_MODE_FOLLOW_ENV] ?? '').trim().toLowerCase() === 'on';
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The shell command the popup runs: the pager script, plus `--follow` when the
|
|
135
|
+
* operator asked for it.
|
|
136
|
+
*
|
|
137
|
+
* One word per argument and no quoting of its own — {@link quoteForTmuxCommand}
|
|
138
|
+
* wraps the WHOLE line, so tmux hands `/bin/sh` a single command string. That is
|
|
139
|
+
* the same shape the snapshot form has always had; the flag rides inside the
|
|
140
|
+
* quotes rather than after them, because a word after the closing quote would be
|
|
141
|
+
* a second argument to `display-popup`, not to the script.
|
|
142
|
+
*
|
|
143
|
+
* @param scriptPath - Absolute path of the materialized pager script
|
|
144
|
+
* @param follow - Whether to append `--follow`
|
|
145
|
+
*/
|
|
146
|
+
function buildPopupCommand(scriptPath, follow) {
|
|
147
|
+
return follow ? `${scriptPath} --follow` : scriptPath;
|
|
148
|
+
}
|
|
107
149
|
/**
|
|
108
150
|
* Resolve the configured key, or undefined when it is malformed.
|
|
109
151
|
* @returns The key to bind, or undefined if `CM_READ_MODE_KEY` fails validation
|
|
@@ -283,7 +325,7 @@ async function reconcileReadModeBinding() {
|
|
|
283
325
|
detail: 'display-popup requires tmux 3.2+; use `commandmate capture <id> --pane` instead',
|
|
284
326
|
};
|
|
285
327
|
}
|
|
286
|
-
const quoted = quoteForTmuxCommand(scriptPath);
|
|
328
|
+
const quoted = quoteForTmuxCommand(buildPopupCommand(scriptPath, isReadModeFollowEnabled()));
|
|
287
329
|
if (quoted === undefined) {
|
|
288
330
|
return { installed: false, outcome: 'unsafe-script-path', key, scriptPath };
|
|
289
331
|
}
|