commandmate 0.47.0 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +501 -501
- package/.next/app-path-routes-manifest.json +34 -34
- package/.next/build-manifest.json +8 -8
- package/.next/diagnostics/framework.json +1 -1
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +12 -12
- package/.next/react-loadable-manifest.json +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route.js +2 -2
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js +1 -1
- package/.next/server/app/api/agents/versions/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/app/release-notes/route.js.nft.json +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +5 -5
- package/.next/server/app/api/app/update/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route.js +1 -1
- package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route.js +1 -1
- package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route.js +1 -1
- package/.next/server/app/api/auth/status/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route.js +1 -1
- package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js +1 -1
- package/.next/server/app/api/fs/browse/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +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.js +2 -2
- package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route.js +1 -1
- package/.next/server/app/api/ollama/models/route.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route.js +2 -2
- package/.next/server/app/api/remote/pair/route.js.nft.json +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +1 -1
- package/.next/server/app/api/templates/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +7 -7
- 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 +2 -2
- package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +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.js.nft.json +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 +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +5 -5
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +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/apple-icon.png/route.js +1 -1
- package/.next/server/app/apple-icon.png/route.js.nft.json +1 -1
- package/.next/server/app/apple-icon.png.meta +1 -1
- package/.next/server/app/icon.png/route.js +1 -1
- package/.next/server/app/icon.png/route.js.nft.json +1 -1
- package/.next/server/app/icon.png.meta +1 -1
- package/.next/server/app/icon1.png/route.js +1 -1
- package/.next/server/app/icon1.png/route.js.nft.json +1 -1
- package/.next/server/app/icon1.png.meta +1 -1
- package/.next/server/app/icon2.png/route.js +1 -1
- package/.next/server/app/icon2.png/route.js.nft.json +1 -1
- package/.next/server/app/icon2.png.meta +1 -1
- package/.next/server/app/login/page.js +2 -2
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest.meta +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page.js +2 -2
- package/.next/server/app/offline/page.js.nft.json +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +2 -2
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +2 -2
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +2 -2
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +2 -2
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page.js +2 -2
- package/.next/server/app/skills/installed/page.js.nft.json +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.js +2 -2
- package/.next/server/app/skills/page.js.nft.json +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +12 -12
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +34 -34
- package/.next/server/chunks/{5048.js → 1185.js} +1 -1
- package/.next/server/chunks/1191.js +11 -4
- package/.next/server/chunks/1501.js +1 -1
- package/.next/server/chunks/1601.js +2 -2
- package/.next/server/chunks/1656.js +19 -0
- package/.next/server/chunks/1945.js +3 -3
- package/.next/server/chunks/1990.js +103 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2422.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2534.js +1 -1
- package/.next/server/chunks/255.js +1 -0
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3505.js +7 -0
- package/.next/server/chunks/3897.js +22 -0
- package/.next/server/chunks/4072.js +5 -5
- package/.next/server/chunks/4248.js +1 -1
- package/.next/server/chunks/4280.js +1 -0
- package/.next/server/chunks/463.js +1 -0
- package/.next/server/chunks/5209.js +1 -1
- package/.next/server/chunks/5611.js +1 -1
- package/.next/server/chunks/6119.js +1 -0
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6345.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +9 -8
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6784.js +1 -0
- package/.next/server/chunks/720.js +103 -0
- package/.next/server/chunks/7604.js +2 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +7 -7
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8807.js +19 -18
- package/.next/server/chunks/8918.js +2 -104
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/936.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9540.js +1 -1
- package/.next/server/chunks/9627.js +4 -4
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/_document.js.nft.json +1 -1
- package/.next/server/pages/_error.js +3 -3
- package/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/{1111.5ab4f0ffb0d944e5.js → 1111.1b653d4a9816a0a7.js} +8 -8
- package/.next/static/chunks/{1255-7e5873f06b25e129.js → 1255-a85690d352f4f8fd.js} +1 -1
- package/.next/static/chunks/2099-c3e0ab70a1b95dd3.js +1 -0
- package/.next/static/chunks/{2407-b2f524f99f7fc353.js → 2407-26139a8a2f1adbe8.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/{2863-6a07ec82fb52f4dd.js → 2863-f0121af1cbbedb3b.js} +1 -1
- package/.next/static/chunks/{8165-263172c17ae8e8c3.js → 8165-c68b3dc844210e6a.js} +1 -1
- package/.next/static/chunks/8407-35bbfc84793d7004.js +1 -0
- package/.next/static/chunks/9079-406b84d3cc891a87.js +1 -0
- package/.next/static/chunks/9465-b59bb255b376c813.js +1 -0
- package/.next/static/chunks/app/{layout-419eaf7de340f4ab.js → layout-46b4cbf07520d9b6.js} +1 -1
- package/.next/static/chunks/app/sessions/page-fb241bed579c67aa.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-cbc7749a33450cc5.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/static/chunks/main-37ca13e38030fe8b.js +1 -0
- package/.next/static/chunks/{webpack-468b7b33030234b3.js → webpack-838df0273b03af19.js} +1 -1
- package/.next/trace +13 -13
- package/dist/cli/commands/auto-yes.d.ts +24 -0
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +73 -3
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +10 -1
- package/dist/cli/commands/prompt.d.ts.map +1 -1
- package/dist/cli/commands/prompt.js +28 -14
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +15 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +108 -14
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +27 -0
- package/dist/cli/types/api-responses.d.ts +131 -4
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +4 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/resource-resolvers.d.ts +0 -18
- package/dist/cli/utils/resource-resolvers.d.ts.map +1 -1
- package/dist/cli/utils/resource-resolvers.js +1 -51
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +65 -2
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
- package/dist/lib/polling/auto-yes-suppression-reason.js +36 -2
- package/dist/lib/prompt-observation/types.d.ts +13 -0
- package/dist/lib/prompt-observation/types.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +2 -1
- package/dist/server/locales/ja/worktree.json +2 -1
- package/dist/server/src/lib/auto-yes-poller-answer-target.js +38 -0
- package/dist/server/src/lib/auto-yes-poller-keys.js +35 -0
- package/dist/server/src/lib/auto-yes-poller-session-presence.js +26 -0
- package/dist/server/src/lib/auto-yes-poller-tick.js +233 -0
- package/dist/server/src/lib/auto-yes-poller.js +468 -792
- package/dist/server/src/lib/auto-yes-state.js +50 -2
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +107 -14
- package/dist/server/src/lib/db/chat-db.js +5 -1
- package/dist/server/src/lib/db/verification-db.js +23 -2
- package/dist/server/src/lib/detection/option-recommendation.js +120 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice-approval-context.js +290 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +396 -268
- package/dist/server/src/lib/detection/prompt-detector.js +92 -21
- package/dist/server/src/lib/detection/prompt-screen-key.js +60 -0
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +158 -35
- package/dist/server/src/lib/detection/tools/claude/detect.js +111 -10
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +67 -0
- package/dist/server/src/lib/detection/tools/dialog-block.js +16 -0
- package/dist/server/src/lib/detection/waiting-screen-reading.js +98 -0
- package/dist/server/src/lib/hooks/permission-adjudication.js +26 -0
- package/dist/server/src/lib/hooks/permission-decision-service.js +49 -4
- package/dist/server/src/lib/hooks/permission-request-payload.js +20 -0
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +21 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +3 -0
- package/dist/server/src/lib/hooks/sources/codex/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/command-code/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/copilot/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/gemini/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/legacy-relay.js +2 -0
- package/dist/server/src/lib/hooks/sources/opencode/ingest.js +6 -0
- package/dist/server/src/lib/hooks/sources/opencode/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +6 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/pending-decisions.js +14 -2
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +14 -3
- package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +21 -1
- package/dist/server/src/lib/polling/auto-yes-confirm-page.js +2 -2
- package/dist/server/src/lib/polling/auto-yes-confirmation-ledger-types.js +117 -0
- package/dist/server/src/lib/polling/auto-yes-confirmation-ledger.js +1091 -0
- package/dist/server/src/lib/polling/auto-yes-decision-state.js +195 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +139 -10
- package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +14 -0
- package/dist/server/src/lib/polling/auto-yes-ledger-records.js +143 -0
- package/dist/server/src/lib/polling/auto-yes-manual-answer.js +122 -0
- package/dist/server/src/lib/polling/auto-yes-option-effect.js +157 -0
- package/dist/server/src/lib/polling/auto-yes-policy.js +46 -11
- package/dist/server/src/lib/polling/auto-yes-poller-capture.js +63 -0
- package/dist/server/src/lib/polling/auto-yes-poller-enter-fallback.js +37 -0
- package/dist/server/src/lib/polling/auto-yes-poller-generation.js +192 -0
- package/dist/server/src/lib/polling/auto-yes-poller-receipt-log.js +324 -0
- package/dist/server/src/lib/polling/auto-yes-poller-state.js +193 -26
- package/dist/server/src/lib/polling/auto-yes-poller-steps.js +279 -0
- package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +13 -2
- package/dist/server/src/lib/polling/auto-yes-question-choice.js +57 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +117 -22
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +36 -2
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +25 -1
- package/dist/server/src/lib/polling/prompt-screen-reading.js +232 -0
- package/dist/server/src/lib/polling/response-checker-blank-response.js +30 -0
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +39 -0
- package/dist/server/src/lib/polling/response-checker.js +138 -53
- package/dist/server/src/lib/prompt-answer-sender.js +104 -10
- package/dist/server/src/lib/prompt-observation/appearance.js +165 -0
- package/dist/server/src/lib/push/notification-dedup.js +15 -2
- package/dist/server/src/lib/push/prompt-card-state.js +140 -19
- package/dist/server/src/lib/push/prompt-push-gate.js +158 -12
- package/dist/server/src/lib/push/push-sender.js +23 -3
- package/dist/server/src/lib/push/resolution-push-notifier.js +14 -0
- package/dist/server/src/lib/push/waiting-push-notifier.js +139 -17
- package/dist/server/src/lib/realtime/terminal-broadcast.js +16 -0
- package/dist/server/src/lib/session/agent-event-state.js +25 -5
- package/dist/server/src/lib/session/agent-event-turn.js +140 -46
- package/dist/server/src/lib/session/cli-session.js +21 -2
- package/dist/server/src/lib/session/current-output-builder.js +64 -11
- package/dist/server/src/lib/session/send-attempt-state.js +23 -7
- package/dist/server/src/lib/session/waiting-episode-binding-observation.js +289 -0
- package/dist/server/src/lib/session/waiting-episode-binding-resolve.js +38 -0
- package/dist/server/src/lib/session/waiting-episode-binding.js +276 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +307 -17
- package/dist/server/src/lib/session/waiting-episode-verdict.js +174 -0
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +76 -11
- package/dist/server/src/lib/tmux/tmux.js +54 -9
- package/dist/server/src/lib/verification/gate-runner.js +162 -13
- package/dist/server/src/lib/verification/machine-lock.js +5 -0
- package/dist/server/src/lib/ws-server.js +18 -3
- package/dist/server/src/types/auto-yes-answer-mode.js +38 -0
- package/dist/server/src/types/auto-yes-decision.js +61 -0
- package/dist/server/src/types/auto-yes.js +6 -0
- package/dist/server/src/types/prompt-reading.js +32 -0
- package/dist/types/auto-yes-answer-mode.d.ts +35 -0
- package/dist/types/auto-yes-answer-mode.d.ts.map +1 -0
- package/dist/types/auto-yes-answer-mode.js +38 -0
- package/docs/en/user-guide/webapp-guide.md +33 -4
- package/package.json +2 -2
- package/public/sw.js +76 -4
- package/release-notes/0.47.1.json +20 -0
- package/release-notes/0.47.2.json +20 -0
- package/release-notes/0.48.0.json +57 -0
- package/scripts/hooks/cmate-agent-event.sh +22 -0
- package/.next/server/chunks/1331.js +0 -22
- package/.next/server/chunks/1559.js +0 -2
- package/.next/server/chunks/1836.js +0 -1
- package/.next/server/chunks/1944.js +0 -1
- package/.next/server/chunks/2328.js +0 -1
- package/.next/server/chunks/2460.js +0 -1
- package/.next/server/chunks/5292.js +0 -7
- package/.next/server/chunks/5595.js +0 -1
- package/.next/server/chunks/7166.js +0 -19
- package/.next/server/chunks/9051.js +0 -1
- package/.next/server/chunks/9199.js +0 -1
- package/.next/static/chunks/602-1c1488959215e140.js +0 -1
- package/.next/static/chunks/8407-155f84e5ba05f1d5.js +0 -1
- package/.next/static/chunks/9079-24f9fa549ed298f1.js +0 -1
- package/.next/static/chunks/9465-e5a351baa941f31b.js +0 -1
- package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +0 -1
- package/.next/static/chunks/main-ac91ed6e71380841.js +0 -1
- /package/.next/static/{b5BiQC9F6r_XFPdA9cuSj → PTlAswXLq8PAe2vUJ8dVP}/_buildManifest.js +0 -0
- /package/.next/static/{b5BiQC9F6r_XFPdA9cuSj → PTlAswXLq8PAe2vUJ8dVP}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Which appearance of a screen an observation saw (Issue #3755).
|
|
4
|
+
*
|
|
5
|
+
* The same trust screen can open, be answered, and open again with every word
|
|
6
|
+
* the same — and a token issued on the first one must not answer the second.
|
|
7
|
+
* The server keeps, per instance, the fingerprint of the decision screen it
|
|
8
|
+
* last observed (kind, question, options, approval target, pane, generation)
|
|
9
|
+
* and when that fingerprint was first observed. Observing anything else — a
|
|
10
|
+
* different screen, `composer`, `none`, `unknown`, no session — forgets it, so
|
|
11
|
+
* the next observation of the same words is a new appearance with a new
|
|
12
|
+
* `firstSeenAt`, which the token binds (`./token`).
|
|
13
|
+
*
|
|
14
|
+
* What this cannot see: the screen going away and coming back between two
|
|
15
|
+
* observations, with nothing observed in between (observations are opt-in, not
|
|
16
|
+
* a poll). The two are one appearance here.
|
|
17
|
+
*
|
|
18
|
+
* In memory on `globalThis` (the route that issues and the route that verifies
|
|
19
|
+
* are bundled apart under `next dev`), bounded; forgetting an instance only
|
|
20
|
+
* makes its next observation a new appearance, which fails closed.
|
|
21
|
+
*
|
|
22
|
+
* @module lib/prompt-observation/appearance
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.approvalTargetWithOptionRowsAligned = approvalTargetWithOptionRowsAligned;
|
|
26
|
+
exports.approvalTargetWithoutHighlight = approvalTargetWithoutHighlight;
|
|
27
|
+
exports.screenFingerprint = screenFingerprint;
|
|
28
|
+
exports.noteScreenAppearance = noteScreenAppearance;
|
|
29
|
+
exports.forgetScreenAppearance = forgetScreenAppearance;
|
|
30
|
+
const global_state_1 = require("../../lib/global-state");
|
|
31
|
+
const dialog_block_1 = require("../../lib/detection/tools/dialog-block");
|
|
32
|
+
/** How many instances are tracked at once; the least recently observed is forgotten first. */
|
|
33
|
+
const MAX_TRACKED_INSTANCES = 1024;
|
|
34
|
+
const appearances = (0, global_state_1.getOrInitGlobal)('__promptObservationScreenAppearances', () => new Map());
|
|
35
|
+
/** Whitespace folded, so a re-render that only reflows a row is the same screen. */
|
|
36
|
+
function normalize(text) {
|
|
37
|
+
return text === null ? null : text.replace(/\s+/g, ' ').trim();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* How many rows under agy's bottom option row may be its wrapped tail: the
|
|
41
|
+
* allowance `detection/tools/antigravity/dialog.ts` gives the same block
|
|
42
|
+
* (`LAST_OPTION_TAIL_ROWS`, not exported). A tail longer than this reads as no
|
|
43
|
+
* block here, which leaves the target as it is (fail closed).
|
|
44
|
+
*/
|
|
45
|
+
const PERMISSION_OPTION_TAIL_ROWS = 12;
|
|
46
|
+
/**
|
|
47
|
+
* The gutter of an option row: the highlight's glyph or the blank of the others.
|
|
48
|
+
* The glyphs are the block reader's (`dialog-block.ts`): agy's `>`, and claude's
|
|
49
|
+
* `❯`, codex's `›` and `●` for the readers that share the poller (#3817).
|
|
50
|
+
*/
|
|
51
|
+
const OPTION_ROW_GUTTER_PATTERN = /^[ \t]*[>\u276F\u203A\u25CF]?[ \t]*/u;
|
|
52
|
+
/**
|
|
53
|
+
* The rows the shared block reader adopted as option rows, option 1 first, or
|
|
54
|
+
* null when they cannot be told.
|
|
55
|
+
*
|
|
56
|
+
* Taken from the reader itself, never re-judged here: `findNumberedOptionBlock`
|
|
57
|
+
* names the rows of option 1 (`firstRow`) and of the bottom option (`lastRow`)
|
|
58
|
+
* only, so option k's row is the `lastRow` of the block the reader finds above
|
|
59
|
+
* option k+1's row. Between two adopted rows there is no row the reader could
|
|
60
|
+
* parse as an option (it would have adopted it, or stopped there), so that
|
|
61
|
+
* block is the same run cut one option shorter. A row the reader folds into a
|
|
62
|
+
* label — `0. item`, `00. item` — is never in the list.
|
|
63
|
+
*/
|
|
64
|
+
function adoptedOptionRows(rows, block) {
|
|
65
|
+
const adopted = [block.lastRow];
|
|
66
|
+
for (let below = block.lastRow; adopted.length < block.options.length - 1;) {
|
|
67
|
+
const above = (0, dialog_block_1.findNumberedOptionBlock)(rows, below, rows.length);
|
|
68
|
+
if (above === null || above.firstRow !== block.firstRow || above.lastRow >= below)
|
|
69
|
+
return null;
|
|
70
|
+
adopted.unshift(above.lastRow);
|
|
71
|
+
below = above.lastRow;
|
|
72
|
+
}
|
|
73
|
+
adopted.unshift(block.firstRow);
|
|
74
|
+
return adopted.length === block.options.length ? adopted : null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* An approval target with the gutters of its option rows made the same, or null
|
|
78
|
+
* when its option rows cannot be told (Issue #3812, shared since #3817).
|
|
79
|
+
*
|
|
80
|
+
* The option block is found the way the readers find it
|
|
81
|
+
* (`findNumberedOptionBlock`, bottom up to `1.`), and taken only when each label
|
|
82
|
+
* the block reader read is `sameLabel` to the one the screen names. Only the
|
|
83
|
+
* gutter of the rows the reader adopted as options ({@link adoptedOptionRows})
|
|
84
|
+
* is made the same; every row above option 1 (the command, a here-document's
|
|
85
|
+
* `1. item`, its `>` and its indent) and every row folded into a label
|
|
86
|
+
* (`0. item` included) stays byte for byte.
|
|
87
|
+
*
|
|
88
|
+
* @param sameLabel - Whether the label the block reader read (rows under the
|
|
89
|
+
* bottom option folded in) is the one the screen names
|
|
90
|
+
*/
|
|
91
|
+
function approvalTargetWithOptionRowsAligned(approvalTarget, options, sameLabel) {
|
|
92
|
+
const rows = approvalTarget.split('\n');
|
|
93
|
+
const block = (0, dialog_block_1.findNumberedOptionBlock)(rows, rows.length, PERMISSION_OPTION_TAIL_ROWS);
|
|
94
|
+
if (block === null)
|
|
95
|
+
return null;
|
|
96
|
+
// The reader folds the rows under the bottom option into its label.
|
|
97
|
+
const labels = [...block.options];
|
|
98
|
+
const last = labels.length - 1;
|
|
99
|
+
if (block.footer !== '')
|
|
100
|
+
labels[last] = [labels[last], ...block.footer.split('\n')].join(' ').trim();
|
|
101
|
+
if (labels.length !== options.length || labels.some((label, i) => !sameLabel(label, options[i])))
|
|
102
|
+
return null;
|
|
103
|
+
const adopted = adoptedOptionRows(rows, block);
|
|
104
|
+
if (adopted === null)
|
|
105
|
+
return null;
|
|
106
|
+
const optionRows = new Set(adopted);
|
|
107
|
+
return rows.map((row, i) => (optionRows.has(i) ? row.replace(OPTION_ROW_GUTTER_PATTERN, ' ') : row)).join('\n');
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* An approval target with the highlight's mark taken out (Issue #3812).
|
|
111
|
+
*
|
|
112
|
+
* agy's permission dialog reads its approval target down to the footer
|
|
113
|
+
* (`detection/tools/antigravity/dialog.ts`), so its option rows are the tail
|
|
114
|
+
* of the target and the `>` moves with every ↑/↓. Its option rows are aligned
|
|
115
|
+
* by {@link approvalTargetWithOptionRowsAligned} when the block's labels are
|
|
116
|
+
* exactly the screen's `options` — what the reader named.
|
|
117
|
+
*
|
|
118
|
+
* Any other kind, a target with no such block, or a block whose labels are not
|
|
119
|
+
* the screen's, is returned as is: a moved highlight then reads as another
|
|
120
|
+
* screen, which stops the strict respond rather than letting it through.
|
|
121
|
+
*/
|
|
122
|
+
function approvalTargetWithoutHighlight(kind, approvalTarget, options) {
|
|
123
|
+
if (approvalTarget === null || kind !== 'antigravity-permission')
|
|
124
|
+
return approvalTarget;
|
|
125
|
+
return approvalTargetWithOptionRowsAligned(approvalTarget, options, (read, named) => read === named) ?? approvalTarget;
|
|
126
|
+
}
|
|
127
|
+
/** One fixed form of what a screen asks. The highlight is not in it: moving the cursor is the same appearance. */
|
|
128
|
+
function screenFingerprint(parts) {
|
|
129
|
+
return JSON.stringify([
|
|
130
|
+
parts.sessionName,
|
|
131
|
+
parts.sessionGeneration,
|
|
132
|
+
parts.kind,
|
|
133
|
+
normalize(parts.question),
|
|
134
|
+
parts.options.map(normalize),
|
|
135
|
+
normalize(approvalTargetWithoutHighlight(parts.kind, parts.approvalTarget, parts.options)),
|
|
136
|
+
]);
|
|
137
|
+
}
|
|
138
|
+
function keyOf(instance) {
|
|
139
|
+
return JSON.stringify([instance.worktreeId, instance.cliToolId, instance.instanceId]);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Record an observation of a decision screen and return when this appearance
|
|
143
|
+
* of it was first observed.
|
|
144
|
+
*
|
|
145
|
+
* @param fingerprint - {@link screenFingerprint} of the screen
|
|
146
|
+
*/
|
|
147
|
+
function noteScreenAppearance(instance, fingerprint, now) {
|
|
148
|
+
const key = keyOf(instance);
|
|
149
|
+
const previous = appearances.get(key);
|
|
150
|
+
// Re-inserted, so the map's order is least recently observed first.
|
|
151
|
+
appearances.delete(key);
|
|
152
|
+
const firstSeenAt = previous?.fingerprint === fingerprint ? previous.firstSeenAt : Math.floor(now);
|
|
153
|
+
appearances.set(key, { fingerprint, firstSeenAt });
|
|
154
|
+
while (appearances.size > MAX_TRACKED_INSTANCES) {
|
|
155
|
+
const oldest = appearances.keys().next().value;
|
|
156
|
+
if (oldest === undefined)
|
|
157
|
+
break;
|
|
158
|
+
appearances.delete(oldest);
|
|
159
|
+
}
|
|
160
|
+
return firstSeenAt;
|
|
161
|
+
}
|
|
162
|
+
/** Record an observation of anything else: the instance's last screen has gone. */
|
|
163
|
+
function forgetScreenAppearance(instance) {
|
|
164
|
+
appearances.delete(keyOf(instance));
|
|
165
|
+
}
|
|
@@ -60,15 +60,28 @@ const waitingSent = (0, global_state_1.getOrInitGlobal)('__waitingPushDedup', ()
|
|
|
60
60
|
* - the escalation → allowed exactly once per episode;
|
|
61
61
|
* - a new episode (the wait ended and another began) → sent again, even if the
|
|
62
62
|
* prompt text and the elapsed time are identical.
|
|
63
|
+
*
|
|
64
|
+
* Issue #3798: "the same episode" is the mixed rule `prompt-push-gate` holds
|
|
65
|
+
* its hold by — both ids present and equal, or one absent and the `since`s
|
|
66
|
+
* equal. Kept inline rather than imported: this module stays a leaf.
|
|
63
67
|
*/
|
|
64
68
|
function shouldSendWaitingPush(event) {
|
|
65
69
|
const key = `${event.worktreeId}::${event.instanceId}`;
|
|
66
70
|
const escalated = event.escalated === true;
|
|
71
|
+
const episodeId = event.episodeId ?? undefined;
|
|
67
72
|
const prev = waitingSent.get(key);
|
|
68
|
-
|
|
73
|
+
const sameEpisode = prev !== undefined &&
|
|
74
|
+
(prev.episodeId !== undefined && episodeId !== undefined
|
|
75
|
+
? prev.episodeId === episodeId
|
|
76
|
+
: prev.since === event.since);
|
|
77
|
+
if (prev && sameEpisode && (prev.escalated || !escalated)) {
|
|
78
|
+
// An id-less producer recorded this wait first; it is named now.
|
|
79
|
+
if (prev.episodeId === undefined && episodeId !== undefined)
|
|
80
|
+
prev.episodeId = episodeId;
|
|
69
81
|
return false;
|
|
70
82
|
}
|
|
71
|
-
|
|
83
|
+
const recordedId = episodeId ?? (sameEpisode ? prev?.episodeId : undefined);
|
|
84
|
+
waitingSent.set(key, { since: event.since, ...(recordedId !== undefined ? { episodeId: recordedId } : {}), escalated });
|
|
72
85
|
return true;
|
|
73
86
|
}
|
|
74
87
|
/** Clear the episode-scoped state (for tests). */
|
|
@@ -88,12 +88,27 @@
|
|
|
88
88
|
* this module's; it is written up as a remaining limitation in §6.2 of the
|
|
89
89
|
* design note and pinned by `tests/unit/push/restart-card-state-2057.test.ts`.
|
|
90
90
|
*
|
|
91
|
+
* ## Which episode the card is about (Issue #3798)
|
|
92
|
+
*
|
|
93
|
+
* The mark also keeps the id of the waiting episode the card was last sent
|
|
94
|
+
* for, so the resolution can name it (`resolvedEpisodeId`) and the Service
|
|
95
|
+
* Worker can leave a newer episode's card alone. The id lives in a second row,
|
|
96
|
+
* {@link PROMPT_CARD_EPISODE_KEY_PREFIX}`<worktreeId>`, written in the same
|
|
97
|
+
* statement as the time row — one write, so a reader never sees a new time
|
|
98
|
+
* with an old id — and its value repeats the time (`<at>:<episodeId>`): an id
|
|
99
|
+
* whose time is not the time row's is not this card's and reads as none. The
|
|
100
|
+
* time row's value stays the bare timestamp it was before #3798, so a mark
|
|
101
|
+
* written by an older server (time row only) reads as a card with no id, and
|
|
102
|
+
* an older server reading a newer mark sees exactly what it wrote.
|
|
103
|
+
*
|
|
91
104
|
* @module lib/push/prompt-card-state
|
|
92
105
|
*/
|
|
93
106
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
94
|
-
exports.PROMPT_CARD_MAX_AGE_MS = exports.PROMPT_CARD_KEY_PREFIX = void 0;
|
|
107
|
+
exports.PROMPT_CARD_MAX_AGE_MS = exports.PROMPT_ORDER_KEY_PREFIX = exports.PROMPT_CARD_EPISODE_KEY_PREFIX = exports.PROMPT_CARD_KEY_PREFIX = void 0;
|
|
95
108
|
exports.markPromptCardShown = markPromptCardShown;
|
|
109
|
+
exports.nextPromptOrder = nextPromptOrder;
|
|
96
110
|
exports.hasPromptCard = hasPromptCard;
|
|
111
|
+
exports.getPromptCardEpisodeId = getPromptCardEpisodeId;
|
|
97
112
|
exports.clearPromptCard = clearPromptCard;
|
|
98
113
|
exports.clearAllPromptCards = clearAllPromptCards;
|
|
99
114
|
exports.forgetPromptCardMemory = forgetPromptCardMemory;
|
|
@@ -111,6 +126,20 @@ const logger = (0, logger_1.createLogger)('push/prompt-card-state');
|
|
|
111
126
|
* spell another id's key.
|
|
112
127
|
*/
|
|
113
128
|
exports.PROMPT_CARD_KEY_PREFIX = 'push_prompt_card:';
|
|
129
|
+
/**
|
|
130
|
+
* `app_settings.key` prefix for the episode id beside one worktree's card mark
|
|
131
|
+
* (Issue #3798). Not matched by `${PROMPT_CARD_KEY_PREFIX}*`: the character
|
|
132
|
+
* after `push_prompt_card` is `_` here and `:` there.
|
|
133
|
+
*/
|
|
134
|
+
exports.PROMPT_CARD_EPISODE_KEY_PREFIX = 'push_prompt_card_episode:';
|
|
135
|
+
/**
|
|
136
|
+
* `app_settings.key` prefix for one worktree's prompt push order (Issue #3798):
|
|
137
|
+
* a counter that moves once per episode-named waiting card and once per
|
|
138
|
+
* resolution that names its episode, so the Service Worker can tell a card
|
|
139
|
+
* sent after a resolution was decided from one sent before it. Not a card row:
|
|
140
|
+
* no card GLOB matches it and nothing clears it, so the order never goes back.
|
|
141
|
+
*/
|
|
142
|
+
exports.PROMPT_ORDER_KEY_PREFIX = 'push_prompt_order:';
|
|
114
143
|
/**
|
|
115
144
|
* How long a persisted mark is believed.
|
|
116
145
|
*
|
|
@@ -144,25 +173,51 @@ exports.PROMPT_CARD_KEY_PREFIX = 'push_prompt_card:';
|
|
|
144
173
|
exports.PROMPT_CARD_MAX_AGE_MS = 24 * 60 * 60 * 1000;
|
|
145
174
|
/** worktreeId -> epoch ms the most recent prompt card was fanned out. */
|
|
146
175
|
const cards = (0, global_state_1.getOrInitGlobal)('__promptPushCards', () => new Map());
|
|
176
|
+
/**
|
|
177
|
+
* worktreeId -> the episode id that card was sent for, or null (Issue #3798).
|
|
178
|
+
* Set and dropped together with {@link cards}; a worktree in `cards` with no
|
|
179
|
+
* entry here reads as id-less.
|
|
180
|
+
*/
|
|
181
|
+
const cardEpisodes = (0, global_state_1.getOrInitGlobal)('__promptPushCardEpisodes', () => new Map());
|
|
147
182
|
function keyFor(worktreeId) {
|
|
148
183
|
return `${exports.PROMPT_CARD_KEY_PREFIX}${worktreeId}`;
|
|
149
184
|
}
|
|
185
|
+
function episodeKeyFor(worktreeId) {
|
|
186
|
+
return `${exports.PROMPT_CARD_EPISODE_KEY_PREFIX}${worktreeId}`;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* The episode id from its row, if that row belongs to the mark written at `at`.
|
|
190
|
+
* `<at>:<id>`; an empty id, a different time or a malformed value is no id.
|
|
191
|
+
*/
|
|
192
|
+
function parseEpisodeValue(value, at) {
|
|
193
|
+
if (value === undefined)
|
|
194
|
+
return null;
|
|
195
|
+
const sep = value.indexOf(':');
|
|
196
|
+
if (sep < 0 || value.slice(0, sep) !== String(at))
|
|
197
|
+
return null;
|
|
198
|
+
const id = value.slice(sep + 1);
|
|
199
|
+
return id === '' ? null : id;
|
|
200
|
+
}
|
|
150
201
|
function isExpired(at, now) {
|
|
151
202
|
return now - at >= exports.PROMPT_CARD_MAX_AGE_MS;
|
|
152
203
|
}
|
|
153
204
|
/** The persisted mark for one worktree, or null. Never throws. */
|
|
154
205
|
function readRow(worktreeId) {
|
|
155
206
|
try {
|
|
156
|
-
const
|
|
157
|
-
.prepare('SELECT value FROM app_settings WHERE key
|
|
158
|
-
.
|
|
207
|
+
const rows = (0, db_instance_1.getDbInstance)()
|
|
208
|
+
.prepare('SELECT key, value FROM app_settings WHERE key IN (?, ?)')
|
|
209
|
+
.all(keyFor(worktreeId), episodeKeyFor(worktreeId));
|
|
210
|
+
const row = rows.find((r) => r.key === keyFor(worktreeId));
|
|
159
211
|
if (!row)
|
|
160
212
|
return null;
|
|
161
213
|
const at = Number.parseInt(row.value, 10);
|
|
162
214
|
// A value nobody can read is treated as no card: it fails towards *not*
|
|
163
215
|
// spending a push, the same direction `decidePromptResolution` chose for a
|
|
164
216
|
// database that cannot answer.
|
|
165
|
-
|
|
217
|
+
if (!Number.isFinite(at))
|
|
218
|
+
return null;
|
|
219
|
+
const episodeRow = rows.find((r) => r.key === episodeKeyFor(worktreeId));
|
|
220
|
+
return { at, episodeId: parseEpisodeValue(episodeRow?.value, at) };
|
|
166
221
|
}
|
|
167
222
|
catch (error) {
|
|
168
223
|
logger.debug('prompt-card-read-failed', {
|
|
@@ -195,18 +250,24 @@ function readAllRows() {
|
|
|
195
250
|
return [];
|
|
196
251
|
}
|
|
197
252
|
}
|
|
198
|
-
/**
|
|
199
|
-
|
|
253
|
+
/**
|
|
254
|
+
* Write one worktree's mark through to storage. Never throws.
|
|
255
|
+
*
|
|
256
|
+
* Issue #3798: the time row and the episode row in one statement — an id-less
|
|
257
|
+
* mark writes an empty id, so a newer id-less card never leaves an older
|
|
258
|
+
* card's id behind.
|
|
259
|
+
*/
|
|
260
|
+
function writeRow(worktreeId, at, episodeId) {
|
|
200
261
|
try {
|
|
201
262
|
(0, db_instance_1.getDbInstance)()
|
|
202
263
|
.prepare(`
|
|
203
264
|
INSERT INTO app_settings (key, value, created_at, updated_at)
|
|
204
|
-
VALUES (?, ?, ?, ?)
|
|
265
|
+
VALUES (?, ?, ?, ?), (?, ?, ?, ?)
|
|
205
266
|
ON CONFLICT(key) DO UPDATE SET
|
|
206
267
|
value = excluded.value,
|
|
207
268
|
updated_at = excluded.updated_at
|
|
208
269
|
`)
|
|
209
|
-
.run(keyFor(worktreeId), String(at), at, at);
|
|
270
|
+
.run(keyFor(worktreeId), String(at), at, at, episodeKeyFor(worktreeId), `${at}:${episodeId ?? ''}`, at, at);
|
|
210
271
|
}
|
|
211
272
|
catch (error) {
|
|
212
273
|
logger.debug('prompt-card-write-failed', {
|
|
@@ -218,8 +279,9 @@ function writeRow(worktreeId, at) {
|
|
|
218
279
|
/** @returns True when a row was actually removed. Never throws. */
|
|
219
280
|
function deleteRow(worktreeId) {
|
|
220
281
|
try {
|
|
221
|
-
return ((0, db_instance_1.getDbInstance)()
|
|
222
|
-
.
|
|
282
|
+
return ((0, db_instance_1.getDbInstance)()
|
|
283
|
+
.prepare('DELETE FROM app_settings WHERE key IN (?, ?)')
|
|
284
|
+
.run(keyFor(worktreeId), episodeKeyFor(worktreeId)).changes > 0);
|
|
223
285
|
}
|
|
224
286
|
catch (error) {
|
|
225
287
|
logger.debug('prompt-card-delete-failed', {
|
|
@@ -235,10 +297,49 @@ function deleteRow(worktreeId) {
|
|
|
235
297
|
* Idempotent by overwrite: a second prompt in the same worktree (another
|
|
236
298
|
* instance, or the #1790 reminder) replaces the same card on the device, so it
|
|
237
299
|
* refreshes the timestamp rather than adding an entry.
|
|
300
|
+
*
|
|
301
|
+
* @param episodeId Issue #3798: the waiting episode this card is about, or
|
|
302
|
+
* null when the producer did not name one. The last card's id replaces the
|
|
303
|
+
* previous one — the device shows one card per worktree.
|
|
238
304
|
*/
|
|
239
|
-
function markPromptCardShown(worktreeId, at = Date.now()) {
|
|
305
|
+
function markPromptCardShown(worktreeId, at = Date.now(), episodeId = null) {
|
|
240
306
|
cards.set(worktreeId, at);
|
|
241
|
-
|
|
307
|
+
cardEpisodes.set(worktreeId, episodeId);
|
|
308
|
+
writeRow(worktreeId, at, episodeId);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Take this worktree's next prompt push order (Issue #3798). Never throws.
|
|
312
|
+
*
|
|
313
|
+
* One statement reads and advances the counter, so two decisions never share a
|
|
314
|
+
* value — not even within the same millisecond — and it survives a restart
|
|
315
|
+
* with the database. The episode's `since` cannot do this job: a structured
|
|
316
|
+
* since is reused by the next episode and can be older than the observation.
|
|
317
|
+
*
|
|
318
|
+
* @returns The new value, or null when storage cannot answer; the push then
|
|
319
|
+
* carries no order and the Service Worker treats it as it did before #3798.
|
|
320
|
+
*/
|
|
321
|
+
function nextPromptOrder(worktreeId, at = Date.now()) {
|
|
322
|
+
try {
|
|
323
|
+
const row = (0, db_instance_1.getDbInstance)()
|
|
324
|
+
.prepare(`
|
|
325
|
+
INSERT INTO app_settings (key, value, created_at, updated_at)
|
|
326
|
+
VALUES (?, '1', ?, ?)
|
|
327
|
+
ON CONFLICT(key) DO UPDATE SET
|
|
328
|
+
value = CAST(app_settings.value AS INTEGER) + 1,
|
|
329
|
+
updated_at = excluded.updated_at
|
|
330
|
+
RETURNING value
|
|
331
|
+
`)
|
|
332
|
+
.get(`${exports.PROMPT_ORDER_KEY_PREFIX}${worktreeId}`, at, at);
|
|
333
|
+
const order = Number(row?.value);
|
|
334
|
+
return Number.isSafeInteger(order) && order > 0 ? order : null;
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
logger.debug('prompt-order-advance-failed', {
|
|
338
|
+
worktreeId,
|
|
339
|
+
error: error instanceof Error ? error.message : String(error),
|
|
340
|
+
});
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
242
343
|
}
|
|
243
344
|
/**
|
|
244
345
|
* Whether a prompt card for this worktree was fanned out and not yet cleared.
|
|
@@ -253,21 +354,38 @@ function markPromptCardShown(worktreeId, at = Date.now()) {
|
|
|
253
354
|
* {@link PROMPT_CARD_MAX_AGE_MS} without a fake clock.
|
|
254
355
|
*/
|
|
255
356
|
function hasPromptCard(worktreeId, now = Date.now()) {
|
|
256
|
-
const
|
|
257
|
-
|
|
357
|
+
const remembered = cards.get(worktreeId);
|
|
358
|
+
const mark = remembered !== undefined
|
|
359
|
+
? { at: remembered, episodeId: cardEpisodes.get(worktreeId) ?? null }
|
|
360
|
+
: readRow(worktreeId);
|
|
361
|
+
if (mark === null)
|
|
258
362
|
return false;
|
|
259
|
-
if (isExpired(at, now)) {
|
|
363
|
+
if (isExpired(mark.at, now)) {
|
|
260
364
|
// Dropped as it is read rather than by a sweep: this is the only question
|
|
261
365
|
// asked about a given worktree's card, so the read is the moment the
|
|
262
366
|
// expiry becomes observable, and there is nothing a background pass would
|
|
263
367
|
// catch earlier.
|
|
264
368
|
cards.delete(worktreeId);
|
|
369
|
+
cardEpisodes.delete(worktreeId);
|
|
265
370
|
deleteRow(worktreeId);
|
|
266
371
|
return false;
|
|
267
372
|
}
|
|
268
|
-
cards.set(worktreeId, at);
|
|
373
|
+
cards.set(worktreeId, mark.at);
|
|
374
|
+
cardEpisodes.set(worktreeId, mark.episodeId);
|
|
269
375
|
return true;
|
|
270
376
|
}
|
|
377
|
+
/**
|
|
378
|
+
* The episode id the worktree's outstanding card was sent for (Issue #3798),
|
|
379
|
+
* or null — no card, or a card marked without an id (including every mark an
|
|
380
|
+
* older server wrote). Read the same way {@link hasPromptCard} reads the mark:
|
|
381
|
+
* memory first, storage after a restart. Does not expire anything; ask
|
|
382
|
+
* {@link hasPromptCard} first.
|
|
383
|
+
*/
|
|
384
|
+
function getPromptCardEpisodeId(worktreeId) {
|
|
385
|
+
if (cards.has(worktreeId))
|
|
386
|
+
return cardEpisodes.get(worktreeId) ?? null;
|
|
387
|
+
return readRow(worktreeId)?.episodeId ?? null;
|
|
388
|
+
}
|
|
271
389
|
/**
|
|
272
390
|
* Forget this worktree's card, in memory and in storage.
|
|
273
391
|
*
|
|
@@ -277,6 +395,7 @@ function hasPromptCard(worktreeId, now = Date.now()) {
|
|
|
277
395
|
* from `app_settings` still reports as cleared.
|
|
278
396
|
*/
|
|
279
397
|
function clearPromptCard(worktreeId) {
|
|
398
|
+
cardEpisodes.delete(worktreeId);
|
|
280
399
|
const wasInMemory = cards.delete(worktreeId);
|
|
281
400
|
const wasPersisted = deleteRow(worktreeId);
|
|
282
401
|
return wasInMemory || wasPersisted;
|
|
@@ -290,10 +409,11 @@ function clearPromptCard(worktreeId) {
|
|
|
290
409
|
*/
|
|
291
410
|
function clearAllPromptCards() {
|
|
292
411
|
cards.clear();
|
|
412
|
+
cardEpisodes.clear();
|
|
293
413
|
try {
|
|
294
414
|
(0, db_instance_1.getDbInstance)()
|
|
295
|
-
.prepare('DELETE FROM app_settings WHERE key GLOB ?')
|
|
296
|
-
.run(`${exports.PROMPT_CARD_KEY_PREFIX}*`);
|
|
415
|
+
.prepare('DELETE FROM app_settings WHERE key GLOB ? OR key GLOB ?')
|
|
416
|
+
.run(`${exports.PROMPT_CARD_KEY_PREFIX}*`, `${exports.PROMPT_CARD_EPISODE_KEY_PREFIX}*`);
|
|
297
417
|
}
|
|
298
418
|
catch (error) {
|
|
299
419
|
logger.debug('prompt-card-clear-all-failed', {
|
|
@@ -312,6 +432,7 @@ function clearAllPromptCards() {
|
|
|
312
432
|
*/
|
|
313
433
|
function forgetPromptCardMemory() {
|
|
314
434
|
cards.clear();
|
|
435
|
+
cardEpisodes.clear();
|
|
315
436
|
}
|
|
316
437
|
/**
|
|
317
438
|
* How many worktrees have an outstanding, unexpired card. Test seam.
|