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
|
@@ -47,6 +47,12 @@
|
|
|
47
47
|
* `at` lines up with the current wait. Here that is `at >= waitingSince` — the
|
|
48
48
|
* suppression was recorded at or after this episode opened. A record from an
|
|
49
49
|
* earlier episode is older than `since` and is ignored.
|
|
50
|
+
* Issue #3798: a record that names its episode (`episodeId`) is matched to a
|
|
51
|
+
* wait that names one by that id instead, since two episodes can share a
|
|
52
|
+
* `since`; either side without an id falls back to the time comparison. A
|
|
53
|
+
* record of the episode the poller then answered (`lastAnswer`), written
|
|
54
|
+
* before that answer, is not the wait's reason any more: the success path of
|
|
55
|
+
* a send does not clear the record, and the answer is the newer fact.
|
|
50
56
|
*
|
|
51
57
|
* The poller re-evaluates a suppressed prompt on every poll (the duplicate
|
|
52
58
|
* guard only remembers *answered* prompts), so `at` stays current for as long
|
|
@@ -75,6 +81,20 @@
|
|
|
75
81
|
* second prompt right after an answer gets a full hold of its own. Both
|
|
76
82
|
* producers ask through {@link decideAndLogPromptPush} and share that origin.
|
|
77
83
|
*
|
|
84
|
+
* ## Which hold belongs to which wait (Issue #3798)
|
|
85
|
+
*
|
|
86
|
+
* A wait is named by its episode id when the caller has one
|
|
87
|
+
* (`waitingEpisodeId`), and by `waitingSince` when it does not. The two are
|
|
88
|
+
* matched by the rule {@link isSameWait} states, the same rule the episode
|
|
89
|
+
* dedup in `notification-dedup` uses: both ids present and equal, or one of
|
|
90
|
+
* them absent and the `since`s equal. So an id-less producer (opencode's
|
|
91
|
+
* question push, or the response poller when its commit changed nothing —
|
|
92
|
+
* otherwise it names the episode it committed) and the id-bearing notifier asking about
|
|
93
|
+
* one wait share one hold, and the session wait's tick (#3796) is read once,
|
|
94
|
+
* when that hold begins. A rebind keeps the id, so it keeps the hold and its
|
|
95
|
+
* end; a replacement brings a new id, so it begins a new hold that reads the
|
|
96
|
+
* tick at its own start — even when the new wait reuses the old `since`.
|
|
97
|
+
*
|
|
78
98
|
* ## The hold reaches the session wait's tick (Issue #3791)
|
|
79
99
|
*
|
|
80
100
|
* The 9 s assume the poller's next tick is at most a cooldown away. Its ticks
|
|
@@ -93,6 +113,38 @@
|
|
|
93
113
|
* that tick forward to a poll interval, and the hold follows it — the tick is
|
|
94
114
|
* only ever read earlier than it was when the hold began.
|
|
95
115
|
*
|
|
116
|
+
* The other tick past the 9 s is the duplicate guard's (#306). A prompt with
|
|
117
|
+
* the type and question of the one the poller just answered — Claude's
|
|
118
|
+
* consecutive Bash approvals all ask `Do you want to proceed?` — is not
|
|
119
|
+
* answered for `DUPLICATE_RETRY_EXPIRY_MS` (10 s) after that answer, and is
|
|
120
|
+
* answered on the first tick after. While the poller reports that the guard
|
|
121
|
+
* actually held back the prompt of this wait (`duplicateRetryReservation`,
|
|
122
|
+
* review N1: its tick matched the guard's key, since this wait opened, and no
|
|
123
|
+
* tick since read another screen, no prompt, no session or failed; the tick
|
|
124
|
+
* sending the retry keeps it until that send is settled, review N3) the hold
|
|
125
|
+
* also lasts until that retry plus two ticks: {@link duplicateRetryHoldEndsAt}.
|
|
126
|
+
* An answer alone does not: a different screen the poller will not answer, or
|
|
127
|
+
* an error backoff, after an answer still notifies at the usual 9 s. Read on
|
|
128
|
+
* every decision, not once: the reservation appears on the poller's next tick,
|
|
129
|
+
* after the wait may already be held, and the notifier asks again when the 9 s
|
|
130
|
+
* end.
|
|
131
|
+
*
|
|
132
|
+
* ## A wait the poller answered is not "not answered" (Issue #3798)
|
|
133
|
+
*
|
|
134
|
+
* The poller records which episode its answer went to (`lastAnswer`, read off
|
|
135
|
+
* its state on `globalThis` like the answer's time), and closes that episode
|
|
136
|
+
* when the confirmation is gone. Until a frame says so — the agent works on
|
|
137
|
+
* over frames no rule reads — the episode stays open, and its hold can run
|
|
138
|
+
* out. That end is not "Auto-Yes did not answer": when the wait asked about
|
|
139
|
+
* names its id and it is the answered episode, still open and not a screen
|
|
140
|
+
* only a person drives, the gate says `auto-yes-answered` and stays quiet.
|
|
141
|
+
* Another confirmation in the same turn is another episode (R1-7), and a
|
|
142
|
+
* survey or a picker after the answer turns the episode into a `screen`: both
|
|
143
|
+
* notify as before. Without an id on either side nothing is matched, and the
|
|
144
|
+
* hold's end notifies as before. The hold itself is unchanged — its start, its
|
|
145
|
+
* end, the session wait's tick (#3796) and the duplicate guard's retry (#3791)
|
|
146
|
+
* are counted as above.
|
|
147
|
+
*
|
|
96
148
|
* ## The reminder is never muted
|
|
97
149
|
*
|
|
98
150
|
* `runEscalationTick` has already established that the wait is still open — it
|
|
@@ -109,17 +161,20 @@
|
|
|
109
161
|
*/
|
|
110
162
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
111
163
|
exports.AUTO_YES_HOLD_MAX_AGE_MS = exports.AUTO_YES_ANSWER_AFTER_TICK_MS = exports.AUTO_YES_ANSWER_GRACE_MS = void 0;
|
|
164
|
+
exports.isSameWait = isSameWait;
|
|
112
165
|
exports.autoYesHoldStartedAt = autoYesHoldStartedAt;
|
|
113
166
|
exports.autoYesHoldEndsAt = autoYesHoldEndsAt;
|
|
114
167
|
exports.forgetAutoYesHold = forgetAutoYesHold;
|
|
115
168
|
exports.clearAutoYesHolds = clearAutoYesHolds;
|
|
116
169
|
exports.decidePromptPush = decidePromptPush;
|
|
170
|
+
exports.autoYesAnsweredWait = autoYesAnsweredWait;
|
|
117
171
|
exports.isPromptPushSuppressed = isPromptPushSuppressed;
|
|
118
172
|
exports.decideAndLogPromptPush = decideAndLogPromptPush;
|
|
119
173
|
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
120
174
|
const logger_1 = require("../../lib/logger");
|
|
121
175
|
const auto_yes_suppression_state_1 = require("../../lib/polling/auto-yes-suppression-state");
|
|
122
176
|
const global_state_1 = require("../../lib/global-state");
|
|
177
|
+
const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
|
|
123
178
|
const logger = (0, logger_1.createLogger)('push/prompt-gate');
|
|
124
179
|
/**
|
|
125
180
|
* How long a wait with nothing recorded about it is held as "Auto-Yes is
|
|
@@ -132,6 +187,20 @@ const logger = (0, logger_1.createLogger)('push/prompt-gate');
|
|
|
132
187
|
exports.AUTO_YES_ANSWER_GRACE_MS = Math.max(3 * auto_yes_state_1.POLLING_INTERVAL_MS, auto_yes_state_1.COOLDOWN_INTERVAL_MS + 2 * auto_yes_state_1.POLLING_INTERVAL_MS);
|
|
133
188
|
/** compositeKey -> the hold of that session's current episode. globalThis per #1736. */
|
|
134
189
|
const autoYesHolds = (0, global_state_1.getOrInitGlobal)('__promptPushAutoYesHolds', () => new Map());
|
|
190
|
+
/**
|
|
191
|
+
* Whether two names are the same wait (Issue #3798): both ids present and
|
|
192
|
+
* equal, or one of them absent and the `since`s equal. The id decides whenever
|
|
193
|
+
* both sides have one — two waits can share a `since` (the same millisecond, a
|
|
194
|
+
* structured `at` reused by the next prompt), and one wait keeps its id across
|
|
195
|
+
* a rebind.
|
|
196
|
+
*/
|
|
197
|
+
function isSameWait(a, b) {
|
|
198
|
+
const aId = a.episodeId ?? null;
|
|
199
|
+
const bId = b.episodeId ?? null;
|
|
200
|
+
if (aId !== null && bId !== null)
|
|
201
|
+
return aId === bId;
|
|
202
|
+
return a.since === b.since;
|
|
203
|
+
}
|
|
135
204
|
/**
|
|
136
205
|
* Where this wait's `auto-yes-answering` hold is counted from (Issue #3757):
|
|
137
206
|
* the later of the moment the gate first held this episode (recorded here on
|
|
@@ -146,11 +215,21 @@ const autoYesHolds = (0, global_state_1.getOrInitGlobal)('__promptPushAutoYesHol
|
|
|
146
215
|
function autoYesHoldStartedAt(input, now) {
|
|
147
216
|
const key = (0, auto_yes_state_1.buildCompositeKey)(input.worktreeId, input.cliToolId, input.instanceId);
|
|
148
217
|
sweepStaleAutoYesHolds(now);
|
|
218
|
+
const episodeId = input.waitingEpisodeId ?? undefined;
|
|
149
219
|
let hold = autoYesHolds.get(key);
|
|
150
|
-
if (hold === undefined || hold
|
|
151
|
-
hold = {
|
|
220
|
+
if (hold === undefined || !isSameWait(hold, { since: input.waitingSince, episodeId })) {
|
|
221
|
+
hold = {
|
|
222
|
+
since: input.waitingSince,
|
|
223
|
+
...(episodeId !== undefined ? { episodeId } : {}),
|
|
224
|
+
firstHeldAt: now,
|
|
225
|
+
sessionWaitTick: pendingSessionWaitTick(key, now),
|
|
226
|
+
};
|
|
152
227
|
autoYesHolds.set(key, hold);
|
|
153
228
|
}
|
|
229
|
+
else if (hold.episodeId === undefined && episodeId !== undefined) {
|
|
230
|
+
// Issue #3798: an id-less caller began this hold; the wait is now named.
|
|
231
|
+
hold.episodeId = episodeId;
|
|
232
|
+
}
|
|
154
233
|
// Issue #3770: Auto-Yes switched off and on again inside one episode starts a
|
|
155
234
|
// fresh hold; the old origin would read the poller's silence while it was off
|
|
156
235
|
// as "did not answer".
|
|
@@ -199,7 +278,8 @@ function effectiveSessionWaitTickAt(tick) {
|
|
|
199
278
|
* When this wait's `auto-yes-answering` hold ends (Issue #3791): a full
|
|
200
279
|
* {@link AUTO_YES_ANSWER_GRACE_MS} after {@link autoYesHoldStartedAt}, and not
|
|
201
280
|
* before {@link AUTO_YES_ANSWER_AFTER_TICK_MS} past the session wait's tick
|
|
202
|
-
* pending when the hold began — while the poller that scheduled it still runs
|
|
281
|
+
* pending when the hold began — while the poller that scheduled it still runs —
|
|
282
|
+
* nor past the duplicate guard's retry the poller reserved for this wait.
|
|
203
283
|
*
|
|
204
284
|
* @param now - Epoch ms of the decision; recorded as the start of a new hold
|
|
205
285
|
*/
|
|
@@ -208,14 +288,35 @@ function autoYesHoldEndsAt(input, now) {
|
|
|
208
288
|
const key = (0, auto_yes_state_1.buildCompositeKey)(input.worktreeId, input.cliToolId, input.instanceId);
|
|
209
289
|
const tick = autoYesHolds.get(key)?.sessionWaitTick;
|
|
210
290
|
const graceEndsAt = startedAt + exports.AUTO_YES_ANSWER_GRACE_MS;
|
|
291
|
+
const holdEndsAt = Math.max(graceEndsAt, duplicateRetryHoldEndsAt(key, input.waitingSince));
|
|
211
292
|
// A poller stopped or replaced since (disable, off → on) will not tick.
|
|
212
293
|
if (tick === undefined || globalThis.__autoYesPollerStates?.get(key) !== tick.poller)
|
|
213
|
-
return
|
|
294
|
+
return holdEndsAt;
|
|
214
295
|
// Kept on the hold: an earlier tick once adopted is not lost when the poller
|
|
215
296
|
// later reschedules (an ordinary tick after a failed capture, a new session
|
|
216
297
|
// wait) — the hold never moves back out.
|
|
217
298
|
tick.at = effectiveSessionWaitTickAt(tick);
|
|
218
|
-
return Math.max(
|
|
299
|
+
return Math.max(holdEndsAt, tick.at + exports.AUTO_YES_ANSWER_AFTER_TICK_MS);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Issue #3791: when the duplicate guard (#306) lets the running poller answer
|
|
303
|
+
* again, plus {@link AUTO_YES_ANSWER_AFTER_TICK_MS} — or -Infinity unless the
|
|
304
|
+
* poller reserved that retry for this wait (review N1): a reservation on the
|
|
305
|
+
* live poller (`__autoYesPollerStates`, so a stopped or replaced one has none),
|
|
306
|
+
* made by a tick since the wait opened, for the answer the guard still counts
|
|
307
|
+
* from. Read off `globalThis` for the reason {@link autoYesHoldStartedAt} gives.
|
|
308
|
+
*/
|
|
309
|
+
function duplicateRetryHoldEndsAt(key, waitingSince) {
|
|
310
|
+
const poller = globalThis.__autoYesPollerStates?.get(key);
|
|
311
|
+
const reservation = poller?.duplicateRetryReservation;
|
|
312
|
+
if (poller === undefined || reservation === undefined || reservation === null)
|
|
313
|
+
return -Infinity;
|
|
314
|
+
if (reservation.observedAt < waitingSince)
|
|
315
|
+
return -Infinity;
|
|
316
|
+
if (reservation.answeredAt !== poller.lastAnsweredAt || reservation.promptKey !== poller.lastAnsweredPromptKey) {
|
|
317
|
+
return -Infinity;
|
|
318
|
+
}
|
|
319
|
+
return reservation.answeredAt + auto_yes_state_1.DUPLICATE_RETRY_EXPIRY_MS + exports.AUTO_YES_ANSWER_AFTER_TICK_MS;
|
|
219
320
|
}
|
|
220
321
|
/** A hold older than this is dropped (Issue #3770): its episode is long over. */
|
|
221
322
|
exports.AUTO_YES_HOLD_MAX_AGE_MS = 60 * 60 * 1000;
|
|
@@ -229,14 +330,21 @@ function sweepStaleAutoYesHolds(now) {
|
|
|
229
330
|
* Drop the hold of one session (Issue #3770): Auto-Yes went off, or the
|
|
230
331
|
* episode closed.
|
|
231
332
|
*
|
|
232
|
-
* @param
|
|
333
|
+
* @param wait - Issue #3776: drop it only when it is this episode's hold. A
|
|
233
334
|
* caller retiring one episode must not take the next episode's origin with it
|
|
234
335
|
* (that hold would start over, and its notification come up to a hold late).
|
|
235
|
-
*
|
|
336
|
+
* A number is the episode's `since`; Issue #3798 adds the episode's id, matched
|
|
337
|
+
* by {@link isSameWait}. Omitted, the session's hold goes whatever its episode.
|
|
236
338
|
*/
|
|
237
|
-
function forgetAutoYesHold(key,
|
|
238
|
-
if (
|
|
239
|
-
|
|
339
|
+
function forgetAutoYesHold(key, wait) {
|
|
340
|
+
if (wait !== undefined) {
|
|
341
|
+
const hold = autoYesHolds.get(key);
|
|
342
|
+
if (hold === undefined)
|
|
343
|
+
return;
|
|
344
|
+
const identity = typeof wait === 'number' ? { since: wait } : wait;
|
|
345
|
+
if (!isSameWait(hold, identity))
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
240
348
|
autoYesHolds.delete(key);
|
|
241
349
|
}
|
|
242
350
|
/** Forget every hold. Test seam. */
|
|
@@ -251,13 +359,16 @@ function clearAutoYesHolds() {
|
|
|
251
359
|
* rather than only the outcome.
|
|
252
360
|
*/
|
|
253
361
|
function decidePromptPush(input) {
|
|
254
|
-
const { worktreeId, cliToolId, instanceId
|
|
362
|
+
const { worktreeId, cliToolId, instanceId } = input;
|
|
255
363
|
const state = (0, auto_yes_state_1.getAutoYesState)(worktreeId, cliToolId, instanceId);
|
|
256
364
|
if (state === null || !state.enabled) {
|
|
257
365
|
return { suppress: false, reason: 'auto-yes-inactive', stopReason: state?.stopReason };
|
|
258
366
|
}
|
|
259
367
|
const suppression = (0, auto_yes_suppression_state_1.getLastPolicySuppression)(worktreeId, cliToolId, instanceId);
|
|
260
|
-
if (suppression !== null &&
|
|
368
|
+
if (suppression !== null &&
|
|
369
|
+
suppressionBelongsToWait(suppression, input) &&
|
|
370
|
+
// The answer that came after the record is the newer fact (Issue #3798).
|
|
371
|
+
!(0, auto_yes_suppression_state_1.suppressionPredatesAnswer)(suppression, input.waitingEpisodeId, answerTo(input))) {
|
|
261
372
|
return { suppress: false, reason: 'policy-withheld', suppressedBy: suppression.reason };
|
|
262
373
|
}
|
|
263
374
|
if (input.escalated === true) {
|
|
@@ -265,10 +376,44 @@ function decidePromptPush(input) {
|
|
|
265
376
|
}
|
|
266
377
|
const holdEndsAt = input.holdEndsAt ?? (input.holdStartedAt !== undefined ? input.holdStartedAt + exports.AUTO_YES_ANSWER_GRACE_MS : undefined);
|
|
267
378
|
if (holdEndsAt !== undefined && (input.now ?? Date.now()) >= holdEndsAt) {
|
|
379
|
+
if (autoYesAnsweredWait(input))
|
|
380
|
+
return { suppress: true, reason: 'auto-yes-answered' };
|
|
268
381
|
return { suppress: false, reason: 'auto-yes-not-answered' };
|
|
269
382
|
}
|
|
270
383
|
return { suppress: true, reason: 'auto-yes-answering' };
|
|
271
384
|
}
|
|
385
|
+
/**
|
|
386
|
+
* Whether the Auto-Yes poller answered this wait (Issue #3798): the caller
|
|
387
|
+
* names the episode, the poller's `lastAnswer` names the same one, and that
|
|
388
|
+
* episode is still the one open and not a screen only a person drives (a
|
|
389
|
+
* survey or a picker after the answer is rebound to `screen` under the same
|
|
390
|
+
* id, and a person has to act on it). Read off the poller state on
|
|
391
|
+
* `globalThis`, as {@link autoYesHoldStartedAt} reads the answer's time.
|
|
392
|
+
*/
|
|
393
|
+
function autoYesAnsweredWait(input) {
|
|
394
|
+
const waitId = input.waitingEpisodeId ?? null;
|
|
395
|
+
if (waitId === null || answerTo(input)?.episodeId !== waitId)
|
|
396
|
+
return false;
|
|
397
|
+
const episode = (0, waiting_episode_state_1.getWaitingEpisodeRecord)(input.worktreeId, input.cliToolId, input.instanceId);
|
|
398
|
+
return episode !== null && episode.episodeId === waitId && episode.binding.kind !== 'screen';
|
|
399
|
+
}
|
|
400
|
+
/** The poller's `lastAnswer` for this instance, read off `globalThis` (Issue #3798). */
|
|
401
|
+
function answerTo(input) {
|
|
402
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(input.worktreeId, input.cliToolId, input.instanceId);
|
|
403
|
+
return globalThis.__autoYesPollerStates?.get(key)?.lastAnswer ?? null;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Whether a policy-suppression record is about this wait (Issue #3798). By the
|
|
407
|
+
* episode id when both the record and the caller carry one — a record written
|
|
408
|
+
* for an earlier episode is not this wait's reason however recent its `at` —
|
|
409
|
+
* and by #1684's `at >= waitingSince` otherwise.
|
|
410
|
+
*/
|
|
411
|
+
function suppressionBelongsToWait(suppression, input) {
|
|
412
|
+
const waitId = input.waitingEpisodeId ?? null;
|
|
413
|
+
if (suppression.episodeId !== undefined && waitId !== null)
|
|
414
|
+
return suppression.episodeId === waitId;
|
|
415
|
+
return suppression.at >= input.waitingSince;
|
|
416
|
+
}
|
|
272
417
|
/**
|
|
273
418
|
* {@link decidePromptPush}, logged.
|
|
274
419
|
*
|
|
@@ -303,6 +448,7 @@ function decideAndLogPromptPush(input, options = {}) {
|
|
|
303
448
|
cliToolId: input.cliToolId,
|
|
304
449
|
instanceId: input.instanceId ?? input.cliToolId,
|
|
305
450
|
waitingSince: input.waitingSince,
|
|
451
|
+
...(input.waitingEpisodeId ? { waitingEpisodeId: input.waitingEpisodeId } : {}),
|
|
306
452
|
escalated: input.escalated === true,
|
|
307
453
|
reason: decision.reason,
|
|
308
454
|
...(decision.stopReason !== undefined ? { stopReason: decision.stopReason } : {}),
|
|
@@ -160,7 +160,9 @@ function buildFailureBody(event, messages, excerpt, locale) {
|
|
|
160
160
|
: messages[keys.plain];
|
|
161
161
|
}
|
|
162
162
|
/** Build the minimal notification payload for an event, in the reader's language. */
|
|
163
|
-
function buildPushPayload(event, locale = i18n_config_1.DEFAULT_LOCALE, now = Date.now()
|
|
163
|
+
function buildPushPayload(event, locale = i18n_config_1.DEFAULT_LOCALE, now = Date.now(),
|
|
164
|
+
/** Issue #3798: the prompt push order taken for this fan-out, if any. */
|
|
165
|
+
order = null) {
|
|
164
166
|
const excerpt = buildExcerpt(event.excerpt);
|
|
165
167
|
const agentSuffix = event.agentName ? ` (${event.agentName})` : '';
|
|
166
168
|
const title = `${event.worktreeName}${agentSuffix}`;
|
|
@@ -208,6 +210,12 @@ function buildPushPayload(event, locale = i18n_config_1.DEFAULT_LOCALE, now = Da
|
|
|
208
210
|
timestamp: now,
|
|
209
211
|
...(event.waitingKind ? { waitingKind: event.waitingKind } : {}),
|
|
210
212
|
...(event.resolved === true ? { resolved: true } : {}),
|
|
213
|
+
...(event.kind === 'prompt' && event.resolved !== true && event.waitingEpisodeId
|
|
214
|
+
? { episodeId: event.waitingEpisodeId, ...(typeof order === 'number' ? { order } : {}) }
|
|
215
|
+
: {}),
|
|
216
|
+
...(event.resolved === true && event.resolvedEpisodeId
|
|
217
|
+
? { resolvedEpisodeId: event.resolvedEpisodeId, ...(typeof order === 'number' ? { order } : {}) }
|
|
218
|
+
: {}),
|
|
211
219
|
};
|
|
212
220
|
}
|
|
213
221
|
/**
|
|
@@ -296,6 +304,7 @@ function passesDedup(event) {
|
|
|
296
304
|
worktreeId: event.worktreeId,
|
|
297
305
|
instanceId: event.instanceId ?? event.agentName ?? '',
|
|
298
306
|
since: event.waitingSince,
|
|
307
|
+
episodeId: event.waitingEpisodeId,
|
|
299
308
|
escalated: event.escalated,
|
|
300
309
|
});
|
|
301
310
|
}
|
|
@@ -334,8 +343,19 @@ async function notifyPushSubscribers(event, now = Date.now()) {
|
|
|
334
343
|
// itself does not mark; it clears, and it does so in its own module so each
|
|
335
344
|
// direction has one writer.
|
|
336
345
|
if (event.kind === 'prompt' && event.resolved !== true) {
|
|
337
|
-
|
|
346
|
+
// Issue #3798: with the episode's id, so the resolution can tell its own
|
|
347
|
+
// card from a newer one (`resolvedEpisodeId`).
|
|
348
|
+
(0, prompt_card_state_1.markPromptCardShown)(event.worktreeId, now, event.waitingEpisodeId ?? null);
|
|
338
349
|
}
|
|
350
|
+
// Issue #3798: the order is taken here, synchronously with the decision to
|
|
351
|
+
// send — for a resolution, in the same tick `notifyPromptResolved` found
|
|
352
|
+
// nothing waiting — so a card taken after it compares greater on every
|
|
353
|
+
// device, whichever arrives first. Only pushes the Service Worker compares
|
|
354
|
+
// take one: an episode-named card, and a resolution naming its episode.
|
|
355
|
+
const order = event.kind === 'prompt' &&
|
|
356
|
+
(event.resolved === true ? Boolean(event.resolvedEpisodeId) : Boolean(event.waitingEpisodeId))
|
|
357
|
+
? (0, prompt_card_state_1.nextPromptOrder)(event.worktreeId, now)
|
|
358
|
+
: null;
|
|
339
359
|
web_push_1.default.setVapidDetails(config.subject, config.publicKey, config.privateKey);
|
|
340
360
|
// Devices can be registered in different languages, so the body is built per
|
|
341
361
|
// distinct locale rather than once for the whole fan-out.
|
|
@@ -349,7 +369,7 @@ async function notifyPushSubscribers(event, now = Date.now()) {
|
|
|
349
369
|
byLocale.set(locale, [sub]);
|
|
350
370
|
}
|
|
351
371
|
const outcomes = (await Promise.all(Array.from(byLocale, ([locale, subs]) => {
|
|
352
|
-
const payload = JSON.stringify(buildPushPayload(event, locale, now));
|
|
372
|
+
const payload = JSON.stringify(buildPushPayload(event, locale, now, order));
|
|
353
373
|
return Promise.all(subs.map((sub) => sendToOne(sub, payload, now)));
|
|
354
374
|
}))).flat();
|
|
355
375
|
// Issue #2124: a fan-out that reached nobody used to be indistinguishable
|
|
@@ -56,6 +56,16 @@
|
|
|
56
56
|
* exist, so a single-device install sends exactly as many pushes as it did
|
|
57
57
|
* before this module was written — zero extra.
|
|
58
58
|
*
|
|
59
|
+
* ## Which card it clears (Issue #3798)
|
|
60
|
+
*
|
|
61
|
+
* The resolution names the episode the card mark was last sent for
|
|
62
|
+
* (`resolvedEpisodeId`). A resolution can reach a device after the card of a
|
|
63
|
+
* newer wait in the same worktree — the next prompt's push overtook it — and
|
|
64
|
+
* without the name the Service Worker would close that newer, still-true card.
|
|
65
|
+
* With it, the worker closes only this episode's cards (and cards that name no
|
|
66
|
+
* episode) and re-shows the newer one silently. A mark without an id sends a
|
|
67
|
+
* resolution without one, which the worker handles exactly as before.
|
|
68
|
+
*
|
|
59
69
|
* `completion` and `failure` cards are deliberately left alone; the reasoning
|
|
60
70
|
* for each is in the design note under "which kinds are cleared".
|
|
61
71
|
*
|
|
@@ -170,6 +180,9 @@ async function notifyPromptResolved(input) {
|
|
|
170
180
|
reason: decision.reason,
|
|
171
181
|
...(decision.deviceCount !== undefined ? { deviceCount: decision.deviceCount } : {}),
|
|
172
182
|
};
|
|
183
|
+
// Issue #3798: read before the mark is cleared below; `decidePromptResolution`
|
|
184
|
+
// has just adopted it into memory, so this is not a second query.
|
|
185
|
+
const resolvedEpisodeId = decision.send ? (0, prompt_card_state_1.getPromptCardEpisodeId)(worktreeId) : null;
|
|
173
186
|
if (decision.reason !== 'still-waiting') {
|
|
174
187
|
(0, prompt_card_state_1.clearPromptCard)(worktreeId);
|
|
175
188
|
}
|
|
@@ -193,6 +206,7 @@ async function notifyPromptResolved(input) {
|
|
|
193
206
|
kind: 'prompt',
|
|
194
207
|
agentName,
|
|
195
208
|
resolved: true,
|
|
209
|
+
...(resolvedEpisodeId !== null ? { resolvedEpisodeId } : {}),
|
|
196
210
|
}, at);
|
|
197
211
|
logger.info('resolution-push-sent', context);
|
|
198
212
|
}
|