commandmate 0.49.2 → 0.49.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 +241 -234
- package/.next/app-path-routes-manifest.json +19 -18
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +8 -0
- 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.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +4 -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/[relayId]/resolve/route.js +1 -0
- package/.next/server/app/api/relays/[relayId]/resolve/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/[relayId]/resolve/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/relays/[relayId]/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +4 -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_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_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.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.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.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.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 +2 -2
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +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_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.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.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.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.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.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.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.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.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.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 +2 -2
- 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.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.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]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.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 +2 -2
- 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 -144
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_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.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.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_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.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.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.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.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_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 +10 -10
- 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 +19 -18
- package/.next/server/chunks/1308.js +1 -0
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1957.js +2 -2
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2897.js +1 -1
- package/.next/server/chunks/3417.js +1 -1
- package/.next/server/chunks/3801.js +7 -7
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4490.js +1 -0
- package/.next/server/chunks/4911.js +1 -1
- package/.next/server/chunks/4936.js +1 -1
- package/.next/server/chunks/5209.js +2 -2
- package/.next/server/chunks/5350.js +212 -0
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/7023.js +3 -3
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/7926.js +1 -0
- package/.next/server/chunks/8581.js +1 -1
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/8807.js +89 -88
- package/.next/server/chunks/8918.js +3 -3
- package/.next/server/chunks/9169.js +1 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +5 -5
- package/.next/server/chunks/9702.js +1 -0
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-07a237575e1ceb9e.js → 2407-87ec01332344ec2b.js} +1 -1
- package/.next/static/chunks/3931-3ef48b8d97357282.js +1 -0
- package/.next/static/chunks/app/api/agents/update/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/release-notes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/templates/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/{layout-4f64316957b0a8e5.js → layout-b9d8aef70e4f17b2.js} +1 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-f6a151304860b549.js +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/relays/[relayId]/resolve/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/prompt.d.ts.map +1 -1
- package/dist/cli/commands/prompt.js +2 -1
- package/dist/cli/commands/relays.d.ts +2 -0
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +142 -5
- package/dist/cli/commands/report.d.ts +7 -2
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +19 -6
- package/dist/cli/commands/respond-strict.d.ts.map +1 -1
- package/dist/cli/commands/respond-strict.js +9 -2
- package/dist/cli/commands/task.d.ts +22 -0
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +26 -18
- package/dist/cli/types/api-responses.d.ts +52 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client-deadline.d.ts +28 -0
- package/dist/cli/utils/api-client-deadline.d.ts.map +1 -0
- package/dist/cli/utils/api-client-deadline.js +46 -0
- package/dist/cli/utils/api-client-errors.d.ts +118 -0
- package/dist/cli/utils/api-client-errors.d.ts.map +1 -0
- package/dist/cli/utils/api-client-errors.js +210 -0
- package/dist/cli/utils/api-client.d.ts +3 -133
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +30 -257
- package/dist/lib/cli-tools/types.d.ts +6 -0
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +7 -0
- package/dist/server/locales/ja/worktree.json +7 -0
- package/dist/server/src/lib/cli-tools/claude.js +8 -2
- package/dist/server/src/lib/cli-tools/command-code.js +7 -15
- package/dist/server/src/lib/cli-tools/copilot.js +154 -25
- package/dist/server/src/lib/cli-tools/opencode.js +157 -6
- package/dist/server/src/lib/cli-tools/prompt-wait-dialog.js +115 -0
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +41 -8
- package/dist/server/src/lib/cli-tools/submit-verified-sender-composer.js +78 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-lock.js +116 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-report.js +250 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-shared.js +106 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +94 -295
- package/dist/server/src/lib/cli-tools/vibe-local.js +87 -0
- package/dist/server/src/lib/db/chat-db.js +14 -1
- package/dist/server/src/lib/db/db-instance.js +114 -2
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v63-session-relays-delivery-attempt.js +61 -0
- package/dist/server/src/lib/db/relay-bind-db-base.js +89 -0
- package/dist/server/src/lib/db/relay-bind-db-delivery.js +223 -0
- package/dist/server/src/lib/db/relay-bind-db-pending.js +183 -0
- package/dist/server/src/lib/db/relay-bind-db.js +88 -167
- package/dist/server/src/lib/db/relay-db-base.js +20 -0
- package/dist/server/src/lib/db/relay-db-count.js +49 -0
- package/dist/server/src/lib/db/relay-db-delivery.js +104 -0
- package/dist/server/src/lib/db/relay-db-hold.js +250 -0
- package/dist/server/src/lib/db/relay-db.js +33 -92
- package/dist/server/src/lib/detection/tools/opencode/composer-own-text.js +119 -0
- package/dist/server/src/lib/detection/tools/opencode/readiness.js +62 -0
- package/dist/server/src/lib/detection/tools/vibe-local/readiness.js +70 -0
- package/dist/server/src/lib/relay/relay-bound-reply.js +20 -9
- package/dist/server/src/lib/relay/relay-delivery.js +359 -79
- package/dist/server/src/lib/relay/relay-messages.js +13 -0
- package/dist/server/src/lib/relay/relay-system-line.js +28 -15
- package/dist/server/src/lib/relay/types.js +14 -2
- package/dist/server/src/lib/session/claude-session.js +4 -1
- package/dist/server/src/lib/session/current-output-builder.js +7 -5
- package/dist/server/src/lib/session/instance-input-lock.js +47 -2
- package/dist/server/src/lib/session/prompt-submit-receipt.js +87 -18
- package/dist/server/src/lib/session/prompt-waiting-guard.js +8 -2
- package/dist/server/src/lib/session/respond-target.js +82 -0
- package/dist/server/src/lib/session/send-attempt-state.js +130 -3
- package/dist/server/src/lib/session/send-user-message.js +78 -7
- package/dist/server/src/lib/session/structured-prompt.js +12 -7
- package/dist/server/src/lib/session/worktree-session-reconcile.js +10 -0
- package/dist/server/src/lib/session-key-sender.js +6 -1
- package/package.json +1 -1
- package/release-notes/0.49.3.json +52 -0
- package/.next/server/chunks/1062.js +0 -1
- package/.next/server/chunks/110.js +0 -1
- package/.next/server/chunks/2422.js +0 -1
- package/.next/server/chunks/3756.js +0 -1
- package/.next/server/chunks/5630.js +0 -1
- package/.next/server/chunks/6808.js +0 -4
- package/.next/server/chunks/9198.js +0 -144
- package/.next/static/chunks/3931-61ad1a4fc0208d0e.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-33afc6aa96289fb0.js +0 -1
- /package/.next/static/{yGatWDsS532awSs51kXyd → LNfVZiq6FZwKsV7L9Mi6M}/_buildManifest.js +0 -0
- /package/.next/static/{yGatWDsS532awSs51kXyd → LNfVZiq6FZwKsV7L9Mi6M}/_ssgManifest.js +0 -0
|
@@ -815,7 +815,10 @@ async function sendMessageToClaude(worktreeId, message, instanceId) {
|
|
|
815
815
|
// (`❯ ` can pass for Claude's prompt) — wait for that launch, or, holding the
|
|
816
816
|
// input lock as the send service does, refuse with nothing typed (R1).
|
|
817
817
|
await (0, session_launch_flight_1.settleSessionLaunch)(sessionName, 'Claude Code');
|
|
818
|
-
await (0, session_key_sender_1.sendMessageToSession)(sessionName, message, exports.CLAUDE_POST_PROMPT_DELAY, exports.CLAUDE_SEND_PROMPT_WAIT_TIMEOUT
|
|
818
|
+
await (0, session_key_sender_1.sendMessageToSession)(sessionName, message, exports.CLAUDE_POST_PROMPT_DELAY, exports.CLAUDE_SEND_PROMPT_WAIT_TIMEOUT,
|
|
819
|
+
// Issue #4048: the instance this send is for, so the first prompt's hook
|
|
820
|
+
// check reads that instance's entry — the same one the name resolves to.
|
|
821
|
+
{ worktreeId, instanceId });
|
|
819
822
|
}
|
|
820
823
|
/**
|
|
821
824
|
* Capture Claude session output
|
|
@@ -237,7 +237,7 @@ function readAgentEvents(worktreeId, cliToolId, instanceId, resolvedInstanceId)
|
|
|
237
237
|
* every value below is derived from the arguments, and nothing is assigned
|
|
238
238
|
* outside this function.
|
|
239
239
|
*/
|
|
240
|
-
function composePromptData({ worktreeId, cliToolId,
|
|
240
|
+
function composePromptData({ worktreeId, cliToolId, respondInstanceId, output, captureWindowLines, statusResult, startingSince, promptWaiting, askUserQuestion, eventSource, }) {
|
|
241
241
|
const scraperPromptWaiting = statusResult.hasActivePrompt;
|
|
242
242
|
// Issue #1726: the agent's own account of what it asked. It contributes only
|
|
243
243
|
// where some other layer has already established that a dialog is on screen —
|
|
@@ -338,9 +338,9 @@ function composePromptData({ worktreeId, cliToolId, instanceId, output, captureW
|
|
|
338
338
|
: scraperPromptWaiting
|
|
339
339
|
? correctedPromptData ??
|
|
340
340
|
scraperPromptData ??
|
|
341
|
-
(structuredFacts ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts,
|
|
341
|
+
(structuredFacts ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts, respondInstanceId) : null)
|
|
342
342
|
: structuredFacts
|
|
343
|
-
? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts,
|
|
343
|
+
? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts, respondInstanceId)
|
|
344
344
|
: null;
|
|
345
345
|
// Issue #2870: whether `/prompt-response` would answer the prompt published
|
|
346
346
|
// above, read by the SAME function it re-verifies with. In #2868 `promptData`
|
|
@@ -813,7 +813,7 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
813
813
|
const { structuredFacts, promptData, promptAnswerable } = composePromptData({
|
|
814
814
|
worktreeId,
|
|
815
815
|
cliToolId,
|
|
816
|
-
|
|
816
|
+
respondInstanceId: resolvedInstanceId,
|
|
817
817
|
output,
|
|
818
818
|
captureWindowLines,
|
|
819
819
|
statusResult,
|
|
@@ -921,7 +921,9 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
921
921
|
worktreeId,
|
|
922
922
|
cliToolId,
|
|
923
923
|
instanceId: resolvedInstanceId,
|
|
924
|
-
|
|
924
|
+
// Issue #4063: the instance the live payload's question names, so the
|
|
925
|
+
// row says the same `respond` whichever caller wrote it.
|
|
926
|
+
respondInstanceId: resolvedInstanceId,
|
|
925
927
|
state: promptWaiting,
|
|
926
928
|
facts: structuredFacts,
|
|
927
929
|
});
|
|
@@ -61,6 +61,7 @@ exports.currentInstanceInputTicket = currentInstanceInputTicket;
|
|
|
61
61
|
exports.withInstanceInputLock = withInstanceInputLock;
|
|
62
62
|
exports.instanceInputReadMark = instanceInputReadMark;
|
|
63
63
|
exports.instanceInputLaunchReadMark = instanceInputLaunchReadMark;
|
|
64
|
+
exports.instanceInputGenerationMark = instanceInputGenerationMark;
|
|
64
65
|
exports.answerUnderInstanceInputLock = answerUnderInstanceInputLock;
|
|
65
66
|
exports.leaveCarriedPasteMark = leaveCarriedPasteMark;
|
|
66
67
|
exports.getCarriedPasteMark = getCarriedPasteMark;
|
|
@@ -70,6 +71,7 @@ exports.invalidateInstanceInput = invalidateInstanceInput;
|
|
|
70
71
|
exports.isInputBoundaryRefusal = isInputBoundaryRefusal;
|
|
71
72
|
exports.observeInputStart = observeInputStart;
|
|
72
73
|
exports.noteInputStart = noteInputStart;
|
|
74
|
+
exports.noteInputTicket = noteInputTicket;
|
|
73
75
|
exports.noteDispatchStart = noteDispatchStart;
|
|
74
76
|
exports.noteDispatchFailed = noteDispatchFailed;
|
|
75
77
|
exports.resetInstanceInputLocks = resetInstanceInputLocks;
|
|
@@ -364,6 +366,18 @@ function instanceInputReadMark() {
|
|
|
364
366
|
function instanceInputLaunchReadMark() {
|
|
365
367
|
return (generationSeq.exclusiveEvents ?? 0) + (generationSeq.sharedReleases ?? 0);
|
|
366
368
|
}
|
|
369
|
+
/**
|
|
370
|
+
* The generation counter as it stands now (Issue #4065): every ticket granted
|
|
371
|
+
* from here on carries a larger generation. A send request reads it once, at
|
|
372
|
+
* its outermost entry (the send route before it reads the body; the send
|
|
373
|
+
* service for the timer and relay), and a refusal it records before any lock
|
|
374
|
+
* was granted to it carries the value — so it is not taken over the record of
|
|
375
|
+
* a send granted after the request began. Process-wide, like the generations
|
|
376
|
+
* themselves; 0 before any grant.
|
|
377
|
+
*/
|
|
378
|
+
function instanceInputGenerationMark() {
|
|
379
|
+
return generationSeq.last;
|
|
380
|
+
}
|
|
367
381
|
function skipOfLockError(error) {
|
|
368
382
|
const code = typeof error === 'object' && error !== null ? error.code : undefined;
|
|
369
383
|
if (code === exports.INSTANCE_INPUT_LOCK_TIMEOUT_CODE)
|
|
@@ -584,12 +598,16 @@ const inputStartScope = (0, global_state_1.getOrInitGlobal)('__instanceInputStar
|
|
|
584
598
|
* {@link noteInputStart}, so a caller can read state as of the moment the
|
|
585
599
|
* body started going in (Issue #3957: the send route's open-turn reading). A
|
|
586
600
|
* throw is logged and does not fail the send.
|
|
601
|
+
* @param request - Issue #4065: told, synchronously and as it happens, the
|
|
602
|
+
* generation of the body's input lock ({@link noteInputTicket}) and a
|
|
603
|
+
* dispatch ({@link noteDispatchStart}) — so a send that throws afterwards
|
|
604
|
+
* still leaves them with the caller.
|
|
587
605
|
* @returns `fn`'s value, and the moment input started — null when nothing in
|
|
588
606
|
* `fn` noted one (a path that never types a body: opencode's HTTP delivery,
|
|
589
607
|
* or a send refused before its first key). Never set when `fn` throws.
|
|
590
608
|
*/
|
|
591
|
-
async function observeInputStart(fn, onStart, boundary) {
|
|
592
|
-
const observer = { at: null, onStart, boundary, dispatchOpen: false };
|
|
609
|
+
async function observeInputStart(fn, onStart, boundary, request) {
|
|
610
|
+
const observer = { at: null, onStart, boundary, dispatchOpen: false, request };
|
|
593
611
|
const value = await inputStartScope.run(observer, fn);
|
|
594
612
|
return { value, inputStartedAt: observer.at };
|
|
595
613
|
}
|
|
@@ -623,6 +641,25 @@ function runBoundaryHook(observer, at, kind) {
|
|
|
623
641
|
throw error instanceof InputBoundaryRefusedError ? error : new InputBoundaryRefusedError(error);
|
|
624
642
|
}
|
|
625
643
|
}
|
|
644
|
+
/**
|
|
645
|
+
* Tell the request observing this context the generation its body's input
|
|
646
|
+
* lock was granted under (Issue #4065). Called by the shared sender right
|
|
647
|
+
* after its lock is granted or joined — never for a launch key, an answer, a
|
|
648
|
+
* trust dialog or copilot's `/model` and selection-list keys, whose tickets
|
|
649
|
+
* are not the body's. Synchronous, never throws; outside an
|
|
650
|
+
* {@link observeInputStart} context it does nothing.
|
|
651
|
+
*/
|
|
652
|
+
function noteInputTicket(ticket) {
|
|
653
|
+
const observer = inputStartScope.getStore();
|
|
654
|
+
if (observer?.request?.onTicket === undefined)
|
|
655
|
+
return;
|
|
656
|
+
try {
|
|
657
|
+
observer.request.onTicket(ticket.generation);
|
|
658
|
+
}
|
|
659
|
+
catch (error) {
|
|
660
|
+
logger.warn('input-ticket-observer-failed', { error: error instanceof Error ? error.message : String(error) });
|
|
661
|
+
}
|
|
662
|
+
}
|
|
626
663
|
/**
|
|
627
664
|
* Note that a body is about to be DISPATCHED without being typed (Issue #3957):
|
|
628
665
|
* opencode's HTTP send, which reports no input start. Runs the required
|
|
@@ -636,6 +673,14 @@ function noteDispatchStart(now = new Date()) {
|
|
|
636
673
|
return;
|
|
637
674
|
runBoundaryHook(observer, now, 'dispatch');
|
|
638
675
|
observer.dispatchOpen = true;
|
|
676
|
+
// Issue #4065: after the required hook, so a refused dispatch — nothing went
|
|
677
|
+
// out — is not reported as one.
|
|
678
|
+
try {
|
|
679
|
+
observer.request?.onDispatch?.();
|
|
680
|
+
}
|
|
681
|
+
catch (error) {
|
|
682
|
+
logger.warn('dispatch-start-observer-failed', { error: error instanceof Error ? error.message : String(error) });
|
|
683
|
+
}
|
|
639
684
|
}
|
|
640
685
|
/**
|
|
641
686
|
* Say how a dispatch noted by {@link noteDispatchStart} ended when it did not
|
|
@@ -27,16 +27,19 @@
|
|
|
27
27
|
* @module lib/session/prompt-submit-receipt
|
|
28
28
|
*/
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.reportsPrompts = reportsPrompts;
|
|
30
31
|
exports.notePromptSubmitSession = notePromptSubmitSession;
|
|
31
32
|
exports.notePromptSubmitHook = notePromptSubmitHook;
|
|
32
33
|
exports.getPromptSubmitTarget = getPromptSubmitTarget;
|
|
33
34
|
exports.readPromptSubmitReceipt = readPromptSubmitReceipt;
|
|
34
35
|
exports.noteSubmittedBody = noteSubmittedBody;
|
|
36
|
+
exports.findSubmittedBody = findSubmittedBody;
|
|
35
37
|
exports.matchesSubmittedBody = matchesSubmittedBody;
|
|
36
38
|
exports.clearPromptSubmitReceipts = clearPromptSubmitReceipts;
|
|
37
39
|
const crypto_1 = require("crypto");
|
|
38
40
|
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
39
41
|
const global_state_1 = require("../../lib/global-state");
|
|
42
|
+
const send_attempt_state_1 = require("../../lib/session/send-attempt-state");
|
|
40
43
|
/** How many sessions are tracked at once; the least recently started is forgotten first. */
|
|
41
44
|
const MAX_TRACKED_SESSIONS = 1024;
|
|
42
45
|
/**
|
|
@@ -49,13 +52,41 @@ const sessionByInstance = (0, global_state_1.getOrInitGlobal)('__promptSubmitSes
|
|
|
49
52
|
function instanceKey(target) {
|
|
50
53
|
return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
51
54
|
}
|
|
52
|
-
/**
|
|
55
|
+
/**
|
|
56
|
+
* The tools whose prompt hook is trusted as proof of a submit — and, since
|
|
57
|
+
* Issue #4048, the only ones whose `lastSend` a found body may demote.
|
|
58
|
+
*/
|
|
53
59
|
function reportsPrompts(cliToolId) {
|
|
54
60
|
// Claude only. codex's hooks run in a machine-wide daemon that can file a
|
|
55
61
|
// turn under the wrong instance (#2874), and copilot's arrive out of order
|
|
56
62
|
// (#1903); neither is evidence about one pane's composer.
|
|
57
63
|
return cliToolId === 'claude';
|
|
58
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* The entry a send looks at (Issue #4048). By name alone, the name's entry. With
|
|
67
|
+
* an explicit target, the same entry only when the target's instance currently
|
|
68
|
+
* maps to this very name and the entry is that instance's — a target and a name
|
|
69
|
+
* that disagree are no entry at all, so nothing about another instance (or a
|
|
70
|
+
* generation the instance no longer runs under this name) is taken as proof.
|
|
71
|
+
* Looking never registers or resets anything.
|
|
72
|
+
*/
|
|
73
|
+
function entryFor(sessionName, cliToolId, expected) {
|
|
74
|
+
const entry = sessions.get(sessionName);
|
|
75
|
+
if (entry === undefined || expected === undefined)
|
|
76
|
+
return entry;
|
|
77
|
+
let key;
|
|
78
|
+
try {
|
|
79
|
+
key = instanceKey({ worktreeId: expected.worktreeId, cliToolId, instanceId: expected.instanceId });
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
if (sessionByInstance.get(key) !== sessionName)
|
|
85
|
+
return undefined;
|
|
86
|
+
if (instanceKey(entry.target) !== key)
|
|
87
|
+
return undefined;
|
|
88
|
+
return entry;
|
|
89
|
+
}
|
|
59
90
|
/**
|
|
60
91
|
* A session's generation began here (`beginAgentSession`). Forgets what was
|
|
61
92
|
* known about the previous process in the same pane name.
|
|
@@ -88,25 +119,49 @@ function notePromptSubmitHook(target, event, at) {
|
|
|
88
119
|
if (entry === undefined)
|
|
89
120
|
return;
|
|
90
121
|
entry.lastEventAt = at;
|
|
91
|
-
if (event === 'user_prompt_submit')
|
|
122
|
+
if (event === 'user_prompt_submit') {
|
|
92
123
|
entry.lastPromptAt = at;
|
|
124
|
+
// Issue #4048: the agent took a prompt, so a body the screen alone called
|
|
125
|
+
// submitted is no longer one to look for — the late report was that body's,
|
|
126
|
+
// or a later send went through after it. Either way no later send may find
|
|
127
|
+
// it and demote a record (review: X restored after Y's success).
|
|
128
|
+
entry.submittedBody = null;
|
|
129
|
+
}
|
|
93
130
|
}
|
|
94
|
-
/**
|
|
95
|
-
|
|
96
|
-
|
|
131
|
+
/**
|
|
132
|
+
* The instance a session this server started runs, or null. With `expected`
|
|
133
|
+
* (Issue #4048), null unless the explicit target names the same entry.
|
|
134
|
+
*/
|
|
135
|
+
function getPromptSubmitTarget(sessionName, expected) {
|
|
136
|
+
if (expected === undefined)
|
|
137
|
+
return sessions.get(sessionName)?.target ?? null;
|
|
138
|
+
return entryFor(sessionName, expected.cliToolId, expected)?.target ?? null;
|
|
97
139
|
}
|
|
98
140
|
/**
|
|
99
141
|
* Whether the screen's B/F verdict for a send whose first Enter went in at
|
|
100
142
|
* `enteredAt` needs the agent's own report (Issue #4035).
|
|
143
|
+
*
|
|
144
|
+
* `expected` (Issue #4048) is the instance the send was made for; a name that
|
|
145
|
+
* does not resolve to that instance's entry answers `not-required` (never
|
|
146
|
+
* `received`), exactly as a session this server did not start.
|
|
147
|
+
*
|
|
148
|
+
* Known limit, kept as it is (Issue #4048 item 3): the question is asked on
|
|
149
|
+
* every read, and a session whose first hook (`SessionStart`) has not arrived
|
|
150
|
+
* by the read-back is answered `not-required` — the screen's B/F verdict then
|
|
151
|
+
* stands and the send returns at once, before a hook that is only late could
|
|
152
|
+
* turn it into `awaited`. Pinned by `prompt-submit-receipt-4048.test.ts`.
|
|
101
153
|
*/
|
|
102
|
-
function readPromptSubmitReceipt(sessionName, cliToolId, enteredAt) {
|
|
154
|
+
function readPromptSubmitReceipt(sessionName, cliToolId, enteredAt, expected) {
|
|
103
155
|
if (!reportsPrompts(cliToolId))
|
|
104
156
|
return 'not-required';
|
|
105
|
-
const entry =
|
|
157
|
+
const entry = entryFor(sessionName, cliToolId, expected);
|
|
106
158
|
if (entry === undefined || entry.target.cliToolId !== cliToolId)
|
|
107
159
|
return 'not-required';
|
|
108
160
|
if (entry.lastPromptAt !== null && entry.lastPromptAt >= enteredAt)
|
|
109
161
|
return 'received';
|
|
162
|
+
// Issue #4048 item 3 (known limit): no hook yet from this process — the
|
|
163
|
+
// screen decides, and a `SessionStart` that arrives after this read is not
|
|
164
|
+
// waited for.
|
|
110
165
|
if (entry.lastEventAt === null || entry.lastEventAt < entry.startedAt)
|
|
111
166
|
return 'not-required';
|
|
112
167
|
if (entry.lastPromptAt !== null && entry.lastPromptAt >= entry.startedAt)
|
|
@@ -122,31 +177,45 @@ function digest(text) {
|
|
|
122
177
|
/**
|
|
123
178
|
* The sender reported this body submitted on this session from the screen
|
|
124
179
|
* alone — not for one the agent's hook reported, which did leave.
|
|
180
|
+
*
|
|
181
|
+
* `expected` (Issue #4048): with an explicit target, nothing is noted unless it
|
|
182
|
+
* names the same entry as the session name.
|
|
125
183
|
*/
|
|
126
|
-
function noteSubmittedBody(sessionName, message) {
|
|
127
|
-
const entry = sessions.get(sessionName);
|
|
184
|
+
function noteSubmittedBody(sessionName, message, expected) {
|
|
185
|
+
const entry = expected === undefined ? sessions.get(sessionName) : entryFor(sessionName, expected.cliToolId, expected);
|
|
128
186
|
if (entry === undefined)
|
|
129
187
|
return;
|
|
130
188
|
const body = compact(message);
|
|
131
189
|
entry.submittedBody = {
|
|
132
190
|
full: digest(body),
|
|
133
191
|
prefix: body.length >= BODY_PREFIX_CHARS ? digest(body.slice(0, BODY_PREFIX_CHARS)) : null,
|
|
192
|
+
messageDigest: (0, send_attempt_state_1.sendMessageDigest)(message),
|
|
134
193
|
};
|
|
135
194
|
}
|
|
136
195
|
/**
|
|
137
|
-
*
|
|
138
|
-
* the whole of it, or
|
|
196
|
+
* The body last reported submitted on this session, when a composer read is it
|
|
197
|
+
* — the whole of it, or (for a read long enough) its beginning — or null.
|
|
198
|
+
* `messageDigest` is the attempt's digest, for demoting only that attempt's
|
|
199
|
+
* record (Issue #4048).
|
|
139
200
|
*/
|
|
140
|
-
function
|
|
141
|
-
const
|
|
201
|
+
function findSubmittedBody(sessionName, composerText, expected) {
|
|
202
|
+
const entry = expected === undefined ? sessions.get(sessionName) : entryFor(sessionName, expected.cliToolId, expected);
|
|
203
|
+
const body = entry?.submittedBody;
|
|
142
204
|
if (body === null || body === undefined)
|
|
143
|
-
return
|
|
205
|
+
return null;
|
|
144
206
|
const read = compact(composerText);
|
|
145
207
|
if (read === '')
|
|
146
|
-
return
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
return
|
|
208
|
+
return null;
|
|
209
|
+
const matched = digest(read) === body.full ||
|
|
210
|
+
(body.prefix !== null && read.length >= BODY_PREFIX_CHARS && digest(read.slice(0, BODY_PREFIX_CHARS)) === body.prefix);
|
|
211
|
+
return matched ? { messageDigest: body.messageDigest } : null;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Whether a composer read is the body last reported submitted on this session:
|
|
215
|
+
* the whole of it, or — for a read long enough — its beginning.
|
|
216
|
+
*/
|
|
217
|
+
function matchesSubmittedBody(sessionName, composerText) {
|
|
218
|
+
return findSubmittedBody(sessionName, composerText) !== null;
|
|
150
219
|
}
|
|
151
220
|
/** Forget every session (tests). */
|
|
152
221
|
function clearPromptSubmitReceipts() {
|
|
@@ -24,6 +24,7 @@ exports.PROMPT_WAITING_CODE = void 0;
|
|
|
24
24
|
exports.isPromptWaiting = isPromptWaiting;
|
|
25
25
|
exports.promptWaitingMessage = promptWaitingMessage;
|
|
26
26
|
const manager_1 = require("../../lib/cli-tools/manager");
|
|
27
|
+
const respond_target_1 = require("../../lib/session/respond-target");
|
|
27
28
|
const cli_session_1 = require("../../lib/session/cli-session");
|
|
28
29
|
const status_detector_1 = require("../../lib/detection/status-detector");
|
|
29
30
|
const status_capture_config_1 = require("../../config/status-capture-config");
|
|
@@ -133,11 +134,16 @@ async function isPromptWaiting(worktreeId, cliToolId, instanceId, options) {
|
|
|
133
134
|
* waiting. A request for the primary instance (no `instanceId`) gets the
|
|
134
135
|
* sentence as before.
|
|
135
136
|
*
|
|
137
|
+
* Issue #4049: a request that named only a tool other than the worktree
|
|
138
|
+
* default gets ` --agent <tool>` instead (the caller decides, through
|
|
139
|
+
* `respondAgentFor`), since a bare `respond` goes to the default tool.
|
|
140
|
+
*
|
|
136
141
|
* @param blockedBy - Which layer refused; omitted callers get the plain message
|
|
137
142
|
* @param instanceId - The instance the refused request named, if any
|
|
143
|
+
* @param agent - The tool to name when no instance was named (`respondAgentFor`)
|
|
138
144
|
*/
|
|
139
|
-
function promptWaitingMessage(worktreeId, blockedBy, instanceId) {
|
|
140
|
-
const target =
|
|
145
|
+
function promptWaitingMessage(worktreeId, blockedBy, instanceId, agent) {
|
|
146
|
+
const target = (0, respond_target_1.respondTargetFlags)(instanceId, agent);
|
|
141
147
|
const base = `${worktreeId} is waiting on a prompt. Sending now would type into the ` +
|
|
142
148
|
`prompt's input line instead of reaching the agent, and would leave that ` +
|
|
143
149
|
`text in place for the next answer. Answer the prompt first: ` +
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Where the `respond` a server-side guidance sentence names has to go
|
|
4
|
+
* (Issue #4049).
|
|
5
|
+
*
|
|
6
|
+
* #4031 gave the PROMPT_WAITING refusal and the structured-dialog question a
|
|
7
|
+
* ` --instance <id>` when the request named an instance. A request that named
|
|
8
|
+
* only a tool (`send … --agent codex`) still got a bare `commandmate respond
|
|
9
|
+
* <id> <answer>`, and the CLI resolves a bare `respond` to the worktree's
|
|
10
|
+
* default tool — so the answer could reach a different agent than the one that
|
|
11
|
+
* is waiting.
|
|
12
|
+
*
|
|
13
|
+
* Type-only imports and string building, like `structured-prompt`, so the
|
|
14
|
+
* client bundle that reads that module can read this one too.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.respondTargetFlags = respondTargetFlags;
|
|
18
|
+
exports.respondAgentFor = respondAgentFor;
|
|
19
|
+
exports.commandCodePlanReviewSendMessage = commandCodePlanReviewSendMessage;
|
|
20
|
+
/**
|
|
21
|
+
* The flags that aim a `respond` (or `send`) at the waiting session, by the
|
|
22
|
+
* CLI's own order (`targetFlags` in `src/cli/utils/follow-up-command.ts`): an
|
|
23
|
+
* instance first, else a tool, else nothing — the sentence as it was before.
|
|
24
|
+
*
|
|
25
|
+
* @param instanceId - The instance the request named, if any
|
|
26
|
+
* @param agent - The tool to name when no instance was named (see {@link respondAgentFor})
|
|
27
|
+
*/
|
|
28
|
+
function respondTargetFlags(instanceId, agent) {
|
|
29
|
+
if (instanceId)
|
|
30
|
+
return ` --instance ${instanceId}`;
|
|
31
|
+
if (agent)
|
|
32
|
+
return ` --agent ${agent}`;
|
|
33
|
+
return '';
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The tool a guidance `respond` must name, or undefined when a bare one already
|
|
37
|
+
* reaches the waiting session.
|
|
38
|
+
*
|
|
39
|
+
* Only a request that named a tool explicitly and no instance gets one, and
|
|
40
|
+
* only when that tool is not what an unqualified request resolves to (the
|
|
41
|
+
* worktree default): `--agent claude` on a claude worktree, and a request that
|
|
42
|
+
* named nothing, keep the sentence they had (#4031's "primary and default are
|
|
43
|
+
* unchanged").
|
|
44
|
+
*
|
|
45
|
+
* @param requestedCliTool - The tool the request named explicitly, if any
|
|
46
|
+
* @param instanceId - The instance the request named, if any
|
|
47
|
+
* @param unqualifiedCliTool - The tool a request naming nothing resolves to
|
|
48
|
+
*/
|
|
49
|
+
function respondAgentFor(requestedCliTool, instanceId, unqualifiedCliTool) {
|
|
50
|
+
if (instanceId || !requestedCliTool)
|
|
51
|
+
return undefined;
|
|
52
|
+
return requestedCliTool === unqualifiedCliTool ? undefined : requestedCliTool;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Why `send` stops at the plan review overlay (Issue #3125).
|
|
56
|
+
*
|
|
57
|
+
* The overlay replaces the composer until a human decides, so waiting for the
|
|
58
|
+
* composer only ran out the clock (`prompt not ready` after the full timeout).
|
|
59
|
+
* Its comments, Submit review, approval and cancel go through `respond`.
|
|
60
|
+
*
|
|
61
|
+
* Issue #4049: a function, not a constant. The constant named a
|
|
62
|
+
* `<worktree-id>` placeholder and no instance, so on `command-code-2` the
|
|
63
|
+
* `respond` it showed went to the primary instance. The primary instance
|
|
64
|
+
* (no id, or the tool's own id — #868) gets no `--instance`.
|
|
65
|
+
*
|
|
66
|
+
* Issue #4063: and the tool, by {@link respondTargetFlags}' rule, when the
|
|
67
|
+
* request named Command Code on a worktree whose default is another tool
|
|
68
|
+
* ({@link respondAgentFor}). `CommandCodeTool.sendMessage` does not know the
|
|
69
|
+
* request, so the routes (send, terminal) rebuild the sentence with the `agent`
|
|
70
|
+
* they resolved; the tool's own throw leaves it out. Kept here, with no import
|
|
71
|
+
* beyond types, so those routes do not load the tool module.
|
|
72
|
+
*
|
|
73
|
+
* @param worktreeId - The worktree whose session is showing the review
|
|
74
|
+
* @param instanceId - The instance the send was for, if any
|
|
75
|
+
* @param agent - The tool the `respond` must name when no instance is (see `respondAgentFor`)
|
|
76
|
+
*/
|
|
77
|
+
function commandCodePlanReviewSendMessage(worktreeId, instanceId, agent) {
|
|
78
|
+
const target = respondTargetFlags(instanceId && instanceId !== 'command-code' ? instanceId : undefined, agent);
|
|
79
|
+
return ('Command Code is showing a plan review (REVIEW), which takes review comments, not messages. ' +
|
|
80
|
+
`Comment with \`commandmate respond ${worktreeId} "<text>"${target}\`, then \`--plan-review submit\` (ctrl+r), ` +
|
|
81
|
+
'`--plan-review approve` (ctrl+a) or `--plan-review cancel` (esc).');
|
|
82
|
+
}
|
|
@@ -22,11 +22,46 @@
|
|
|
22
22
|
* Recording must never change a send's outcome: {@link recordSendAttempt}
|
|
23
23
|
* swallows its own failures.
|
|
24
24
|
*
|
|
25
|
+
* Issue #4065: which attempt is "the last" is decided by the input lock's
|
|
26
|
+
* grant order, not by which attempt finished last. Three kinds of record:
|
|
27
|
+
*
|
|
28
|
+
* - **granted** — the attempt held the body's input lock (`inputGeneration`,
|
|
29
|
+
* the ticket's generation g). Includes one refused after the grant before
|
|
30
|
+
* any key (g does not mean "typed"). Kept when g ≥ the instance's highest
|
|
31
|
+
* granted generation so far (maxG), dropped when g < maxG: a send granted
|
|
32
|
+
* later has already said how it went.
|
|
33
|
+
* - **refused** — `not-sent` before any lock was granted to it
|
|
34
|
+
* (`observedGeneration`, the generation counter o read once at the request's
|
|
35
|
+
* outermost entry). Kept when maxG ≤ o, dropped when maxG > o: a send granted
|
|
36
|
+
* after this request began has already said how it went. o is only ever
|
|
37
|
+
* compared with maxG — never with another o, nor with another instance's
|
|
38
|
+
* grants; o = 0 is a value like any other.
|
|
39
|
+
* - **excluded / unknown** — neither (copilot's selection-list commands and
|
|
40
|
+
* `/model`, opencode's HTTP delivery including its keyboard fallback after an
|
|
41
|
+
* `unknown` dispatch, a tool path that reports nothing). Kept in the order
|
|
42
|
+
* they finish, as before #4065, and they never move maxG.
|
|
43
|
+
*
|
|
44
|
+
* maxG is held beside the published record and only ever grows: a refused or
|
|
45
|
+
* excluded record, or a demotion ({@link markLastSendDiscarded}), never lowers
|
|
46
|
+
* it, so an older grant's late outcome cannot come back after them. Within one
|
|
47
|
+
* process the generation never goes back (a recreated session keeps counting);
|
|
48
|
+
* a restart forgets the records and maxG together. A worktree ID migration
|
|
49
|
+
* does not move them (the old ID's records are dropped). When more than
|
|
50
|
+
* {@link MAX_TRACKED_INSTANCES} instances are tracked the least recently sent
|
|
51
|
+
* to loses its record and its maxG together — a late outcome for it is then
|
|
52
|
+
* recorded as if it were the first.
|
|
53
|
+
*
|
|
54
|
+
* The published `lastSend` is still the three fields `at` / `state` /
|
|
55
|
+
* `reason`; neither g nor o is published, and `at` is not an order. It is the
|
|
56
|
+
* instance's last attempt by the rules above — not necessarily the reading
|
|
57
|
+
* request's own (that is `onAttempt` / `sendOutcome`).
|
|
58
|
+
*
|
|
25
59
|
* @module lib/session/send-attempt-state
|
|
26
60
|
*/
|
|
27
61
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
62
|
exports.sendMessageDigest = sendMessageDigest;
|
|
29
63
|
exports.recordSendAttempt = recordSendAttempt;
|
|
64
|
+
exports.forgetSendAttemptsForWorktree = forgetSendAttemptsForWorktree;
|
|
30
65
|
exports.getLastSendAttempt = getLastSendAttempt;
|
|
31
66
|
exports.markLastSendDiscarded = markLastSendDiscarded;
|
|
32
67
|
exports.clearSendAttempts = clearSendAttempts;
|
|
@@ -42,6 +77,13 @@ const logger = (0, logger_1.createLogger)('session/send-attempt-state');
|
|
|
42
77
|
/** How many instances are tracked at once; the least recently sent to is forgotten first. */
|
|
43
78
|
const MAX_TRACKED_INSTANCES = 1024;
|
|
44
79
|
const records = (0, global_state_1.getOrInitGlobal)('__sendAttemptRecords', () => new Map());
|
|
80
|
+
/**
|
|
81
|
+
* Issue #4065: per instance, the highest input generation a granted record
|
|
82
|
+
* carried (maxG). Kept apart from the published record so that a refused or
|
|
83
|
+
* excluded record — or a demotion — that replaces it does not forget it.
|
|
84
|
+
* Evicted with the instance's record.
|
|
85
|
+
*/
|
|
86
|
+
const maxGenerations = (0, global_state_1.getOrInitGlobal)('__sendAttemptMaxGeneration', () => new Map());
|
|
45
87
|
function keyOf(instance) {
|
|
46
88
|
return JSON.stringify([instance.worktreeId, instance.cliToolId, instance.instanceId]);
|
|
47
89
|
}
|
|
@@ -52,27 +94,90 @@ function sendMessageDigest(content) {
|
|
|
52
94
|
/**
|
|
53
95
|
* Record how a send attempt ended. Never throws: a record that cannot be made
|
|
54
96
|
* leaves the send exactly as it was.
|
|
97
|
+
*
|
|
98
|
+
* Issue #4048: `typedContent` is the body the sender actually typed when it
|
|
99
|
+
* differs from `content`; `inputGeneration` is the input lock generation the
|
|
100
|
+
* attempt ran under.
|
|
101
|
+
*
|
|
102
|
+
* Issue #4065: `observedGeneration` is the generation counter the request read
|
|
103
|
+
* at its outermost entry (`instanceInputGenerationMark` in `instance-input-lock`), given for a
|
|
104
|
+
* `not-sent` refusal made before any lock was granted to it. Which record is
|
|
105
|
+
* kept is decided against the instance's maxG (see the module comment):
|
|
106
|
+
* granted g ≥ maxG is kept (and raises maxG), g < maxG dropped; a refusal is
|
|
107
|
+
* kept when maxG ≤ o; a record with neither is kept, in the order recorded.
|
|
108
|
+
* `inputGeneration` wins when both are given.
|
|
109
|
+
*
|
|
110
|
+
* @returns Whether the attempt became the instance's record. The request's own
|
|
111
|
+
* outcome is the caller's to report whatever this says (`onAttempt`).
|
|
55
112
|
*/
|
|
56
113
|
function recordSendAttempt(instance, attempt, now = Date.now()) {
|
|
57
114
|
try {
|
|
58
115
|
const key = keyOf(instance);
|
|
116
|
+
const maxGeneration = maxGenerations.get(key);
|
|
117
|
+
if (attempt.inputGeneration !== undefined) {
|
|
118
|
+
if (maxGeneration !== undefined && maxGeneration > attempt.inputGeneration) {
|
|
119
|
+
logger.info('send-attempt-record-skipped-stale-generation', {
|
|
120
|
+
generation: attempt.inputGeneration,
|
|
121
|
+
heldGeneration: maxGeneration,
|
|
122
|
+
});
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (attempt.observedGeneration !== undefined) {
|
|
127
|
+
if (maxGeneration !== undefined && maxGeneration > attempt.observedGeneration) {
|
|
128
|
+
logger.info('send-attempt-record-skipped-refusal-before-newer-grant', {
|
|
129
|
+
observedGeneration: attempt.observedGeneration,
|
|
130
|
+
heldGeneration: maxGeneration,
|
|
131
|
+
});
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const messageDigest = sendMessageDigest(attempt.content);
|
|
136
|
+
const typedDigest = attempt.typedContent === undefined ? undefined : sendMessageDigest(attempt.typedContent);
|
|
59
137
|
// Re-inserted, so the map's order is least recently sent to first.
|
|
60
138
|
records.delete(key);
|
|
61
139
|
records.set(key, {
|
|
62
140
|
at: Math.floor(now),
|
|
63
141
|
state: attempt.state,
|
|
64
142
|
reason: attempt.reason,
|
|
65
|
-
messageDigest
|
|
143
|
+
messageDigest,
|
|
144
|
+
...(typedDigest !== undefined && typedDigest !== messageDigest ? { typedDigest } : {}),
|
|
145
|
+
...(attempt.inputGeneration !== undefined ? { inputGeneration: attempt.inputGeneration } : {}),
|
|
66
146
|
});
|
|
147
|
+
if (attempt.inputGeneration !== undefined) {
|
|
148
|
+
maxGenerations.set(key, Math.max(maxGeneration ?? attempt.inputGeneration, attempt.inputGeneration));
|
|
149
|
+
}
|
|
67
150
|
while (records.size > MAX_TRACKED_INSTANCES) {
|
|
68
151
|
const oldest = records.keys().next().value;
|
|
69
152
|
if (oldest === undefined)
|
|
70
153
|
break;
|
|
71
154
|
records.delete(oldest);
|
|
155
|
+
maxGenerations.delete(oldest);
|
|
72
156
|
}
|
|
157
|
+
return true;
|
|
73
158
|
}
|
|
74
159
|
catch (error) {
|
|
75
160
|
logger.warn('send-attempt-record-failed', { error: error instanceof Error ? error.message : String(error) });
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Forget the records — and their maxG — of every instance of `worktreeId`
|
|
166
|
+
* (Issue #4065): a worktree ID migration drops them rather than moving them,
|
|
167
|
+
* so the new ID starts with no record. Never throws.
|
|
168
|
+
*/
|
|
169
|
+
function forgetSendAttemptsForWorktree(worktreeId) {
|
|
170
|
+
try {
|
|
171
|
+
for (const key of [...records.keys(), ...maxGenerations.keys()]) {
|
|
172
|
+
const parsed = JSON.parse(key);
|
|
173
|
+
if (Array.isArray(parsed) && parsed[0] === worktreeId) {
|
|
174
|
+
records.delete(key);
|
|
175
|
+
maxGenerations.delete(key);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
logger.warn('send-attempt-forget-failed', { error: error instanceof Error ? error.message : String(error) });
|
|
76
181
|
}
|
|
77
182
|
}
|
|
78
183
|
/** The instance's last recorded attempt, or null when none is held. */
|
|
@@ -83,22 +188,35 @@ function getLastSendAttempt(instance) {
|
|
|
83
188
|
* Turn the instance's last `sent` record `indeterminate` (Issue #4035): the
|
|
84
189
|
* next send found that body still in the composer, so it never reached the
|
|
85
190
|
* agent. Any other record is left as it is. Never throws.
|
|
191
|
+
*
|
|
192
|
+
* `messageDigest` (Issue #4048) is the digest of the body that was found (the
|
|
193
|
+
* body typed, so it is matched against the record's `typedDigest` too): a
|
|
194
|
+
* record of another attempt — a later send, or one whose body differs — is
|
|
195
|
+
* left as it is. Omitted, the last `sent` record is demoted as before.
|
|
86
196
|
*/
|
|
87
|
-
function markLastSendDiscarded(instance, now = Date.now()) {
|
|
197
|
+
function markLastSendDiscarded(instance, now = Date.now(), messageDigest) {
|
|
88
198
|
try {
|
|
89
199
|
const key = keyOf(instance);
|
|
90
200
|
const record = records.get(key);
|
|
91
201
|
if (record === undefined || record.state !== 'sent')
|
|
92
202
|
return;
|
|
203
|
+
if (messageDigest !== undefined &&
|
|
204
|
+
record.messageDigest !== messageDigest &&
|
|
205
|
+
record.typedDigest !== messageDigest) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// Issue #4065: the spread keeps the record's generation, and maxG is not
|
|
209
|
+
// touched — a demotion is not a newer attempt.
|
|
93
210
|
records.set(key, { ...record, at: Math.floor(now), state: 'indeterminate', reason: 'found-in-composer' });
|
|
94
211
|
}
|
|
95
212
|
catch (error) {
|
|
96
213
|
logger.warn('send-attempt-record-failed', { error: error instanceof Error ? error.message : String(error) });
|
|
97
214
|
}
|
|
98
215
|
}
|
|
99
|
-
/** Forget every record (tests). */
|
|
216
|
+
/** Forget every record and every maxG (tests). */
|
|
100
217
|
function clearSendAttempts() {
|
|
101
218
|
records.clear();
|
|
219
|
+
maxGenerations.clear();
|
|
102
220
|
}
|
|
103
221
|
/**
|
|
104
222
|
* The wordings of a failed tmux call that can carry the message body: `tmux.ts`
|
|
@@ -134,6 +252,15 @@ function carriesCode(error, code) {
|
|
|
134
252
|
* (`Failed to send message to <tool>: …`), so they are matched anywhere in it.
|
|
135
253
|
*/
|
|
136
254
|
function classifySendFailure(error) {
|
|
255
|
+
// #4040: opencode's keyboard fallback refused before any key (its cause says
|
|
256
|
+
// why — a code like `paste-not-started` included), but the server dispatch
|
|
257
|
+
// before it ended `unknown`: the message may already be there, so the attempt
|
|
258
|
+
// as a whole stays unknown, never "safe to resend". Read FIRST, before any
|
|
259
|
+
// code the cause carries.
|
|
260
|
+
if (error instanceof Error &&
|
|
261
|
+
/an earlier server dispatch may have delivered the message \(Issue #4040\)/.test(error.message)) {
|
|
262
|
+
return { state: 'indeterminate', reason: 'send-error' };
|
|
263
|
+
}
|
|
137
264
|
if (typeof error === 'object' &&
|
|
138
265
|
error !== null &&
|
|
139
266
|
error.code === session_start_error_1.SESSION_STARTING_CODE) {
|