mixdog 1.2.2 → 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/README.md +18 -0
- package/package.json +2 -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 +599 -0
- package/scripts/session-sweep.mjs +5 -25
- package/src/agents/advisor/AGENT.md +1 -1
- package/src/agents/advisor/agent.json +1 -1
- 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 +11 -1
- package/src/defaults/skills/image/SKILL.md +21 -23
- package/src/defaults/skills/setup/SKILL.md +6 -1
- package/src/defaults/skills/setup/references/actions.md +44 -22
- package/src/defaults/skills/setup/references/surfaces.md +10 -8
- package/src/headless-exec.mjs +15 -8
- package/src/lib/keychain-cjs.cjs +20 -15
- package/src/output-styles/common.md +11 -10
- package/src/rules/agent/AGENT.md +6 -4
- 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/agent-trace-io.mjs +92 -61
- package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
- package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
- package/src/runtime/agent/orchestrator/config.mjs +5 -0
- package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
- 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-api-request.mjs +48 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +9 -9
- 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 +31 -15
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +10 -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 +131 -9
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +125 -8
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +12 -62
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +117 -41
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
- package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +39 -5
- 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 +42 -11
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +109 -6
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +17 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -2
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +73 -7
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +75 -6
- package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
- package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
- package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +29 -5
- package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +36 -13
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +101 -11
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
- 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 +19 -14
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +371 -41
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +97 -49
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +81 -10
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +35 -8
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +253 -42
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
- package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +392 -0
- package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
- package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
- package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
- package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +50 -22
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +133 -21
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +92 -16
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -13
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +133 -62
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +39 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +84 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
- package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +155 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +40 -24
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +63 -25
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +183 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +87 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +103 -26
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +23 -4
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +11 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +17 -2
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
- 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/output-items.mjs +23 -10
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +28 -5
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +72 -24
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +50 -16
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -19
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -36
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +18 -9
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +181 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +78 -70
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +74 -0
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +150 -10
- package/src/runtime/agent/orchestrator/providers/registry.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
- package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
- package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +164 -0
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +522 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +195 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +104 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +24 -0
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
- 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/provider-request-snapshot.mjs +7 -3
- package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +16 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +178 -71
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +102 -12
- package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
- 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 +5 -11
- package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
- package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +16 -93
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +148 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
- 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 +3 -2
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -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 +89 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
- package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -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 +24 -10
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +135 -0
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +31 -4
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +10 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +29 -5
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +147 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -5
- 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 +23 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +54 -13
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +11 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +22 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
- 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 +231 -16
- 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 +47 -17
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +26 -4
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +36 -35
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +4 -10
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +17 -1
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/side-question.mjs +197 -0
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +22 -15
- 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/live-state.mjs +23 -0
- 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 +44 -37
- package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
- 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 -21
- 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 +4 -2
- 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-archived-agent.mjs +34 -15
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +53 -115
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +10 -1
- 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 +17 -10
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
- package/src/runtime/agent/orchestrator/session/store.mjs +22 -19
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +12 -12
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +38 -14
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
- package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +79 -0
- 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/bash-policy-scan.mjs +8 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
- 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/bash-tool.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +218 -20
- 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 +247 -49
- 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/runtime-capabilities.mjs +23 -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/dispatch/root-resolution.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
- 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/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
- package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
- 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 +219 -196
- 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 +208 -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/index.mjs +1 -0
- package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
- package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
- package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
- package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
- package/src/runtime/memory/lib/pg/process.mjs +36 -33
- package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +112 -4
- package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
- package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
- package/src/runtime/office/README.md +1 -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/html-document-author.mjs +2 -0
- package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-measure.mjs +3 -1
- package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +3 -1
- package/src/runtime/office/core/office-actions-read.mjs +3 -0
- package/src/runtime/office/core/office-render-preview.mjs +2 -0
- package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
- package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
- package/src/runtime/office/core/office-sessions.mjs +5 -0
- package/src/runtime/office/core/office-transactions.mjs +3 -0
- package/src/runtime/office/core/office-write-ledger.mjs +94 -0
- package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
- package/src/runtime/office/index.mjs +29 -0
- package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
- package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
- package/src/runtime/office/pdf/pdf-render.mjs +23 -7
- package/src/runtime/office/pdf/pdf-security.mjs +2 -0
- package/src/runtime/office/portable/portable-opc.mjs +4 -1
- package/src/runtime/office/quality/visual-diff.mjs +2 -0
- 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-file-read.mjs +13 -0
- package/src/runtime/shared/bounded-line-diff.mjs +191 -0
- package/src/runtime/shared/browser-launch.mjs +15 -0
- package/src/runtime/shared/buffered-appender.mjs +18 -0
- package/src/runtime/shared/config.mjs +78 -18
- package/src/runtime/shared/err-text.mjs +48 -4
- package/src/runtime/shared/file-lock.mjs +6 -5
- package/src/runtime/shared/file-permissions.d.mts +6 -1
- package/src/runtime/shared/file-permissions.mjs +54 -6
- package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
- package/src/runtime/shared/llm/anthropic-effort.mjs +6 -0
- package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
- package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
- package/src/runtime/shared/loopback-listener.mjs +9 -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 +8 -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/review-diff.mjs +52 -0
- package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
- package/src/runtime/shared/session-sidebar-host.mjs +38 -0
- package/src/runtime/shared/slow-span.mjs +121 -0
- package/src/runtime/shared/statusline/statusline-segments.mjs +52 -6
- package/src/runtime/shared/tool-card-model/card-header.mjs +7 -1
- package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
- package/src/runtime/shared/tool-card-model.mjs +5 -2
- package/src/runtime/shared/tool-output-budget.mjs +2 -0
- package/src/runtime/shared/tool-output-limit.mjs +4 -0
- package/src/runtime/shared/tool-primitives.mjs +13 -0
- package/src/runtime/shared/tool-result-summary.mjs +22 -1
- package/src/runtime/shared/tool-status.mjs +3 -2
- package/src/runtime/shared/tool-surface.mjs +20 -6
- package/src/runtime/shared/tool-work-units.mjs +54 -11
- 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/purge.mjs +74 -0
- package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
- package/src/runtime/shared/transcript-writer.mjs +24 -6
- package/src/runtime/shared/turn-changes.mjs +269 -100
- package/src/runtime/shared/turn-review-reply.mjs +8 -39
- package/src/runtime/shared/turn-snapshot-store.mjs +19 -108
- package/src/runtime/shared/turn-snapshot.mjs +865 -683
- package/src/runtime/shared/turn-worktree-snapshot.mjs +183 -255
- package/src/runtime/shared/user-data-guard.mjs +262 -49
- 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 +533 -0
- package/src/runtime/shared/worktrees/contract.mjs +60 -0
- package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
- package/src/runtime/shared/worktrees/file-recovery.mjs +84 -0
- package/src/runtime/shared/worktrees/git-head.mjs +214 -0
- package/src/runtime/shared/worktrees/git.mjs +8 -3
- 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 +525 -31
- package/src/runtime/shared/worktrees/merge.mjs +31 -21
- package/src/runtime/shared/worktrees/owner.mjs +2 -1
- package/src/runtime/shared/worktrees/paths.d.mts +6 -0
- 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 +57 -20
- package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
- package/src/runtime/tidy/apply.mjs +47 -2
- package/src/runtime/tidy/run-engines.mjs +11 -5
- package/src/session-runtime/agent-tool-routing.mjs +19 -13
- package/src/session-runtime/boot/apis.mjs +20 -6
- package/src/session-runtime/boot/config.mjs +2 -0
- package/src/session-runtime/boot/facade.mjs +4 -0
- package/src/session-runtime/boot/infrastructure.mjs +6 -1
- package/src/session-runtime/boot/session.mjs +3 -3
- package/src/session-runtime/boot/tools.mjs +7 -1
- package/src/session-runtime/conversation-import/service.mjs +1 -1
- package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
- package/src/session-runtime/goal-facade-api.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +91 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +15 -5
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +137 -26
- package/src/session-runtime/internal-tool-executor.mjs +8 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +187 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
- package/src/session-runtime/lifecycle/session-catalog.mjs +25 -18
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +36 -48
- 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 +70 -14
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/connect.mjs +17 -5
- 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 +116 -36
- 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-usage.mjs +51 -0
- package/src/session-runtime/native-web-search.mjs +19 -9
- package/src/session-runtime/new-session-config.mjs +4 -2
- package/src/session-runtime/provider-auth/login.mjs +4 -0
- 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/resource-scope-decorate.mjs +10 -3
- 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/runtime-review-api.mjs +8 -2
- 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/index-write-queue.mjs +81 -20
- 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/forgotten-leads.mjs +29 -0
- package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
- 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 +82 -13
- 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 +18 -10
- 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/row-store.mjs +10 -1
- package/src/session-runtime/services/agent-tool/worker-index.mjs +74 -15
- package/src/session-runtime/services/agent-tool.mjs +7 -0
- package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
- package/src/session-runtime/services/channel-admin.mjs +19 -3
- package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
- package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
- package/src/session-runtime/services/provider-admin.mjs +158 -15
- 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-purge.mjs +32 -0
- package/src/session-runtime/session-transcript.mjs +4 -5
- package/src/session-runtime/session-turn-api.mjs +17 -14
- package/src/session-runtime/settings-builtin-tools-api.mjs +18 -6
- package/src/session-runtime/setup-tool/executor.mjs +57 -9
- package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +18 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +25 -4
- package/src/session-runtime/skills-api.mjs +3 -5
- package/src/session-runtime/tool-policy-refresh.mjs +83 -32
- package/src/session-runtime/tool-surface.mjs +5 -1
- package/src/session-runtime/turn/agent-ops.mjs +49 -2
- package/src/session-runtime/turn/compaction-gate.mjs +25 -0
- package/src/session-runtime/turn/session-ops.mjs +7 -5
- package/src/session-runtime/turn/side-question-ops.mjs +19 -0
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +7 -1
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +12 -3
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +18 -2
- package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
- package/src/session-runtime/turn/turn-run.mjs +26 -45
- package/src/session-runtime/usage-stats-api.mjs +46 -11
- 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 +35 -41
- package/src/session-runtime/workspace/transition-steps.mjs +215 -116
- package/src/session-runtime/workspace/transitions.mjs +428 -73
- package/src/standalone/channel-transport.mjs +3 -4
- package/src/standalone/daemon-agent-control.mjs +9 -1
- package/src/standalone/daemon-desktop-runtime.mjs +32 -1
- package/src/standalone/daemon-local-session-bridge.mjs +14 -1
- package/src/standalone/daemon-owner.mjs +17 -4
- package/src/standalone/daemon-pg-stop.mjs +49 -0
- package/src/standalone/daemon-session-control.mjs +88 -0
- package/src/standalone/daemon-stop-budget.d.mts +2 -0
- package/src/standalone/daemon-stop-budget.mjs +18 -0
- package/src/standalone/daemon-stored-session-views.mjs +25 -3
- package/src/standalone/daemon-telemetry.mjs +19 -0
- package/src/standalone/daemon.mjs +63 -1
- package/src/standalone/desktop-service-registry.mjs +5 -0
- package/src/standalone/local-session-runtime.mjs +80 -30
- package/src/standalone/session-client.mjs +42 -0
- package/src/standalone/session-protocol.mjs +14 -0
- package/src/standalone/session-proxy/projection.mjs +41 -4
- package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
- package/src/standalone/session-runtime-inline-host.mjs +3 -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-action.mjs +18 -3
- 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-service-api.mjs +6 -1
- package/src/standalone/session-state-patch.d.mts +2 -1
- package/src/standalone/session-state-patch.mjs +41 -1
- package/src/standalone/session-tool-output.mjs +82 -0
- package/src/tui/App.jsx +25 -0
- package/src/tui/app/app-view/floating-panel.jsx +26 -1
- package/src/tui/app/app-view.jsx +2 -1
- package/src/tui/app/btw-controller.mjs +118 -0
- package/src/tui/app/create-app-pickers.mjs +2 -0
- 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/shell-layout/row-budgets.mjs +11 -1
- package/src/tui/app/shell-layout/surfaces.mjs +3 -1
- package/src/tui/app/slash-commands.mjs +19 -3
- package/src/tui/app/slash-dispatch/session-commands.mjs +68 -6
- package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
- package/src/tui/app/use-global-key-input.mjs +5 -12
- package/src/tui/app/use-prompt-handlers.mjs +11 -0
- package/src/tui/components/BtwPanel.jsx +53 -0
- package/src/tui/components/QuestionPanel.jsx +275 -0
- package/src/tui/components/Spinner.jsx +4 -0
- package/src/tui/components/SpinnerByline.jsx +21 -2
- package/src/tui/components/question-panel-model.mjs +156 -0
- package/src/tui/components/status-line/local-line.mjs +10 -2
- package/src/tui/dist/index.mjs +2897 -1722
- package/src/tui/session/active-tool-summary.mjs +1 -1
- package/src/tui/session/context-state.mjs +4 -5
- 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 +14 -10
- package/src/tui/session/session-api/controls.mjs +14 -2
- package/src/tui/session/session-api/integrations.mjs +9 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +3 -9
- package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
- package/src/tui/session/session-api/lifecycle.mjs +14 -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 +9 -3
- package/src/tui/session/session-api/worktree.mjs +3 -2
- package/src/tui/session/session-api.mjs +1 -0
- 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 +20 -8
- package/src/tui/session/transcript-spill.mjs +14 -7
- 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 +179 -32
- package/src/tui/session/turn.mjs +50 -36
- 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/workflows/default/WORKFLOW.md +3 -1
- 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 -246
- 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
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// Classification of role:'user' messages: the human's own instruction versus
|
|
2
|
+
// compact summaries and runtime-injected turns. Import-light on purpose (no
|
|
3
|
+
// context-utils graph) so the session store can count real human turns;
|
|
4
|
+
// compact/messages.mjs re-exports everything here.
|
|
5
|
+
import { SUMMARY_PREFIX_ANCHOR } from './summary-anchor.mjs';
|
|
6
|
+
import { isImportedMessage } from '../imported-message.mjs';
|
|
7
|
+
import {
|
|
8
|
+
isInternalRuntimeNotificationText,
|
|
9
|
+
isModelVisibleToolCompletionWrapper,
|
|
10
|
+
} from '../../../../shared/tool-execution-contract.mjs';
|
|
11
|
+
|
|
12
|
+
// A compact summary message is a synthetic role:'user' message carrying the
|
|
13
|
+
// SUMMARY_PREFIX anchor. It is NOT a real user turn: it must be excluded from
|
|
14
|
+
// real user-turn boundary calculations and treated as merge input, otherwise
|
|
15
|
+
// an old summary can sit in the preserved tail as a live user message,
|
|
16
|
+
// duplicate, or fail to merge across repeated compaction.
|
|
17
|
+
export function isSummaryMessage(m) {
|
|
18
|
+
return (
|
|
19
|
+
m?.role === 'user' &&
|
|
20
|
+
!isImportedMessage(m) &&
|
|
21
|
+
(String(m?.meta?.source || '') === 'compact-summary' ||
|
|
22
|
+
(typeof m.content === 'string' &&
|
|
23
|
+
m.content.startsWith(SUMMARY_PREFIX_ANCHOR) &&
|
|
24
|
+
/\nmessages=\d+\s+(?:sha256=|compact_type=)/.test(m.content)))
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function isProtectedContextUserMessage(m) {
|
|
29
|
+
if (m?.role !== 'user' || typeof m.content !== 'string' || isImportedMessage(m)) return false;
|
|
30
|
+
let content = m.content.trim();
|
|
31
|
+
if (!content.toLowerCase().startsWith('<system-reminder>')) return false;
|
|
32
|
+
const closingTag = '</system-reminder>';
|
|
33
|
+
// A runtime turn may carry several reminders (Goal, clock, tool delta).
|
|
34
|
+
// Only text outside those envelopes is a human instruction. Keep this
|
|
35
|
+
// compatible with stored turns that predate explicit source metadata.
|
|
36
|
+
while (content.toLowerCase().startsWith('<system-reminder>')) {
|
|
37
|
+
const closingIndex = content.toLowerCase().indexOf(closingTag);
|
|
38
|
+
if (closingIndex < 0) return true;
|
|
39
|
+
content = content.slice(closingIndex + closingTag.length).trim();
|
|
40
|
+
}
|
|
41
|
+
return content === '';
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// An injected Skill-body user message (the general newMessages channel carries
|
|
45
|
+
// the full SKILL.md body as a role:'user' message after the Skill tool_result).
|
|
46
|
+
// Like isSummaryMessage / isProtectedContextUserMessage, it is detected by
|
|
47
|
+
// content prefix (the `<skill>` envelope from buildSkillResultEnvelope) so the
|
|
48
|
+
// check survives even if the synthetic `meta` field is dropped during a tail
|
|
49
|
+
// rebuild. It is NOT the human's latest prompt and must be excluded from
|
|
50
|
+
// "latest human request" selection (deriveCurrentRequest). The `meta:'skill'`
|
|
51
|
+
// marker is also honoured.
|
|
52
|
+
export function isInjectedSkillBodyMessage(m) {
|
|
53
|
+
if (m?.role !== 'user' || isImportedMessage(m)) return false;
|
|
54
|
+
if (m.meta === 'skill') return true;
|
|
55
|
+
return typeof m.content === 'string' && m.content.trimStart().startsWith('<skill>');
|
|
56
|
+
}
|
|
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
|
+
|
|
86
|
+
const SYNTHETIC_USER_SOURCES = new Set([
|
|
87
|
+
'goal-continuation',
|
|
88
|
+
'goal-closeout',
|
|
89
|
+
'compact-context',
|
|
90
|
+
'compact-active-turn-continuation',
|
|
91
|
+
'compact-execution-recovery',
|
|
92
|
+
'max-output-recovery',
|
|
93
|
+
'refusal-recovery',
|
|
94
|
+
'stream-cut-recovery',
|
|
95
|
+
]);
|
|
96
|
+
const SYNTHETIC_USER_CONTROL_RE =
|
|
97
|
+
/^(?:\[mixdog-runtime\]|\[request interrupted(?: by user(?: for tool use)?| by process restart)?\])(?:\s|$)/i;
|
|
98
|
+
|
|
99
|
+
function userMessageText(message) {
|
|
100
|
+
if (typeof message?.content === 'string') return message.content;
|
|
101
|
+
if (!Array.isArray(message?.content)) return '';
|
|
102
|
+
return message.content.map((block) => (typeof block === 'string' ? block : block?.text || '')).join('');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function isActualUserInstructionMessage(message) {
|
|
106
|
+
if (
|
|
107
|
+
message?.role !== 'user' ||
|
|
108
|
+
isSummaryMessage(message) ||
|
|
109
|
+
isProtectedContextUserMessage(message) ||
|
|
110
|
+
isInjectedSkillBodyMessage(message)
|
|
111
|
+
) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
const text = userMessageText(message);
|
|
115
|
+
// Imported prose is the user's own words whatever it looks like.
|
|
116
|
+
if (isImportedMessage(message)) return text.trim().length > 0;
|
|
117
|
+
if (/^Reference files:\s*/i.test(text.trimStart())) return false;
|
|
118
|
+
if (
|
|
119
|
+
SYNTHETIC_USER_CONTROL_RE.test(text.trimStart()) ||
|
|
120
|
+
isInternalRuntimeNotificationText(text) ||
|
|
121
|
+
isModelVisibleToolCompletionWrapper(text) ||
|
|
122
|
+
SYNTHETIC_USER_SOURCES.has(String(message?.meta?.source || ''))
|
|
123
|
+
) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
return text.trim().length > 0 || (Array.isArray(message.content) && message.content.length > 0);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Control rows the runtime writes as user turns when a turn is cut short.
|
|
130
|
+
// isActualUserInstructionMessage deliberately keeps treating "[truncated]" as
|
|
131
|
+
// an instruction (compaction tail selection depends on it), so the real-turn
|
|
132
|
+
// predicate below recognizes it on its own.
|
|
133
|
+
const CONTROL_MARKER_RE = /^\[(?:truncated|request interrupted(?: by user(?: for tool use)?| by process restart)?)\]$/i;
|
|
134
|
+
|
|
135
|
+
/** Whether a message stands for real human conversation: a compact summary
|
|
136
|
+
* (it replaced earlier human turns), imported prose, or the user's own
|
|
137
|
+
* instruction without runtime provenance (`meta.source`/`meta.synthetic`,
|
|
138
|
+
* `internal`/`synthetic` flags) or a recognized control marker. Used to tell
|
|
139
|
+
* a real conversation from a synthetic-only transcript in catalog rows. */
|
|
140
|
+
export function isRealTurnMessage(message) {
|
|
141
|
+
if (isSummaryMessage(message)) return true;
|
|
142
|
+
if (!isActualUserInstructionMessage(message)) return false;
|
|
143
|
+
if (isImportedMessage(message)) return true;
|
|
144
|
+
if (message.internal === true || message.synthetic === true) return false;
|
|
145
|
+
const meta = message.meta;
|
|
146
|
+
if (meta && typeof meta === 'object' && (meta.synthetic === true || meta.source)) return false;
|
|
147
|
+
return !CONTROL_MARKER_RE.test(userMessageText(message).trim());
|
|
148
|
+
}
|
|
@@ -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';
|
|
@@ -8,6 +8,13 @@ import {
|
|
|
8
8
|
} from '../runtime-core/provider-request-tools.mjs';
|
|
9
9
|
|
|
10
10
|
const toolSchemaAnalysisMemo = new WeakMap();
|
|
11
|
+
// Token cost by schema signature. Every new session builds its own tools array
|
|
12
|
+
// with the same schemas; re-estimating the whole serialization (tens of ms,
|
|
13
|
+
// synchronous) per first turn blocked the event loop during session creation.
|
|
14
|
+
// The signature hashes the full serialization, deferred flags included, so it
|
|
15
|
+
// determines the metered text exactly.
|
|
16
|
+
const toolSchemaTokensBySignature = new Map();
|
|
17
|
+
const TOOL_SCHEMA_TOKENS_LIMIT = 32;
|
|
11
18
|
|
|
12
19
|
function isDeferredToolSchema(tool) {
|
|
13
20
|
return tool?.deferLoading === true || tool?.defer_loading === true;
|
|
@@ -58,8 +65,16 @@ function analyzeToolSchemas(tools) {
|
|
|
58
65
|
// full weight inflated the request reserve. The SIGNATURE keeps hashing
|
|
59
66
|
// the full serialization (a deferred tool joining/leaving must still
|
|
60
67
|
// re-fingerprint the surface); only the token cost drops deferred entries.
|
|
61
|
-
|
|
62
|
-
|
|
68
|
+
let tokens = toolSchemaTokensBySignature.get(signature);
|
|
69
|
+
if (tokens === undefined) {
|
|
70
|
+
const meterText = list.some(isDeferredToolSchema) ? serializeToolSchemas(list, { excludeDeferred: true }) : text;
|
|
71
|
+
tokens = estimateTokens(meterText);
|
|
72
|
+
if (toolSchemaTokensBySignature.size >= TOOL_SCHEMA_TOKENS_LIMIT) {
|
|
73
|
+
toolSchemaTokensBySignature.delete(toolSchemaTokensBySignature.keys().next().value);
|
|
74
|
+
}
|
|
75
|
+
toolSchemaTokensBySignature.set(signature, tokens);
|
|
76
|
+
}
|
|
77
|
+
const analysis = { signature, tokens };
|
|
63
78
|
if (Array.isArray(tools)) toolSchemaAnalysisMemo.set(tools, analysis);
|
|
64
79
|
return analysis;
|
|
65
80
|
}
|
|
@@ -225,10 +225,14 @@ function messageTextTokens(m, precomputedText = null, precomputedReplay = null)
|
|
|
225
225
|
m?.role === 'assistant' && Array.isArray(m.providerReplay?.items) && m.providerReplay.items.length
|
|
226
226
|
? m.providerReplay.items
|
|
227
227
|
: null;
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
228
|
+
if (!replayItems) return estimateTokens(text);
|
|
229
|
+
// With visible replay items the text is exactly `${base}\n${replay}`. Meter
|
|
230
|
+
// each half on its own: the estimator's minimum-cost floors apply to the
|
|
231
|
+
// joined string, so subtracting est(replay) from est(base + replay)
|
|
232
|
+
// overstates base.
|
|
233
|
+
const replay = precomputedReplay ?? nativeBlocksEstimateText(replayItems);
|
|
234
|
+
const base = text.slice(0, text.length - replay.length - 1);
|
|
235
|
+
return Math.max(estimateTokens(base), estimateTokens(replay));
|
|
232
236
|
}
|
|
233
237
|
function imageDescriptorAllowance(descriptor) {
|
|
234
238
|
if (descriptor.width && descriptor.height) {
|
|
@@ -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 || '');
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from '../loop/tool-classify.mjs';
|
|
13
13
|
import { isSingleCallPerTurnTool, isToolCallDedupEligible } from '../loop/tool-helpers.mjs';
|
|
14
14
|
import { lookupToolResultReuse } from '../cache/tool-result-reuse.mjs';
|
|
15
|
+
import { bridgeClassificationTools } from '../loop/tool-call-resolution.mjs';
|
|
15
16
|
|
|
16
17
|
export function createEagerAdmission({ tools, cwd, sessionId, sessionRef, repeatFailLimit }) {
|
|
17
18
|
// Streaming-time intra-turn dedup. When the LLM emits two
|
|
@@ -63,7 +64,7 @@ export function createEagerAdmission({ tools, cwd, sessionId, sessionRef, repeat
|
|
|
63
64
|
// Authorization precedes cache lookup and dedup, not just IO.
|
|
64
65
|
if (preDispatchDenyForSession(sessionRef, call) !== null) return null;
|
|
65
66
|
const sig = _intraTurnSig(call.name, call.arguments);
|
|
66
|
-
const dedupEligible = isToolCallDedupEligible(call.name, tools);
|
|
67
|
+
const dedupEligible = isToolCallDedupEligible(call.name, bridgeClassificationTools(tools, [call]));
|
|
67
68
|
if (dedupEligible && _eagerInFlightSigs.has(sig)) return null;
|
|
68
69
|
// Repeat-failure guard also gates eager dispatch (reviewer-flagged):
|
|
69
70
|
// streaming onToolCall / startEagerRun would otherwise re-run an
|
|
@@ -75,7 +76,7 @@ export function createEagerAdmission({ tools, cwd, sessionId, sessionRef, repeat
|
|
|
75
76
|
// The same cache policy authorizes both serial cache hits and short
|
|
76
77
|
// cross-turn references. Recheck there: an entry can expire or be
|
|
77
78
|
// invalidated between streaming admission and serial consumption.
|
|
78
|
-
if (lookupToolResultReuse({ sessionId, call, cwd, touch: false }) !== null) return null;
|
|
79
|
+
if (lookupToolResultReuse({ sessionId, call, cwd, touch: false, sessionRef }) !== null) return null;
|
|
79
80
|
return { sig, dedupEligible };
|
|
80
81
|
}
|
|
81
82
|
|
|
@@ -10,6 +10,7 @@ import { createEagerBarriers } from './eager-dispatch/barriers.mjs';
|
|
|
10
10
|
import { createEagerEntry, runEagerEntry } from './eager-dispatch/entry.mjs';
|
|
11
11
|
import { executeTool } from './loop/tool-exec.mjs';
|
|
12
12
|
import { isParallelDispatchable } from './loop/tool-helpers.mjs';
|
|
13
|
+
import { resolveExecutionToolCall } from './loop/tool-call-resolution.mjs';
|
|
13
14
|
|
|
14
15
|
export function createEagerDispatcher({
|
|
15
16
|
tools,
|
|
@@ -45,9 +46,13 @@ export function createEagerDispatcher({
|
|
|
45
46
|
iteration: getNextIteration(),
|
|
46
47
|
localSearchTelemetry: entry.localSearchTelemetry,
|
|
47
48
|
resultTelemetry: entry.resultTelemetry,
|
|
49
|
+
...(call.wireCall ? { bridgeWireCall: call.wireCall } : {}),
|
|
48
50
|
});
|
|
49
51
|
|
|
50
|
-
const startEagerTool = (
|
|
52
|
+
const startEagerTool = (wireCall) => {
|
|
53
|
+
// Streamed call_tool requests are admitted, ordered and executed as their
|
|
54
|
+
// targets; a projection error is answered by the serial batch instead.
|
|
55
|
+
const call = resolveExecutionToolCall(wireCall, sessionRef);
|
|
51
56
|
if (!call?.id || pending.has(call.id) || !isParallelDispatchable(call.name)) return null;
|
|
52
57
|
const admitted = admission.admit(call);
|
|
53
58
|
if (!admitted) return null;
|
|
@@ -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
|
},
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
contextMessagesSignature,
|
|
8
8
|
estimateMessagesTokens,
|
|
9
9
|
estimateRequestReserveTokens,
|
|
10
|
+
estimateToolSchemaTokens,
|
|
10
11
|
providerTokenCalibration,
|
|
11
12
|
resolveSessionCompactPolicy,
|
|
12
13
|
toolSchemaSignature,
|
|
@@ -18,6 +19,7 @@ import { positiveInt } from '../../../../shared/numbers.mjs';
|
|
|
18
19
|
import { isAgentOwner } from '../../agent-owner.mjs';
|
|
19
20
|
import { providerInputExcludesCache, providerNativePdf } from '../../providers/registry.mjs';
|
|
20
21
|
import { contentMediaBytes, contentMediaCount } from '../../providers/media-normalization.mjs';
|
|
22
|
+
import { splitProtectedContext } from '../compact/messages.mjs';
|
|
21
23
|
|
|
22
24
|
// Unified context-share rule (compact/constants.mjs CONTEXT_SHARE_RATIO): the
|
|
23
25
|
// post-compaction target is 25% of the boundary/context window. One
|
|
@@ -589,6 +591,93 @@ export function compactTargetBudget(policy) {
|
|
|
589
591
|
const singleShot = policy?.singleShot === true || (rawTrigger > 0 && reserve >= rawTrigger);
|
|
590
592
|
return compactTargetBudgetForTrigger(rawBoundary, rawTarget, reserve, rawTrigger, singleShot, policy?.force === true);
|
|
591
593
|
}
|
|
594
|
+
const OVERHEAD_TOP_TOOLS = 5;
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* The per-request overhead no compaction can shrink — the finalized wire tool
|
|
598
|
+
* schemas (policy.requestReserveTokens), the protected system/fixed prompt
|
|
599
|
+
* every compaction keeps verbatim, and the configured operator headroom — in
|
|
600
|
+
* the provider-scale units of the compact boundary (calibrated estimates, the
|
|
601
|
+
* configured headroom as configured). Only that fixed estimate can justify a
|
|
602
|
+
* refusal; a provider reading aligned to this prefix and these tool schemas
|
|
603
|
+
* can only withdraw one (it includes compactable history). Null unless the
|
|
604
|
+
* fixed part reaches the boundary: kind 'fixed_overhead' when schemas +
|
|
605
|
+
* system alone do, 'configured_reserve' when the configured headroom pushes
|
|
606
|
+
* the fixed part there.
|
|
607
|
+
*/
|
|
608
|
+
export function fixedRequestOverhead(policy, messages, tools, sessionRef = null) {
|
|
609
|
+
if (!policy?.auto) return null;
|
|
610
|
+
const boundary = positiveInt(policy.boundaryTokens);
|
|
611
|
+
if (!boundary) return null;
|
|
612
|
+
const calibration = policyTokenCalibration(policy);
|
|
613
|
+
const toProviderScale = (raw) => Math.ceil(Math.max(0, raw) * calibration);
|
|
614
|
+
const toolTokens = toProviderScale(policyRequestReserveTokens(policy));
|
|
615
|
+
const systemTokens = toProviderScale(estimateMessagesTokens(splitProtectedContext(messages || []).protectedPrefix));
|
|
616
|
+
const configuredReserve = Math.max(0, Number(policy.configuredReserveTokens) || 0);
|
|
617
|
+
const fixed = toolTokens + systemTokens;
|
|
618
|
+
// A provider reading of this very prefix with these very tools measured
|
|
619
|
+
// the whole request, compactable history included: an upper bound of the
|
|
620
|
+
// fixed part, never proof of it. When it is not above the estimate, the
|
|
621
|
+
// estimate is known to overstate the fixed part by an unknown amount, so
|
|
622
|
+
// nothing here can show that compaction is futile.
|
|
623
|
+
const measuredRequestTokens = measuredFixedRequestTokens(sessionRef, messages, policy);
|
|
624
|
+
if (measuredRequestTokens !== null && measuredRequestTokens <= fixed) return null;
|
|
625
|
+
// Refuse only when the fixed part itself (plus the headroom, for the
|
|
626
|
+
// reserve kind) reaches the boundary — never on a near miss of a heuristic
|
|
627
|
+
// estimate: those requests compact or go out, and the provider's own
|
|
628
|
+
// overflow handling decides.
|
|
629
|
+
let kind = null;
|
|
630
|
+
if (fixed >= boundary) kind = 'fixed_overhead';
|
|
631
|
+
else if (configuredReserve > 0 && fixed + configuredReserve >= boundary) kind = 'configured_reserve';
|
|
632
|
+
if (!kind) return null;
|
|
633
|
+
const counted = (Array.isArray(tools) ? tools : []).filter(
|
|
634
|
+
(tool) => tool?.deferLoading !== true && tool?.defer_loading !== true
|
|
635
|
+
);
|
|
636
|
+
const largestTools = counted
|
|
637
|
+
.map((tool) => ({
|
|
638
|
+
name: String(tool?.name || tool?.type || 'tool'),
|
|
639
|
+
tokens: toProviderScale(estimateToolSchemaTokens([tool])),
|
|
640
|
+
}))
|
|
641
|
+
.sort((a, b) => b.tokens - a.tokens || a.name.localeCompare(b.name))
|
|
642
|
+
.slice(0, OVERHEAD_TOP_TOOLS);
|
|
643
|
+
return {
|
|
644
|
+
kind,
|
|
645
|
+
contextWindowTokens: positiveInt(policy.contextWindow) || boundary,
|
|
646
|
+
boundaryTokens: boundary,
|
|
647
|
+
toolCount: counted.length,
|
|
648
|
+
toolTokens,
|
|
649
|
+
systemTokens,
|
|
650
|
+
configuredReserveTokens: configuredReserve,
|
|
651
|
+
measuredRequestTokens,
|
|
652
|
+
largestTools,
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
/**
|
|
657
|
+
* Identity of the fixed inputs fixedRequestOverhead judges: the wire tool
|
|
658
|
+
* schemas, the protected system context, the configured headroom and the
|
|
659
|
+
* boundary. A verdict holds while this is unchanged; the provider reading is
|
|
660
|
+
* deliberately not part of it (compaction clears it, fixed overhead stays).
|
|
661
|
+
*/
|
|
662
|
+
export function fixedRequestOverheadInputs(policy, messages) {
|
|
663
|
+
if (!policy?.auto) return null;
|
|
664
|
+
return JSON.stringify([
|
|
665
|
+
policy.toolSchemaSignature || '',
|
|
666
|
+
contextMessagesSignature(splitProtectedContext(messages || []).protectedPrefix),
|
|
667
|
+
Math.max(0, Number(policy.configuredReserveTokens) || 0),
|
|
668
|
+
positiveInt(policy.boundaryTokens) || 0,
|
|
669
|
+
]);
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
// The provider-measured size of the last request when it still describes
|
|
673
|
+
// this transcript prefix and was sent with the same tool schemas; else null.
|
|
674
|
+
function measuredFixedRequestTokens(sessionRef, messages, policy) {
|
|
675
|
+
if (!sessionRef || !Array.isArray(messages)) return null;
|
|
676
|
+
const aligned = providerBaselineCoverage(sessionRef, messages);
|
|
677
|
+
if (!aligned?.toolSignature || aligned.toolSignature !== policy?.toolSchemaSignature) return null;
|
|
678
|
+
return aligned.tokens;
|
|
679
|
+
}
|
|
680
|
+
|
|
592
681
|
// Anthropic refuses a request body over 32 MB (HTTP 413) however few tokens it
|
|
593
682
|
// holds, and inline media is what gets there: an image is priced at no more
|
|
594
683
|
// than ~1.6k tokens yet carries up to 5 MB of base64. Tool-result media is the
|
|
@@ -707,7 +796,6 @@ function compactionTelemetryRecord(sessionRef, policy, meta, prev) {
|
|
|
707
796
|
return {
|
|
708
797
|
...prev,
|
|
709
798
|
auto: policy.auto !== false,
|
|
710
|
-
reservedTokens: policy.configuredReserveTokens || prev.reservedTokens || null,
|
|
711
799
|
requestReserveTokens: policy.requestReserveTokens || 0,
|
|
712
800
|
reserveTokens: policy.reserveTokens || 0,
|
|
713
801
|
boundaryTokens: policy.boundaryTokens || null,
|
|
@@ -37,7 +37,7 @@ export function crossTurnSignature(name, args) {
|
|
|
37
37
|
// they must not reset the escalation ladder's "zero edit" condition. Skill /
|
|
38
38
|
// recall / agent / task / cwd / load_tool are exploration/meta plumbing.
|
|
39
39
|
// (tool_search kept as legacy alias for old transcripts.)
|
|
40
|
-
const NON_PROGRESS_TOOLS = new Set(['Skill', 'recall', 'agent', 'task', 'cwd', 'load_tool', 'tool_search']);
|
|
40
|
+
const NON_PROGRESS_TOOLS = new Set(['Skill', 'recall', 'agent', 'task', 'cwd', 'session', 'load_tool', 'tool_search']);
|
|
41
41
|
|
|
42
42
|
// True when a successfully-executed tool represents real edit/progress. A tool
|
|
43
43
|
// counts as progress only if its def lacks readOnlyHint (not eager) AND it is
|
|
@@ -46,6 +46,62 @@ export function agentContextOverflowError(
|
|
|
46
46
|
);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
export const TOOL_SURFACE_EXCEEDS_CONTEXT = 'TOOL_SURFACE_EXCEEDS_CONTEXT';
|
|
50
|
+
|
|
51
|
+
const tokens = (value) => `${Number(value || 0).toLocaleString('en-US')} tokens`;
|
|
52
|
+
|
|
53
|
+
// Distinct from AgentContextOverflowError: the request's FIXED overhead (tool
|
|
54
|
+
// definitions, protected system context, configured headroom) leaves no room
|
|
55
|
+
// for any history, so compacting the history cannot help and is not tried.
|
|
56
|
+
// The wording avoids provider context-overflow phrasing on purpose: this is
|
|
57
|
+
// not a "conversation too long" refusal and must not be routed as one.
|
|
58
|
+
export class ToolSurfaceExceedsContextError extends Error {
|
|
59
|
+
constructor({ sessionId, provider, model, overhead }) {
|
|
60
|
+
const target = [provider, model].filter(Boolean).join('/') || 'this model';
|
|
61
|
+
const reserve = overhead.kind === 'configured_reserve';
|
|
62
|
+
const headline = reserve
|
|
63
|
+
? 'The configured compaction headroom leaves no room for conversation history'
|
|
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)' : '';
|
|
67
|
+
const remedy = reserve
|
|
68
|
+
? 'Lower the configured headroom (compaction.reservedTokens or MIXDOG_AGENT_COMPACT_RESERVED_TOKENS), or use a model with a larger context window.'
|
|
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
|
+
const largest = overhead.largestTools.map((tool) => `${tool.name} (${tokens(tool.tokens)})`).join(', ');
|
|
71
|
+
super(
|
|
72
|
+
[
|
|
73
|
+
`${headline} (${TOOL_SURFACE_EXCEEDS_CONTEXT}).`,
|
|
74
|
+
`${target}: context window ${tokens(overhead.contextWindowTokens)}, compaction boundary ${tokens(overhead.boundaryTokens)}.`,
|
|
75
|
+
`Fixed per-request overhead: tool definitions ${tokens(overhead.toolTokens)} (${overhead.toolCount} tools), ` +
|
|
76
|
+
`protected system context ${tokens(overhead.systemTokens)}, configured headroom ${tokens(overhead.configuredReserveTokens)}; ` +
|
|
77
|
+
'nothing remains for conversation history.',
|
|
78
|
+
...(overhead.measuredRequestTokens
|
|
79
|
+
? [`The provider measured the last request at ${tokens(overhead.measuredRequestTokens)}.`]
|
|
80
|
+
: []),
|
|
81
|
+
'Compacting the conversation history cannot reduce these.',
|
|
82
|
+
remedy,
|
|
83
|
+
...(largest ? [`Largest tool definitions: ${largest}.`] : []),
|
|
84
|
+
].join('\n')
|
|
85
|
+
);
|
|
86
|
+
this.name = 'ToolSurfaceExceedsContextError';
|
|
87
|
+
this.code = TOOL_SURFACE_EXCEEDS_CONTEXT;
|
|
88
|
+
this.sessionId = sessionId || null;
|
|
89
|
+
this.provider = provider || null;
|
|
90
|
+
this.model = model || null;
|
|
91
|
+
this.overheadKind = overhead.kind;
|
|
92
|
+
this.overhead = overhead;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function toolSurfaceExceedsContextError({ sessionId, sessionRef, model, overhead }) {
|
|
97
|
+
return new ToolSurfaceExceedsContextError({
|
|
98
|
+
sessionId,
|
|
99
|
+
provider: sessionRef?.provider || null,
|
|
100
|
+
model: sessionRef?.model || model || null,
|
|
101
|
+
overhead,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
49
105
|
// Distinct from AgentContextOverflowError: the compaction pipeline itself
|
|
50
106
|
// failed (handoff-summary error, dead Memory runtime,
|
|
51
107
|
// etc.). This is NOT "latest turn cannot fit the context budget" — masking it
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
// Deferred catalog call-through: inactive catalog tool_use → discovery bookkeeping
|
|
2
2
|
// then normal executeTool routing (runtime errors only; no pre-dispatch schema).
|
|
3
3
|
import { clean } from '../../runtime-core/session-text.mjs';
|
|
4
|
-
import {
|
|
5
|
-
deferredCatalogUnion,
|
|
6
|
-
isReadonlySelectable,
|
|
7
|
-
selectDeferredTools,
|
|
8
|
-
} from '../../runtime-core/tool-catalog.mjs';
|
|
4
|
+
import { deferredCatalogUnion, isReadonlySelectable, selectDeferredTools } from '../../runtime-core/tool-catalog.mjs';
|
|
9
5
|
import { isDeferredToolAvailable } from '../../runtime-core/deferred-tool-availability.mjs';
|
|
6
|
+
import { routeToolExclusionReason } from './provider-tool-exclusions.mjs';
|
|
7
|
+
import { isBridgeReadonlySession, isToolBridgeEnabled } from '../../runtime-core/tool-bridge.mjs';
|
|
10
8
|
|
|
11
9
|
/** Skill-list plumbing only; mutation/MCP/builtins must use the catalog+mode gate. */
|
|
12
10
|
const INACTIVE_INFRA_BYPASS = new Set(['skills_list', 'skill_view']);
|
|
@@ -41,7 +39,7 @@ function toolExecutesWhenInactive(name) {
|
|
|
41
39
|
return INACTIVE_INFRA_BYPASS.has(name);
|
|
42
40
|
}
|
|
43
41
|
|
|
44
|
-
function resolveDeferredSelectMode(session) {
|
|
42
|
+
export function resolveDeferredSelectMode(session) {
|
|
45
43
|
const spec = session?.toolSpec;
|
|
46
44
|
if (spec == null || spec === '') return null;
|
|
47
45
|
if (spec === 'readonly') return 'readonly';
|
|
@@ -89,20 +87,32 @@ export function prepareDeferredToolCallThrough(sessionRef, name) {
|
|
|
89
87
|
}
|
|
90
88
|
const tool = lookupDeferredCatalogTool(sessionRef, name);
|
|
91
89
|
if (!tool) return null;
|
|
90
|
+
const routeExclusion = isToolBridgeEnabled(sessionRef) ? null : routeToolExclusionReason(sessionRef, tool);
|
|
91
|
+
if (routeExclusion) return denyDeferredCallThrough(`Error: ${routeExclusion}`);
|
|
92
92
|
if (isActiveSessionTool(sessionRef, name)) return null;
|
|
93
93
|
if (toolExecutesWhenInactive(name)) return null;
|
|
94
94
|
|
|
95
95
|
const toolLabel = clean(tool.name) || clean(name) || 'tool';
|
|
96
|
+
const bridge = isToolBridgeEnabled(sessionRef);
|
|
96
97
|
const resolvedMode = resolveDeferredSelectMode(sessionRef);
|
|
98
|
+
// Whatever the exposure, a deferred mutating tool never runs without a
|
|
99
|
+
// resolved tool mode, and never in a read-only one.
|
|
97
100
|
if (resolvedMode === null) {
|
|
98
101
|
if (!isReadonlySelectable(tool)) {
|
|
102
|
+
const remedy = bridge ? 'no call was sent.' : `load it with load_tool names:["${toolLabel}"].`;
|
|
99
103
|
return denyDeferredCallThrough(
|
|
100
|
-
`Error: tool "${toolLabel}" is deferred and cannot be auto-loaded without a resolved tool mode;
|
|
104
|
+
`Error: tool "${toolLabel}" is deferred and cannot be auto-loaded without a resolved tool mode; ${remedy}`
|
|
101
105
|
);
|
|
102
106
|
}
|
|
103
|
-
} else if (
|
|
107
|
+
} else if (
|
|
108
|
+
(resolvedMode === 'readonly' || (bridge && isBridgeReadonlySession(sessionRef))) &&
|
|
109
|
+
!isReadonlySelectable(tool)
|
|
110
|
+
) {
|
|
104
111
|
return denyDeferredCallThrough(`Error: tool "${toolLabel}" is not available in readonly mode`);
|
|
105
112
|
}
|
|
113
|
+
// Bridge sessions reach deferred tools through call_tool: the fixed
|
|
114
|
+
// provider surface is never extended.
|
|
115
|
+
if (bridge) return null;
|
|
106
116
|
|
|
107
117
|
const selectMode = resolvedMode === null ? 'readonly' : resolvedMode;
|
|
108
118
|
selectDeferredTools(sessionRef, [toolLabel], selectMode);
|
|
@@ -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),
|
|
@@ -114,6 +88,7 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
|
|
|
114
88
|
// One-shot repair of an assistant turn whose stored reasoning replay the
|
|
115
89
|
// API refuses to take back (see thinking-replay-recovery.mjs).
|
|
116
90
|
thinkingReplayRepairUsed: false,
|
|
91
|
+
toolSchemaDropUsed: false,
|
|
117
92
|
// Pending image-strip retry: identities of the images every attempt leaves
|
|
118
93
|
// out until a send succeeds, and whether to heal them from history then.
|
|
119
94
|
imageStrip: null,
|
|
@@ -156,7 +131,6 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
|
|
|
156
131
|
opts,
|
|
157
132
|
sessionId,
|
|
158
133
|
sessionAgent: state.sessionAgent,
|
|
159
|
-
suppressMidTurnText,
|
|
160
134
|
drainSteering: state.drainSteering,
|
|
161
135
|
});
|
|
162
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
|