commandmate 0.44.0 → 0.44.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +348 -352
- package/.next/app-path-routes-manifest.json +40 -40
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- 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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route.js +2 -2
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_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_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +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_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.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 +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.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_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_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 +9 -9
- 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 +40 -40
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6474.js +3 -3
- package/.next/server/chunks/650.js +1 -1
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +2 -2
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +2 -2
- 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/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-340774f1a24f2b45.js → 2407-f1f258d4a1d92620.js} +1 -1
- package/.next/static/chunks/344-e1cefd00787060e4.js +1 -0
- package/.next/static/chunks/3922.f45dcfc1e7da552a.js +1 -0
- package/.next/static/chunks/591-308072f285c34787.js +1 -0
- package/.next/static/chunks/6654-ac431270fac1a283.js +1 -0
- package/.next/static/chunks/{9619-84aced0846cbe3ac.js → 9619-6c17a271f7f98fbb.js} +1 -1
- package/.next/static/chunks/998-2eb5883186abd0bd.js +1 -0
- package/.next/static/chunks/app/layout-da66300cc20244ed.js +1 -0
- package/.next/static/chunks/app/more/{page-30057cf1e0762ad2.js → page-87c84987b2765213.js} +1 -1
- package/.next/static/chunks/app/{page-8483ba400af011f5.js → page-1b820c421db48c2c.js} +1 -1
- package/.next/static/chunks/app/review/page-95f749caae382f46.js +1 -0
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-040c5f0f585e6812.js +1 -0
- package/.next/static/chunks/{webpack-49ade0526854dd4e.js → webpack-021f0741f22dd16a.js} +1 -1
- package/.next/trace +13 -13
- package/README.md +72 -25
- package/dist/cli/commands/remote.d.ts +10 -0
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +17 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +11 -0
- package/dist/cli/docs/setup-guide.d.ts +1 -1
- package/dist/cli/docs/setup-guide.d.ts.map +1 -1
- package/dist/cli/docs/setup-guide.js +2 -0
- package/dist/cli/types/api-responses.d.ts +10 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.d.ts +17 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +17 -0
- package/dist/server/locales/en/worktree.json +13 -1
- package/dist/server/locales/ja/worktree.json +13 -1
- package/dist/server/src/config/session-starting-config.js +75 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +2 -1
- package/dist/server/src/lib/cli-tools/base.js +15 -1
- package/dist/server/src/lib/cli-tools/codex.js +3 -2
- package/dist/server/src/lib/cli-tools/command-code.js +3 -2
- package/dist/server/src/lib/cli-tools/copilot.js +2 -1
- package/dist/server/src/lib/cli-tools/gemini.js +2 -1
- package/dist/server/src/lib/cli-tools/liveness-spec.js +27 -9
- package/dist/server/src/lib/cli-tools/opencode-v2.js +2 -1
- package/dist/server/src/lib/cli-tools/opencode.js +2 -1
- package/dist/server/src/lib/cli-tools/vibe-local.js +2 -1
- package/dist/server/src/lib/detection/status-reason.js +17 -0
- package/dist/server/src/lib/detection/tool-liveness.js +3 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +5 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -0
- package/dist/server/src/lib/session/claude-session.js +7 -1
- package/dist/server/src/lib/session/current-output-builder.js +49 -21
- package/dist/server/src/lib/session/launch-screen.js +57 -0
- package/dist/server/src/lib/session/session-starting-state.js +236 -0
- package/package.json +1 -1
- package/release-notes/0.44.1.json +54 -0
- package/.next/static/chunks/344-6f9fc1f38f01a839.js +0 -1
- package/.next/static/chunks/3922.8e79fc89f593280b.js +0 -1
- package/.next/static/chunks/5449-6cb80bab2bd06b79.js +0 -1
- package/.next/static/chunks/591-0a45801e83f26f24.js +0 -1
- package/.next/static/chunks/6966-bb854d1145783a64.js +0 -1
- package/.next/static/chunks/app/layout-0fc249fb7de75a27.js +0 -1
- package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +0 -1
- package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +0 -1
- /package/.next/static/{wu7SUiHTirFcrpo5teyZ3 → 57lOiz8zSEHdw97XIm0af}/_buildManifest.js +0 -0
- /package/.next/static/{wu7SUiHTirFcrpo5teyZ3 → 57lOiz8zSEHdw97XIm0af}/_ssgManifest.js +0 -0
|
@@ -115,6 +115,23 @@ exports.STATUS_REASON = {
|
|
|
115
115
|
OPENCODE_RESPONSE_COMPLETE: 'opencode_response_complete',
|
|
116
116
|
INPUT_PROMPT: 'input_prompt',
|
|
117
117
|
NO_RECENT_OUTPUT: 'no_recent_output',
|
|
118
|
+
/**
|
|
119
|
+
* Issue #3179: the agent's launch is still in progress.
|
|
120
|
+
*
|
|
121
|
+
* Published by `current-output-builder` and `worktree-status-helper` while
|
|
122
|
+
* `lib/session/session-starting-state` holds a record for the instance — from
|
|
123
|
+
* `beginAgentSession` until `startSession` returns or throws, bounded by the
|
|
124
|
+
* tool's readiness wait and released early by a dialog the launch does not
|
|
125
|
+
* answer. The frame underneath (a shell prompt and the launch line, or a trust
|
|
126
|
+
* dialog the launch is about to answer) is not read while it is up: the status
|
|
127
|
+
* is `running`, and `isUnclassifiedActive` / `isSelectionListActive` /
|
|
128
|
+
* `isPromptWaiting` are all false, so no pad, no answer sheet and no `wait`
|
|
129
|
+
* exit 10 is raised for a screen nobody has to drive.
|
|
130
|
+
*
|
|
131
|
+
* ADDITIVE in the sense {@link STATUS_REASON.EXITED} is: a reader that does not
|
|
132
|
+
* know the token sees a `running` session.
|
|
133
|
+
*/
|
|
134
|
+
STARTING: 'starting',
|
|
118
135
|
/**
|
|
119
136
|
* Issue #2070: the tmux session is there, and the TOOL is not.
|
|
120
137
|
*
|
|
@@ -410,7 +410,12 @@
|
|
|
410
410
|
"stats": "Show usage statistics",
|
|
411
411
|
"thinking": "Switch the model variant",
|
|
412
412
|
"web": "Pair another device with this OpenCode",
|
|
413
|
-
"worktrees": "Manage workspaces"
|
|
413
|
+
"worktrees": "Manage workspaces",
|
|
414
|
+
"artifact-capabilities": "Load the reference for what a published artifact can use, such as connectors and file downloads",
|
|
415
|
+
"artifact-diagramming": "Load guidance for drawing diagrams in artifacts that stay legible in light and dark themes",
|
|
416
|
+
"claude-in-chrome": "Have Claude carry out a task in your browser through Claude in Chrome",
|
|
417
|
+
"plugin-authoring": "Load the reference Claude uses to write a mod",
|
|
418
|
+
"slides": "Make a new Claude Slides presentation from your brief"
|
|
414
419
|
}
|
|
415
420
|
},
|
|
416
421
|
"session": {
|
|
@@ -556,6 +561,13 @@
|
|
|
556
561
|
"dialogCardLabel": "Terminal screen",
|
|
557
562
|
"unreadableHint": "Answer with the number shown on screen (1-9) or y/n. Enter confirms whatever the CLI has highlighted."
|
|
558
563
|
},
|
|
564
|
+
"sessionStarting": {
|
|
565
|
+
"title": "Starting {agent}…",
|
|
566
|
+
"titleWithElapsed": "Starting {agent}… {elapsed}",
|
|
567
|
+
"hint": "The terminal will appear once the agent is ready.",
|
|
568
|
+
"showTerminal": "Show terminal",
|
|
569
|
+
"label": "Agent starting"
|
|
570
|
+
},
|
|
559
571
|
"chatTranscript": {
|
|
560
572
|
"regionLabel": "Chat transcript",
|
|
561
573
|
"loading": "Loading messages",
|
|
@@ -410,7 +410,12 @@
|
|
|
410
410
|
"stats": "使用量の統計を表示",
|
|
411
411
|
"thinking": "モデルのバリアントを切り替え",
|
|
412
412
|
"web": "この OpenCode に別のデバイスをペアリング",
|
|
413
|
-
"worktrees": "ワークスペースを管理"
|
|
413
|
+
"worktrees": "ワークスペースを管理",
|
|
414
|
+
"artifact-capabilities": "公開アーティファクトで使える機能(コネクタ・ファイルのダウンロードなど)のリファレンスを読み込み",
|
|
415
|
+
"artifact-diagramming": "アーティファクトにライト・ダーク両方で読める図を描くためのガイダンスを読み込み",
|
|
416
|
+
"claude-in-chrome": "Claude in Chrome 経由でブラウザ上の作業を Claude に依頼",
|
|
417
|
+
"plugin-authoring": "mod を書くときに Claude が使うリファレンスを読み込み",
|
|
418
|
+
"slides": "指示から Claude Slides のプレゼンテーションを作成"
|
|
414
419
|
}
|
|
415
420
|
},
|
|
416
421
|
"session": {
|
|
@@ -556,6 +561,13 @@
|
|
|
556
561
|
"dialogCardLabel": "ターミナルの画面",
|
|
557
562
|
"unreadableHint": "画面に出ている番号(1〜9)か y/n で答えてください。Enter は選択中の項目をそのまま確定します。"
|
|
558
563
|
},
|
|
564
|
+
"sessionStarting": {
|
|
565
|
+
"title": "{agent} を起動中…",
|
|
566
|
+
"titleWithElapsed": "{agent} を起動中… {elapsed}",
|
|
567
|
+
"hint": "起動が終わるとターミナルを表示します。",
|
|
568
|
+
"showTerminal": "ターミナルを見る",
|
|
569
|
+
"label": "エージェントの起動中"
|
|
570
|
+
},
|
|
559
571
|
"chatTranscript": {
|
|
560
572
|
"regionLabel": "チャット履歴",
|
|
561
573
|
"loading": "メッセージを読み込み中",
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* How long a session may be shown as "starting" (Issue #3179).
|
|
4
|
+
*
|
|
5
|
+
* `lib/session/session-starting-state` records when an agent's launch began and
|
|
6
|
+
* clears the record when `BaseCLITool.startSession` returns or throws. These
|
|
7
|
+
* bounds are the escape hatches for the launches that do neither in time:
|
|
8
|
+
* several tools (antigravity, codex, gemini, copilot, Command Code) only LOG
|
|
9
|
+
* when their readiness wait runs out and carry on, so a launch that never
|
|
10
|
+
* became ready would otherwise be shown as starting for as long as the request
|
|
11
|
+
* lingered. Past the bound the screen falls back to what it showed before
|
|
12
|
+
* #3179 — the raw pane — so a human notices the stuck start.
|
|
13
|
+
*
|
|
14
|
+
* @module config/session-starting-config
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.SESSION_STARTING_ELAPSED_THRESHOLD_MS = exports.SESSION_STARTING_PROMPT_GRACE_MS = exports.SESSION_STARTING_DEFAULT_WAIT_MS = exports.SESSION_STARTING_GRACE_MS = void 0;
|
|
18
|
+
exports.getSessionStartingMaxMs = getSessionStartingMaxMs;
|
|
19
|
+
exports.getSessionStartingMaxMsAcrossTools = getSessionStartingMaxMsAcrossTools;
|
|
20
|
+
const types_1 = require("../lib/cli-tools/types");
|
|
21
|
+
/**
|
|
22
|
+
* Slack added on top of a tool's own readiness wait, so the starting display
|
|
23
|
+
* outlives the wait it describes by a little rather than ending a beat before
|
|
24
|
+
* the launch reports.
|
|
25
|
+
*/
|
|
26
|
+
exports.SESSION_STARTING_GRACE_MS = 5_000;
|
|
27
|
+
/**
|
|
28
|
+
* The default readiness wait a launch performs (antigravity / codex / gemini /
|
|
29
|
+
* copilot / opencode / Command Code are all measured at about 30 s, counting
|
|
30
|
+
* their initial settle delay and their prompt wait).
|
|
31
|
+
*/
|
|
32
|
+
exports.SESSION_STARTING_DEFAULT_WAIT_MS = 30_000;
|
|
33
|
+
/**
|
|
34
|
+
* Per-tool readiness waits that differ from the default. Claude waits for its
|
|
35
|
+
* composer for up to `CLAUDE_INIT_TIMEOUT` (60 s); the literal is restated here
|
|
36
|
+
* rather than imported so this config module stays free of the session graph.
|
|
37
|
+
*/
|
|
38
|
+
const SESSION_STARTING_WAIT_MS = {
|
|
39
|
+
claude: 60_000,
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* The longest a launch of `cliToolId` is shown as starting, in ms.
|
|
43
|
+
*
|
|
44
|
+
* @param cliToolId - The tool being launched
|
|
45
|
+
* @returns Its readiness wait plus {@link SESSION_STARTING_GRACE_MS}
|
|
46
|
+
*/
|
|
47
|
+
function getSessionStartingMaxMs(cliToolId) {
|
|
48
|
+
return (SESSION_STARTING_WAIT_MS[cliToolId] ?? exports.SESSION_STARTING_DEFAULT_WAIT_MS)
|
|
49
|
+
+ exports.SESSION_STARTING_GRACE_MS;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The longest {@link getSessionStartingMaxMs} over every tool, in ms.
|
|
53
|
+
*
|
|
54
|
+
* A send to a worktree with no session launches the agent inside the request,
|
|
55
|
+
* so the client must wait at least this long (Issue #3194).
|
|
56
|
+
*/
|
|
57
|
+
function getSessionStartingMaxMsAcrossTools() {
|
|
58
|
+
return Math.max(...types_1.CLI_TOOL_IDS.map(getSessionStartingMaxMs));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* How long a dialog may stay on screen during a launch before it is treated as
|
|
62
|
+
* one the server will NOT answer (a login, an unknown dialog) and the starting
|
|
63
|
+
* display gives way to the raw pane.
|
|
64
|
+
*
|
|
65
|
+
* The dialogs the launch answers itself — the folder-trust screens of
|
|
66
|
+
* antigravity / codex / copilot / claude — are answered within one poll of the
|
|
67
|
+
* launch's readiness loop (≤ 1 s) plus the settle wait after the key, so they
|
|
68
|
+
* never reach this bound.
|
|
69
|
+
*/
|
|
70
|
+
exports.SESSION_STARTING_PROMPT_GRACE_MS = 5_000;
|
|
71
|
+
/**
|
|
72
|
+
* After how long the client starts printing the elapsed time next to
|
|
73
|
+
* "<agent> を起動中…".
|
|
74
|
+
*/
|
|
75
|
+
exports.SESSION_STARTING_ELAPSED_THRESHOLD_MS = 5_000;
|
|
@@ -26,6 +26,7 @@ const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifec
|
|
|
26
26
|
const logger_1 = require("../../lib/logger");
|
|
27
27
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
28
28
|
const install_hints_1 = require("./install-hints");
|
|
29
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
29
30
|
const logger = (0, logger_1.createLogger)('cli-tools/antigravity');
|
|
30
31
|
/**
|
|
31
32
|
* Extract error message from unknown error type (DRY).
|
|
@@ -254,7 +255,7 @@ class AntigravityTool extends base_1.BaseCLITool {
|
|
|
254
255
|
worktreePath,
|
|
255
256
|
});
|
|
256
257
|
const launchCommand = model ? `${base} --model ${shellSingleQuote(model)}` : base;
|
|
257
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
258
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
258
259
|
// Wait for agy to initialize
|
|
259
260
|
await new Promise((resolve) => setTimeout(resolve, ANTIGRAVITY_INIT_WAIT_MS));
|
|
260
261
|
// Poll until the interactive prompt is ready (handles the trust dialog)
|
|
@@ -28,6 +28,7 @@ const logger_1 = require("../logger");
|
|
|
28
28
|
const terminal_keys_1 = require("../../types/terminal-keys");
|
|
29
29
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
30
30
|
const tmux_pane_config_1 = require("../../config/tmux-pane-config");
|
|
31
|
+
const session_starting_state_1 = require("../session/session-starting-state");
|
|
31
32
|
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
32
33
|
const logger = (0, logger_1.createLogger)('cli-tools/base');
|
|
33
34
|
/**
|
|
@@ -213,8 +214,12 @@ class BaseCLITool {
|
|
|
213
214
|
* @throws Whatever {@link launchSession} threw — unchanged, after reporting
|
|
214
215
|
*/
|
|
215
216
|
async startSession(worktreeId, worktreePath, instanceId, model) {
|
|
217
|
+
// Issue #3195: this launch's "starting" record is written under this token
|
|
218
|
+
// (see `session-starting-state`), so the `finally` below clears this
|
|
219
|
+
// launch's record and never a later launch's of the same instance.
|
|
220
|
+
const startingToken = (0, session_starting_state_1.issueSessionStartingToken)();
|
|
216
221
|
try {
|
|
217
|
-
await this.launchSession(worktreeId, worktreePath, instanceId, model);
|
|
222
|
+
await (0, session_starting_state_1.runWithSessionStartingToken)(startingToken, () => this.launchSession(worktreeId, worktreePath, instanceId, model));
|
|
218
223
|
}
|
|
219
224
|
catch (error) {
|
|
220
225
|
// Issue #2429: a launch that threw is reported as a failed start and as
|
|
@@ -229,6 +234,15 @@ class BaseCLITool {
|
|
|
229
234
|
}, error);
|
|
230
235
|
throw error;
|
|
231
236
|
}
|
|
237
|
+
finally {
|
|
238
|
+
// Issue #3179: the launch is over, returned or thrown, so the screen
|
|
239
|
+
// stops showing it as starting. `beginAgentSession` wrote the record on
|
|
240
|
+
// the creation path; a reused pane never had one, and this is a no-op for
|
|
241
|
+
// it. `relaunchIfToolExited` comes through here too. Issue #3195: only
|
|
242
|
+
// under this launch's token — a launch killed and started again has a
|
|
243
|
+
// newer record under this key, and it is not this launch's to end.
|
|
244
|
+
(0, session_starting_state_1.clearSessionStarting)(worktreeId, this.id, instanceId, startingToken);
|
|
245
|
+
}
|
|
232
246
|
const adopted = this.takeAdoptionMark(worktreeId, instanceId);
|
|
233
247
|
if (adopted !== null)
|
|
234
248
|
await this.warnIfHookUrlIsStale(worktreeId, adopted, instanceId);
|
|
@@ -20,6 +20,7 @@ const hooks_config_1 = require("../../lib/hooks/sources/codex/hooks-config");
|
|
|
20
20
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
21
21
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
22
22
|
const install_hints_1 = require("./install-hints");
|
|
23
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
23
24
|
const logger = (0, logger_1.createLogger)('cli-tools/codex');
|
|
24
25
|
/**
|
|
25
26
|
* Extract error message from unknown error type (DRY)
|
|
@@ -268,11 +269,11 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
268
269
|
// as the new one's.
|
|
269
270
|
const relaunchIntoSamePane = async () => {
|
|
270
271
|
(0, agent_session_lifecycle_1.beginAgentSession)({ worktreeId, cliToolId: sources_1.CODEX_CLI_TOOL_ID, instanceId });
|
|
271
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
272
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
272
273
|
await new Promise((resolve) => setTimeout(resolve, CODEX_INIT_WAIT_MS));
|
|
273
274
|
};
|
|
274
275
|
// Start Codex CLI in interactive mode
|
|
275
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
276
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
276
277
|
// Wait for Codex to initialize
|
|
277
278
|
await new Promise((resolve) => setTimeout(resolve, CODEX_INIT_WAIT_MS));
|
|
278
279
|
// Poll until Codex interactive prompt is ready
|
|
@@ -53,6 +53,7 @@ const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
|
53
53
|
const install_hints_1 = require("./install-hints");
|
|
54
54
|
const plan_review_state_1 = require("../detection/tools/command-code/plan-review-state");
|
|
55
55
|
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
56
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
56
57
|
const logger = (0, logger_1.createLogger)('cli-tools/command-code');
|
|
57
58
|
/** The executable CommandMate launches. See the module docblock for why not `cmd`. */
|
|
58
59
|
exports.COMMAND_CODE_COMMAND = 'commandcode';
|
|
@@ -258,11 +259,11 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
258
259
|
});
|
|
259
260
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_SESSION_CREATE_WAIT_MS));
|
|
260
261
|
}
|
|
261
|
-
await (0, tmux_1.sendKeys)(sessionName, buildCommandCodeLaunchCommand({
|
|
262
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(buildCommandCodeLaunchCommand({
|
|
262
263
|
target: { worktreeId, cliToolId: tool_id_1.COMMAND_CODE_CLI_TOOL_ID, instanceId },
|
|
263
264
|
executablePath: this.command,
|
|
264
265
|
worktreePath,
|
|
265
|
-
}), true);
|
|
266
|
+
})), true);
|
|
266
267
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.COMMAND_CODE_INIT_WAIT_MS));
|
|
267
268
|
await this.waitForReady(sessionName);
|
|
268
269
|
logger.info('started-command-code-session');
|
|
@@ -35,6 +35,7 @@ const tool_id_1 = require("../../lib/hooks/sources/copilot/tool-id");
|
|
|
35
35
|
const errors_1 = require("../../lib/errors");
|
|
36
36
|
const logger_1 = require("../../lib/logger");
|
|
37
37
|
const install_hints_1 = require("./install-hints");
|
|
38
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
38
39
|
const logger = (0, logger_1.createLogger)('cli-tools/copilot');
|
|
39
40
|
/** Interval for polling prompt detection */
|
|
40
41
|
const COPILOT_POLL_INTERVAL_MS = 1000;
|
|
@@ -369,7 +370,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
369
370
|
worktreePath,
|
|
370
371
|
});
|
|
371
372
|
// Start Copilot CLI in interactive mode
|
|
372
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
373
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
373
374
|
// Issue #1907: no blind sleep before this. The 4-second one that used to
|
|
374
375
|
// sit here was a guess at how long copilot takes to paint (measured on
|
|
375
376
|
// 1.0.80: banner at ~1.3 s, folder-trust dialog at ~2.5 s), and it was
|
|
@@ -22,6 +22,7 @@ const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifec
|
|
|
22
22
|
const logger_1 = require("../../lib/logger");
|
|
23
23
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
24
24
|
const install_hints_1 = require("./install-hints");
|
|
25
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
25
26
|
const logger = (0, logger_1.createLogger)('cli-tools/gemini');
|
|
26
27
|
/**
|
|
27
28
|
* Extract error message from unknown error type (DRY)
|
|
@@ -128,7 +129,7 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
128
129
|
executablePath: this.command,
|
|
129
130
|
worktreePath,
|
|
130
131
|
});
|
|
131
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
132
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
132
133
|
// Wait for Gemini to initialize (minimum wait for banner/auth)
|
|
133
134
|
await new Promise((resolve) => setTimeout(resolve, GEMINI_INIT_WAIT_MS));
|
|
134
135
|
// Poll until Gemini interactive prompt is ready
|
|
@@ -90,22 +90,40 @@ const ADDED_TOOL_DEFAULTS = {
|
|
|
90
90
|
*/
|
|
91
91
|
const LIVENESS_SPECS = {
|
|
92
92
|
/**
|
|
93
|
-
* claude's is `isSessionHealthy`,
|
|
93
|
+
* claude's is `isSessionHealthy`, expressed as a declaration.
|
|
94
94
|
*
|
|
95
|
-
*
|
|
96
|
-
* null` (the check has always tested the whole frame)
|
|
97
|
-
* []` (the length gate and the endings are the whole rule), and
|
|
95
|
+
* Two fields carry that history and are claude's alone: `aliveTailLines:
|
|
96
|
+
* null` (the check has always tested the whole frame) and
|
|
98
97
|
* `unreadableIsExited: true` (an empty pane and a capture that threw have
|
|
99
|
-
* both meant "unhealthy" since it was written).
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
98
|
+
* both meant "unhealthy" since it was written). Neither is "improved" here.
|
|
99
|
+
*
|
|
100
|
+
* `shellPromptPatterns` is NOT claude's alone any more (Issue #3191). #2070
|
|
101
|
+
* left it `[]` so claude's verdicts would not move, which kept claude on the
|
|
102
|
+
* length-gated endings rule — and that rule cannot see a prompt of 40
|
|
103
|
+
* characters or more. Measured 2026-10-04: after `/exit` the pane fell back
|
|
104
|
+
* to `maenokota@MAENOnoMac-Studio uat-repo-wt2 %` (42 characters) and the
|
|
105
|
+
* session stayed `running`, so the next send sat in `waitForPrompt` until
|
|
106
|
+
* `Prompt detection timeout (10000ms)`; the author's everyday prompt
|
|
107
|
+
* (`… MyCodeBranchDesk %`, 46) is past the gate too.
|
|
108
|
+
*
|
|
109
|
+
* The positive `user@host …` forms are therefore claude's as well. What made
|
|
110
|
+
* that safe to adopt unnarrowed: every row of every claude screen fixture in
|
|
111
|
+
* the repository (`tests/fixtures/claude-*`, `tests/unit/detection/tools/
|
|
112
|
+
* claude/fixtures/`, the #2070 frames — composer, transcript, dialogs,
|
|
113
|
+
* pickers, banners) was swept against both patterns and NONE matched, not
|
|
114
|
+
* just none on the bottom row; `tool-liveness-3191.test.ts` keeps that
|
|
115
|
+
* sweep. The whole-frame `CLAUDE_PROMPT_PATTERN` check still runs first, so
|
|
116
|
+
* a pane with claude's composer anywhere on it stays alive regardless. Below
|
|
117
|
+
* the 40-character gate the verdicts are unchanged — a pattern match there
|
|
118
|
+
* already ended in `$` / `%` / `#` — only the reason reads `shell prompt
|
|
119
|
+
* detected` instead of `shell prompt ending detected` for a `user@host:…`
|
|
120
|
+
* row.
|
|
103
121
|
*/
|
|
104
122
|
claude: {
|
|
105
123
|
...SHARED,
|
|
106
124
|
alivePatterns: [cli_patterns_1.CLAUDE_PROMPT_PATTERN],
|
|
107
125
|
aliveTailLines: null,
|
|
108
|
-
shellPromptPatterns:
|
|
126
|
+
shellPromptPatterns: tool_liveness_1.SHELL_PROMPT_LINE_PATTERNS,
|
|
109
127
|
unreadableIsExited: true,
|
|
110
128
|
fatalPatterns: cli_patterns_1.CLAUDE_SESSION_ERROR_PATTERNS,
|
|
111
129
|
fatalRegexPatterns: cli_patterns_1.CLAUDE_SESSION_ERROR_REGEX_PATTERNS,
|
|
@@ -57,6 +57,7 @@ const graceful_exit_1 = require("./graceful-exit");
|
|
|
57
57
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
58
58
|
const install_hints_1 = require("./install-hints");
|
|
59
59
|
const opencode_executable_1 = require("./opencode-executable");
|
|
60
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
60
61
|
const logger = (0, logger_1.createLogger)('cli-tools/opencode-v2');
|
|
61
62
|
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
62
63
|
/** Interval between composer polls (launch and send). */
|
|
@@ -232,7 +233,7 @@ class OpenCodeV2Tool extends base_1.BaseCLITool {
|
|
|
232
233
|
if (port === null) {
|
|
233
234
|
logger.warn('opencode-v2-launch-without-server', { worktreeId, instanceId });
|
|
234
235
|
}
|
|
235
|
-
await (0, tmux_1.sendKeys)(sessionName, (0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({ target, executablePath: executable.path, worktreePath }), true);
|
|
236
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)((0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({ target, executablePath: executable.path, worktreePath })), true);
|
|
236
237
|
await this.waitForReady(sessionName);
|
|
237
238
|
await (0, runtime_1.attachOpencodeV2EventStream)(target);
|
|
238
239
|
logger.info('started-opencode-v2-session');
|
|
@@ -75,6 +75,7 @@ const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
|
75
75
|
const install_hints_1 = require("./install-hints");
|
|
76
76
|
const opencode_executable_1 = require("./opencode-executable");
|
|
77
77
|
const log_diagnosis_1 = require("../../lib/hooks/sources/opencode/log-diagnosis");
|
|
78
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
78
79
|
const logger = (0, logger_1.createLogger)('cli-tools/opencode');
|
|
79
80
|
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
80
81
|
/**
|
|
@@ -393,7 +394,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
393
394
|
});
|
|
394
395
|
}
|
|
395
396
|
const launchedAt = Date.now();
|
|
396
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
397
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
397
398
|
// Issue #1908: poll for opencode's own composer instead of sleeping 15 s.
|
|
398
399
|
await this.waitForReady(sessionName);
|
|
399
400
|
// Issue #1763: subscribe once the server is up. Health-checked first, so
|
|
@@ -21,6 +21,7 @@ const logger_1 = require("../../lib/logger");
|
|
|
21
21
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
22
22
|
const install_hints_1 = require("./install-hints");
|
|
23
23
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
24
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
24
25
|
const logger = (0, logger_1.createLogger)('cli-tools/vibe-local');
|
|
25
26
|
/**
|
|
26
27
|
* Extract error message from unknown error type (DRY)
|
|
@@ -123,7 +124,7 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
123
124
|
}
|
|
124
125
|
// Start vibe-local in interactive mode with auto-approve (-y)
|
|
125
126
|
// -y flag skips the permission confirmation prompt
|
|
126
|
-
await (0, tmux_1.sendKeys)(sessionName, vibeLocalCommand, true);
|
|
127
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(vibeLocalCommand), true);
|
|
127
128
|
// Wait for vibe-local to initialize (banner + model loading)
|
|
128
129
|
await new Promise((resolve) => setTimeout(resolve, VIBE_LOCAL_INIT_WAIT_MS));
|
|
129
130
|
logger.info('started-vibe-local-session:sessionname');
|
|
@@ -115,6 +115,23 @@ exports.STATUS_REASON = {
|
|
|
115
115
|
OPENCODE_RESPONSE_COMPLETE: 'opencode_response_complete',
|
|
116
116
|
INPUT_PROMPT: 'input_prompt',
|
|
117
117
|
NO_RECENT_OUTPUT: 'no_recent_output',
|
|
118
|
+
/**
|
|
119
|
+
* Issue #3179: the agent's launch is still in progress.
|
|
120
|
+
*
|
|
121
|
+
* Published by `current-output-builder` and `worktree-status-helper` while
|
|
122
|
+
* `lib/session/session-starting-state` holds a record for the instance — from
|
|
123
|
+
* `beginAgentSession` until `startSession` returns or throws, bounded by the
|
|
124
|
+
* tool's readiness wait and released early by a dialog the launch does not
|
|
125
|
+
* answer. The frame underneath (a shell prompt and the launch line, or a trust
|
|
126
|
+
* dialog the launch is about to answer) is not read while it is up: the status
|
|
127
|
+
* is `running`, and `isUnclassifiedActive` / `isSelectionListActive` /
|
|
128
|
+
* `isPromptWaiting` are all false, so no pad, no answer sheet and no `wait`
|
|
129
|
+
* exit 10 is raised for a screen nobody has to drive.
|
|
130
|
+
*
|
|
131
|
+
* ADDITIVE in the sense {@link STATUS_REASON.EXITED} is: a reader that does not
|
|
132
|
+
* know the token sees a `running` session.
|
|
133
|
+
*/
|
|
134
|
+
STARTING: 'starting',
|
|
118
135
|
/**
|
|
119
136
|
* Issue #2070: the tmux session is there, and the TOOL is not.
|
|
120
137
|
*
|
|
@@ -49,7 +49,9 @@ exports.SHELL_PROMPT_ENDINGS = ['$', '%', '#'];
|
|
|
49
49
|
* reproduced on renders as `maenokota@MAENOnoMac-Studio work-codex %` — forty
|
|
50
50
|
* characters exactly, i.e. one past this gate — so a codex session that had
|
|
51
51
|
* genuinely fallen back to the shell read as alive. See
|
|
52
|
-
* {@link SHELL_PROMPT_LINE_PATTERNS}.
|
|
52
|
+
* {@link SHELL_PROMPT_LINE_PATTERNS}. Issue #3191 found the same gap for claude
|
|
53
|
+
* (`… uat-repo-wt2 %`, 42 characters, after `/exit`), and claude now takes the
|
|
54
|
+
* line patterns too.
|
|
53
55
|
*/
|
|
54
56
|
exports.MAX_SHELL_PROMPT_LENGTH = 40;
|
|
55
57
|
/**
|
|
@@ -75,6 +75,9 @@ function snapshotFingerprint(payload) {
|
|
|
75
75
|
// client, or the Esc card outlives the panel it dismisses.
|
|
76
76
|
payload.isDismissablePanelActive ?? false,
|
|
77
77
|
payload.isUnclassifiedActive ?? false,
|
|
78
|
+
// Issue #3179: the launch ending is a change the client has to see even
|
|
79
|
+
// when the frame and every flag above are unchanged.
|
|
80
|
+
payload.startingSince ?? null,
|
|
78
81
|
]);
|
|
79
82
|
}
|
|
80
83
|
async function captureFreshPayload(worktreeId, cliToolId, instanceId) {
|
|
@@ -111,6 +114,8 @@ function emitTerminalSnapshot(worktreeId, cliToolId, payload, instanceId) {
|
|
|
111
114
|
isPagerActive: payload.isPagerActive ?? false,
|
|
112
115
|
isDismissablePanelActive: payload.isDismissablePanelActive ?? false,
|
|
113
116
|
isUnclassifiedActive: payload.isUnclassifiedActive ?? false,
|
|
117
|
+
// Issue #3179: so the push and the poll agree on "still starting".
|
|
118
|
+
startingSince: payload.startingSince ?? null,
|
|
114
119
|
version: nextVersion(key),
|
|
115
120
|
});
|
|
116
121
|
}
|
|
@@ -43,6 +43,7 @@ exports.buildAgentLaunchCommandLine = buildAgentLaunchCommandLine;
|
|
|
43
43
|
const sources_1 = require("../../lib/hooks/sources");
|
|
44
44
|
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
45
45
|
const session_generation_archive_1 = require("../../lib/session/session-generation-archive");
|
|
46
|
+
const session_starting_state_1 = require("../../lib/session/session-starting-state");
|
|
46
47
|
const logger_1 = require("../../lib/logger");
|
|
47
48
|
const logger = (0, logger_1.createLogger)('lib/session/agent-session-lifecycle');
|
|
48
49
|
/**
|
|
@@ -66,6 +67,16 @@ const logger = (0, logger_1.createLogger)('lib/session/agent-session-lifecycle')
|
|
|
66
67
|
* @param at - Epoch ms; defaults to now
|
|
67
68
|
*/
|
|
68
69
|
function beginAgentSession(target, at = Date.now()) {
|
|
70
|
+
// Issue #3179: the launch is in progress from here until
|
|
71
|
+
// `BaseCLITool.startSession` returns or throws (it clears the record in a
|
|
72
|
+
// `finally`). First, so the screen stops reading the about-to-be-created pane
|
|
73
|
+
// as a running agent before anything else here can fail.
|
|
74
|
+
// Issue #3195: the record is written under the token `startSession` is
|
|
75
|
+
// running the launch with (an `AsyncLocalStorage`, read inside
|
|
76
|
+
// `markSessionStarting`), which is how that `finally` knows the record is
|
|
77
|
+
// its own. A second call from the same launch (codex's
|
|
78
|
+
// `relaunchIntoSamePane`) rewrites the same launch's record.
|
|
79
|
+
(0, session_starting_state_1.markSessionStarting)(target.worktreeId, target.cliToolId, target.instanceId, at);
|
|
69
80
|
const before = (0, agent_event_state_1.getAgentEventDropCounts)(target.worktreeId, target.cliToolId, target.instanceId).decisionEvicted;
|
|
70
81
|
(0, agent_event_state_1.beginAgentEventGeneration)(target.worktreeId, target.cliToolId, target.instanceId, at);
|
|
71
82
|
const after = (0, agent_event_state_1.getAgentEventDropCounts)(target.worktreeId, target.cliToolId, target.instanceId).decisionEvicted;
|
|
@@ -36,6 +36,7 @@ const cmate_cli_tool_parser_1 = require("../../lib/cmate-cli-tool-parser");
|
|
|
36
36
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
37
37
|
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
38
38
|
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
39
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
39
40
|
const logger = (0, logger_1.createLogger)('claude-session');
|
|
40
41
|
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
41
42
|
// ----- Helper Functions -----
|
|
@@ -429,6 +430,11 @@ function findSessionErrorPattern(cleanOutput) {
|
|
|
429
430
|
* reading as a zsh prompt. What changed is that six other tools can now be
|
|
430
431
|
* asked the same question; see `lib/cli-tools/liveness-spec`.
|
|
431
432
|
*
|
|
433
|
+
* Issue #3191: a `user@host …` prompt of 40 characters or more is now read as
|
|
434
|
+
* the shell too (claude's spec takes `SHELL_PROMPT_LINE_PATTERNS`), so a claude
|
|
435
|
+
* that was `/exit`ed into a long zsh / bash prompt is reported unhealthy and
|
|
436
|
+
* relaunched instead of timing out the next send.
|
|
437
|
+
*
|
|
432
438
|
* @param sessionName - tmux session name
|
|
433
439
|
* @returns HealthCheckResult with healthy status and optional reason
|
|
434
440
|
*/
|
|
@@ -674,7 +680,7 @@ async function startClaudeSession(options) {
|
|
|
674
680
|
// and the operator's `~/.claude/settings.json` (measured on 2.1.278).
|
|
675
681
|
const launchCommand = model === undefined ? baseLaunchCommand : `${baseLaunchCommand} --model ${(0, hook_settings_generator_1.shellQuote)(model)}`;
|
|
676
682
|
// Start Claude CLI in interactive mode using dynamically resolved path
|
|
677
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
683
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
678
684
|
// Wait for Claude to initialize with dynamic detection (OCP-001)
|
|
679
685
|
// Use constants instead of hardcoded values
|
|
680
686
|
const maxWaitTime = exports.CLAUDE_INIT_TIMEOUT;
|