commandmate 0.44.3 → 0.45.1
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 +293 -292
- package/.next/app-path-routes-manifest.json +21 -21
- package/.next/build-manifest.json +5 -5
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +29 -29
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +3 -3
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +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]/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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -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 +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
- 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 +5 -5
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +21 -21
- package/.next/server/chunks/1503.js +2 -2
- package/.next/server/chunks/1559.js +2 -2
- package/.next/server/chunks/1944.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/22.js +1 -1
- package/.next/server/chunks/2335.js +1 -0
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2460.js +1 -1
- package/.next/server/chunks/2710.js +2 -2
- package/.next/server/chunks/2908.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/4243.js +1 -0
- package/.next/server/chunks/4837.js +3 -3
- package/.next/server/chunks/5048.js +1 -1
- package/.next/server/chunks/5064.js +1 -1
- package/.next/server/chunks/5209.js +1 -1
- package/.next/server/chunks/5292.js +7 -0
- package/.next/server/chunks/5625.js +3 -3
- package/.next/server/chunks/5737.js +1 -1
- package/.next/server/chunks/6065.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6927.js +1 -1
- package/.next/server/chunks/850.js +1 -1
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8918.js +4 -6
- package/.next/server/chunks/9051.js +1 -1
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/9355.js +1 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9731.js +1 -1
- package/.next/server/chunks/9862.js +1 -0
- 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/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{7485.442b21101fca7257.js → 1111.5ab4f0ffb0d944e5.js} +4 -4
- package/.next/static/chunks/1464.09cd37fee202ec4b.js +1 -0
- package/.next/static/chunks/{1642-767aed8e7c61ef7f.js → 1642-0f1bf8fb8161e10a.js} +1 -1
- package/.next/static/chunks/{2407-06d35bb1aa02de80.js → 2407-86890b00eeecf391.js} +1 -1
- package/.next/static/chunks/{2751-9ef0f4b450bd4ef0.js → 2751-5f0b2702accd164d.js} +1 -1
- package/.next/static/chunks/{282.6b6f2e31a96674dd.js → 282.a1013532fd9a61b4.js} +1 -1
- package/.next/static/chunks/3237.94c29281d9ec122e.js +1 -0
- package/.next/static/chunks/3480.2e21f62e5e9d3ba5.js +1 -0
- package/.next/static/chunks/3662-5a27ee39a3ecba49.js +1 -0
- package/.next/static/chunks/3922.0bc2e4e168d2b522.js +1 -0
- package/.next/static/chunks/4290.c06dbe243819fea0.js +66 -0
- package/.next/static/chunks/4541-b0ce0bf829ae79b7.js +1 -0
- package/.next/static/chunks/4727-4c69d1aa4118cc09.js +1 -0
- package/.next/static/chunks/{5222.305dc0ebba9c0784.js → 5222.39e2034d3fce233c.js} +1 -1
- package/.next/static/chunks/5371-af1c2b68e983da61.js +1 -0
- package/.next/static/chunks/6288-09feba367cc2c65e.js +1 -0
- package/.next/static/chunks/{7095.8c869e553133a40e.js → 7095.87323a4fdf426341.js} +1 -1
- package/.next/static/chunks/953.31c52a251deda22d.js +1 -0
- package/.next/static/chunks/app/{layout-0d1750b833f5cc3e.js → layout-eaa6365f8f942e88.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-2af68c63211c751f.js → page-ebfed2c80e916fb8.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/page-e4b14031f946c007.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9cf1ecc59e36a004.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-3372b78fde232b1f.js +1 -0
- package/.next/static/chunks/{webpack-021f0741f22dd16a.js → webpack-ee3ccbe378c4aa06.js} +1 -1
- package/.next/static/css/{057f64a65726c439.css → 6faeb04a0b6819d4.css} +1 -1
- package/.next/trace +13 -13
- package/dist/cli/commands/skill-format.d.ts +8 -0
- package/dist/cli/commands/skill-format.d.ts.map +1 -1
- package/dist/cli/commands/skill-format.js +13 -3
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +71 -3
- package/dist/cli/types/api-responses.d.ts +7 -10
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.d.ts +21 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +38 -1
- package/dist/server/locales/en/worktree.json +7 -2
- package/dist/server/locales/ja/worktree.json +7 -2
- package/dist/server/src/lib/auto-yes-poller.js +16 -163
- package/dist/server/src/lib/detection/model-info-extractor.js +57 -3
- package/dist/server/src/lib/detection/status-detector.js +1 -1
- package/dist/server/src/lib/git/git-exec.js +23 -5
- package/dist/server/src/lib/hooks/sources/claude/self-resume.js +213 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +24 -7
- package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +1 -1
- package/dist/server/src/lib/polling/auto-yes-poller-state.js +52 -0
- package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +125 -0
- package/dist/server/src/lib/polling/prompt-dedup.js +93 -2
- package/dist/server/src/lib/polling/response-checker.js +40 -2
- package/dist/server/src/lib/polling/response-dedup.js +62 -1
- package/dist/server/src/lib/session/agent-event-dedup.js +2 -2
- package/dist/server/src/lib/session/agent-event-state.js +2 -1
- package/dist/server/src/lib/session/agent-event-turn.js +51 -0
- package/dist/server/src/lib/session/current-output-builder.js +0 -5
- package/dist/server/src/lib/skills/install-plan.js +1 -0
- package/dist/server/src/lib/skills/preview-diff.js +24 -3
- package/dist/server/src/lib/skills/uninstall-plan.js +1 -0
- package/dist/server/src/lib/verification/env-clean-gate.js +6 -5
- package/docs/en/user-guide/commands-guide.md +0 -1
- package/package.json +3 -2
- package/release-notes/0.45.0.json +41 -0
- package/release-notes/0.45.1.json +38 -0
- package/scripts/hooks/cmate-agent-event.sh +20 -0
- package/.next/server/chunks/364.js +0 -1
- package/.next/server/chunks/4672.js +0 -5
- package/.next/server/chunks/4802.js +0 -1
- package/.next/server/chunks/488.js +0 -1
- package/.next/server/chunks/5326.js +0 -1
- package/.next/static/chunks/2053-85a974ddfe7498fe.js +0 -1
- package/.next/static/chunks/3922.f45dcfc1e7da552a.js +0 -1
- package/.next/static/chunks/4290.6cf86f68d73b6e77.js +0 -82
- package/.next/static/chunks/4459.a94b52985a76509a.js +0 -1
- package/.next/static/chunks/4727-5d695d71e3fdf97b.js +0 -1
- package/.next/static/chunks/5951.616956b6aa5df63f.js +0 -1
- package/.next/static/chunks/8283-26ad31a4670ea52d.js +0 -1
- package/.next/static/chunks/8566-aeda747542072ace.js +0 -1
- package/.next/static/chunks/8811-29eaa24237f48558.js +0 -1
- package/.next/static/chunks/953.19e4c8178c9eac4c.js +0 -1
- package/.next/static/chunks/9856.15463dd58437e2ac.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-9ee7a381636e60cb.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-5445205c8dd80109.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +0 -1
- /package/.next/static/{tWwHQzmvc-rv9KKUtDWfQ → vYIpFRCU_Mt0wtG8F_3-6}/_buildManifest.js +0 -0
- /package/.next/static/{tWwHQzmvc-rv9KKUtDWfQ → vYIpFRCU_Mt0wtG8F_3-6}/_ssgManifest.js +0 -0
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
35
|
exports.claudeAgentEventSource = void 0;
|
|
36
36
|
exports.encodeClaudeVerdict = encodeClaudeVerdict;
|
|
37
|
+
exports.extractClaudeEventDetail = extractClaudeEventDetail;
|
|
37
38
|
const uat_isolation_1 = require("../../../../config/uat-isolation");
|
|
38
39
|
const agent_event_types_1 = require("../../../../lib/hooks/agent-event-types");
|
|
39
40
|
const ask_user_question_payload_1 = require("../../../../lib/hooks/ask-user-question-payload");
|
|
@@ -44,6 +45,7 @@ const event_mapper_1 = require("../event-mapper");
|
|
|
44
45
|
const hook_event_vocabulary_1 = require("../hook-event-vocabulary");
|
|
45
46
|
const model_switch_1 = require("./model-switch");
|
|
46
47
|
const queued_notice_1 = require("./queued-notice");
|
|
48
|
+
const self_resume_1 = require("./self-resume");
|
|
47
49
|
const tool_id_1 = require("./tool-id");
|
|
48
50
|
/**
|
|
49
51
|
* The no-decision body, byte for byte what the #1721 spike returned for D5.
|
|
@@ -85,6 +87,20 @@ function encodeClaudeVerdict(verdict) {
|
|
|
85
87
|
},
|
|
86
88
|
};
|
|
87
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* The subtype of one Claude event.
|
|
92
|
+
*
|
|
93
|
+
* Every event but `stop` is the shared snake_case reading (S2). A `stop` is
|
|
94
|
+
* {@link SELF_RESUME_PENDING_DETAIL} when the session's transcript shows
|
|
95
|
+
* background work that has not been notified yet (Issue #3430), and has no
|
|
96
|
+
* subtype otherwise — which is what every Claude `stop` had before.
|
|
97
|
+
*/
|
|
98
|
+
function extractClaudeEventDetail(event, payload) {
|
|
99
|
+
if (event === 'stop' && (0, self_resume_1.claudeStopLeavesBackgroundWork)(payload)) {
|
|
100
|
+
return agent_event_types_1.SELF_RESUME_PENDING_DETAIL;
|
|
101
|
+
}
|
|
102
|
+
return (0, hook_event_vocabulary_1.extractSnakeCaseEventDetail)(event, payload);
|
|
103
|
+
}
|
|
88
104
|
/**
|
|
89
105
|
* Claude Code as an event source.
|
|
90
106
|
*
|
|
@@ -127,11 +143,12 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
127
143
|
// JSONL when the poller asks (#2121); the gate dispatches on this word
|
|
128
144
|
// rather than on the tool id.
|
|
129
145
|
transcriptHistory: 'pull',
|
|
130
|
-
// Issue #2614
|
|
131
|
-
//
|
|
132
|
-
// `
|
|
133
|
-
//
|
|
134
|
-
|
|
146
|
+
// Issue #3430 (#2614 for Claude). A `Stop` whose transcript shows a
|
|
147
|
+
// background `Bash` / `Monitor` / subagent not yet notified carries
|
|
148
|
+
// `SELF_RESUME_PENDING_DETAIL`: the notification opens the next turn by
|
|
149
|
+
// itself. The payload's `background_tasks` is still unread — only its empty
|
|
150
|
+
// form has been captured. See `./self-resume` and `extractDetail` below.
|
|
151
|
+
stopReportsSelfResume: true,
|
|
135
152
|
},
|
|
136
153
|
// S1. A plain name table is enough *for this tool* — one native name, one
|
|
137
154
|
// word, no predicates — so it is expressed as rules built from the table
|
|
@@ -163,8 +180,8 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
163
180
|
// Issue #3330. A background-task notice attached to the running turn fires
|
|
164
181
|
// `UserPromptSubmit` too, and continues that turn rather than opening one.
|
|
165
182
|
promptJoinsOpenTurn: queued_notice_1.isClaudeQueuedNoticePrompt,
|
|
166
|
-
// S2.
|
|
167
|
-
extractDetail:
|
|
183
|
+
// S2, plus the `Stop` that leaves background work behind (Issue #3430).
|
|
184
|
+
extractDetail: extractClaudeEventDetail,
|
|
168
185
|
// S7. Both parsers are strict and answer null for anything they cannot vouch
|
|
169
186
|
// for; the callers turn null into "no structured data", which degrades to the
|
|
170
187
|
// behaviour of a machine without hooks rather than into a guess.
|
|
@@ -30,7 +30,7 @@ const global_state_1 = require("../global-state");
|
|
|
30
30
|
* What tells two prompts apart for the published record: the type, the
|
|
31
31
|
* question and the option labels.
|
|
32
32
|
*
|
|
33
|
-
* Not the poller's `promptFrameKey
|
|
33
|
+
* Not the poller's `promptFrameKey` (in `auto-yes-poller-state.ts`): that one also carries the cursor and
|
|
34
34
|
* `approvalTarget`, and the status API reads a different number of rows than
|
|
35
35
|
* the poller does, so `approvalTarget` can differ between the two readings of
|
|
36
36
|
* one screen. The record is matched against the status API's prompt (to say
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auto-Yes poller state and its once-per-frame WARN (Issue #3411).
|
|
4
|
+
*
|
|
5
|
+
* Moved out of auto-yes-poller.ts unchanged; the poller re-exports
|
|
6
|
+
* `AutoYesPollerState`. Must not import auto-yes-poller.ts (cycle).
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.promptFrameKey = promptFrameKey;
|
|
10
|
+
exports.warnOncePerFrame = warnOncePerFrame;
|
|
11
|
+
const prompt_key_1 = require("../detection/prompt-key");
|
|
12
|
+
const logger_1 = require("../../lib/logger");
|
|
13
|
+
const logger = (0, logger_1.createLogger)('auto-yes-poller');
|
|
14
|
+
/**
|
|
15
|
+
* Issue #2995: what makes two ticks "the same prompt" for `warnOncePerFrame`.
|
|
16
|
+
*
|
|
17
|
+
* `generatePromptKey` alone is type + question, and the question the detector
|
|
18
|
+
* extracts from an agent's reply is often a fixed line above the list, so two
|
|
19
|
+
* different lists would share it. The option rows (and where the cursor sits)
|
|
20
|
+
* plus `approvalTarget` -- the current prompt's own panel, which leaves out
|
|
21
|
+
* scrollback and footers that change while the prompt does not -- separate them.
|
|
22
|
+
* Not the whole pane: a status bar that ticks every second would defeat it.
|
|
23
|
+
*/
|
|
24
|
+
function promptFrameKey(promptData) {
|
|
25
|
+
const options = promptData.type === 'multiple_choice'
|
|
26
|
+
? promptData.options.map((o) => `${o.isDefault ? '>' : ''}${o.number}.${o.label}`).join('\n')
|
|
27
|
+
: '';
|
|
28
|
+
return [(0, prompt_key_1.generatePromptKey)(promptData), options, promptData.approvalTarget ?? ''].join('\u0000');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Issue #2995: print a "did not answer" line as WARN once per frame.
|
|
32
|
+
*
|
|
33
|
+
* The poller re-reads a static pane every 2s, so a frame Auto-Yes leaves alone
|
|
34
|
+
* (a reply quoting `1. Yes / 2. No`, a launch dialog, a policy-withheld prompt,
|
|
35
|
+
* a foreign session) would otherwise print the same WARN on every tick. The
|
|
36
|
+
* first one stays WARN -- it is what tells a silently stalled worker apart --
|
|
37
|
+
* and repeats for the same frame drop to `debug`. The frame is identified by
|
|
38
|
+
* the event, `promptFrameKey()` and the event's own detail; a different
|
|
39
|
+
* prompt, a different reason, or a tick with no prompt / an answer sent (both
|
|
40
|
+
* clear the key) makes the next line WARN again.
|
|
41
|
+
* `recordPolicySuppression()` is not throttled: `capture --json` and `wait`
|
|
42
|
+
* read the latest record, not the log.
|
|
43
|
+
*/
|
|
44
|
+
function warnOncePerFrame(pollerState, frameKey, event, fields) {
|
|
45
|
+
const key = `${event}\u0000${frameKey}`;
|
|
46
|
+
if (pollerState.lastSkipWarnKey === key) {
|
|
47
|
+
logger.debug(event, { ...fields, repeated: true });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
pollerState.lastSkipWarnKey = key;
|
|
51
|
+
logger.warn(event, fields);
|
|
52
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The suppression exits of `detectAndRespondToPrompt` (Issue #3214), moved out
|
|
4
|
+
* of auto-yes-poller.ts unchanged (Issue #3411). Must not import
|
|
5
|
+
* auto-yes-poller.ts (cycle) or `../tmux/tmux` (tmux import allowlist).
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.suppressAndWarnOnce = suppressAndWarnOnce;
|
|
9
|
+
exports.suppressIfNotOursToAnswer = suppressIfNotOursToAnswer;
|
|
10
|
+
exports.suppressUnclassifiedFrame = suppressUnclassifiedFrame;
|
|
11
|
+
const detect_1 = require("../detection/tools/codex/detect");
|
|
12
|
+
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
13
|
+
const auto_yes_suppression_state_1 = require("./auto-yes-suppression-state");
|
|
14
|
+
const auto_yes_dialog_gate_1 = require("./auto-yes-dialog-gate");
|
|
15
|
+
const auto_yes_poller_state_1 = require("./auto-yes-poller-state");
|
|
16
|
+
/**
|
|
17
|
+
* Issue #3214: the form the four suppression exits of `detectAndRespondToPrompt`
|
|
18
|
+
* share. Records why Auto-Yes left the prompt alone (`recordPolicySuppression`,
|
|
19
|
+
* not throttled), then prints the WARN once per frame (`warnOncePerFrame`).
|
|
20
|
+
*
|
|
21
|
+
* @param suppression - Handed to `recordPolicySuppression` as is
|
|
22
|
+
* @param warnFrameKey - Handed to `warnOncePerFrame` as is: the prompt's
|
|
23
|
+
* `frameKey` plus the exit's own detail
|
|
24
|
+
* @param event - The WARN's log name
|
|
25
|
+
* @param detail - The WARN's fields after `worktreeId`, `cliToolId` and `instanceId`
|
|
26
|
+
*/
|
|
27
|
+
function suppressAndWarnOnce(prompt, suppression, warnFrameKey, event, detail) {
|
|
28
|
+
const { worktreeId, cliToolId, instanceId } = prompt;
|
|
29
|
+
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, suppression);
|
|
30
|
+
(0, auto_yes_poller_state_1.warnOncePerFrame)(prompt.pollerState, warnFrameKey, event, {
|
|
31
|
+
worktreeId,
|
|
32
|
+
cliToolId,
|
|
33
|
+
instanceId,
|
|
34
|
+
...detail,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Issue #3214: steps 3, 3.2 and 3.5 of `detectAndRespondToPrompt` -- the frames
|
|
39
|
+
* that read as a prompt and are still not Auto-Yes's to answer, judged in the
|
|
40
|
+
* order they always were. "The detection above" in the comments below is that
|
|
41
|
+
* function's step 1.
|
|
42
|
+
*
|
|
43
|
+
* Issue #3397: step 3.5 no longer records its refusal here. It hands the gate's
|
|
44
|
+
* verdict back so `tryEnterFallback` can look at the frame first, and records
|
|
45
|
+
* through {@link suppressUnclassifiedFrame} when that sends nothing. Steps 3 and
|
|
46
|
+
* 3.2 still win: an Enter never reaches codex's launch dialogs or its `/model`
|
|
47
|
+
* picker.
|
|
48
|
+
*
|
|
49
|
+
* @param frame - The tick's one normalised frame (Issue #3183)
|
|
50
|
+
*/
|
|
51
|
+
function suppressIfNotOursToAnswer(prompt, frame) {
|
|
52
|
+
const { cliToolId, promptData, frameKey } = prompt;
|
|
53
|
+
// 3. Issue #1829: codex's own launch dialogs are CodexTool.waitForReady()'s
|
|
54
|
+
// to answer, not the poller's. Every one of them defaults to option 1, and
|
|
55
|
+
// the base rules answer the default:
|
|
56
|
+
//
|
|
57
|
+
// "Hooks need review" -> 1. Review hooks (undoes Issue #1760; the pane
|
|
58
|
+
// then sits two screens deep in a review UI that
|
|
59
|
+
// only `t`/`esc` leave, reported as `running`)
|
|
60
|
+
// "Update available" -> 1. Update now (undoes Issue #890; runs
|
|
61
|
+
// `npm install -g @openai/codex`, killing codex)
|
|
62
|
+
// "Do you trust …" -> 1. Yes, continue
|
|
63
|
+
//
|
|
64
|
+
// waitForReady answers the same screens deliberately and differently ('3',
|
|
65
|
+
// '2', '1' — each without a trailing Enter), but only during startSession,
|
|
66
|
+
// while this poller runs on its own 2s phase for the life of the session.
|
|
67
|
+
// Whichever sees the dialog first decides, so the fix is to leave them all
|
|
68
|
+
// to the tool. Auto-answer layer only: the detection above still reports the
|
|
69
|
+
// prompt, so the human keeps seeing the screen and the response poller
|
|
70
|
+
// still notifies them about it.
|
|
71
|
+
const launchDialog = cliToolId === 'codex' ? (0, cli_patterns_1.getCodexLifecycleDialog)(frame) : null;
|
|
72
|
+
if (launchDialog) {
|
|
73
|
+
// Recorded through the #1684 channel so `capture --json` and `cmate wait`
|
|
74
|
+
// can name the reason instead of showing a worker that went quiet.
|
|
75
|
+
suppressAndWarnOnce(prompt, { reason: 'agent-launch-dialog', mode: null, promptType: promptData.type }, `${frameKey}\u0000${launchDialog}`, 'poller:auto-yes-skipped-launch-dialog', { dialog: launchDialog, promptType: promptData.type });
|
|
76
|
+
return { kind: 'left-alone' };
|
|
77
|
+
}
|
|
78
|
+
// 3.2. Issue #3062: codex's `/model` picker (both stages) is not ours to
|
|
79
|
+
// answer. A digit there is an immediate decision, so the base rules'
|
|
80
|
+
// default would choose the model and effort for the operator. Judged by the
|
|
81
|
+
// picker's own footer, not by `kind: picker`, which the hooks screens share.
|
|
82
|
+
// The tool's `detectPrompt` still reports the prompt, so `/prompt-response`
|
|
83
|
+
// (the human's answer) is unaffected. Reuses `unclassified-frame`: the tool
|
|
84
|
+
// recognised the frame and deliberately declined it.
|
|
85
|
+
if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(frame)) {
|
|
86
|
+
suppressAndWarnOnce(prompt, { reason: 'unclassified-frame', mode: null, promptType: promptData.type }, `${frameKey}\u0000codex-model-picker`, 'poller:auto-yes-skipped-model-picker', { promptType: promptData.type });
|
|
87
|
+
return { kind: 'left-alone' };
|
|
88
|
+
}
|
|
89
|
+
// 3.5. Issue #1928 (§4 D1 decision 4): the generic numbered-list inference is
|
|
90
|
+
// not enough to send an answer. The detection above judges the ROWS, and the
|
|
91
|
+
// rows of an agent's own reply can be indistinguishable from a dialog's --
|
|
92
|
+
// opencode 1.18 answering "list three options and ask which one" is the
|
|
93
|
+
// reported case (#1896), and the `1` this poller sent in reply was not
|
|
94
|
+
// answering anything, it was SENT AS A USER UTTERANCE. What separates the two
|
|
95
|
+
// is position and chrome, which only the tool's own module knows, so the
|
|
96
|
+
// decision is delegated to `detectDialog` (the seam #1927 declared).
|
|
97
|
+
//
|
|
98
|
+
// Per tool, and only for tools whose dialogs were measured from their own
|
|
99
|
+
// live captures -- see AUTO_YES_DIALOG_GATE_DEFAULT_MODE. An ungated tool
|
|
100
|
+
// reaches `allowed: true` without being judged, which is the pre-#1928
|
|
101
|
+
// behaviour and the right one where nobody has measured anything.
|
|
102
|
+
//
|
|
103
|
+
// Recorded through the #1684 channel with the reason code #1924 landed for
|
|
104
|
+
// exactly this position, so `capture --json` and `cmate wait` can name the
|
|
105
|
+
// gap instead of showing a worker that silently went quiet.
|
|
106
|
+
const dialogGate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, promptData.type, frame);
|
|
107
|
+
if (!dialogGate.allowed) {
|
|
108
|
+
return { kind: 'dialog-gate-refused', dialogGate };
|
|
109
|
+
}
|
|
110
|
+
return { kind: 'ours' };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Step 3.5's record: the tool's dialog detector did not vouch for the frame and
|
|
114
|
+
* nothing was sent (Issue #1928). Split out of `suppressIfNotOursToAnswer` by
|
|
115
|
+
* Issue #3397, unchanged, so it runs after `tryEnterFallback` declined.
|
|
116
|
+
*/
|
|
117
|
+
function suppressUnclassifiedFrame(prompt, dialogGate) {
|
|
118
|
+
const { promptData, frameKey } = prompt;
|
|
119
|
+
suppressAndWarnOnce(prompt, { reason: 'unclassified-frame', mode: null, promptType: promptData.type }, `${frameKey}\u0000${dialogGate.dialog?.kind ?? ''}\u0000${dialogGate.mode}`, 'poller:auto-yes-skipped-unclassified-frame', {
|
|
120
|
+
promptType: promptData.type,
|
|
121
|
+
dialogKind: dialogGate.dialog?.kind ?? null,
|
|
122
|
+
answerMode: dialogGate.dialog?.answerMode ?? null,
|
|
123
|
+
gateMode: dialogGate.mode,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
@@ -6,15 +6,53 @@
|
|
|
6
6
|
* Uses SHA-256 content hash with an in-memory cache (Map<pollerKey, hash>).
|
|
7
7
|
* Design decision [DR1-006]: In-memory only (no DB layer).
|
|
8
8
|
* Process restart may cause a single duplicate, which is acceptable (KISS).
|
|
9
|
+
*
|
|
10
|
+
* ## How often the skip says so (Issue #3538)
|
|
11
|
+
*
|
|
12
|
+
* A full-screen TUI (copilot, opencode) keeps polling while it sits on a
|
|
13
|
+
* prompt, so the same prompt is a duplicate on every 2 s tick until it is
|
|
14
|
+
* answered, and `duplicate-prompt-skipped` used to be logged on each of them.
|
|
15
|
+
* The run of duplicate ticks is counted here, the same way `response-dedup`
|
|
16
|
+
* counts `duplicate-response-skipped` (#3519): the line is written on the first
|
|
17
|
+
* tick of a run and then once per {@link DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL}
|
|
18
|
+
* ticks. The count is about one particular cached hash, so it never outlives
|
|
19
|
+
* it — the functions below that drop or move the hash drop or move the count
|
|
20
|
+
* too. The one exception runs the other way: a tick that reads a frame with no
|
|
21
|
+
* live prompt on it ends the run without touching the hash
|
|
22
|
+
* ({@link resetDuplicatePromptSkipStreak}), because the prompt left the screen
|
|
23
|
+
* while the guard still has to keep it from being saved twice. A returning
|
|
24
|
+
* prompt is then still suppressed, but its first duplicate logs as the first
|
|
25
|
+
* of a new run.
|
|
26
|
+
*
|
|
27
|
+
* Only the log line is thinned. `recordPromptDedupSkip` (#1695) is still called
|
|
28
|
+
* on every duplicate tick; its tally is what `capture --json` reports.
|
|
9
29
|
*/
|
|
10
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL = void 0;
|
|
11
32
|
exports.isDuplicatePrompt = isDuplicatePrompt;
|
|
33
|
+
exports.claimDuplicatePromptSkipLog = claimDuplicatePromptSkipLog;
|
|
34
|
+
exports.resetDuplicatePromptSkipStreak = resetDuplicatePromptSkipStreak;
|
|
12
35
|
exports.clearPromptHashCache = clearPromptHashCache;
|
|
13
36
|
exports.renamePromptHashCacheKey = renamePromptHashCacheKey;
|
|
14
37
|
exports.normalizePromptForDedup = normalizePromptForDedup;
|
|
15
38
|
const crypto_1 = require("crypto");
|
|
16
39
|
const global_state_1 = require("../global-state");
|
|
40
|
+
const response_dedup_1 = require("./response-dedup");
|
|
17
41
|
const promptHashCache = (0, global_state_1.getOrInitGlobal)('__promptHashCache', () => new Map());
|
|
42
|
+
/**
|
|
43
|
+
* In-memory cache: pollerKey -> how many duplicate ticks in a row the current
|
|
44
|
+
* cached prompt hash has been skipped (Issue #3538). Absence means none yet.
|
|
45
|
+
*
|
|
46
|
+
* On `globalThis` for the same reason `promptHashCache` is, and cleared and
|
|
47
|
+
* moved at exactly the same moments — see the module comment.
|
|
48
|
+
*/
|
|
49
|
+
const duplicatePromptSkipStreak = (0, global_state_1.getOrInitGlobal)('__duplicatePromptSkipStreak', () => new Map());
|
|
50
|
+
/**
|
|
51
|
+
* How many duplicate ticks separate two `duplicate-prompt-skipped` lines
|
|
52
|
+
* (Issue #3538). Shared with `duplicate-response-skipped` (#3519): one line a
|
|
53
|
+
* minute at the poller's 2 s tick.
|
|
54
|
+
*/
|
|
55
|
+
exports.DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL = response_dedup_1.DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL;
|
|
18
56
|
/**
|
|
19
57
|
* Check if the given prompt content is a duplicate of the last saved prompt
|
|
20
58
|
* for the same pollerKey. If not a duplicate, updates the cache.
|
|
@@ -29,8 +67,46 @@ function isDuplicatePrompt(pollerKey, content) {
|
|
|
29
67
|
return true;
|
|
30
68
|
}
|
|
31
69
|
promptHashCache.set(pollerKey, hash);
|
|
70
|
+
// Issue #3538: a new prompt starts a new run of duplicate ticks.
|
|
71
|
+
duplicatePromptSkipStreak.delete(pollerKey);
|
|
32
72
|
return false;
|
|
33
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Count one duplicate prompt tick for this pollerKey and say whether it should
|
|
76
|
+
* be logged (Issue #3538).
|
|
77
|
+
*
|
|
78
|
+
* A claim: it advances the count, so call it exactly once per duplicate tick.
|
|
79
|
+
* Logs on the first tick of a run and then on every
|
|
80
|
+
* {@link DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL}th tick after it (ticks 1,
|
|
81
|
+
* 1+N, 1+2N, …).
|
|
82
|
+
*
|
|
83
|
+
* @param pollerKey - Poller key ("worktreeId:cliToolId")
|
|
84
|
+
* @returns Whether to log, the run length so far, and the ticks left unlogged
|
|
85
|
+
* since the previous line
|
|
86
|
+
*/
|
|
87
|
+
function claimDuplicatePromptSkipLog(pollerKey) {
|
|
88
|
+
const consecutive = (duplicatePromptSkipStreak.get(pollerKey) ?? 0) + 1;
|
|
89
|
+
duplicatePromptSkipStreak.set(pollerKey, consecutive);
|
|
90
|
+
const log = (consecutive - 1) % exports.DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL === 0;
|
|
91
|
+
const suppressed = consecutive === 1 ? 0 : exports.DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL - 1;
|
|
92
|
+
return { log, consecutive, suppressed };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* End the current run of duplicate prompt ticks for this pollerKey without
|
|
96
|
+
* touching the cached hash (Issue #3538).
|
|
97
|
+
*
|
|
98
|
+
* Called by `response-checker` on every tick that does not reach the prompt
|
|
99
|
+
* guard with a live prompt — a working screen, an unfinished frame, a reply.
|
|
100
|
+
* The prompt is no longer on screen, so if the same prompt comes back the next
|
|
101
|
+
* duplicate is the first of a new run and logs. The hash stays: whether the
|
|
102
|
+
* returning prompt is saved again is the guard's question (#565), and this
|
|
103
|
+
* Issue only thins the log line.
|
|
104
|
+
*
|
|
105
|
+
* @param pollerKey - Poller key ("worktreeId:cliToolId")
|
|
106
|
+
*/
|
|
107
|
+
function resetDuplicatePromptSkipStreak(pollerKey) {
|
|
108
|
+
duplicatePromptSkipStreak.delete(pollerKey);
|
|
109
|
+
}
|
|
34
110
|
/**
|
|
35
111
|
* Clear the prompt hash cache for a specific pollerKey.
|
|
36
112
|
* Called during session cleanup / stopPolling.
|
|
@@ -39,6 +115,8 @@ function isDuplicatePrompt(pollerKey, content) {
|
|
|
39
115
|
*/
|
|
40
116
|
function clearPromptHashCache(pollerKey) {
|
|
41
117
|
promptHashCache.delete(pollerKey);
|
|
118
|
+
// Issue #3538: the skip count is about the same hash.
|
|
119
|
+
duplicatePromptSkipStreak.delete(pollerKey);
|
|
42
120
|
}
|
|
43
121
|
/**
|
|
44
122
|
* Move the cached hash from one pollerKey to another.
|
|
@@ -57,9 +135,22 @@ function renamePromptHashCacheKey(oldKey, newKey) {
|
|
|
57
135
|
if (oldKey === newKey)
|
|
58
136
|
return;
|
|
59
137
|
const hash = promptHashCache.get(oldKey);
|
|
138
|
+
const streak = duplicatePromptSkipStreak.get(oldKey);
|
|
60
139
|
promptHashCache.delete(oldKey);
|
|
61
|
-
|
|
62
|
-
|
|
140
|
+
duplicatePromptSkipStreak.delete(oldKey);
|
|
141
|
+
if (hash === undefined)
|
|
142
|
+
return;
|
|
143
|
+
promptHashCache.set(newKey, hash);
|
|
144
|
+
// Issue #3538: the skip count moves with the hash, so a rename mid-run does
|
|
145
|
+
// not restart the thinning and log as if a new run had begun. Whenever the
|
|
146
|
+
// hash under `newKey` is replaced, so is its count — a count left over from
|
|
147
|
+
// the hash that was there before is about a different prompt.
|
|
148
|
+
if (streak !== undefined) {
|
|
149
|
+
duplicatePromptSkipStreak.set(newKey, streak);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
duplicatePromptSkipStreak.delete(newKey);
|
|
153
|
+
}
|
|
63
154
|
}
|
|
64
155
|
/**
|
|
65
156
|
* Normalize prompt content before deduplication check.
|
|
@@ -491,6 +491,15 @@ function extractCompletedTurn(ctx, output, lastCapturedLine) {
|
|
|
491
491
|
// Extract response
|
|
492
492
|
const result = extractResponse(output, lastCapturedLine, cliToolId, tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES);
|
|
493
493
|
if (!result || !result.isComplete) {
|
|
494
|
+
// Issue #3538: an unfinished frame was read and carries no live prompt (the
|
|
495
|
+
// early prompt check in `extractResponse` would have returned it complete),
|
|
496
|
+
// so a run of duplicate prompt ticks is over; the hash is kept — see the
|
|
497
|
+
// helper. Only when the frame WAS read: a null result is extraction being
|
|
498
|
+
// skipped on the line count ("no new output"), which says nothing about
|
|
499
|
+
// whether the prompt is still on screen, and neither do the cursor returns
|
|
500
|
+
// further down.
|
|
501
|
+
if (result)
|
|
502
|
+
(0, prompt_dedup_1.resetDuplicatePromptSkipStreak)(pollerKey);
|
|
494
503
|
// DR-004 windowing: Only check tail lines
|
|
495
504
|
const { thinkingPattern } = (0, cli_patterns_1.getCliToolPatterns)(cliToolId);
|
|
496
505
|
const cleanOutput = (0, cli_patterns_1.stripAnsi)(output);
|
|
@@ -565,7 +574,19 @@ function savePromptMessage(ctx, promptDetection, result, isFullScreenTui) {
|
|
|
565
574
|
// classified (#1676) look identical from the CLI — both say "nothing was
|
|
566
575
|
// recorded". Count the skip so the payload can tell them apart.
|
|
567
576
|
(0, prompt_dedup_state_1.recordPromptDedupSkip)(worktreeId, cliToolId, instanceId);
|
|
568
|
-
|
|
577
|
+
// Issue #3538: the tally above is counted on every tick; the log line is
|
|
578
|
+
// not. A full-screen TUI sits on its prompt for as long as it stays
|
|
579
|
+
// unanswered, a duplicate every 2 s. The first tick of a run logs exactly
|
|
580
|
+
// as before; after that one line per `DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL`
|
|
581
|
+
// ticks, with the run length and how many ticks went unlogged (#3519).
|
|
582
|
+
const skipLog = (0, prompt_dedup_1.claimDuplicatePromptSkipLog)(pollerKey);
|
|
583
|
+
if (skipLog.log) {
|
|
584
|
+
logger.info('duplicate-prompt-skipped', {
|
|
585
|
+
worktreeId,
|
|
586
|
+
cliToolId,
|
|
587
|
+
...(skipLog.consecutive > 1 ? { consecutive: skipLog.consecutive, suppressed: skipLog.suppressed } : {}),
|
|
588
|
+
});
|
|
589
|
+
}
|
|
569
590
|
return false;
|
|
570
591
|
}
|
|
571
592
|
// Issue #571: Clean TUI decorations from Copilot prompt content before saving
|
|
@@ -723,7 +744,21 @@ async function recheckDuplicateResponse(ctx, result, claudeMetadata) {
|
|
|
723
744
|
// logged nothing at all, so a reply that never reached History left no
|
|
724
745
|
// trace anywhere. Same action name shape as its sibling so both skips
|
|
725
746
|
// are found by one grep.
|
|
726
|
-
|
|
747
|
+
//
|
|
748
|
+
// Issue #3519: but not on every tick. A finished screen that stays up is a
|
|
749
|
+
// duplicate on each of the cycle's 900 ticks, and logging all of them was
|
|
750
|
+
// 51,933 lines a day. The first tick of a run logs exactly as before; after
|
|
751
|
+
// that one line per `DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL` ticks, with
|
|
752
|
+
// the run length and how many ticks went unlogged since the last line.
|
|
753
|
+
const skipLog = (0, response_dedup_1.claimDuplicateResponseSkipLog)(pollerKey);
|
|
754
|
+
if (skipLog.log) {
|
|
755
|
+
logger.info('duplicate-response-skipped', {
|
|
756
|
+
worktreeId,
|
|
757
|
+
cliToolId,
|
|
758
|
+
instanceId: resolvedInstanceId,
|
|
759
|
+
...(skipLog.consecutive > 1 ? { consecutive: skipLog.consecutive, suppressed: skipLog.suppressed } : {}),
|
|
760
|
+
});
|
|
761
|
+
}
|
|
727
762
|
(0, db_1.updateSessionState)(db, worktreeId, cliToolId, result.lineCount, resolvedInstanceId);
|
|
728
763
|
// Issue #2399: the skip above is about the SCREEN, and until this Issue
|
|
729
764
|
// it also ended the tick for the TRANSCRIPT READER 100 lines below —
|
|
@@ -1156,6 +1191,9 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
|
|
|
1156
1191
|
if (promptIsLive) {
|
|
1157
1192
|
return savePromptMessage(ctx, promptDetection, result, isFullScreenTui);
|
|
1158
1193
|
}
|
|
1194
|
+
// Issue #3538: a finished frame without a live prompt ends the run of
|
|
1195
|
+
// duplicate prompt ticks, as an unfinished one does in `extractCompletedTurn`.
|
|
1196
|
+
(0, prompt_dedup_1.resetDuplicatePromptSkipStreak)(pollerKey);
|
|
1159
1197
|
// Validate response content is not empty
|
|
1160
1198
|
if (!result.response || result.response.trim() === '') {
|
|
1161
1199
|
(0, db_1.updateSessionState)(db, worktreeId, cliToolId, result.lineCount, resolvedInstanceId);
|
|
@@ -39,10 +39,22 @@
|
|
|
39
39
|
* hash, and the worktree rename all have to treat the two the same, and the
|
|
40
40
|
* only way to guarantee that without touching `response-poller-core` (which
|
|
41
41
|
* owns those three calls) is for one function to clear both.
|
|
42
|
+
*
|
|
43
|
+
* ## The third cache: how often the skip says so (#3519)
|
|
44
|
+
*
|
|
45
|
+
* The skip logs `duplicate-response-skipped` so a reply missing from History
|
|
46
|
+
* leaves a grep-able trace (#1695). Logged on every tick, a screen that stays
|
|
47
|
+
* up writes that line every 2 s for the whole cycle — 51,933 lines in 24 h,
|
|
48
|
+
* 80% of the server log. The run of duplicate ticks is counted here so the line
|
|
49
|
+
* is written on the first tick of a run and then once per
|
|
50
|
+
* {@link DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL} ticks. The count is about
|
|
51
|
+
* one particular cached hash, so it lives and dies with it for the same reason
|
|
52
|
+
* the recheck does.
|
|
42
53
|
*/
|
|
43
54
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
-
exports.STRUCTURED_HISTORY_RECHECK_TICK_INTERVAL = void 0;
|
|
55
|
+
exports.DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL = exports.STRUCTURED_HISTORY_RECHECK_TICK_INTERVAL = void 0;
|
|
45
56
|
exports.isDuplicateResponse = isDuplicateResponse;
|
|
57
|
+
exports.claimDuplicateResponseSkipLog = claimDuplicateResponseSkipLog;
|
|
46
58
|
exports.markStructuredHistoryRecheckPending = markStructuredHistoryRecheckPending;
|
|
47
59
|
exports.settleStructuredHistoryRecheck = settleStructuredHistoryRecheck;
|
|
48
60
|
exports.claimStructuredHistoryRecheck = claimStructuredHistoryRecheck;
|
|
@@ -79,6 +91,25 @@ const structuredHistoryRecheckCache = (0, global_state_1.getOrInitGlobal)('__str
|
|
|
79
91
|
* or the cycle ends, the entry is gone.
|
|
80
92
|
*/
|
|
81
93
|
exports.STRUCTURED_HISTORY_RECHECK_TICK_INTERVAL = 3;
|
|
94
|
+
/**
|
|
95
|
+
* In-memory cache: pollerKey -> how many duplicate ticks in a row the current
|
|
96
|
+
* cached hash has been skipped (Issue #3519). Absence means none yet.
|
|
97
|
+
*
|
|
98
|
+
* On `globalThis` for the same reason `responseHashCache` is, and cleared and
|
|
99
|
+
* moved at exactly the same moments — see the module comment. A new
|
|
100
|
+
* (non-duplicate) response restarts it in {@link isDuplicateResponse}.
|
|
101
|
+
*/
|
|
102
|
+
const duplicateResponseSkipStreak = (0, global_state_1.getOrInitGlobal)('__duplicateResponseSkipStreak', () => new Map());
|
|
103
|
+
/**
|
|
104
|
+
* How many duplicate ticks separate two `duplicate-response-skipped` lines
|
|
105
|
+
* (Issue #3519).
|
|
106
|
+
*
|
|
107
|
+
* At the poller's 2 s tick this is one line a minute while a finished screen
|
|
108
|
+
* stays up, so a 900-tick cycle writes 30 lines instead of 899. The first tick
|
|
109
|
+
* of a run always logs, so the #1695 trace — "this reply was skipped, at this
|
|
110
|
+
* time" — is still there for every run; what is dropped is the repetition.
|
|
111
|
+
*/
|
|
112
|
+
exports.DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL = 30;
|
|
82
113
|
/**
|
|
83
114
|
* Check whether the given response content was already saved during the current
|
|
84
115
|
* polling cycle for the same pollerKey. If it is new, updates the cache.
|
|
@@ -93,8 +124,30 @@ function isDuplicateResponse(pollerKey, content) {
|
|
|
93
124
|
return true;
|
|
94
125
|
}
|
|
95
126
|
responseHashCache.set(pollerKey, hash);
|
|
127
|
+
// Issue #3519: a new response starts a new run of duplicate ticks.
|
|
128
|
+
duplicateResponseSkipStreak.delete(pollerKey);
|
|
96
129
|
return false;
|
|
97
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Count one duplicate tick for this pollerKey and say whether it should be
|
|
133
|
+
* logged (Issue #3519).
|
|
134
|
+
*
|
|
135
|
+
* A claim, like {@link claimStructuredHistoryRecheck}: it advances the count, so
|
|
136
|
+
* call it exactly once per duplicate tick. Logs on the first tick of a run and
|
|
137
|
+
* then on every {@link DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL}th tick after
|
|
138
|
+
* it (ticks 1, 1+N, 1+2N, …).
|
|
139
|
+
*
|
|
140
|
+
* @param pollerKey - Poller key ("worktreeId:instanceId")
|
|
141
|
+
* @returns Whether to log, the run length so far, and the ticks left unlogged
|
|
142
|
+
* since the previous line
|
|
143
|
+
*/
|
|
144
|
+
function claimDuplicateResponseSkipLog(pollerKey) {
|
|
145
|
+
const consecutive = (duplicateResponseSkipStreak.get(pollerKey) ?? 0) + 1;
|
|
146
|
+
duplicateResponseSkipStreak.set(pollerKey, consecutive);
|
|
147
|
+
const log = (consecutive - 1) % exports.DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL === 0;
|
|
148
|
+
const suppressed = consecutive === 1 ? 0 : exports.DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL - 1;
|
|
149
|
+
return { log, consecutive, suppressed };
|
|
150
|
+
}
|
|
98
151
|
/**
|
|
99
152
|
* Note that the transcript reader has unfinished business for this pollerKey
|
|
100
153
|
* (Issue #2399).
|
|
@@ -177,6 +230,8 @@ function claimStructuredHistoryRecheck(pollerKey) {
|
|
|
177
230
|
function clearResponseHashCache(pollerKey) {
|
|
178
231
|
responseHashCache.delete(pollerKey);
|
|
179
232
|
structuredHistoryRecheckCache.delete(pollerKey);
|
|
233
|
+
// Issue #3519: the skip count is about the same hash.
|
|
234
|
+
duplicateResponseSkipStreak.delete(pollerKey);
|
|
180
235
|
}
|
|
181
236
|
/**
|
|
182
237
|
* Move the cached hash from one pollerKey to another.
|
|
@@ -206,4 +261,10 @@ function renameResponseHashCacheKey(oldKey, newKey) {
|
|
|
206
261
|
structuredHistoryRecheckCache.delete(oldKey);
|
|
207
262
|
if (ticksToWait !== undefined)
|
|
208
263
|
structuredHistoryRecheckCache.set(newKey, ticksToWait);
|
|
264
|
+
// Issue #3519: the skip count moves with the hash too, so a rename mid-run
|
|
265
|
+
// does not restart the thinning and log as if a new run had begun.
|
|
266
|
+
const streak = duplicateResponseSkipStreak.get(oldKey);
|
|
267
|
+
duplicateResponseSkipStreak.delete(oldKey);
|
|
268
|
+
if (streak !== undefined)
|
|
269
|
+
duplicateResponseSkipStreak.set(newKey, streak);
|
|
209
270
|
}
|
|
@@ -322,8 +322,8 @@ function shortSessionTag(sessionId) {
|
|
|
322
322
|
/**
|
|
323
323
|
* Forget every `stop` one session of one instance has claimed (Issue #3289).
|
|
324
324
|
*
|
|
325
|
-
* Every subtype: antigravity
|
|
326
|
-
* beside the plain one.
|
|
325
|
+
* Every subtype: antigravity (#2614) and claude (#3430) post `stop` /
|
|
326
|
+
* `self_resume_pending` beside the plain one.
|
|
327
327
|
*/
|
|
328
328
|
function releaseStopClaims(composite, sessionId) {
|
|
329
329
|
releaseClaims(composite, ['stop'], sessionId);
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
* @module lib/session/agent-event-state
|
|
40
40
|
*/
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.STRUCTURED_PROMPT_PROVISIONAL_MAX_AGE_MS = exports.recordAskUserQuestion = exports.getAskUserQuestion = exports.clearAskUserQuestion = exports.isAwaitingInstruction = exports.getAwaitingInstruction = exports.STRUCTURED_STATE_MAX_AGE_MS = exports.getStructuredSessionState = exports.observeScraperCompletionEvidence = exports.joinOpenTurnFromDuplicate = exports.getPublishedAgentTurn = exports.getPendingDecisions = exports.getAgentTurn = exports.closeAgentTurn = exports.recordCapturedModelInfo = exports.recordAgentReportedModel = exports.recordAgentReportedEffort = exports.onAgentModelChange = exports.isSameAgentModelName = exports.getResolvedAgentModelInfo = exports.getLastReportedAgentEffort = exports.getLastKnownAgentModel = exports.getLastKnownAgentEffort = exports.getLastCapturedModelInfo = exports.getAgentModelBaseline = exports.AGENT_MODEL_EFFORT_SUFFIX_PATTERN = exports.shortSessionTag = exports.LIFECYCLE_AGENT_EVENT_TYPES = exports.isDuplicateAgentEvent = exports.getRecentEventKeyCount = exports.getRecentEventIdentityCount = exports.getAgentEventDropCounts = exports.classifyAgentEventDelivery = exports.agentEventKeyClaimedAt = exports.AGENT_EVENT_DEDUP_WINDOW_MS = void 0;
|
|
42
|
+
exports.STRUCTURED_PROMPT_PROVISIONAL_MAX_AGE_MS = exports.recordAskUserQuestion = exports.getAskUserQuestion = exports.clearAskUserQuestion = exports.isAwaitingInstruction = exports.getAwaitingInstruction = exports.STRUCTURED_STATE_MAX_AGE_MS = exports.getStructuredSessionState = exports.observeScraperCompletionEvidence = exports.joinOpenTurnFromDuplicate = exports.isPreToolUseOutsideTurn = exports.getPublishedAgentTurn = exports.getPendingDecisions = exports.getAgentTurn = exports.closeAgentTurn = exports.recordCapturedModelInfo = exports.recordAgentReportedModel = exports.recordAgentReportedEffort = exports.onAgentModelChange = exports.isSameAgentModelName = exports.getResolvedAgentModelInfo = exports.getLastReportedAgentEffort = exports.getLastKnownAgentModel = exports.getLastKnownAgentEffort = exports.getLastCapturedModelInfo = exports.getAgentModelBaseline = exports.AGENT_MODEL_EFFORT_SUFFIX_PATTERN = exports.shortSessionTag = exports.LIFECYCLE_AGENT_EVENT_TYPES = exports.isDuplicateAgentEvent = exports.getRecentEventKeyCount = exports.getRecentEventIdentityCount = exports.getAgentEventDropCounts = exports.classifyAgentEventDelivery = exports.agentEventKeyClaimedAt = exports.AGENT_EVENT_DEDUP_WINDOW_MS = void 0;
|
|
43
43
|
exports.recordAgentStopEvent = recordAgentStopEvent;
|
|
44
44
|
exports.getLastStopEventAt = getLastStopEventAt;
|
|
45
45
|
exports.recordAgentEvent = recordAgentEvent;
|
|
@@ -92,6 +92,7 @@ Object.defineProperty(exports, "closeAgentTurn", { enumerable: true, get: functi
|
|
|
92
92
|
Object.defineProperty(exports, "getAgentTurn", { enumerable: true, get: function () { return agent_event_turn_2.getAgentTurn; } });
|
|
93
93
|
Object.defineProperty(exports, "getPendingDecisions", { enumerable: true, get: function () { return agent_event_turn_2.getPendingDecisions; } });
|
|
94
94
|
Object.defineProperty(exports, "getPublishedAgentTurn", { enumerable: true, get: function () { return agent_event_turn_2.getPublishedAgentTurn; } });
|
|
95
|
+
Object.defineProperty(exports, "isPreToolUseOutsideTurn", { enumerable: true, get: function () { return agent_event_turn_2.isPreToolUseOutsideTurn; } });
|
|
95
96
|
Object.defineProperty(exports, "joinOpenTurnFromDuplicate", { enumerable: true, get: function () { return agent_event_turn_2.joinOpenTurnFromDuplicate; } });
|
|
96
97
|
Object.defineProperty(exports, "observeScraperCompletionEvidence", { enumerable: true, get: function () { return agent_event_turn_2.observeScraperCompletionEvidence; } });
|
|
97
98
|
var agent_event_structured_state_2 = require("../../lib/session/agent-event-structured-state");
|