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
|
@@ -78,6 +78,7 @@ const ansi_1 = require("../../ansi");
|
|
|
78
78
|
const prompt_detect_multiple_choice_1 = require("../../prompt-detect-multiple-choice");
|
|
79
79
|
const selection_shape_1 = require("../../selection-shape");
|
|
80
80
|
const dialog_block_1 = require("../dialog-block");
|
|
81
|
+
const option_recommendation_1 = require("../../option-recommendation");
|
|
81
82
|
const truncate_raw_content_1 = require("../../truncate-raw-content");
|
|
82
83
|
/**
|
|
83
84
|
* How many rows of dialog this reader will parse.
|
|
@@ -354,6 +355,8 @@ function readCommandCodeQuestionDialog(frame) {
|
|
|
354
355
|
region,
|
|
355
356
|
prompt: {
|
|
356
357
|
...built,
|
|
358
|
+
// Issue #3863: beside the payload, never in it — see `PromptDetectionResult`.
|
|
359
|
+
optionRecommendations: readCommandCodeOptionRecommendations(lines, regionRows.slice(block.firstRow), labels.length),
|
|
357
360
|
promptData: {
|
|
358
361
|
...promptData,
|
|
359
362
|
// Only ever added, never set to `false`: see the `checked` note above.
|
|
@@ -373,6 +376,70 @@ function readCommandCodeQuestionDialog(frame) {
|
|
|
373
376
|
},
|
|
374
377
|
};
|
|
375
378
|
}
|
|
379
|
+
/** The option row's own prefix — indent, gutter, cursor and number — up to where its label starts. */
|
|
380
|
+
const OPTION_ROW_PREFIX_PATTERN = /^[^\S\n]*[│┃]?[^\S\n]*[❯›●>]?[^\S\n]*\d{1,2}[.)][^\S\n]+/;
|
|
381
|
+
/**
|
|
382
|
+
* What each option's title says about being recommended (Issue #3863,
|
|
383
|
+
* `option-recommendation`), read off the option rows again — the block reader
|
|
384
|
+
* joins everything under an option into its label, and this screen says
|
|
385
|
+
* which rows are the title.
|
|
386
|
+
*
|
|
387
|
+
* Measured on the reported capture (#2521, 1.53.0): an option's description
|
|
388
|
+
* starts on its own row at the option's LABEL column (`❯ 1. ` → five spaces),
|
|
389
|
+
* and only what the pane wraps lands further left (column 0 or 1). So under an
|
|
390
|
+
* option row:
|
|
391
|
+
*
|
|
392
|
+
* - a row at or right of the label column starts the description, and
|
|
393
|
+
* everything after it is description;
|
|
394
|
+
* - a row left of it, before any description, is the title wrapping — unless
|
|
395
|
+
* the row above could not have wrapped into it (its first word would have
|
|
396
|
+
* fit there, `cannotBeWrapOf`), in which case it is a description drawn
|
|
397
|
+
* further left (the synthetic indent 0 / 1 / 2 shapes #2522 reads), and the
|
|
398
|
+
* rest is description too;
|
|
399
|
+
* - `Submit` / `Next` and the hint bar under the last option are nobody's.
|
|
400
|
+
*
|
|
401
|
+
* Every option `'unknown'` when the walk does not find the same options the
|
|
402
|
+
* reading did.
|
|
403
|
+
*
|
|
404
|
+
* @param frameRows - Every row of the capture, for the pane's width
|
|
405
|
+
* @param optionRows - The region's rows from option 1's row on
|
|
406
|
+
* @param optionCount - How many options the reading found
|
|
407
|
+
*/
|
|
408
|
+
function readCommandCodeOptionRecommendations(frameRows, optionRows, optionCount) {
|
|
409
|
+
const paneColumns = (0, option_recommendation_1.lowerBoundPaneColumns)(frameRows);
|
|
410
|
+
const titles = [];
|
|
411
|
+
let labelColumn = 0;
|
|
412
|
+
let lastTitleRow = '';
|
|
413
|
+
let inDescription = false;
|
|
414
|
+
for (const row of optionRows) {
|
|
415
|
+
if (row.trim() === '')
|
|
416
|
+
continue;
|
|
417
|
+
const parsed = (0, dialog_block_1.parseNumberedOptionRow)(row);
|
|
418
|
+
if (parsed !== null && parsed.number === titles.length + 1) {
|
|
419
|
+
titles.push([parsed.label]);
|
|
420
|
+
labelColumn = OPTION_ROW_PREFIX_PATTERN.exec(row)?.[0].length ?? 0;
|
|
421
|
+
lastTitleRow = row;
|
|
422
|
+
inDescription = false;
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
if (titles.length === 0)
|
|
426
|
+
break;
|
|
427
|
+
if (COMMAND_CODE_CONFIRM_ROW_PATTERN.test(row) || COMMAND_CODE_QUESTION_HINT_BAR_PATTERN.test(row))
|
|
428
|
+
continue;
|
|
429
|
+
if (inDescription)
|
|
430
|
+
continue;
|
|
431
|
+
const indent = row.length - row.trimStart().length;
|
|
432
|
+
if (indent >= labelColumn || (0, option_recommendation_1.cannotBeWrapOf)(lastTitleRow, row, paneColumns)) {
|
|
433
|
+
inDescription = true;
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
titles[titles.length - 1].push(row.trim());
|
|
437
|
+
lastTitleRow = row;
|
|
438
|
+
}
|
|
439
|
+
if (titles.length !== optionCount)
|
|
440
|
+
return Array.from({ length: optionCount }, () => 'unknown');
|
|
441
|
+
return titles.map((rows) => (0, option_recommendation_1.isRecommendedTitle)(rows.join(' ')));
|
|
442
|
+
}
|
|
376
443
|
/**
|
|
377
444
|
* The same reading as a `PromptDetectionResult | null`, for the call sites whose
|
|
378
445
|
* only question is "is there an answerable prompt here?".
|
|
@@ -30,7 +30,9 @@
|
|
|
30
30
|
* glyph or an SGR attribute, so both spellings parse to the same block.
|
|
31
31
|
*/
|
|
32
32
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.parseNumberedOptionRow = parseNumberedOptionRow;
|
|
33
34
|
exports.findNumberedOptionBlock = findNumberedOptionBlock;
|
|
35
|
+
const option_recommendation_1 = require("../option-recommendation");
|
|
34
36
|
/**
|
|
35
37
|
* One numbered option row.
|
|
36
38
|
*
|
|
@@ -58,6 +60,16 @@ const OPTION_ROW_PATTERN = /^[^\S\n]*[│┃]?[^\S\n]*([❯›●>])?[^\S\n]*(\d
|
|
|
58
60
|
const DEFAULT_FOOTER_SCAN_ROWS = 8;
|
|
59
61
|
/** How many rows one option block may span, wrapped continuations included. */
|
|
60
62
|
const MAX_BLOCK_ROWS = 60;
|
|
63
|
+
/**
|
|
64
|
+
* Read one row as a numbered option row (`❯ 1. label`), or null.
|
|
65
|
+
*
|
|
66
|
+
* Exported for a tool module that walks the block's rows again to tell an
|
|
67
|
+
* option's title from its description (Issue #3863), so it reads an option
|
|
68
|
+
* row exactly as this reader does.
|
|
69
|
+
*/
|
|
70
|
+
function parseNumberedOptionRow(row) {
|
|
71
|
+
return parseOptionRow(row);
|
|
72
|
+
}
|
|
61
73
|
function parseOptionRow(row) {
|
|
62
74
|
const match = OPTION_ROW_PATTERN.exec(row);
|
|
63
75
|
if (!match)
|
|
@@ -117,6 +129,8 @@ function findNumberedOptionBlock(lines, endExclusive, footerScanRows = DEFAULT_F
|
|
|
117
129
|
const lastRow = cursor;
|
|
118
130
|
// 2. Walk up the run, collecting each option and any wrapped rows above it.
|
|
119
131
|
const collected = [bottom];
|
|
132
|
+
// Issue #3863: whether rows were folded into each collected option's label.
|
|
133
|
+
const folded = [false];
|
|
120
134
|
let expected = bottom.number - 1;
|
|
121
135
|
let row = cursor - 1;
|
|
122
136
|
let spanned = 1;
|
|
@@ -135,6 +149,7 @@ function findNumberedOptionBlock(lines, endExclusive, footerScanRows = DEFAULT_F
|
|
|
135
149
|
const parsed = parseOptionRow(text);
|
|
136
150
|
if (parsed && parsed.number === expected) {
|
|
137
151
|
collected.unshift({ ...parsed, label: [parsed.label, ...pending].join(' ').trim() });
|
|
152
|
+
folded.unshift(pending.length > 0);
|
|
138
153
|
pending = [];
|
|
139
154
|
expected--;
|
|
140
155
|
row--;
|
|
@@ -155,5 +170,6 @@ function findNumberedOptionBlock(lines, endExclusive, footerScanRows = DEFAULT_F
|
|
|
155
170
|
firstRow: row + 1,
|
|
156
171
|
lastRow,
|
|
157
172
|
footer: footerRows.join('\n'),
|
|
173
|
+
optionRecommendations: collected.map((option, index) => folded[index] ? 'unknown' : (0, option_recommendation_1.isRecommendedTitle)(option.label)),
|
|
158
174
|
};
|
|
159
175
|
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* One reading of a frame for the waiting episodes (Issue #3798, design §2.2 /
|
|
4
|
+
* 規則 1 / I9).
|
|
5
|
+
*
|
|
6
|
+
* Three observers read a frame and tell the episode store about it: the status
|
|
7
|
+
* probe (`worktree-status-helper`), the response poller and the Auto-Yes poller.
|
|
8
|
+
* They used to read it three ways — the Auto-Yes poller through the agy receipt
|
|
9
|
+
* window, which turns a real confirmation outside the window into "no prompt" —
|
|
10
|
+
* and a wait one of them saw as a person's screen another saw as nothing. Here
|
|
11
|
+
* is the one reading they share: whether the frame waits, what kind of wait it
|
|
12
|
+
* is, and whether only a person can end it (`humanHeld`), from the detector's
|
|
13
|
+
* verdict WITHOUT the receipt scope.
|
|
14
|
+
*
|
|
15
|
+
* `humanHeld` (規則 1) is all of: the detector says `waiting`, the same
|
|
16
|
+
* verdict's prompt reading says there is no prompt, and the agent reported no
|
|
17
|
+
* structured wait. So a copilot `ask_user` with four or more options (a prompt
|
|
18
|
+
* the detector reads, `isPrompt: true`) and an opencode permission strip the
|
|
19
|
+
* agent reported a decision for (a structured wait) are not a person's screen;
|
|
20
|
+
* a survey, a picker or a trust screen is.
|
|
21
|
+
*
|
|
22
|
+
* Detection layer: reads the detector and the waiting taxonomy, and nothing in
|
|
23
|
+
* `polling/` or the session stores.
|
|
24
|
+
*
|
|
25
|
+
* @module lib/detection/waiting-screen-reading
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.waitingReadingFromVerdict = waitingReadingFromVerdict;
|
|
29
|
+
exports.promptWaitingReading = promptWaitingReading;
|
|
30
|
+
exports.readWaitingScreen = readWaitingScreen;
|
|
31
|
+
const status_detector_1 = require("./status-detector");
|
|
32
|
+
const status_reason_1 = require("./status-reason");
|
|
33
|
+
const waiting_kind_1 = require("../../lib/session/waiting-kind");
|
|
34
|
+
/**
|
|
35
|
+
* The reasons that mean "no rule could read this frame" — the set
|
|
36
|
+
* `session/status-evidence`'s `isUnclassifiedFrame` names. Restated rather than
|
|
37
|
+
* imported because that module sits above this layer (it reads the agent's
|
|
38
|
+
* event store).
|
|
39
|
+
*/
|
|
40
|
+
const UNCLASSIFIED_REASONS = new Set([
|
|
41
|
+
status_reason_1.STATUS_REASON.NO_RECENT_OUTPUT,
|
|
42
|
+
status_reason_1.STATUS_REASON.UNKNOWN_FRAME,
|
|
43
|
+
status_reason_1.STATUS_REASON.DEFAULT,
|
|
44
|
+
]);
|
|
45
|
+
/**
|
|
46
|
+
* A reading from a verdict the caller has already made, with the caller's own
|
|
47
|
+
* composed answer to "is it waiting" (the status probe folds the structured
|
|
48
|
+
* layer and a launch in progress into it). `humanHeld` is decided here and
|
|
49
|
+
* nowhere else.
|
|
50
|
+
*/
|
|
51
|
+
function waitingReadingFromVerdict(input) {
|
|
52
|
+
if (!input.waiting)
|
|
53
|
+
return { kind: 'not-waiting' };
|
|
54
|
+
const { verdict } = input;
|
|
55
|
+
return {
|
|
56
|
+
kind: 'waiting',
|
|
57
|
+
waitingKind: input.waitingKind,
|
|
58
|
+
humanHeld: verdict.status === 'waiting' && verdict.promptDetection.isPrompt === false && !input.structuredWaiting,
|
|
59
|
+
promptData: verdict.promptDetection.promptData ?? null,
|
|
60
|
+
structuredSince: input.structuredSince,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The reading of a prompt an observer has already read off the frame (the
|
|
65
|
+
* response poller's saved prompt). A prompt is never a person's screen.
|
|
66
|
+
*/
|
|
67
|
+
function promptWaitingReading(promptData) {
|
|
68
|
+
return { kind: 'waiting', waitingKind: 'prompt', humanHeld: false, promptData, structuredSince: null };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Read one captured frame (design §2.2). The detector is asked without the
|
|
72
|
+
* receipt scope (I9); the structured wait, and whether the app answers it over
|
|
73
|
+
* the agent's API, are the caller's to look up — the status probe's reading of
|
|
74
|
+
* the same frame gives the same kind only when both are passed.
|
|
75
|
+
*
|
|
76
|
+
* `verdict` is the detector's answer on this same frame when the caller has
|
|
77
|
+
* already asked for it (to look the structured wait up with), so the frame is
|
|
78
|
+
* not judged twice.
|
|
79
|
+
*/
|
|
80
|
+
function readWaitingScreen(input) {
|
|
81
|
+
const verdict = input.verdict ?? (0, status_detector_1.detectSessionStatus)(input.output, input.cliToolId, input.lastOutputTimestamp);
|
|
82
|
+
if (verdict.status === 'running' && UNCLASSIFIED_REASONS.has(verdict.reason))
|
|
83
|
+
return { kind: 'unknown' };
|
|
84
|
+
const waiting = verdict.status === 'waiting' || verdict.hasActivePrompt || input.structuredWaiting;
|
|
85
|
+
return waitingReadingFromVerdict({
|
|
86
|
+
verdict,
|
|
87
|
+
waiting,
|
|
88
|
+
waitingKind: (0, waiting_kind_1.deriveWaitingKind)({
|
|
89
|
+
waiting,
|
|
90
|
+
hasActivePrompt: verdict.hasActivePrompt,
|
|
91
|
+
scraperStatus: verdict.status,
|
|
92
|
+
scraperReason: verdict.reason,
|
|
93
|
+
apiAnswerable: input.apiAnswerable === true,
|
|
94
|
+
}),
|
|
95
|
+
structuredWaiting: input.structuredWaiting,
|
|
96
|
+
structuredSince: input.structuredSince,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
@@ -29,6 +29,17 @@
|
|
|
29
29
|
* capability block is the whole vocabulary (`docs/design/
|
|
30
30
|
* multi-agent-state-architecture.md` §4 D3).
|
|
31
31
|
*
|
|
32
|
+
* ## The ledger (Issue #3820)
|
|
33
|
+
*
|
|
34
|
+
* Each adjudication is written to the Auto-Yes confirmation ledger as the
|
|
35
|
+
* approval's confirmation, keyed by the decision id (design
|
|
36
|
+
* `docs/design/auto-yes-measurement-3820.md` §2.4): an `allow` is a send whose
|
|
37
|
+
* result is `delivered`, `settled` closes it, a policy's abstention withholds
|
|
38
|
+
* it. **No hook request is made here** — that id is the hook route's alone
|
|
39
|
+
* (§2.3, N2), so `resolvePermissionRequest` is called without one. The send is
|
|
40
|
+
* taken before the delivery is awaited and its result returned to it after
|
|
41
|
+
* (§2.5). The ledger never throws, and nothing here reads it back.
|
|
42
|
+
*
|
|
32
43
|
* ## Why `permission-decision-service` is imported dynamically
|
|
33
44
|
*
|
|
34
45
|
* The same reason `sources/opencode/ingest` does it: that module reaches the
|
|
@@ -72,6 +83,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
72
83
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
73
84
|
exports.adjudicatePendingPermission = adjudicatePendingPermission;
|
|
74
85
|
const logger_1 = require("../../lib/logger");
|
|
86
|
+
const auto_yes_confirmation_ledger_1 = require("../../lib/polling/auto-yes-confirmation-ledger");
|
|
75
87
|
const abstain_1 = require("./sources/abstain");
|
|
76
88
|
const pending_decisions_1 = require("./sources/pending-decisions");
|
|
77
89
|
const permission_decision_state_1 = require("./permission-decision-state");
|
|
@@ -121,6 +133,19 @@ async function adjudicatePendingPermission(source, target, decision, payload, tr
|
|
|
121
133
|
});
|
|
122
134
|
}
|
|
123
135
|
}
|
|
136
|
+
// Issue #3820: the ledger's send is taken before the delivery's await, as the
|
|
137
|
+
// screen path takes its handle, so a result that comes back after the
|
|
138
|
+
// confirmation closed (a kill meanwhile) is that confirmation's late result
|
|
139
|
+
// rather than the answer of one opened again by the decision id.
|
|
140
|
+
const ledgerAttempt = (0, auto_yes_confirmation_ledger_1.beginLedgerApiAdjudication)(session, decision.id, {
|
|
141
|
+
outcome: verdictSource.behavior === 'allow' ? 'allow' : 'abstained',
|
|
142
|
+
...(verdictSource.reason === 'policy-suppressed' && verdictSource.suppressedBy
|
|
143
|
+
? { withholdReason: verdictSource.suppressedBy }
|
|
144
|
+
: {}),
|
|
145
|
+
// `PERMISSION_REQUEST_PROMPT_TYPE`, spelled out: the service is imported
|
|
146
|
+
// dynamically (above) and its suites mock it down to one export.
|
|
147
|
+
promptType: 'multiple_choice',
|
|
148
|
+
});
|
|
124
149
|
// C2: the caller does not know whether this writes a response body or opens a
|
|
125
150
|
// second connection, and must not. What it does now get back is whether the
|
|
126
151
|
// verdict landed (#1898).
|
|
@@ -137,6 +162,7 @@ async function adjudicatePendingPermission(source, target, decision, payload, tr
|
|
|
137
162
|
trigger,
|
|
138
163
|
at: decision.askedAt,
|
|
139
164
|
});
|
|
165
|
+
(0, auto_yes_confirmation_ledger_1.settleLedgerApiAdjudication)(ledgerAttempt, { delivered, settled });
|
|
140
166
|
logger.info('permission-decision-adjudicated', {
|
|
141
167
|
worktreeId: target.worktreeId,
|
|
142
168
|
cliToolId: target.cliToolId,
|
|
@@ -78,6 +78,7 @@ const chat_db_1 = require("../../lib/db/chat-db");
|
|
|
78
78
|
const auto_yes_policy_1 = require("../../lib/polling/auto-yes-policy");
|
|
79
79
|
const auto_yes_resolver_1 = require("../../lib/polling/auto-yes-resolver");
|
|
80
80
|
const auto_yes_suppression_state_1 = require("../../lib/polling/auto-yes-suppression-state");
|
|
81
|
+
const auto_yes_confirmation_ledger_1 = require("../../lib/polling/auto-yes-confirmation-ledger");
|
|
81
82
|
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
82
83
|
const logger_1 = require("../../lib/logger");
|
|
83
84
|
const ask_user_question_payload_1 = require("./ask-user-question-payload");
|
|
@@ -114,9 +115,17 @@ function readContractPolicy(session) {
|
|
|
114
115
|
* | payload unreadable | no-decision |
|
|
115
116
|
* | `AskUserQuestion` | no-decision |
|
|
116
117
|
* | Auto-Yes off / expired | no-decision |
|
|
118
|
+
* | contract lookup failed (Issue #3822) | no-decision + suppression |
|
|
117
119
|
* | policy suppresses (mode off, deny pattern, type) | no-decision + suppression |
|
|
118
120
|
* | otherwise | allow |
|
|
119
121
|
*
|
|
122
|
+
* Issue #3822: the screen path reads the grant and the contract once more right
|
|
123
|
+
* before its first key (`withheldAtSend`). This path has no such moment: the
|
|
124
|
+
* `allow` returned here IS the answer — Claude runs the call without drawing a
|
|
125
|
+
* dialog and nothing is typed afterwards — so the grant and the contract it is
|
|
126
|
+
* judged against are read now, when the hook is answered, and the contract
|
|
127
|
+
* through the same cache-backed lookup (a failed read withholds, #3830).
|
|
128
|
+
*
|
|
120
129
|
* @param session - Worktree / tool / instance the request came from
|
|
121
130
|
* @param payload - Parsed payload, or null when it could not be parsed
|
|
122
131
|
* @param deps - Substitutions for the database-backed lookups; see
|
|
@@ -144,21 +153,28 @@ function decidePermissionRequest(session, payload, deps = {}) {
|
|
|
144
153
|
// Issue #1902: the third argument is what stops a normalised payload from
|
|
145
154
|
// being judged on its whole body. See `collectToolInputMatchTexts`.
|
|
146
155
|
(0, permission_request_payload_1.collectToolInputMatchTexts)(payload.toolName, payload.toolInput, payload.toolInputNormalization), policy);
|
|
156
|
+
// Issue #3822: an unknown policy (the lookup failed) is a denial here, so the
|
|
157
|
+
// hook abstains — the dialog is drawn — rather than allowing unattended.
|
|
147
158
|
if (denial) {
|
|
148
159
|
return {
|
|
149
160
|
behavior: null,
|
|
150
161
|
reason: 'policy-suppressed',
|
|
151
162
|
suppressedBy: denial.reason,
|
|
152
163
|
pattern: denial.pattern,
|
|
153
|
-
mode: policy
|
|
164
|
+
mode: (0, auto_yes_resolver_1.policyLookupMode)(policy),
|
|
154
165
|
};
|
|
155
166
|
}
|
|
156
|
-
return { behavior: 'allow', reason: 'auto-yes', mode: policy
|
|
167
|
+
return { behavior: 'allow', reason: 'auto-yes', mode: (0, auto_yes_resolver_1.policyLookupMode)(policy) };
|
|
157
168
|
}
|
|
158
169
|
/**
|
|
159
170
|
* Persist an `allow` to the prompt history `capture --prompts` reads
|
|
160
171
|
* (Issue #1685's layer).
|
|
161
172
|
*
|
|
173
|
+
* Issue #3820: only on a source that declares
|
|
174
|
+
* {@link AgentSourceCapabilities.permissionAllowSuppressesDialog} — see
|
|
175
|
+
* {@link resolvePermissionRequest}. On agy the premise below does not hold
|
|
176
|
+
* (its dialog is drawn after an allow, and the screen's answer is the record).
|
|
177
|
+
*
|
|
162
178
|
* Only `allow` is written here, and that asymmetry is deliberate. An allowed
|
|
163
179
|
* request never draws a dialog, so this row is the *only* record that anything
|
|
164
180
|
* happened — without it, Auto-Yes v2 approves commands invisibly. Every other
|
|
@@ -365,8 +381,9 @@ function reportPendingDialog(session, payload) {
|
|
|
365
381
|
* {@link PermissionDecisionDeps}. Omit in the server.
|
|
366
382
|
* @returns The verdict the route serialises
|
|
367
383
|
*/
|
|
368
|
-
function resolvePermissionRequest(session, payload, deps = {}) {
|
|
384
|
+
function resolvePermissionRequest(session, payload, deps = {}, options = {}) {
|
|
369
385
|
const decision = decidePermissionRequest(session, payload, deps);
|
|
386
|
+
const { capabilities } = (0, registry_1.getAgentEventSource)(session.cliToolId);
|
|
370
387
|
// Issue #1902: before anything else, and regardless of the verdict. The
|
|
371
388
|
// adjudicated `tool_input` is not the one copilot sent, and the design
|
|
372
389
|
// policy's discoverability rule (§7) says a rewrite nobody can observe is a
|
|
@@ -421,8 +438,36 @@ function resolvePermissionRequest(session, payload, deps = {}) {
|
|
|
421
438
|
pattern: decision.pattern,
|
|
422
439
|
});
|
|
423
440
|
}
|
|
424
|
-
|
|
441
|
+
// Issue #3820 (design §5.1): an allow is an answer only where it draws no
|
|
442
|
+
// dialog. On agy the dialog is drawn anyway and the poller's answer writes
|
|
443
|
+
// the row, so a row here was the same approval twice — and, when agy ran the
|
|
444
|
+
// call by its own allow-list, an approval CommandMate never gave.
|
|
445
|
+
if (decision.behavior === 'allow' && payload && capabilities.permissionAllowSuppressesDialog) {
|
|
425
446
|
(deps.recordAllow ?? recordAllowedPermission)(session, payload);
|
|
426
447
|
}
|
|
448
|
+
recordHookRequestInLedger(session, payload, decision, capabilities.permissionAllowSuppressesDialog, options);
|
|
427
449
|
return decision;
|
|
428
450
|
}
|
|
451
|
+
/**
|
|
452
|
+
* The ledger's half of a hook request (Issue #3820, design §2.3, §3.4): what was
|
|
453
|
+
* decided — an allow that draws no dialog is the confirmation, anything else
|
|
454
|
+
* leaves the waiting to the screen's confirmation — and the CLI's own mode when
|
|
455
|
+
* the payload states it. Nothing without a `hookRequestId`, which only the hook
|
|
456
|
+
* route issues. The ledger never throws, and nothing here decides anything.
|
|
457
|
+
*/
|
|
458
|
+
function recordHookRequestInLedger(session, payload, decision, allowSuppressesDialog, options) {
|
|
459
|
+
if (!options.hookRequestId)
|
|
460
|
+
return;
|
|
461
|
+
(0, auto_yes_confirmation_ledger_1.decideLedgerHookRequest)(options.hookRequestId, {
|
|
462
|
+
outcome: decision.behavior === 'allow' ? 'allow' : 'abstained',
|
|
463
|
+
...(decision.behavior === 'allow' ? {} : { abstainReason: decision.reason }),
|
|
464
|
+
allowSuppressesDialog,
|
|
465
|
+
promptType: exports.PERMISSION_REQUEST_PROMPT_TYPE,
|
|
466
|
+
// PR 3 (design §2.4): agy's call, tying the request to the screen's
|
|
467
|
+
// confirmation and to the call's `PostToolUse`.
|
|
468
|
+
...(payload?.callId ? { callId: payload.callId } : {}),
|
|
469
|
+
});
|
|
470
|
+
if (payload?.permissionMode) {
|
|
471
|
+
(0, auto_yes_confirmation_ledger_1.observeLedgerCliMode)(session, payload.permissionMode);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
exports.MAX_TOOL_NAME_LENGTH = exports.ASK_USER_QUESTION_TOOL = exports.PERMISSION_REQUEST_EVENT_NAME = void 0;
|
|
26
|
+
exports.buildHookCallId = buildHookCallId;
|
|
26
27
|
exports.parsePermissionRequestPayload = parsePermissionRequestPayload;
|
|
27
28
|
exports.collectToolInputMatchTexts = collectToolInputMatchTexts;
|
|
28
29
|
const tool_input_normalization_1 = require("./tool-input-normalization");
|
|
@@ -39,6 +40,25 @@ exports.PERMISSION_REQUEST_EVENT_NAME = 'PermissionRequest';
|
|
|
39
40
|
exports.ASK_USER_QUESTION_TOOL = 'AskUserQuestion';
|
|
40
41
|
/** Bound on `tool_name`; it is a Claude-side identifier, logged and stored. */
|
|
41
42
|
exports.MAX_TOOL_NAME_LENGTH = 128;
|
|
43
|
+
/** A conversation id a call id may carry: an opaque id, no path or prose. */
|
|
44
|
+
const CALL_ID_CONVERSATION = /^[A-Za-z0-9._-]{1,128}$/;
|
|
45
|
+
/**
|
|
46
|
+
* `<conversationId>:<stepIdx>` (Issue #3820, design §2.1): `stepIdx` is unique
|
|
47
|
+
* within a conversation and starts again when agy is relaunched, so it is
|
|
48
|
+
* paired with the conversation. Null unless `stepIdx` is a non-negative safe
|
|
49
|
+
* integer and the conversation id an opaque id — a body without them is read
|
|
50
|
+
* as before, with no call id.
|
|
51
|
+
*
|
|
52
|
+
* @param conversationId - agy's `conversationId` (the relay's `sessionId`)
|
|
53
|
+
* @param stepIdx - The body's `stepIdx`, whatever it was
|
|
54
|
+
*/
|
|
55
|
+
function buildHookCallId(conversationId, stepIdx) {
|
|
56
|
+
if (typeof conversationId !== 'string' || !CALL_ID_CONVERSATION.test(conversationId))
|
|
57
|
+
return null;
|
|
58
|
+
if (typeof stepIdx !== 'number' || !Number.isSafeInteger(stepIdx) || stepIdx < 0)
|
|
59
|
+
return null;
|
|
60
|
+
return `${conversationId}:${stepIdx}`;
|
|
61
|
+
}
|
|
42
62
|
function readString(source, key) {
|
|
43
63
|
const value = source[key];
|
|
44
64
|
return typeof value === 'string' && value !== '' ? value : null;
|
|
@@ -64,6 +64,7 @@
|
|
|
64
64
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
65
|
exports.antigravityAgentEventSource = void 0;
|
|
66
66
|
exports.parseAntigravityPermissionRequest = parseAntigravityPermissionRequest;
|
|
67
|
+
exports.readAntigravityPermissionCallId = readAntigravityPermissionCallId;
|
|
67
68
|
exports.encodeAntigravityVerdict = encodeAntigravityVerdict;
|
|
68
69
|
exports.extractAntigravityEventDetail = extractAntigravityEventDetail;
|
|
69
70
|
const uat_isolation_1 = require("../../../../config/uat-isolation");
|
|
@@ -125,6 +126,23 @@ function parseAntigravityPermissionRequest(body) {
|
|
|
125
126
|
permissionSuggestions: null,
|
|
126
127
|
};
|
|
127
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* The call agy's `PreToolUse` asks about, `<conversationId>:<stepIdx>`
|
|
131
|
+
* (Issue #3820, design `docs/design/auto-yes-measurement-3820.md` §2.4), or
|
|
132
|
+
* null when the body has no numeric `stepIdx` or no conversation id.
|
|
133
|
+
*
|
|
134
|
+
* Read beside {@link parseAntigravityPermissionRequest}, not inside it: the
|
|
135
|
+
* route puts it on the payload (`callId`) for the Auto-Yes ledger only. The
|
|
136
|
+
* parsed payload is what the adjudication judges, and it stays exactly what it
|
|
137
|
+
* was — `stepIdx` is still not a prompt id.
|
|
138
|
+
*
|
|
139
|
+
* @param body - Whatever was posted to `/api/hooks/permission-request`
|
|
140
|
+
*/
|
|
141
|
+
function readAntigravityPermissionCallId(body) {
|
|
142
|
+
if (!(0, event_mapper_1.isPlainObject)(body))
|
|
143
|
+
return null;
|
|
144
|
+
return (0, permission_request_payload_1.buildHookCallId)((0, event_mapper_1.readStringField)(body, 'conversationId'), body.stepIdx);
|
|
145
|
+
}
|
|
128
146
|
/**
|
|
129
147
|
* Encode a verdict in agy's wire form (S6, #1757 R15).
|
|
130
148
|
*
|
|
@@ -217,6 +235,9 @@ exports.antigravityAgentEventSource = (0, define_source_1.definePushHookSource)(
|
|
|
217
235
|
// Not audited. Default = Claude's current behaviour.
|
|
218
236
|
sessionStartMayArriveLate: false,
|
|
219
237
|
permissionReplyReleasesPrompt: false,
|
|
238
|
+
// Issue #3820, measured (1.1.12 / 1.1.27 / 1.4.2): agy draws its dialog even
|
|
239
|
+
// after an `allow`, and the screen's answer is the record — no audit row.
|
|
240
|
+
permissionAllowSuppressesDialog: false,
|
|
220
241
|
eventIdentity: null,
|
|
221
242
|
resync: 'none',
|
|
222
243
|
// Issue #2198. agy keeps a plain-JSONL transcript per conversation at
|
|
@@ -133,6 +133,9 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
133
133
|
// A hook response body releases nothing observable. The dialog is released
|
|
134
134
|
// by the screen, by `Stop`, or by expiry.
|
|
135
135
|
permissionReplyReleasesPrompt: false,
|
|
136
|
+
// Issue #3820: an allowed `PermissionRequest` draws no dialog — the reply is
|
|
137
|
+
// the only record, so the audit row is written (#1724).
|
|
138
|
+
permissionAllowSuppressesDialog: true,
|
|
136
139
|
// `tool_use_id` is present on tool events but absent on `PermissionRequest`
|
|
137
140
|
// (D2), so there is no id that covers the frames dedup has to cover. The
|
|
138
141
|
// time window stays.
|
|
@@ -108,6 +108,8 @@ exports.codexAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
108
108
|
// current behaviour, which is what the state machine does today.
|
|
109
109
|
sessionStartMayArriveLate: false,
|
|
110
110
|
permissionReplyReleasesPrompt: false,
|
|
111
|
+
// Issue #3820: an allowed `PermissionRequest` draws no dialog.
|
|
112
|
+
permissionAllowSuppressesDialog: true,
|
|
111
113
|
eventIdentity: null,
|
|
112
114
|
resync: 'none',
|
|
113
115
|
// Issue #2197. codex appends every record of a session to
|
|
@@ -230,6 +230,8 @@ exports.commandCodeAgentEventSource = (0, define_source_1.definePushHookSource)(
|
|
|
230
230
|
sessionStartMayArriveLate: false,
|
|
231
231
|
// A hook response body releases nothing observable, as on every push source.
|
|
232
232
|
permissionReplyReleasesPrompt: false,
|
|
233
|
+
// Issue #3820: the hook arrives after the dialog was answered (see above).
|
|
234
|
+
permissionAllowSuppressesDialog: false,
|
|
233
235
|
// `tool_use_id` is present on both tool events (`call_00_…`) and absent from
|
|
234
236
|
// `SessionStart` and `Stop`, so there is no id covering the frames dedup has
|
|
235
237
|
// to cover. The time window stays. Extraction is declared below regardless,
|
|
@@ -215,6 +215,8 @@ exports.copilotAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
215
215
|
// module comment above.
|
|
216
216
|
sessionStartMayArriveLate: true,
|
|
217
217
|
permissionReplyReleasesPrompt: false,
|
|
218
|
+
// Issue #3820: an allowed `PreToolUse` runs the call without a dialog.
|
|
219
|
+
permissionAllowSuppressesDialog: true,
|
|
218
220
|
// Not audited. No captured copilot payload carries a `tool_use_id`, so
|
|
219
221
|
// `'tool-call-id'` would be a guess; whether one exists is still to be
|
|
220
222
|
// measured. Default = Claude's fallback, the time window.
|
|
@@ -130,6 +130,8 @@ exports.geminiAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
130
130
|
// Not audited. Default = Claude's current behaviour.
|
|
131
131
|
sessionStartMayArriveLate: false,
|
|
132
132
|
permissionReplyReleasesPrompt: false,
|
|
133
|
+
// Issue #3820: not measured, and no permission hook is registered.
|
|
134
|
+
permissionAllowSuppressesDialog: false,
|
|
133
135
|
eventIdentity: null,
|
|
134
136
|
resync: 'none',
|
|
135
137
|
// Issue #2197. Nobody but the screen scraper records gemini replies.
|
|
@@ -65,6 +65,8 @@ function createLegacyRelaySource(cliToolId) {
|
|
|
65
65
|
permissionHookPredictsDialog: false,
|
|
66
66
|
sessionStartMayArriveLate: false,
|
|
67
67
|
permissionReplyReleasesPrompt: false,
|
|
68
|
+
// Issue #3820: an unmeasured tool's allow is not assumed to answer a dialog.
|
|
69
|
+
permissionAllowSuppressesDialog: false,
|
|
68
70
|
eventIdentity: null,
|
|
69
71
|
resync: 'none',
|
|
70
72
|
// Issue #2197. A tool on the compatibility relay has no reader, which
|
|
@@ -81,6 +81,7 @@ const logger_1 = require("../../../../lib/logger");
|
|
|
81
81
|
const agent_event_types_1 = require("../../../../lib/hooks/agent-event-types");
|
|
82
82
|
const permission_adjudication_1 = require("../../../../lib/hooks/permission-adjudication");
|
|
83
83
|
const pending_decision_kind_1 = require("../../../../lib/hooks/pending-decision-kind");
|
|
84
|
+
const auto_yes_confirmation_ledger_1 = require("../../../../lib/polling/auto-yes-confirmation-ledger");
|
|
84
85
|
const agent_event_state_1 = require("../../../../lib/session/agent-event-state");
|
|
85
86
|
const structured_prompt_1 = require("../../../../lib/session/structured-prompt");
|
|
86
87
|
const event_mapper_1 = require("../event-mapper");
|
|
@@ -362,6 +363,11 @@ async function ingestOpencodeEvent(target, event) {
|
|
|
362
363
|
record.decisionId = (0, mappers_1.repliedPermissionId)(event.raw);
|
|
363
364
|
record.promptSettled = replyReleasesPrompt(target, instanceId);
|
|
364
365
|
(0, agent_event_state_1.recordAgentEvent)(target.worktreeId, tool_id_1.OPENCODE_CLI_TOOL_ID, instanceId, record, options);
|
|
366
|
+
// Issue #3820: the approval's confirmation in the Auto-Yes ledger ends
|
|
367
|
+
// here when Auto-Yes did not settle it — who answered is not known.
|
|
368
|
+
if (record.decisionId) {
|
|
369
|
+
(0, auto_yes_confirmation_ledger_1.noteLedgerApiDecisionReplied)({ worktreeId: target.worktreeId, cliToolId: tool_id_1.OPENCODE_CLI_TOOL_ID, instanceId }, record.decisionId);
|
|
370
|
+
}
|
|
365
371
|
logger.info('opencode-permission-reply-observed', {
|
|
366
372
|
worktreeId: target.worktreeId,
|
|
367
373
|
instanceId,
|
|
@@ -316,6 +316,8 @@ exports.opencodeAgentEventSource = (0, define_source_1.definePullEventSource)({
|
|
|
316
316
|
// `permission.replied` arrives on the same stream and is a positive
|
|
317
317
|
// statement that the dialog is gone (#1898). The only source that can say so.
|
|
318
318
|
permissionReplyReleasesPrompt: true,
|
|
319
|
+
// Issue #3820: an allow is the approval itself, over the agent's API.
|
|
320
|
+
permissionAllowSuppressesDialog: true,
|
|
319
321
|
// `per_...` — the id in the reply URL, which is the same id the frame
|
|
320
322
|
// carries (#1899). Real identity, so this source does not need the time
|
|
321
323
|
// window that loses the `stop` of a short turn.
|
|
@@ -64,6 +64,7 @@ const logger_1 = require("../../../../lib/logger");
|
|
|
64
64
|
const agent_event_types_1 = require("../../../../lib/hooks/agent-event-types");
|
|
65
65
|
const permission_adjudication_1 = require("../../../../lib/hooks/permission-adjudication");
|
|
66
66
|
const pending_decision_kind_1 = require("../../../../lib/hooks/pending-decision-kind");
|
|
67
|
+
const auto_yes_confirmation_ledger_1 = require("../../../../lib/polling/auto-yes-confirmation-ledger");
|
|
67
68
|
const agent_event_state_1 = require("../../../../lib/session/agent-event-state");
|
|
68
69
|
const structured_prompt_1 = require("../../../../lib/session/structured-prompt");
|
|
69
70
|
const event_mapper_1 = require("../event-mapper");
|
|
@@ -207,6 +208,11 @@ async function ingestOpencodeV2Event(target, event, stopEffect = applyStop, load
|
|
|
207
208
|
record.decisionId = (0, mappers_1.frameDecisionId)(event.raw);
|
|
208
209
|
record.promptSettled = true;
|
|
209
210
|
(0, agent_event_state_1.recordAgentEvent)(target.worktreeId, tool_id_1.OPENCODE_V2_CLI_TOOL_ID, instanceId, record, options);
|
|
211
|
+
// Issue #3820: as v1's `permission.replied` — the ledger's confirmation
|
|
212
|
+
// of this approval ends, by whoever answered it.
|
|
213
|
+
if (record.decisionId) {
|
|
214
|
+
(0, auto_yes_confirmation_ledger_1.noteLedgerApiDecisionReplied)({ worktreeId: target.worktreeId, cliToolId: tool_id_1.OPENCODE_V2_CLI_TOOL_ID, instanceId }, record.decisionId);
|
|
215
|
+
}
|
|
210
216
|
}
|
|
211
217
|
else if (event.event === 'notification' && event.detail === mappers_1.OPENCODE_V2_QUESTION_DETAIL) {
|
|
212
218
|
const spec = await readQuestion(target, event, loadForm);
|
|
@@ -254,6 +254,8 @@ exports.opencodeV2AgentEventSource = (0, define_source_1.definePullEventSource)(
|
|
|
254
254
|
permissionHookPredictsDialog: false,
|
|
255
255
|
sessionStartMayArriveLate: false,
|
|
256
256
|
permissionReplyReleasesPrompt: true,
|
|
257
|
+
// Issue #3820: an allow is the approval itself, over the agent's API.
|
|
258
|
+
permissionAllowSuppressesDialog: true,
|
|
257
259
|
// Issue #2945: `per_…` / `frm_…`, the id the reply URL takes and the one
|
|
258
260
|
// `permission.replied` / `form.replied` settle. Moves together with
|
|
259
261
|
// `extractEventIdentity` below.
|
|
@@ -124,12 +124,24 @@ function resetPendingDecisions() {
|
|
|
124
124
|
* function exists, cannot find out without going out of its way — whether the
|
|
125
125
|
* verdict left through the response body or through a second HTTP call.
|
|
126
126
|
*
|
|
127
|
+
* @param options.onReceipt - Issue #3820: handed the receipt — what
|
|
128
|
+
* {@link answerPendingDecisionWithReceipt} returns beside the body — before
|
|
129
|
+
* the body is returned. For a caller that records the delivery (the hook
|
|
130
|
+
* route's ledger) and writes the body whatever it says; the body is the same
|
|
131
|
+
* with or without it.
|
|
127
132
|
* @returns The body to write. `{}` means "nothing to say here", which for a
|
|
128
133
|
* hook is the measured no-decision reply and for a pull source is simply the
|
|
129
134
|
* ack of a request whose answer went elsewhere.
|
|
130
135
|
*/
|
|
131
|
-
async function answerPendingDecision(source, ref, decision, verdict) {
|
|
132
|
-
|
|
136
|
+
async function answerPendingDecision(source, ref, decision, verdict, options = {}) {
|
|
137
|
+
const { body, delivery } = await answerPendingDecisionWithReceipt(source, ref, decision, verdict);
|
|
138
|
+
try {
|
|
139
|
+
options.onReceipt?.(delivery);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// The receipt is the caller's record, never a reason to lose the body.
|
|
143
|
+
}
|
|
144
|
+
return body;
|
|
133
145
|
}
|
|
134
146
|
/**
|
|
135
147
|
* Answer one decision and keep the receipt (Issue #1898).
|