commandmate 0.33.1 → 0.33.3
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 +307 -307
- package/.next/app-path-routes-manifest.json +28 -28
- package/.next/build-manifest.json +5 -5
- package/.next/diagnostics/framework.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +15 -15
- package/.next/required-server-files.json +1 -2
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route.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 +32 -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 +33 -2
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route.js.nft.json +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +103 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +10 -10
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +28 -28
- package/.next/server/chunks/1068.js +1 -0
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1331.js +2 -2
- package/.next/server/chunks/1366.js +5 -3
- package/.next/server/chunks/1501.js +6 -2
- package/.next/server/chunks/1886.js +2 -2
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2839.js +1 -0
- package/.next/server/chunks/3123.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3323.js +1 -0
- package/.next/server/chunks/3707.js +1 -1
- package/.next/server/chunks/3708.js +1 -1
- package/.next/server/chunks/4443.js +1 -1
- package/.next/server/chunks/5220.js +1 -1
- package/.next/server/chunks/595.js +2 -2
- package/.next/server/chunks/6130.js +1 -0
- package/.next/server/chunks/650.js +1 -0
- package/.next/server/chunks/6661.js +1 -1
- package/.next/server/chunks/6781.js +1 -0
- package/.next/server/chunks/6808.js +1 -0
- package/.next/server/chunks/7875.js +3 -3
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8918.js +107 -5
- package/.next/server/chunks/9553.js +1 -0
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/middleware-build-manifest.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.map +1 -1
- package/.next/static/chunks/1255-7e5873f06b25e129.js +1 -0
- package/.next/static/chunks/{4718-2bc5cdf06573bf54.js → 4718-814f4ecfd7fcc513.js} +1 -1
- package/.next/static/chunks/6022-7a7d1760fc9814c7.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-3af707e74a75172b.js +1 -0
- package/.next/static/chunks/{main-6092074a0dc78280.js → main-ac91ed6e71380841.js} +1 -1
- package/.next/trace +13 -14
- package/dist/server/locales/en/worktree.json +9 -2
- package/dist/server/locales/ja/worktree.json +9 -2
- package/dist/server/src/lib/assistant-response-saver.js +168 -12
- package/dist/server/src/lib/cli-tools/vibe-local.js +10 -0
- package/dist/server/src/lib/hooks/hook-settings-generator.js +61 -1
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +497 -27
- package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +103 -0
- package/dist/server/src/lib/hooks/sources/claude/history.js +29 -3
- package/dist/server/src/lib/hooks/sources/codex/history.js +29 -3
- package/dist/server/src/lib/hooks/sources/command-code/history.js +29 -3
- package/dist/server/src/lib/hooks/stop-history-capture.js +30 -4
- package/dist/server/src/lib/polling/response-checker.js +258 -9
- package/dist/server/src/lib/polling/response-poller-core.js +20 -0
- package/dist/server/src/lib/polling/structured-history-gate.js +94 -10
- package/dist/server/src/lib/response-cleaner.js +84 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +31 -1
- package/dist/server/src/lib/session/session-generation-archive.js +194 -0
- package/dist/server/src/lib/tasks/contract-message.js +83 -9
- package/dist/server/src/lib/tasks/contract-parser.js +2 -0
- package/package.json +2 -2
- package/.next/server/chunks/153.js +0 -1
- package/.next/server/chunks/21.js +0 -1
- package/.next/server/chunks/3086.js +0 -1
- package/.next/server/chunks/3270.js +0 -1
- package/.next/server/chunks/3925.js +0 -1
- package/.next/server/chunks/4299.js +0 -1
- package/.next/server/chunks/5043.js +0 -1
- package/.next/server/chunks/6306.js +0 -1
- package/.next/server/chunks/6363.js +0 -1
- package/.next/server/chunks/6491.js +0 -103
- package/.next/server/chunks/6838.js +0 -1
- package/.next/server/chunks/7366.js +0 -5
- package/.next/server/chunks/7890.js +0 -1
- package/.next/server/chunks/8063.js +0 -32
- package/.next/server/chunks/8687.js +0 -1
- package/.next/static/chunks/1255-8cb587d9170b45ed.js +0 -1
- package/.next/static/chunks/6022-2fa0b5a82d4ce7b6.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-13ca0ba551fe5cfb.js +0 -1
- /package/.next/static/{9lgw9hA727UMyFhXryGWG → 9x6U1h52hH_r6pOsGwI_p}/_buildManifest.js +0 -0
- /package/.next/static/{9lgw9hA727UMyFhXryGWG → 9x6U1h52hH_r6pOsGwI_p}/_ssgManifest.js +0 -0
|
@@ -436,12 +436,13 @@
|
|
|
436
436
|
"endSessionFor": "End session for {name}",
|
|
437
437
|
"filesEmptyHint": "Open a file to enable this",
|
|
438
438
|
"historyAllSplitsHint": "Applies to all splits",
|
|
439
|
-
"historyChatOnlyHint": "Every split shows Chat, which has no history column",
|
|
440
439
|
"maximizeSplit": "Maximize {split}",
|
|
441
440
|
"maximizeFocusedSplit": "Maximize the focused split",
|
|
442
441
|
"restoreSplits": "Restore the split layout",
|
|
443
442
|
"maximizeShortcutHint": "⌘ / Ctrl + Shift + Enter",
|
|
444
|
-
"maximizedStatus": "Split {split} maximized"
|
|
443
|
+
"maximizedStatus": "Split {split} maximized",
|
|
444
|
+
"loading": "Loading…",
|
|
445
|
+
"sessionEnded": "The session has ended. Send a message to start a new session."
|
|
445
446
|
},
|
|
446
447
|
"surfaceMode": {
|
|
447
448
|
"groupLabel": "Output surface for {split}",
|
|
@@ -504,6 +505,12 @@
|
|
|
504
505
|
"unclassified": "Dialog not recognized",
|
|
505
506
|
"resolved": "Resolved",
|
|
506
507
|
"unlabeled": "Approval dialog"
|
|
508
|
+
},
|
|
509
|
+
"previousSession": {
|
|
510
|
+
"summary": "Previous session ({count})",
|
|
511
|
+
"expand": "Show the previous session",
|
|
512
|
+
"collapse": "Hide the previous session",
|
|
513
|
+
"hint": "You can view the previous conversation in History."
|
|
507
514
|
}
|
|
508
515
|
},
|
|
509
516
|
"unsentComposer": {
|
|
@@ -436,12 +436,13 @@
|
|
|
436
436
|
"endSessionFor": "{name}のセッションを終了",
|
|
437
437
|
"filesEmptyHint": "ファイルを開くと有効になります",
|
|
438
438
|
"historyAllSplitsHint": "すべての split に適用",
|
|
439
|
-
"historyChatOnlyHint": "すべての split がチャット表示のため、履歴列はありません",
|
|
440
439
|
"maximizeSplit": "{split} を最大化",
|
|
441
440
|
"maximizeFocusedSplit": "フォーカス中の split を最大化",
|
|
442
441
|
"restoreSplits": "分割表示に戻す",
|
|
443
442
|
"maximizeShortcutHint": "⌘ / Ctrl + Shift + Enter",
|
|
444
|
-
"maximizedStatus": "{split} を最大化中"
|
|
443
|
+
"maximizedStatus": "{split} を最大化中",
|
|
444
|
+
"loading": "読込中...",
|
|
445
|
+
"sessionEnded": "セッションは終了しています。送信すると新しいセッションが起動します。"
|
|
445
446
|
},
|
|
446
447
|
"surfaceMode": {
|
|
447
448
|
"groupLabel": "{split} の出力面",
|
|
@@ -504,6 +505,12 @@
|
|
|
504
505
|
"unclassified": "判別できないダイアログ",
|
|
505
506
|
"resolved": "応答済み",
|
|
506
507
|
"unlabeled": "承認ダイアログ"
|
|
508
|
+
},
|
|
509
|
+
"previousSession": {
|
|
510
|
+
"summary": "前回のセッション({count} 件)",
|
|
511
|
+
"expand": "前回のセッションを開く",
|
|
512
|
+
"collapse": "前回のセッションを閉じる",
|
|
513
|
+
"hint": "前回の会話は履歴で参照できます。"
|
|
507
514
|
}
|
|
508
515
|
},
|
|
509
516
|
"unsentComposer": {
|
|
@@ -18,9 +18,43 @@
|
|
|
18
18
|
* buffer, which is false for alternate-screen tools — those are handled by the
|
|
19
19
|
* response poller instead (Issue #1268 / #1292; see savePendingAssistantResponse).
|
|
20
20
|
*/
|
|
21
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
24
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
25
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
26
|
+
}
|
|
27
|
+
Object.defineProperty(o, k2, desc);
|
|
28
|
+
}) : (function(o, m, k, k2) {
|
|
29
|
+
if (k2 === undefined) k2 = k;
|
|
30
|
+
o[k2] = m[k];
|
|
31
|
+
}));
|
|
32
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
33
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
34
|
+
}) : function(o, v) {
|
|
35
|
+
o["default"] = v;
|
|
36
|
+
});
|
|
37
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
38
|
+
var ownKeys = function(o) {
|
|
39
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
40
|
+
var ar = [];
|
|
41
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
42
|
+
return ar;
|
|
43
|
+
};
|
|
44
|
+
return ownKeys(o);
|
|
45
|
+
};
|
|
46
|
+
return function (mod) {
|
|
47
|
+
if (mod && mod.__esModule) return mod;
|
|
48
|
+
var result = {};
|
|
49
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
50
|
+
__setModuleDefault(result, mod);
|
|
51
|
+
return result;
|
|
52
|
+
};
|
|
53
|
+
})();
|
|
21
54
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
55
|
exports.detectBufferReset = detectBufferReset;
|
|
23
56
|
exports.cleanCliResponse = cleanCliResponse;
|
|
57
|
+
exports.advanceCapturedLineForTranscriptTurn = advanceCapturedLineForTranscriptTurn;
|
|
24
58
|
exports.savePendingAssistantResponse = savePendingAssistantResponse;
|
|
25
59
|
const cli_session_1 = require("./session/cli-session");
|
|
26
60
|
const db_1 = require("./db");
|
|
@@ -82,6 +116,31 @@ function detectBufferReset(currentLineCount, lastCapturedLine) {
|
|
|
82
116
|
}
|
|
83
117
|
return { bufferReset: false, reason: null };
|
|
84
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* How many rows of a capture count as "read so far".
|
|
121
|
+
*
|
|
122
|
+
* Trailing blank rows are discarded, for consistency with the response poller's
|
|
123
|
+
* `extractResponse`: tmux pads the pane out to its height, and counting that
|
|
124
|
+
* padding inflates the stored cursor so far past the real content that the
|
|
125
|
+
* poller's dedup check (`result.lineCount <= lastCapturedLine`) can never fire
|
|
126
|
+
* again.
|
|
127
|
+
*
|
|
128
|
+
* The one definition of the count, shared by the two writers of
|
|
129
|
+
* `session_states.last_captured_line` in this module (Issue #2437): the
|
|
130
|
+
* pre-send flush and {@link advanceCapturedLineForTranscriptTurn}. Two spellings
|
|
131
|
+
* of "how far have I read" would be two cursors that disagree.
|
|
132
|
+
*
|
|
133
|
+
* @param output - Raw capture
|
|
134
|
+
* @returns Row count with trailing blank rows removed
|
|
135
|
+
*/
|
|
136
|
+
function countCapturedLines(output) {
|
|
137
|
+
const lines = output.split('\n');
|
|
138
|
+
let trimmedLength = lines.length;
|
|
139
|
+
while (trimmedLength > 0 && lines[trimmedLength - 1].trim() === '') {
|
|
140
|
+
trimmedLength--;
|
|
141
|
+
}
|
|
142
|
+
return trimmedLength;
|
|
143
|
+
}
|
|
85
144
|
/**
|
|
86
145
|
* Time offset (in milliseconds) for assistant message timestamp
|
|
87
146
|
* Ensures assistant response appears before user message in chronological order
|
|
@@ -91,8 +150,23 @@ const ASSISTANT_TIMESTAMP_OFFSET_MS = 1;
|
|
|
91
150
|
/**
|
|
92
151
|
* Clean CLI tool response based on tool type
|
|
93
152
|
*
|
|
153
|
+
* Every one of `CLI_TOOL_IDS`' eight tools has a branch (Issue #2437). Until
|
|
154
|
+
* then four of them — codex, command-code, antigravity and vibe-local — fell
|
|
155
|
+
* through to `output.trim()`, and codex's branch said so in as many words:
|
|
156
|
+
* *"Codex doesn't need special cleaning"*. It does. What that branch actually
|
|
157
|
+
* saved was codex's **idle composer**, ANSI and all, as an assistant reply:
|
|
158
|
+
*
|
|
159
|
+
* ```text
|
|
160
|
+
* › Ask Codex to do anything
|
|
161
|
+
*
|
|
162
|
+
* gpt-6-astra xhigh · ~/share/work/… · Main [default]
|
|
163
|
+
* ```
|
|
164
|
+
*
|
|
165
|
+
* See {@link cleanScrollbackResponse} for how the four share one cleaner
|
|
166
|
+
* without sharing a boundary rule.
|
|
167
|
+
*
|
|
94
168
|
* @param output - Raw output from CLI tool
|
|
95
|
-
* @param cliToolId - CLI tool identifier
|
|
169
|
+
* @param cliToolId - CLI tool identifier
|
|
96
170
|
* @returns Cleaned response content
|
|
97
171
|
*/
|
|
98
172
|
function cleanCliResponse(output, cliToolId) {
|
|
@@ -106,12 +180,101 @@ function cleanCliResponse(output, cliToolId) {
|
|
|
106
180
|
case 'copilot':
|
|
107
181
|
return (0, response_cleaner_1.cleanCopilotResponse)(output);
|
|
108
182
|
case 'codex':
|
|
109
|
-
|
|
110
|
-
|
|
183
|
+
case 'command-code':
|
|
184
|
+
case 'antigravity':
|
|
185
|
+
case 'vibe-local':
|
|
186
|
+
return (0, response_cleaner_1.cleanScrollbackResponse)(output, cliToolId);
|
|
111
187
|
default:
|
|
112
188
|
return output.trim();
|
|
113
189
|
}
|
|
114
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Move `last_captured_line` past everything a transcript row now covers
|
|
193
|
+
* (Issue #2437).
|
|
194
|
+
*
|
|
195
|
+
* ## The defect this closes
|
|
196
|
+
*
|
|
197
|
+
* The pre-send flush ({@link savePendingAssistantResponse}) reads
|
|
198
|
+
* `lastCapturedLine`, and saves **everything past it** as the pending reply. The
|
|
199
|
+
* only writer of that cursor used to be the flush itself and the response
|
|
200
|
+
* poller — the Stop path that writes the agent's OWN Markdown into History
|
|
201
|
+
* (`hooks/sources/<tool>/history.ts`) never touched it. So on this ordering, which
|
|
202
|
+
* costs nothing to hit at a 2-second poll interval:
|
|
203
|
+
*
|
|
204
|
+
* ```text
|
|
205
|
+
* 1. turn ends → the Stop path writes the turn as a Markdown row (cursor unmoved)
|
|
206
|
+
* 2. `/send` arrives BEFORE the next poll tick
|
|
207
|
+
* 3. the flush saves "everything since the cursor" = the whole finished turn
|
|
208
|
+
* ```
|
|
209
|
+
*
|
|
210
|
+
* The second copy is the pane's scrape of the very same turn, so the chat
|
|
211
|
+
* surface shows one reply twice. A cleaner cannot help: what is duplicated is
|
|
212
|
+
* the real body, not chrome.
|
|
213
|
+
*
|
|
214
|
+
* ## Why a capture rather than an arithmetic bump
|
|
215
|
+
*
|
|
216
|
+
* The cursor is a row index into the pane, and the transcript reader never looks
|
|
217
|
+
* at the pane at all — it reads a JSONL file. The only honest way to say "the
|
|
218
|
+
* pane up to here is already in History" is to ask the pane how tall it is now.
|
|
219
|
+
* The capture is the cached one ({@link captureSessionOutput}, 5s TTL shared
|
|
220
|
+
* with the poller), so a Stop that lands between two ticks usually costs no
|
|
221
|
+
* `tmux capture-pane` at all.
|
|
222
|
+
*
|
|
223
|
+
* ## What it deliberately does not do
|
|
224
|
+
*
|
|
225
|
+
* - **Alternate-screen tools are skipped.** For claude, opencode and copilot the
|
|
226
|
+
* line count is a screen-row constant rather than a cursor (Issue #1268), and
|
|
227
|
+
* {@link savePendingAssistantResponse} refuses to run for them at all — there
|
|
228
|
+
* is no cursor here to advance and writing one would be a lie.
|
|
229
|
+
* - **The cursor only ever moves forward.** A capture shorter than the stored
|
|
230
|
+
* value is a buffer reset, and `detectBufferReset` owns that reading; moving
|
|
231
|
+
* the cursor backwards from here would hand the flush a range it has already
|
|
232
|
+
* saved.
|
|
233
|
+
* - **It never throws, and never changes the caller's answer.** The transcript
|
|
234
|
+
* row is written whether or not this succeeds; a failure here costs one
|
|
235
|
+
* duplicated reply, and a failure that propagated would cost the row.
|
|
236
|
+
*
|
|
237
|
+
* @param target - The instance whose turn was just written to History
|
|
238
|
+
* @returns The cursor's new value, or null when it was left where it was
|
|
239
|
+
*/
|
|
240
|
+
async function advanceCapturedLineForTranscriptTurn(target) {
|
|
241
|
+
const { worktreeId, cliToolId } = target;
|
|
242
|
+
const resolvedInstanceId = target.instanceId ?? cliToolId;
|
|
243
|
+
try {
|
|
244
|
+
if ((0, types_1.usesAlternateScreen)(cliToolId)) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
const output = await (0, cli_session_1.captureSessionOutput)(worktreeId, cliToolId, SESSION_OUTPUT_BUFFER_SIZE, target.instanceId);
|
|
248
|
+
if (!output) {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
const currentLineCount = countCapturedLines(output);
|
|
252
|
+
const { getDbInstance } = await Promise.resolve().then(() => __importStar(require('./db/db-instance')));
|
|
253
|
+
const db = getDbInstance();
|
|
254
|
+
const lastCapturedLine = (0, db_1.getSessionState)(db, worktreeId, resolvedInstanceId)?.lastCapturedLine || 0;
|
|
255
|
+
if (currentLineCount <= lastCapturedLine) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
(0, db_1.updateSessionState)(db, worktreeId, cliToolId, currentLineCount, target.instanceId);
|
|
259
|
+
logger.info('transcript:cursor-advanced', {
|
|
260
|
+
worktreeId,
|
|
261
|
+
instanceId: resolvedInstanceId,
|
|
262
|
+
from: lastCapturedLine,
|
|
263
|
+
to: currentLineCount,
|
|
264
|
+
});
|
|
265
|
+
return currentLineCount;
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
// Never the caller's problem: the transcript row is already written, and the
|
|
269
|
+
// worst this costs is the duplicate it was meant to prevent.
|
|
270
|
+
logger.debug('transcript:cursor-advance-failed', {
|
|
271
|
+
worktreeId,
|
|
272
|
+
instanceId: resolvedInstanceId,
|
|
273
|
+
error: error instanceof Error ? error.message : String(error),
|
|
274
|
+
});
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
115
278
|
/**
|
|
116
279
|
* Save pending assistant response before a new user message
|
|
117
280
|
*
|
|
@@ -170,16 +333,9 @@ async function savePendingAssistantResponse(db, worktreeId, cliToolId, userMessa
|
|
|
170
333
|
if (!output) {
|
|
171
334
|
return null;
|
|
172
335
|
}
|
|
173
|
-
// 3. Calculate current line count
|
|
174
|
-
// Trim trailing empty lines for consistency with response-poller's extractResponse.
|
|
175
|
-
// Without this, tmux buffer padding inflates the line count, causing the poller's
|
|
176
|
-
// dedup check (result.lineCount <= lastCapturedLine) to always trigger.
|
|
336
|
+
// 3. Calculate current line count (see countCapturedLines for the trim).
|
|
177
337
|
const lines = output.split('\n');
|
|
178
|
-
|
|
179
|
-
while (trimmedLength > 0 && lines[trimmedLength - 1].trim() === '') {
|
|
180
|
-
trimmedLength--;
|
|
181
|
-
}
|
|
182
|
-
const currentLineCount = trimmedLength;
|
|
338
|
+
const currentLineCount = countCapturedLines(output);
|
|
183
339
|
// 4. Detect buffer reset (Issue #59 fix)
|
|
184
340
|
const { bufferReset, reason } = detectBufferReset(currentLineCount, lastCapturedLine);
|
|
185
341
|
if (bufferReset) {
|
|
@@ -20,6 +20,7 @@ const db_1 = require("../db");
|
|
|
20
20
|
const logger_1 = require("../../lib/logger");
|
|
21
21
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
22
22
|
const install_hints_1 = require("./install-hints");
|
|
23
|
+
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
23
24
|
const logger = (0, logger_1.createLogger)('cli-tools/vibe-local');
|
|
24
25
|
/**
|
|
25
26
|
* Extract error message from unknown error type (DRY)
|
|
@@ -75,6 +76,15 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
75
76
|
}
|
|
76
77
|
logger.warn('vibe-local-session-relaunch', { sessionName });
|
|
77
78
|
}
|
|
79
|
+
// Issue #1759 / #2444: the one line every tool's creation path owes the
|
|
80
|
+
// rest of the system. vibe-local emits no structured events, so the
|
|
81
|
+
// generation fence itself is inert here — but `beginAgentSession` is also
|
|
82
|
+
// where a superseded session's chat rows are retired, and vibe-local was
|
|
83
|
+
// the only tool that never called it. Placed after the healthy-reuse
|
|
84
|
+
// `return` above and before the pane is touched, exactly as codex places
|
|
85
|
+
// its call: a reuse is the same process and must archive nothing, a
|
|
86
|
+
// relaunch into this same pane is a new one and must.
|
|
87
|
+
(0, agent_session_lifecycle_1.beginAgentSession)({ worktreeId, cliToolId: this.id, instanceId });
|
|
78
88
|
try {
|
|
79
89
|
// Issue #2070: creation only. On the relaunch path the pane already
|
|
80
90
|
// exists and holds the transcript of the process that died in it; the
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
* @module lib/hooks/hook-settings-generator
|
|
44
44
|
*/
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.PERMISSION_DENY_RULES = exports.TOOL_USE_MATCHER = exports.NOTIFICATION_MATCHER = exports.AUTH_TOKEN_ENV_VAR = exports.PERMISSION_REQUEST_TIMEOUT_SECONDS = exports.HOOK_TIMEOUT_SECONDS = exports.PERMISSION_REQUEST_PATH = exports.AGENT_EVENT_PATH = void 0;
|
|
46
|
+
exports.PERMISSION_DENY_RULES = exports.TMUX_UNPINNED_DENY_RULES = exports.TOOL_USE_MATCHER = exports.NOTIFICATION_MATCHER = exports.AUTH_TOKEN_ENV_VAR = exports.PERMISSION_REQUEST_TIMEOUT_SECONDS = exports.HOOK_TIMEOUT_SECONDS = exports.PERMISSION_REQUEST_PATH = exports.AGENT_EVENT_PATH = void 0;
|
|
47
47
|
exports.isHookInjectionEnabled = isHookInjectionEnabled;
|
|
48
48
|
exports.isAuthTokenExpected = isAuthTokenExpected;
|
|
49
49
|
exports.getHookSettingsDirectory = getHookSettingsDirectory;
|
|
@@ -127,6 +127,62 @@ exports.NOTIFICATION_MATCHER = 'permission_prompt|idle_prompt';
|
|
|
127
127
|
* receiver takes.
|
|
128
128
|
*/
|
|
129
129
|
exports.TOOL_USE_MATCHER = permission_request_payload_1.ASK_USER_QUESTION_TOOL;
|
|
130
|
+
/**
|
|
131
|
+
* tmux spellings that reach whichever server the ambient environment points at
|
|
132
|
+
* (Issue #2442).
|
|
133
|
+
*
|
|
134
|
+
* On 2026-09-08 22:53 JST all 42 `mcbd-*` sessions on the default tmux server
|
|
135
|
+
* were destroyed by a socket-less `tmux kill-server` run from an ad-hoc Bash
|
|
136
|
+
* block — the second such wipe after 2026-08-02 (#1624). The block had set
|
|
137
|
+
* `TMUX_TMPDIR` first, which reads as isolation and is not: tmux consults it
|
|
138
|
+
* only while `$TMUX` is unset, and every CommandMate agent runs inside a pane.
|
|
139
|
+
*
|
|
140
|
+
* A tmux invocation carries its target as a *global option before the
|
|
141
|
+
* subcommand* — `-L <name>` (socket name) or `-S <path>` (socket path) — and
|
|
142
|
+
* both outrank `$TMUX`. So "which server does this hit" is decidable from the
|
|
143
|
+
* argv shape alone, and that is what these rules read: a command whose first
|
|
144
|
+
* word is `tmux` and whose second is a destroying or server-global subcommand
|
|
145
|
+
* names no socket and therefore hits the shared one.
|
|
146
|
+
*
|
|
147
|
+
* The pinned spelling of every rule below is deliberately *not* covered, which
|
|
148
|
+
* is what keeps the isolated-probe recipes in `docs/design/` working. "Not
|
|
149
|
+
* covered" means "no new deny rule matches it", not "pre-approved": such a
|
|
150
|
+
* command still goes through the session's normal permission handling.
|
|
151
|
+
*
|
|
152
|
+
* Aliases get their own entry because Claude's prefix matching is **token-exact
|
|
153
|
+
* and adjacency-sensitive**, measured on 2.1.266 in
|
|
154
|
+
* `docs/design/agent-hooks-permission-deny-verification.md` §6: a rule naming
|
|
155
|
+
* `tmux list-p` left `tmux list-panes` untouched, and one naming
|
|
156
|
+
* `tmux show-options -g` left both `tmux show-options -gv …` and
|
|
157
|
+
* `tmux show-options -t 0 -g` untouched. A single truncated rule covering a
|
|
158
|
+
* family is therefore not available — it would load without error and match
|
|
159
|
+
* nothing. `bind` / `unbind` / `set` are tmux's own documented aliases for
|
|
160
|
+
* `bind-key` / `unbind-key` / `set-option`; `kill-server` and `kill-session`
|
|
161
|
+
* have none.
|
|
162
|
+
*
|
|
163
|
+
* Shapes that escape these rules (absolute path, `bash -c`, another global
|
|
164
|
+
* option before the subcommand, tmux's unambiguous-prefix abbreviations,
|
|
165
|
+
* combined global flags) are measured and listed in §6.4 of the same document
|
|
166
|
+
* rather than guessed at here. This layer narrows the accident, it does not
|
|
167
|
+
* close the class — `env-clean` (#1740) is the after-the-fact detector.
|
|
168
|
+
*/
|
|
169
|
+
exports.TMUX_UNPINNED_DENY_RULES = [
|
|
170
|
+
// Destroys every session on the server it reaches. The 2026-08-02 and
|
|
171
|
+
// 2026-09-08 wipes were both this word.
|
|
172
|
+
'Bash(tmux kill-server:*)',
|
|
173
|
+
// `-t` included on purpose: an exact-match `kill-session -t '=name:'` is safe
|
|
174
|
+
// only about *what* it names, never about *where* — and the static guard's
|
|
175
|
+
// exemption for that spelling is why agent recipes must pin the socket.
|
|
176
|
+
'Bash(tmux kill-session:*)',
|
|
177
|
+
// Server-global mutations outlive the caller and are shared with every session
|
|
178
|
+
// on that server.
|
|
179
|
+
'Bash(tmux set-option -g:*)',
|
|
180
|
+
'Bash(tmux set -g:*)',
|
|
181
|
+
'Bash(tmux bind-key:*)',
|
|
182
|
+
'Bash(tmux bind:*)',
|
|
183
|
+
'Bash(tmux unbind-key:*)',
|
|
184
|
+
'Bash(tmux unbind:*)',
|
|
185
|
+
];
|
|
130
186
|
/**
|
|
131
187
|
* Bash spellings this server refuses to let an agent run (Issue #1739).
|
|
132
188
|
*
|
|
@@ -162,11 +218,15 @@ exports.TOOL_USE_MATCHER = permission_request_payload_1.ASK_USER_QUESTION_TOOL;
|
|
|
162
218
|
* signals every process the user owns and `kill -9 -<pgid>` a whole group; the
|
|
163
219
|
* default `kill` (SIGTERM) is untouched, so the graceful spelling of the same
|
|
164
220
|
* intent is the one that survives.
|
|
221
|
+
*
|
|
222
|
+
* Issue #2442 adds the tmux half of the same story: see
|
|
223
|
+
* {@link TMUX_UNPINNED_DENY_RULES}.
|
|
165
224
|
*/
|
|
166
225
|
exports.PERMISSION_DENY_RULES = [
|
|
167
226
|
'Bash(pkill:*)',
|
|
168
227
|
'Bash(killall:*)',
|
|
169
228
|
'Bash(kill -9:*)',
|
|
229
|
+
...exports.TMUX_UNPINNED_DENY_RULES,
|
|
170
230
|
];
|
|
171
231
|
/** Relay script shipped with the package (`files: ["scripts/hooks/"]`). */
|
|
172
232
|
const RELAY_SCRIPT_RELATIVE_PATH = (0, path_1.join)('scripts', 'hooks', 'cmate-agent-event.sh');
|