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,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auto-Yes's decision about the confirmation on screen (Issue #3821).
|
|
4
|
+
*
|
|
5
|
+
* Written by the poller's tick (`detectAndRespondToPrompt`), which is where the
|
|
6
|
+
* decision is actually made, and read by `buildCurrentOutput`, which publishes
|
|
7
|
+
* it as `autoYesDecision` next to the prompt. The answer surfaces show their
|
|
8
|
+
* panel under Auto-Yes for every decision but `answering`.
|
|
9
|
+
*
|
|
10
|
+
* ## What a record is tied to
|
|
11
|
+
*
|
|
12
|
+
* A record is published only while everything it was made under still holds:
|
|
13
|
+
*
|
|
14
|
+
* - the GRANT — the same `AutoYesState` object (`getAutoYesState` stores a new
|
|
15
|
+
* one on every enable and on expiry, as the tick's own generation check
|
|
16
|
+
* reads it, #3706), so turning Auto-Yes off and on again or letting it expire
|
|
17
|
+
* drops the old decision even with the same screen up;
|
|
18
|
+
* - the SESSION epoch (`getEnterFallbackSessionEpoch`): a relaunch drops it;
|
|
19
|
+
* - the CONFIRMATION ({@link matchesConfirmation}): the question and the
|
|
20
|
+
* options ({@link enterFallbackScreenKey}), AND what is being approved — the
|
|
21
|
+
* whole `approvalTarget` as read, with only the cursor on its option rows
|
|
22
|
+
* taken out ({@link approvalTargetRows}, the body's indent, `>` and blank
|
|
23
|
+
* rows kept, as #3817 reads it) — AND, for agy, the hook call the receipt
|
|
24
|
+
* was accepted for. Two approvals that differ only in their target (agy's
|
|
25
|
+
* file creation names the file only there, two commands that differ by an
|
|
26
|
+
* indent) are two confirmations. Two readings of one screen that differ in
|
|
27
|
+
* how many rows they kept (one cut from the top) are not matched either:
|
|
28
|
+
* the rows a cut leaves need not name what is approved (a diff row, not the
|
|
29
|
+
* file), and the hook call known now may be an earlier one's (review 3), so
|
|
30
|
+
* they read `none` — the panel opens, nothing is sent. The published
|
|
31
|
+
* `confirmation` ({@link autoYesConfirmationKey}) is this same identity: a
|
|
32
|
+
* record matches exactly when the keys are equal;
|
|
33
|
+
* - a TICK not long ago ({@link AUTO_YES_DECISION_STALE_MS}): a live poller
|
|
34
|
+
* re-decides every tick, so a record nobody refreshed says nothing now.
|
|
35
|
+
*
|
|
36
|
+
* Anything else — no record, another confirmation, an old grant — is `none`,
|
|
37
|
+
* never `answering`. A human's answer through `/prompt-response` drops the
|
|
38
|
+
* record (`./auto-yes-manual-answer`).
|
|
39
|
+
*
|
|
40
|
+
* Two confirmations identical in every part above, in a row, with no frame
|
|
41
|
+
* without a prompt between them, read as one here: nothing on the screen tells
|
|
42
|
+
* them apart. The tick re-decides on its next pass either way.
|
|
43
|
+
*
|
|
44
|
+
* Not the confirmation ledger (#3820): the ledger measures, never decides, and
|
|
45
|
+
* a failure in it changes nothing. This record is what the tick decided.
|
|
46
|
+
*
|
|
47
|
+
* In-memory and on `globalThis` for the reason `auto-yes-suppression-state`
|
|
48
|
+
* gives: the poller writes it and the `current-output` route reads it, and
|
|
49
|
+
* under `next dev` the two are bundled apart.
|
|
50
|
+
*
|
|
51
|
+
* @module lib/polling/auto-yes-decision-state
|
|
52
|
+
*/
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.AUTO_YES_DECISION_STALE_MS = void 0;
|
|
55
|
+
exports.approvalTargetRows = approvalTargetRows;
|
|
56
|
+
exports.autoYesConfirmationKey = autoYesConfirmationKey;
|
|
57
|
+
exports.matchesConfirmation = matchesConfirmation;
|
|
58
|
+
exports.recordAutoYesDecision = recordAutoYesDecision;
|
|
59
|
+
exports.reaffirmAutoYesAnswering = reaffirmAutoYesAnswering;
|
|
60
|
+
exports.getAutoYesDecisionRecord = getAutoYesDecisionRecord;
|
|
61
|
+
exports.forgetAutoYesDecision = forgetAutoYesDecision;
|
|
62
|
+
exports.forgetAutoYesDecisionsByWorktree = forgetAutoYesDecisionsByWorktree;
|
|
63
|
+
exports.clearAutoYesDecisions = clearAutoYesDecisions;
|
|
64
|
+
exports.publishAutoYesDecision = publishAutoYesDecision;
|
|
65
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
66
|
+
const auto_yes_decision_1 = require("../../types/auto-yes-decision");
|
|
67
|
+
const global_state_1 = require("../global-state");
|
|
68
|
+
const auto_yes_enter_fallback_state_1 = require("./auto-yes-enter-fallback-state");
|
|
69
|
+
const auto_yes_poller_state_1 = require("./auto-yes-poller-state");
|
|
70
|
+
const crypto_1 = require("crypto");
|
|
71
|
+
/**
|
|
72
|
+
* How long a record stays current without a tick refreshing it. The poller
|
|
73
|
+
* ticks every couple of seconds and refreshes the record on each tick that
|
|
74
|
+
* sees the screen; one past this is from a poller that is not ticking.
|
|
75
|
+
*/
|
|
76
|
+
exports.AUTO_YES_DECISION_STALE_MS = 30_000;
|
|
77
|
+
const decisions = (0, global_state_1.getOrInitGlobal)('__autoYesDecisions', () => new Map());
|
|
78
|
+
/**
|
|
79
|
+
* The rows of `approvalTarget` with only the cursor taken out of its option
|
|
80
|
+
* rows (`approvalTargetWithoutCursor`), or null when the prompt has none. The
|
|
81
|
+
* body stays as read: an indent, a `>` or a blank row is part of what is
|
|
82
|
+
* approved (#3817).
|
|
83
|
+
*/
|
|
84
|
+
function approvalTargetRows(promptData) {
|
|
85
|
+
const target = (0, auto_yes_poller_state_1.approvalTargetWithoutCursor)(promptData);
|
|
86
|
+
return target === null ? null : target.split('\n');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Which confirmation a reading is of: question and options
|
|
90
|
+
* ({@link enterFallbackScreenKey}), the approval target row for row
|
|
91
|
+
* ({@link approvalTargetRows}) and the agy call, hashed. The one identity both
|
|
92
|
+
* the record ({@link matchesConfirmation}) and the wire (`confirmation`, read
|
|
93
|
+
* by `laterAutoYesDecision`) use: same key, same confirmation; another key,
|
|
94
|
+
* another confirmation — or the same one read with other rows, which is not
|
|
95
|
+
* claimed to be the same.
|
|
96
|
+
*/
|
|
97
|
+
function autoYesConfirmationKey(identity) {
|
|
98
|
+
return (0, crypto_1.createHash)('sha256')
|
|
99
|
+
.update(JSON.stringify([
|
|
100
|
+
(0, auto_yes_enter_fallback_state_1.enterFallbackScreenKey)(identity.promptData),
|
|
101
|
+
approvalTargetRows(identity.promptData),
|
|
102
|
+
identity.callId ?? null,
|
|
103
|
+
]))
|
|
104
|
+
.digest('hex')
|
|
105
|
+
.slice(0, 32);
|
|
106
|
+
}
|
|
107
|
+
/** Is `record` about the confirmation `identity` describes? The same {@link autoYesConfirmationKey}. */
|
|
108
|
+
function matchesConfirmation(record, identity) {
|
|
109
|
+
return record.confirmation === autoYesConfirmationKey(identity);
|
|
110
|
+
}
|
|
111
|
+
/** Record what the tick decided for the prompt on screen. */
|
|
112
|
+
function recordAutoYesDecision(compositeKey, decision, at = Date.now()) {
|
|
113
|
+
decisions.set(compositeKey, {
|
|
114
|
+
state: decision.state,
|
|
115
|
+
reason: decision.state === 'withheld' ? decision.reason : null,
|
|
116
|
+
confirmation: autoYesConfirmationKey(decision),
|
|
117
|
+
grant: decision.grant,
|
|
118
|
+
epoch: decision.epoch,
|
|
119
|
+
at,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Issue #3821 (review 2): the duplicate guard (#306) says "answered less than
|
|
124
|
+
* `DUPLICATE_RETRY_EXPIRY_MS` ago", comparing only the type and the question.
|
|
125
|
+
* That is not evidence the confirmation on screen is the one answered, so the
|
|
126
|
+
* `answering` record is only kept — its time moved on — when it is the one
|
|
127
|
+
* this tick's send made: about this very confirmation, under the same grant
|
|
128
|
+
* and session. Otherwise the record is dropped (`none`).
|
|
129
|
+
*
|
|
130
|
+
* @returns Whether `answering` still stands
|
|
131
|
+
*/
|
|
132
|
+
function reaffirmAutoYesAnswering(compositeKey, tick, at = Date.now()) {
|
|
133
|
+
const record = decisions.get(compositeKey);
|
|
134
|
+
if (record === undefined ||
|
|
135
|
+
record.state !== 'answering' ||
|
|
136
|
+
record.grant !== tick.grant ||
|
|
137
|
+
record.epoch !== tick.epoch ||
|
|
138
|
+
!matchesConfirmation(record, tick)) {
|
|
139
|
+
decisions.delete(compositeKey);
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
decisions.set(compositeKey, { ...record, at });
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
/** The record as kept, or null. Test seam and diagnostics. */
|
|
146
|
+
function getAutoYesDecisionRecord(compositeKey) {
|
|
147
|
+
return decisions.get(compositeKey) ?? null;
|
|
148
|
+
}
|
|
149
|
+
/** Drop one instance's record: no prompt on screen, a human answered, the poller stopped. */
|
|
150
|
+
function forgetAutoYesDecision(compositeKey) {
|
|
151
|
+
decisions.delete(compositeKey);
|
|
152
|
+
}
|
|
153
|
+
/** {@link forgetAutoYesDecision} for every instance of a worktree. */
|
|
154
|
+
function forgetAutoYesDecisionsByWorktree(worktreeId) {
|
|
155
|
+
for (const key of (0, auto_yes_state_1.filterCompositeKeysByWorktree)([...decisions.keys()], worktreeId)) {
|
|
156
|
+
decisions.delete(key);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/** Drop every record: server shutdown, and a test seam. */
|
|
160
|
+
function clearAutoYesDecisions() {
|
|
161
|
+
decisions.clear();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* The decision published for the payload's prompt.
|
|
165
|
+
*
|
|
166
|
+
* - no screen prompt, or Auto-Yes off: `none`;
|
|
167
|
+
* - Auto-Yes on with no poller for the instance: `withheld`
|
|
168
|
+
* (`server-poller-inactive`) — nothing answers the screen, whatever an
|
|
169
|
+
* earlier record said;
|
|
170
|
+
* - a record made under this grant and session, about this confirmation
|
|
171
|
+
* ({@link matchesConfirmation}), refreshed recently: that record;
|
|
172
|
+
* - otherwise `none`.
|
|
173
|
+
*
|
|
174
|
+
* Each names the payload's prompt in `confirmation` ({@link autoYesConfirmationKey}; null with no prompt).
|
|
175
|
+
*/
|
|
176
|
+
function publishAutoYesDecision(input) {
|
|
177
|
+
const now = input.now ?? Date.now();
|
|
178
|
+
const { compositeKey, grant, promptData } = input;
|
|
179
|
+
const confirmation = promptData == null ? null : autoYesConfirmationKey({ promptData, callId: input.callId });
|
|
180
|
+
const none = { state: 'none', reason: null, observedAt: now, confirmation };
|
|
181
|
+
if (promptData == null || !grant?.enabled)
|
|
182
|
+
return none;
|
|
183
|
+
if (!input.pollerActive) {
|
|
184
|
+
return { state: 'withheld', reason: auto_yes_decision_1.SERVER_POLLER_INACTIVE_DECISION_REASON, observedAt: now, confirmation };
|
|
185
|
+
}
|
|
186
|
+
const record = decisions.get(compositeKey);
|
|
187
|
+
if (record === undefined ||
|
|
188
|
+
record.grant !== grant ||
|
|
189
|
+
record.epoch !== (0, auto_yes_enter_fallback_state_1.getEnterFallbackSessionEpoch)(compositeKey) ||
|
|
190
|
+
record.confirmation !== confirmation ||
|
|
191
|
+
now - record.at > exports.AUTO_YES_DECISION_STALE_MS) {
|
|
192
|
+
return none;
|
|
193
|
+
}
|
|
194
|
+
return { state: record.state, reason: record.reason, observedAt: now, confirmation };
|
|
195
|
+
}
|
|
@@ -37,12 +37,17 @@
|
|
|
37
37
|
*
|
|
38
38
|
* A `yes_no` prompt is a different inference — `detectPrompt` requires an
|
|
39
39
|
* explicit `(y/n)`-shaped token in the text rather than deriving it from layout
|
|
40
|
-
* — and NO tool in the registry has a measured yes/no dialog rule
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* the
|
|
40
|
+
* — and NO tool in the registry has a measured yes/no dialog rule. Until Issue
|
|
41
|
+
* #3822 that was the reason to leave it ungated. It is now the reason to refuse
|
|
42
|
+
* it on an `enforce` tool, in {@link evaluateAutoYesDialogGate} only: none of
|
|
43
|
+
* those tools draws a `(y/n)` dialog, so a `(y/n)` on their pane is text — a
|
|
44
|
+
* reply quoting one, a shell command's prompt — and typing `y` at it answers
|
|
45
|
+
* nothing the tool asked (the user's decision of 2026-10-20: a generic yes/no
|
|
46
|
+
* without the tool's own evidence is left to a human). The tool can still vouch
|
|
47
|
+
* for the frame through `detectDialog`, exactly as for a numbered list. The
|
|
48
|
+
* `legacy` tools are unchanged (#3823), and so is
|
|
49
|
+
* {@link evaluateDialogPresence}: a `(y/n)` row a human may answer still
|
|
50
|
+
* belongs in History.
|
|
46
51
|
*
|
|
47
52
|
* ## What "allowed" does NOT mean
|
|
48
53
|
*
|
|
@@ -54,9 +59,12 @@
|
|
|
54
59
|
* @module lib/polling/auto-yes-dialog-gate
|
|
55
60
|
*/
|
|
56
61
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
-
exports.COMMAND_CODE_UNSUPPORTED_QUESTION_MESSAGE = exports.UNSUPPORTED_DIALOG_LAYOUT_REASON = exports.PROMPT_NO_LONGER_ACTIVE_REASON = exports.AUTO_YES_DIALOG_GATE_ENV_VAR = exports.AUTO_YES_DIALOG_GATE_DEFAULT_MODE = exports.AUTO_YES_DIALOG_GATE_MODES = void 0;
|
|
62
|
+
exports.COMMAND_CODE_UNSUPPORTED_QUESTION_MESSAGE = exports.UNSUPPORTED_DIALOG_LAYOUT_REASON = exports.PROMPT_NO_LONGER_ACTIVE_REASON = exports.QUESTION_EVIDENCE_UNREAD_TOOLS = exports.AUTO_YES_QUESTION_DIALOG_KINDS = exports.AUTO_YES_DIALOG_GATE_ENV_VAR = exports.AUTO_YES_DIALOG_GATE_DEFAULT_MODE = exports.AUTO_YES_DIALOG_GATE_MODES = void 0;
|
|
58
63
|
exports.resolveAutoYesDialogGateMode = resolveAutoYesDialogGateMode;
|
|
59
64
|
exports.evaluateAutoYesDialogGate = evaluateAutoYesDialogGate;
|
|
65
|
+
exports.classifyAutoYesQuestion = classifyAutoYesQuestion;
|
|
66
|
+
exports.autoYesQuestionTreatment = autoYesQuestionTreatment;
|
|
67
|
+
exports.isAutoYesQuestionPrompt = isAutoYesQuestionPrompt;
|
|
60
68
|
exports.evaluateDialogPresence = evaluateDialogPresence;
|
|
61
69
|
exports.judgePromptResponse = judgePromptResponse;
|
|
62
70
|
exports.assessPromptAnswerability = assessPromptAnswerability;
|
|
@@ -67,6 +75,7 @@ const prompt_detector_1 = require("../../lib/detection/prompt-detector");
|
|
|
67
75
|
const cli_patterns_1 = require("../../lib/detection/cli-patterns");
|
|
68
76
|
const dialog_1 = require("../../lib/detection/tools/antigravity/dialog");
|
|
69
77
|
const dialog_2 = require("../../lib/detection/tools/command-code/dialog");
|
|
78
|
+
const auto_yes_option_effect_1 = require("./auto-yes-option-effect");
|
|
70
79
|
/** Every accepted value of {@link AutoYesDialogGateMode}, for parsing and tests. */
|
|
71
80
|
exports.AUTO_YES_DIALOG_GATE_MODES = ['enforce', 'legacy'];
|
|
72
81
|
/**
|
|
@@ -193,7 +202,10 @@ function resolveAutoYesDialogGateMode(tool, env = process.env) {
|
|
|
193
202
|
}
|
|
194
203
|
return specific ?? wildcard ?? exports.AUTO_YES_DIALOG_GATE_DEFAULT_MODE[tool] ?? 'legacy';
|
|
195
204
|
}
|
|
196
|
-
/**
|
|
205
|
+
/**
|
|
206
|
+
* The only prompt family the presence gate judges. Auto-Yes's gate also judges
|
|
207
|
+
* `yes_no` (Issue #3822); see the module docstring.
|
|
208
|
+
*/
|
|
197
209
|
const GATED_PROMPT_TYPE = 'multiple_choice';
|
|
198
210
|
/**
|
|
199
211
|
* May Auto-Yes answer the prompt the generic inference found on this frame?
|
|
@@ -216,7 +228,10 @@ function evaluateAutoYesDialogGate(cliToolId, promptType, cleanOutput, env = pro
|
|
|
216
228
|
// `judgeDialogPresence` holds that rule; Issue #2457 split it out so the
|
|
217
229
|
// history-save and `/prompt-response` paths judge a frame the same way this
|
|
218
230
|
// one does instead of re-deriving the rollout table.
|
|
219
|
-
const
|
|
231
|
+
const mode = resolveAutoYesDialogGateMode(cliToolId, env);
|
|
232
|
+
const presence = promptType === 'yes_no'
|
|
233
|
+
? judgeYesNoPresence(cliToolId, cleanOutput, mode)
|
|
234
|
+
: judgeDialogPresence(cliToolId, promptType, cleanOutput, mode);
|
|
220
235
|
return {
|
|
221
236
|
// `keys` is a dialog and still not answerable: opencode's button strip takes
|
|
222
237
|
// ←/→ + Enter, so the digit is swallowed and the Enter confirms whatever is
|
|
@@ -245,6 +260,119 @@ function judgeDialogPresence(cliToolId, promptType, frame, mode) {
|
|
|
245
260
|
const dialog = detector.detectDialog(typeof frame === 'string' ? (0, frame_1.normalizeFrame)(frame, cliToolId) : frame);
|
|
246
261
|
return { present: dialog !== null, dialog, mode, gated: true };
|
|
247
262
|
}
|
|
263
|
+
/**
|
|
264
|
+
* Issue #3822: the Auto-Yes gate's reading of a `yes_no` candidate. Judged on
|
|
265
|
+
* the same terms as a numbered one — the rollout table and the `hasDialogRules`
|
|
266
|
+
* cross-check — so a `legacy` tool, or one with no rules, stays ungated. An
|
|
267
|
+
* `enforce` tool answers only where its own `detectDialog` vouched for the
|
|
268
|
+
* frame; none of their rules reads a `(y/n)` row, so in practice it is refused.
|
|
269
|
+
*/
|
|
270
|
+
function judgeYesNoPresence(cliToolId, frame, mode) {
|
|
271
|
+
const detector = (0, registry_1.getToolStatusDetector)(cliToolId);
|
|
272
|
+
if (!detector.hasDialogRules || mode === 'legacy') {
|
|
273
|
+
return { present: true, dialog: null, mode, gated: false };
|
|
274
|
+
}
|
|
275
|
+
const dialog = detector.detectDialog(typeof frame === 'string' ? (0, frame_1.normalizeFrame)(frame, cliToolId) : frame);
|
|
276
|
+
return { present: dialog !== null, dialog, mode, gated: true };
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* The dialog kinds that are a question to the operator, not a permission
|
|
280
|
+
* (Issue #3822): OpenCode V2's question form, read off its own key hints.
|
|
281
|
+
*
|
|
282
|
+
* Not Claude's `ask_user`: Claude classifies by the context rows above the
|
|
283
|
+
* options, which on a permission dialog are the command being approved — a
|
|
284
|
+
* `grep "Ready to submit your answers?"` approval reads `ask_user` (#3748's
|
|
285
|
+
* controls), and it is a permission.
|
|
286
|
+
*/
|
|
287
|
+
exports.AUTO_YES_QUESTION_DIALOG_KINDS = new Set(['question']);
|
|
288
|
+
/**
|
|
289
|
+
* What kind of question to the operator a prompt is, if it is one (Issue
|
|
290
|
+
* #3863):
|
|
291
|
+
*
|
|
292
|
+
* - `'question-form'` — a question form the tool's own dialog rules read
|
|
293
|
+
* ({@link AUTO_YES_QUESTION_DIALOG_KINDS}: OpenCode V2's). Left to a human
|
|
294
|
+
* under every answer mode, as before; only on a gated frame, where those
|
|
295
|
+
* rules ran;
|
|
296
|
+
* - `'picker'` — a picker a question reader read: Claude's AskUserQuestion
|
|
297
|
+
* (the parser's own footer, `Enter to select · … navigate`) or Command
|
|
298
|
+
* Code's question screen (its reader). Both set `isAskUserQuestion`, off the
|
|
299
|
+
* picker's chrome rather than its text. Answered under the `recommended`
|
|
300
|
+
* answer mode, left to a human under `careful`;
|
|
301
|
+
* - null — not a question (a permission, a yes/no, a list).
|
|
302
|
+
*
|
|
303
|
+
* The picker is judged WITHOUT the dialog gate (#3863): the gate's mode
|
|
304
|
+
* (`enforce` / `legacy`, and the `CM_AUTOYES_DIALOG_GATE` kill switch) says
|
|
305
|
+
* whether a frame's numbered list may be answered at all, not whether it is a
|
|
306
|
+
* question, so `legacy` does not turn a question into something Auto-Yes
|
|
307
|
+
* answers under `careful`. Claude's dialog kind `ask_user` is not evidence:
|
|
308
|
+
* Claude classifies by the context rows above the options, which on a
|
|
309
|
+
* permission dialog are the command being approved (#3748).
|
|
310
|
+
*
|
|
311
|
+
* - `'unidentified'` (Issue #3881, the second half: finding 3) — given the
|
|
312
|
+
* tool, a numbered list on copilot or codex
|
|
313
|
+
* ({@link QUESTION_EVIDENCE_UNREAD_TOOLS}) that is neither of the above and
|
|
314
|
+
* whose rows do not read as a permission dialog
|
|
315
|
+
* (`auto-yes-option-effect`, the wording measured on their live captures).
|
|
316
|
+
* Copilot's question (`ask_user`) and codex's `request_user_input` draw the
|
|
317
|
+
* same picker as their menus: copilot calls anything without `do you want
|
|
318
|
+
* to` a `picker`, codex anything with a `?` above it a `permission`, and
|
|
319
|
+
* neither sets `isAskUserQuestion`. So such a list is not known to be a
|
|
320
|
+
* question, nor known not to be one. Left to a human under `careful`;
|
|
321
|
+
* under `recommended` it is answered exactly as before (not as a question).
|
|
322
|
+
*
|
|
323
|
+
* @param promptData - The prompt the tick read
|
|
324
|
+
* @param gate - {@link evaluateAutoYesDialogGate}'s verdict for the same frame, if it ran
|
|
325
|
+
* @param cliToolId - The tool that drew it; omitted, no list is `'unidentified'`
|
|
326
|
+
* (the reading before #3881's second half)
|
|
327
|
+
*/
|
|
328
|
+
function classifyAutoYesQuestion(promptData, gate, cliToolId) {
|
|
329
|
+
if (gate?.gated === true && gate.dialog !== null && exports.AUTO_YES_QUESTION_DIALOG_KINDS.has(gate.dialog.kind)) {
|
|
330
|
+
return 'question-form';
|
|
331
|
+
}
|
|
332
|
+
if (promptData.type !== 'multiple_choice')
|
|
333
|
+
return null;
|
|
334
|
+
if (promptData.isAskUserQuestion === true)
|
|
335
|
+
return 'picker';
|
|
336
|
+
if (cliToolId !== undefined && exports.QUESTION_EVIDENCE_UNREAD_TOOLS.has(cliToolId)
|
|
337
|
+
&& (0, auto_yes_option_effect_1.selectAllowOnceOption)(promptData.options, cliToolId).kind === 'not-a-permission-dialog') {
|
|
338
|
+
return 'unidentified';
|
|
339
|
+
}
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
/** See {@link AutoYesQuestionTreatment}. */
|
|
343
|
+
function autoYesQuestionTreatment(kind, answerMode) {
|
|
344
|
+
if (kind === null)
|
|
345
|
+
return 'base-rules';
|
|
346
|
+
if (kind === 'question-form')
|
|
347
|
+
return 'left-to-human';
|
|
348
|
+
if (answerMode === 'careful')
|
|
349
|
+
return 'left-to-human';
|
|
350
|
+
return kind === 'picker' ? 'recommended-choice' : 'base-rules';
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* The tools whose question screens nothing on the screen tells from their
|
|
354
|
+
* other pickers (Issue #3881, finding 3): copilot's `ask_user`, codex's
|
|
355
|
+
* `request_user_input`. Neither module reads a question's chrome; their dialog
|
|
356
|
+
* kinds are guesses from the words above the options
|
|
357
|
+
* (`tools/copilot/prompt.ts`, `tools/codex/prompt.ts`).
|
|
358
|
+
*/
|
|
359
|
+
exports.QUESTION_EVIDENCE_UNREAD_TOOLS = new Set(['copilot', 'codex']);
|
|
360
|
+
/**
|
|
361
|
+
* Is the prompt a question to the operator rather than a permission, on a
|
|
362
|
+
* GATED frame? (Issue #3822.)
|
|
363
|
+
*
|
|
364
|
+
* The reading #3822 first shipped: a question only where the tool's own rules
|
|
365
|
+
* ran. Since Issue #3863 the poller reads {@link classifyAutoYesQuestion},
|
|
366
|
+
* which judges the picker without the gate (so the kill switch and the
|
|
367
|
+
* `legacy` tools do not change how a question is treated); this stays the
|
|
368
|
+
* gated half of that reading.
|
|
369
|
+
*
|
|
370
|
+
* @param promptData - The prompt the tick read
|
|
371
|
+
* @param gate - {@link evaluateAutoYesDialogGate}'s verdict for the same frame
|
|
372
|
+
*/
|
|
373
|
+
function isAutoYesQuestionPrompt(promptData, gate) {
|
|
374
|
+
return gate.gated && classifyAutoYesQuestion(promptData, gate) !== null;
|
|
375
|
+
}
|
|
248
376
|
/**
|
|
249
377
|
* Does this frame POSITIVELY carry a dialog for the numbered-list candidate the
|
|
250
378
|
* generic parser found on it? (Issue #2457)
|
|
@@ -395,8 +523,9 @@ function assessPromptAnswerability(cliToolId, frame) {
|
|
|
395
523
|
// Issue #3808: a numbered agy screen agy's reader declines (the login-method
|
|
396
524
|
// screen, a permission dialog whose `tab Amend` footer is cut or off the
|
|
397
525
|
// pane) is no prompt — not the generic parser's reading of its `1. / 2.` rows.
|
|
526
|
+
// #3818: by default, so a run with a number missing is declined too.
|
|
398
527
|
const declinedAgyScreen = cliToolId === 'antigravity' && toolDialog === null
|
|
399
|
-
&& (0, dialog_1.
|
|
528
|
+
&& (0, dialog_1.isAntigravityUnansweredNumberedScreen)(cleanOutput);
|
|
400
529
|
const isCommandCodeQuestion = commandCodeQuestion.kind === 'prompt';
|
|
401
530
|
const candidate = (commandCodeQuestion.kind === 'prompt' ? commandCodeQuestion.prompt : null)
|
|
402
531
|
?? toolDialog
|
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Auto-Yes's Enter on a choice screen CommandMate cannot read (Issue #3397).
|
|
4
4
|
*
|
|
5
|
+
* ## Retired (Issue #3821)
|
|
6
|
+
*
|
|
7
|
+
* Nothing sends this Enter any more. The poller leaves every frame the dialog
|
|
8
|
+
* gate refuses to a human (`unclassified-frame`), whatever
|
|
9
|
+
* {@link judgeEnterFallback} would say and whatever
|
|
10
|
+
* {@link AUTO_YES_ENTER_FALLBACK_ENV_VAR} is set to: a bare Enter confirms
|
|
11
|
+
* whatever happens to be selected, and on a screen nothing here can read,
|
|
12
|
+
* nothing here can say what that is. {@link judgeEnterFallback} stays as a
|
|
13
|
+
* reading of the frame only; no sending path calls it. The session epoch the
|
|
14
|
+
* record was keyed on (`./auto-yes-enter-fallback-state`) is still what every
|
|
15
|
+
* send's generation check and the partial-answer record belong to.
|
|
16
|
+
*
|
|
17
|
+
* What follows is how the Enter was decided while it existed.
|
|
18
|
+
*
|
|
5
19
|
* ## The screen
|
|
6
20
|
*
|
|
7
21
|
* `assessPromptAnswerability` refuses some frames that are plainly a choice
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The Auto-Yes confirmation ledger's records (Issue #3848, split out of
|
|
4
|
+
* `auto-yes-confirmation-ledger.ts`): its constants, the shapes of its state,
|
|
5
|
+
* the writing of one line, and the small helpers over the state. The state
|
|
6
|
+
* itself — `ledgerState()`, the clock, the test seams — stays owned by
|
|
7
|
+
* `auto-yes-confirmation-ledger.ts`, which re-exports the public names here.
|
|
8
|
+
*
|
|
9
|
+
* Server only (logger). Must not import `auto-yes-confirmation-ledger.ts`.
|
|
10
|
+
*
|
|
11
|
+
* @module lib/polling/auto-yes-ledger-records
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.SESSION_ENDING_STOP_REASONS = exports.ABANDONING_STOP_REASONS = exports.CLI_MODE_WORD = exports.MAX_REMEMBERED_CALLS = exports.MAX_REMEMBERED_INSTANCES = exports.MAX_OPEN_HOOK_REQUESTS = exports.MAX_PENDING_ATTEMPTS = exports.AUTO_YES_LEDGER_MAX_OPEN_TOTAL = exports.AUTO_YES_LEDGER_MAX_OPEN_PER_INSTANCE = exports.AUTO_YES_LEDGER_UNOBSERVABLE_TIMEOUT_MS = exports.AUTO_YES_LEDGER_CLOCK_MS = exports.AUTO_YES_LEDGER_HOOK_LINK_WINDOW_MS = exports.AUTO_YES_LEDGER_RECORDED_PATHS = void 0;
|
|
15
|
+
exports.ledgerLogger = ledgerLogger;
|
|
16
|
+
exports.currentLogLevel = currentLogLevel;
|
|
17
|
+
exports.emit = emit;
|
|
18
|
+
exports.callsOf = callsOf;
|
|
19
|
+
exports.endedCallsOf = endedCallsOf;
|
|
20
|
+
exports.callKey = callKey;
|
|
21
|
+
exports.keyOf = keyOf;
|
|
22
|
+
exports.currentEntry = currentEntry;
|
|
23
|
+
exports.rememberBounded = rememberBounded;
|
|
24
|
+
const logger_1 = require("../../lib/logger");
|
|
25
|
+
const env_1 = require("../../lib/env");
|
|
26
|
+
const auto_yes_state_1 = require("../auto-yes-state");
|
|
27
|
+
const auto_yes_confirmation_ledger_types_1 = require("./auto-yes-confirmation-ledger-types");
|
|
28
|
+
/**
|
|
29
|
+
* The paths this version records (design §6.4): PR 1 the poller's screen path,
|
|
30
|
+
* PR 2 the hook route, the API adjudication and `/prompt-response`, PR 3 the
|
|
31
|
+
* link of agy's request to its dialog (`agy-link`). With all five the daily
|
|
32
|
+
* count is no longer partial for want of a path.
|
|
33
|
+
*/
|
|
34
|
+
exports.AUTO_YES_LEDGER_RECORDED_PATHS = [
|
|
35
|
+
'screen',
|
|
36
|
+
'hook',
|
|
37
|
+
'api',
|
|
38
|
+
'prompt-response',
|
|
39
|
+
'agy-link',
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* A screen confirmation opened this soon after a hook request closed on the
|
|
43
|
+
* same instance carries `afterHookAllow` / `afterHookAbstain` (design §2.3).
|
|
44
|
+
* agy's receipt window is the same length.
|
|
45
|
+
*/
|
|
46
|
+
exports.AUTO_YES_LEDGER_HOOK_LINK_WINDOW_MS = 8_000;
|
|
47
|
+
/** The grid of the `alive` and `checkpoint` lines: every UTC hour boundary. */
|
|
48
|
+
exports.AUTO_YES_LEDGER_CLOCK_MS = 60 * 60 * 1000;
|
|
49
|
+
/** An `unobservable` confirmation is let go after this long (design §4.2). */
|
|
50
|
+
exports.AUTO_YES_LEDGER_UNOBSERVABLE_TIMEOUT_MS = 24 * 60 * 60 * 1000;
|
|
51
|
+
/** Open confirmations one instance may hold; the oldest goes past it (design §8.2). */
|
|
52
|
+
exports.AUTO_YES_LEDGER_MAX_OPEN_PER_INSTANCE = 16;
|
|
53
|
+
/** Open confirmations the process may hold; the oldest goes past it (design §8.2). */
|
|
54
|
+
exports.AUTO_YES_LEDGER_MAX_OPEN_TOTAL = 1024;
|
|
55
|
+
/** Sends whose result has not come back that are remembered; the oldest is dropped past it. */
|
|
56
|
+
exports.MAX_PENDING_ATTEMPTS = 1024;
|
|
57
|
+
/** Hook requests whose reply has not been written that are remembered; the oldest is dropped past it. */
|
|
58
|
+
exports.MAX_OPEN_HOOK_REQUESTS = 1024;
|
|
59
|
+
/** Instances whose last hook request or CLI mode is remembered; the oldest is dropped past it. */
|
|
60
|
+
exports.MAX_REMEMBERED_INSTANCES = 1024;
|
|
61
|
+
/** agy calls whose `PostToolUse` has not come that are remembered; the oldest is dropped past it. */
|
|
62
|
+
exports.MAX_REMEMBERED_CALLS = 1024;
|
|
63
|
+
/** A CLI mode is a word of the CLI's own vocabulary; anything else is logged as `(other)`. */
|
|
64
|
+
exports.CLI_MODE_WORD = /^[A-Za-z][A-Za-z-]{0,31}$/;
|
|
65
|
+
/**
|
|
66
|
+
* Poller stop reasons that end the session the confirmation was on, or hand
|
|
67
|
+
* the key to something else (design §4.2). Every other reason — off, expired,
|
|
68
|
+
* the stop pattern, errors, a shutdown — only stops looking.
|
|
69
|
+
*/
|
|
70
|
+
exports.ABANDONING_STOP_REASONS = new Set([
|
|
71
|
+
'invalid-key',
|
|
72
|
+
'session-killed',
|
|
73
|
+
'instance-removed',
|
|
74
|
+
'worktree-deleted',
|
|
75
|
+
'orphan-swept',
|
|
76
|
+
'worktree-id-migrated',
|
|
77
|
+
'replaced',
|
|
78
|
+
'reset',
|
|
79
|
+
]);
|
|
80
|
+
/**
|
|
81
|
+
* The stop reasons among {@link ABANDONING_STOP_REASONS} that end the agent's
|
|
82
|
+
* session itself: the memory of a call its `PostToolUse` closed (PR 3) goes
|
|
83
|
+
* with them. Any other reason — Auto-Yes turned off by hand, expired, the stop
|
|
84
|
+
* pattern, a key handed over, one this list does not know — keeps it, so a
|
|
85
|
+
* stale frame of that call is not counted again when Auto-Yes comes back on;
|
|
86
|
+
* the session epoch still tells a relaunched session apart.
|
|
87
|
+
*/
|
|
88
|
+
exports.SESSION_ENDING_STOP_REASONS = new Set([
|
|
89
|
+
'session-killed',
|
|
90
|
+
'instance-removed',
|
|
91
|
+
'worktree-deleted',
|
|
92
|
+
'orphan-swept',
|
|
93
|
+
]);
|
|
94
|
+
let cachedLogger = null;
|
|
95
|
+
function ledgerLogger() {
|
|
96
|
+
cachedLogger ??= (0, logger_1.createLogger)(auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_LOG_MODULE);
|
|
97
|
+
return cachedLogger;
|
|
98
|
+
}
|
|
99
|
+
function currentLogLevel() {
|
|
100
|
+
try {
|
|
101
|
+
return (0, env_1.getLogConfig)().level;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return 'unknown';
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Write one line. A logger that throws is counted, never passed on. */
|
|
108
|
+
function emit(state, event, fields) {
|
|
109
|
+
try {
|
|
110
|
+
ledgerLogger().info(event, { ledgerVersion: auto_yes_confirmation_ledger_types_1.AUTO_YES_LEDGER_VERSION, bootId: state.bootId, ...fields });
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
state.errors += 1;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function callsOf(state) {
|
|
117
|
+
state.calls ??= new Map();
|
|
118
|
+
return state.calls;
|
|
119
|
+
}
|
|
120
|
+
function endedCallsOf(state) {
|
|
121
|
+
state.endedCalls ??= new Map();
|
|
122
|
+
return state.endedCalls;
|
|
123
|
+
}
|
|
124
|
+
function callKey(compositeKey, callId) {
|
|
125
|
+
return `${compositeKey}\u0000${callId}`;
|
|
126
|
+
}
|
|
127
|
+
function keyOf(scope) {
|
|
128
|
+
return scope.compositeKey ?? (0, auto_yes_state_1.buildCompositeKey)(scope.worktreeId, scope.cliToolId, scope.instanceId);
|
|
129
|
+
}
|
|
130
|
+
function currentEntry(state, compositeKey) {
|
|
131
|
+
const id = state.current.get(compositeKey);
|
|
132
|
+
return id === undefined ? undefined : state.entries.get(id);
|
|
133
|
+
}
|
|
134
|
+
/** Set `key` in a map kept to `max` entries, dropping the oldest. */
|
|
135
|
+
function rememberBounded(map, key, value, max) {
|
|
136
|
+
map.delete(key);
|
|
137
|
+
if (map.size >= max) {
|
|
138
|
+
const oldest = map.keys().next().value;
|
|
139
|
+
if (oldest !== undefined)
|
|
140
|
+
map.delete(oldest);
|
|
141
|
+
}
|
|
142
|
+
map.set(key, value);
|
|
143
|
+
}
|