commandmate 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +7 -0
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +362 -343
- package/.next/app-path-routes-manifest.json +28 -25
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +11 -13
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +1 -1
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_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/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route.js +1 -1
- package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js +7 -0
- package/.next/server/app/api/fs/browse/route.js.nft.json +1 -0
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/fs/recent-paths/route.js +7 -0
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -0
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/hooks/claude-done/route.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js +1 -0
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -0
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sidebar/group-order/route.js +2 -2
- package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.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 +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/todos/route.js +1 -1
- package/.next/server/app/api/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +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]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +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 +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +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 +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +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 +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 +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]/install/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +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 +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page.js +1 -1
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +2 -2
- 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.js +2 -2
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.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 +12 -12
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +28 -25
- package/.next/server/chunks/1355.js +1 -0
- package/.next/server/chunks/1808.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3722.js +1 -1
- package/.next/server/chunks/3736.js +1 -1
- package/.next/server/chunks/3753.js +1 -1
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4390.js +1 -0
- package/.next/server/chunks/4444.js +1 -1
- package/.next/server/chunks/5326.js +1 -1
- package/.next/server/chunks/593.js +1 -0
- package/.next/server/chunks/5959.js +3 -3
- package/.next/server/chunks/6065.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6283.js +1 -1
- package/.next/server/chunks/646.js +2 -2
- package/.next/server/chunks/7593.js +1 -0
- package/.next/server/chunks/8356.js +1 -1
- package/.next/server/chunks/9123.js +1 -1
- package/.next/server/chunks/9192.js +1 -1
- package/.next/server/chunks/9687.js +1 -1
- 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.map +1 -1
- package/.next/static/MqlW91_Se_kEW6mtm-1x0/_buildManifest.js +1 -0
- package/.next/static/chunks/1191-b7dfdfe86b1d31d1.js +1 -0
- package/.next/static/chunks/{4560-04e5aebcab96bfa1.js → 4560-8ffb0bb19f2ba998.js} +1 -1
- package/.next/static/chunks/530.e31cc754677fed0f.js +1 -0
- package/.next/static/chunks/5542-b6457f305d724a6b.js +1 -0
- package/.next/static/chunks/{6488-1a37ccee1d444c10.js → 6488-93870a55f4a3e3cd.js} +1 -1
- package/.next/static/chunks/8566-a6a7c70558927410.js +1 -0
- package/.next/static/chunks/9142-41b13a2f278529cc.js +1 -0
- package/.next/static/chunks/9263.5259f73f89220d64.js +1 -0
- package/.next/static/chunks/9599-d29d2f8eeaf7c249.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/skills/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/templates/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/todos/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/chat/page-83a2238ab453afaa.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-8c8bebe20cebf964.js +1 -0
- package/.next/static/chunks/app/repositories/page-3c4fb889da48ce24.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-8c40c9683f242207.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-9ff4d065483cdfe9.js → page-6041d3c3db326317.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-6da38f0a06dfd9db.js +1 -0
- package/.next/static/chunks/webpack-6b35d37d50302d27.js +1 -0
- package/.next/static/css/5127edd9aa8f3b49.css +1 -0
- package/.next/trace +11 -11
- package/.next/types/app/api/fs/browse/route.ts +347 -0
- package/.next/types/app/api/fs/recent-paths/route.ts +347 -0
- package/.next/types/app/api/repositories/validate-path/route.ts +347 -0
- package/.next/types/routes.d.ts +4 -1
- package/.next/types/validator.ts +27 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +15 -0
- package/dist/cli/types/index.d.ts +6 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/env-setup.d.ts +8 -0
- package/dist/cli/utils/env-setup.d.ts.map +1 -1
- package/dist/cli/utils/env-setup.js +23 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +120 -34
- package/dist/server/src/lib/detection/cli-patterns.js +27 -3
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +19 -0
- package/dist/server/src/lib/git/git-exec.js +48 -1
- package/dist/server/src/lib/selected-agents-validator.js +3 -2
- package/dist/server/src/lib/session/current-output-builder.js +10 -1
- package/dist/server/src/lib/tmux/tmux.js +26 -0
- package/dist/server/src/types/markdown-editor.js +13 -1
- package/package.json +1 -1
- package/.next/server/chunks/186.js +0 -1
- package/.next/server/chunks/7013.js +0 -1
- package/.next/server/chunks/9067.js +0 -1
- package/.next/static/Etea8LidpB8eWOTac-R8b/_buildManifest.js +0 -1
- package/.next/static/chunks/1668-e703b8b55775844b.js +0 -1
- package/.next/static/chunks/2069-c55de93eb6403961.js +0 -1
- package/.next/static/chunks/4027-0c529b322be7d4d8.js +0 -1
- package/.next/static/chunks/530.e377b0f1a7a89620.js +0 -1
- package/.next/static/chunks/6007-de36119357dcd418.js +0 -1
- package/.next/static/chunks/6497-dc26c6c6b0b15adf.js +0 -1
- package/.next/static/chunks/8361.4bf062be2d2962f4.js +0 -1
- package/.next/static/chunks/8566-b8bbcfd837cc338b.js +0 -1
- package/.next/static/chunks/934-a37509667baa86ee.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/skills/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/templates/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/todos/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/chat/page-9cf4ba62e21d9074.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-56dad0523d3c4a92.js +0 -1
- package/.next/static/chunks/app/repositories/page-70d4b997492884b8.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-68ed5e9186efe56d.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f2801662a721faab.js +0 -1
- package/.next/static/chunks/webpack-0f9275e279c058eb.js +0 -1
- package/.next/static/css/b4bdb1f3457fe9a7.css +0 -1
- /package/.next/static/{Etea8LidpB8eWOTac-R8b → MqlW91_Se_kEW6mtm-1x0}/_ssgManifest.js +0 -0
|
@@ -29,8 +29,18 @@
|
|
|
29
29
|
* `[Pasted text #\d+` placeholder. That placeholder is used only as one
|
|
30
30
|
* "still pending" positive signal (broadened to be version-resilient); the
|
|
31
31
|
* primary decision is "is the message still sitting on the input line?".
|
|
32
|
+
*
|
|
33
|
+
* Issue #1501 hardens the "still pending" branch. A TUI completion popup can
|
|
34
|
+
* REPLACE the typed body with a different command (`/status` -> `/statusline`,
|
|
35
|
+
* `/review` -> `/teamwork-preview`) when Enter selects a highlighted suggestion.
|
|
36
|
+
* The old substring check misread the replacement as "still typed" and resent
|
|
37
|
+
* Enter (executing the wrong command), or as "submitted" and left the residual
|
|
38
|
+
* behind (detonating on the next send). The decision is now three-valued —
|
|
39
|
+
* submitted / pending / replaced — and a `replaced` verdict clears the input
|
|
40
|
+
* line and THROWS instead of resending Enter (see classifySubmit).
|
|
32
41
|
*/
|
|
33
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.classifySubmit = classifySubmit;
|
|
34
44
|
exports.isSubmitted = isSubmitted;
|
|
35
45
|
exports.sendMessageWithSubmitVerification = sendMessageWithSubmitVerification;
|
|
36
46
|
const tmux_1 = require("../tmux/tmux");
|
|
@@ -49,6 +59,18 @@ const logger = (0, logger_1.createLogger)('cli-tools/submit-verified-sender');
|
|
|
49
59
|
* a tool that never renders it simply never matches.
|
|
50
60
|
*/
|
|
51
61
|
const PASTE_PLACEHOLDER_PATTERN = /\[Pasted text[\s#]/;
|
|
62
|
+
/**
|
|
63
|
+
* A slash-command sitting on the input line (Issue #1501).
|
|
64
|
+
*
|
|
65
|
+
* TUI completion popups replace a typed slash command with a highlighted menu
|
|
66
|
+
* item (`/status` -> `/statusline`, `/review` -> `/teamwork-preview`); the
|
|
67
|
+
* result is always another slash command. Scoping the "replaced" verdict to
|
|
68
|
+
* `/…` text keeps idle-prompt placeholders that some TUIs paint on an empty
|
|
69
|
+
* composer (gemini's "Type your message or @path", claude's hints, "? for
|
|
70
|
+
* shortcuts") — none of which start with `/` — from being mistaken for a
|
|
71
|
+
* substitution, so a genuinely-submitted message never fails spuriously.
|
|
72
|
+
*/
|
|
73
|
+
const REPLACEMENT_COMMAND_PATTERN = /^\/[A-Za-z]/;
|
|
52
74
|
/**
|
|
53
75
|
* Prompt input-line markers across the supported TUIs.
|
|
54
76
|
* claude/gemini/copilot: `>` or `❯`; codex: `›`; antigravity: `>`;
|
|
@@ -59,22 +81,18 @@ const INPUT_LINE_MARKER = /^\s*(?:ctx:\d+%\s*)?[>❯›]/;
|
|
|
59
81
|
const VERIFY_WINDOW_LINES = 12;
|
|
60
82
|
/** Default bounded read-back attempts before giving up (throwing). */
|
|
61
83
|
const DEFAULT_VERIFY_ATTEMPTS = 4;
|
|
62
|
-
/** Minimum fragment length used to decide the body is still on the input line. */
|
|
63
|
-
const MIN_FRAGMENT_LENGTH = 3;
|
|
64
|
-
const MAX_FRAGMENT_LENGTH = 24;
|
|
65
84
|
/**
|
|
66
|
-
* First non-blank
|
|
67
|
-
*
|
|
68
|
-
*
|
|
85
|
+
* First non-blank line of the message, trimmed. This is what a TUI shows on the
|
|
86
|
+
* prompt line before the body folds into a paste placeholder. NOT truncated:
|
|
87
|
+
* the replacement check (inputMatchesBody) needs the full first line so that a
|
|
88
|
+
* completion suffix (`/status` -> `/statusline`) is not mistaken for the body.
|
|
69
89
|
*/
|
|
70
|
-
function
|
|
71
|
-
const
|
|
90
|
+
function firstNonBlankLine(message) {
|
|
91
|
+
const line = message
|
|
72
92
|
.split('\n')
|
|
73
93
|
.map((l) => l.trim())
|
|
74
94
|
.find((l) => l.length > 0);
|
|
75
|
-
|
|
76
|
-
return '';
|
|
77
|
-
return firstLine.slice(0, MAX_FRAGMENT_LENGTH);
|
|
95
|
+
return line ?? '';
|
|
78
96
|
}
|
|
79
97
|
/**
|
|
80
98
|
* Locate the active input line within the pane tail: the last line that begins
|
|
@@ -90,40 +108,87 @@ function findInputLine(windowLines) {
|
|
|
90
108
|
}
|
|
91
109
|
return null;
|
|
92
110
|
}
|
|
111
|
+
/** Input line text with the prompt marker stripped and surrounding space trimmed. */
|
|
112
|
+
function stripInputMarker(inputLine) {
|
|
113
|
+
return inputLine.replace(INPUT_LINE_MARKER, '').trim();
|
|
114
|
+
}
|
|
93
115
|
/**
|
|
94
|
-
*
|
|
116
|
+
* Whether the (marker-stripped, non-empty) input-line text is still our
|
|
117
|
+
* unsent body rather than a TUI-substituted command.
|
|
118
|
+
*
|
|
119
|
+
* The still-unsent body appears verbatim on the input line. Line wrapping can
|
|
120
|
+
* visually truncate it to a PREFIX of the first line, but a completion popup
|
|
121
|
+
* always produces a DIFFERENT string — the body plus a completion suffix
|
|
122
|
+
* (`/status` -> `/statusline`) or an unrelated command (`/review` ->
|
|
123
|
+
* `/teamwork-preview`) — which is never a prefix of the body. So the body is
|
|
124
|
+
* "still there" iff the input text is a prefix of (or equals) the body's first
|
|
125
|
+
* line. This deliberately rejects `/statusline` for a `/status` body: the safe
|
|
126
|
+
* rule is "input text that is not the body (or a prefix of it) is NOT resent".
|
|
127
|
+
*/
|
|
128
|
+
function inputMatchesBody(strippedInput, message) {
|
|
129
|
+
const bodyFirstLine = firstNonBlankLine(message);
|
|
130
|
+
if (bodyFirstLine.length === 0)
|
|
131
|
+
return false;
|
|
132
|
+
return bodyFirstLine.startsWith(strippedInput);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Classify a captured pane into submitted / pending / replaced (Issue #1501).
|
|
95
136
|
*
|
|
96
137
|
* Version-independent by design — does NOT require the paste placeholder:
|
|
97
|
-
* A. The tool is generating a response
|
|
98
|
-
* B.
|
|
99
|
-
* C.
|
|
100
|
-
* D.
|
|
138
|
+
* A. The tool is generating a response -> submitted.
|
|
139
|
+
* B. No input line, or the input line is empty -> submitted.
|
|
140
|
+
* C. A paste placeholder is folded on the input line -> pending (Enter eaten).
|
|
141
|
+
* D. The body is still verbatim on the input line -> pending (resend Enter).
|
|
142
|
+
* E. A DIFFERENT slash command is on the input line -> replaced (TUI popup
|
|
143
|
+
* autocompleted the command; clear the line and throw, never resend Enter).
|
|
144
|
+
* F. Any other non-empty text (idle placeholder/hint) -> submitted (unchanged
|
|
145
|
+
* pre-#1501 permissive default, so normal sends never spuriously fail).
|
|
101
146
|
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
147
|
+
* C–F are scoped to the input line only, so the user-message echo that a TUI
|
|
148
|
+
* prints into its history above the prompt never causes a false verdict.
|
|
104
149
|
*/
|
|
105
|
-
function
|
|
150
|
+
function classifySubmit(output, cliToolId, message) {
|
|
106
151
|
const clean = (0, cli_patterns_1.stripAnsi)(output);
|
|
107
152
|
const windowLines = clean.split('\n').slice(-VERIFY_WINDOW_LINES);
|
|
108
153
|
const windowStr = windowLines.join('\n');
|
|
109
154
|
// A. Actively generating a response => the message was accepted.
|
|
110
155
|
if ((0, cli_patterns_1.detectThinking)(cliToolId, windowStr)) {
|
|
111
|
-
return
|
|
156
|
+
return 'submitted';
|
|
112
157
|
}
|
|
113
158
|
const inputLine = findInputLine(windowLines);
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
159
|
+
// B. No input line visible => the prompt scrolled off / moved on => submitted.
|
|
160
|
+
if (!inputLine) {
|
|
161
|
+
return 'submitted';
|
|
162
|
+
}
|
|
163
|
+
const strippedInput = stripInputMarker(inputLine);
|
|
164
|
+
// B. Empty input line => the message left the box => submitted.
|
|
165
|
+
if (strippedInput.length === 0) {
|
|
166
|
+
return 'submitted';
|
|
167
|
+
}
|
|
168
|
+
// C. A paste placeholder is still folded on the input line => body is there.
|
|
169
|
+
if (PASTE_PLACEHOLDER_PATTERN.test(inputLine)) {
|
|
170
|
+
return 'pending';
|
|
124
171
|
}
|
|
125
|
-
// D.
|
|
126
|
-
|
|
172
|
+
// D. The typed body is still sitting on the input line => resend Enter.
|
|
173
|
+
if (inputMatchesBody(strippedInput, message)) {
|
|
174
|
+
return 'pending';
|
|
175
|
+
}
|
|
176
|
+
// E. A different slash command is on the input line => a completion popup
|
|
177
|
+
// replaced what we typed. (Scoped to `/…` so idle-prompt placeholders that
|
|
178
|
+
// some TUIs paint on an empty composer are never mistaken for this.)
|
|
179
|
+
if (REPLACEMENT_COMMAND_PATTERN.test(strippedInput)) {
|
|
180
|
+
return 'replaced';
|
|
181
|
+
}
|
|
182
|
+
// F. Non-empty, non-command steady-state text (idle placeholder / hint) =>
|
|
183
|
+
// submitted, preserving the pre-#1501 permissive default.
|
|
184
|
+
return 'submitted';
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Backward-compatible boolean view of {@link classifySubmit}: submitted vs not.
|
|
188
|
+
* A `replaced` verdict is NOT "submitted", so this returns false for it too.
|
|
189
|
+
*/
|
|
190
|
+
function isSubmitted(output, cliToolId, message) {
|
|
191
|
+
return classifySubmit(output, cliToolId, message) === 'submitted';
|
|
127
192
|
}
|
|
128
193
|
/**
|
|
129
194
|
* Type a message body and submit it, then verify the submit actually happened.
|
|
@@ -156,11 +221,32 @@ async function sendMessageWithSubmitVerification(params) {
|
|
|
156
221
|
for (let attempt = 0; attempt < attempts; attempt++) {
|
|
157
222
|
await new Promise((resolve) => setTimeout(resolve, verifyDelayMs));
|
|
158
223
|
const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -VERIFY_WINDOW_LINES });
|
|
159
|
-
|
|
224
|
+
const state = classifySubmit(output, cliToolId, message);
|
|
225
|
+
if (state === 'submitted') {
|
|
160
226
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
161
227
|
return;
|
|
162
228
|
}
|
|
163
|
-
|
|
229
|
+
if (state === 'replaced') {
|
|
230
|
+
// A TUI completion popup replaced our command with a different one.
|
|
231
|
+
// Resending Enter would EXECUTE that command (Issue #1501 flavor A);
|
|
232
|
+
// leaving it in place lets the residual detonate on the next send
|
|
233
|
+
// (flavor B). Clear the input line (best-effort) and surface the failure
|
|
234
|
+
// to the caller instead of ever resending Enter.
|
|
235
|
+
try {
|
|
236
|
+
await (0, tmux_1.clearInputLine)(sessionName);
|
|
237
|
+
}
|
|
238
|
+
catch (clearError) {
|
|
239
|
+
logger.error('submit-clear-input-failed', {
|
|
240
|
+
sessionName,
|
|
241
|
+
cliToolId,
|
|
242
|
+
error: clearError instanceof Error ? clearError.message : String(clearError),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
246
|
+
logger.error('submit-replaced-by-tui-completion', { sessionName, cliToolId, attempt });
|
|
247
|
+
throw new Error(`Message was replaced by a TUI autocompletion for session ${sessionName}; the input no longer matches the sent text. Cleared the input line without submitting to avoid executing a different command.`);
|
|
248
|
+
}
|
|
249
|
+
// state === 'pending' — still typed-but-unsent, resend a single Enter and re-check.
|
|
164
250
|
logger.warn('submit-not-confirmed:resending-enter', {
|
|
165
251
|
sessionName,
|
|
166
252
|
cliToolId,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Shared between response-poller.ts and API routes
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_SELECTION_LIST_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_DIALOG_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
|
|
7
|
+
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_SELECTION_LIST_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_DIALOG_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
|
|
8
8
|
exports.findClaudeChromeStart = findClaudeChromeStart;
|
|
9
9
|
exports.isCodexPromptReady = isCodexPromptReady;
|
|
10
10
|
exports.getCodexActiveDialog = getCodexActiveDialog;
|
|
@@ -464,6 +464,23 @@ exports.OPENCODE_PROCESSING_INDICATOR = /esc interrupt/;
|
|
|
464
464
|
* " Connect a provider esc"
|
|
465
465
|
*/
|
|
466
466
|
exports.OPENCODE_SELECTION_LIST_PATTERN = /^\s*(Select\s+(model|provider)|Connect\s+a\s+provider)/m;
|
|
467
|
+
/**
|
|
468
|
+
* [Issue #1495] Footer signature of Claude Code's `/model` local-settings overlay.
|
|
469
|
+
* Verified against a real Claude Code v2.1.218 capture, the footer reads:
|
|
470
|
+
* "Enter to set as default · s to use this session only · Esc to cancel"
|
|
471
|
+
*
|
|
472
|
+
* The overlay renders a ❯-marked numbered model list ("1. Default … 5. Haiku")
|
|
473
|
+
* under a "Select model" header that detectMultipleChoicePrompt() otherwise
|
|
474
|
+
* matches as a genuine multiple_choice prompt — which let Auto-Yes Enter-confirm
|
|
475
|
+
* a selection and silently change the user's default model. This "set as default"
|
|
476
|
+
* phrasing is unique to the model picker: genuine confirmation prompts never
|
|
477
|
+
* contain it (the trust dialog uses "Enter to confirm · Esc to cancel", Bash-tool
|
|
478
|
+
* approvals use "Esc to cancel · Tab to amend", AskUserQuestion uses
|
|
479
|
+
* "Enter to select · … to navigate"), so it is a safe exclusion signal.
|
|
480
|
+
*
|
|
481
|
+
* Linear pattern, no nested quantifiers — ReDoS safe (S4-001).
|
|
482
|
+
*/
|
|
483
|
+
exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = /Enter\s+to\s+set\s+as\s+default\b/i;
|
|
467
484
|
/**
|
|
468
485
|
* Claude CLI selection list footer pattern
|
|
469
486
|
* Detects Claude CLI's interactive selection prompts that require
|
|
@@ -472,9 +489,16 @@ exports.OPENCODE_SELECTION_LIST_PATTERN = /^\s*(Select\s+(model|provider)|Connec
|
|
|
472
489
|
* Matches footer instruction lines (known variants):
|
|
473
490
|
* "Enter to select · Tab/Arrow keys to navigate · Esc to cancel"
|
|
474
491
|
* "Enter to select · ↑/↓ to navigate · n to add notes · Esc to cancel"
|
|
475
|
-
* "Enter to confirm · Esc to exit" (/model command)
|
|
492
|
+
* "Enter to confirm · Esc to exit" (legacy /model command footer)
|
|
493
|
+
* "Enter to set as default · s to use this session only · Esc to cancel"
|
|
494
|
+
* (/model command footer as of Claude Code v2.1.218 — Issue #1495)
|
|
495
|
+
*
|
|
496
|
+
* The "set as default" branch lets status-detector classify the `/model` overlay
|
|
497
|
+
* as a Claude selection list (NavigationButtons + ESC hatch, hasActivePrompt=false)
|
|
498
|
+
* once detectPrompt() no longer reports it as a prompt (see
|
|
499
|
+
* CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN).
|
|
476
500
|
*/
|
|
477
|
-
exports.CLAUDE_SELECTION_LIST_FOOTER = /Enter\s+to\s+(?:select\s+.*to\s+navigate|confirm\s+·\s+Esc)/;
|
|
501
|
+
exports.CLAUDE_SELECTION_LIST_FOOTER = /Enter\s+to\s+(?:select\s+.*to\s+navigate|confirm\s+·\s+Esc|set\s+as\s+default)/;
|
|
478
502
|
/**
|
|
479
503
|
* OpenCode TUI separator pattern (Issue #379)
|
|
480
504
|
* Matches lines composed entirely of box-drawing / TUI decoration characters.
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.buildMultipleChoiceResult = buildMultipleChoiceResult;
|
|
5
5
|
exports.detectMultipleChoicePrompt = detectMultipleChoicePrompt;
|
|
6
6
|
const tui_detection_frame_1 = require("./tui-detection-frame");
|
|
7
|
+
const cli_patterns_1 = require("./cli-patterns");
|
|
7
8
|
// ============================================================================
|
|
8
9
|
// Constants
|
|
9
10
|
// ============================================================================
|
|
@@ -590,6 +591,24 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
|
|
|
590
591
|
}
|
|
591
592
|
}
|
|
592
593
|
const scanWindow = lines.slice(scanStart, effectiveEnd);
|
|
594
|
+
// [Issue #1495] Claude `/model` local-settings overlay guard.
|
|
595
|
+
// The `/model` overlay renders a ❯-marked numbered model list ("1. Default …
|
|
596
|
+
// 5. Haiku") under a "Select model" header, which the option-collection logic
|
|
597
|
+
// below would otherwise return as a genuine multiple_choice prompt. Auto-Yes
|
|
598
|
+
// (detectAndRespondToPrompt) calls detectPrompt() directly and would resolve +
|
|
599
|
+
// Enter-confirm the default option — silently changing the user's default model.
|
|
600
|
+
// The overlay-unique "Enter to set as default …" footer never appears in real
|
|
601
|
+
// confirmation prompts (permission dialogs, the trust dialog, AskUserQuestion),
|
|
602
|
+
// so bailing out here stops Auto-Yes without touching any real-prompt path. The
|
|
603
|
+
// overlay is modal — no genuine prompt can be active at the same time, and the
|
|
604
|
+
// Claude TUI repaints the overlay away on close, so a stale footer cannot linger
|
|
605
|
+
// in the captured pane. status-detector then reclassifies it as a Claude
|
|
606
|
+
// selection list via CLAUDE_SELECTION_LIST_FOOTER (NavigationButtons + ESC hatch).
|
|
607
|
+
for (const rawLine of scanWindow) {
|
|
608
|
+
if (cli_patterns_1.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN.test(rawLine)) {
|
|
609
|
+
return noPromptResult(output);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
593
612
|
// Single-pass footer detection: identify both confirmation footer presence and
|
|
594
613
|
// specific "press number to confirm" variant in one iteration (Issue #616).
|
|
595
614
|
let hasConfirmationFooter = false;
|
|
@@ -20,6 +20,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
21
|
exports.GIT_LOG_TIMEOUT_MS = exports.execFileAsync = void 0;
|
|
22
22
|
exports.execGitCommand = execGitCommand;
|
|
23
|
+
exports.execGitCommandCapture = execGitCommandCapture;
|
|
23
24
|
exports.execGitCommandTyped = execGitCommandTyped;
|
|
24
25
|
exports.runSerializedWrite = runSerializedWrite;
|
|
25
26
|
exports.execGitConflictAware = execGitConflictAware;
|
|
@@ -66,6 +67,42 @@ async function execGitCommand(args, cwd) {
|
|
|
66
67
|
return null;
|
|
67
68
|
}
|
|
68
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Execute a READ-ONLY git command like {@link execGitCommand} (never throws,
|
|
72
|
+
* same default 1s timeout) but return the stderr alongside the outcome instead
|
|
73
|
+
* of collapsing every failure into `null` (Issue #1515, B-1).
|
|
74
|
+
*
|
|
75
|
+
* execGitCommand is intentionally left untouched: its all-failures-to-null
|
|
76
|
+
* contract is relied on by the high-frequency getGitStatus path. This variant
|
|
77
|
+
* exists for the single caller (getAheadBehind) that must tell "no upstream"
|
|
78
|
+
* apart from "upstream gone" / "detached" / "error".
|
|
79
|
+
*
|
|
80
|
+
* Deliberately does NOT log: the failures it reports are EXPECTED states
|
|
81
|
+
* (a branch with no upstream) polled every few seconds, and its caller logs a
|
|
82
|
+
* classified reason instead of the raw stderr.
|
|
83
|
+
*
|
|
84
|
+
* @param args - Git command arguments (static array; no shell)
|
|
85
|
+
* @param cwd - Working directory (must be from DB, trusted source)
|
|
86
|
+
* @param timeout - Timeout in ms (defaults to the 1s status-read timeout)
|
|
87
|
+
*/
|
|
88
|
+
async function execGitCommandCapture(args, cwd, timeout = GIT_COMMAND_TIMEOUT_MS) {
|
|
89
|
+
try {
|
|
90
|
+
const { stdout, stderr } = await (0, exports.execFileAsync)('git', args, { cwd, timeout });
|
|
91
|
+
return { ok: true, stdout: stdout.trim(), stderr: stderr ?? '', timedOut: false };
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
const err = error;
|
|
95
|
+
const timedOut = err.killed === true ||
|
|
96
|
+
err.code === 'ERR_CHILD_PROCESS_EXEC_TIMEOUT' ||
|
|
97
|
+
err.code === 'ETIMEDOUT';
|
|
98
|
+
return {
|
|
99
|
+
ok: false,
|
|
100
|
+
stdout: '',
|
|
101
|
+
stderr: `${err.stderr ?? ''} ${err.message ?? ''}`,
|
|
102
|
+
timedOut,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
69
106
|
/**
|
|
70
107
|
* Execute a git command with timeout, distinguishing error types
|
|
71
108
|
* Unlike execGitCommand, this throws typed errors for API-level error handling.
|
|
@@ -265,10 +302,20 @@ classifyNetwork = false) {
|
|
|
265
302
|
* Does NOT use execGitCommandTyped (whose preserve regex stays unmodified) and
|
|
266
303
|
* does NOT log the raw stderr/message (DR4-002): a failed network op's stderr can
|
|
267
304
|
* echo a credential-bearing remote URL, and the typed error carries no message.
|
|
305
|
+
*
|
|
306
|
+
* Issue #1515 (E-1): runs with `GIT_TERMINAL_PROMPT=0` so a remote that needs
|
|
307
|
+
* credentials fails FAST with "could not read Username" (-> GitAuthFailedError,
|
|
308
|
+
* 401) instead of blocking on an interactive prompt until the timeout. This is
|
|
309
|
+
* load-bearing for the Current Status refresh button, which now fetches (A-1) on
|
|
310
|
+
* a user click and must never leave the UI waiting on an invisible prompt.
|
|
268
311
|
*/
|
|
269
312
|
async function execGitNetworkAware(args, worktreePath, timeout) {
|
|
270
313
|
try {
|
|
271
|
-
const { stdout } = await (0, exports.execFileAsync)('git', args, {
|
|
314
|
+
const { stdout } = await (0, exports.execFileAsync)('git', args, {
|
|
315
|
+
cwd: worktreePath,
|
|
316
|
+
timeout,
|
|
317
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
|
|
318
|
+
});
|
|
272
319
|
return stdout;
|
|
273
320
|
}
|
|
274
321
|
catch (error) {
|
|
@@ -20,9 +20,10 @@ exports.MIN_SELECTED_AGENTS = 2;
|
|
|
20
20
|
exports.MAX_SELECTED_AGENTS = 6;
|
|
21
21
|
/**
|
|
22
22
|
* Default selected agents when DB value is missing or invalid.
|
|
23
|
-
* Issue #
|
|
23
|
+
* Issue #1516: narrowed to the 3 agents in routine use (claude/codex/antigravity).
|
|
24
|
+
* The others stay selectable via CLI_TOOL_IDS — they are just not preselected.
|
|
24
25
|
*/
|
|
25
|
-
exports.DEFAULT_SELECTED_AGENTS = ['claude', 'codex', '
|
|
26
|
+
exports.DEFAULT_SELECTED_AGENTS = ['claude', 'codex', 'antigravity'];
|
|
26
27
|
/**
|
|
27
28
|
* Core validation function for CLI tool ID arrays (R1-001)
|
|
28
29
|
* Accepts 2-5 unique valid CLI tool IDs (Issue #836).
|
|
@@ -53,7 +53,16 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
|
|
|
53
53
|
const isPromptWaiting = statusResult.hasActivePrompt;
|
|
54
54
|
const isSelectionListActive = statusResult.status === 'waiting' && status_detector_1.SELECTION_LIST_REASONS.has(statusResult.reason);
|
|
55
55
|
const isPagerActive = statusResult.reason === status_detector_1.STATUS_REASON.CODEX_PAGER;
|
|
56
|
-
|
|
56
|
+
// Issue #1497: the detection-independent nav hatch (#1017/#1494) is gated on
|
|
57
|
+
// isUnclassifiedActive. A static, unrecognized TUI overlay (e.g. Claude `/help`)
|
|
58
|
+
// whose frame stops changing degrades from `running`/`default` to `ready`/
|
|
59
|
+
// `no_recent_output` once the Auto-Yes poller has stamped lastOutputTimestamp
|
|
60
|
+
// (its sole writer, auto-yes-poller.ts). That is still an interactive-but-
|
|
61
|
+
// unclassified frame — a real idle prompt (`❯`) is classified earlier as
|
|
62
|
+
// `input_prompt`, never as `no_recent_output` — so treat the timed-out fallback
|
|
63
|
+
// as unclassified too and keep the hatch open instead of stranding the user.
|
|
64
|
+
const isUnclassifiedActive = (statusResult.status === 'running' && statusResult.reason === status_detector_1.STATUS_REASON.DEFAULT) ||
|
|
65
|
+
(statusResult.status === 'ready' && statusResult.reason === status_detector_1.STATUS_REASON.NO_RECENT_OUTPUT);
|
|
57
66
|
const realtimeSnippet = lines.slice(-100).join('\n');
|
|
58
67
|
const autoYesState = (0, auto_yes_manager_1.getAutoYesState)(worktreeId, cliToolId, instanceId);
|
|
59
68
|
return {
|
|
@@ -17,6 +17,7 @@ exports.capturePane = capturePane;
|
|
|
17
17
|
exports.killSession = killSession;
|
|
18
18
|
exports.ensureSession = ensureSession;
|
|
19
19
|
exports.sendSpecialKey = sendSpecialKey;
|
|
20
|
+
exports.clearInputLine = clearInputLine;
|
|
20
21
|
exports.isAllowedSpecialKey = isAllowedSpecialKey;
|
|
21
22
|
exports.sendSpecialKeysAndInvalidate = sendSpecialKeysAndInvalidate;
|
|
22
23
|
const child_process_1 = require("child_process");
|
|
@@ -477,6 +478,31 @@ async function sendSpecialKey(sessionName, key) {
|
|
|
477
478
|
throw new Error(`Failed to send special key: ${errorMessage}`);
|
|
478
479
|
}
|
|
479
480
|
}
|
|
481
|
+
/**
|
|
482
|
+
* Clear whatever text is currently sitting on the TUI input line (Issue #1501).
|
|
483
|
+
*
|
|
484
|
+
* Sends a single `C-u` (kill-line-before-cursor) so the prompt is wiped. Used by
|
|
485
|
+
* the submit-verified sender when it detects that a TUI popup autocompleted the
|
|
486
|
+
* typed command into a DIFFERENT one (e.g. `/status` -> `/statusline`): the
|
|
487
|
+
* residual text must be removed so it can neither be executed by a stray Enter
|
|
488
|
+
* nor detonate on the next send.
|
|
489
|
+
*
|
|
490
|
+
* `C-u` is a fixed literal passed via execFile (no shell, no injection) and is
|
|
491
|
+
* intentionally NOT added to ALLOWED_SPECIAL_KEYS / NAVIGATION_KEY_VALUES — it is
|
|
492
|
+
* an internal recovery primitive, never exposed through the special-keys API.
|
|
493
|
+
*
|
|
494
|
+
* @param sessionName - Target session name
|
|
495
|
+
* @throws {Error} If the tmux command fails
|
|
496
|
+
*/
|
|
497
|
+
async function clearInputLine(sessionName) {
|
|
498
|
+
try {
|
|
499
|
+
await execFileAsync('tmux', ['send-keys', '-t', exactTarget(sessionName), 'C-u'], { timeout: DEFAULT_TIMEOUT });
|
|
500
|
+
}
|
|
501
|
+
catch (error) {
|
|
502
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
503
|
+
throw new Error(`Failed to clear tmux input line: ${errorMessage}`);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
480
506
|
/**
|
|
481
507
|
* Allowed navigation key names for special-keys API validation.
|
|
482
508
|
* Used for TUI navigation sequences (e.g., Up/Down cursor, Enter/Escape selection).
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @module types/markdown-editor
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.DEFAULT_LAYOUT_STATE = exports.AUTO_SAVE_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_AUTO_SAVE = exports.MAX_SPLIT_RATIO = exports.MIN_SPLIT_RATIO = exports.DEFAULT_SPLIT_RATIO = exports.FILE_SIZE_LIMITS = exports.PREVIEW_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_MAXIMIZED = exports.LOCAL_STORAGE_KEY_SPLIT_RATIO = exports.LOCAL_STORAGE_KEY = exports.VIEW_MODE_STRATEGIES = void 0;
|
|
8
|
+
exports.DEFAULT_LAYOUT_STATE = exports.INDENT_UNIT = exports.LOCAL_STORAGE_KEY_TAB_MOVES_FOCUS = exports.AUTO_SAVE_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_AUTO_SAVE = exports.MAX_SPLIT_RATIO = exports.MIN_SPLIT_RATIO = exports.DEFAULT_SPLIT_RATIO = exports.FILE_SIZE_LIMITS = exports.PREVIEW_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_MAXIMIZED = exports.LOCAL_STORAGE_KEY_SPLIT_RATIO = exports.LOCAL_STORAGE_KEY = exports.VIEW_MODE_STRATEGIES = void 0;
|
|
9
9
|
exports.isValidSplitRatio = isValidSplitRatio;
|
|
10
10
|
exports.isValidBoolean = isValidBoolean;
|
|
11
11
|
/**
|
|
@@ -79,6 +79,18 @@ exports.LOCAL_STORAGE_KEY_AUTO_SAVE = 'commandmate:md-editor-auto-save';
|
|
|
79
79
|
* Auto-save debounce delay (3 seconds)
|
|
80
80
|
*/
|
|
81
81
|
exports.AUTO_SAVE_DEBOUNCE_MS = 3000;
|
|
82
|
+
/**
|
|
83
|
+
* Local storage key for the "Tab moves focus" accessibility toggle (Issue #1518)
|
|
84
|
+
*/
|
|
85
|
+
exports.LOCAL_STORAGE_KEY_TAB_MOVES_FOCUS = 'commandmate:md-editor-tab-moves-focus';
|
|
86
|
+
/**
|
|
87
|
+
* Indent unit inserted by Tab (Issue #1518).
|
|
88
|
+
*
|
|
89
|
+
* Spaces, never a tab character: the same textarea edits YAML in text mode and
|
|
90
|
+
* YAML forbids tabs, and a literal tab renders at the browser's default 8-column
|
|
91
|
+
* `tab-size` which breaks Markdown nested lists.
|
|
92
|
+
*/
|
|
93
|
+
exports.INDENT_UNIT = ' ';
|
|
82
94
|
/**
|
|
83
95
|
* Default editor layout state
|
|
84
96
|
*/
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=186,exports.ids=[186],exports.modules={9815:(a,b,c)=>{c.d(b,{B:()=>A});var d=c(21124),e=c(38301),f=c(20481),g=c(73451),h=c(17252),i=c(90349),j=c(3805);let k={status:"loading",options:[]};function l({selectedWorktreeId:a,onSelect:b,disabled:c=!1}){let h=(0,f.c)("skills"),[i,l]=(0,e.useState)(k),[n,o]=(0,e.useState)(0),p=(0,e.useCallback)(()=>o(a=>a+1),[]);return"loading"===i.status?(0,d.jsxs)("div",{className:"space-y-2","data-testid":"skill-target-loading",children:[(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:h("target.loading")}),(0,d.jsx)(g.EA,{className:"h-24 w-full rounded-lg"})]}):"error"===i.status?(0,d.jsxs)(g.Zp,{className:"space-y-3","data-testid":"skill-target-error",children:[(0,d.jsx)(j.u,{tone:"danger",children:h("target.errorNotice")}),(0,d.jsx)(g.$n,{variant:"secondary",size:"sm",onClick:p,"data-testid":"skill-target-retry",children:h("target.retry")})]}):0===i.options.length?(0,d.jsx)(g.Zp,{"data-testid":"skill-target-empty",children:(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:h("target.empty")})}):(0,d.jsxs)("div",{className:"space-y-3","data-testid":"skill-target-selector",children:[(0,d.jsx)("div",{role:"radiogroup","aria-label":h("target.heading"),className:"space-y-2",children:i.options.map(e=>(0,d.jsx)(m,{option:e,selected:e.id===a,disabled:c,onSelect:b},e.id))}),(0,d.jsx)(j.u,{tone:"neutral","data-testid":"skill-target-branch-notice",children:h("target.branchFreshnessNotice")})]})}function m({option:a,selected:b,disabled:c,onSelect:e}){let h=(0,f.c)("skills"),i=a.liveBranch??a.syncedBranch;return(0,d.jsxs)("button",{type:"button",role:"radio","aria-checked":b,disabled:c,onClick:()=>e(a.id),"data-testid":`skill-target-option-${a.id}`,className:`w-full rounded-lg border px-3 py-2.5 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-60 ${b?"border-accent-500 bg-accent-50 dark:bg-accent-950/40":"border-border bg-card hover:bg-muted"}`,children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsx)("span",{className:"text-sm font-semibold text-foreground break-all",children:a.name}),b&&(0,d.jsx)(g.Ex,{variant:"info",children:h("target.selected")})]}),(0,d.jsxs)("dl",{className:"mt-1.5 grid grid-cols-1 gap-x-4 gap-y-1 sm:grid-cols-2",children:[(0,d.jsx)(n,{label:h("target.repository"),children:a.repositoryName}),(0,d.jsx)(n,{label:h("target.branch"),children:i??h("target.branchUnknown")}),(0,d.jsx)(n,{label:h("target.agents"),children:a.agents.length>0?a.agents.join(", "):h("target.agentsNone")}),(0,d.jsx)(n,{label:h("target.workingTree"),children:h(null===a.dirty?"target.workingTreeUnknown":a.dirty?"target.workingTreeDirty":"target.workingTreeClean")})]}),a.sessionRunning&&(0,d.jsx)("p",{className:"mt-1.5 text-xs text-muted-foreground","data-testid":`skill-target-session-${a.id}`,children:h("target.sessionRunning")})]})}function n({label:a,children:b}){return(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsx)("dt",{className:"text-xs font-medium text-muted-foreground",children:a}),(0,d.jsx)("dd",{className:"text-xs text-foreground break-words",children:b})]})}var o=c(27884);function p({label:a,children:b}){return(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsx)("dt",{className:"text-xs font-medium text-muted-foreground",children:a}),(0,d.jsx)("dd",{className:"mt-0.5 break-words text-sm text-foreground",children:b})]})}function q({level:a,kind:b,label:c}){let e=(0,f.c)("skills");return(0,d.jsxs)(g.Ex,{variant:o.eK[a],"data-testid":`skill-plan-risk-${b}-${a}`,children:[c,": ",e(o.pP[a])]})}function r({entry:a}){let b=(0,f.c)("skills"),c=o.KL[a.reason];return(0,d.jsxs)("li",{className:"space-y-1.5 rounded-md border border-border px-3 py-2","data-testid":`skill-plan-file-${a.path}`,children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsx)(g.Ex,{variant:o.tC[a.change],children:b(o.AS[a.change])}),(0,d.jsx)("span",{className:"break-all font-mono text-xs text-foreground",children:a.path}),a.generated&&(0,d.jsx)(g.Ex,{variant:"gray",children:b("plan.fileGenerated")})]}),c&&(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:b(c)}),a.gitIgnored&&(0,d.jsx)("p",{className:"text-xs text-warning-foreground",children:b("plan.gitIgnored")}),a.binary?(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:b("plan.diffBinary")}):a.diff?(0,d.jsxs)("details",{children:[(0,d.jsx)("summary",{className:"cursor-pointer text-xs text-accent-600 dark:text-accent-400",children:b("plan.diffToggle",{additions:a.additions,deletions:a.deletions})}),(0,d.jsx)("pre",{className:"mt-1 overflow-x-auto rounded bg-muted p-2 font-mono text-[11px] leading-snug text-foreground",children:a.diff}),a.diffTruncated&&(0,d.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:b("plan.diffTruncated")})]}):null]})}function s({plan:a}){let b=(0,f.c)("skills"),{target:c,skill:e}=a,h=e.compatibility.commandmate;return(0,d.jsxs)(g.Zp,{className:"space-y-4","data-testid":"skill-install-plan",children:[(0,d.jsxs)("div",{className:"space-y-1",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:b("plan.heading")}),(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:b("plan.expiresAt",{timestamp:a.expiresAt})})]}),(0,d.jsxs)("section",{className:"space-y-2",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("plan.targetHeading")}),(0,d.jsxs)("dl",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2",children:[(0,d.jsx)(p,{label:b("target.repository"),children:c.repositoryName}),(0,d.jsx)(p,{label:b("target.heading"),children:c.worktreeName}),(0,d.jsx)(p,{label:b("target.branch"),children:c.branch??b("target.branchUnknown")}),(0,d.jsx)(p,{label:b("plan.headStateLabel"),children:b(o.kF[c.headState]??"plan.headState.unknown")}),(0,d.jsx)(p,{label:b("target.workingTree"),children:c.workingTreeDirty?b("target.workingTreeDirty"):b("target.workingTreeClean")}),(0,d.jsx)(p,{label:b("plan.installRoot"),children:(0,d.jsx)("span",{className:"break-all font-mono text-xs",children:(c.installRoots&&c.installRoots.length>0?c.installRoots:[c.installRoot]).map(a=>(0,d.jsx)("span",{className:"block",children:a},a))})}),(0,d.jsx)(p,{label:b("plan.existingInstall"),children:c.existingInstall?b("plan.existingInstallVersion",{version:c.existingInstall.version}):b("plan.existingInstallNone")}),(0,d.jsx)(p,{label:b("detail.recommendedVersion"),children:(0,d.jsx)("span",{className:"font-mono text-xs",children:e.version})})]})]}),(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-risk-section",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("plan.riskHeading")}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-1.5",children:[(0,d.jsx)(q,{level:e.declaredRisk,kind:"declared",label:b("plan.riskDeclared")}),(0,d.jsx)(q,{level:e.computedRisk,kind:"computed",label:b("plan.riskComputed")}),(0,d.jsx)(q,{level:e.effectiveRisk,kind:"effective",label:b("plan.riskEffective")})]}),(0,d.jsx)("p",{className:"break-words text-sm text-foreground",children:e.riskRationale}),(0,d.jsx)(j.u,{tone:"neutral",children:b("plan.riskNotice")})]}),(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-permissions",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("permissions.heading")}),e.declaredPermissions.length>0?(0,d.jsx)("div",{className:"flex flex-wrap gap-1.5",children:e.declaredPermissions.map(a=>(0,d.jsx)(g.Ex,{variant:"warning",children:o.z2[a]?b(o.z2[a]):a},a))}):(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("plan.permissionsNone")}),(0,d.jsx)(j.u,{tone:"warning",children:b("permissions.declarationOnlyNotice")})]}),(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-requirements",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("requirements.heading")}),0===e.requirements.commands.length&&0===e.requirements.networkHosts.length?(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("plan.requirementsNone")}):(0,d.jsxs)("dl",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2",children:[e.requirements.commands.length>0&&(0,d.jsx)(p,{label:b("plan.requirementsCommands"),children:e.requirements.commands.map(a=>`${a.name} ${a.versionRange??b("plan.commandAnyVersion")}`).join(", ")}),e.requirements.networkHosts.length>0&&(0,d.jsx)(p,{label:b("plan.requirementsHosts"),children:e.requirements.networkHosts.join(", ")})]})]}),(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-scripts",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("plan.scriptsHeading")}),0===e.executablePaths.length&&0===e.scriptPaths.length?(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("plan.scriptsNone")}):(0,d.jsx)("ul",{className:"space-y-1",children:[...new Set([...e.scriptPaths,...e.executablePaths])].map(a=>(0,d.jsx)("li",{className:"break-all font-mono text-xs text-foreground",children:a},a))})]}),"compatible"!==h.status&&(0,d.jsx)(j.u,{tone:"warning","data-testid":"skill-plan-compatibility-notice",children:b((0,o.e5)(h.messageKey),{range:h.requiredRange,currentVersion:h.currentVersion??""})}),a.warnings.length>0&&(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-warnings",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("plan.warningsHeading")}),(0,d.jsx)("ul",{className:"space-y-1",children:a.warnings.map(a=>(0,d.jsx)("li",{className:"text-xs text-warning-foreground",children:o.RO[a]?b(o.RO[a]):a},a))})]}),(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-files",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("plan.filesHeading")}),(0,d.jsx)("p",{className:"text-xs text-muted-foreground","data-testid":"skill-plan-stats",children:b("plan.stats",{added:a.stats.added,modified:a.stats.modified,unchanged:a.stats.unchanged,conflicted:a.stats.conflicted,unmanaged:a.stats.unmanaged})}),0===a.files.length?(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("plan.filesEmpty")}):(0,d.jsx)("ul",{className:"space-y-2",children:a.files.map(a=>(0,d.jsx)(r,{entry:a},a.path))})]}),a.blockers.length>0&&(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-install-blockers",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-danger-foreground",children:b("plan.blockersHeading")}),(0,d.jsx)("ul",{className:"space-y-1",children:a.blockers.map(a=>(0,d.jsxs)("li",{className:"text-xs text-danger-foreground",children:[a.path&&(0,d.jsx)("span",{className:"mr-1 break-all font-mono",children:a.path}),a.code.startsWith("skills.")?b((0,o.e5)(a.code),{range:h.requiredRange,currentVersion:h.currentVersion??""}):o.KL[a.code]?b(o.KL[a.code]):a.code]},`${a.code}:${a.path??""}`))}),(0,d.jsx)(j.u,{tone:"danger",children:b("plan.blockedNotice")})]})]})}function t({entry:a}){let b=(0,f.c)("skills"),c=o.Mj[a.disposition],e=o.hJ[a.reason];return(0,d.jsxs)("li",{className:"flex flex-wrap items-center gap-2","data-testid":`skill-uninstall-file-${a.path}`,children:[(0,d.jsx)(g.Ex,{variant:"remove"===a.disposition?"info":"warning",children:c?b(c):a.disposition}),(0,d.jsx)("span",{className:"break-all font-mono text-xs text-foreground",children:a.path}),e&&(0,d.jsx)("span",{className:"text-xs text-muted-foreground",children:b(e)})]})}function u({plan:a}){let b=(0,f.c)("skills"),{target:c,skill:e}=a;return(0,d.jsxs)(g.Zp,{className:"space-y-4","data-testid":"skill-uninstall-plan",children:[(0,d.jsxs)("div",{className:"space-y-1",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:b("uninstall.heading")}),(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:b("uninstall.expiresAt",{timestamp:a.expiresAt})})]}),(0,d.jsxs)("dl",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2",children:[(0,d.jsx)(p,{label:b("target.repository"),children:c.repositoryName}),(0,d.jsx)(p,{label:b("target.heading"),children:c.worktreeName}),(0,d.jsx)(p,{label:b("target.branch"),children:c.branch??b("target.branchUnknown")}),(0,d.jsx)(p,{label:b("uninstall.installedVersion"),children:(0,d.jsx)("span",{className:"font-mono text-xs",children:e.version||b("uninstall.versionUnknown")})}),(0,d.jsx)(p,{label:b("plan.installRoot"),children:(0,d.jsx)("span",{className:"break-all font-mono text-xs",children:c.installRoot})}),(0,d.jsx)(p,{label:b("target.workingTree"),children:c.workingTreeDirty?b("target.workingTreeDirty"):b("target.workingTreeClean")})]}),(0,d.jsx)("p",{className:"text-xs text-muted-foreground","data-testid":"skill-uninstall-stats",children:b("uninstall.stats",{removable:a.stats.removable,modified:a.stats.modified,missing:a.stats.missing,unknown:a.stats.unknown,irregular:a.stats.irregular})}),(0,d.jsxs)("section",{className:"space-y-2",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("uninstall.removalsHeading")}),0===a.removals.length?(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("uninstall.removalsEmpty")}):(0,d.jsx)("ul",{className:"space-y-1.5",children:a.removals.map(a=>(0,d.jsx)(t,{entry:a},a.path))})]}),(0,d.jsxs)("section",{className:"space-y-2",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("uninstall.retainedHeading")}),0===a.retained.length?(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("uninstall.retainedEmpty")}):(0,d.jsx)("ul",{className:"space-y-1.5",children:a.retained.map(a=>(0,d.jsx)(t,{entry:a},a.path))})]}),(0,d.jsxs)("div",{className:"space-y-2",children:[a.skill.agents.length>0&&(0,d.jsx)("div",{className:"flex flex-wrap gap-1.5","data-testid":"skill-uninstall-agents",children:a.skill.agents.map(a=>(0,d.jsx)(g.Ex,{variant:"gray",children:(0,h.f_)(a.agent)},a.agent))}),(0,d.jsx)(j.u,{tone:"neutral",children:b((0,o.e5)(a.nextActionKey))})]}),a.blockers.length>0&&(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-uninstall-blockers",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-danger-foreground",children:b("uninstall.blockersHeading")}),(0,d.jsx)("ul",{className:"space-y-1",children:a.blockers.map(a=>(0,d.jsxs)("li",{className:"text-xs text-danger-foreground",children:[a.path&&(0,d.jsx)("span",{className:"mr-1 break-all font-mono",children:a.path}),b((0,o.e5)(a.messageKey))]},`${a.code}:${a.path??""}`))})]})]})}var v=c(30156);let w={worktreeId:null,busy:null,installPlan:null,uninstallPlan:null,installResult:null,uninstallResult:null,riskAcknowledged:!1,failure:null};function x(a){return{...a,installPlan:null,uninstallPlan:null,installResult:null,uninstallResult:null,riskAcknowledged:!1,failure:null}}function y({failure:a}){let b=(0,f.c)("skills");return(0,d.jsxs)("div",{className:"space-y-2","data-testid":"skill-operation-error",children:[(0,d.jsxs)(j.u,{tone:"danger",children:[(0,d.jsx)("p",{className:"font-medium",children:b("operation.errorHeading")}),(0,d.jsx)("p",{className:"mt-1",children:b((0,o.FW)(a.code))}),(0,d.jsx)("p",{className:"mt-1 break-words",children:b("state.errorCode",{code:a.code})})]}),a.nextActionKey&&(0,d.jsx)(j.u,{tone:"warning",children:b((0,o.e5)(a.nextActionKey))}),a.blockers&&a.blockers.length>0&&(0,d.jsx)("ul",{className:"space-y-1","data-testid":"skill-operation-error-blockers",children:a.blockers.map(a=>(0,d.jsxs)("li",{className:"text-xs text-danger-foreground",children:[a.path&&(0,d.jsx)("span",{className:"mr-1 break-all font-mono",children:a.path}),b((0,o.e5)(a.messageKey))]},`${a.code}:${a.path??""}`))})]})}function z({agents:a,skillId:b,version:c}){let e=(0,f.c)("skills");return 0===a.length?null:(0,d.jsxs)("div",{className:"space-y-1","data-testid":"skill-operation-reload",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:e("operation.reloadHeading")}),(0,d.jsx)("ul",{className:"space-y-1",children:a.map(a=>(0,d.jsx)("li",{className:"text-xs text-muted-foreground",children:e((0,o.e5)(a.messageKey),{agent:(0,h.f_)(a.agent),skillId:b,version:c})},a.agent))})]})}function A({skillId:a,version:b,blockedReason:c,worktreeId:h}){let k=(0,f.c)("skills"),[m,n]=(0,e.useState)(()=>h?{...w,worktreeId:h}:w),p=(0,e.useCallback)(a=>{n(b=>b.worktreeId===a?b:x({...b,worktreeId:a,busy:null}))},[]),q=(0,e.useCallback)(async()=>{let c=m.worktreeId;if(!c)return;n(a=>({...x(a),busy:"install-plan"}));let d=await (0,v.Q6)(c,a,{version:b??void 0});n(a=>({...a,busy:null,installPlan:d.ok?d.data.plan:null,failure:d.ok?null:d.failure}))},[a,m.worktreeId,b]),r=(0,e.useCallback)(async()=>{var b;let c=m.worktreeId,d=m.installPlan;if(!c||!d||d.requiresRiskAcknowledgement&&!m.riskAcknowledged)return;n(a=>({...a,busy:"install-apply",failure:null}));let e=await (0,v.Xi)(c,a,{planToken:d.token,version:d.skill.version,acknowledgeRisk:!!d.requiresRiskAcknowledgement||void 0,idempotencyKey:(b=d.token,`skill-install-${b}`)});e.ok&&(0,i.k)(c),n(a=>({...a,busy:null,installPlan:e.ok?null:a.installPlan,installResult:e.ok?e.data:null,failure:e.ok?null:e.failure}))},[a,m.installPlan,m.riskAcknowledged,m.worktreeId]),t=(0,e.useCallback)(async()=>{let b=m.worktreeId;if(!b)return;n(a=>({...x(a),busy:"uninstall-plan"}));let c=await (0,v.hN)(b,a);n(a=>({...a,busy:null,uninstallPlan:c.ok?c.data.plan:null,failure:c.ok?null:c.failure}))},[a,m.worktreeId]),A=(0,e.useCallback)(async()=>{var b;let c=m.worktreeId,d=m.uninstallPlan;if(!c||!d)return;n(a=>({...a,busy:"uninstall-apply",failure:null}));let e=await (0,v.E)(c,a,{planToken:d.token,idempotencyKey:(b=d.token,`skill-uninstall-${b}`)});n(a=>({...a,busy:null,uninstallPlan:e.ok?null:a.uninstallPlan,uninstallResult:e.ok?e.data:null,failure:e.ok?null:e.failure}))},[a,m.uninstallPlan,m.worktreeId]),B=(0,e.useCallback)(()=>{n(a=>x(a))},[]),C=null!==m.busy,D=m.installPlan,E=m.uninstallPlan,F=c??k(m.worktreeId?"plan.ready":"plan.chooseTarget"),G=null!==D&&D.requiresRiskAcknowledgement&&!m.riskAcknowledged;return(0,d.jsxs)("div",{className:"space-y-3","data-testid":"skill-install-panel",children:[!h&&(0,d.jsx)(l,{selectedWorktreeId:m.worktreeId,onSelect:p,disabled:C}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.$n,{variant:"primary",disabled:C||null!==c||!m.worktreeId,onClick:q,"data-testid":"skill-install-action","aria-describedby":"skill-install-reason",children:k("install-plan"===m.busy?"plan.building":"plan.build")}),(0,d.jsx)(g.$n,{variant:"secondary",disabled:C||!m.worktreeId,onClick:t,"data-testid":"skill-uninstall-action",children:k("uninstall-plan"===m.busy?"uninstall.building":"uninstall.build")})]}),(0,d.jsx)("p",{id:"skill-install-reason",className:"text-sm text-muted-foreground","data-testid":"skill-install-reason",children:F}),m.failure&&(0,d.jsx)(y,{failure:m.failure}),D&&(0,d.jsxs)("div",{className:"space-y-3",children:[(0,d.jsx)(s,{plan:D}),D.requiresRiskAcknowledgement&&(0,d.jsxs)(g.Zp,{className:"space-y-3","data-testid":"skill-install-risk-acknowledgement",children:[(0,d.jsx)(j.u,{tone:"danger",children:k((0,o.e5)(D.riskAcknowledgementMessageKey??"skills.plan.highRiskAcknowledgement"))}),(0,d.jsxs)("label",{className:"flex items-start gap-2 text-sm text-foreground",children:[(0,d.jsx)(g.Sc,{checked:m.riskAcknowledged,onCheckedChange:a=>n(b=>({...b,riskAcknowledged:!0===a})),disabled:C,"data-testid":"skill-install-risk-checkbox",className:"mt-0.5"}),(0,d.jsx)("span",{children:k("plan.acknowledgeLabel")})]})]}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.$n,{variant:D.requiresRiskAcknowledgement?"danger":"primary",disabled:C||!D.installable||G,onClick:r,"data-testid":"skill-install-confirm",children:k("install-apply"===m.busy?"plan.confirming":"plan.confirm")}),(0,d.jsx)(g.$n,{variant:"ghost",disabled:C,onClick:B,"data-testid":"skill-install-discard",children:k("plan.discard")})]})]}),E&&(0,d.jsxs)("div",{className:"space-y-3",children:[(0,d.jsx)(u,{plan:E}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.$n,{variant:"danger",disabled:C||!E.removable,onClick:A,"data-testid":"skill-uninstall-confirm",children:k("uninstall-apply"===m.busy?"uninstall.confirming":"uninstall.confirm")}),(0,d.jsx)(g.$n,{variant:"ghost",disabled:C,onClick:B,"data-testid":"skill-uninstall-discard",children:k("plan.discard")})]})]}),m.installResult&&(0,d.jsxs)(g.Zp,{className:"space-y-3","data-testid":"skill-install-result",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:k("operation.installedHeading")}),(0,d.jsx)(j.u,{tone:"info",children:k((0,o.e5)(m.installResult.operation.nextActionKey))}),m.installResult.operation.replayed&&(0,d.jsx)(j.u,{tone:"neutral","data-testid":"skill-operation-replayed",children:k("operation.replayNotice")}),m.installResult.install&&"files"in m.installResult.install&&(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:k("operation.filesWritten",{count:m.installResult.install.files.length})}),"reload"in m.installResult&&(0,d.jsx)(z,{agents:m.installResult.reload.agents,skillId:m.installResult.reload.skillId,version:m.installResult.reload.version}),(0,d.jsx)(g.$n,{variant:"secondary",size:"sm",onClick:B,"data-testid":"skill-operation-reset",children:k("operation.startOver")})]}),m.uninstallResult&&(0,d.jsxs)(g.Zp,{className:"space-y-3","data-testid":"skill-uninstall-result",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:k("operation.uninstalledHeading")}),(0,d.jsx)(j.u,{tone:"info",children:k((0,o.e5)(m.uninstallResult.operation.nextActionKey))}),m.uninstallResult.operation.replayed&&(0,d.jsx)(j.u,{tone:"neutral","data-testid":"skill-operation-replayed",children:k("operation.replayNotice")}),m.uninstallResult.uninstall&&"removedFiles"in m.uninstallResult.uninstall&&(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:k("operation.filesRemoved",{count:m.uninstallResult.uninstall.removedFiles.length})}),"reload"in m.uninstallResult&&(0,d.jsx)(z,{agents:m.uninstallResult.reload.agents,skillId:m.uninstallResult.reload.skillId,version:m.uninstallResult.reload.version}),(0,d.jsx)(g.$n,{variant:"secondary",size:"sm",onClick:B,"data-testid":"skill-operation-reset",children:k("operation.startOver")})]})]})}},12894:(a,b,c)=>{c.d(b,{o:()=>d});function d(a){return a?a.split("/").map(encodeURIComponent).join("/"):""}},13973:(a,b,c)=>{c.d(b,{default:()=>e.a});var d=c(33540),e=c.n(d)},24207:(a,b,c)=>{Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"BailoutToCSR",{enumerable:!0,get:function(){return e}});let d=c(84339);function e(a){let{reason:b,children:c}=a;throw Object.defineProperty(new d.BailoutToCSRError(b),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0})}},33540:(a,b,c)=>{Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"default",{enumerable:!0,get:function(){return e}});let d=c(35288)._(c(43972));function e(a,b){var c;let e={};"function"==typeof a&&(e.loader=a);let f={...e,...b};return(0,d.default)({...f,modules:null==(c=f.loadableGenerated)?void 0:c.modules})}("function"==typeof b.default||"object"==typeof b.default&&null!==b.default)&&void 0===b.default.__esModule&&(Object.defineProperty(b.default,"__esModule",{value:!0}),Object.assign(b.default,b),a.exports=b.default)},43972:(a,b,c)=>{Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"default",{enumerable:!0,get:function(){return j}});let d=c(21124),e=c(38301),f=c(24207),g=c(52402);function h(a){return{default:a&&"default"in a?a.default:a}}let i={loader:()=>Promise.resolve(h(()=>null)),loading:null,ssr:!0},j=function(a){let b={...i,...a},c=(0,e.lazy)(()=>b.loader().then(h)),j=b.loading;function k(a){let h=j?(0,d.jsx)(j,{isLoading:!0,pastDelay:!0,error:null}):null,i=!b.ssr||!!b.loading,k=i?e.Suspense:e.Fragment,l=b.ssr?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(g.PreloadChunks,{moduleIds:b.modules}),(0,d.jsx)(c,{...a})]}):(0,d.jsx)(f.BailoutToCSR,{reason:"next/dynamic",children:(0,d.jsx)(c,{...a})});return(0,d.jsx)(k,{...i?{fallback:h}:{},children:l})}return k.displayName="LoadableComponent",k}},52402:(a,b,c)=>{Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"PreloadChunks",{enumerable:!0,get:function(){return h}});let d=c(21124),e=c(23312),f=c(29294),g=c(61348);function h(a){let{moduleIds:b}=a,c=f.workAsyncStorage.getStore();if(void 0===c)return null;let h=[];if(c.reactLoadableManifest&&b){let a=c.reactLoadableManifest;for(let c of b){if(!a[c])continue;let b=a[c].files;h.push(...b)}}return 0===h.length?null:(0,d.jsx)(d.Fragment,{children:h.map(a=>{let b=c.assetPrefix+"/_next/"+(0,g.encodeURIPath)(a);return a.endsWith(".css")?(0,d.jsx)("link",{precedence:"dynamic",href:b,rel:"stylesheet",as:"style"},a):((0,e.preload)(b,{as:"script",fetchPriority:"low"}),null)})})}},61348:(a,b)=>{function c(a){return a.split("/").map(a=>encodeURIComponent(a)).join("/")}Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"encodeURIPath",{enumerable:!0,get:function(){return c}})},62484:(a,b,c)=>{c.d(b,{i:()=>j});var d=c(21124),e=c(38301),f=c(63156),g=c(58970);function h(){return(0,d.jsx)("svg",{className:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})})}function i(){return(0,d.jsx)("svg",{className:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})})}function j({text:a,className:b="",label:c="Copy"}){let[j,k]=(0,e.useState)(!1),l=(0,e.useRef)(null),m=(0,e.useCallback)(async()=>{try{await (0,f.l)(a),k(!0),l.current&&clearTimeout(l.current),l.current=setTimeout(()=>k(!1),g.s7)}catch{}},[a]);return(0,d.jsxs)("button",{type:"button",onClick:m,className:`inline-flex items-center gap-1 rounded border border-border bg-surface px-2 py-0.5 text-[11px] font-medium text-foreground transition-colors hover:bg-muted ${b}`,"aria-label":j?"Copied":c,title:j?"Copied!":c,children:[j?(0,d.jsx)(i,{}):(0,d.jsx)(h,{}),(0,d.jsx)("span",{children:j?"Copied":c})]})}},63156:(a,b,c)=>{c.d(b,{l:()=>e});let d=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07|\[[0-9;]*m/g;async function e(a){if(!a||0===a.trim().length)return;let b=a.replace(d,"");if(navigator.clipboard?.writeText)try{await navigator.clipboard.writeText(b);return}catch{}let c=document.createElement("textarea");c.value=b,c.style.position="fixed",c.style.left="-9999px",c.style.top="-9999px",c.style.opacity="0",document.body.appendChild(c),c.focus(),c.select();try{document.execCommand("copy")}finally{document.body.removeChild(c)}}},79944:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(23339).A)("arrow-left",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]])},90349:(a,b,c)=>{c.d(b,{I:()=>d,k:()=>e});let d="skill:installed";function e(a){}}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
exports.id=7013,exports.ids=[7013],exports.modules={27013:a=>{class b{constructor(a){void 0===a.data&&(a.data={}),this.data=a.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function c(a){return a.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function d(a,...b){let c=Object.create(null);for(let b in a)c[b]=a[b];return b.forEach(function(a){for(let b in a)c[b]=a[b]}),c}class e{constructor(a,b){this.buffer="",this.classPrefix=b.classPrefix,a.walk(this)}addText(a){this.buffer+=c(a)}openNode(a){if(!a.scope)return;let b=((a,{prefix:b})=>{if(a.startsWith("language:"))return a.replace("language:","language-");if(a.includes(".")){let c=a.split(".");return[`${b}${c.shift()}`,...c.map((a,b)=>`${a}${"_".repeat(b+1)}`)].join(" ")}return`${b}${a}`})(a.scope,{prefix:this.classPrefix});this.span(b)}closeNode(a){a.scope&&(this.buffer+="</span>")}value(){return this.buffer}span(a){this.buffer+=`<span class="${a}">`}}let f=(a={})=>{let b={children:[]};return Object.assign(b,a),b};class g{constructor(){this.rootNode=f(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(a){this.top.children.push(a)}openNode(a){let b=f({scope:a});this.add(b),this.stack.push(b)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(a){return this.constructor._walk(a,this.rootNode)}static _walk(a,b){return"string"==typeof b?a.addText(b):b.children&&(a.openNode(b),b.children.forEach(b=>this._walk(a,b)),a.closeNode(b)),a}static _collapse(a){"string"!=typeof a&&a.children&&(a.children.every(a=>"string"==typeof a)?a.children=[a.children.join("")]:a.children.forEach(a=>{g._collapse(a)}))}}class h extends g{constructor(a){super(),this.options=a}addText(a){""!==a&&this.add(a)}startScope(a){this.openNode(a)}endScope(){this.closeNode()}__addSublanguage(a,b){let c=a.root;b&&(c.scope=`language:${b}`),this.add(c)}toHTML(){return new e(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function i(a){return a?"string"==typeof a?a:a.source:null}function j(a){return m("(?=",a,")")}function k(a){return m("(?:",a,")*")}function l(a){return m("(?:",a,")?")}function m(...a){return a.map(a=>i(a)).join("")}function n(...a){return"("+(function(a){let b=a[a.length-1];return"object"==typeof b&&b.constructor===Object?(a.splice(a.length-1,1),b):{}}(a).capture?"":"?:")+a.map(a=>i(a)).join("|")+")"}function o(a){return RegExp(a.toString()+"|").exec("").length-1}let p=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function q(a,{joinWith:b}){let c=0;return a.map(a=>{let b=c+=1,d=i(a),e="";for(;d.length>0;){let a=p.exec(d);if(!a){e+=d;break}e+=d.substring(0,a.index),d=d.substring(a.index+a[0].length),"\\"===a[0][0]&&a[1]?e+="\\"+String(Number(a[1])+b):(e+=a[0],"("===a[0]&&c++)}return e}).map(a=>`(${a})`).join(b)}let r="[a-zA-Z]\\w*",s="[a-zA-Z_]\\w*",t="\\b\\d+(\\.\\d+)?",u="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",v="\\b(0b[01]+)",w={begin:"\\\\[\\s\\S]",relevance:0},x=function(a,b,c={}){let e=d({scope:"comment",begin:a,end:b,contains:[]},c);e.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let f=n("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return e.contains.push({begin:m(/[ ]+/,"(",f,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),e},y=x("//","$"),z=x("/\\*","\\*/"),A=x("#","$");var B=Object.freeze({__proto__:null,APOS_STRING_MODE:{scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[w]},BACKSLASH_ESCAPE:w,BINARY_NUMBER_MODE:{scope:"number",begin:v,relevance:0},BINARY_NUMBER_RE:v,COMMENT:x,C_BLOCK_COMMENT_MODE:z,C_LINE_COMMENT_MODE:y,C_NUMBER_MODE:{scope:"number",begin:u,relevance:0},C_NUMBER_RE:u,END_SAME_AS_BEGIN:function(a){return Object.assign(a,{"on:begin":(a,b)=>{b.data._beginMatch=a[1]},"on:end":(a,b)=>{b.data._beginMatch!==a[1]&&b.ignoreMatch()}})},HASH_COMMENT_MODE:A,IDENT_RE:r,MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+s,relevance:0},NUMBER_MODE:{scope:"number",begin:t,relevance:0},NUMBER_RE:t,PHRASAL_WORDS_MODE:{begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},QUOTE_STRING_MODE:{scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[w]},REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[w,{begin:/\[/,end:/\]/,relevance:0,contains:[w]}]},RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(a={})=>{let b=/^#![ ]*\//;return a.binary&&(a.begin=m(b,/.*\b/,a.binary,/\b.*/)),d({scope:"meta",begin:b,end:/$/,relevance:0,"on:begin":(a,b)=>{0!==a.index&&b.ignoreMatch()}},a)},TITLE_MODE:{scope:"title",begin:r,relevance:0},UNDERSCORE_IDENT_RE:s,UNDERSCORE_TITLE_MODE:{scope:"title",begin:s,relevance:0}});function C(a,b){"."===a.input[a.index-1]&&b.ignoreMatch()}function D(a,b){void 0!==a.className&&(a.scope=a.className,delete a.className)}function E(a,b){b&&a.beginKeywords&&(a.begin="\\b("+a.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",a.__beforeBegin=C,a.keywords=a.keywords||a.beginKeywords,delete a.beginKeywords,void 0===a.relevance&&(a.relevance=0))}function F(a,b){Array.isArray(a.illegal)&&(a.illegal=n(...a.illegal))}function G(a,b){if(a.match){if(a.begin||a.end)throw Error("begin & end are not supported with match");a.begin=a.match,delete a.match}}function H(a,b){void 0===a.relevance&&(a.relevance=1)}let I=(a,b)=>{if(!a.beforeMatch)return;if(a.starts)throw Error("beforeMatch cannot be used with starts");let c=Object.assign({},a);Object.keys(a).forEach(b=>{delete a[b]}),a.keywords=c.keywords,a.begin=m(c.beforeMatch,j(c.begin)),a.starts={relevance:0,contains:[Object.assign(c,{endsParent:!0})]},a.relevance=0,delete c.beforeMatch},J=["of","and","for","in","not","or","if","then","parent","list","value"],K={},L=a=>{console.error(a)},M=(a,...b)=>{console.log(`WARN: ${a}`,...b)},N=(a,b)=>{K[`${a}/${b}`]||(console.log(`Deprecated as of ${a}. ${b}`),K[`${a}/${b}`]=!0)},O=Error();function P(a,b,{key:c}){let d=0,e=a[c],f={},g={};for(let a=1;a<=b.length;a++)g[a+d]=e[a],f[a+d]=!0,d+=o(b[a-1]);a[c]=g,a[c]._emit=f,a[c]._multi=!0}function Q(a){if(a.scope&&"object"==typeof a.scope&&null!==a.scope&&(a.beginScope=a.scope,delete a.scope),"string"==typeof a.beginScope&&(a.beginScope={_wrap:a.beginScope}),"string"==typeof a.endScope&&(a.endScope={_wrap:a.endScope}),Array.isArray(a.begin)){if(a.skip||a.excludeBegin||a.returnBegin)throw L("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),O;if("object"!=typeof a.beginScope||null===a.beginScope)throw L("beginScope must be object"),O;P(a,a.begin,{key:"beginScope"}),a.begin=q(a.begin,{joinWith:""})}if(Array.isArray(a.end)){if(a.skip||a.excludeEnd||a.returnEnd)throw L("skip, excludeEnd, returnEnd not compatible with endScope: {}"),O;if("object"!=typeof a.endScope||null===a.endScope)throw L("endScope must be object"),O;P(a,a.end,{key:"endScope"}),a.end=q(a.end,{joinWith:""})}}class R extends Error{constructor(a,b){super(a),this.name="HTMLInjectionError",this.html=b}}let S=Symbol("nomatch"),T=function(a){let e=Object.create(null),f=Object.create(null),g=[],p=!0,r="Could not find the language '{}', did you forget to load/include a language module?",s={disableAutodetect:!0,name:"Plain text",contains:[]},t={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:h};function u(a){return t.noHighlightRe.test(a)}function v(a,b,c){let d="",e="";"object"==typeof b?(d=a,c=b.ignoreIllegals,e=b.language):(N("10.7.0","highlight(lang, code, ...args) has been deprecated."),N("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),e=a,d=b),void 0===c&&(c=!0);let f={code:d,language:e};P("before:highlight",f);let g=f.result?f.result:w(f.language,f.code,c);return g.code=f.code,P("after:highlight",g),g}function w(a,f,g,h){let j=Object.create(null);function k(){if(!B.keywords)return void M.addText(O);let a=0;B.keywordPatternRe.lastIndex=0;let b=B.keywordPatternRe.exec(O),c="";for(;b;){c+=O.substring(a,b.index);let d=y.case_insensitive?b[0].toLowerCase():b[0],e=B.keywords[d];if(e){let[a,f]=e;if(M.addText(c),c="",j[d]=(j[d]||0)+1,j[d]<=7&&(P+=f),a.startsWith("_"))c+=b[0];else{let c=y.classNameAliases[a]||a;m(b[0],c)}}else c+=b[0];a=B.keywordPatternRe.lastIndex,b=B.keywordPatternRe.exec(O)}c+=O.substring(a),M.addText(c)}function l(){null!=B.subLanguage?function(){if(""===O)return;let a=null;if("string"==typeof B.subLanguage){if(!e[B.subLanguage])return M.addText(O);a=w(B.subLanguage,O,!0,K[B.subLanguage]),K[B.subLanguage]=a._top}else a=x(O,B.subLanguage.length?B.subLanguage:null);B.relevance>0&&(P+=a.relevance),M.__addSublanguage(a._emitter,a.language)}():k(),O=""}function m(a,b){""!==a&&(M.startScope(b),M.addText(a),M.endScope())}function n(a,b){let c=1,d=b.length-1;for(;c<=d;){if(!a._emit[c]){c++;continue}let d=y.classNameAliases[a[c]]||a[c],e=b[c];d?m(e,d):(O=e,k(),O=""),c++}}function s(a,b){return a.scope&&"string"==typeof a.scope&&M.openNode(y.classNameAliases[a.scope]||a.scope),a.beginScope&&(a.beginScope._wrap?(m(O,y.classNameAliases[a.beginScope._wrap]||a.beginScope._wrap),O=""):a.beginScope._multi&&(n(a.beginScope,b),O="")),B=Object.create(a,{parent:{value:B}})}let u={};function v(c,d){let e=d&&d[0];if(O+=c,null==e)return l(),0;if("begin"===u.type&&"end"===d.type&&u.index===d.index&&""===e){if(O+=f.slice(d.index,d.index+1),!p){let b=Error(`0 width match regex (${a})`);throw b.languageName=a,b.badRule=u.rule,b}return 1}if(u=d,"begin"===d.type){let a=d[0],c=d.rule,e=new b(c);for(let b of[c.__beforeBegin,c["on:begin"]])if(b&&(b(d,e),e.isMatchIgnored))return 0===B.matcher.regexIndex?(O+=a[0],1):(U=!0,0);return c.skip?O+=a:(c.excludeBegin&&(O+=a),l(),c.returnBegin||c.excludeBegin||(O=a)),s(c,d),c.returnBegin?0:a.length}if("illegal"!==d.type||g){if("end"===d.type){let a=function(a){let c=a[0],d=f.substring(a.index),e=function a(c,d,e){let f=function(a,b){let c=a&&a.exec(b);return c&&0===c.index}(c.endRe,e);if(f){if(c["on:end"]){let a=new b(c);c["on:end"](d,a),a.isMatchIgnored&&(f=!1)}if(f){for(;c.endsParent&&c.parent;)c=c.parent;return c}}if(c.endsWithParent)return a(c.parent,d,e)}(B,a,d);if(!e)return S;let g=B;B.endScope&&B.endScope._wrap?(l(),m(c,B.endScope._wrap)):B.endScope&&B.endScope._multi?(l(),n(B.endScope,a)):g.skip?O+=c:(g.returnEnd||g.excludeEnd||(O+=c),l(),g.excludeEnd&&(O=c));do B.scope&&M.closeNode(),B.skip||B.subLanguage||(P+=B.relevance),B=B.parent;while(B!==e.parent);return e.starts&&s(e.starts,a),g.returnEnd?0:c.length}(d);if(a!==S)return a}}else{let a=Error('Illegal lexeme "'+e+'" for mode "'+(B.scope||"<unnamed>")+'"');throw a.mode=B,a}if("illegal"===d.type&&""===e)return O+="\n",1;if(T>1e5&&T>3*d.index)throw Error("potential infinite loop, way more iterations than matches");return O+=e,e.length}let y=C(a);if(!y)throw L(r.replace("{}",a)),Error('Unknown language: "'+a+'"');let z=function(a){function b(b,c){return RegExp(i(b),"m"+(a.case_insensitive?"i":"")+(a.unicodeRegex?"u":"")+(c?"g":""))}class c{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(a,b){b.position=this.position++,this.matchIndexes[this.matchAt]=b,this.regexes.push([b,a]),this.matchAt+=o(a)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);let a=this.regexes.map(a=>a[1]);this.matcherRe=b(q(a,{joinWith:"|"}),!0),this.lastIndex=0}exec(a){this.matcherRe.lastIndex=this.lastIndex;let b=this.matcherRe.exec(a);if(!b)return null;let c=b.findIndex((a,b)=>b>0&&void 0!==a),d=this.matchIndexes[c];return b.splice(0,c),Object.assign(b,d)}}class e{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(a){if(this.multiRegexes[a])return this.multiRegexes[a];let b=new c;return this.rules.slice(a).forEach(([a,c])=>b.addRule(a,c)),b.compile(),this.multiRegexes[a]=b,b}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(a,b){this.rules.push([a,b]),"begin"===b.type&&this.count++}exec(a){let b=this.getMatcher(this.regexIndex);b.lastIndex=this.lastIndex;let c=b.exec(a);if(this.resumingScanAtSamePosition())if(c&&c.index===this.lastIndex);else{let b=this.getMatcher(0);b.lastIndex=this.lastIndex+1,c=b.exec(a)}return c&&(this.regexIndex+=c.position+1,this.regexIndex===this.count&&this.considerAll()),c}}if(a.compilerExtensions||(a.compilerExtensions=[]),a.contains&&a.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return a.classNameAliases=d(a.classNameAliases||{}),function c(f,g){if(f.isCompiled)return f;[D,G,Q,I].forEach(a=>a(f,g)),a.compilerExtensions.forEach(a=>a(f,g)),f.__beforeBegin=null,[E,F,H].forEach(a=>a(f,g)),f.isCompiled=!0;let h=null;return"object"==typeof f.keywords&&f.keywords.$pattern&&(f.keywords=Object.assign({},f.keywords),h=f.keywords.$pattern,delete f.keywords.$pattern),h=h||/\w+/,f.keywords&&(f.keywords=function a(b,c,d="keyword"){let e=Object.create(null);return"string"==typeof b?f(d,b.split(" ")):Array.isArray(b)?f(d,b):Object.keys(b).forEach(function(d){Object.assign(e,a(b[d],c,d))}),e;function f(a,b){c&&(b=b.map(a=>a.toLowerCase())),b.forEach(function(b){var c,d,f;let g=b.split("|");e[g[0]]=[a,(c=g[0],(d=g[1])?Number(d):+(f=c,!J.includes(f.toLowerCase())))]})}}(f.keywords,a.case_insensitive)),f.keywordPatternRe=b(h,!0),g&&(f.begin||(f.begin=/\B|\b/),f.beginRe=b(f.begin),f.end||f.endsWithParent||(f.end=/\B|\b/),f.end&&(f.endRe=b(f.end)),f.terminatorEnd=i(f.end)||"",f.endsWithParent&&g.terminatorEnd&&(f.terminatorEnd+=(f.end?"|":"")+g.terminatorEnd)),f.illegal&&(f.illegalRe=b(f.illegal)),f.contains||(f.contains=[]),f.contains=[].concat(...f.contains.map(function(a){var b;return((b="self"===a?f:a).variants&&!b.cachedVariants&&(b.cachedVariants=b.variants.map(function(a){return d(b,{variants:null},a)})),b.cachedVariants)?b.cachedVariants:!function a(b){return!!b&&(b.endsWithParent||a(b.starts))}(b)?Object.isFrozen(b)?d(b):b:d(b,{starts:b.starts?d(b.starts):null})})),f.contains.forEach(function(a){c(a,f)}),f.starts&&c(f.starts,g),f.matcher=function(a){let b=new e;return a.contains.forEach(a=>b.addRule(a.begin,{rule:a,type:"begin"})),a.terminatorEnd&&b.addRule(a.terminatorEnd,{type:"end"}),a.illegal&&b.addRule(a.illegal,{type:"illegal"}),b}(f),f}(a)}(y),A="",B=h||z,K={},M=new t.__emitter(t),N=[];for(let a=B;a!==y;a=a.parent)a.scope&&N.unshift(a.scope);N.forEach(a=>M.openNode(a));let O="",P=0,R=0,T=0,U=!1;try{if(y.__emitTokens)y.__emitTokens(f,M);else{for(B.matcher.considerAll();;){T++,U?U=!1:B.matcher.considerAll(),B.matcher.lastIndex=R;let a=B.matcher.exec(f);if(!a)break;let b=f.substring(R,a.index),c=v(b,a);R=a.index+c}v(f.substring(R))}return M.finalize(),A=M.toHTML(),{language:a,value:A,relevance:P,illegal:!1,_emitter:M,_top:B}}catch(b){if(b.message&&b.message.includes("Illegal"))return{language:a,value:c(f),illegal:!0,relevance:0,_illegalBy:{message:b.message,index:R,context:f.slice(R-100,R+100),mode:b.mode,resultSoFar:A},_emitter:M};if(p)return{language:a,value:c(f),illegal:!1,relevance:0,errorRaised:b,_emitter:M,_top:B};throw b}}function x(a,b){b=b||t.languages||Object.keys(e);let d=function(a){let b={value:c(a),illegal:!1,relevance:0,_top:s,_emitter:new t.__emitter(t)};return b._emitter.addText(a),b}(a),f=b.filter(C).filter(O).map(b=>w(b,a,!1));f.unshift(d);let[g,h]=f.sort((a,b)=>{if(a.relevance!==b.relevance)return b.relevance-a.relevance;if(a.language&&b.language){if(C(a.language).supersetOf===b.language)return 1;else if(C(b.language).supersetOf===a.language)return -1}return 0});return g.secondBest=h,g}function y(a){let b=function(a){let b=a.className+" ";b+=a.parentNode?a.parentNode.className:"";let c=t.languageDetectRe.exec(b);if(c){let b=C(c[1]);return b||(M(r.replace("{}",c[1])),M("Falling back to no-highlight mode for this block.",a)),b?c[1]:"no-highlight"}return b.split(/\s+/).find(a=>u(a)||C(a))}(a);if(u(b))return;if(P("before:highlightElement",{el:a,language:b}),a.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",a);if(a.children.length>0&&(t.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(a)),t.throwUnescapedHTML))throw new R("One of your code blocks includes unescaped HTML.",a.innerHTML);let c=a.textContent,d=b?v(c,{language:b,ignoreIllegals:!0}):x(c);a.innerHTML=d.value,a.dataset.highlighted="yes";var e=d.language;let g=b&&f[b]||e;a.classList.add("hljs"),a.classList.add(`language-${g}`),a.result={language:d.language,re:d.relevance,relevance:d.relevance},d.secondBest&&(a.secondBest={language:d.secondBest.language,relevance:d.secondBest.relevance}),P("after:highlightElement",{el:a,result:d,text:c})}let z=!1;function A(){if("loading"===document.readyState){z||window.addEventListener("DOMContentLoaded",function(){A()},!1),z=!0;return}document.querySelectorAll(t.cssSelector).forEach(y)}function C(a){return e[a=(a||"").toLowerCase()]||e[f[a]]}function K(a,{languageName:b}){"string"==typeof a&&(a=[a]),a.forEach(a=>{f[a.toLowerCase()]=b})}function O(a){let b=C(a);return b&&!b.disableAutodetect}function P(a,b){g.forEach(function(c){c[a]&&c[a](b)})}for(let b in Object.assign(a,{highlight:v,highlightAuto:x,highlightAll:A,highlightElement:y,highlightBlock:function(a){return N("10.7.0","highlightBlock will be removed entirely in v12.0"),N("10.7.0","Please use highlightElement now."),y(a)},configure:function(a){t=d(t,a)},initHighlighting:()=>{A(),N("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")},initHighlightingOnLoad:function(){A(),N("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")},registerLanguage:function(b,c){let d=null;try{d=c(a)}catch(a){if(L("Language definition for '{}' could not be registered.".replace("{}",b)),p)L(a);else throw a;d=s}d.name||(d.name=b),e[b]=d,d.rawDefinition=c.bind(null,a),d.aliases&&K(d.aliases,{languageName:b})},unregisterLanguage:function(a){for(let b of(delete e[a],Object.keys(f)))f[b]===a&&delete f[b]},listLanguages:function(){return Object.keys(e)},getLanguage:C,registerAliases:K,autoDetection:O,inherit:d,addPlugin:function(a){var b;(b=a)["before:highlightBlock"]&&!b["before:highlightElement"]&&(b["before:highlightElement"]=a=>{b["before:highlightBlock"](Object.assign({block:a.el},a))}),b["after:highlightBlock"]&&!b["after:highlightElement"]&&(b["after:highlightElement"]=a=>{b["after:highlightBlock"](Object.assign({block:a.el},a))}),g.push(a)},removePlugin:function(a){let b=g.indexOf(a);-1!==b&&g.splice(b,1)}}),a.debugMode=function(){p=!1},a.safeMode=function(){p=!0},a.versionString="11.11.1",a.regex={concat:m,lookahead:j,either:n,optional:l,anyNumberOfTimes:k},B)"object"==typeof B[b]&&function a(b){return b instanceof Map?b.clear=b.delete=b.set=function(){throw Error("map is read-only")}:b instanceof Set&&(b.add=b.clear=b.delete=function(){throw Error("set is read-only")}),Object.freeze(b),Object.getOwnPropertyNames(b).forEach(c=>{let d=b[c],e=typeof d;"object"!==e&&"function"!==e||Object.isFrozen(d)||a(d)}),b}(B[b]);return Object.assign(a,B),a},U=T({});U.newInstance=()=>T({}),a.exports=U,U.HighlightJS=U,U.default=U}};
|