commandmate 0.44.2 → 0.44.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +149 -149
- package/.next/app-path-routes-manifest.json +21 -21
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- package/.next/react-loadable-manifest.json +0 -6
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +2 -2
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +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.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.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +2 -2
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js +2 -2
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +2 -2
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.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 +3 -3
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.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_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- 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 +21 -21
- package/.next/server/chunks/1191.js +2 -2
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1559.js +2 -0
- package/.next/server/chunks/1789.js +1 -0
- 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/2460.js +1 -1
- package/.next/server/chunks/2710.js +1 -1
- package/.next/server/chunks/2908.js +1 -1
- package/.next/server/chunks/2980.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3718.js +1 -1
- package/.next/server/chunks/4207.js +2 -2
- package/.next/server/chunks/450.js +1 -1
- package/.next/server/chunks/4672.js +5 -0
- package/.next/server/chunks/{9353.js → 4718.js} +2 -2
- package/.next/server/chunks/4837.js +14 -0
- package/.next/server/chunks/5048.js +1 -1
- package/.next/server/chunks/5209.js +1 -0
- package/.next/server/chunks/5595.js +1 -1
- package/.next/server/chunks/5625.js +25 -0
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +3 -3
- package/.next/server/chunks/7491.js +2 -2
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/850.js +1 -1
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8800.js +1 -1
- package/.next/server/chunks/8918.js +7 -7
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/9390.js +2 -2
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +6 -6
- package/.next/server/chunks/9731.js +3 -3
- 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/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
- package/.next/static/chunks/{2407-051f6f84226a9f2c.js → 2407-06d35bb1aa02de80.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
- package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
- package/.next/static/chunks/app/{layout-9da1ab602bcb3051.js → layout-0d1750b833f5cc3e.js} +1 -1
- package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/static/css/057f64a65726c439.css +1 -0
- package/.next/trace +13 -13
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +120 -119
- package/dist/cli/commands/attach.d.ts +94 -0
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +145 -7
- package/dist/cli/commands/auto-yes.js +1 -1
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +3 -5
- package/dist/cli/commands/command-target.d.ts +23 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -0
- package/dist/cli/commands/command-target.js +25 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +41 -2
- package/dist/cli/commands/message-dispatch.d.ts +36 -0
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
- package/dist/cli/commands/message-dispatch.js +63 -0
- package/dist/cli/commands/reply.d.ts.map +1 -1
- package/dist/cli/commands/reply.js +2 -5
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +3 -6
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +149 -146
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +589 -431
- package/dist/cli/types/api-responses.d.ts +159 -27
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/api-responses.js +4 -2
- package/dist/cli/utils/api-client.d.ts +25 -5
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +87 -55
- package/dist/cli/utils/server-url.d.ts +1 -0
- package/dist/cli/utils/server-url.d.ts.map +1 -1
- package/dist/cli/utils/server-url.js +7 -0
- package/dist/config/uat-isolation.d.ts +140 -0
- package/dist/config/uat-isolation.d.ts.map +1 -0
- package/dist/config/uat-isolation.js +246 -0
- package/dist/lib/global-state.d.ts +12 -0
- package/dist/lib/global-state.d.ts.map +1 -0
- package/dist/lib/global-state.js +16 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
- package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/lib/session/prompt-view.d.ts +26 -3
- package/dist/lib/session/prompt-view.d.ts.map +1 -1
- package/dist/lib/session/prompt-view.js +26 -3
- package/dist/lib/session/status-evidence-type.d.ts +16 -0
- package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
- package/dist/lib/session/status-evidence-type.js +2 -0
- package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
- package/dist/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/locales/en/worktree.json +3 -1
- package/dist/server/locales/ja/worktree.json +3 -1
- package/dist/server/src/cli/types/api-responses.js +4 -2
- package/dist/server/src/config/cli-tool-timing-config.js +1 -6
- package/dist/server/src/config/uat-isolation.js +246 -0
- package/dist/server/src/lib/assistant-response-saver.js +62 -3
- package/dist/server/src/lib/auto-yes-lifecycle.js +6 -0
- package/dist/server/src/lib/auto-yes-poller.js +450 -160
- package/dist/server/src/lib/auto-yes-state.js +2 -2
- package/dist/server/src/lib/cli-tools/antigravity.js +38 -79
- package/dist/server/src/lib/cli-tools/base.js +151 -0
- package/dist/server/src/lib/cli-tools/codex.js +44 -80
- package/dist/server/src/lib/cli-tools/command-code.js +24 -56
- package/dist/server/src/lib/cli-tools/copilot.js +25 -67
- package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
- package/dist/server/src/lib/cli-tools/gemini.js +23 -73
- package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
- package/dist/server/src/lib/cli-tools/opencode.js +21 -85
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
- package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
- package/dist/server/src/lib/detection/cli-patterns.js +374 -3065
- package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
- package/dist/server/src/lib/detection/prompt-detector.js +2 -35
- package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
- package/dist/server/src/lib/detection/selection-shape.js +32 -520
- package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
- package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
- package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +5 -29
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +3 -14
- package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
- package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/codex/detect.js +46 -85
- package/dist/server/src/lib/detection/tools/codex/live-region.js +33 -2
- package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
- package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/command-code/detect.js +8 -50
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
- package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
- package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
- package/dist/server/src/lib/detection/tools/context-above.js +20 -0
- package/dist/server/src/lib/detection/tools/copilot/detect.js +10 -35
- package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
- package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
- package/dist/server/src/lib/detection/tools/live-region-specs.js +1 -1
- package/dist/server/src/lib/detection/tools/opencode/detect.js +8 -49
- package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +7 -42
- package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +6 -47
- package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
- package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
- package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
- package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
- package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
- package/dist/server/src/lib/global-state.js +16 -0
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
- package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
- package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
- package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
- package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
- package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +33 -3
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
- package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
- package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
- package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
- package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
- package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
- package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
- package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
- package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
- package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
- package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
- package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
- package/dist/server/src/lib/hooks/sources/registry.js +3 -2
- package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
- package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
- package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
- package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
- package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
- package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
- package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
- package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
- package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
- package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
- package/dist/server/src/lib/polling/response-checker.js +641 -1142
- package/dist/server/src/lib/polling/response-dedup.js +3 -4
- package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
- package/dist/server/src/lib/polling/response-poller-core.js +54 -20
- package/dist/server/src/lib/polling/startup-screen.js +142 -0
- package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
- package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
- package/dist/server/src/lib/prompt-answer-sender.js +5 -4
- package/dist/server/src/lib/push/failure-episode-state.js +2 -2
- package/dist/server/src/lib/push/notification-dedup.js +3 -4
- package/dist/server/src/lib/push/prompt-card-state.js +2 -2
- package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
- package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
- package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -5
- package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
- package/dist/server/src/lib/relay/relay-delivery.js +3 -2
- package/dist/server/src/lib/relay/relay-readiness.js +38 -1
- package/dist/server/src/lib/response-cleaner.js +24 -1
- package/dist/server/src/lib/response-extractor.js +16 -0
- package/dist/server/src/lib/schedule-manager.js +8 -10
- package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
- package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
- package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
- package/dist/server/src/lib/session/agent-event-model.js +562 -0
- package/dist/server/src/lib/session/agent-event-record.js +10 -0
- package/dist/server/src/lib/session/agent-event-state.js +106 -1854
- package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
- package/dist/server/src/lib/session/agent-event-turn.js +811 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
- package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
- package/dist/server/src/lib/session/claude-executor.js +45 -5
- package/dist/server/src/lib/session/claude-session.js +21 -65
- package/dist/server/src/lib/session/cli-session.js +17 -0
- package/dist/server/src/lib/session/current-output-builder.js +450 -1103
- package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
- package/dist/server/src/lib/session/current-output-types.js +9 -0
- package/dist/server/src/lib/session/detection-divergence.js +55 -0
- package/dist/server/src/lib/session/global-session-constants.js +2 -13
- package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
- package/dist/server/src/lib/session/layer-disagreement.js +2 -2
- package/dist/server/src/lib/session/opencode-session-store.js +2 -1
- package/dist/server/src/lib/session/prompt-view.js +26 -3
- package/dist/server/src/lib/session/prompt-waiting-composition.js +3 -2
- package/dist/server/src/lib/session/provisional-turn.js +3 -1
- package/dist/server/src/lib/session/send-user-message.js +1 -1
- package/dist/server/src/lib/session/session-starting-state.js +4 -6
- package/dist/server/src/lib/session/status-evidence-type.js +2 -0
- package/dist/server/src/lib/session/status-evidence.js +2 -2
- package/dist/server/src/lib/session/structured-status-merge.js +335 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
- package/dist/server/src/lib/session-cleanup.js +1 -5
- package/dist/server/src/lib/skills/install-plan.js +2 -1
- package/dist/server/src/lib/skills/snapshot-store.js +2 -2
- package/dist/server/src/lib/skills/uninstall-plan.js +2 -2
- package/dist/server/src/lib/timer-manager.js +6 -8
- package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
- package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/src/lib/tmux/session-hooks.js +2 -1
- package/dist/server/src/lib/tmux/session-status-options.js +3 -3
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
- package/dist/server/src/lib/tmux/tmux.js +33 -59
- package/dist/server/src/lib/tui-accumulator.js +2 -2
- package/dist/server/src/lib/version-checker.js +6 -6
- package/dist/server/src/lib/ws-server.js +47 -11
- package/docs/en/user-guide/webapp-guide.md +27 -3
- package/package.json +1 -1
- package/release-notes/0.44.3.json +82 -0
- package/scripts/hooks/cmate-agent-event.sh +18 -0
- package/.next/server/chunks/1068.js +0 -1
- package/.next/server/chunks/4372.js +0 -5
- package/.next/server/chunks/6474.js +0 -14
- package/.next/server/chunks/967.js +0 -1
- package/.next/server/chunks/9798.js +0 -2
- package/.next/server/chunks/9882.js +0 -25
- package/.next/static/chunks/591-539fec878c9dec5e.js +0 -1
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-2a81397e60f17e63.js +0 -1
- package/.next/static/css/38070d879efa1371.css +0 -1
- package/dist/server/src/lib/cli-tools/index.js +0 -41
- package/dist/server/src/lib/polling/global-session-poller.js +0 -140
- /package/.next/static/{QlCqLjorauDDBXPa-C7TK → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
- /package/.next/static/{QlCqLjorauDDBXPa-C7TK → tWwHQzmvc-rv9KKUtDWfQ}/_ssgManifest.js +0 -0
|
@@ -57,6 +57,7 @@ const opencode_config_1 = require("./opencode-config");
|
|
|
57
57
|
const tmux_pane_config_1 = require("../../config/tmux-pane-config");
|
|
58
58
|
Object.defineProperty(exports, "OPENCODE_PANE_HEIGHT", { enumerable: true, get: function () { return tmux_pane_config_1.OPENCODE_PANE_HEIGHT; } });
|
|
59
59
|
Object.defineProperty(exports, "OPENCODE_PANE_WIDTH", { enumerable: true, get: function () { return tmux_pane_config_1.OPENCODE_PANE_WIDTH; } });
|
|
60
|
+
const opencode_pane_width_1 = require("./opencode-pane-width");
|
|
60
61
|
const child_process_1 = require("child_process");
|
|
61
62
|
const path_1 = require("path");
|
|
62
63
|
const util_1 = require("util");
|
|
@@ -76,61 +77,11 @@ const install_hints_1 = require("./install-hints");
|
|
|
76
77
|
const opencode_executable_1 = require("./opencode-executable");
|
|
77
78
|
const log_diagnosis_1 = require("../../lib/hooks/sources/opencode/log-diagnosis");
|
|
78
79
|
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
80
|
+
const errors_1 = require("../../lib/errors");
|
|
79
81
|
const logger = (0, logger_1.createLogger)('cli-tools/opencode');
|
|
80
82
|
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
81
|
-
/**
|
|
82
|
-
* Extract error message from unknown error type (DRY)
|
|
83
|
-
* Same pattern as claude-session.ts / codex.ts / gemini.ts / vibe-local.ts.
|
|
84
|
-
* A shared version exists in src/lib/errors.ts (getErrorMessage), but CLI tool
|
|
85
|
-
* modules use local copies to avoid importing the server-side error module.
|
|
86
|
-
* [D1-002] Future refactoring candidate: extract to BaseCLITool or a shared util.
|
|
87
|
-
*/
|
|
88
|
-
function getErrorMessage(error) {
|
|
89
|
-
return error instanceof Error ? error.message : String(error);
|
|
90
|
-
}
|
|
91
83
|
/** OpenCode TUI graceful exit command [D1-006] */
|
|
92
84
|
exports.OPENCODE_EXIT_COMMAND = '/exit';
|
|
93
|
-
/**
|
|
94
|
-
* {@link resolveOpencodePaneWidth}, plus the one-line operator feedback the
|
|
95
|
-
* pure config module deliberately cannot emit (Issue #2047).
|
|
96
|
-
*
|
|
97
|
-
* `tmux-pane-config.ts` has no imports at all — that is a documented property
|
|
98
|
-
* (#1906), and pulling the logger in there would make every consumer of a
|
|
99
|
-
* constant depend on the logging stack. So the resolver stays silent and the
|
|
100
|
-
* warning lives here, at the two call sites that actually resize a pane.
|
|
101
|
-
*
|
|
102
|
-
* Two things are worth telling the operator, and neither is an error:
|
|
103
|
-
*
|
|
104
|
-
* - the value was DROPPED (not an integer, or outside the accepted bounds), so
|
|
105
|
-
* the pane they are about to look at is the 80-column default rather than
|
|
106
|
-
* what they asked for;
|
|
107
|
-
* - the value was ACCEPTED but lands at or above
|
|
108
|
-
* {@link OPENCODE_SIDEBAR_MIN_WIDTH}, where opencode 1.18.22 paints its
|
|
109
|
-
* right-hand sidebar into the same rows as the transcript. #2047 measured
|
|
110
|
-
* what that does to this repo's own readers — a saved "reply" made entirely
|
|
111
|
-
* of sidebar chrome, a status flip on an aborted turn, and a false idle
|
|
112
|
-
* composer off the session title. It is still allowed, because an operator
|
|
113
|
-
* who only ever reads the pane in the browser may want it; it is not silent.
|
|
114
|
-
*
|
|
115
|
-
* @returns Pane width in columns, ready to hand to `resize-window`.
|
|
116
|
-
*/
|
|
117
|
-
function resolveOpencodePaneWidthChecked() {
|
|
118
|
-
const requested = process.env[tmux_pane_config_1.OPENCODE_PANE_WIDTH_ENV];
|
|
119
|
-
const width = (0, tmux_pane_config_1.resolveOpencodePaneWidth)();
|
|
120
|
-
if (requested !== undefined && String(width) !== requested.trim()) {
|
|
121
|
-
logger.warn('opencode-pane-width-rejected', {
|
|
122
|
-
requested,
|
|
123
|
-
applied: width,
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
else if (width >= tmux_pane_config_1.OPENCODE_SIDEBAR_MIN_WIDTH) {
|
|
127
|
-
logger.warn('opencode-pane-width-sidebar-visible', {
|
|
128
|
-
width,
|
|
129
|
-
sidebarMinWidth: tmux_pane_config_1.OPENCODE_SIDEBAR_MIN_WIDTH,
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
return width;
|
|
133
|
-
}
|
|
134
85
|
/**
|
|
135
86
|
* Interval between readiness polls while opencode paints its TUI (Issue #1908).
|
|
136
87
|
*
|
|
@@ -238,13 +189,6 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
238
189
|
async isInstalled() {
|
|
239
190
|
return (await (0, opencode_executable_1.resolveOpencodeV1Executable)()).executable !== null;
|
|
240
191
|
}
|
|
241
|
-
/**
|
|
242
|
-
* Check if OpenCode session is running for a worktree
|
|
243
|
-
*/
|
|
244
|
-
async isRunning(worktreeId, instanceId) {
|
|
245
|
-
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
246
|
-
return await (0, tmux_1.hasSession)(sessionName);
|
|
247
|
-
}
|
|
248
192
|
/**
|
|
249
193
|
* Start a new OpenCode session for a worktree
|
|
250
194
|
* Launches `opencode` TUI in interactive mode within tmux
|
|
@@ -262,6 +206,9 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
262
206
|
}
|
|
263
207
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
264
208
|
const target = (0, runtime_1.opencodeTarget)(worktreeId, instanceId);
|
|
209
|
+
// Issue #3296: resolved ONCE. The relaunch path uses it twice (reconcile and
|
|
210
|
+
// resize), and resolving at each site printed the same warn twice.
|
|
211
|
+
const paneWidth = (0, opencode_pane_width_1.resolveOpencodePaneWidthChecked)({ warnSidebar: true });
|
|
265
212
|
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
266
213
|
if (exists) {
|
|
267
214
|
// Issue #2047: the SAME width as the creation path below. These two used
|
|
@@ -270,7 +217,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
270
217
|
// a reconnect would silently hand the detectors a geometry the creation
|
|
271
218
|
// path had been moved away from.
|
|
272
219
|
await this.reconcileExistingSession(sessionName, worktreePath, {
|
|
273
|
-
windowWidth:
|
|
220
|
+
windowWidth: paneWidth,
|
|
274
221
|
windowHeight: tmux_pane_config_1.OPENCODE_PANE_HEIGHT,
|
|
275
222
|
});
|
|
276
223
|
// Issue #2070: is opencode still the thing drawing this pane? The two
|
|
@@ -295,7 +242,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
295
242
|
// the pane is the same one AND the process is the same process, so
|
|
296
243
|
// fencing here would discard a still-valid verdict on every reconnect.
|
|
297
244
|
await (0, runtime_1.resumeOpencodeEventStream)(target, worktreePath);
|
|
298
|
-
logger.info('opencode-session-
|
|
245
|
+
logger.info('opencode-session-exists');
|
|
299
246
|
return;
|
|
300
247
|
}
|
|
301
248
|
logger.warn('opencode-session-relaunch', { sessionName });
|
|
@@ -332,14 +279,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
332
279
|
// exists; the resize below still runs, because a pane that was created
|
|
333
280
|
// before #2047 carries the geometry of its own era either way.
|
|
334
281
|
if (!exists) {
|
|
335
|
-
|
|
336
|
-
// TMUX_HISTORY_LIMIT default (Issue #1624) — do not re-hardcode it here.
|
|
337
|
-
await (0, tmux_1.createSession)({
|
|
338
|
-
sessionName,
|
|
339
|
-
workingDirectory: worktreePath,
|
|
340
|
-
});
|
|
341
|
-
// Wait a moment for the session to be created
|
|
342
|
-
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_SESSION_CREATE_WAIT_MS));
|
|
282
|
+
await this.createLaunchPane(sessionName, worktreePath);
|
|
343
283
|
}
|
|
344
284
|
// Resize tmux window so opencode's right-hand sidebar stays hidden and
|
|
345
285
|
// `capture-pane` returns transcript rows only. Issue #2047 measured the
|
|
@@ -350,7 +290,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
350
290
|
await execFileAsync('tmux', [
|
|
351
291
|
// Issue #1156: exact-match target so resize never leaks to a prefix-colliding instance
|
|
352
292
|
'resize-window', '-t', (0, tmux_1.exactTarget)(sessionName),
|
|
353
|
-
'-x', String(
|
|
293
|
+
'-x', String(paneWidth), '-y', String(tmux_pane_config_1.OPENCODE_PANE_HEIGHT),
|
|
354
294
|
]);
|
|
355
295
|
}
|
|
356
296
|
catch {
|
|
@@ -419,10 +359,10 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
419
359
|
throw new Error((0, log_diagnosis_1.buildOpencodeSharedDataConflictMessage)(conflict));
|
|
420
360
|
}
|
|
421
361
|
}
|
|
422
|
-
logger.info('started-opencode-session
|
|
362
|
+
logger.info('started-opencode-session');
|
|
423
363
|
}
|
|
424
364
|
catch (error) {
|
|
425
|
-
const errorMessage = getErrorMessage(error);
|
|
365
|
+
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
426
366
|
throw new Error(`Failed to start OpenCode session: ${errorMessage}`);
|
|
427
367
|
}
|
|
428
368
|
}
|
|
@@ -625,7 +565,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
625
565
|
logger.warn('opencode-send-api-failed', {
|
|
626
566
|
worktreeId: target.worktreeId,
|
|
627
567
|
instanceId,
|
|
628
|
-
error: getErrorMessage(error),
|
|
568
|
+
error: (0, errors_1.getErrorMessage)(error),
|
|
629
569
|
});
|
|
630
570
|
return false;
|
|
631
571
|
}
|
|
@@ -676,10 +616,6 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
676
616
|
*/
|
|
677
617
|
async sendMessage(worktreeId, message, instanceId) {
|
|
678
618
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
679
|
-
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
680
|
-
if (!exists) {
|
|
681
|
-
throw new Error(`OpenCode session ${sessionName} does not exist. Start the session first.`);
|
|
682
|
-
}
|
|
683
619
|
// Issue #2070: the pane exists, but does the AGENT? An agent that quit,
|
|
684
620
|
// updated itself or crashed leaves its tmux session behind, and the send
|
|
685
621
|
// that followed used to sit in the readiness wait until it timed out —
|
|
@@ -691,7 +627,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
691
627
|
// typing the message into a shell prompt. The relaunch reserves a port and
|
|
692
628
|
// re-attaches, so the server path is available again by the time it is
|
|
693
629
|
// tried. `sendMessageWithImage` reaches this through its own fallback.
|
|
694
|
-
await this.
|
|
630
|
+
await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: true });
|
|
695
631
|
if (await this.trySendViaServer((0, runtime_1.opencodeTarget)(worktreeId, instanceId), message)) {
|
|
696
632
|
// Issue #405: the transcript grew, so the cached capture is stale — the
|
|
697
633
|
// same reason the keystroke path invalidates below.
|
|
@@ -709,10 +645,10 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
709
645
|
});
|
|
710
646
|
// Issue #405: Invalidate cache after sending message
|
|
711
647
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
712
|
-
logger.info('sent-message-to-opencode-session
|
|
648
|
+
logger.info('sent-message-to-opencode-session');
|
|
713
649
|
}
|
|
714
650
|
catch (error) {
|
|
715
|
-
const errorMessage = getErrorMessage(error);
|
|
651
|
+
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
716
652
|
throw new Error(`Failed to send message to OpenCode: ${errorMessage}`);
|
|
717
653
|
}
|
|
718
654
|
}
|
|
@@ -756,10 +692,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
756
692
|
*/
|
|
757
693
|
async sendMessageWithImage(worktreeId, message, imagePath, instanceId) {
|
|
758
694
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
759
|
-
|
|
760
|
-
if (!exists) {
|
|
761
|
-
throw new Error(`OpenCode session ${sessionName} does not exist. Start the session first.`);
|
|
762
|
-
}
|
|
695
|
+
await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: false });
|
|
763
696
|
const target = (0, runtime_1.opencodeTarget)(worktreeId, instanceId);
|
|
764
697
|
if (await this.trySendViaServer(target, message, imagePath)) {
|
|
765
698
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
@@ -869,10 +802,13 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
869
802
|
}
|
|
870
803
|
// Issue #405: Invalidate cache after session kill
|
|
871
804
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
872
|
-
|
|
805
|
+
// Logged unconditionally: after a successful `/exit` no tmux kill runs, so
|
|
806
|
+
// there is no `killed` value to test, unlike `requestExitAndKill` in
|
|
807
|
+
// base.ts (logs only when the kill returned true) (#3232).
|
|
808
|
+
logger.info('stopped-opencode-session');
|
|
873
809
|
}
|
|
874
810
|
catch (error) {
|
|
875
|
-
logger.error('session:stop-failed', { error: getErrorMessage(error) });
|
|
811
|
+
logger.error('session:stop-failed', { error: (0, errors_1.getErrorMessage)(error) });
|
|
876
812
|
throw error;
|
|
877
813
|
}
|
|
878
814
|
}
|
|
@@ -67,6 +67,18 @@
|
|
|
67
67
|
* bracketed paste, which the TUI reads as a unit), and Enter is withheld until
|
|
68
68
|
* the composer shows the whole of it ({@link classifyPasteLanded}). The
|
|
69
69
|
* measurements are in `docs/design/2464-long-body-repro-matrix.md`.
|
|
70
|
+
*
|
|
71
|
+
* Issue #3366 is the Enter arriving before the body on codex. codex 0.160.0
|
|
72
|
+
* holds fast keystrokes back as a "paste burst" and draws them only once the
|
|
73
|
+
* burst is over — measured at 200x1000: 34 characters after ~180 ms, 80 after
|
|
74
|
+
* ~380 ms, 135 after ~630 ms, 539 after ~2.2 s — and an Enter that lands inside
|
|
75
|
+
* the burst becomes a newline in the composer. The old fixed 100 ms wait pressed
|
|
76
|
+
* Enter there, and the read-back 200 ms later still saw the idle placeholder
|
|
77
|
+
* (the body had not been drawn yet), which it read as "the message left the
|
|
78
|
+
* box": `Message sent.`, with the body sitting unsent in the composer. So for
|
|
79
|
+
* codex, Enter now waits until the composer shows the typed body
|
|
80
|
+
* ({@link confirmTypedBodyLanded}); a body that never appears THROWS before
|
|
81
|
+
* Enter, as #2464 does for a paste.
|
|
70
82
|
*/
|
|
71
83
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
72
84
|
if (k2 === undefined) k2 = k;
|
|
@@ -116,6 +128,7 @@ const cli_patterns_1 = require("../detection/cli-patterns");
|
|
|
116
128
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
117
129
|
const logger_1 = require("../../lib/logger");
|
|
118
130
|
const composer_clear_1 = require("../../lib/session/composer-clear");
|
|
131
|
+
const composer_text_1 = require("../../lib/detection/composer-text");
|
|
119
132
|
const logger = (0, logger_1.createLogger)('cli-tools/submit-verified-sender');
|
|
120
133
|
/**
|
|
121
134
|
* Version-resilient pasted-text placeholder.
|
|
@@ -149,6 +162,20 @@ exports.LITERAL_SEND_MAX_BYTES = 512;
|
|
|
149
162
|
const PASTE_LANDED_POLL_MS = 100;
|
|
150
163
|
/** Composer reads before a paste that has not fully appeared is abandoned (2 s). */
|
|
151
164
|
const DEFAULT_PASTE_LANDED_ATTEMPTS = 20;
|
|
165
|
+
/**
|
|
166
|
+
* How often the composer is read while a TYPED body is expected to appear in it
|
|
167
|
+
* (Issue #3366). codex draws a burst of keystrokes all at once when the burst
|
|
168
|
+
* ends, so the poll only decides how late after that moment Enter goes in.
|
|
169
|
+
*/
|
|
170
|
+
const TYPED_BODY_POLL_MS = 50;
|
|
171
|
+
/**
|
|
172
|
+
* Composer reads before a typed body that has not appeared is abandoned (5 s).
|
|
173
|
+
*
|
|
174
|
+
* codex 0.160.0 drew a 539-character body ~2.2 s after `send-keys` — about 4 ms
|
|
175
|
+
* per character — and a typed body is at most {@link LITERAL_SEND_MAX_BYTES},
|
|
176
|
+
* so this is roughly twice the slowest draw measured, for a loaded machine.
|
|
177
|
+
*/
|
|
178
|
+
const DEFAULT_TYPED_BODY_ATTEMPTS = 100;
|
|
152
179
|
/** Per-command timeout for `load-buffer` / `paste-buffer`, as for every other tmux call. */
|
|
153
180
|
const PASTE_COMMAND_TIMEOUT_MS = 5000;
|
|
154
181
|
/** Makes each send's tmux paste buffer name unique within this process. */
|
|
@@ -384,6 +411,32 @@ function comparePasteToken(token, message) {
|
|
|
384
411
|
return 'landed';
|
|
385
412
|
return observed < Math.min(...accepted) ? 'pasting' : 'mismatch';
|
|
386
413
|
}
|
|
414
|
+
/**
|
|
415
|
+
* The composer as {@link classifySubmit} reads it (Issue #3205).
|
|
416
|
+
*
|
|
417
|
+
* {@link readComposer}'s marker reader takes the bottom-most `›` row of the
|
|
418
|
+
* tail as the input line. A codex composer holding several lines draws its
|
|
419
|
+
* continuation rows under the `›` row, and when one of them itself begins with
|
|
420
|
+
* `›` — a body quoting a dialog's `› 1. Yes, proceed (y)` — that continuation
|
|
421
|
+
* row was read as the input line: its text is not the body's first line, so a
|
|
422
|
+
* body still sitting in the composer was classified `submitted` (F). Measured:
|
|
423
|
+
* `tests/fixtures/codex-multiline-composer-3205/tc104-raw-pane.txt`.
|
|
424
|
+
*
|
|
425
|
+
* So for codex a composer of two or more rows is read with
|
|
426
|
+
* `extractComposerText` — the #1890 reader `awaitTypedBody` already uses —
|
|
427
|
+
* and its first line is the input line. Every other frame (a one-row
|
|
428
|
+
* composer, an empty or ghost one, none at all, another tool) is read exactly
|
|
429
|
+
* as before.
|
|
430
|
+
*/
|
|
431
|
+
function readSubmitComposer(output, cliToolId, reader, lines, windowLines) {
|
|
432
|
+
if (cliToolId === 'codex' && reader === 'input-line-marker') {
|
|
433
|
+
const read = (0, composer_text_1.extractComposerText)(output, cliToolId);
|
|
434
|
+
if (read.state === 'content' && read.text.includes('\n')) {
|
|
435
|
+
return { kind: 'text', text: firstNonBlankLine(read.text), rows: read.text.split('\n') };
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return readComposer(reader, lines, windowLines);
|
|
439
|
+
}
|
|
387
440
|
/**
|
|
388
441
|
* Classify a captured pane into submitted / pending / replaced (Issue #1501).
|
|
389
442
|
*
|
|
@@ -428,7 +481,7 @@ function classifySubmit(output, cliToolId, message, composerSpec = (0, composer_
|
|
|
428
481
|
if ((0, cli_patterns_1.detectThinking)(cliToolId, windowStr)) {
|
|
429
482
|
return 'submitted';
|
|
430
483
|
}
|
|
431
|
-
const composer =
|
|
484
|
+
const composer = readSubmitComposer(output, cliToolId, composerSpec.reader, lines, windowLines);
|
|
432
485
|
// B. No composer visible (scrolled off / dialog / still starting), or the
|
|
433
486
|
// composer is empty => the message left the box => submitted.
|
|
434
487
|
if (composer.kind !== 'text') {
|
|
@@ -625,6 +678,66 @@ async function confirmPasteLanded(params) {
|
|
|
625
678
|
throw new Error(`Message body did not arrive intact for session ${sessionName}: ${what}; the message is ${bytes} bytes / ${lineCount} lines. ` +
|
|
626
679
|
'Enter was not pressed, so nothing was submitted (Issue #2464).');
|
|
627
680
|
}
|
|
681
|
+
/** The text with every whitespace character removed — wrapping and indent proof. */
|
|
682
|
+
function compactText(text) {
|
|
683
|
+
return text.replace(/\s+/g, '');
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* The part of a typed body the composer reader can see (Issue #3366).
|
|
687
|
+
*
|
|
688
|
+
* The codex reader takes the composer as one run of non-blank rows, so a blank
|
|
689
|
+
* line inside the body ends what it returns: what it can show is the body up to
|
|
690
|
+
* its first blank line after the first non-blank one. Leading blank lines are
|
|
691
|
+
* kept — they are drawn as composer rows of their own and compact to nothing.
|
|
692
|
+
*/
|
|
693
|
+
function visibleTypedBody(message) {
|
|
694
|
+
const lines = message.split('\n');
|
|
695
|
+
const first = lines.findIndex((line) => line.trim() !== '');
|
|
696
|
+
if (first < 0)
|
|
697
|
+
return '';
|
|
698
|
+
const blank = lines.findIndex((line, index) => index > first && line.trim() === '');
|
|
699
|
+
return lines.slice(0, blank < 0 ? lines.length : blank).join('\n');
|
|
700
|
+
}
|
|
701
|
+
/**
|
|
702
|
+
* Wait until the composer shows the typed body; only then may Enter be pressed
|
|
703
|
+
* (Issue #3366).
|
|
704
|
+
*
|
|
705
|
+
* codex 0.160.0 keeps fast keystrokes in a "paste burst" and inserts them in
|
|
706
|
+
* one go when the burst ends, which took ~4 ms per character at 200x1000
|
|
707
|
+
* (`tests/fixtures/codex-send-burst-3366/`). Until then the composer shows its
|
|
708
|
+
* dim `Ask Codex to do anything`, and an Enter that lands in the burst becomes a
|
|
709
|
+
* newline under the body. The verdict is therefore "the composer's real (not
|
|
710
|
+
* dim) text is the body", read with `extractComposerText`, and nothing less:
|
|
711
|
+
* a prefix is not enough, because codex can draw the first keystrokes before it
|
|
712
|
+
* decides the rest are a burst.
|
|
713
|
+
*
|
|
714
|
+
* A body that never appears is taken back out and the send THROWS without
|
|
715
|
+
* Enter — nothing was submitted, so the caller must not print `Message sent.`.
|
|
716
|
+
*
|
|
717
|
+
* @throws Error when the composer does not show the body within the attempts
|
|
718
|
+
*/
|
|
719
|
+
async function confirmTypedBodyLanded(params) {
|
|
720
|
+
const { sessionName, message, cliToolId, composer, attempts } = params;
|
|
721
|
+
const expected = compactText(visibleTypedBody(message));
|
|
722
|
+
if (expected === '')
|
|
723
|
+
return;
|
|
724
|
+
let output = '';
|
|
725
|
+
for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
|
|
726
|
+
await new Promise((resolve) => setTimeout(resolve, TYPED_BODY_POLL_MS));
|
|
727
|
+
output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
|
|
728
|
+
const read = (0, composer_text_1.extractComposerText)(output, cliToolId);
|
|
729
|
+
if (read.state === 'content' && compactText(read.text) === expected)
|
|
730
|
+
return;
|
|
731
|
+
}
|
|
732
|
+
const bytes = Buffer.byteLength(message, 'utf8');
|
|
733
|
+
const shown = describeComposer(output, composer);
|
|
734
|
+
await withdrawUnsentBody(sessionName, cliToolId, composer);
|
|
735
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
736
|
+
logger.error('typed-body-not-landed', { sessionName, cliToolId, bytes, attempts, shown });
|
|
737
|
+
throw new Error(`Message body did not appear in the composer for session ${sessionName} within ` +
|
|
738
|
+
`${attempts * TYPED_BODY_POLL_MS}ms (it shows ${shown}); the message is ${bytes} bytes. ` +
|
|
739
|
+
'Enter was not pressed, so nothing was submitted (Issue #3366).');
|
|
740
|
+
}
|
|
628
741
|
/**
|
|
629
742
|
* Empty the composer before the body is typed into it (Issue #1880).
|
|
630
743
|
*
|
|
@@ -719,7 +832,7 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
|
|
|
719
832
|
* confirmed within the bounded attempts.
|
|
720
833
|
*/
|
|
721
834
|
async function sendMessageWithSubmitVerification(params) {
|
|
722
|
-
const { sessionName, message, cliToolId, composer = (0, composer_spec_1.resolveComposerSpec)(cliToolId), textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, 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, pasteLandedAttempts = DEFAULT_PASTE_LANDED_ATTEMPTS, } = params;
|
|
835
|
+
const { sessionName, message, cliToolId, composer = (0, composer_spec_1.resolveComposerSpec)(cliToolId), textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, 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, pasteLandedAttempts = DEFAULT_PASTE_LANDED_ATTEMPTS, awaitTypedBody = false, typedBodyAttempts = DEFAULT_TYPED_BODY_ATTEMPTS, } = params;
|
|
723
836
|
const submitEnterCount = params.submitEnterCount ?? composer.submitEnterCount;
|
|
724
837
|
// 0. Empty the composer first (Issue #1880). The body below is typed at the
|
|
725
838
|
// TUI's current cursor position, so anything already in the box would be
|
|
@@ -748,9 +861,19 @@ async function sendMessageWithSubmitVerification(params) {
|
|
|
748
861
|
// sent SIGINT — and a body starting with `-` was eaten by getopt and sent
|
|
749
862
|
// nowhere at all, with `rc 0`. All four measured on tmux 3.5a; the argv is
|
|
750
863
|
// built in `lib/tmux/key-sequence.ts`, which carries the table.
|
|
864
|
+
const typedAt = Date.now();
|
|
751
865
|
await (0, tmux_1.sendKeys)(sessionName, message, false, { literal: true });
|
|
752
|
-
// 2. Let the TUI register the input before pressing Enter.
|
|
753
|
-
|
|
866
|
+
// 2. Let the TUI register the input before pressing Enter. On codex that
|
|
867
|
+
// means waiting until the body is drawn (Issue #3366): an Enter pressed
|
|
868
|
+
// while codex still holds the keystrokes as a paste burst becomes a
|
|
869
|
+
// newline, and the body stays unsent. The fixed wait stays as a floor.
|
|
870
|
+
if (awaitTypedBody && composer_text_1.SUPPORTED_COMPOSER_TOOLS.has(cliToolId)) {
|
|
871
|
+
await confirmTypedBodyLanded({ sessionName, message, cliToolId, composer, attempts: typedBodyAttempts });
|
|
872
|
+
}
|
|
873
|
+
const remaining = textInputWaitMs - (Date.now() - typedAt);
|
|
874
|
+
if (remaining > 0) {
|
|
875
|
+
await new Promise((resolve) => setTimeout(resolve, remaining));
|
|
876
|
+
}
|
|
754
877
|
}
|
|
755
878
|
// 3. Submit as a separate command (double Enter for vibe-local's IME mode).
|
|
756
879
|
for (let i = 0; i < Math.max(1, submitEnterCount); i++) {
|
|
@@ -19,16 +19,10 @@ const db_instance_1 = require("../db/db-instance");
|
|
|
19
19
|
const db_1 = require("../db");
|
|
20
20
|
const logger_1 = require("../../lib/logger");
|
|
21
21
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
22
|
-
const install_hints_1 = require("./install-hints");
|
|
23
22
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
24
23
|
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
24
|
+
const errors_1 = require("../../lib/errors");
|
|
25
25
|
const logger = (0, logger_1.createLogger)('cli-tools/vibe-local');
|
|
26
|
-
/**
|
|
27
|
-
* Extract error message from unknown error type (DRY)
|
|
28
|
-
*/
|
|
29
|
-
function getErrorMessage(error) {
|
|
30
|
-
return error instanceof Error ? error.message : String(error);
|
|
31
|
-
}
|
|
32
26
|
/**
|
|
33
27
|
* Wait for vibe-local to initialize after launch.
|
|
34
28
|
* vibe-local shows a permission check prompt, banner, and model loading.
|
|
@@ -42,13 +36,6 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
42
36
|
id = 'vibe-local';
|
|
43
37
|
name = 'Vibe Local';
|
|
44
38
|
command = 'vibe-local';
|
|
45
|
-
/**
|
|
46
|
-
* Check if vibe-local session is running for a worktree
|
|
47
|
-
*/
|
|
48
|
-
async isRunning(worktreeId, instanceId) {
|
|
49
|
-
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
50
|
-
return await (0, tmux_1.hasSession)(sessionName);
|
|
51
|
-
}
|
|
52
39
|
/**
|
|
53
40
|
* Start a new vibe-local session for a worktree
|
|
54
41
|
* Launches `vibe-local -y` in interactive mode within tmux
|
|
@@ -57,26 +44,14 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
57
44
|
* @param worktreePath - Worktree path
|
|
58
45
|
*/
|
|
59
46
|
async launchSession(worktreeId, worktreePath, instanceId) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (
|
|
67
|
-
|
|
68
|
-
// Issue #2070: this branch used to return unconditionally. A tmux session
|
|
69
|
-
// outlives the agent that was launched into it — a quit, a self-update, a
|
|
70
|
-
// crash — and the launch was then skipped for a pane holding nothing but a
|
|
71
|
-
// shell prompt, which left `kill-session` by hand as the only recovery.
|
|
72
|
-
// When the tool is gone we fall THROUGH and re-send the launch command
|
|
73
|
-
// into the same pane.
|
|
74
|
-
if (await this.isToolLive(sessionName, { confirm: true })) {
|
|
75
|
-
logger.info('vibe-local-session');
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
logger.warn('vibe-local-session-relaunch', { sessionName });
|
|
79
|
-
}
|
|
47
|
+
await this.requireInstalled();
|
|
48
|
+
const { sessionName, exists, live } = await this.resolveLaunchPane(worktreeId, worktreePath, instanceId, {
|
|
49
|
+
logger,
|
|
50
|
+
liveAction: 'vibe-local-session-exists',
|
|
51
|
+
relaunchAction: 'vibe-local-session-relaunch',
|
|
52
|
+
});
|
|
53
|
+
if (live)
|
|
54
|
+
return;
|
|
80
55
|
// Issue #1759 / #2444: the one line every tool's creation path owes the
|
|
81
56
|
// rest of the system. vibe-local emits no structured events, so the
|
|
82
57
|
// generation fence itself is inert here — but `beginAgentSession` is also
|
|
@@ -91,14 +66,7 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
91
66
|
// exists and holds the transcript of the process that died in it; the
|
|
92
67
|
// launch command is re-sent into that same pane.
|
|
93
68
|
if (!exists) {
|
|
94
|
-
|
|
95
|
-
// TMUX_HISTORY_LIMIT default (Issue #1624) — do not re-hardcode it here.
|
|
96
|
-
await (0, tmux_1.createSession)({
|
|
97
|
-
sessionName,
|
|
98
|
-
workingDirectory: worktreePath,
|
|
99
|
-
});
|
|
100
|
-
// Wait a moment for the session to be created
|
|
101
|
-
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_SESSION_CREATE_WAIT_MS));
|
|
69
|
+
await this.createLaunchPane(sessionName, worktreePath);
|
|
102
70
|
}
|
|
103
71
|
// Read Ollama model and context window preferences from DB
|
|
104
72
|
// [SEC-001] Re-validate model name at point of use (defense-in-depth)
|
|
@@ -127,10 +95,10 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
127
95
|
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(vibeLocalCommand), true);
|
|
128
96
|
// Wait for vibe-local to initialize (banner + model loading)
|
|
129
97
|
await new Promise((resolve) => setTimeout(resolve, VIBE_LOCAL_INIT_WAIT_MS));
|
|
130
|
-
logger.info('started-vibe-local-session
|
|
98
|
+
logger.info('started-vibe-local-session');
|
|
131
99
|
}
|
|
132
100
|
catch (error) {
|
|
133
|
-
const errorMessage = getErrorMessage(error);
|
|
101
|
+
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
134
102
|
throw new Error(`Failed to start Vibe Local session: ${errorMessage}`);
|
|
135
103
|
}
|
|
136
104
|
}
|
|
@@ -142,16 +110,12 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
142
110
|
*/
|
|
143
111
|
async sendMessage(worktreeId, message, instanceId) {
|
|
144
112
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
145
|
-
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
146
|
-
if (!exists) {
|
|
147
|
-
throw new Error(`Vibe Local session ${sessionName} does not exist. Start the session first.`);
|
|
148
|
-
}
|
|
149
113
|
// Issue #2070: the pane exists, but does the AGENT? An agent that quit,
|
|
150
114
|
// updated itself or crashed leaves its tmux session behind, and the send
|
|
151
115
|
// that followed used to sit in the readiness wait until it timed out —
|
|
152
116
|
// leaving `kill-session` by hand as the only recovery. Relaunches into the
|
|
153
117
|
// same pane when the tool is gone; costs one `capture-pane` when it is not.
|
|
154
|
-
await this.
|
|
118
|
+
await this.requireSession('Vibe Local', worktreeId, instanceId, { relaunch: true });
|
|
155
119
|
try {
|
|
156
120
|
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
157
121
|
// shared helper. vibe-local's IME mode needs TWO Enter presses (first Enter
|
|
@@ -169,10 +133,10 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
169
133
|
});
|
|
170
134
|
// Issue #405: Invalidate cache after sending message
|
|
171
135
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
172
|
-
logger.info('sent-message-to-vibe-local-session
|
|
136
|
+
logger.info('sent-message-to-vibe-local-session');
|
|
173
137
|
}
|
|
174
138
|
catch (error) {
|
|
175
|
-
const errorMessage = getErrorMessage(error);
|
|
139
|
+
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
176
140
|
throw new Error(`Failed to send message to Vibe Local: ${errorMessage}`);
|
|
177
141
|
}
|
|
178
142
|
}
|
|
@@ -182,27 +146,18 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
182
146
|
* @param worktreeId - Worktree ID
|
|
183
147
|
*/
|
|
184
148
|
async killSession(worktreeId, instanceId) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
149
|
+
await this.requestExitAndKill(worktreeId, instanceId, {
|
|
150
|
+
logger,
|
|
151
|
+
stoppedAction: 'stopped-vibe-local-session',
|
|
152
|
+
requestExit: async (sessionName) => {
|
|
189
153
|
// Send Ctrl+C to interrupt any running operation
|
|
190
154
|
await (0, tmux_1.sendSpecialKey)(sessionName, 'C-c');
|
|
191
155
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_INTERRUPT_SETTLE_MS));
|
|
192
156
|
// Send Ctrl+C again to ensure exit
|
|
193
157
|
await (0, tmux_1.sendSpecialKey)(sessionName, 'C-c');
|
|
194
158
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_EXIT_WAIT_MS));
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
const killed = await (0, tmux_1.killSession)(sessionName);
|
|
198
|
-
if (killed) {
|
|
199
|
-
logger.info('stopped-vibe-local-session:sessionname');
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
catch (error) {
|
|
203
|
-
logger.error('session:stop-failed', { error: getErrorMessage(error) });
|
|
204
|
-
throw error;
|
|
205
|
-
}
|
|
159
|
+
},
|
|
160
|
+
});
|
|
206
161
|
}
|
|
207
162
|
}
|
|
208
163
|
exports.VibeLocalTool = VibeLocalTool;
|