mixdog 1.2.3 → 1.2.4
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/package.json +1 -1
- package/scripts/gate-local.mjs +6 -4
- package/scripts/lib/gate-scheduler.mjs +29 -11
- package/scripts/probe-provider-catalog.mjs +31 -0
- package/scripts/provider-pingpong-live.mjs +128 -38
- package/scripts/session-sweep.mjs +5 -25
- package/src/agents/maintainer/AGENT.md +1 -1
- package/src/agents/maintainer/agent.json +1 -1
- package/src/agents/reviewer/AGENT.md +2 -4
- package/src/agents/security/AGENT.md +1 -2
- package/src/agents/writer/AGENT.md +2 -3
- package/src/defaults/shipped-history.json +6 -1
- package/src/defaults/skills/image/SKILL.md +21 -23
- package/src/lib/keychain-cjs.cjs +13 -11
- package/src/rules/agent/AGENT.md +7 -5
- package/src/rules/lead/LEAD.md +7 -9
- package/src/rules/shared/45-destructive.md +4 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2 -5
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +81 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +109 -5
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +107 -37
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
- package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +41 -11
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +67 -5
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +14 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +14 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +9 -6
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +7 -2
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +26 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +12 -6
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +14 -6
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +6 -1
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +22 -10
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +33 -7
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +11 -2
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +9 -5
- package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
- package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +60 -16
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +11 -13
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +30 -19
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +42 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +13 -9
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +1 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +18 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +36 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +11 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +1 -4
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +0 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +7 -6
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +5 -4
- package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +14 -4
- package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +15 -3
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +6 -2
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +10 -10
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +46 -8
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
- package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -11
- package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +28 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +2 -4
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +0 -27
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +1 -4
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +8 -9
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +1 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +3 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +21 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +38 -13
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +19 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
- package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
- package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +29 -8
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
- package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +32 -14
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +17 -33
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/side-question.mjs +12 -7
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +5 -12
- package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
- package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +5 -11
- package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -32
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +136 -196
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +50 -116
- package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
- package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +7 -8
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
- package/src/runtime/agent/orchestrator/session/store.mjs +3 -16
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +11 -12
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +37 -13
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
- package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
- package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +204 -10
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
- package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
- package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +200 -17
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
- package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
- package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
- package/src/runtime/attachments/store.d.mts +9 -0
- package/src/runtime/attachments/store.mjs +80 -9
- package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
- package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
- package/src/runtime/computer-bridge/action-schema.mjs +178 -178
- package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
- package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
- package/src/runtime/effort-judge/judge-client.mjs +21 -4
- package/src/runtime/effort-judge/judge-worker.mjs +4 -1
- package/src/runtime/github/tool.mjs +118 -17
- package/src/runtime/media/adapters/codex-image.mjs +140 -21
- package/src/runtime/media/catalog.mjs +4 -4
- package/src/runtime/media/chatgpt-usage.mjs +55 -0
- package/src/runtime/media/defaults.mjs +37 -0
- package/src/runtime/media/jobs.mjs +12 -2
- package/src/runtime/media/lanes.mjs +12 -0
- package/src/runtime/media/tool-defs.mjs +15 -4
- package/src/runtime/media/tool.mjs +41 -12
- package/src/runtime/media/upstream-error.mjs +72 -6
- package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
- package/src/runtime/memory/lib/pg/process.mjs +5 -7
- package/src/runtime/memory/lib/pg/supervisor.mjs +4 -1
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/html-browser.mjs +18 -8
- package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-html-measure.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
- package/src/runtime/office/core/office-write-ledger.mjs +1 -5
- package/src/runtime/office/index.mjs +2 -3
- package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
- package/src/runtime/session-search/session-search-ingest.mjs +1 -1
- package/src/runtime/shared/agent-reap-state.mjs +13 -0
- package/src/runtime/shared/atomic-file.d.mts +1 -1
- package/src/runtime/shared/background-tasks.mjs +6 -1
- package/src/runtime/shared/bounded-line-diff.mjs +11 -2
- package/src/runtime/shared/browser-launch.mjs +15 -0
- package/src/runtime/shared/err-text.mjs +42 -4
- package/src/runtime/shared/file-lock.mjs +6 -5
- package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
- package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
- package/src/runtime/shared/model-route-chain.d.mts +8 -0
- package/src/runtime/shared/model-route-chain.mjs +48 -0
- package/src/runtime/shared/model-route-fallback.mjs +22 -0
- package/src/runtime/shared/pid-liveness.mjs +12 -0
- package/src/runtime/shared/provider-api-key.mjs +6 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
- package/src/runtime/shared/quiet-progress.d.mts +35 -0
- package/src/runtime/shared/quiet-progress.mjs +101 -0
- package/src/runtime/shared/quota-resume-store.mjs +32 -1
- package/src/runtime/shared/read-row-numbers.mjs +44 -0
- package/src/runtime/shared/remote-intent.mjs +2 -42
- package/src/runtime/shared/slow-span.mjs +8 -1
- package/src/runtime/shared/statusline/statusline-segments.mjs +24 -2
- package/src/runtime/shared/tool-card-model/card-header.mjs +2 -1
- package/src/runtime/shared/tool-output-budget.mjs +2 -0
- package/src/runtime/shared/tool-result-summary.mjs +16 -2
- package/src/runtime/shared/tool-status.mjs +3 -2
- package/src/runtime/shared/tool-surface.mjs +2 -3
- package/src/runtime/shared/tool-work-units.mjs +22 -15
- package/src/runtime/shared/transcript-metadata.mjs +49 -1
- package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
- package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
- package/src/runtime/shared/transcript-writer.mjs +14 -4
- package/src/runtime/shared/turn-changes.mjs +2 -1
- package/src/runtime/shared/turn-snapshot.mjs +11 -3
- package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
- package/src/runtime/shared/worktrees/carry.mjs +6 -4
- package/src/runtime/shared/worktrees/contract.mjs +27 -1
- package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
- package/src/runtime/shared/worktrees/file-recovery.mjs +29 -13
- package/src/runtime/shared/worktrees/git-head.mjs +22 -13
- package/src/runtime/shared/worktrees/include.mjs +125 -7
- package/src/runtime/shared/worktrees/lock.mjs +1 -1
- package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
- package/src/runtime/shared/worktrees/manager.mjs +378 -32
- package/src/runtime/shared/worktrees/owner.mjs +2 -1
- package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
- package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
- package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
- package/src/runtime/terminal-bridge/client.mjs +14 -10
- package/src/session-runtime/boot/apis.mjs +7 -1
- package/src/session-runtime/boot/config.mjs +2 -0
- package/src/session-runtime/boot/facade.mjs +3 -0
- package/src/session-runtime/boot/session.mjs +3 -2
- package/src/session-runtime/boot/tools.mjs +3 -0
- package/src/session-runtime/conversation-import/service.mjs +1 -1
- package/src/session-runtime/goal-facade-api.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +44 -18
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +22 -8
- package/src/session-runtime/internal-tool-executor.mjs +2 -0
- package/src/session-runtime/lifecycle/cold-heir.mjs +0 -1
- package/src/session-runtime/lifecycle/session-catalog.mjs +14 -16
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +18 -53
- package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
- package/src/session-runtime/lifecycle/shared.mjs +5 -6
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
- package/src/session-runtime/lifecycle/teardown.mjs +7 -16
- package/src/session-runtime/media-api.mjs +8 -0
- package/src/session-runtime/model-route/route-ownership.mjs +60 -0
- package/src/session-runtime/model-route/route-persist.mjs +3 -2
- package/src/session-runtime/model-route/set-route.mjs +114 -34
- package/src/session-runtime/model-route/web-search-route.mjs +7 -2
- package/src/session-runtime/model-route-api.mjs +4 -2
- package/src/session-runtime/native-web-search/routes.mjs +37 -24
- package/src/session-runtime/native-web-search.mjs +9 -8
- package/src/session-runtime/provider-auth/setup.mjs +4 -0
- package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
- package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
- package/src/session-runtime/provider-models.mjs +1 -0
- package/src/session-runtime/provider-usage.mjs +4 -0
- package/src/session-runtime/route-resolution.mjs +3 -1
- package/src/session-runtime/runtime-core.mjs +4 -0
- package/src/session-runtime/runtime-facade.mjs +6 -0
- package/src/session-runtime/services/agent-task-status.mjs +2 -0
- package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
- package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
- package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
- package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
- package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
- package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
- package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
- package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +9 -6
- package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
- package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
- package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -9
- package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
- package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
- package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
- package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
- package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
- package/src/session-runtime/services/agent-tool/worker-index.mjs +28 -8
- package/src/session-runtime/services/agent-tool.mjs +4 -0
- package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
- package/src/session-runtime/services/provider-admin.mjs +77 -0
- package/src/session-runtime/session-create/session-options.mjs +7 -5
- package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
- package/src/session-runtime/session-transcript.mjs +4 -5
- package/src/session-runtime/session-turn-api.mjs +3 -9
- package/src/session-runtime/settings-builtin-tools-api.mjs +9 -6
- package/src/session-runtime/setup-tool/executor.mjs +23 -5
- package/src/session-runtime/setup-tool/extended-actions.mjs +6 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +7 -2
- package/src/session-runtime/setup-tool/tool-defs.mjs +13 -1
- package/src/session-runtime/tool-policy-refresh.mjs +83 -32
- package/src/session-runtime/turn/agent-ops.mjs +49 -2
- package/src/session-runtime/turn/side-question-ops.mjs +1 -4
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +2 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +4 -0
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +8 -2
- package/src/session-runtime/turn/turn-run.mjs +1 -36
- package/src/session-runtime/usage-stats-api.mjs +4 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
- package/src/session-runtime/workspace/admission-gate.mjs +44 -15
- package/src/session-runtime/workspace/project-branches.mjs +28 -36
- package/src/session-runtime/workspace/transition-steps.mjs +96 -95
- package/src/session-runtime/workspace/transitions.mjs +248 -68
- package/src/standalone/channel-transport.mjs +3 -4
- package/src/standalone/daemon-desktop-runtime.mjs +32 -1
- package/src/standalone/daemon-pg-stop.mjs +1 -3
- package/src/standalone/daemon-session-control.mjs +88 -0
- package/src/standalone/daemon-stored-session-views.mjs +23 -3
- package/src/standalone/daemon.mjs +2 -0
- package/src/standalone/local-session-runtime.mjs +11 -12
- package/src/standalone/session-protocol.mjs +7 -0
- package/src/standalone/session-runtime-inline-host.mjs +2 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
- package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
- package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
- package/src/standalone/session-service/agent-tree.mjs +28 -2
- package/src/standalone/session-service/entries/session-loads.mjs +16 -5
- package/src/standalone/session-service/entries.mjs +1 -0
- package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
- package/src/standalone/session-service/quota-resume.mjs +28 -13
- package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
- package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
- package/src/standalone/session-tool-output.mjs +82 -0
- package/src/tui/app/app-view.jsx +2 -1
- package/src/tui/app/provider-setup/provider-items.mjs +8 -0
- package/src/tui/app/provider-setup-picker.mjs +15 -3
- package/src/tui/app/slash-commands.mjs +6 -0
- package/src/tui/app/slash-dispatch/session-commands.mjs +49 -0
- package/src/tui/components/Spinner.jsx +4 -0
- package/src/tui/components/SpinnerByline.jsx +21 -2
- package/src/tui/components/status-line/local-line.mjs +10 -2
- package/src/tui/dist/index.mjs +478 -251
- package/src/tui/session/active-tool-summary.mjs +1 -1
- package/src/tui/session/context-state.mjs +0 -3
- package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
- package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
- package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
- package/src/tui/session/quota-resume.mjs +140 -61
- package/src/tui/session/session-api/commands.mjs +4 -10
- package/src/tui/session/session-api/controls.mjs +12 -0
- package/src/tui/session/session-api/lifecycle/dispose.mjs +2 -9
- package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
- package/src/tui/session/session-api/lifecycle.mjs +13 -11
- package/src/tui/session/session-api/media.mjs +2 -0
- package/src/tui/session/session-api/routes.mjs +81 -57
- package/src/tui/session/session-api/settings.mjs +3 -3
- package/src/tui/session/session-api/worktree.mjs +3 -2
- package/src/tui/session/session-flow/auto-clear.mjs +1 -3
- package/src/tui/session/session-flow/drain.mjs +6 -4
- package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
- package/src/tui/session/session-flow/queue.mjs +1 -1
- package/src/tui/session/tool-approval.mjs +17 -8
- package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
- package/src/tui/session/tui-steering-persist.mjs +3 -5
- package/src/tui/session/turn-quiet.mjs +53 -0
- package/src/tui/session/turn-stream.mjs +5 -1
- package/src/tui/session/turn.mjs +38 -31
- package/src/tui/session/worktree-setup-notice.mjs +38 -0
- package/src/tui/spinner-meta.mjs +10 -0
- package/src/tui/spinner-verbs.mjs +3 -0
- package/src/ui/statusline.mjs +13 -3
- package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
- package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
- package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
- package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -302
- package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
- package/src/session-runtime/turn/share-ops.mjs +0 -77
- package/src/tui/session/cross-surface-share.mjs +0 -406
- package/src/tui/session/live-share/delta.mjs +0 -153
- package/src/tui/session/live-share/mirror.mjs +0 -106
- package/src/tui/session/live-share/owner.mjs +0 -254
- package/src/tui/session/live-share/retry.mjs +0 -54
- package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
- package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
- package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
- package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
- package/src/tui/session/live-share/viewer.mjs +0 -99
- package/src/tui/session/live-share/wire.mjs +0 -44
- package/src/tui/session/live-share.mjs +0 -154
- package/src/tui/session/shared-dir-watch.mjs +0 -69
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from './loop/tool-helpers.mjs';
|
|
10
10
|
import { repairTranscriptBeforeProviderSend } from './loop/transcript-repair.mjs';
|
|
11
11
|
import { resetAccountProbePacing } from '../providers/account-pool.mjs';
|
|
12
|
-
import { createLoopState, finishLoop
|
|
12
|
+
import { createLoopState, finishLoop } from './loop/loop-state.mjs';
|
|
13
13
|
import { applyRetryAction, beginIteration, sendProviderRequest, settleSendResult } from './loop/send-phase.mjs';
|
|
14
14
|
import { runToolPhase } from './loop/tool-phase.mjs';
|
|
15
15
|
|
|
@@ -25,7 +25,6 @@ export {
|
|
|
25
25
|
resolvePreToolAskApproval,
|
|
26
26
|
approvalGranted,
|
|
27
27
|
approvalReason,
|
|
28
|
-
shouldSuppressAgentMidTurnText,
|
|
29
28
|
};
|
|
30
29
|
|
|
31
30
|
/**
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// The Agents pool's quiet-time inputs: each row whose turn is in flight in
|
|
2
|
+
// this process carries its last counted progress stamp, its runtime stage
|
|
3
|
+
// (and running tool), and its agent's stall-watchdog warn point. Display
|
|
4
|
+
// only — nothing here reads or changes the watchdog's abort policy.
|
|
5
|
+
import { displayProgressStage, lastProgressAt } from '../../../shared/quiet-progress.mjs';
|
|
6
|
+
import { resolveAgentStallThresholds } from '../stall-policy.mjs';
|
|
7
|
+
|
|
8
|
+
/** `rows` with progress fields on every row `runtimeEntry(sessionId)` reports
|
|
9
|
+
* in flight; other rows pass through untouched. */
|
|
10
|
+
export function withTurnProgress(rows, runtimeEntry, isTurnInFlight) {
|
|
11
|
+
return rows.map((row) => {
|
|
12
|
+
const entry = runtimeEntry(row?.sessionId);
|
|
13
|
+
if (!isTurnInFlight(entry)) return row;
|
|
14
|
+
const stage = typeof entry.stage === 'string' ? entry.stage : null;
|
|
15
|
+
return {
|
|
16
|
+
...row,
|
|
17
|
+
progressAt: lastProgressAt(entry) || null,
|
|
18
|
+
// `model_thinking` while the sent request waits for its headers.
|
|
19
|
+
progressStage: displayProgressStage(entry),
|
|
20
|
+
progressTool: stage === 'tool_running' ? entry.lastToolCall || null : null,
|
|
21
|
+
stallWarnMs: resolveAgentStallThresholds(row.agent).warn * 1000,
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
}
|
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
// One freshness authority for eager admission, cross-turn references and
|
|
2
2
|
// serial cache hits. A readOnlyHint alone never proves a result reusable.
|
|
3
3
|
import { tryReadCached } from './read-cache.mjs';
|
|
4
|
+
import { isCursorNativeCallId } from '../../providers/cursor-native-context.mjs';
|
|
4
5
|
import { tryScopedToolCached } from './scoped-cache.mjs';
|
|
5
|
-
import { _isReadTool, _isScopedCacheableTool, _stripMcpPrefix } from '../loop/tool-classify.mjs';
|
|
6
|
+
import { _isReadTool, _isScopedCacheableTool, _stripMcpPrefix, requiresReadBody } from '../loop/tool-classify.mjs';
|
|
6
7
|
|
|
7
|
-
export function lookupToolResultReuse({ sessionId, call, cwd, touch = true }) {
|
|
8
|
+
export function lookupToolResultReuse({ sessionId, call, cwd, touch = true, sessionRef = null }) {
|
|
9
|
+
if (isCursorNativeCallId(call.id)) return null;
|
|
8
10
|
if (!sessionId) return null;
|
|
9
11
|
if (_isReadTool(call.name)) {
|
|
10
12
|
const entry = tryReadCached({ sessionId, args: call.arguments, cwd });
|
|
13
|
+
if (
|
|
14
|
+
requiresReadBody(call.name, sessionRef) &&
|
|
15
|
+
typeof entry?.content === 'string' &&
|
|
16
|
+
/^(?:\[file unchanged:|\[cross-turn-dedup\]|\[intra-turn-dedup\])/.test(entry.content)
|
|
17
|
+
)
|
|
18
|
+
return null;
|
|
11
19
|
return entry === null ? null : { kind: 'read', entry };
|
|
12
20
|
}
|
|
13
21
|
if (_isScopedCacheableTool(call.name)) {
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* the ordinary session catalog.
|
|
4
4
|
*
|
|
5
5
|
* Everything runs on one worker thread (./worker.mjs): the catalog engine's
|
|
6
|
-
* change detection (summary index, sessions directory, per-file stamps,
|
|
7
|
-
*
|
|
6
|
+
* change detection (summary index, sessions directory, per-file stamps,
|
|
7
|
+
* background verification) feeds `<dataDir>/session-catalog.sqlite`
|
|
8
8
|
* and an ordinary listing is one request that answers from it. This thread
|
|
9
9
|
* does no filesystem work for it and never loads node:sqlite.
|
|
10
10
|
*
|
|
@@ -24,7 +24,6 @@ import { dataDir as currentDataDir } from '../store-summary-locations.mjs';
|
|
|
24
24
|
export const SESSION_CATALOG_DB_FILE = 'session-catalog.sqlite';
|
|
25
25
|
/** Config: `{ "sessionStore": { "sqliteCatalog": false } }` forces the JSON
|
|
26
26
|
* path (an off-switch); absent or true uses the DB whenever it can. */
|
|
27
|
-
export const SESSION_STORE_CONFIG_SECTION = 'sessionStore';
|
|
28
27
|
export const SESSION_STORE_CONFIG_DEFAULTS = Object.freeze({ sqliteCatalog: true });
|
|
29
28
|
/** Stable prefix of every daemon.log line of the catalog DB. */
|
|
30
29
|
export const SESSION_CATALOG_LOG_PREFIX = '[session-catalog-db]';
|
|
@@ -11,7 +11,7 @@ import { createHash } from 'node:crypto';
|
|
|
11
11
|
|
|
12
12
|
/** Bumped whenever the table layout or a codec changes: the DB is then
|
|
13
13
|
* dropped and backfilled again from the JSON catalog. */
|
|
14
|
-
export const SCHEMA_VERSION =
|
|
14
|
+
export const SCHEMA_VERSION = 6;
|
|
15
15
|
/** PRAGMA application_id ('MXSC'): a file without it is not this catalog. */
|
|
16
16
|
export const APPLICATION_ID = 0x4d585343;
|
|
17
17
|
|
|
@@ -27,8 +27,6 @@ const FIELDS = [
|
|
|
27
27
|
['lastUsedAt', 'last_used_at', 'real'],
|
|
28
28
|
['createdAt', 'created_at', 'real'],
|
|
29
29
|
['lastHeartbeatAt', 'last_heartbeat_at', 'real'],
|
|
30
|
-
// Always 0 in a stored row: liveness is overlaid from `.hb` sidecars at read.
|
|
31
|
-
['heartbeatAt', 'heartbeat_at', 'real'],
|
|
32
30
|
['closed', 'closed', 'bool'],
|
|
33
31
|
['status', 'status', 'text'],
|
|
34
32
|
['owner', 'owner', 'loose'],
|
|
@@ -195,16 +193,10 @@ export function rowFromDb(record) {
|
|
|
195
193
|
return row;
|
|
196
194
|
}
|
|
197
195
|
|
|
198
|
-
|
|
199
|
-
const OVERLAY_KEYS = new Set(['heartbeatAt', 'agentHeartbeatAt']);
|
|
200
|
-
|
|
201
|
-
/** Comparable JSON of a row's stored fields (overlays excluded). */
|
|
196
|
+
/** Comparable JSON of a row's stored fields. */
|
|
202
197
|
function comparable(row) {
|
|
203
198
|
const out = [];
|
|
204
|
-
for (const [key] of FIELDS)
|
|
205
|
-
if (OVERLAY_KEYS.has(key)) continue;
|
|
206
|
-
out.push(row[key] === undefined ? null : row[key]);
|
|
207
|
-
}
|
|
199
|
+
for (const [key] of FIELDS) out.push(row[key] === undefined ? null : row[key]);
|
|
208
200
|
return JSON.stringify(out);
|
|
209
201
|
}
|
|
210
202
|
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
//
|
|
3
3
|
// It owns `<dataDir>/session-catalog.sqlite` and runs the ordinary catalog
|
|
4
4
|
// engine (store-summary-catalog.mjs): the summary index stamps and delta-log
|
|
5
|
-
// apply, the sessions-directory name diff, per-file stamps
|
|
6
|
-
//
|
|
5
|
+
// apply, the sessions-directory name diff, per-file stamps and the background
|
|
6
|
+
// verification. An ordinary listing is one `list` request: the
|
|
7
7
|
// engine's cheap stamp check runs first (so changes by any writer appear as
|
|
8
8
|
// soon as they do on the JSON path), its changes are written to the DB, and
|
|
9
9
|
// the answer comes from the DB. When one of the daemon's own writes changed a
|
|
@@ -20,8 +20,7 @@ import { existsSync, mkdirSync, readFileSync, renameSync, statSync } from 'node:
|
|
|
20
20
|
import { dirname, join } from 'node:path';
|
|
21
21
|
import { performance } from 'node:perf_hooks';
|
|
22
22
|
import { postWorkerEvent, serveWorkerRequests } from '../../../../shared/worker-requests.mjs';
|
|
23
|
-
import {
|
|
24
|
-
import { positiveNumber } from '../store-summary-fields.mjs';
|
|
23
|
+
import { createOrdinaryCatalog, isLeadVisibleRow } from '../store-summary-catalog.mjs';
|
|
25
24
|
import { SQLITE_REQUIREMENT, sqliteVersionSupported } from './sqlite-gate.mjs';
|
|
26
25
|
import {
|
|
27
26
|
APPLICATION_ID,
|
|
@@ -514,30 +513,15 @@ function switchedOff(s) {
|
|
|
514
513
|
return s.switchOff.value;
|
|
515
514
|
}
|
|
516
515
|
|
|
517
|
-
/** Rows from the DB
|
|
516
|
+
/** Rows from the DB. */
|
|
518
517
|
function answer(s, page) {
|
|
519
|
-
const heartbeatMtimes = s.engine.current()?.heartbeatMtimes ?? new Map();
|
|
520
|
-
const live = [];
|
|
521
|
-
for (const [id, heartbeatAt] of heartbeatMtimes) {
|
|
522
|
-
const entry = resolve(s, id);
|
|
523
|
-
if (entry) live.push({ ...entry.row, heartbeatAt });
|
|
524
|
-
}
|
|
525
|
-
const agentHeartbeatByOwner = agentHeartbeatsByOwner(live);
|
|
526
|
-
const overlay = (row) => {
|
|
527
|
-
const agentHeartbeatAt = agentHeartbeatByOwner.get(row.id) || 0;
|
|
528
|
-
return {
|
|
529
|
-
...row,
|
|
530
|
-
heartbeatAt: positiveNumber(heartbeatMtimes.get(row.id), 0),
|
|
531
|
-
...(agentHeartbeatAt > 0 ? { agentHeartbeatAt } : {}),
|
|
532
|
-
};
|
|
533
|
-
};
|
|
534
518
|
const { statements } = s;
|
|
535
|
-
if (!page) return { rows: statements.listAll.all().map(
|
|
519
|
+
if (!page) return { rows: statements.listAll.all().map(rowFromDb), more: false };
|
|
536
520
|
const { limit, after } = page;
|
|
537
521
|
const records = after
|
|
538
522
|
? statements.listAfter.all(after.activity, after.activity, after.id, limit + 1)
|
|
539
523
|
: statements.listFirst.all(limit + 1);
|
|
540
|
-
return { rows: records.slice(0, limit).map(
|
|
524
|
+
return { rows: records.slice(0, limit).map(rowFromDb), more: records.length > limit };
|
|
541
525
|
}
|
|
542
526
|
|
|
543
527
|
const unavailable = (reason, final = false) => ({ status: 'unavailable', reason, final });
|
|
@@ -4,6 +4,7 @@ import { SUMMARY_PREFIX } from './constants.mjs';
|
|
|
4
4
|
import { sha16, roleCounts } from './text-utils.mjs';
|
|
5
5
|
import { carryMessageId, withoutMessageIdsReplacer } from '../message-ids.mjs';
|
|
6
6
|
import {
|
|
7
|
+
contextAckMessage,
|
|
7
8
|
isActualUserInstructionMessage,
|
|
8
9
|
isInjectedSkillBodyMessage,
|
|
9
10
|
isProtectedContextUserMessage,
|
|
@@ -27,6 +28,7 @@ export function makeSummaryMessage(content) {
|
|
|
27
28
|
// User-message classification lives in the import-light user-message-kind.mjs
|
|
28
29
|
// (the session store counts real turns with it); re-exported for callers.
|
|
29
30
|
export {
|
|
31
|
+
contextAckMessage,
|
|
30
32
|
isActualUserInstructionMessage,
|
|
31
33
|
isInjectedSkillBodyMessage,
|
|
32
34
|
isProtectedContextUserMessage,
|
|
@@ -10,6 +10,8 @@ import {
|
|
|
10
10
|
textByteLength,
|
|
11
11
|
} from './text-utils.mjs';
|
|
12
12
|
import {
|
|
13
|
+
contextAckMessage,
|
|
14
|
+
isProtectedContextAckMessage,
|
|
13
15
|
isSummaryMessage,
|
|
14
16
|
latestActualUserInstructionIndex,
|
|
15
17
|
latestActualUserInstructionMessage,
|
|
@@ -20,7 +22,7 @@ import { buildExecutionTail } from './execution-tail.mjs';
|
|
|
20
22
|
import { latestSkillBodies } from '../../context/skill-state.mjs';
|
|
21
23
|
import { effectiveBudget } from './budget.mjs';
|
|
22
24
|
import { stripRuntimeUserContext, withRuntimeUserContext } from '../runtime-user-context.mjs';
|
|
23
|
-
import { carryMessageId } from '../message-ids.mjs';
|
|
25
|
+
import { carryMessageId, messageIdOf } from '../message-ids.mjs';
|
|
24
26
|
import { normalizeIngestRole, shouldExcludeIngestMessage } from '../../../../memory/lib/session-ingest.mjs';
|
|
25
27
|
import { codexWireSendOpts } from '../manager/session-id.mjs';
|
|
26
28
|
import { rebaseCompactedEffortConfiguration } from '../../providers/effort-configuration.mjs';
|
|
@@ -48,9 +50,11 @@ function splitFreshSource(messages) {
|
|
|
48
50
|
const sanitized = redactToolCallSecretsInMessages(reconcileDedupStubs(sanitizeToolPairs(messages)));
|
|
49
51
|
const { protectedPrefix, conversation } = splitProtectedContext(sanitized);
|
|
50
52
|
let previousSummaryMessage = null;
|
|
53
|
+
let previousAck = null;
|
|
51
54
|
for (let index = conversation.length - 1; index >= 0; index -= 1) {
|
|
52
55
|
if (isSummaryMessage(conversation[index])) {
|
|
53
56
|
previousSummaryMessage = conversation[index];
|
|
57
|
+
if (isProtectedContextAckMessage(conversation[index + 1])) previousAck = conversation[index + 1];
|
|
54
58
|
break;
|
|
55
59
|
}
|
|
56
60
|
}
|
|
@@ -59,6 +63,7 @@ function splitFreshSource(messages) {
|
|
|
59
63
|
protectedPrefix,
|
|
60
64
|
previousSummary: previousSummaryMessage?.content || null,
|
|
61
65
|
previousSummaryMessage,
|
|
66
|
+
previousAck,
|
|
62
67
|
// Budgeting, AI input and rule-only retention use this same projection.
|
|
63
68
|
// Keep current-turn reminders; remove only proven runtime additions from
|
|
64
69
|
// older requests. Unmarked legacy text remains part of the summary budget.
|
|
@@ -505,6 +510,15 @@ function freshSkillBudget(targetBudget, budget, committed) {
|
|
|
505
510
|
return Math.max(0, Math.min(25_000, Math.floor(targetBudget * 0.2), budget - estimateMessagesTokens(committed)));
|
|
506
511
|
}
|
|
507
512
|
|
|
513
|
+
// Every pass rebuilds the ack; it keeps the previous ack's id so the archive
|
|
514
|
+
// does not count an unchanged ack as dropped, unless the tail still holds it.
|
|
515
|
+
function stableAckMessage(previousAck, volatileTail) {
|
|
516
|
+
const ack = contextAckMessage();
|
|
517
|
+
const id = messageIdOf(previousAck);
|
|
518
|
+
if (!id || volatileTail.some((message) => messageIdOf(message) === id)) return ack;
|
|
519
|
+
return carryMessageId(ack, previousAck);
|
|
520
|
+
}
|
|
521
|
+
|
|
508
522
|
// The pieces every fresh context carries: the protected prefix, the handoff
|
|
509
523
|
// summary (or the previous one when no handoff was produced), the stable
|
|
510
524
|
// acknowledgement between them and the volatile tail. `mandatory` is what
|
|
@@ -518,7 +532,7 @@ function freshContextLayout(source, budgetTokens, opts) {
|
|
|
518
532
|
? fitFreshContextSummaryMessage(source.live, handoffText, Number.MAX_SAFE_INTEGER)
|
|
519
533
|
: source.previousSummaryMessage;
|
|
520
534
|
const tail = freshContextTail(source, budgetTokens, !replaceConversation, opts);
|
|
521
|
-
const stableAck = tail.latestUser && summaryMessage ?
|
|
535
|
+
const stableAck = tail.latestUser && summaryMessage ? stableAckMessage(source.previousAck, tail.volatileTail) : null;
|
|
522
536
|
const stableHead = [
|
|
523
537
|
...source.protectedPrefix,
|
|
524
538
|
...(summaryMessage ? [summaryMessage] : []),
|
|
@@ -55,6 +55,34 @@ export function isInjectedSkillBodyMessage(m) {
|
|
|
55
55
|
return typeof m.content === 'string' && m.content.trimStart().startsWith('<skill>');
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
const CONTEXT_ACK_SOURCE = 'context-ack';
|
|
59
|
+
|
|
60
|
+
/** The assistant `.` that closes an injected context turn (compact summary,
|
|
61
|
+
* reminder, reference files) so the next prompt stays its own message. It is
|
|
62
|
+
* model context only and never displayed. */
|
|
63
|
+
export function contextAckMessage() {
|
|
64
|
+
return { role: 'assistant', content: '.', meta: { source: CONTEXT_ACK_SOURCE } };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Whether `message` is a context ack: marked, or (stored before the marker
|
|
68
|
+
* existed) a bare `.` right after injected context (`previous`). */
|
|
69
|
+
export function isContextAckMessage(message, previous = null) {
|
|
70
|
+
if (
|
|
71
|
+
message?.role !== 'assistant' ||
|
|
72
|
+
typeof message.content !== 'string' ||
|
|
73
|
+
message.content.trim() !== '.' ||
|
|
74
|
+
Array.isArray(message.toolCalls)
|
|
75
|
+
) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
if (message.meta?.source === CONTEXT_ACK_SOURCE) return true;
|
|
79
|
+
return (
|
|
80
|
+
isSummaryMessage(previous) ||
|
|
81
|
+
isProtectedContextUserMessage(previous) ||
|
|
82
|
+
(previous?.role === 'user' && /^Reference files:\s*/i.test(userMessageText(previous).trimStart()))
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
58
86
|
const SYNTHETIC_USER_SOURCES = new Set([
|
|
59
87
|
'goal-continuation',
|
|
60
88
|
'goal-closeout',
|
|
@@ -25,7 +25,7 @@ import { renameWithRetrySync } from '../../../shared/atomic-file.mjs';
|
|
|
25
25
|
import { writeStderrBestEffort } from '../../../shared/best-effort-stderr.mjs';
|
|
26
26
|
|
|
27
27
|
import { sanitizeContentForStoredHistory } from '../providers/media-normalization.mjs';
|
|
28
|
-
import { getStoreDir } from './store/paths
|
|
28
|
+
import { getStoreDir } from './store/session-paths.mjs';
|
|
29
29
|
import { forgetSessionSaveBaseline } from './store/save-worker.mjs';
|
|
30
30
|
import { messageIdOf, stampMessageIds } from './message-ids.mjs';
|
|
31
31
|
import { restoreTranscriptItems } from './transcript-restore/restore.mjs';
|
|
@@ -113,12 +113,6 @@ export function createCodexReducer() {
|
|
|
113
113
|
};
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
export function convertCodexRecords(records) {
|
|
117
|
-
const reducer = createCodexReducer();
|
|
118
|
-
for (const record of records) reducer.push(record);
|
|
119
|
-
return reducer.result();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
116
|
/** id/cwd of a `session_meta` first line cut off by a bounded prefix read. */
|
|
123
117
|
export function codexMetaFromTruncatedLine(line) {
|
|
124
118
|
const text = String(line || '');
|
|
@@ -76,7 +76,7 @@ export function createEagerAdmission({ tools, cwd, sessionId, sessionRef, repeat
|
|
|
76
76
|
// The same cache policy authorizes both serial cache hits and short
|
|
77
77
|
// cross-turn references. Recheck there: an entry can expire or be
|
|
78
78
|
// invalidated between streaming admission and serial consumption.
|
|
79
|
-
if (lookupToolResultReuse({ sessionId, call, cwd, touch: false }) !== null) return null;
|
|
79
|
+
if (lookupToolResultReuse({ sessionId, call, cwd, touch: false, sessionRef }) !== null) return null;
|
|
80
80
|
return { sig, dedupEligible };
|
|
81
81
|
}
|
|
82
82
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Named sessions no longer receive automatic tombstones. Ownerless legacy
|
|
2
|
+
// records still follow idle retention, so their closures are not historical.
|
|
3
|
+
export function isHistoricalAutomaticClosure(session) {
|
|
4
|
+
return (
|
|
5
|
+
typeof session?.owner === 'string' &&
|
|
6
|
+
session.owner.length > 0 &&
|
|
7
|
+
(session?.closed === true || session?.status === 'closed') &&
|
|
8
|
+
(session.closedReason === 'idle-sweep' || session.closedReason === 'terminal-reap')
|
|
9
|
+
);
|
|
10
|
+
}
|
|
@@ -100,15 +100,12 @@ export function buildIntermediateAssistantMessage(resp, opts) {
|
|
|
100
100
|
// recovery, and interruption; deferBodies keeps mutation bodies verbatim for
|
|
101
101
|
// the rest of the session (collapsing them later rewrote an already-cached
|
|
102
102
|
// prefix and re-billed the request uncached).
|
|
103
|
-
export function buildToolCallAssistantMessage(response, { calls,
|
|
103
|
+
export function buildToolCallAssistantMessage(response, { calls, opts }) {
|
|
104
104
|
return attachAssistantTranscriptMetadata(
|
|
105
105
|
{
|
|
106
106
|
role: 'assistant',
|
|
107
107
|
createdAt: Date.now(),
|
|
108
|
-
|
|
109
|
-
// response.content (the real result rides the later final-answer
|
|
110
|
-
// turn). Blank it so it never accumulates as input tokens.
|
|
111
|
-
content: suppressMidTurnText ? '' : response.content || '',
|
|
108
|
+
content: response.content || '',
|
|
112
109
|
toolCalls: compactToolCallsForHistory(calls, { deferBodies: true }),
|
|
113
110
|
...assistantEchoFields(assistantEchoPayloads(response, { keepAssistantBlocks: true })),
|
|
114
111
|
},
|
|
@@ -612,9 +612,7 @@ export function fixedRequestOverhead(policy, messages, tools, sessionRef = null)
|
|
|
612
612
|
const calibration = policyTokenCalibration(policy);
|
|
613
613
|
const toProviderScale = (raw) => Math.ceil(Math.max(0, raw) * calibration);
|
|
614
614
|
const toolTokens = toProviderScale(policyRequestReserveTokens(policy));
|
|
615
|
-
const systemTokens = toProviderScale(
|
|
616
|
-
estimateMessagesTokens(splitProtectedContext(messages || []).protectedPrefix)
|
|
617
|
-
);
|
|
615
|
+
const systemTokens = toProviderScale(estimateMessagesTokens(splitProtectedContext(messages || []).protectedPrefix));
|
|
618
616
|
const configuredReserve = Math.max(0, Number(policy.configuredReserveTokens) || 0);
|
|
619
617
|
const fixed = toolTokens + systemTokens;
|
|
620
618
|
// A provider reading of this very prefix with these very tools measured
|
|
@@ -676,7 +674,7 @@ export function fixedRequestOverheadInputs(policy, messages) {
|
|
|
676
674
|
function measuredFixedRequestTokens(sessionRef, messages, policy) {
|
|
677
675
|
if (!sessionRef || !Array.isArray(messages)) return null;
|
|
678
676
|
const aligned = providerBaselineCoverage(sessionRef, messages);
|
|
679
|
-
if (!aligned
|
|
677
|
+
if (!aligned?.toolSignature || aligned.toolSignature !== policy?.toolSchemaSignature) return null;
|
|
680
678
|
return aligned.tokens;
|
|
681
679
|
}
|
|
682
680
|
|
|
@@ -62,11 +62,11 @@ export class ToolSurfaceExceedsContextError extends Error {
|
|
|
62
62
|
const headline = reserve
|
|
63
63
|
? 'The configured compaction headroom leaves no room for conversation history'
|
|
64
64
|
: 'Tool definitions and system context leave no room for conversation history';
|
|
65
|
+
const fewerReservedHint =
|
|
66
|
+
overhead.configuredReserveTokens > 0 ? ', or configure fewer reserved tokens (compaction.reservedTokens)' : '';
|
|
65
67
|
const remedy = reserve
|
|
66
68
|
? 'Lower the configured headroom (compaction.reservedTokens or MIXDOG_AGENT_COMPACT_RESERVED_TOKENS), or use a model with a larger context window.'
|
|
67
|
-
: `Use a model with a larger context window, or send a smaller eager tool surface (disable MCP servers or custom tools this session does not need)${
|
|
68
|
-
overhead.configuredReserveTokens > 0 ? ', or configure fewer reserved tokens (compaction.reservedTokens)' : ''
|
|
69
|
-
}.`;
|
|
69
|
+
: `Use a model with a larger context window, or send a smaller eager tool surface (disable MCP servers or custom tools this session does not need)${fewerReservedHint}.`;
|
|
70
70
|
const largest = overhead.largestTools.map((tool) => `${tool.name} (${tokens(tool.tokens)})`).join(', ');
|
|
71
71
|
super(
|
|
72
72
|
[
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
* request-loop bookkeeping, plus the
|
|
4
4
|
* helpers every phase shares (abort check, steering drain, no-tool resolver).
|
|
5
5
|
*/
|
|
6
|
-
import { isAgentOwner } from '../../agent-owner.mjs';
|
|
7
6
|
import { SessionClosedError } from '../manager/session-errors.mjs';
|
|
8
7
|
import { resolveLiveToolCwd } from './tool-exec.mjs';
|
|
9
8
|
import { createSteeringDrain } from './steering.mjs';
|
|
@@ -20,19 +19,6 @@ export const REPEAT_FAIL_LIMIT = 3;
|
|
|
20
19
|
// (drop-oldest / insertion order).
|
|
21
20
|
export const CROSS_TURN_CAP = 500;
|
|
22
21
|
|
|
23
|
-
// Agent mid-turn text is suppressed unless THIS send explicitly requested a
|
|
24
|
-
// live projection. The request is a send-opt (`liveProjection`) — never a
|
|
25
|
-
// durable session field — so a transient Agent pane cannot leak into later
|
|
26
|
-
// silent dispatches or stored session JSON. The standalone surface still
|
|
27
|
-
// flips `interactiveSessionSurface` on the in-memory session; honor that
|
|
28
|
-
// in-process hint without treating it as something dispatch should persist.
|
|
29
|
-
export function shouldSuppressAgentMidTurnText(sessionRef, opts = {}) {
|
|
30
|
-
if (!isAgentOwner(sessionRef)) return false;
|
|
31
|
-
if (opts?.liveProjection === true) return false;
|
|
32
|
-
if (sessionRef?.interactiveSessionSurface === true) return false;
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
22
|
export function createLoopState({ provider, messages, model, tools, cwd, sendOpts }) {
|
|
37
23
|
const opts = sendOpts || {};
|
|
38
24
|
const sessionId = opts.sessionId || null;
|
|
@@ -44,17 +30,6 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
|
|
|
44
30
|
if (sessionRef && Object.hasOwn(sessionRef, '_providerToolSurfaceSnapshot')) {
|
|
45
31
|
delete sessionRef._providerToolSurfaceSnapshot;
|
|
46
32
|
}
|
|
47
|
-
// Sub-agent (worker/heavy-worker/reviewer/…) sessions drop mid-turn
|
|
48
|
-
// assistant preamble text outright. Only the final <final-answer> reply is
|
|
49
|
-
// consumed by Lead, so any "Now let me…" prose that precedes a tool call is
|
|
50
|
-
// pure noise — for live surfacing AND for the agent's own history (where it
|
|
51
|
-
// re-enters context as input tokens on every later turn):
|
|
52
|
-
// - streaming : opts.onTextDelta suppressed (token-by-token preamble)
|
|
53
|
-
// - buffered : opts.onAssistantText skipped (response.content)
|
|
54
|
-
// - history : tool-call turn content blanked before messages.push
|
|
55
|
-
// Reasoning/thinking deltas, tool calls, and the final answer are kept.
|
|
56
|
-
const suppressMidTurnText = shouldSuppressAgentMidTurnText(sessionRef, opts);
|
|
57
|
-
if (suppressMidTurnText) opts.onTextDelta = undefined;
|
|
58
33
|
// Out-of-loop transcript mutations (post-turn/manual compaction in
|
|
59
34
|
// manager/compaction-runner.mjs) run where no send opts exist; they park a
|
|
60
35
|
// one-shot intent on the session so the FIRST send of the next turn tags
|
|
@@ -74,7 +49,6 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
|
|
|
74
49
|
sessionRef,
|
|
75
50
|
sessionAgent: opts.session?.agent,
|
|
76
51
|
forcedFirstTool: opts.forcedFirstTool ?? null,
|
|
77
|
-
suppressMidTurnText,
|
|
78
52
|
// sessionRef.cwd is the live SSOT. The legacy positional cwd is only the
|
|
79
53
|
// turn-start snapshot and becomes stale after an in-turn cwd tool call.
|
|
80
54
|
cwd: resolveLiveToolCwd(cwd, sessionRef),
|
|
@@ -157,7 +131,6 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
|
|
|
157
131
|
opts,
|
|
158
132
|
sessionId,
|
|
159
133
|
sessionAgent: state.sessionAgent,
|
|
160
|
-
suppressMidTurnText,
|
|
161
134
|
drainSteering: state.drainSteering,
|
|
162
135
|
});
|
|
163
136
|
return state;
|
|
@@ -20,7 +20,7 @@ function resumePrompt(response, attempt) {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export function resolveOutputLimit(response, { state, segments, messages }) {
|
|
23
|
-
segments.record(response.content
|
|
23
|
+
segments.record(response.content);
|
|
24
24
|
if (state.maxOutputRecoveryCount < MAX_OUTPUT_RECOVERY_LIMIT) {
|
|
25
25
|
// The partial assistant turn must be visible to the model so it can
|
|
26
26
|
// resume at the exact cutoff instead of reconstructing or repeating
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// Committed-but-unsealed text segments of one user turn.
|
|
2
2
|
//
|
|
3
|
-
// Max-output recovery parts plus
|
|
3
|
+
// Max-output recovery parts plus text-only continuation
|
|
4
4
|
// segments (provider pause_turn / terminal steering / stop hook). The terminal
|
|
5
5
|
// response returns content = parts + terminal so the UI row that accumulated
|
|
6
6
|
// every streamed segment is not overwritten down to only the last segment;
|
|
7
7
|
// historyContent keeps persistence single-copy.
|
|
8
8
|
import { buildIntermediateAssistantMessage, commitAssistantMessage } from '../assistant-commit.mjs';
|
|
9
9
|
|
|
10
|
-
export function createTurnSegments({ messages, opts
|
|
10
|
+
export function createTurnSegments({ messages, opts }) {
|
|
11
11
|
const parts = [];
|
|
12
12
|
return {
|
|
13
13
|
parts,
|
|
@@ -18,15 +18,9 @@ export function createTurnSegments({ messages, opts, suppressMidTurnText }) {
|
|
|
18
18
|
return true;
|
|
19
19
|
},
|
|
20
20
|
// Record a mid-turn segment for the caller-facing aggregate and surface it
|
|
21
|
-
// live
|
|
22
|
-
// text — except on the max-output ladder, whose parts must still rebuild
|
|
23
|
-
// the complete answer the caller receives (keepWhenSuppressed).
|
|
21
|
+
// live for every session.
|
|
24
22
|
// `committed: true` marks text that is the just-committed message's own.
|
|
25
|
-
record(text, {
|
|
26
|
-
if (suppressMidTurnText) {
|
|
27
|
-
if (keepWhenSuppressed) parts.push(text);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
23
|
+
record(text, { committed = false } = {}) {
|
|
30
24
|
parts.push(text);
|
|
31
25
|
try {
|
|
32
26
|
opts.onAssistantText?.(text, { committed });
|
|
@@ -19,15 +19,8 @@ import { resolveRefusal } from './no-tool-turn/refusal.mjs';
|
|
|
19
19
|
import { resumeContinuation } from './no-tool-turn/continuation.mjs';
|
|
20
20
|
import { nudgeEmptyTurn } from './no-tool-turn/empty-nudge.mjs';
|
|
21
21
|
|
|
22
|
-
export function createNoToolTurnResolver({
|
|
23
|
-
messages,
|
|
24
|
-
opts,
|
|
25
|
-
sessionId,
|
|
26
|
-
sessionAgent,
|
|
27
|
-
suppressMidTurnText,
|
|
28
|
-
drainSteering,
|
|
29
|
-
}) {
|
|
30
|
-
const segments = createTurnSegments({ messages, opts, suppressMidTurnText });
|
|
22
|
+
export function createNoToolTurnResolver({ messages, opts, sessionId, sessionAgent, drainSteering }) {
|
|
23
|
+
const segments = createTurnSegments({ messages, opts });
|
|
31
24
|
// Per-turn recovery counters shared by the ladders.
|
|
32
25
|
const state = {
|
|
33
26
|
maxOutputRecoveryCount: 0,
|
|
@@ -103,7 +103,10 @@ export function preDispatchDenyForSession(sessionRef, call) {
|
|
|
103
103
|
// its wire id with the projection error; call_tool itself never dispatches.
|
|
104
104
|
if (typeof call.bridgeError === 'string') return call.bridgeError;
|
|
105
105
|
if (name === BRIDGE_CALL_TOOL_NAME && isToolBridgeEnabled(sessionRef)) {
|
|
106
|
-
return bridgeErrorText(
|
|
106
|
+
return bridgeErrorText(
|
|
107
|
+
'BRIDGE_RECURSION',
|
|
108
|
+
'call_tool runs one tool named in its arguments and cannot be dispatched itself.'
|
|
109
|
+
);
|
|
107
110
|
}
|
|
108
111
|
const schemaName = String(call?.schemaName || name);
|
|
109
112
|
// A tool the provider left out of this request still exists in the session;
|
|
@@ -13,7 +13,10 @@ import { actionInputUnionFor } from '../../providers/lib/action-input-contract.m
|
|
|
13
13
|
import { isAntigravityClaude } from '../../providers/antigravity-request.mjs';
|
|
14
14
|
import { isResponsesFreeformTool } from '../../providers/custom-tool-wire.mjs';
|
|
15
15
|
import { ANTHROPIC_NATIVE_PROVIDERS } from '../../runtime-core/tool-catalog-schema.mjs';
|
|
16
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
finalizeProviderRequestTools,
|
|
18
|
+
providerNativeToolPrefixCount,
|
|
19
|
+
} from '../../runtime-core/provider-request-tools.mjs';
|
|
17
20
|
|
|
18
21
|
const sessions = new WeakMap();
|
|
19
22
|
|
|
@@ -5,10 +5,7 @@
|
|
|
5
5
|
import { repairTranscriptBeforeProviderSend } from './transcript-repair.mjs';
|
|
6
6
|
import { messagesArrayChanged } from './tool-helpers.mjs';
|
|
7
7
|
import { runPreSendCompactPass } from '../pre-send-compact.mjs';
|
|
8
|
-
import {
|
|
9
|
-
refreshDeferredMcpToolCatalog,
|
|
10
|
-
snapshotProviderRequestTools,
|
|
11
|
-
} from '../../runtime-core/tool-catalog.mjs';
|
|
8
|
+
import { refreshDeferredMcpToolCatalog, snapshotProviderRequestTools } from '../../runtime-core/tool-catalog.mjs';
|
|
12
9
|
import {
|
|
13
10
|
finalizeProviderRequestTools,
|
|
14
11
|
providerNativeToolPrefixCount,
|