commandmate 0.18.0 → 0.20.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 +230 -223
- package/.next/app-path-routes-manifest.json +32 -32
- 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/app/update/route.js +5 -3
- package/.next/server/app/api/app/update/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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 +1 -1
- 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 +1 -1
- 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.js +1 -1
- package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route.js +1 -1
- package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route.js +1 -1
- package/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route.js +1 -1
- package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js +2 -2
- package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route.js +2 -2
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +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/metrics/vibe/route.js +2 -2
- package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route.js +1 -1
- package/.next/server/app/api/ollama/models/route.js.nft.json +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js +2 -2
- package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js +2 -2
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route.js +2 -2
- package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js +2 -2
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +2 -2
- package/.next/server/app/api/templates/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route.js +1 -1
- package/.next/server/app/api/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route.js +1 -1
- package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +6 -6
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/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]/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 +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +4 -4
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/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/apple-icon.png/route.js +1 -1
- package/.next/server/app/apple-icon.png/route.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/icon.png/route.js +1 -1
- package/.next/server/app/icon.png/route.js.nft.json +1 -1
- package/.next/server/app/icon1.png/route.js +1 -1
- package/.next/server/app/icon1.png/route.js.nft.json +1 -1
- package/.next/server/app/icon2.png/route.js +1 -1
- package/.next/server/app/icon2.png/route.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +8 -8
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +32 -32
- package/.next/server/chunks/1029.js +1 -0
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1598.js +4 -0
- package/.next/server/chunks/3042.js +1 -1
- package/.next/server/chunks/3417.js +1 -0
- package/.next/server/chunks/3451.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3753.js +23 -23
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/406.js +5 -5
- package/.next/server/chunks/{1185.js → 5048.js} +1 -1
- package/.next/server/chunks/5959.js +3 -3
- package/.next/server/chunks/{5381.js → 5998.js} +2 -2
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6274.js +6 -5
- package/.next/server/chunks/6283.js +1 -1
- package/.next/server/chunks/6401.js +1 -0
- package/.next/server/chunks/641.js +1 -0
- package/.next/server/chunks/8536.js +1 -0
- package/.next/server/chunks/8543.js +1 -0
- package/.next/server/chunks/8807.js +397 -378
- package/.next/server/chunks/8856.js +2 -2
- package/.next/server/chunks/9058.js +1 -0
- package/.next/server/chunks/9067.js +1 -0
- package/.next/server/chunks/9123.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/server/src/middleware.js +1 -1
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/{6488-109e3825c7249e47.js → 6488-3e7539550c3ef358.js} +1 -1
- package/.next/static/chunks/744-fa8c0ae444c8338c.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/skills/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/templates/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/todos/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/repositories/page-202680fe6ec169c8.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-214ee8b97dca856b.js +1 -0
- package/.next/trace +12 -12
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/README.md +10 -1
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +12 -4
- package/dist/cli/commands/capture.d.ts +1 -0
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +115 -4
- package/dist/cli/commands/instances.d.ts +24 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +44 -0
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +9 -3
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +13 -4
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +24 -14
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +66 -0
- package/dist/cli/commands/wait.d.ts +4 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +82 -7
- package/dist/cli/config/agent-target-options.d.ts +46 -0
- package/dist/cli/config/agent-target-options.d.ts.map +1 -0
- package/dist/cli/config/agent-target-options.js +54 -0
- 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 +47 -14
- package/dist/cli/types/index.d.ts +16 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +4 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +43 -5
- package/dist/cli/utils/npm-runner.d.ts +24 -0
- package/dist/cli/utils/npm-runner.d.ts.map +1 -1
- package/dist/cli/utils/npm-runner.js +51 -1
- package/dist/cli/utils/pager.d.ts +28 -0
- package/dist/cli/utils/pager.d.ts.map +1 -0
- package/dist/cli/utils/pager.js +57 -0
- package/dist/cli/utils/pid-manager.d.ts +12 -2
- package/dist/cli/utils/pid-manager.d.ts.map +1 -1
- package/dist/cli/utils/pid-manager.js +76 -13
- package/dist/lib/detection/ansi.d.ts +30 -0
- package/dist/lib/detection/ansi.d.ts.map +1 -0
- package/dist/lib/detection/ansi.js +39 -0
- package/dist/lib/tmux/transcript-squeeze.d.ts +76 -0
- package/dist/lib/tmux/transcript-squeeze.d.ts.map +1 -0
- package/dist/lib/tmux/transcript-squeeze.js +96 -0
- package/dist/server/server.js +125 -14
- package/dist/server/src/config/tmux-pane-config.js +33 -1
- package/dist/server/src/lib/auto-yes-state.js +64 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +2 -1
- package/dist/server/src/lib/cli-tools/codex.js +3 -2
- 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/opencode.js +2 -2
- package/dist/server/src/lib/cli-tools/vibe-local.js +2 -2
- package/dist/server/src/lib/db/agent-instances-db.js +53 -0
- package/dist/server/src/lib/db/db-repository.js +66 -2
- package/dist/server/src/lib/db/db.js +12 -3
- package/dist/server/src/lib/db/migrations/index.js +8 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v52-orphaned-worktree-children.js +76 -0
- package/dist/server/src/lib/db/migrations/v53-worktree-aliases.js +53 -0
- package/dist/server/src/lib/db/migrations/v54-worktree-id-path-derived.js +204 -0
- package/dist/server/src/lib/db/migrations/v55-compact-churned-worktree-ids.js +207 -0
- package/dist/server/src/lib/db/migrations/worktree-child-tables.js +119 -0
- package/dist/server/src/lib/db/migrations/worktree-id-rename.js +153 -0
- package/dist/server/src/lib/db/worktree-alias-db.js +155 -0
- package/dist/server/src/lib/db/worktree-db.js +82 -77
- package/dist/server/src/lib/detection/cli-patterns.js +109 -2
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +10 -1
- package/dist/server/src/lib/detection/status-detector.js +52 -2
- package/dist/server/src/lib/git/worktree-id.js +145 -0
- package/dist/server/src/lib/git/worktree-redirect.js +155 -0
- package/dist/server/src/lib/git/worktrees.js +173 -27
- package/dist/server/src/lib/logger.js +13 -1
- package/dist/server/src/lib/polling/auto-yes-manager.js +3 -1
- package/dist/server/src/lib/polling/prompt-dedup.js +22 -0
- package/dist/server/src/lib/polling/response-checker.js +53 -13
- package/dist/server/src/lib/polling/response-dedup.js +22 -0
- package/dist/server/src/lib/polling/response-poller-core.js +107 -0
- package/dist/server/src/lib/polling/response-poller.js +4 -1
- package/dist/server/src/lib/response-extractor.js +22 -2
- package/dist/server/src/lib/session/claude-session.js +121 -37
- package/dist/server/src/lib/session/current-output-builder.js +14 -1
- package/dist/server/src/lib/session/session-start-error.js +125 -0
- package/dist/server/src/lib/session/worktree-session-reconcile.js +603 -0
- package/dist/server/src/lib/tasks/contract-parser.js +17 -1
- package/dist/server/src/lib/tasks/task-state-machine.js +23 -1
- package/dist/server/src/lib/tmux/control-mode-tmux-transport.js +7 -0
- package/dist/server/src/lib/tmux/read-mode-pager.js +161 -0
- package/dist/server/src/lib/tmux/read-mode.js +347 -0
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +33 -0
- package/dist/server/src/lib/tmux/tmux-control-client.js +12 -0
- package/dist/server/src/lib/tmux/tmux-control-registry.js +55 -11
- package/dist/server/src/lib/tmux/tmux.js +104 -5
- package/dist/server/src/lib/ws-server.js +104 -1
- package/package.json +1 -1
- package/.next/server/chunks/1117.js +0 -1
- package/.next/server/chunks/1356.js +0 -4
- package/.next/server/chunks/1692.js +0 -1
- package/.next/server/chunks/4018.js +0 -1
- package/.next/server/chunks/4390.js +0 -1
- package/.next/server/chunks/8681.js +0 -1
- package/.next/static/chunks/744-d5e47fe16e7b9e06.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/templates/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/todos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/repositories/page-1ed1e5a542ecc168.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-12b3c5f32fc6094e.js +0 -1
- /package/.next/static/{-BSmW0Ae2YsxyCl_ue7_d → C01FQOE5FCmB3I_GhMa4_}/_buildManifest.js +0 -0
- /package/.next/static/{-BSmW0Ae2YsxyCl_ue7_d → C01FQOE5FCmB3I_GhMa4_}/_ssgManifest.js +0 -0
|
@@ -69,6 +69,13 @@ class ControlModeTmuxTransport {
|
|
|
69
69
|
getSubscriberCount(sessionName) {
|
|
70
70
|
return this.registry.getSubscriberCount(sessionName);
|
|
71
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Re-file a live control-mode attach after the tmux session was renamed
|
|
74
|
+
* (Issue #1621 Phase 3). See TmuxControlRegistry.renameSession.
|
|
75
|
+
*/
|
|
76
|
+
renameSession(oldName, newName) {
|
|
77
|
+
return this.registry.renameSession(oldName, newName);
|
|
78
|
+
}
|
|
72
79
|
async killSession(sessionName) {
|
|
73
80
|
return (0, tmux_1.killSession)(sessionName);
|
|
74
81
|
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The shell pager that `prefix+g` opens inside a tmux popup (Issue #1623, 案A).
|
|
4
|
+
*
|
|
5
|
+
* ## Why the script is embedded here instead of shipped as a file
|
|
6
|
+
*
|
|
7
|
+
* `package.json`'s `files` list publishes `bin/`, `dist/`, `.next/`, `public/`,
|
|
8
|
+
* `scripts/hooks/` and `.env.example` — NOT `scripts/`. A path into the repo
|
|
9
|
+
* therefore does not exist in a global install, and an `npx` install lives in a
|
|
10
|
+
* cache directory npm may garbage-collect out from under a long-lived `bind-key`.
|
|
11
|
+
* Embedding the text and materializing it into `~/.commandmate/bin/` gives the
|
|
12
|
+
* binding one absolute path that is stable across global / local / npx installs.
|
|
13
|
+
*
|
|
14
|
+
* ## Why the squeeze is reimplemented in awk
|
|
15
|
+
*
|
|
16
|
+
* The popup must not depend on the CommandMate server, a node binary, or a built
|
|
17
|
+
* `dist/` — it only has tmux and a shell. awk is present everywhere those are.
|
|
18
|
+
* The duplication is not left to trust: `tests/unit/lib/tmux/transcript-squeeze.test.ts`
|
|
19
|
+
* runs THIS awk program over real captures and asserts byte equality with
|
|
20
|
+
* `squeezeTranscript()`, so the two cannot drift apart silently.
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.PAGER_SCRIPT = exports.PAGER_SCRIPT_FILENAME = exports.SQUEEZE_AWK_PROGRAM = exports.SQUEEZE_AWK_LOCALE = void 0;
|
|
24
|
+
/**
|
|
25
|
+
* Locale the squeeze awk program MUST run under.
|
|
26
|
+
*
|
|
27
|
+
* Not cosmetic — the program is byte-oriented by construction, and `%c` is the
|
|
28
|
+
* one place where awk implementations disagree about what a "character" is:
|
|
29
|
+
*
|
|
30
|
+
* | awk | `sprintf("%c", 194)` |
|
|
31
|
+
* |-------------------------|----------------------|
|
|
32
|
+
* | mawk, BWK awk | byte `0xC2` |
|
|
33
|
+
* | gawk, `LC_ALL=C` | byte `0xC2` |
|
|
34
|
+
* | gawk, `*.UTF-8` locale | U+00C2 -> `C3 82` |
|
|
35
|
+
*
|
|
36
|
+
* `NBSP` below is assembled from bytes `C2 A0`, so under gawk in a UTF-8 locale
|
|
37
|
+
* it becomes a four-byte string that can never match a real NBSP — NBSP-only
|
|
38
|
+
* rows stop counting as blank and the frame comes back unsqueezed. That is not
|
|
39
|
+
* hypothetical: it is exactly how this shipped broken, green on macOS (BWK awk)
|
|
40
|
+
* and red on `ubuntu-latest`, whose `/usr/bin/awk` is gawk (Debian ranks the
|
|
41
|
+
* gawk alternative above mawk) under a UTF-8 locale.
|
|
42
|
+
*
|
|
43
|
+
* Pinning the locale — rather than making the regex match both encodings — is
|
|
44
|
+
* deliberate: an alternation covering the character form
|
|
45
|
+
* (`sprintf("%c%c",194,160) "|" sprintf("%c",160)`) fixes gawk but makes BWK awk
|
|
46
|
+
* abort with `multibyte conversion failure` in a UTF-8 locale. Measured on all
|
|
47
|
+
* three implementations, `LC_ALL=C` is the only setting where every one of them
|
|
48
|
+
* agrees, and it is byte-transparent: the same 1000-row fixture comes out with
|
|
49
|
+
* an identical sha256 from BWK awk, mawk and gawk.
|
|
50
|
+
*
|
|
51
|
+
* Scoped to the awk process alone, so `less` and tmux keep the user's locale and
|
|
52
|
+
* still render UTF-8 box drawing.
|
|
53
|
+
*/
|
|
54
|
+
exports.SQUEEZE_AWK_LOCALE = 'C';
|
|
55
|
+
/**
|
|
56
|
+
* awk implementation of {@link import('./transcript-squeeze').squeezeTranscript}.
|
|
57
|
+
*
|
|
58
|
+
* Mirrors the TypeScript rules exactly:
|
|
59
|
+
* - `ANSI` is built from `sprintf("%c")` rather than a regex literal because
|
|
60
|
+
* `\033` / `\a` escapes inside a regex literal are not portable across awk
|
|
61
|
+
* implementations (macOS ships BWK awk, Linux usually gawk/mawk).
|
|
62
|
+
* - NBSP (UTF-8 `C2 A0`) is folded to a space before trimming, because
|
|
63
|
+
* JavaScript's `.trim()` treats U+00A0 as whitespace and awk's `[ \t]` does not.
|
|
64
|
+
* Without this the two implementations disagree on NBSP-only rows. This is the
|
|
65
|
+
* line that requires {@link SQUEEZE_AWK_LOCALE} — read that doc before editing.
|
|
66
|
+
* - Leading/trailing blank runs are dropped, runs of 1-2 kept verbatim, runs of
|
|
67
|
+
* 3+ collapsed to a single row carrying the run's ANSI sequences.
|
|
68
|
+
*/
|
|
69
|
+
exports.SQUEEZE_AWK_PROGRAM = `BEGIN {
|
|
70
|
+
ESC = sprintf("%c", 27); BEL = sprintf("%c", 7); NBSP = sprintf("%c%c", 194, 160)
|
|
71
|
+
ANSI = ESC "\\\\[[0-9;]*[a-zA-Z]|" ESC "\\\\][^" BEL "]*" BEL "|\\\\[[0-9;]*m"
|
|
72
|
+
n = 0
|
|
73
|
+
}
|
|
74
|
+
{ line[++n] = $0 }
|
|
75
|
+
END {
|
|
76
|
+
for (i = 1; i <= n; i++) {
|
|
77
|
+
s = line[i]; gsub(ANSI, "", s); gsub(NBSP, " ", s)
|
|
78
|
+
gsub(/^[ \\t\\r\\f\\v]+|[ \\t\\r\\f\\v]+$/, "", s)
|
|
79
|
+
blank[i] = (s == "")
|
|
80
|
+
}
|
|
81
|
+
seen = 0; i = 1
|
|
82
|
+
while (i <= n) {
|
|
83
|
+
if (!blank[i]) { print line[i]; seen = 1; i++; continue }
|
|
84
|
+
j = i; while (j <= n && blank[j]) j++
|
|
85
|
+
if (seen && j <= n) {
|
|
86
|
+
if (j - i <= 2) { for (k = i; k < j; k++) print line[k] }
|
|
87
|
+
else {
|
|
88
|
+
joined = ""; for (k = i; k < j; k++) joined = joined line[k]
|
|
89
|
+
keep = ""
|
|
90
|
+
while (match(joined, ANSI)) {
|
|
91
|
+
keep = keep substr(joined, RSTART, RLENGTH); joined = substr(joined, RSTART + RLENGTH)
|
|
92
|
+
}
|
|
93
|
+
print keep
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
i = j
|
|
97
|
+
}
|
|
98
|
+
}`;
|
|
99
|
+
/** Basename of the materialized script. */
|
|
100
|
+
exports.PAGER_SCRIPT_FILENAME = 'cm-read-pane.sh';
|
|
101
|
+
/**
|
|
102
|
+
* Full text of the pager script.
|
|
103
|
+
*
|
|
104
|
+
* Session resolution is done INSIDE the script on purpose. `display-popup` does
|
|
105
|
+
* NOT expand tmux formats in its shell-command (measured on 3.5a: a literal
|
|
106
|
+
* `#{session_name}` reaches the shell unexpanded), so the session cannot be baked
|
|
107
|
+
* into the binding. `tmux display-message -p` inside the popup returns the correct
|
|
108
|
+
* session and client, which is what makes one global binding serve every session.
|
|
109
|
+
*
|
|
110
|
+
* `=NAME:` is the exact-match target form required by Issue #1156 — a bare name
|
|
111
|
+
* prefix-matches and would show the `-2` instance's pane while the primary is
|
|
112
|
+
* stopped.
|
|
113
|
+
*/
|
|
114
|
+
exports.PAGER_SCRIPT = `#!/bin/sh
|
|
115
|
+
# CommandMate reading mode (Issue #1623) — generated file, edits are overwritten.
|
|
116
|
+
#
|
|
117
|
+
# Renders the transcript of a CommandMate tmux session with layout-only blank rows
|
|
118
|
+
# squeezed away, so a pager lands on the composer instead of hundreds of rows of
|
|
119
|
+
# padding. Invoked by \`prefix+g\` through \`display-popup -E\`; also runnable by hand:
|
|
120
|
+
#
|
|
121
|
+
# sh ~/.commandmate/bin/${exports.PAGER_SCRIPT_FILENAME} mcbd-claude-my-worktree
|
|
122
|
+
#
|
|
123
|
+
# The popup is a SNAPSHOT. Press the key again to refresh it.
|
|
124
|
+
set -u
|
|
125
|
+
|
|
126
|
+
SESSION="\${1:-}"
|
|
127
|
+
if [ -z "$SESSION" ]; then
|
|
128
|
+
SESSION=$(tmux display-message -p '#{session_name}' 2>/dev/null) || SESSION=""
|
|
129
|
+
fi
|
|
130
|
+
if [ -z "$SESSION" ]; then
|
|
131
|
+
echo "cm-read-pane: no tmux session given and none could be resolved" >&2
|
|
132
|
+
exit 1
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
LINES_BACK="\${CM_READ_LINES:-1000}"
|
|
136
|
+
case "$LINES_BACK" in
|
|
137
|
+
''|*[!0-9]*) LINES_BACK=1000 ;;
|
|
138
|
+
esac
|
|
139
|
+
|
|
140
|
+
if [ -n "\${CM_READ_PAGER:-}" ]; then
|
|
141
|
+
PAGER_CMD="$CM_READ_PAGER"
|
|
142
|
+
elif command -v less >/dev/null 2>&1; then
|
|
143
|
+
PAGER_CMD="less -R +G"
|
|
144
|
+
else
|
|
145
|
+
PAGER_CMD="cat"
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
# LC_ALL is pinned for awk ONLY (not for less, which still renders UTF-8 box
|
|
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
|
|
155
|
+
|
|
156
|
+
# Without a pager the popup would close before anything could be read.
|
|
157
|
+
if [ "$PAGER_CMD" = "cat" ]; then
|
|
158
|
+
printf '\\n[CommandMate] end of transcript — press Enter to close.' >&2
|
|
159
|
+
read -r _unused || true
|
|
160
|
+
fi
|
|
161
|
+
`;
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reading mode: `prefix+g` opens a squeezed transcript in a tmux popup (Issue #1623, 案A).
|
|
4
|
+
*
|
|
5
|
+
* Attaching to a CommandMate session shows nothing readable. The pane is pinned to
|
|
6
|
+
* 200x1000 (Issue #1163), the agent draws its composer at the bottom and its
|
|
7
|
+
* transcript at the top, and tmux follows the cursor — which sits at row 997.
|
|
8
|
+
* Measured on a live session: an attached 72-row client sees ZERO transcript rows.
|
|
9
|
+
* This module adds an on-demand way to read, WITHOUT touching the geometry that
|
|
10
|
+
* status detection, Auto-Yes and the response saver depend on.
|
|
11
|
+
*
|
|
12
|
+
* ## This module mutates state CommandMate does not own — read before changing it
|
|
13
|
+
*
|
|
14
|
+
* `bind-key` writes the tmux server's GLOBAL prefix key table. Every session on
|
|
15
|
+
* that server inherits it, including ones CommandMate knows nothing about. Four
|
|
16
|
+
* guards keep that intervention honest, and all four are load-bearing:
|
|
17
|
+
*
|
|
18
|
+
* 1. **Capability probe.** `display-popup` is tmux 3.2+. Measured on 3.5a:
|
|
19
|
+
* `tmux list-commands <unknown>` exits 0 with EMPTY stdout, so the exit code is
|
|
20
|
+
* useless as a probe — the presence of output is the signal. Older tmux gets
|
|
21
|
+
* no binding at all (a genuine no-op), and the CLI viewer is the fallback.
|
|
22
|
+
* 2. **Conflict check.** `list-keys -T prefix <key>` exits 1 with `unknown key`
|
|
23
|
+
* when the key is free and exits 0 printing the binding when it is taken. A key
|
|
24
|
+
* already bound to something that is not ours is left ALONE. The Issue's claim
|
|
25
|
+
* that `prefix+g` is unbound on stock tmux 3.5a is true here, but says nothing
|
|
26
|
+
* about a user's own `.tmux.conf`.
|
|
27
|
+
* ORDER IS LOAD-BEARING: guard 1 runs first, and must keep doing so. On tmux
|
|
28
|
+
* 3.0 and older `list-keys` takes no key argument either (`usage: list-keys
|
|
29
|
+
* [-T key-table]`, measured in #1641), so this check degrades to "the key is
|
|
30
|
+
* always free" there. It is harmless only because those versions never reach
|
|
31
|
+
* it — guard 1 has already returned `unsupported-tmux`.
|
|
32
|
+
* 3. **Session-name guard.** The binding fires `if-shell -F '#{m:mcbd-*,...}'`, so
|
|
33
|
+
* pressing the key in a non-CommandMate session does nothing (measured: the
|
|
34
|
+
* format yields 1 for `mcbd-*` sessions and 0 for everything else).
|
|
35
|
+
* 4. **Opt-out that converges.** `CM_READ_MODE=off` does not merely skip
|
|
36
|
+
* installation — it REMOVES a binding a previous run installed. That is the
|
|
37
|
+
* uninstall path, and it is why shutdown does not unbind (see below).
|
|
38
|
+
*
|
|
39
|
+
* ## Why shutdown does not unbind
|
|
40
|
+
*
|
|
41
|
+
* CommandMate supports several servers at once (`commandmate start --issue N`),
|
|
42
|
+
* all sharing one tmux server. Unbinding when one of them stops would rip the key
|
|
43
|
+
* out from under the others, and the popup needs no CommandMate server to work —
|
|
44
|
+
* it only shells out to tmux. Removal is therefore an explicit user action
|
|
45
|
+
* (`CM_READ_MODE=off` + restart), not a shutdown side effect.
|
|
46
|
+
*/
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.DEFAULT_READ_MODE_KEY = exports.MCBD_SESSION_PREFIX = void 0;
|
|
49
|
+
exports.getPagerScriptPath = getPagerScriptPath;
|
|
50
|
+
exports.isReadModeEnabled = isReadModeEnabled;
|
|
51
|
+
exports.resolveReadModeKey = resolveReadModeKey;
|
|
52
|
+
exports.quoteForTmuxCommand = quoteForTmuxCommand;
|
|
53
|
+
exports.buildBindKeyArgs = buildBindKeyArgs;
|
|
54
|
+
exports.supportsDisplayPopup = supportsDisplayPopup;
|
|
55
|
+
exports.readExistingBinding = readExistingBinding;
|
|
56
|
+
exports.materializePagerScript = materializePagerScript;
|
|
57
|
+
exports.buildUnbindKeyArgs = buildUnbindKeyArgs;
|
|
58
|
+
exports.reconcileReadModeBinding = reconcileReadModeBinding;
|
|
59
|
+
exports.initReadMode = initReadMode;
|
|
60
|
+
const child_process_1 = require("child_process");
|
|
61
|
+
const util_1 = require("util");
|
|
62
|
+
const os_1 = require("os");
|
|
63
|
+
const path_1 = require("path");
|
|
64
|
+
const fs_1 = require("fs");
|
|
65
|
+
const read_mode_pager_1 = require("./read-mode-pager");
|
|
66
|
+
const logger_1 = require("../logger");
|
|
67
|
+
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
68
|
+
const logger = (0, logger_1.createLogger)('tmux-read-mode');
|
|
69
|
+
/** tmux calls here are interactive-latency, not long-running. */
|
|
70
|
+
const TMUX_TIMEOUT = 5000;
|
|
71
|
+
/**
|
|
72
|
+
* Session-name prefix every CommandMate tmux session carries.
|
|
73
|
+
*
|
|
74
|
+
* Not imported from `cli-tools/base.ts` because it is a template literal there,
|
|
75
|
+
* not a constant. `tests/unit/lib/tmux/read-mode.test.ts` asserts that a real
|
|
76
|
+
* `getSessionName()` still starts with this, so a rename breaks the test instead
|
|
77
|
+
* of silently turning the guard into a permanent "never fire".
|
|
78
|
+
*/
|
|
79
|
+
exports.MCBD_SESSION_PREFIX = 'mcbd-';
|
|
80
|
+
/** Key bound under the prefix table when `CM_READ_MODE_KEY` is unset. */
|
|
81
|
+
exports.DEFAULT_READ_MODE_KEY = 'g';
|
|
82
|
+
/**
|
|
83
|
+
* Accepted `CM_READ_MODE_KEY` values: a single alphanumeric, an F-key, either
|
|
84
|
+
* optionally with a `C-` / `M-` / `S-` modifier. Deliberately narrow — a typo
|
|
85
|
+
* should be rejected loudly rather than bound to something surprising in the
|
|
86
|
+
* user's global key table.
|
|
87
|
+
*/
|
|
88
|
+
const READ_MODE_KEY_PATTERN = /^(?:[CMS]-)?(?:[A-Za-z0-9]|F(?:[1-9]|1[0-2]))$/;
|
|
89
|
+
/** Popup geometry. Large enough to read, small enough to still see it is a popup. */
|
|
90
|
+
const POPUP_WIDTH = '90%';
|
|
91
|
+
const POPUP_HEIGHT = '85%';
|
|
92
|
+
/**
|
|
93
|
+
* Absolute path of the materialized pager script.
|
|
94
|
+
*
|
|
95
|
+
* Always under `~/.commandmate/`, never the install directory and never the cwd:
|
|
96
|
+
* `bind-key` is server-global and long-lived, so the path it names has to outlive
|
|
97
|
+
* a `npx` cache eviction or a `cd`.
|
|
98
|
+
*/
|
|
99
|
+
function getPagerScriptPath() {
|
|
100
|
+
return (0, path_1.join)((0, os_1.homedir)(), '.commandmate', 'bin', read_mode_pager_1.PAGER_SCRIPT_FILENAME);
|
|
101
|
+
}
|
|
102
|
+
/** True unless the user set `CM_READ_MODE=off` (or `0` / `false`). */
|
|
103
|
+
function isReadModeEnabled() {
|
|
104
|
+
const raw = (process.env.CM_READ_MODE ?? '').trim().toLowerCase();
|
|
105
|
+
return raw !== 'off' && raw !== '0' && raw !== 'false';
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Resolve the configured key, or undefined when it is malformed.
|
|
109
|
+
* @returns The key to bind, or undefined if `CM_READ_MODE_KEY` fails validation
|
|
110
|
+
*/
|
|
111
|
+
function resolveReadModeKey() {
|
|
112
|
+
const raw = (process.env.CM_READ_MODE_KEY ?? '').trim();
|
|
113
|
+
if (raw === '')
|
|
114
|
+
return exports.DEFAULT_READ_MODE_KEY;
|
|
115
|
+
return READ_MODE_KEY_PATTERN.test(raw) ? raw : undefined;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Quote a path for the shell-command tmux stores in a binding.
|
|
119
|
+
*
|
|
120
|
+
* tmux lexes the stored command itself before handing words to `/bin/sh`, so the
|
|
121
|
+
* quoting has to survive that pass. POSIX `'...'` with `'\''` for embedded quotes
|
|
122
|
+
* satisfies both. Returns undefined for a path that cannot be represented (a
|
|
123
|
+
* newline has no single-quoted form tmux will parse), which callers treat as
|
|
124
|
+
* "do not install".
|
|
125
|
+
*/
|
|
126
|
+
function quoteForTmuxCommand(path) {
|
|
127
|
+
if (path.includes('\n') || path.includes('\r'))
|
|
128
|
+
return undefined;
|
|
129
|
+
return `'${path.replace(/'/g, "'\\''")}'`;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The exact `bind-key` argument vector for a given key and script path.
|
|
133
|
+
* Exported so tests assert the wire form rather than a paraphrase of it.
|
|
134
|
+
*/
|
|
135
|
+
function buildBindKeyArgs(key, quotedScriptPath) {
|
|
136
|
+
return [
|
|
137
|
+
'bind-key',
|
|
138
|
+
'-T',
|
|
139
|
+
'prefix',
|
|
140
|
+
key,
|
|
141
|
+
'if-shell',
|
|
142
|
+
'-F',
|
|
143
|
+
`#{m:${exports.MCBD_SESSION_PREFIX}*,#{session_name}}`,
|
|
144
|
+
`display-popup -w ${POPUP_WIDTH} -h ${POPUP_HEIGHT} -E ${quotedScriptPath}`,
|
|
145
|
+
];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Whether this tmux understands `display-popup` (3.2+).
|
|
149
|
+
*
|
|
150
|
+
* Probes on OUTPUT, not exit status. Measured against real binaries in
|
|
151
|
+
* containers (Issue #1641; harness: `scripts/verify-legacy-tmux-readmode.sh`):
|
|
152
|
+
*
|
|
153
|
+
* | tmux | `list-commands display-popup` | verdict |
|
|
154
|
+
* |---|---|---|
|
|
155
|
+
* | 2.8 / 3.0a | exit 1, `usage: list-commands [-F format]` | false |
|
|
156
|
+
* | 3.1c | exit 0, EMPTY stdout | false |
|
|
157
|
+
* | 3.3a / 3.5a | exit 0, the command's help line | true |
|
|
158
|
+
*
|
|
159
|
+
* Two different reasons produce the same right answer, and only the output test
|
|
160
|
+
* covers both: an exit-code probe calls 3.1c capable, and a stderr probe calls
|
|
161
|
+
* 3.3a incapable.
|
|
162
|
+
*
|
|
163
|
+
* NOT a general-purpose capability prober. On tmux 3.0 and older `list-commands`
|
|
164
|
+
* takes no command argument at all, so it answers `usage:` for names that tmux
|
|
165
|
+
* DOES support — reusing this shape for a command that predates 3.1 would report
|
|
166
|
+
* a false negative on every old tmux.
|
|
167
|
+
*/
|
|
168
|
+
async function supportsDisplayPopup() {
|
|
169
|
+
try {
|
|
170
|
+
const { stdout } = await execFileAsync('tmux', ['list-commands', 'display-popup'], {
|
|
171
|
+
timeout: TMUX_TIMEOUT,
|
|
172
|
+
});
|
|
173
|
+
return stdout.trim() !== '';
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Current prefix-table binding for `key`, or undefined when the key is free.
|
|
181
|
+
*
|
|
182
|
+
* @param key - tmux key name
|
|
183
|
+
* @returns The `bind-key ...` line tmux reports, or undefined if unbound
|
|
184
|
+
*/
|
|
185
|
+
async function readExistingBinding(key) {
|
|
186
|
+
try {
|
|
187
|
+
const { stdout } = await execFileAsync('tmux', ['list-keys', '-T', 'prefix', key], {
|
|
188
|
+
timeout: TMUX_TIMEOUT,
|
|
189
|
+
});
|
|
190
|
+
const line = stdout.trim();
|
|
191
|
+
return line === '' ? undefined : line;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Exit 1 + `unknown key: <k>` on stderr is how tmux reports "not bound".
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Write the pager script to {@link getPagerScriptPath}, if its content changed.
|
|
200
|
+
*
|
|
201
|
+
* Idempotent by content comparison so a restart does not churn the file's mtime,
|
|
202
|
+
* and re-executable after a `chmod` accident because the mode is re-applied.
|
|
203
|
+
*
|
|
204
|
+
* @returns The absolute path written
|
|
205
|
+
*/
|
|
206
|
+
function materializePagerScript() {
|
|
207
|
+
const scriptPath = getPagerScriptPath();
|
|
208
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(scriptPath), { recursive: true });
|
|
209
|
+
let current;
|
|
210
|
+
if ((0, fs_1.existsSync)(scriptPath)) {
|
|
211
|
+
try {
|
|
212
|
+
current = (0, fs_1.readFileSync)(scriptPath, 'utf-8');
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
current = undefined;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (current !== read_mode_pager_1.PAGER_SCRIPT) {
|
|
219
|
+
(0, fs_1.writeFileSync)(scriptPath, read_mode_pager_1.PAGER_SCRIPT, { mode: 0o755 });
|
|
220
|
+
}
|
|
221
|
+
(0, fs_1.chmodSync)(scriptPath, 0o755);
|
|
222
|
+
return scriptPath;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* The exact argument vector that removes the binding again.
|
|
226
|
+
*
|
|
227
|
+
* Paired with {@link buildBindKeyArgs} and exported for the same reason: the
|
|
228
|
+
* install and uninstall paths are asserted against these builders rather than
|
|
229
|
+
* against re-typed literals, so a test cannot drift from what actually runs —
|
|
230
|
+
* and `tests/unit/config/tmux-live-test-safety.test.ts` keeps its meaning,
|
|
231
|
+
* because the mutating verbs appear in exactly one place, here in `src/`.
|
|
232
|
+
*/
|
|
233
|
+
function buildUnbindKeyArgs(key) {
|
|
234
|
+
return ['unbind-key', '-T', 'prefix', key];
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Remove the binding, but ONLY when it is still the one we installed.
|
|
238
|
+
*
|
|
239
|
+
* A user who rebound the key after us owns it now; clobbering that would be the
|
|
240
|
+
* same rudeness the conflict check exists to avoid.
|
|
241
|
+
*/
|
|
242
|
+
async function removeOwnBinding(key, scriptPath) {
|
|
243
|
+
const existing = await readExistingBinding(key);
|
|
244
|
+
if (existing === undefined)
|
|
245
|
+
return 'not-installed';
|
|
246
|
+
if (!existing.includes(scriptPath))
|
|
247
|
+
return 'key-conflict';
|
|
248
|
+
await execFileAsync('tmux', buildUnbindKeyArgs(key), { timeout: TMUX_TIMEOUT });
|
|
249
|
+
return 'removed';
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Reconcile the tmux prefix key table with the configured reading-mode state.
|
|
253
|
+
*
|
|
254
|
+
* Safe to call on every server start: installing twice is a no-op, and the
|
|
255
|
+
* disabled path removes what an earlier run installed. Never throws — reading
|
|
256
|
+
* mode is a convenience, and no failure here may keep the server from starting.
|
|
257
|
+
*
|
|
258
|
+
* @returns What was done, for logging and for tests
|
|
259
|
+
*/
|
|
260
|
+
async function reconcileReadModeBinding() {
|
|
261
|
+
const key = resolveReadModeKey();
|
|
262
|
+
const scriptPath = getPagerScriptPath();
|
|
263
|
+
if (key === undefined) {
|
|
264
|
+
return {
|
|
265
|
+
installed: false,
|
|
266
|
+
outcome: 'invalid-key',
|
|
267
|
+
key: process.env.CM_READ_MODE_KEY ?? '',
|
|
268
|
+
scriptPath,
|
|
269
|
+
detail: 'CM_READ_MODE_KEY must be a single alphanumeric or F-key, optionally with a C-/M-/S- modifier',
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
try {
|
|
273
|
+
if (!isReadModeEnabled()) {
|
|
274
|
+
const outcome = await removeOwnBinding(key, scriptPath);
|
|
275
|
+
return { installed: false, outcome, key, scriptPath, detail: 'CM_READ_MODE=off' };
|
|
276
|
+
}
|
|
277
|
+
if (!(await supportsDisplayPopup())) {
|
|
278
|
+
return {
|
|
279
|
+
installed: false,
|
|
280
|
+
outcome: 'unsupported-tmux',
|
|
281
|
+
key,
|
|
282
|
+
scriptPath,
|
|
283
|
+
detail: 'display-popup requires tmux 3.2+; use `commandmate capture <id> --pane` instead',
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
const quoted = quoteForTmuxCommand(scriptPath);
|
|
287
|
+
if (quoted === undefined) {
|
|
288
|
+
return { installed: false, outcome: 'unsafe-script-path', key, scriptPath };
|
|
289
|
+
}
|
|
290
|
+
const existing = await readExistingBinding(key);
|
|
291
|
+
if (existing !== undefined && !existing.includes(scriptPath)) {
|
|
292
|
+
return {
|
|
293
|
+
installed: false,
|
|
294
|
+
outcome: 'key-conflict',
|
|
295
|
+
key,
|
|
296
|
+
scriptPath,
|
|
297
|
+
detail: `prefix+${key} is already bound: ${existing}`,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
materializePagerScript();
|
|
301
|
+
await execFileAsync('tmux', buildBindKeyArgs(key, quoted), { timeout: TMUX_TIMEOUT });
|
|
302
|
+
return {
|
|
303
|
+
installed: true,
|
|
304
|
+
outcome: existing === undefined ? 'installed' : 'already-installed',
|
|
305
|
+
key,
|
|
306
|
+
scriptPath,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
return {
|
|
311
|
+
installed: false,
|
|
312
|
+
outcome: 'error',
|
|
313
|
+
key,
|
|
314
|
+
scriptPath,
|
|
315
|
+
detail: error instanceof Error ? error.message : String(error),
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Startup entry point: reconcile and log the outcome once.
|
|
321
|
+
*
|
|
322
|
+
* `server.ts` must reach this through `await import()`, never a top-level static
|
|
323
|
+
* import — pulling module graphs into server.ts's eval-time graph perturbs Next's
|
|
324
|
+
* AsyncLocalStorage bootstrap under `tsx server.ts` and the first request that
|
|
325
|
+
* compiles middleware dies (see the Skill reconciler note in server.ts).
|
|
326
|
+
*/
|
|
327
|
+
async function initReadMode() {
|
|
328
|
+
const status = await reconcileReadModeBinding();
|
|
329
|
+
switch (status.outcome) {
|
|
330
|
+
case 'installed':
|
|
331
|
+
case 'already-installed':
|
|
332
|
+
logger.info('read-mode:ready', { key: status.key, scriptPath: status.scriptPath });
|
|
333
|
+
break;
|
|
334
|
+
case 'removed':
|
|
335
|
+
case 'not-installed':
|
|
336
|
+
case 'disabled':
|
|
337
|
+
logger.info('read-mode:disabled', { key: status.key, outcome: status.outcome });
|
|
338
|
+
break;
|
|
339
|
+
default:
|
|
340
|
+
logger.warn('read-mode:not-installed', {
|
|
341
|
+
outcome: status.outcome,
|
|
342
|
+
key: status.key,
|
|
343
|
+
detail: status.detail,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
return status;
|
|
347
|
+
}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.CACHE_MAX_CAPTURE_LINES = exports.CACHE_MAX_ENTRIES = exports.CACHE_TTL_MS = void 0;
|
|
23
|
+
exports.isCaptureWindowSaturated = isCaptureWindowSaturated;
|
|
23
24
|
exports.sliceOutput = sliceOutput;
|
|
24
25
|
exports.getCachedCapture = getCachedCapture;
|
|
25
26
|
exports.setCachedCapture = setCachedCapture;
|
|
@@ -45,6 +46,38 @@ exports.CACHE_TTL_MS = 5000;
|
|
|
45
46
|
exports.CACHE_MAX_ENTRIES = 100;
|
|
46
47
|
/** Maximum capture lines for cache storage */
|
|
47
48
|
exports.CACHE_MAX_CAPTURE_LINES = 10000;
|
|
49
|
+
// =========================================================================
|
|
50
|
+
// isCaptureWindowSaturated()
|
|
51
|
+
// =========================================================================
|
|
52
|
+
/**
|
|
53
|
+
* Whether a capture came back clipped by the capture window (Issue #1670).
|
|
54
|
+
*
|
|
55
|
+
* Every capture in this app is a SLIDING WINDOW over the tail of the pane, not a
|
|
56
|
+
* view of the whole buffer: `captureSessionOutput()` asks tmux for
|
|
57
|
+
* `-S -CACHE_MAX_CAPTURE_LINES` and `sliceOutput()` then keeps only the last
|
|
58
|
+
* `requestedLines` rows. So the returned line count is
|
|
59
|
+
* `min(pane_scrollback + pane_height, windowLines)`.
|
|
60
|
+
*
|
|
61
|
+
* While the pane holds fewer rows than the window, that count GROWS with the
|
|
62
|
+
* transcript, which is what makes `session_states.last_captured_line` usable as a
|
|
63
|
+
* "how far have I read" cursor. Once the pane outgrows the window the count is
|
|
64
|
+
* pinned at `windowLines` forever and the window merely slides: a line index
|
|
65
|
+
* recorded earlier no longer denotes the same line, and no later capture can ever
|
|
66
|
+
* report a larger count. Callers must stop trusting the cursor at that point —
|
|
67
|
+
* see `usesAlternateScreen` in lib/cli-tools/types.ts for the sibling condition
|
|
68
|
+
* (#1268), where the same thing happens at `pane_height` instead.
|
|
69
|
+
*
|
|
70
|
+
* Raising `windowLines` does not avoid this; it only moves where it happens
|
|
71
|
+
* (`TMUX_HISTORY_LIMIT` is the hard ceiling), which is why the check is written
|
|
72
|
+
* against the window in use rather than against a specific constant.
|
|
73
|
+
*
|
|
74
|
+
* @param capturedLineCount - Number of lines the capture actually returned
|
|
75
|
+
* @param windowLines - Size of the capture window that produced it
|
|
76
|
+
* @returns True when the capture was clipped, i.e. the line count is no longer a cursor
|
|
77
|
+
*/
|
|
78
|
+
function isCaptureWindowSaturated(capturedLineCount, windowLines = exports.CACHE_MAX_CAPTURE_LINES) {
|
|
79
|
+
return windowLines > 0 && capturedLineCount >= windowLines;
|
|
80
|
+
}
|
|
48
81
|
function getCache() {
|
|
49
82
|
return (globalThis.__tmuxCaptureCache ??= new Map());
|
|
50
83
|
}
|
|
@@ -101,6 +101,18 @@ class TmuxControlClient {
|
|
|
101
101
|
isStarted() {
|
|
102
102
|
return this.started;
|
|
103
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Point this client's bookkeeping at a session that has been renamed
|
|
106
|
+
* underneath it (Issue #1621 Phase 3).
|
|
107
|
+
*
|
|
108
|
+
* The attach itself needs no repair: `attach-session` binds to the session
|
|
109
|
+
* object, not to its name, so a `rename-session` leaves the child process,
|
|
110
|
+
* its pipe and its scrollback untouched (measured in #1621). Only the name
|
|
111
|
+
* this client reports in its logs would otherwise go stale.
|
|
112
|
+
*/
|
|
113
|
+
setSessionName(sessionName) {
|
|
114
|
+
this.sessionName = sessionName;
|
|
115
|
+
}
|
|
104
116
|
emit(event) {
|
|
105
117
|
for (const handler of this.handlers) {
|
|
106
118
|
handler(event);
|
|
@@ -70,6 +70,45 @@ class TmuxControlRegistry {
|
|
|
70
70
|
this.handlers.clear();
|
|
71
71
|
this.updateMetrics();
|
|
72
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Re-file a live control-mode attach under a session's new name
|
|
75
|
+
* (Issue #1621 Phase 3).
|
|
76
|
+
*
|
|
77
|
+
* `rename-session` does not disturb an attached control client, so the child
|
|
78
|
+
* process, its pipe and its scrollback all survive — what breaks is this
|
|
79
|
+
* registry, which is keyed by name. Without re-keying, `sendInput(newName)`
|
|
80
|
+
* throws "No control client registered" while a perfectly healthy attach sits
|
|
81
|
+
* under the old key: the session is alive but input no longer reaches it.
|
|
82
|
+
* Re-keying is therefore strictly better than tearing the attach down and
|
|
83
|
+
* re-establishing it, and it keeps every subscriber connected.
|
|
84
|
+
*
|
|
85
|
+
* @returns true when an entry was moved; false when nothing was registered
|
|
86
|
+
* under `oldName`, or when `newName` is already registered (the
|
|
87
|
+
* existing attach wins — clobbering it would strand a live child
|
|
88
|
+
* process with no way to stop it)
|
|
89
|
+
*/
|
|
90
|
+
renameSession(oldName, newName) {
|
|
91
|
+
if (oldName === newName)
|
|
92
|
+
return false;
|
|
93
|
+
const entry = this.entries.get(oldName);
|
|
94
|
+
if (!entry)
|
|
95
|
+
return false;
|
|
96
|
+
if (this.entries.has(newName)) {
|
|
97
|
+
logger.warn('rename:destination-occupied', { oldName, newName });
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
this.entries.delete(oldName);
|
|
101
|
+
entry.sessionName = newName;
|
|
102
|
+
this.entries.set(newName, entry);
|
|
103
|
+
entry.client.setSessionName(newName);
|
|
104
|
+
const handlers = this.handlers.get(oldName);
|
|
105
|
+
if (handlers) {
|
|
106
|
+
this.handlers.delete(oldName);
|
|
107
|
+
this.handlers.set(newName, handlers);
|
|
108
|
+
}
|
|
109
|
+
logger.debug('rename', { oldName, newName });
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
73
112
|
ensureEntry(sessionName) {
|
|
74
113
|
const existing = this.entries.get(sessionName);
|
|
75
114
|
if (existing) {
|
|
@@ -77,23 +116,26 @@ class TmuxControlRegistry {
|
|
|
77
116
|
}
|
|
78
117
|
const client = this.createClient(sessionName);
|
|
79
118
|
client.start(sessionName);
|
|
80
|
-
const
|
|
81
|
-
|
|
119
|
+
const entry = {
|
|
120
|
+
client,
|
|
121
|
+
subscribers: new Set(),
|
|
122
|
+
// Replaced immediately below; the entry has to exist first so the event
|
|
123
|
+
// handler can read its current name rather than capture the old one.
|
|
124
|
+
unsubscribeClientEvent: () => { },
|
|
125
|
+
idleTimer: null,
|
|
126
|
+
sessionName,
|
|
127
|
+
};
|
|
128
|
+
entry.unsubscribeClientEvent = client.onEvent((event) => {
|
|
129
|
+
const handlers = this.handlers.get(entry.sessionName);
|
|
82
130
|
if (handlers) {
|
|
83
131
|
for (const handler of handlers) {
|
|
84
132
|
handler(event);
|
|
85
133
|
}
|
|
86
134
|
}
|
|
87
135
|
if (event.type === 'exit' || event.type === 'error') {
|
|
88
|
-
this.deleteEntry(sessionName);
|
|
136
|
+
this.deleteEntry(entry.sessionName);
|
|
89
137
|
}
|
|
90
138
|
});
|
|
91
|
-
const entry = {
|
|
92
|
-
client,
|
|
93
|
-
subscribers: new Set(),
|
|
94
|
-
unsubscribeClientEvent,
|
|
95
|
-
idleTimer: null,
|
|
96
|
-
};
|
|
97
139
|
this.entries.set(sessionName, entry);
|
|
98
140
|
this.updateMetrics();
|
|
99
141
|
return entry;
|
|
@@ -116,8 +158,10 @@ class TmuxControlRegistry {
|
|
|
116
158
|
}
|
|
117
159
|
this.cancelIdleCleanup(entry);
|
|
118
160
|
entry.idleTimer = setTimeout(() => {
|
|
119
|
-
|
|
120
|
-
this
|
|
161
|
+
// entry.sessionName, not the captured `sessionName`: the session may have
|
|
162
|
+
// been renamed while this timer was pending (see renameSession).
|
|
163
|
+
logger.debug('idle-cleanup', { sessionName: entry.sessionName });
|
|
164
|
+
this.deleteEntry(entry.sessionName);
|
|
121
165
|
}, this.idleTimeoutMs);
|
|
122
166
|
}
|
|
123
167
|
cancelIdleCleanup(entry) {
|