commandmate 0.11.4 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +406 -314
- package/.next/app-path-routes-manifest.json +35 -26
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +15 -15
- package/.next/react-loadable-manifest.json +8 -6
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +66 -0
- package/.next/server/app/_not-found/page.js.nft.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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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_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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -0
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/route.js +1 -0
- package/.next/server/app/api/skills/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route.js +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_client-reference-manifest.js +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_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_client-reference-manifest.js +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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.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_client-reference-manifest.js +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_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_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_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_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_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_client-reference-manifest.js +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_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_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/route.js +23 -0
- package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +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_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_client-reference-manifest.js +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_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_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page.js +2 -2
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page.js.nft.json +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +1 -1
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +2 -0
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -0
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/skills/page.js +2 -0
- package/.next/server/app/skills/page.js.nft.json +1 -0
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -0
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +9 -9
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +35 -26
- package/.next/server/chunks/1117.js +1 -1
- package/.next/server/chunks/120.js +1 -0
- package/.next/server/chunks/1808.js +1 -0
- package/.next/server/chunks/186.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/22.js +1 -0
- package/.next/server/chunks/2328.js +1 -0
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/3042.js +2 -0
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3708.js +1 -0
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/5064.js +1 -0
- package/.next/server/chunks/5226.js +28 -0
- package/.next/server/chunks/5306.js +2 -0
- package/.next/server/chunks/5312.js +1 -0
- package/.next/server/chunks/5326.js +1 -0
- package/.next/server/chunks/5381.js +1 -1
- package/.next/server/chunks/5456.js +1 -0
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/5959.js +3 -3
- package/.next/server/chunks/6065.js +1 -0
- package/.next/server/chunks/6130.js +1 -0
- package/.next/server/chunks/6283.js +1 -1
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/646.js +6 -6
- package/.next/server/chunks/{9968.js → 7587.js} +1 -1
- package/.next/server/chunks/8584.js +1 -0
- package/.next/server/chunks/8681.js +1 -1
- package/.next/server/chunks/8807.js +950 -804
- package/.next/server/chunks/9123.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/static/ZYti9g9gICKnjtmkfvvB2/_buildManifest.js +1 -0
- package/.next/static/chunks/1668-7484081c45a44f89.js +1 -0
- package/.next/static/chunks/3418-7e47651340d940b0.js +1 -0
- package/.next/static/chunks/4027-0c529b322be7d4d8.js +1 -0
- package/.next/static/chunks/{4560-64b1461fd996127a.js → 4560-04e5aebcab96bfa1.js} +1 -1
- package/.next/static/chunks/6007-de36119357dcd418.js +1 -0
- package/.next/static/chunks/{6488-76295bf0184b101f.js → 6488-624d4b6d2d4cc236.js} +1 -1
- package/.next/static/chunks/{8965-872d8de254196cec.js → 6497-dc26c6c6b0b15adf.js} +1 -1
- package/.next/static/chunks/790-d8e6acd26e03679c.js +1 -0
- package/.next/static/chunks/8361.4bf062be2d2962f4.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/skills/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/templates/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/todos/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/chat/{page-9ed2ffd98eb4ae18.js → page-9cf4ba62e21d9074.js} +1 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/more/{page-a496425bba427b48.js → page-082d4ae496f9a36e.js} +1 -1
- package/.next/static/chunks/app/{page-15bfd76bcf65842d.js → page-af457ca5876ed616.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-56dad0523d3c4a92.js +1 -0
- package/.next/static/chunks/app/repositories/{page-d214522ab8792ce7.js → page-75f0d70452c6b6c0.js} +1 -1
- package/.next/static/chunks/app/review/{page-1dadf0b5d7129598.js → page-f431d630097c2e85.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-96f007d986c5f327.js → page-20f07a99db64d2ca.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/page-68ed5e9186efe56d.js +1 -0
- package/.next/static/chunks/app/skills/page-46242c428ee8bccf.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-7dd929bfc978742e.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-a75fe180a7233b2b.js +1 -0
- package/.next/static/chunks/webpack-0f9275e279c058eb.js +1 -0
- package/.next/static/css/b4bdb1f3457fe9a7.css +1 -0
- package/.next/trace +11 -10
- package/.next/types/app/api/skills/[id]/route.ts +347 -0
- package/.next/types/app/api/skills/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/skills/[skillId]/install/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/skills/[skillId]/plan/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/skills/route.ts +347 -0
- package/.next/types/app/skills/[skillId]/page.ts +84 -0
- package/.next/types/app/skills/page.ts +84 -0
- package/.next/types/routes.d.ts +11 -2
- package/.next/types/validator.ts +81 -0
- package/dist/cli/commands/skill-format.d.ts +28 -0
- package/dist/cli/commands/skill-format.d.ts.map +1 -0
- package/dist/cli/commands/skill-format.js +163 -0
- package/dist/cli/commands/skill-guards.d.ts +53 -0
- package/dist/cli/commands/skill-guards.d.ts.map +1 -0
- package/dist/cli/commands/skill-guards.js +188 -0
- package/dist/cli/commands/skill.d.ts +24 -0
- package/dist/cli/commands/skill.d.ts.map +1 -0
- package/dist/cli/commands/skill.js +365 -0
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +36 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +11 -0
- package/dist/cli/types/api-responses.d.ts +215 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +60 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/index.js +23 -1
- package/dist/cli/utils/api-client.d.ts +19 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +41 -4
- package/dist/server/server.js +57 -0
- package/dist/server/src/config/activity-bar-config.js +2 -0
- package/dist/server/src/config/git-status-config.js +83 -0
- package/dist/server/src/config/skill-security-config.js +139 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +8 -13
- package/dist/server/src/lib/cli-tools/codex.js +8 -14
- package/dist/server/src/lib/cli-tools/copilot.js +12 -13
- package/dist/server/src/lib/cli-tools/gemini.js +8 -13
- package/dist/server/src/lib/cli-tools/opencode.js +8 -13
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +174 -0
- package/dist/server/src/lib/cli-tools/vibe-local.js +12 -17
- package/dist/server/src/lib/db/migrations/index.js +8 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v44-skill-operations.js +81 -0
- package/dist/server/src/lib/db/migrations/v45-skill-installations.js +59 -0
- package/dist/server/src/lib/db/migrations/v46-skill-installations-cascade.js +107 -0
- package/dist/server/src/lib/db/migrations/v47-skill-installations-roots.js +70 -0
- package/dist/server/src/lib/db/worktree-db.js +9 -4
- package/dist/server/src/lib/git/git-errors.js +336 -0
- package/dist/server/src/lib/git/git-exec.js +285 -0
- package/dist/server/src/lib/session-key-sender.js +11 -9
- package/dist/server/src/lib/skills/compatibility.js +194 -0
- package/dist/server/src/lib/skills/constants.js +252 -0
- package/dist/server/src/lib/skills/errors.js +82 -0
- package/dist/server/src/lib/skills/index.js +91 -0
- package/dist/server/src/lib/skills/install-apply.js +670 -0
- package/dist/server/src/lib/skills/install-plan.js +582 -0
- package/dist/server/src/lib/skills/installed-state.js +127 -0
- package/dist/server/src/lib/skills/integrity.js +225 -0
- package/dist/server/src/lib/skills/json-schema.js +365 -0
- package/dist/server/src/lib/skills/operation-audit.js +120 -0
- package/dist/server/src/lib/skills/operation-journal.js +286 -0
- package/dist/server/src/lib/skills/operation-lock.js +339 -0
- package/dist/server/src/lib/skills/operation-reconciler.js +107 -0
- package/dist/server/src/lib/skills/operation-store.js +153 -0
- package/dist/server/src/lib/skills/package-reader.js +495 -0
- package/dist/server/src/lib/skills/package-validator.js +451 -0
- package/dist/server/src/lib/skills/preview-diff.js +627 -0
- package/dist/server/src/lib/skills/safe-yaml.js +593 -0
- package/dist/server/src/lib/skills/schema.js +1248 -0
- package/dist/server/src/lib/skills/semver.js +193 -0
- package/dist/server/src/lib/skills/snapshot-store.js +334 -0
- package/dist/server/src/lib/skills/startup-reconcile.js +138 -0
- package/dist/server/src/lib/skills/uninstall-apply.js +495 -0
- package/dist/server/src/lib/skills/uninstall-plan.js +479 -0
- package/dist/server/src/types/skills.js +17 -0
- package/package.json +1 -1
- package/.next/server/chunks/129.js +0 -1
- package/.next/server/chunks/2478.js +0 -1
- package/.next/server/chunks/9886.js +0 -1
- package/.next/static/0_lnKsT0DH-MnHhnV5n-l/_buildManifest.js +0 -1
- package/.next/static/chunks/3165-87bf884f7f3d15cf.js +0 -1
- package/.next/static/chunks/6416.6756b7ad06dd96f7.js +0 -1
- package/.next/static/chunks/8676.57260a06f6554e7e.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/templates/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/todos/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-7536041a7a89616d.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-9a4ce51e697baac6.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-ed4590b024edd8d6.js +0 -1
- package/.next/static/chunks/webpack-2e3739a831868daa.js +0 -1
- package/.next/static/css/d7e2e8d1b8d69d36.css +0 -1
- package/dist/server/src/lib/pasted-text-helper.js +0 -58
- /package/.next/static/{0_lnKsT0DH-MnHhnV5n-l → ZYti9g9gICKnjtmkfvvB2}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Git status polling configuration
|
|
4
|
+
* Issue #779: git status API + GitPane Current Status (Phase 1/5)
|
|
5
|
+
*
|
|
6
|
+
* Semantic separation from file-polling-config: GitPane's Current Status
|
|
7
|
+
* section polls `GET /api/worktrees/[id]/git/status` on its own cadence.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.GIT_PROGRESS_POLL_INTERVAL_MS = exports.GIT_PUSH_TIMEOUT_MS = exports.GIT_PULL_TIMEOUT_MS = exports.GIT_FETCH_TIMEOUT_MS = exports.MAX_STASH_INDEX = exports.MAX_COMMIT_MESSAGE_LENGTH = exports.MAX_GIT_FILES = exports.GIT_WRITE_TIMEOUT_MS = exports.GIT_STATUS_POLL_INTERVAL_MS = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Polling interval (ms) for GitPane's Current Status section.
|
|
13
|
+
* Issue #779: drives `useFilePolling` in GitPane (visibilitychange-aware).
|
|
14
|
+
*/
|
|
15
|
+
exports.GIT_STATUS_POLL_INTERVAL_MS = 5000;
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Issue #780: stage / unstage / commit operations
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Timeout (ms) for git WRITE operations (add / restore --staged / commit) and
|
|
21
|
+
* for the staged-status read used by those flows. Deliberately larger than the
|
|
22
|
+
* 1s `GIT_COMMAND_TIMEOUT_MS` used by getGitStatus (#779) because write ops can
|
|
23
|
+
* run pre-commit hooks and stage large numbers of files.
|
|
24
|
+
*/
|
|
25
|
+
exports.GIT_WRITE_TIMEOUT_MS = 30000;
|
|
26
|
+
/**
|
|
27
|
+
* Maximum number of file paths accepted in a single stage / unstage request.
|
|
28
|
+
* Requests exceeding this are rejected with HTTP 400 to bound argv size and
|
|
29
|
+
* per-request work.
|
|
30
|
+
*/
|
|
31
|
+
exports.MAX_GIT_FILES = 1000;
|
|
32
|
+
/**
|
|
33
|
+
* Maximum length (characters) of a commit message. Messages exceeding this are
|
|
34
|
+
* rejected with HTTP 400.
|
|
35
|
+
*/
|
|
36
|
+
exports.MAX_COMMIT_MESSAGE_LENGTH = 10000;
|
|
37
|
+
// =============================================================================
|
|
38
|
+
// Issue #782: stash + reset/revert (Phase 4/5 - Danger Zone)
|
|
39
|
+
// =============================================================================
|
|
40
|
+
/**
|
|
41
|
+
* Maximum accepted `index` for the stash pop/apply/drop routes (Issue #782).
|
|
42
|
+
* The index is validated to be `/^\d+$/` and <= this bound before it is
|
|
43
|
+
* embedded into the `stash@{N}` argv (DoS / absurd-index defense). Mirrors the
|
|
44
|
+
* MAX_GIT_FILES (#780) / MAX_BRANCH_REF_LENGTH (#781) bounding pattern.
|
|
45
|
+
*/
|
|
46
|
+
exports.MAX_STASH_INDEX = 1000;
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// Issue #783: network operations (Phase 5/5 - push / pull / fetch)
|
|
49
|
+
// =============================================================================
|
|
50
|
+
/**
|
|
51
|
+
* Timeout (ms) for `git fetch`. Larger than the 1s `GIT_COMMAND_TIMEOUT_MS`
|
|
52
|
+
* (status read) and the 30s `GIT_WRITE_TIMEOUT_MS` line: a fetch contacts the
|
|
53
|
+
* remote and may run longer than a local index write. fetch is NOT serialized
|
|
54
|
+
* (§6.1) — it only updates remote-tracking refs / packed-refs.
|
|
55
|
+
*/
|
|
56
|
+
exports.GIT_FETCH_TIMEOUT_MS = 30000;
|
|
57
|
+
/**
|
|
58
|
+
* Timeout (ms) for `git pull`. 60s because a pull does a fetch AND a merge/rebase
|
|
59
|
+
* over the working tree (slower than a bare fetch). Serialized per worktree.
|
|
60
|
+
*/
|
|
61
|
+
exports.GIT_PULL_TIMEOUT_MS = 60000;
|
|
62
|
+
/**
|
|
63
|
+
* Timeout (ms) for `git push`. 60s because a push uploads objects to a remote
|
|
64
|
+
* over the network (the slowest network op). Serialized per worktree.
|
|
65
|
+
*/
|
|
66
|
+
exports.GIT_PUSH_TIMEOUT_MS = 60000;
|
|
67
|
+
/**
|
|
68
|
+
* DR1-003: This is NOT a server progress-polling interval. There is NO server
|
|
69
|
+
* progress endpoint; the route holds the git process until completion and the
|
|
70
|
+
* awaited Promise is the only true state-transition source. This constant is an
|
|
71
|
+
* OPTIONAL client-side elapsed-time tick (zero server round-trips) used only to
|
|
72
|
+
* re-render the elapsed seconds while a network op is in-flight. A plain spinner
|
|
73
|
+
* is sufficient, so this may go unused. The name is kept for compatibility with
|
|
74
|
+
* the Issue body's "progress polling" wording (its true role is documented here).
|
|
75
|
+
*/
|
|
76
|
+
exports.GIT_PROGRESS_POLL_INTERVAL_MS = 1000; // optional elapsed-time tick (in-flight only; NOT server progress)
|
|
77
|
+
// Issue #1277: the GitPane warning/guidance strings that used to live here
|
|
78
|
+
// (CHECKOUT_*_WARNING / RESET_HARD_HISTORY_LOSS_WARNING /
|
|
79
|
+
// DANGER_ZONE_RUNNING_SESSION_WARNING / PUSH_AUTH_FAILED_GUIDANCE /
|
|
80
|
+
// PUSH_PROTECTED_BRANCH_WARNING) were hardcoded Japanese rendered to every
|
|
81
|
+
// locale. They now live in the `worktree` dictionary under `git.*` and are
|
|
82
|
+
// resolved with useTranslations at the render site. Do not reintroduce
|
|
83
|
+
// user-facing prose in this config module.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Skill fetch/snapshot security policy (Issue #1229)
|
|
4
|
+
*
|
|
5
|
+
* Single source of truth for *where* CommandMate is allowed to fetch Skill
|
|
6
|
+
* documents from and *how much* it is allowed to keep on disk. Every value here
|
|
7
|
+
* is a hardcoded constant: none of it may be derived from environment
|
|
8
|
+
* variables, config files or client input, because that is exactly the SSRF
|
|
9
|
+
* lever this module exists to remove (OWASP A10:2021, same rule as
|
|
10
|
+
* `GITHUB_API_URL` in src/lib/version-checker.ts).
|
|
11
|
+
*
|
|
12
|
+
* Catalog JSON and release assets get *separate* policies: they are served by
|
|
13
|
+
* different origins with different media types, and a Catalog response must
|
|
14
|
+
* never be accepted where an artifact is expected (or vice versa).
|
|
15
|
+
*
|
|
16
|
+
* @module config/skill-security-config
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.SKILL_PLAN_SWEEP_INTERVAL_MS = exports.SKILL_SNAPSHOT_ID_PATTERN = exports.SKILL_SNAPSHOT_ID_BYTES = exports.SKILL_SNAPSHOT_MAX_COUNT = exports.SKILL_SNAPSHOT_TOTAL_QUOTA_BYTES = exports.SKILL_SNAPSHOT_TTL_MS = exports.SKILL_SNAPSHOT_FILE_MODE = exports.SKILL_SNAPSHOT_DIR_MODE = exports.SKILL_SNAPSHOT_DIRNAME = exports.SKILL_FETCH_USER_AGENT_PREFIX = exports.SKILL_CREDENTIAL_HEADERS = exports.SKILL_FETCH_TOTAL_TIMEOUT_MS = exports.SKILL_FETCH_HEADER_TIMEOUT_MS = exports.SKILL_FETCH_MAX_REDIRECTS = exports.SKILL_SOURCE_POLICIES = exports.SKILL_CATALOG_MAX_SIZE = exports.SKILL_CATALOG_FILENAME = exports.SKILL_OFFICIAL_REPOSITORY = void 0;
|
|
20
|
+
exports.buildSkillCatalogUrl = buildSkillCatalogUrl;
|
|
21
|
+
const skills_1 = require("../lib/skills");
|
|
22
|
+
// =============================================================================
|
|
23
|
+
// Official source coordinates
|
|
24
|
+
// =============================================================================
|
|
25
|
+
/** The only repository Skills may be distributed from in schema_version 1. */
|
|
26
|
+
exports.SKILL_OFFICIAL_REPOSITORY = 'Kewton/commandmate-skills';
|
|
27
|
+
/** Catalog document filename at the repository root. */
|
|
28
|
+
exports.SKILL_CATALOG_FILENAME = 'catalog.json';
|
|
29
|
+
/** Catalog JSON is served by the raw content host, pinned to the official repo. */
|
|
30
|
+
const CATALOG_HOSTS = [
|
|
31
|
+
{ host: 'raw.githubusercontent.com', pathPrefix: `/${exports.SKILL_OFFICIAL_REPOSITORY}/` },
|
|
32
|
+
];
|
|
33
|
+
/** Release asset downloads always start at the release download path. */
|
|
34
|
+
const ARTIFACT_ENTRY_HOSTS = [
|
|
35
|
+
{ host: 'github.com', pathPrefix: `/${exports.SKILL_OFFICIAL_REPOSITORY}/releases/download/` },
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Hosts a release asset download may be redirected to.
|
|
39
|
+
*
|
|
40
|
+
* GitHub hands release assets off to a storage CDN with an opaque, signed path,
|
|
41
|
+
* so no path prefix can be asserted on these hops. The artifact digest check is
|
|
42
|
+
* what makes that acceptable: a wrong body from an allowed host still fails.
|
|
43
|
+
*/
|
|
44
|
+
const ARTIFACT_REDIRECT_HOSTS = [
|
|
45
|
+
...ARTIFACT_ENTRY_HOSTS,
|
|
46
|
+
{ host: 'objects.githubusercontent.com' },
|
|
47
|
+
{ host: 'release-assets.githubusercontent.com' },
|
|
48
|
+
];
|
|
49
|
+
/** Maximum Catalog document size in bytes (4 MiB). */
|
|
50
|
+
exports.SKILL_CATALOG_MAX_SIZE = 4 * 1024 * 1024;
|
|
51
|
+
/**
|
|
52
|
+
* `raw.githubusercontent.com` serves `.json` as `text/plain`, so the Catalog
|
|
53
|
+
* policy has to accept it. The document is parsed as JSON regardless of the
|
|
54
|
+
* declared type, and validated by `validateSkillCatalog` afterwards.
|
|
55
|
+
*/
|
|
56
|
+
const CATALOG_CONTENT_TYPES = ['application/json', 'text/plain'];
|
|
57
|
+
exports.SKILL_SOURCE_POLICIES = {
|
|
58
|
+
catalog: {
|
|
59
|
+
kind: 'catalog',
|
|
60
|
+
entryHosts: CATALOG_HOSTS,
|
|
61
|
+
redirectHosts: CATALOG_HOSTS,
|
|
62
|
+
accept: 'application/json',
|
|
63
|
+
contentTypes: CATALOG_CONTENT_TYPES,
|
|
64
|
+
maxBytes: exports.SKILL_CATALOG_MAX_SIZE,
|
|
65
|
+
},
|
|
66
|
+
artifact: {
|
|
67
|
+
kind: 'artifact',
|
|
68
|
+
entryHosts: ARTIFACT_ENTRY_HOSTS,
|
|
69
|
+
redirectHosts: ARTIFACT_REDIRECT_HOSTS,
|
|
70
|
+
accept: skills_1.SKILL_ARTIFACT_CONTENT_TYPE,
|
|
71
|
+
contentTypes: [skills_1.SKILL_ARTIFACT_CONTENT_TYPE, 'application/octet-stream'],
|
|
72
|
+
maxBytes: skills_1.SKILL_ARTIFACT_MAX_SIZE,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
// =============================================================================
|
|
76
|
+
// Transport limits
|
|
77
|
+
// =============================================================================
|
|
78
|
+
/** Maximum number of redirect hops before a fetch fails closed. */
|
|
79
|
+
exports.SKILL_FETCH_MAX_REDIRECTS = 5;
|
|
80
|
+
/** Timeout for receiving response headers, in milliseconds. */
|
|
81
|
+
exports.SKILL_FETCH_HEADER_TIMEOUT_MS = 10_000;
|
|
82
|
+
/** Timeout for the whole request including body transfer, in milliseconds. */
|
|
83
|
+
exports.SKILL_FETCH_TOTAL_TIMEOUT_MS = 120_000;
|
|
84
|
+
/**
|
|
85
|
+
* Request headers dropped when a redirect crosses an origin.
|
|
86
|
+
*
|
|
87
|
+
* `fetch` with `redirect: 'manual'` gives us the hop, so credential forwarding
|
|
88
|
+
* is our responsibility: a signed CDN redirect must never carry a GitHub token.
|
|
89
|
+
*/
|
|
90
|
+
exports.SKILL_CREDENTIAL_HEADERS = [
|
|
91
|
+
'authorization',
|
|
92
|
+
'cookie',
|
|
93
|
+
'proxy-authorization',
|
|
94
|
+
];
|
|
95
|
+
/** Value sent as `User-Agent`, matching the version-checker convention. */
|
|
96
|
+
exports.SKILL_FETCH_USER_AGENT_PREFIX = 'CommandMate';
|
|
97
|
+
// =============================================================================
|
|
98
|
+
// Snapshot store limits
|
|
99
|
+
// =============================================================================
|
|
100
|
+
/** Directory name of the snapshot store under the service-owned data root. */
|
|
101
|
+
exports.SKILL_SNAPSHOT_DIRNAME = 'skill-snapshots';
|
|
102
|
+
/** Snapshot directory mode: service-owned, not group/world readable. */
|
|
103
|
+
exports.SKILL_SNAPSHOT_DIR_MODE = 0o700;
|
|
104
|
+
/** Snapshot file mode: read-only for the owning service account. */
|
|
105
|
+
exports.SKILL_SNAPSHOT_FILE_MODE = 0o400;
|
|
106
|
+
/** Lifetime of an unreferenced snapshot before sweeping, in milliseconds. */
|
|
107
|
+
exports.SKILL_SNAPSHOT_TTL_MS = 30 * 60 * 1000;
|
|
108
|
+
/** Total bytes the snapshot store may hold (256 MiB). */
|
|
109
|
+
exports.SKILL_SNAPSHOT_TOTAL_QUOTA_BYTES = 256 * 1024 * 1024;
|
|
110
|
+
/** Maximum number of concurrently retained snapshots. */
|
|
111
|
+
exports.SKILL_SNAPSHOT_MAX_COUNT = 64;
|
|
112
|
+
/** Random bytes behind an opaque snapshot ID. */
|
|
113
|
+
exports.SKILL_SNAPSHOT_ID_BYTES = 16;
|
|
114
|
+
/** Opaque snapshot ID grammar: lowercase hex of {@link SKILL_SNAPSHOT_ID_BYTES}. */
|
|
115
|
+
exports.SKILL_SNAPSHOT_ID_PATTERN = /^[0-9a-f]{32}$/;
|
|
116
|
+
/**
|
|
117
|
+
* How often the background sweeper reclaims expired plans and snapshots.
|
|
118
|
+
*
|
|
119
|
+
* Short relative to both TTLs so an abandoned plan releases its snapshot within
|
|
120
|
+
* a minute of expiring, rather than waiting for the next plan to be created.
|
|
121
|
+
*/
|
|
122
|
+
exports.SKILL_PLAN_SWEEP_INTERVAL_MS = 60 * 1000;
|
|
123
|
+
// =============================================================================
|
|
124
|
+
// URL construction
|
|
125
|
+
// =============================================================================
|
|
126
|
+
/**
|
|
127
|
+
* Build the Catalog URL for an immutable commit.
|
|
128
|
+
*
|
|
129
|
+
* Takes a resolved 40-hex commit rather than a branch so the Catalog a user
|
|
130
|
+
* reviewed is the Catalog that gets installed. Callers never supply a URL.
|
|
131
|
+
*
|
|
132
|
+
* @throws Error when the commit is not a resolved 40-hex SHA
|
|
133
|
+
*/
|
|
134
|
+
function buildSkillCatalogUrl(commit) {
|
|
135
|
+
if (!skills_1.GIT_COMMIT_SHA_PATTERN.test(commit)) {
|
|
136
|
+
throw new Error('Skill catalog URL requires a resolved 40-hex commit SHA');
|
|
137
|
+
}
|
|
138
|
+
return `https://raw.githubusercontent.com/${exports.SKILL_OFFICIAL_REPOSITORY}/${commit}/${exports.SKILL_CATALOG_FILENAME}`;
|
|
139
|
+
}
|
|
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
13
|
exports.AntigravityTool = void 0;
|
|
14
14
|
const base_1 = require("./base");
|
|
15
15
|
const tmux_1 = require("../tmux/tmux");
|
|
16
|
-
const
|
|
16
|
+
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
17
17
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
18
18
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
19
19
|
const logger_1 = require("../../lib/logger");
|
|
@@ -217,18 +217,13 @@ class AntigravityTool extends base_1.BaseCLITool {
|
|
|
217
217
|
try {
|
|
218
218
|
// Verify agy is at a ready prompt before sending
|
|
219
219
|
await this.waitForPrompt(sessionName);
|
|
220
|
-
//
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS));
|
|
228
|
-
// Detect [Pasted text] and resend Enter for multi-line messages
|
|
229
|
-
if (message.includes('\n')) {
|
|
230
|
-
await (0, pasted_text_helper_1.detectAndResendIfPastedText)(sessionName);
|
|
231
|
-
}
|
|
220
|
+
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
221
|
+
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
222
|
+
await (0, submit_verified_sender_1.sendMessageWithSubmitVerification)({
|
|
223
|
+
sessionName,
|
|
224
|
+
message,
|
|
225
|
+
cliToolId: 'antigravity',
|
|
226
|
+
});
|
|
232
227
|
// Invalidate cache after sending message (required so the poller re-reads)
|
|
233
228
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
234
229
|
logger.info('sent-message-to-antigravity-session');
|
|
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.CodexTool = void 0;
|
|
8
8
|
const base_1 = require("./base");
|
|
9
9
|
const tmux_1 = require("../tmux/tmux");
|
|
10
|
-
const
|
|
10
|
+
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
11
11
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
12
12
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
13
13
|
const logger_1 = require("../../lib/logger");
|
|
@@ -209,19 +209,13 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
209
209
|
try {
|
|
210
210
|
// Verify Codex is at prompt state before sending
|
|
211
211
|
await this.waitForPrompt(sessionName);
|
|
212
|
-
//
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS));
|
|
220
|
-
// Issue #212: Detect [Pasted text] and resend Enter for multi-line messages
|
|
221
|
-
// MF-001: Single-line messages skip detection (+0ms overhead)
|
|
222
|
-
if (message.includes('\n')) {
|
|
223
|
-
await (0, pasted_text_helper_1.detectAndResendIfPastedText)(sessionName);
|
|
224
|
-
}
|
|
212
|
+
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
213
|
+
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
214
|
+
await (0, submit_verified_sender_1.sendMessageWithSubmitVerification)({
|
|
215
|
+
sessionName,
|
|
216
|
+
message,
|
|
217
|
+
cliToolId: 'codex',
|
|
218
|
+
});
|
|
225
219
|
// Issue #405: Invalidate cache after sending message
|
|
226
220
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
227
221
|
logger.info('sent-message-to-codex-session:sessionnam');
|
|
@@ -12,7 +12,7 @@ exports.CopilotTool = void 0;
|
|
|
12
12
|
const child_process_1 = require("child_process");
|
|
13
13
|
const base_1 = require("./base");
|
|
14
14
|
const tmux_1 = require("../tmux/tmux");
|
|
15
|
-
const
|
|
15
|
+
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
16
16
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
17
17
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
18
18
|
const copilot_constants_1 = require("../../config/copilot-constants");
|
|
@@ -246,18 +246,17 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
246
246
|
logger.info('sent-selection-list-command-to-copilot', { command: slashCmd });
|
|
247
247
|
return;
|
|
248
248
|
}
|
|
249
|
-
//
|
|
250
|
-
|
|
251
|
-
//
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
}
|
|
249
|
+
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
250
|
+
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
251
|
+
// Copilot's own text-input / post-Enter delays are preserved. The selection
|
|
252
|
+
// list slash-command branch above is intentionally NOT routed through here.
|
|
253
|
+
await (0, submit_verified_sender_1.sendMessageWithSubmitVerification)({
|
|
254
|
+
sessionName,
|
|
255
|
+
message,
|
|
256
|
+
cliToolId: 'copilot',
|
|
257
|
+
textInputWaitMs: copilot_constants_1.COPILOT_TEXT_INPUT_DELAY_MS,
|
|
258
|
+
verifyDelayMs: copilot_constants_1.COPILOT_SEND_ENTER_DELAY_MS,
|
|
259
|
+
});
|
|
261
260
|
// Invalidate cache after sending message
|
|
262
261
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
263
262
|
logger.info('sent-message-to-copilot-session');
|
|
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.GeminiTool = exports.GEMINI_PANE_HEIGHT = void 0;
|
|
13
13
|
const base_1 = require("./base");
|
|
14
14
|
const tmux_1 = require("../tmux/tmux");
|
|
15
|
-
const
|
|
15
|
+
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
16
16
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
17
17
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
18
18
|
const logger_1 = require("../../lib/logger");
|
|
@@ -167,18 +167,13 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
167
167
|
try {
|
|
168
168
|
// Verify Gemini is at prompt state before sending
|
|
169
169
|
await this.waitForPrompt(sessionName);
|
|
170
|
-
//
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS));
|
|
178
|
-
// Detect [Pasted text] and resend Enter for multi-line messages
|
|
179
|
-
if (message.includes('\n')) {
|
|
180
|
-
await (0, pasted_text_helper_1.detectAndResendIfPastedText)(sessionName);
|
|
181
|
-
}
|
|
170
|
+
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
171
|
+
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
172
|
+
await (0, submit_verified_sender_1.sendMessageWithSubmitVerification)({
|
|
173
|
+
sessionName,
|
|
174
|
+
message,
|
|
175
|
+
cliToolId: 'gemini',
|
|
176
|
+
});
|
|
182
177
|
// Issue #405: Invalidate cache after sending message
|
|
183
178
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
184
179
|
logger.info('sent-message-to-gemini-session:sessionna');
|
|
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
13
|
exports.OpenCodeTool = exports.OPENCODE_INIT_WAIT_MS = exports.OPENCODE_PANE_HEIGHT = exports.OPENCODE_EXIT_COMMAND = void 0;
|
|
14
14
|
const base_1 = require("./base");
|
|
15
15
|
const tmux_1 = require("../tmux/tmux");
|
|
16
|
-
const
|
|
16
|
+
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
17
17
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
18
18
|
const opencode_config_1 = require("./opencode-config");
|
|
19
19
|
const child_process_1 = require("child_process");
|
|
@@ -134,18 +134,13 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
134
134
|
throw new Error(`OpenCode session ${sessionName} does not exist. Start the session first.`);
|
|
135
135
|
}
|
|
136
136
|
try {
|
|
137
|
-
//
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS));
|
|
145
|
-
// Detect [Pasted text] and resend Enter for multi-line messages
|
|
146
|
-
if (message.includes('\n')) {
|
|
147
|
-
await (0, pasted_text_helper_1.detectAndResendIfPastedText)(sessionName);
|
|
148
|
-
}
|
|
137
|
+
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
138
|
+
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
139
|
+
await (0, submit_verified_sender_1.sendMessageWithSubmitVerification)({
|
|
140
|
+
sessionName,
|
|
141
|
+
message,
|
|
142
|
+
cliToolId: 'opencode',
|
|
143
|
+
});
|
|
149
144
|
// Issue #405: Invalidate cache after sending message
|
|
150
145
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
151
146
|
logger.info('sent-message-to-opencode-session:session');
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Submit-verified message sender (Issues #1469, #1470, #1471).
|
|
4
|
+
*
|
|
5
|
+
* A single shared helper that replaces the seven near-identical
|
|
6
|
+
* "type body -> press Enter -> maybe recover paste" sequences previously
|
|
7
|
+
* duplicated across session-key-sender.ts and every cli-tools/*.ts sendMessage(),
|
|
8
|
+
* plus the terminal API route's raw `sendKeys(command)` batch send.
|
|
9
|
+
*
|
|
10
|
+
* Why this exists (root cause):
|
|
11
|
+
* tmux `send-keys <body> C-m` batches the body and Enter into a SINGLE command.
|
|
12
|
+
* ink/React TUIs (Claude Code, Codex, ...) treat the injected body as a
|
|
13
|
+
* bracketed paste and swallow the trailing C-m as a newline inside the paste
|
|
14
|
+
* buffer, so the message is typed but never submitted. The recovery that used
|
|
15
|
+
* to guard this was gated on `message.includes('\n')` (single-line messages
|
|
16
|
+
* skipped entirely), keyed off Claude's version-specific `[Pasted text #\d+`
|
|
17
|
+
* string, and never verified that submit actually happened (fire-and-forget).
|
|
18
|
+
*
|
|
19
|
+
* This helper fixes all three:
|
|
20
|
+
* 1. Body and Enter are ALWAYS sent as separate tmux commands with a delay
|
|
21
|
+
* between them (never a single body+C-m batch).
|
|
22
|
+
* 2. Recovery + verification apply to EVERY message (no `\n` gate).
|
|
23
|
+
* 3. After submit it reads the pane back and confirms the message actually
|
|
24
|
+
* left the input box (empty input line) or the tool began generating.
|
|
25
|
+
* If it is still pending it resends Enter, bounded; if it can never be
|
|
26
|
+
* confirmed it THROWS (callers must not report success on a stuck send).
|
|
27
|
+
*
|
|
28
|
+
* The verification is intentionally NOT keyed off the version-specific
|
|
29
|
+
* `[Pasted text #\d+` placeholder. That placeholder is used only as one
|
|
30
|
+
* "still pending" positive signal (broadened to be version-resilient); the
|
|
31
|
+
* primary decision is "is the message still sitting on the input line?".
|
|
32
|
+
*/
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
exports.isSubmitted = isSubmitted;
|
|
35
|
+
exports.sendMessageWithSubmitVerification = sendMessageWithSubmitVerification;
|
|
36
|
+
const tmux_1 = require("../tmux/tmux");
|
|
37
|
+
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
38
|
+
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
39
|
+
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
40
|
+
const logger_1 = require("../../lib/logger");
|
|
41
|
+
const logger = (0, logger_1.createLogger)('cli-tools/submit-verified-sender');
|
|
42
|
+
/**
|
|
43
|
+
* Version-resilient pasted-text placeholder.
|
|
44
|
+
*
|
|
45
|
+
* Broader than PASTED_TEXT_PATTERN (`/\[Pasted text #\d+/`) so it still matches
|
|
46
|
+
* when a CLI version drops the `#N` and renders `[Pasted text +46 lines]`
|
|
47
|
+
* (Issue #1469 condition 2). Used ONLY as a positive "still in the input box"
|
|
48
|
+
* signal — never as the sole submit gate — so applying it to every tool is safe:
|
|
49
|
+
* a tool that never renders it simply never matches.
|
|
50
|
+
*/
|
|
51
|
+
const PASTE_PLACEHOLDER_PATTERN = /\[Pasted text[\s#]/;
|
|
52
|
+
/**
|
|
53
|
+
* Prompt input-line markers across the supported TUIs.
|
|
54
|
+
* claude/gemini/copilot: `>` or `❯`; codex: `›`; antigravity: `>`;
|
|
55
|
+
* vibe-local: `ctx:N% ❯`. Leading whitespace is tolerated (tmux padding).
|
|
56
|
+
*/
|
|
57
|
+
const INPUT_LINE_MARKER = /^\s*(?:ctx:\d+%\s*)?[>❯›]/;
|
|
58
|
+
/** Lines of pane tail to inspect when verifying submit. */
|
|
59
|
+
const VERIFY_WINDOW_LINES = 12;
|
|
60
|
+
/** Default bounded read-back attempts before giving up (throwing). */
|
|
61
|
+
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
|
+
/**
|
|
66
|
+
* First non-blank fragment of the message, used to decide whether the body is
|
|
67
|
+
* still sitting on the input line. Only the first line matters because that is
|
|
68
|
+
* what a TUI shows on the prompt line before folding into a paste placeholder.
|
|
69
|
+
*/
|
|
70
|
+
function comparableFragment(message) {
|
|
71
|
+
const firstLine = message
|
|
72
|
+
.split('\n')
|
|
73
|
+
.map((l) => l.trim())
|
|
74
|
+
.find((l) => l.length > 0);
|
|
75
|
+
if (!firstLine)
|
|
76
|
+
return '';
|
|
77
|
+
return firstLine.slice(0, MAX_FRAGMENT_LENGTH);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Locate the active input line within the pane tail: the last line that begins
|
|
81
|
+
* with a prompt marker. Scanned bottom-up so a status-bar/footer line rendered
|
|
82
|
+
* BELOW the input box (antigravity's "? for shortcuts", vibe-local's status bar)
|
|
83
|
+
* does not hide the real input line above it.
|
|
84
|
+
*/
|
|
85
|
+
function findInputLine(windowLines) {
|
|
86
|
+
for (let i = windowLines.length - 1; i >= 0; i--) {
|
|
87
|
+
if (INPUT_LINE_MARKER.test(windowLines[i])) {
|
|
88
|
+
return windowLines[i];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Decide whether a captured pane shows the message as submitted.
|
|
95
|
+
*
|
|
96
|
+
* Version-independent by design — does NOT require the paste placeholder:
|
|
97
|
+
* A. The tool is generating a response -> submitted.
|
|
98
|
+
* B. A paste placeholder is on the input line -> NOT submitted (Enter eaten).
|
|
99
|
+
* C. The body fragment is still on the input line -> NOT submitted.
|
|
100
|
+
* D. Otherwise (empty input line / moved to history) -> submitted.
|
|
101
|
+
*
|
|
102
|
+
* B and C are scoped to the input line only, so the user-message echo that a
|
|
103
|
+
* TUI prints into its history above the prompt never causes a false "pending".
|
|
104
|
+
*/
|
|
105
|
+
function isSubmitted(output, cliToolId, message) {
|
|
106
|
+
const clean = (0, cli_patterns_1.stripAnsi)(output);
|
|
107
|
+
const windowLines = clean.split('\n').slice(-VERIFY_WINDOW_LINES);
|
|
108
|
+
const windowStr = windowLines.join('\n');
|
|
109
|
+
// A. Actively generating a response => the message was accepted.
|
|
110
|
+
if ((0, cli_patterns_1.detectThinking)(cliToolId, windowStr)) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
const inputLine = findInputLine(windowLines);
|
|
114
|
+
if (inputLine) {
|
|
115
|
+
// B. A paste placeholder is still folded on the input line => not submitted.
|
|
116
|
+
if (PASTE_PLACEHOLDER_PATTERN.test(inputLine)) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
// C. The typed body is still sitting on the input line => not submitted.
|
|
120
|
+
const fragment = comparableFragment(message);
|
|
121
|
+
if (fragment.length >= MIN_FRAGMENT_LENGTH && inputLine.includes(fragment)) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// D. Input line is clear (or absent) and nothing is generating => submitted.
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Type a message body and submit it, then verify the submit actually happened.
|
|
130
|
+
*
|
|
131
|
+
* The body and Enter are always separate tmux commands (never batched), so the
|
|
132
|
+
* TUI cannot swallow the Enter inside a bracketed-paste buffer. After the
|
|
133
|
+
* initial submit the pane is read back up to `verifyAttempts` times; each time
|
|
134
|
+
* it is still pending an extra Enter is sent. If submit can never be confirmed
|
|
135
|
+
* the function THROWS — callers must surface that as a failure, never as
|
|
136
|
+
* success (Issues #1469/#1470/#1471).
|
|
137
|
+
*
|
|
138
|
+
* @throws Error when submit cannot be confirmed within the bounded attempts.
|
|
139
|
+
*/
|
|
140
|
+
async function sendMessageWithSubmitVerification(params) {
|
|
141
|
+
const { sessionName, message, cliToolId, textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, submitEnterCount = 1, interEnterWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, verifyAttempts = DEFAULT_VERIFY_ATTEMPTS, verifyDelayMs = cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS, } = params;
|
|
142
|
+
// 1. Type the body only — never send Enter in the same tmux command.
|
|
143
|
+
await (0, tmux_1.sendKeys)(sessionName, message, false);
|
|
144
|
+
// 2. Let the TUI register the input before pressing Enter.
|
|
145
|
+
await new Promise((resolve) => setTimeout(resolve, textInputWaitMs));
|
|
146
|
+
// 3. Submit as a separate command (double Enter for vibe-local's IME mode).
|
|
147
|
+
for (let i = 0; i < Math.max(1, submitEnterCount); i++) {
|
|
148
|
+
await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
|
|
149
|
+
if (i < submitEnterCount - 1) {
|
|
150
|
+
await new Promise((resolve) => setTimeout(resolve, interEnterWaitMs));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// 4. Read-back verification: confirm the message left the input box, resend
|
|
154
|
+
// Enter while it is still pending, and throw if it never submits.
|
|
155
|
+
const attempts = Math.max(1, verifyAttempts);
|
|
156
|
+
for (let attempt = 0; attempt < attempts; attempt++) {
|
|
157
|
+
await new Promise((resolve) => setTimeout(resolve, verifyDelayMs));
|
|
158
|
+
const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -VERIFY_WINDOW_LINES });
|
|
159
|
+
if (isSubmitted(output, cliToolId, message)) {
|
|
160
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Still typed-but-unsent — resend a single Enter and re-check.
|
|
164
|
+
logger.warn('submit-not-confirmed:resending-enter', {
|
|
165
|
+
sessionName,
|
|
166
|
+
cliToolId,
|
|
167
|
+
attempt,
|
|
168
|
+
});
|
|
169
|
+
await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
|
|
170
|
+
}
|
|
171
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
172
|
+
logger.error('submit-verification-failed', { sessionName, cliToolId, attempts });
|
|
173
|
+
throw new Error(`Message submit could not be confirmed for session ${sessionName} after ${attempts} attempts (typed but unsent)`);
|
|
174
|
+
}
|
|
@@ -13,7 +13,7 @@ exports.VibeLocalTool = void 0;
|
|
|
13
13
|
const base_1 = require("./base");
|
|
14
14
|
const types_1 = require("./types");
|
|
15
15
|
const tmux_1 = require("../tmux/tmux");
|
|
16
|
-
const
|
|
16
|
+
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
17
17
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
18
18
|
const db_instance_1 = require("../db/db-instance");
|
|
19
19
|
const db_1 = require("../db");
|
|
@@ -121,22 +121,17 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
121
121
|
throw new Error(`Vibe Local session ${sessionName} does not exist. Start the session first.`);
|
|
122
122
|
}
|
|
123
123
|
try {
|
|
124
|
-
//
|
|
125
|
-
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS));
|
|
136
|
-
// Detect [Pasted text] and resend Enter for multi-line messages
|
|
137
|
-
if (message.includes('\n')) {
|
|
138
|
-
await (0, pasted_text_helper_1.detectAndResendIfPastedText)(sessionName);
|
|
139
|
-
}
|
|
124
|
+
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
125
|
+
// shared helper. vibe-local's IME mode needs TWO Enter presses (first Enter
|
|
126
|
+
// inserts a newline, the second submits), preserved via submitEnterCount: 2
|
|
127
|
+
// + the same inter-press wait (VIBE_LOCAL_DOUBLE_ENTER_WAIT_MS).
|
|
128
|
+
await (0, submit_verified_sender_1.sendMessageWithSubmitVerification)({
|
|
129
|
+
sessionName,
|
|
130
|
+
message,
|
|
131
|
+
cliToolId: 'vibe-local',
|
|
132
|
+
submitEnterCount: 2,
|
|
133
|
+
interEnterWaitMs: cli_tool_timing_config_1.VIBE_LOCAL_DOUBLE_ENTER_WAIT_MS,
|
|
134
|
+
});
|
|
140
135
|
// Issue #405: Invalidate cache after sending message
|
|
141
136
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
142
137
|
logger.info('sent-message-to-vibe-local-session:sessi');
|