commandmate 0.43.0 → 0.44.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +357 -361
- package/.next/app-path-routes-manifest.json +33 -33
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +2 -2
- package/.next/server/app/api/app/update/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route.js +2 -2
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +7 -7
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +103 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +9 -9
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +33 -33
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1501.js +3 -3
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2283.js +15 -0
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4802.js +1 -1
- package/.next/server/chunks/488.js +1 -0
- package/.next/server/chunks/5326.js +1 -1
- package/.next/server/chunks/5456.js +1 -1
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6474.js +14 -0
- package/.next/server/chunks/650.js +1 -0
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/{5742.js → 6927.js} +1 -1
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8543.js +1 -1
- package/.next/server/chunks/8581.js +2 -2
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -0
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8918.js +105 -3
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/967.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js +2 -2
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/{1642-767aed8e7c61ef7f.js → 1642-fb2e176aaadbd137.js} +1 -1
- package/.next/static/chunks/2053-85a974ddfe7498fe.js +1 -0
- package/.next/static/chunks/{2407-940df9b11fadafc6.js → 2407-f1f258d4a1d92620.js} +1 -1
- package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
- package/.next/static/chunks/344-e1cefd00787060e4.js +1 -0
- package/.next/static/chunks/3922.f45dcfc1e7da552a.js +1 -0
- package/.next/static/chunks/5521-c358c31f60e5e689.js +1 -0
- package/.next/static/chunks/591-308072f285c34787.js +1 -0
- package/.next/static/chunks/6654-ac431270fac1a283.js +1 -0
- package/.next/static/chunks/{8165-3525fb42f1b4976e.js → 8165-3853772f6ae1299b.js} +1 -1
- package/.next/static/chunks/{8566-a6a7c70558927410.js → 8566-aeda747542072ace.js} +1 -1
- package/.next/static/chunks/8811-29eaa24237f48558.js +1 -0
- package/.next/static/chunks/{9619-22adf5367c4b7080.js → 9619-6c17a271f7f98fbb.js} +1 -1
- package/.next/static/chunks/998-2eb5883186abd0bd.js +1 -0
- package/.next/static/chunks/app/layout-da66300cc20244ed.js +1 -0
- package/.next/static/chunks/app/more/{page-30057cf1e0762ad2.js → page-87c84987b2765213.js} +1 -1
- package/.next/static/chunks/app/{page-8483ba400af011f5.js → page-1b820c421db48c2c.js} +1 -1
- package/.next/static/chunks/app/review/page-95f749caae382f46.js +1 -0
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-74aac15286504ef4.js → page-9ee7a381636e60cb.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-040c5f0f585e6812.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
- package/.next/static/chunks/{webpack-49ade0526854dd4e.js → webpack-021f0741f22dd16a.js} +1 -1
- package/.next/static/css/38070d879efa1371.css +1 -0
- package/.next/trace +13 -13
- package/README.md +90 -605
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +11 -1
- package/dist/cli/commands/docs.d.ts.map +1 -1
- package/dist/cli/commands/docs.js +5 -0
- package/dist/cli/commands/remote.d.ts +34 -1
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +171 -6
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +255 -112
- package/dist/cli/commands/stop.d.ts.map +1 -1
- package/dist/cli/commands/stop.js +53 -1
- package/dist/cli/commands/sync.js +3 -3
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +11 -0
- package/dist/cli/docs/setup-guide.d.ts +14 -0
- package/dist/cli/docs/setup-guide.d.ts.map +1 -0
- package/dist/cli/docs/setup-guide.js +368 -0
- package/dist/cli/types/api-responses.d.ts +21 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +2 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/daemon.d.ts +42 -2
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +222 -40
- package/dist/cli/utils/docs-reader.d.ts +6 -0
- package/dist/cli/utils/docs-reader.d.ts.map +1 -1
- package/dist/cli/utils/docs-reader.js +14 -13
- package/dist/cli/utils/npm-runner.d.ts +12 -0
- package/dist/cli/utils/npm-runner.d.ts.map +1 -1
- package/dist/cli/utils/npm-runner.js +36 -0
- package/dist/cli/utils/process-inspect.d.ts +55 -0
- package/dist/cli/utils/process-inspect.d.ts.map +1 -0
- package/dist/cli/utils/process-inspect.js +214 -0
- package/dist/cli/utils/remote-pairing.d.ts +68 -0
- package/dist/cli/utils/remote-pairing.d.ts.map +1 -0
- package/dist/cli/utils/remote-pairing.js +117 -0
- package/dist/cli/utils/server-identity.d.ts +50 -0
- package/dist/cli/utils/server-identity.d.ts.map +1 -0
- package/dist/cli/utils/server-identity.js +118 -0
- package/dist/cli/utils/server-ready.d.ts +13 -0
- package/dist/cli/utils/server-ready.d.ts.map +1 -1
- package/dist/cli/utils/server-ready.js +16 -0
- package/dist/lib/detection/status-reason.d.ts +17 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +17 -0
- package/dist/lib/security/pairing-code.d.ts +2 -1
- package/dist/lib/security/pairing-code.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +41 -7
- package/dist/server/locales/ja/worktree.json +41 -7
- package/dist/server/src/config/image-extensions.js +1 -0
- package/dist/server/src/config/session-starting-config.js +75 -0
- package/dist/server/src/lib/auto-yes-poller.js +22 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +2 -1
- package/dist/server/src/lib/cli-tools/base.js +15 -1
- package/dist/server/src/lib/cli-tools/codex.js +3 -2
- package/dist/server/src/lib/cli-tools/command-code-plan-review.js +175 -0
- package/dist/server/src/lib/cli-tools/command-code.js +30 -4
- package/dist/server/src/lib/cli-tools/copilot.js +2 -1
- package/dist/server/src/lib/cli-tools/gemini.js +2 -1
- package/dist/server/src/lib/cli-tools/liveness-spec.js +27 -9
- package/dist/server/src/lib/cli-tools/opencode-v2.js +2 -1
- package/dist/server/src/lib/cli-tools/opencode.js +2 -1
- package/dist/server/src/lib/cli-tools/vibe-local.js +2 -1
- package/dist/server/src/lib/detection/cli-patterns.js +94 -1
- package/dist/server/src/lib/detection/status-reason.js +17 -0
- package/dist/server/src/lib/detection/tool-liveness.js +3 -1
- package/dist/server/src/lib/detection/tools/codex/detect.js +26 -0
- package/dist/server/src/lib/detection/tools/command-code/plan-review-state.js +75 -0
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +33 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +5 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -0
- package/dist/server/src/lib/session/claude-executor.js +2 -2
- package/dist/server/src/lib/session/claude-session.js +138 -16
- package/dist/server/src/lib/session/current-output-builder.js +49 -21
- package/dist/server/src/lib/session/launch-screen.js +57 -0
- package/dist/server/src/lib/session/session-start-error.js +20 -0
- package/dist/server/src/lib/session/session-starting-state.js +236 -0
- package/dist/server/src/lib/skills/agent-state-paths.js +39 -0
- package/dist/server/src/lib/skills/receipt-owned-paths.js +118 -0
- package/dist/server/src/lib/tmux/tmux.js +25 -0
- package/dist/server/src/lib/verification/env-clean-gate.js +195 -6
- package/dist/server/src/lib/verification/gate-runner.js +29 -2
- package/dist/server/src/lib/verification/scope-gate.js +58 -4
- package/docs/en/architecture.md +722 -0
- package/docs/en/user-guide/agents-guide.md +306 -0
- package/docs/en/user-guide/cli-setup-guide.md +676 -0
- package/docs/en/user-guide/cmate-schedules-guide.md +388 -0
- package/docs/en/user-guide/commands-guide.md +467 -0
- package/docs/en/user-guide/quick-start.md +231 -0
- package/docs/en/user-guide/webapp-guide.md +1020 -0
- package/docs/en/user-guide/workflow-examples.md +463 -0
- package/package.json +18 -7
- package/release-notes/0.44.0.json +82 -0
- package/release-notes/0.44.1.json +54 -0
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/3707.js +0 -15
- package/.next/server/chunks/6491.js +0 -103
- package/.next/server/chunks/7004.js +0 -1
- package/.next/server/chunks/8673.js +0 -14
- package/.next/static/chunks/2039-117a361f795ddc4b.js +0 -1
- package/.next/static/chunks/2053-611dd27d42721b79.js +0 -1
- package/.next/static/chunks/344-6f9fc1f38f01a839.js +0 -1
- package/.next/static/chunks/3778-56f41fc2cecb8c43.js +0 -1
- package/.next/static/chunks/3922.8e79fc89f593280b.js +0 -1
- package/.next/static/chunks/5449-6cb80bab2bd06b79.js +0 -1
- package/.next/static/chunks/6966-bb854d1145783a64.js +0 -1
- package/.next/static/chunks/7705-1f58d4c03d991fcf.js +0 -1
- package/.next/static/chunks/app/layout-057c850cd0df978e.js +0 -1
- package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +0 -1
- package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +0 -1
- package/.next/static/css/b3f433d52b8ed5c8.css +0 -1
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → 57lOiz8zSEHdw97XIm0af}/_buildManifest.js +0 -0
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → 57lOiz8zSEHdw97XIm0af}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Which agent sessions are still starting (Issue #3179).
|
|
4
|
+
*
|
|
5
|
+
* `isRunning` is tmux's `has-session`, and every tool's `launchSession` creates
|
|
6
|
+
* the tmux session BEFORE it types the launch command — so from that moment the
|
|
7
|
+
* screen saw a "running" session whose pane held nothing but a shell prompt and
|
|
8
|
+
* the launch line. That frame matches no tool's rule, falls to the detector's
|
|
9
|
+
* floor (`running` / `default`) and raised `isUnclassifiedActive`, which drew the
|
|
10
|
+
* Navigate pad; the trust dialog the launch answers by itself was drawn as a
|
|
11
|
+
* selection list or a prompt; and the composer's stop button lit up red.
|
|
12
|
+
*
|
|
13
|
+
* This module is the missing fact: "a launch of this (worktree, tool, instance)
|
|
14
|
+
* is in progress, and began at T". It is written by `beginAgentSession` (every
|
|
15
|
+
* tool's creation path goes through it) and cleared by `BaseCLITool.startSession`
|
|
16
|
+
* in a `finally`, success and failure alike — which also covers the
|
|
17
|
+
* `relaunchIfToolExited` path, because that reuses `startSession`.
|
|
18
|
+
*
|
|
19
|
+
* ## Whose record it is (Issue #3195)
|
|
20
|
+
*
|
|
21
|
+
* The key is (worktree, tool, instance), and a key outlives a launch: kill a
|
|
22
|
+
* launch mid-way and start the instance again, and the killed `startSession`
|
|
23
|
+
* is still in its readiness wait (agy: up to 30 s) while the new one writes
|
|
24
|
+
* the same key. When the old one finished, its `finally` deleted the new
|
|
25
|
+
* launch's record and the new "starting" display ended early.
|
|
26
|
+
*
|
|
27
|
+
* So every launch carries a token. `startSession` issues one
|
|
28
|
+
* ({@link issueSessionStartingToken}) and runs `launchSession` inside
|
|
29
|
+
* {@link runWithSessionStartingToken}; `markSessionStarting`, reached from
|
|
30
|
+
* `beginAgentSession` anywhere below that call, picks it up from the
|
|
31
|
+
* `AsyncLocalStorage`, and the `finally` clears with it — a record written
|
|
32
|
+
* under another token is left alone. A second mark under the same token (codex's
|
|
33
|
+
* `relaunchIntoSamePane`) rewrites the same launch's record, so the `finally`
|
|
34
|
+
* still clears it. A mark never replaces a record of a LATER launch (tokens
|
|
35
|
+
* only grow), so a killed launch that re-marks on its way out cannot take the
|
|
36
|
+
* key back from its successor. `clearSessionStarting` without a token — the
|
|
37
|
+
* kill-session route — drops the record whoever wrote it.
|
|
38
|
+
*
|
|
39
|
+
* ## The escape hatches
|
|
40
|
+
*
|
|
41
|
+
* A starting display that never ends would hide a stuck launch, which is worse
|
|
42
|
+
* than the defect it fixes. So the record stops answering when:
|
|
43
|
+
*
|
|
44
|
+
* - the launch returned or threw (`clearSessionStarting`);
|
|
45
|
+
* - it is older than the tool's readiness wait plus a grace period
|
|
46
|
+
* (`getSessionStartingMaxMs`) — several tools only log when that wait runs
|
|
47
|
+
* out and carry on, so time is the only signal there is;
|
|
48
|
+
* - a dialog has stayed on screen for longer than the launch takes to answer
|
|
49
|
+
* the ones it knows about (`SESSION_STARTING_PROMPT_GRACE_MS`) — a login or
|
|
50
|
+
* an unknown dialog, which a human has to see. Once released this way the
|
|
51
|
+
* record stays released for the rest of the launch, so the display does not
|
|
52
|
+
* flicker back when the dialog is answered.
|
|
53
|
+
*
|
|
54
|
+
* A server restart drops the map, and the screen shows the raw pane — harmless.
|
|
55
|
+
*
|
|
56
|
+
* In memory and on `globalThis` for the reason every shared map in this
|
|
57
|
+
* subsystem is (#1736): the writer (`POST /send`) and the readers
|
|
58
|
+
* (`/current-output`, the WebSocket streamer, `GET /api/worktrees`) are
|
|
59
|
+
* different route bundles under `next dev`.
|
|
60
|
+
*
|
|
61
|
+
* @module lib/session/session-starting-state
|
|
62
|
+
*/
|
|
63
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
64
|
+
exports.issueSessionStartingToken = issueSessionStartingToken;
|
|
65
|
+
exports.runWithSessionStartingToken = runWithSessionStartingToken;
|
|
66
|
+
exports.markSessionStarting = markSessionStarting;
|
|
67
|
+
exports.clearSessionStarting = clearSessionStarting;
|
|
68
|
+
exports.getSessionStartingSince = getSessionStartingSince;
|
|
69
|
+
exports.observeSessionStartingFrame = observeSessionStartingFrame;
|
|
70
|
+
exports.startingStatusResult = startingStatusResult;
|
|
71
|
+
exports.resetSessionStartingState = resetSessionStartingState;
|
|
72
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
73
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
74
|
+
const status_reason_1 = require("../../lib/detection/status-reason");
|
|
75
|
+
const session_starting_config_1 = require("../../config/session-starting-config");
|
|
76
|
+
const records = globalThis.__sessionStartingRecords ??
|
|
77
|
+
(globalThis.__sessionStartingRecords = new Map());
|
|
78
|
+
/** On `globalThis` like the map, so tokens keep growing across route bundles. */
|
|
79
|
+
const tokenSeq = globalThis.__sessionStartingTokenSeq ??
|
|
80
|
+
(globalThis.__sessionStartingTokenSeq = { last: 0 });
|
|
81
|
+
const tokenScope = globalThis.__sessionStartingTokenScope ??
|
|
82
|
+
(globalThis.__sessionStartingTokenScope = new node_async_hooks_1.AsyncLocalStorage());
|
|
83
|
+
/**
|
|
84
|
+
* A token for a launch about to begin (Issue #3195). Strictly greater than
|
|
85
|
+
* every token issued before it.
|
|
86
|
+
*/
|
|
87
|
+
function issueSessionStartingToken() {
|
|
88
|
+
tokenSeq.last += 1;
|
|
89
|
+
return tokenSeq.last;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Run a launch under its token, so a `markSessionStarting` anywhere below it
|
|
93
|
+
* records the launch as this token's (Issue #3195).
|
|
94
|
+
*
|
|
95
|
+
* @param token - From {@link issueSessionStartingToken}
|
|
96
|
+
* @param fn - The launch
|
|
97
|
+
*/
|
|
98
|
+
function runWithSessionStartingToken(token, fn) {
|
|
99
|
+
return tokenScope.run(token, fn);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Record that a launch of this instance began.
|
|
103
|
+
*
|
|
104
|
+
* Under the launch's token: the one {@link runWithSessionStartingToken} is
|
|
105
|
+
* running, or a fresh one outside any. A record of a later launch is kept —
|
|
106
|
+
* this call is then a launch that was already superseded (Issue #3195).
|
|
107
|
+
*
|
|
108
|
+
* @param worktreeId - Worktree ID
|
|
109
|
+
* @param cliToolId - Tool being launched
|
|
110
|
+
* @param instanceId - Instance (defaults to the primary)
|
|
111
|
+
* @param at - Epoch ms; defaults to now
|
|
112
|
+
* @returns The token the record was written under, or null when it was not written
|
|
113
|
+
*/
|
|
114
|
+
function markSessionStarting(worktreeId, cliToolId, instanceId, at = Date.now()) {
|
|
115
|
+
const token = tokenScope.getStore() ?? issueSessionStartingToken();
|
|
116
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
117
|
+
const existing = records.get(key);
|
|
118
|
+
if (existing !== undefined && existing.token > token)
|
|
119
|
+
return null;
|
|
120
|
+
records.set(key, {
|
|
121
|
+
cliToolId,
|
|
122
|
+
token,
|
|
123
|
+
since: at,
|
|
124
|
+
promptSeenAt: null,
|
|
125
|
+
released: false,
|
|
126
|
+
});
|
|
127
|
+
return token;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Forget the launch of this instance. Idempotent, and never throws: it runs in
|
|
131
|
+
* `startSession`'s `finally`, where an exception would replace the launch's own
|
|
132
|
+
* error — an id `buildCompositeKey` refuses could never have been recorded.
|
|
133
|
+
*
|
|
134
|
+
* With a token, only that launch's record is dropped — a launch that was
|
|
135
|
+
* killed and replaced must not end its successor's display (Issue #3195).
|
|
136
|
+
* Without one (kill-session), the record is dropped whoever wrote it.
|
|
137
|
+
*
|
|
138
|
+
* @param worktreeId - Worktree ID
|
|
139
|
+
* @param cliToolId - Tool that was launched
|
|
140
|
+
* @param instanceId - Instance (defaults to the primary)
|
|
141
|
+
* @param token - The launch's token; omit to drop any launch's record
|
|
142
|
+
*/
|
|
143
|
+
function clearSessionStarting(worktreeId, cliToolId, instanceId, token) {
|
|
144
|
+
try {
|
|
145
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
146
|
+
if (token !== undefined && records.get(key)?.token !== token)
|
|
147
|
+
return;
|
|
148
|
+
records.delete(key);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Nothing was recorded under an id that does not compose into a key.
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** The record's start time while it still answers, else null (dropping an expired one). */
|
|
155
|
+
function activeSince(key, record, now) {
|
|
156
|
+
if (record === undefined || record.released)
|
|
157
|
+
return null;
|
|
158
|
+
if (now - record.since > (0, session_starting_config_1.getSessionStartingMaxMs)(record.cliToolId)) {
|
|
159
|
+
records.delete(key);
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
return record.since;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* When this instance's launch began, or null when it is not starting (no
|
|
166
|
+
* launch, already finished, past its time bound, or released by a dialog).
|
|
167
|
+
*
|
|
168
|
+
* Read-only apart from dropping an expired record.
|
|
169
|
+
*
|
|
170
|
+
* @param worktreeId - Worktree ID
|
|
171
|
+
* @param cliToolId - Tool
|
|
172
|
+
* @param instanceId - Instance (defaults to the primary)
|
|
173
|
+
* @param now - Epoch ms; defaults to now
|
|
174
|
+
*/
|
|
175
|
+
function getSessionStartingSince(worktreeId, cliToolId, instanceId, now = Date.now()) {
|
|
176
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
177
|
+
return activeSince(key, records.get(key), now);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* {@link getSessionStartingSince}, fed what the current frame shows.
|
|
181
|
+
*
|
|
182
|
+
* A dialog on screen (a prompt, a selection list, any `waiting` verdict) starts
|
|
183
|
+
* a dwell; one that outlives {@link SESSION_STARTING_PROMPT_GRACE_MS} is a
|
|
184
|
+
* dialog the launch is not going to answer, and the record is released so the
|
|
185
|
+
* screen shows it. A frame with no dialog resets the dwell.
|
|
186
|
+
*
|
|
187
|
+
* @param worktreeId - Worktree ID
|
|
188
|
+
* @param cliToolId - Tool
|
|
189
|
+
* @param instanceId - Instance (defaults to the primary)
|
|
190
|
+
* @param dialogVisible - Whether the frame shows a dialog
|
|
191
|
+
* @param now - Epoch ms; defaults to now
|
|
192
|
+
* @returns The launch's start time while it is still shown as starting, else null
|
|
193
|
+
*/
|
|
194
|
+
function observeSessionStartingFrame(worktreeId, cliToolId, instanceId, dialogVisible, now = Date.now()) {
|
|
195
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
196
|
+
const record = records.get(key);
|
|
197
|
+
const since = activeSince(key, record, now);
|
|
198
|
+
if (since === null || record === undefined)
|
|
199
|
+
return null;
|
|
200
|
+
if (!dialogVisible) {
|
|
201
|
+
record.promptSeenAt = null;
|
|
202
|
+
return since;
|
|
203
|
+
}
|
|
204
|
+
record.promptSeenAt ??= now;
|
|
205
|
+
if (now - record.promptSeenAt >= session_starting_config_1.SESSION_STARTING_PROMPT_GRACE_MS) {
|
|
206
|
+
record.released = true;
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
return since;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* The verdict published for a frame under a launch in progress (Issue #3179).
|
|
213
|
+
*
|
|
214
|
+
* `running` with the `starting` reason: the session exists and is busy, and no
|
|
215
|
+
* dialog, selection list or unclassified overlay is on it for anybody to drive.
|
|
216
|
+
* `positive` because the launch record is an observation this server made, not
|
|
217
|
+
* a pattern that failed to match. The raw verdict is not consulted beyond its
|
|
218
|
+
* `confidence`; reading anything else off it is what this replaces.
|
|
219
|
+
*
|
|
220
|
+
* @param raw - What the detector said about the frame
|
|
221
|
+
* @returns The neutral verdict for the same frame
|
|
222
|
+
*/
|
|
223
|
+
function startingStatusResult(raw) {
|
|
224
|
+
return {
|
|
225
|
+
...raw,
|
|
226
|
+
status: 'running',
|
|
227
|
+
reason: status_reason_1.STATUS_REASON.STARTING,
|
|
228
|
+
hasActivePrompt: false,
|
|
229
|
+
promptDetection: { ...raw.promptDetection, isPrompt: false, promptData: undefined },
|
|
230
|
+
evidence: 'positive',
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/** Drop every record. For tests. */
|
|
234
|
+
function resetSessionStartingState() {
|
|
235
|
+
records.clear();
|
|
236
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* State files an agent CLI writes into the worktree on its own (Issue #3126)
|
|
4
|
+
*
|
|
5
|
+
* Command Code leaves `.commandcode/settings.local.json` and
|
|
6
|
+
* `.commandcode/taste/**` behind in any folder it runs in. Counted as change,
|
|
7
|
+
* they made a contract's `requireScopeClean` fail on a worktree whose worker
|
|
8
|
+
* stayed inside `allow`, and made `work-evidence` pass on one nobody worked in.
|
|
9
|
+
*
|
|
10
|
+
* Unlike receipt-owned paths (#3092) there is no receipt to vouch for them, so
|
|
11
|
+
* the declaration below is the whole rule, and it names files, never a whole
|
|
12
|
+
* directory: `.commandcode/` also holds things a task may legitimately change,
|
|
13
|
+
* and allowing it wholesale would wave those through. Callers apply this to
|
|
14
|
+
* **untracked** entries only, as for #3092: a committed or tracked-and-modified
|
|
15
|
+
* file is history the branch carries.
|
|
16
|
+
*
|
|
17
|
+
* Only paths whose existence is confirmed are declared. Other agents (claude,
|
|
18
|
+
* codex, ...) are deliberately absent until someone has seen them write one.
|
|
19
|
+
*
|
|
20
|
+
* @module lib/skills/agent-state-paths
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.AGENT_STATE_DIR_PREFIXES = exports.AGENT_STATE_FILES = void 0;
|
|
24
|
+
exports.isAgentStatePath = isAgentStatePath;
|
|
25
|
+
exports.isAgentStateUntrackedEntry = isAgentStateUntrackedEntry;
|
|
26
|
+
/** Exact repository-relative files an agent CLI manages itself. */
|
|
27
|
+
exports.AGENT_STATE_FILES = ['.commandcode/settings.local.json'];
|
|
28
|
+
/** Directory prefixes (with trailing slash) an agent CLI manages itself. */
|
|
29
|
+
exports.AGENT_STATE_DIR_PREFIXES = ['.commandcode/taste/'];
|
|
30
|
+
/** Whether `path` is a declared agent-managed state path. */
|
|
31
|
+
function isAgentStatePath(path) {
|
|
32
|
+
if (exports.AGENT_STATE_FILES.includes(path))
|
|
33
|
+
return true;
|
|
34
|
+
return exports.AGENT_STATE_DIR_PREFIXES.some((prefix) => path.startsWith(prefix) && !path.slice(prefix.length).split('/').includes('..'));
|
|
35
|
+
}
|
|
36
|
+
/** Whether a porcelain record is an untracked file made only of such paths. */
|
|
37
|
+
function isAgentStateUntrackedEntry(entry) {
|
|
38
|
+
return entry.status === '??' && entry.paths.every(isAgentStatePath);
|
|
39
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Files CommandMate itself placed into a worktree by installing a Skill (Issue #3092)
|
|
4
|
+
*
|
|
5
|
+
* `skill install` leaves `.agents/skills/<id>/…` and `.claude/skills/<id>/…`
|
|
6
|
+
* untracked. Counted as change, those files made `work-evidence` pass on a
|
|
7
|
+
* worktree nobody had worked in (`uncommitted=74`), and made a contract's
|
|
8
|
+
* `requireScopeClean` fail on a worktree whose agent stayed inside `allow`.
|
|
9
|
+
*
|
|
10
|
+
* The answer is the receipt, and only the receipt. A path is reported as
|
|
11
|
+
* CommandMate-owned when **all** of the following hold, so that nothing the
|
|
12
|
+
* user or the agent wrote can be laundered through it into a false "no work":
|
|
13
|
+
*
|
|
14
|
+
* - a receipt parses at `.agents/skills/<id>/.commandmate-receipt.json`, and
|
|
15
|
+
* its `skill_id` is that directory's name;
|
|
16
|
+
* - the root it names is `<known install prefix>/<skill_id>` — a receipt
|
|
17
|
+
* claiming `src` or `.commandcode` as a root claims nothing;
|
|
18
|
+
* - the file is listed in the receipt's `files`, is a regular file, and its
|
|
19
|
+
* bytes still hash to the recorded `sha256`. A Skill file the agent edited
|
|
20
|
+
* is the agent's change and stays counted;
|
|
21
|
+
* - for the receipt itself in a secondary root: byte-identical to the
|
|
22
|
+
* primary's.
|
|
23
|
+
*
|
|
24
|
+
* Callers apply the result to **untracked** entries only. A committed or
|
|
25
|
+
* tracked-and-modified Skill file is history the branch carries, and judging
|
|
26
|
+
* it is unchanged by this module.
|
|
27
|
+
*
|
|
28
|
+
* @module lib/skills/receipt-owned-paths
|
|
29
|
+
*/
|
|
30
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
|
+
};
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
exports.collectSkillReceiptOwnedPaths = collectSkillReceiptOwnedPaths;
|
|
35
|
+
const crypto_1 = require("crypto");
|
|
36
|
+
const fs_1 = require("fs");
|
|
37
|
+
const path_1 = __importDefault(require("path"));
|
|
38
|
+
const constants_1 = require("../../lib/skills/constants");
|
|
39
|
+
const install_plan_1 = require("../../lib/skills/install-plan");
|
|
40
|
+
function sha256Hex(bytes) {
|
|
41
|
+
return (0, crypto_1.createHash)('sha256').update(bytes).digest('hex');
|
|
42
|
+
}
|
|
43
|
+
/** Read a regular file (never through a link), or null. */
|
|
44
|
+
function readRegularFile(absolute) {
|
|
45
|
+
try {
|
|
46
|
+
if (!(0, fs_1.lstatSync)(absolute).isFile())
|
|
47
|
+
return null;
|
|
48
|
+
return (0, fs_1.readFileSync)(absolute);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** A receipt-relative payload path that cannot leave its root. */
|
|
55
|
+
function isSafeRelativePath(relative) {
|
|
56
|
+
if (relative === '' || relative.startsWith('/') || relative.includes('\\'))
|
|
57
|
+
return false;
|
|
58
|
+
return relative.split('/').every((segment) => segment !== '' && segment !== '.' && segment !== '..');
|
|
59
|
+
}
|
|
60
|
+
function isValidSkillId(skillId) {
|
|
61
|
+
return constants_1.SKILL_ID_PATTERN.test(skillId) && skillId.length <= constants_1.SKILL_ID_MAX_LENGTH;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Repository-relative POSIX paths of every untouched file a recorded Skill
|
|
65
|
+
* install placed in this worktree, receipts included.
|
|
66
|
+
*
|
|
67
|
+
* Never throws: an unreadable directory or receipt contributes nothing, which
|
|
68
|
+
* leaves those files counted exactly as before #3092.
|
|
69
|
+
*/
|
|
70
|
+
function collectSkillReceiptOwnedPaths(worktreePath) {
|
|
71
|
+
const owned = new Set();
|
|
72
|
+
const primaryAbs = path_1.default.join(worktreePath, constants_1.SKILL_PRIMARY_INSTALL_ROOT_PREFIX);
|
|
73
|
+
let skillDirs;
|
|
74
|
+
try {
|
|
75
|
+
skillDirs = (0, fs_1.readdirSync)(primaryAbs);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return owned;
|
|
79
|
+
}
|
|
80
|
+
for (const skillId of skillDirs) {
|
|
81
|
+
if (!isValidSkillId(skillId))
|
|
82
|
+
continue;
|
|
83
|
+
const primaryRoot = `${constants_1.SKILL_PRIMARY_INSTALL_ROOT_PREFIX}/${skillId}`;
|
|
84
|
+
const receiptBytes = readRegularFile(path_1.default.join(worktreePath, primaryRoot, install_plan_1.SKILL_RECEIPT_FILENAME));
|
|
85
|
+
if (receiptBytes === null)
|
|
86
|
+
continue;
|
|
87
|
+
const receipt = (0, install_plan_1.parseInstalledReceipt)(receiptBytes);
|
|
88
|
+
if (receipt === null || receipt.skill_id !== skillId)
|
|
89
|
+
continue;
|
|
90
|
+
const allowedRoots = new Set(constants_1.SKILL_INSTALL_ROOT_PREFIXES.map((prefix) => `${prefix}/${skillId}`));
|
|
91
|
+
const roots = (0, install_plan_1.receiptInstallRoots)(receipt);
|
|
92
|
+
// The receipt that names the roots must live in the primary one.
|
|
93
|
+
if (roots[0] !== primaryRoot)
|
|
94
|
+
continue;
|
|
95
|
+
for (const root of roots) {
|
|
96
|
+
if (typeof root !== 'string' || !allowedRoots.has(root))
|
|
97
|
+
continue;
|
|
98
|
+
const rootReceipt = readRegularFile(path_1.default.join(worktreePath, root, install_plan_1.SKILL_RECEIPT_FILENAME));
|
|
99
|
+
if (rootReceipt !== null && rootReceipt.equals(receiptBytes)) {
|
|
100
|
+
owned.add(`${root}/${install_plan_1.SKILL_RECEIPT_FILENAME}`);
|
|
101
|
+
}
|
|
102
|
+
for (const file of receipt.files) {
|
|
103
|
+
if (!file ||
|
|
104
|
+
typeof file.path !== 'string' ||
|
|
105
|
+
typeof file.sha256 !== 'string' ||
|
|
106
|
+
!isSafeRelativePath(file.path) ||
|
|
107
|
+
file.path === install_plan_1.SKILL_RECEIPT_FILENAME) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const bytes = readRegularFile(path_1.default.join(worktreePath, root, file.path));
|
|
111
|
+
if (bytes !== null && sha256Hex(bytes) === file.sha256.toLowerCase()) {
|
|
112
|
+
owned.add(`${root}/${file.path}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return owned;
|
|
118
|
+
}
|
|
@@ -10,6 +10,7 @@ exports.reconcileSessionGeometry = reconcileSessionGeometry;
|
|
|
10
10
|
exports.isTmuxAvailable = isTmuxAvailable;
|
|
11
11
|
exports.hasSession = hasSession;
|
|
12
12
|
exports.getSessionWorkingDirectory = getSessionWorkingDirectory;
|
|
13
|
+
exports.getPaneCurrentCommand = getPaneCurrentCommand;
|
|
13
14
|
exports.listSessions = listSessions;
|
|
14
15
|
exports.createSession = createSession;
|
|
15
16
|
exports.sendKeys = sendKeys;
|
|
@@ -216,6 +217,27 @@ async function getSessionWorkingDirectory(sessionName) {
|
|
|
216
217
|
return null;
|
|
217
218
|
}
|
|
218
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* The foreground command of a session's pane (`#{pane_current_command}`), or
|
|
222
|
+
* null when tmux cannot say (Issue #3089).
|
|
223
|
+
*
|
|
224
|
+
* Read by Claude's start wait to tell "the agent quit back to the shell" from
|
|
225
|
+
* "the agent is still drawing": once the agent has exited, the pane's
|
|
226
|
+
* foreground process is the login shell again (`bash`, `zsh`, `-zsh`, ...).
|
|
227
|
+
*
|
|
228
|
+
* @param sessionName - Target session name
|
|
229
|
+
* @returns The command name, or null when the session or tmux is unavailable
|
|
230
|
+
*/
|
|
231
|
+
async function getPaneCurrentCommand(sessionName) {
|
|
232
|
+
try {
|
|
233
|
+
const { stdout } = await execFileAsync('tmux', ['display-message', '-p', '-t', exactTarget(sessionName), '#{pane_current_command}'], { timeout: DEFAULT_TIMEOUT });
|
|
234
|
+
const command = stdout.trim();
|
|
235
|
+
return command === '' ? null : command;
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
219
241
|
/**
|
|
220
242
|
* List all tmux sessions
|
|
221
243
|
*
|
|
@@ -561,6 +583,9 @@ const ALLOWED_SPECIAL_KEYS = new Set([
|
|
|
561
583
|
// (`COMMAND_CODE_NAVIGATION_KEY_VALUES`), so the route answers 400 for every
|
|
562
584
|
// other tool — the same arrangement as `s` above.
|
|
563
585
|
'C-a',
|
|
586
|
+
// Issue #3138: Command Code's plan review is submitted with ctrl+r; sent via
|
|
587
|
+
// sendSpecialKeys() like the other keys instead of a one-off sendKeys() call.
|
|
588
|
+
'C-r',
|
|
564
589
|
]);
|
|
565
590
|
/**
|
|
566
591
|
* Type guard for "sendSpecialKeys() will actually deliver this key" (Issue #2032).
|