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
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { resolvePreToolAskApproval } from '../tool-helpers.mjs';
|
|
6
6
|
import { runAbortable, throwIfAborted } from '../../../../../shared/abort-race.mjs';
|
|
7
|
+
import { evaluateExecPolicy } from '../../../tools/bash-policy-scan.mjs';
|
|
7
8
|
import { beginSessionApprovalWait } from '../../manager/runtime-liveness.mjs';
|
|
8
9
|
|
|
9
10
|
const isArgsObject = (value) => value && typeof value === 'object' && !Array.isArray(value);
|
|
10
11
|
|
|
11
|
-
async function askApproval(call, { callerSessionId, executeOpts, toolApprovalHook, decision }) {
|
|
12
|
+
async function askApproval(call, { callerSessionId, executeOpts, toolApprovalHook, decision, keepArgs = false }) {
|
|
12
13
|
const askReason = String(decision?.reason || 'approval requested by hook').trim();
|
|
13
14
|
// While the user decides, the session is waiting on them, not working.
|
|
14
15
|
const releaseApprovalWait = beginSessionApprovalWait(callerSessionId);
|
|
@@ -30,10 +31,35 @@ async function askApproval(call, { callerSessionId, executeOpts, toolApprovalHoo
|
|
|
30
31
|
}
|
|
31
32
|
if (askOutcome.denial) return { denial: askOutcome.denial };
|
|
32
33
|
const approval = askOutcome.approval;
|
|
33
|
-
if (approval && typeof approval === 'object' && isArgsObject(approval.args)) call.args = approval.args;
|
|
34
|
+
if (!keepArgs && approval && typeof approval === 'object' && isArgsObject(approval.args)) call.args = approval.args;
|
|
34
35
|
return null;
|
|
35
36
|
}
|
|
36
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Approval gate for a shell call (or a terminal `run`) whose exec policy
|
|
40
|
+
* decision is 'ask' (elevated launch). Runs after the final call is known. The
|
|
41
|
+
* approval is granted for the exact command being asked about: an approval
|
|
42
|
+
* reply cannot rewrite the args.
|
|
43
|
+
* @returns {Promise<{ denial: string } | { elevationApproved: boolean }>}
|
|
44
|
+
*/
|
|
45
|
+
export async function applyShellElevationGate(call, { callerSessionId, executeOpts, toolApprovalHook }) {
|
|
46
|
+
const gated = call.name === 'shell' || (call.name === 'terminal' && call.args?.action === 'run');
|
|
47
|
+
if (!gated || !isArgsObject(call.args) || call.args.command == null) {
|
|
48
|
+
return { elevationApproved: false };
|
|
49
|
+
}
|
|
50
|
+
const decision = evaluateExecPolicy(String(call.args.command));
|
|
51
|
+
if (decision.decision !== 'ask') return { elevationApproved: false };
|
|
52
|
+
const denied = await askApproval(call, {
|
|
53
|
+
callerSessionId,
|
|
54
|
+
executeOpts,
|
|
55
|
+
toolApprovalHook,
|
|
56
|
+
decision,
|
|
57
|
+
keepArgs: true,
|
|
58
|
+
});
|
|
59
|
+
if (denied) return denied;
|
|
60
|
+
return { elevationApproved: true };
|
|
61
|
+
}
|
|
62
|
+
|
|
37
63
|
/**
|
|
38
64
|
* @returns {Promise<{ denial: string } | { name: string, args: any }>}
|
|
39
65
|
* the call as the hook left it, or the denial text to return instead
|
|
@@ -48,7 +74,8 @@ export async function applyBeforeToolHook({
|
|
|
48
74
|
toolApprovalHook,
|
|
49
75
|
}) {
|
|
50
76
|
const call = { name, args, cwd };
|
|
51
|
-
|
|
77
|
+
// ask_user is itself the user prompt; it never goes through the ordinary approval gate.
|
|
78
|
+
if (!beforeToolHook || name === 'ask_user') return call;
|
|
52
79
|
try {
|
|
53
80
|
const decision = await runAbortable(executeOpts.signal, () =>
|
|
54
81
|
beforeToolHook(
|
|
@@ -15,6 +15,8 @@ import { executeInternalTool, isInternalTool } from '../../../internal-tools.mjs
|
|
|
15
15
|
import { buildSkillsListResponse, viewSkill } from '../tool-helpers.mjs';
|
|
16
16
|
import { isOnDeferredToolSurface } from '../deferred-call-through.mjs';
|
|
17
17
|
import { _executeCodeGraphToolLazy } from '../../manager/runtime-loaders.mjs';
|
|
18
|
+
import { requiresReadBody } from '../tool-classify.mjs';
|
|
19
|
+
import { executeCursorNativeBuiltin } from '../../../tools/builtin/external-tool-adapters.mjs';
|
|
18
20
|
|
|
19
21
|
function dispatchMcp(name, args, { cwd, callerSessionId, sessionRef, executeOpts }) {
|
|
20
22
|
const mcpScopeId = sessionRef?.mcpScopeId || null;
|
|
@@ -35,13 +37,19 @@ function dispatchMcp(name, args, { cwd, callerSessionId, sessionRef, executeOpts
|
|
|
35
37
|
});
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
function dispatchInternal(
|
|
40
|
+
function dispatchInternal(
|
|
41
|
+
name,
|
|
42
|
+
args,
|
|
43
|
+
{ cwd, callerSessionId, sessionRef, executeOpts, notifyFn, toolApprovalHook, elevationApproved }
|
|
44
|
+
) {
|
|
39
45
|
// callerSessionId propagates into server.mjs dispatchTool so that
|
|
40
46
|
// dispatchAiWrapped can detect and reject recursive calls from a
|
|
41
47
|
// hidden-role session (recall/search → self).
|
|
42
48
|
return executeInternalTool(name, args, {
|
|
43
49
|
scopeId: sessionRef?.mcpScopeId || null,
|
|
44
50
|
callerSessionId,
|
|
51
|
+
// The calling session itself: bridge tools answer within its scope.
|
|
52
|
+
callerSession: sessionRef || null,
|
|
45
53
|
callerCwd: cwd,
|
|
46
54
|
setCallerCwd: async (nextCwd) => {
|
|
47
55
|
const applyForCaller = sessionRef?._applyResolvedCwdForCaller;
|
|
@@ -58,6 +66,8 @@ function dispatchInternal(name, args, { cwd, callerSessionId, sessionRef, execut
|
|
|
58
66
|
notifyFn,
|
|
59
67
|
toolApprovalHook,
|
|
60
68
|
toolCallId: executeOpts.toolCallId || null,
|
|
69
|
+
// Runtime-granted for this call only (terminal run); never from model args.
|
|
70
|
+
elevationApproved: elevationApproved === true,
|
|
61
71
|
invocationSource: 'model-tool',
|
|
62
72
|
});
|
|
63
73
|
}
|
|
@@ -90,10 +100,24 @@ export function dispatchToolCall({ name, args }, ctx) {
|
|
|
90
100
|
// variants) adapt to a native execution inside executeBuiltinTool's default
|
|
91
101
|
// case; on a shape mismatch it falls back to the redirect guidance message.
|
|
92
102
|
if (name === 'shell' || isBuiltinTool(name) || isExternalAdapterTool(name)) {
|
|
93
|
-
const builtinOpts =
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
103
|
+
const builtinOpts = {
|
|
104
|
+
...completionToolOpts,
|
|
105
|
+
...(executeOpts.suppressReadUnchangedStub || requiresReadBody(name, sessionRef)
|
|
106
|
+
? { suppressReadUnchangedStub: true }
|
|
107
|
+
: {}),
|
|
108
|
+
// Runtime-granted only; any value inherited from executeOpts is overridden.
|
|
109
|
+
elevationApproved: ctx.elevationApproved === true,
|
|
110
|
+
};
|
|
111
|
+
return executeCursorNativeBuiltin(
|
|
112
|
+
name,
|
|
113
|
+
args,
|
|
114
|
+
cwd,
|
|
115
|
+
{
|
|
116
|
+
...builtinOpts,
|
|
117
|
+
toolCallId: executeOpts.toolCallId || null,
|
|
118
|
+
},
|
|
119
|
+
executeBuiltinTool
|
|
120
|
+
);
|
|
97
121
|
}
|
|
98
122
|
return formatUnknownBuiltinToolMessage(name, args, 'tool');
|
|
99
123
|
}
|
|
@@ -8,12 +8,13 @@
|
|
|
8
8
|
import { isMcpTool } from '../../mcp/client.mjs';
|
|
9
9
|
import { prepareDeferredToolCallThrough } from './deferred-call-through.mjs';
|
|
10
10
|
import { refreshDeferredMcpToolCatalog } from '../../runtime-core/tool-catalog.mjs';
|
|
11
|
+
import { bridgeTargetUnavailable } from '../../runtime-core/tool-bridge.mjs';
|
|
11
12
|
import { preDispatchDenyForSession, routeWebFetchCall } from './pre-dispatch-deny.mjs';
|
|
12
13
|
import { runWithToolExecutionOwner } from '../../../../shared/tool-execution-owner.mjs';
|
|
13
14
|
import { runWithLocalSearchTelemetry } from '../../tools/builtin/local-search-telemetry.mjs';
|
|
14
15
|
import { throwIfAborted } from '../../../../shared/abort-race.mjs';
|
|
15
16
|
import { prepareToolCall } from './tool-exec/call-prep.mjs';
|
|
16
|
-
import { applyBeforeToolHook } from './tool-exec/before-hook.mjs';
|
|
17
|
+
import { applyBeforeToolHook, applyShellElevationGate } from './tool-exec/before-hook.mjs';
|
|
17
18
|
import { dispatchToolCall } from './tool-exec/dispatch.mjs';
|
|
18
19
|
import { applyAfterToolHook } from './tool-exec/after-hook.mjs';
|
|
19
20
|
import { runReadOnlyIoWithDeadline } from './tool-exec/read-only-deadline.mjs';
|
|
@@ -65,6 +66,18 @@ async function executeToolOwned(name, args, cwd, callerSessionId, sessionRef, ex
|
|
|
65
66
|
if (isMcpTool(call.name)) refreshDeferredMcpToolCatalog(sessionRef);
|
|
66
67
|
const deferredPrep = prepareDeferredToolCallThrough(sessionRef, call.name);
|
|
67
68
|
if (deferredPrep?.deny) return deferredPrep.deny;
|
|
69
|
+
// A bridged target was resolved when its call_tool was projected; it must
|
|
70
|
+
// still be available in this session's scope (also after a hook rewrite).
|
|
71
|
+
// The authorized identity is the public tool name, not its transport
|
|
72
|
+
// (web_fetch routed to local_fetch/image_fetch stays web_fetch here).
|
|
73
|
+
if (executeOpts.bridgeWireCall) {
|
|
74
|
+
const unavailable = bridgeTargetUnavailable(sessionRef, finalCall.schemaName || finalCall.name);
|
|
75
|
+
if (unavailable) return unavailable;
|
|
76
|
+
}
|
|
77
|
+
// Elevated launches ask the user first; denied / no approval UI refuses the call.
|
|
78
|
+
const elevation = await applyShellElevationGate(call, { callerSessionId, executeOpts, toolApprovalHook });
|
|
79
|
+
if (elevation.denial) return elevation.denial;
|
|
80
|
+
throwIfAborted(executeOpts.signal);
|
|
68
81
|
const result = await runReadOnlyIoWithDeadline(call.name, executeOpts.signal || null, async (deadlineSignal) => {
|
|
69
82
|
let callOpts = executeOpts;
|
|
70
83
|
if (deadlineSignal !== executeOpts.signal) {
|
|
@@ -80,6 +93,7 @@ async function executeToolOwned(name, args, cwd, callerSessionId, sessionRef, ex
|
|
|
80
93
|
completionToolOpts,
|
|
81
94
|
notifyFn,
|
|
82
95
|
toolApprovalHook,
|
|
96
|
+
elevationApproved: elevation.elevationApproved === true,
|
|
83
97
|
});
|
|
84
98
|
});
|
|
85
99
|
return applyAfterToolHook(result, hookFrom(executeOpts, sessionRef, 'afterToolHook'), {
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// Tool-exposure migration (native ↔ bridge-v1, and pre-versioned fixed
|
|
2
|
+
// surfaces → bridge-v1). The surface itself is rebuilt by
|
|
3
|
+
// applyDeferredToolSurface; this module adds what a changed request prefix
|
|
4
|
+
// invalidates: provider state, the prefix guard, the context baseline and the
|
|
5
|
+
// cache-break tag. Historical tool calls are never rewritten.
|
|
6
|
+
import { applyDeferredToolSurface, rebuildDeferredToolSurfaceForProvider } from '../../runtime-core/tool-catalog.mjs';
|
|
7
|
+
import {
|
|
8
|
+
bridgeSurfaceOutdated,
|
|
9
|
+
sessionToolExposure,
|
|
10
|
+
TOOL_EXPOSURE_BRIDGE,
|
|
11
|
+
TOOL_SURFACE_MIGRATION_INTENT,
|
|
12
|
+
toolExposureMigrationNeeded,
|
|
13
|
+
toolExposureModeForProvider,
|
|
14
|
+
} from '../../runtime-core/tool-exposure.mjs';
|
|
15
|
+
import { applyInitialDeferredToolManifestToBp2 } from '../../context/collect.mjs';
|
|
16
|
+
import { isAgentOwner } from '../../agent-owner.mjs';
|
|
17
|
+
import { honoredSchemaAllowlist } from '../manager/session-tool-surface.mjs';
|
|
18
|
+
import { syncSystemPrefix } from '../manager/prompt-utils.mjs';
|
|
19
|
+
import { invalidateProviderContextBaseline } from './compact-policy.mjs';
|
|
20
|
+
|
|
21
|
+
/** Drop everything measured against the previous tool surface. */
|
|
22
|
+
function invalidateForToolSurfaceMigration(session) {
|
|
23
|
+
delete session.providerState;
|
|
24
|
+
delete session._providerPrefixGuardState;
|
|
25
|
+
invalidateProviderContextBaseline(session);
|
|
26
|
+
session.updatedAt = Date.now();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* After a surface re-apply outside a request (resume, provider switch)
|
|
31
|
+
* migrated the exposure: the first send of the next turn carries the tag.
|
|
32
|
+
*/
|
|
33
|
+
export function markToolSurfaceMigrated(session) {
|
|
34
|
+
invalidateForToolSurfaceMigration(session);
|
|
35
|
+
session.pendingCacheBreakIntent = TOOL_SURFACE_MIGRATION_INTENT;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Provider switch: rebuild the surface for `provider`, migrating bridge ↔ native. */
|
|
39
|
+
export function rebuildToolSurfaceForProviderWithMigration(session, provider) {
|
|
40
|
+
if (!session) return false;
|
|
41
|
+
const migrating = toolExposureMigrationNeeded(session, provider);
|
|
42
|
+
rebuildDeferredToolSurfaceForProvider(session, provider);
|
|
43
|
+
if (migrating) markToolSurfaceMigrated(session);
|
|
44
|
+
return migrating;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// The latest assistant tool turn still waits for a result: not a safe boundary.
|
|
48
|
+
function hasUnansweredToolCalls(messages) {
|
|
49
|
+
const list = Array.isArray(messages) ? messages : [];
|
|
50
|
+
const index = list.findLastIndex((message) => message?.role === 'assistant' && message.toolCalls?.length);
|
|
51
|
+
if (index < 0) return false;
|
|
52
|
+
const answered = new Set(
|
|
53
|
+
list.slice(index + 1).flatMap((message) => (message?.role === 'tool' ? [message.toolCallId] : []))
|
|
54
|
+
);
|
|
55
|
+
return list[index].toolCalls.some((call) => call?.id && !answered.has(call.id));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Request-boundary migration of a live session whose persisted exposure
|
|
60
|
+
* differs from its provider's. `messages` is the transcript the request is
|
|
61
|
+
* built from; the fixed-guidance rewrite lands there (and on the session).
|
|
62
|
+
* Returns true when the surface changed; the caller drops its frozen tool
|
|
63
|
+
* snapshot and provider state and tags the send.
|
|
64
|
+
*/
|
|
65
|
+
export function migrateToolExposureAtBoundary(session, messages) {
|
|
66
|
+
if (!session || !toolExposureMigrationNeeded(session) || hasUnansweredToolCalls(messages)) return false;
|
|
67
|
+
const stored = session.messages;
|
|
68
|
+
const working = Array.isArray(messages) ? messages : stored;
|
|
69
|
+
if (Array.isArray(working)) session.messages = working;
|
|
70
|
+
try {
|
|
71
|
+
applyDeferredToolSurface(session, session.deferredSurfaceMode || 'lead', [], {
|
|
72
|
+
provider: session.provider,
|
|
73
|
+
model: session.model,
|
|
74
|
+
});
|
|
75
|
+
} finally {
|
|
76
|
+
if (Array.isArray(working) && session.messages !== working) {
|
|
77
|
+
// The rewrite may drop an emptied system message: keep the request
|
|
78
|
+
// transcript array identity the loop holds.
|
|
79
|
+
working.splice(0, working.length, ...session.messages);
|
|
80
|
+
}
|
|
81
|
+
session.messages = stored;
|
|
82
|
+
}
|
|
83
|
+
// The rewritten prompt messages are fresh objects; the canonical transcript
|
|
84
|
+
// the save path persists takes them too, so the next save writes the new
|
|
85
|
+
// prompt together with the new exposure.
|
|
86
|
+
if (Array.isArray(stored) && Array.isArray(working) && stored !== working) syncSystemPrefix(stored, working);
|
|
87
|
+
invalidateForToolSurfaceMigration(session);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Bridge state an agent surface carries; dropped when it returns to the full array.
|
|
92
|
+
const AGENT_BRIDGE_FIELDS = [
|
|
93
|
+
'toolExposureMode',
|
|
94
|
+
'deferredProviderMode',
|
|
95
|
+
'deferredNativeTools',
|
|
96
|
+
'deferredSurfaceMode',
|
|
97
|
+
'deferredToolUsage',
|
|
98
|
+
'deferredDefaultTools',
|
|
99
|
+
'deferredSelectedTools',
|
|
100
|
+
'deferredDiscoveredTools',
|
|
101
|
+
'deferredCallableTools',
|
|
102
|
+
'deferredAnnouncedTools',
|
|
103
|
+
'deferredToolDeltaRevision',
|
|
104
|
+
'nativeDeferredDiscovery',
|
|
105
|
+
'mcpServerInstructions',
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Agent (worker) sessions. Call right after their tools were resolved
|
|
110
|
+
* (create, resume, route change): on a bridge provider the eager surface
|
|
111
|
+
* becomes the full-mode core plus the bridge, built only from those
|
|
112
|
+
* role/policy-filtered tools; a native provider keeps the full array. A
|
|
113
|
+
* session honouring its own schema allowlist (a hidden specialist role) is
|
|
114
|
+
* already a small explicit surface and keeps it. `existing`: the session had
|
|
115
|
+
* a surface before, so a changed exposure is a migration.
|
|
116
|
+
*/
|
|
117
|
+
export function applyAgentToolExposure(session, { existing = false } = {}) {
|
|
118
|
+
if (!session || !Array.isArray(session.tools) || !isAgentOwner(session)) return false;
|
|
119
|
+
const before = sessionToolExposure(session);
|
|
120
|
+
const allowlisted = honoredSchemaAllowlist(session.schemaAllowedTools, { ownerIsAgent: true, agent: session.agent });
|
|
121
|
+
const bridge =
|
|
122
|
+
!allowlisted && toolExposureModeForProvider(session.provider, session.wireRoute) === TOOL_EXPOSURE_BRIDGE;
|
|
123
|
+
if (!bridge && before === null) return false;
|
|
124
|
+
// A surface an earlier bridge revision built is rebuilt now.
|
|
125
|
+
const outdated = bridgeSurfaceOutdated(session);
|
|
126
|
+
// The tools just resolved are the whole authority: no earlier catalog, MCP
|
|
127
|
+
// availability snapshot or pending MCP delta survives. (A bridge surface
|
|
128
|
+
// re-takes the snapshot at its next request boundary; a native agent has no
|
|
129
|
+
// refresh, so a stale snapshot would hide a connected server's tools.)
|
|
130
|
+
delete session.deferredToolCatalog;
|
|
131
|
+
delete session.deferredLateToolCatalog;
|
|
132
|
+
delete session.deferredMcpToolNames;
|
|
133
|
+
delete session.pendingDeferredToolDelta;
|
|
134
|
+
if (bridge) {
|
|
135
|
+
// The resolved list may be shared (prepared-resume cache): rebuild a copy.
|
|
136
|
+
session.tools = session.tools.slice();
|
|
137
|
+
applyDeferredToolSurface(session, 'full', [], { provider: session.provider, model: session.model });
|
|
138
|
+
} else {
|
|
139
|
+
for (const field of AGENT_BRIDGE_FIELDS) delete session[field];
|
|
140
|
+
// Without bridge state the fixed slot composes empty: the guidance goes.
|
|
141
|
+
if (Array.isArray(session.messages)) applyInitialDeferredToolManifestToBp2(session, [], { rebuild: true });
|
|
142
|
+
delete session.deferredToolBp2Applied;
|
|
143
|
+
}
|
|
144
|
+
const changed = before !== sessionToolExposure(session) || outdated;
|
|
145
|
+
if (existing && changed) markToolSurfaceMigrated(session);
|
|
146
|
+
return changed;
|
|
147
|
+
}
|
|
@@ -8,6 +8,7 @@ import { traceLoopPhaseTiming } from './diagnostics.mjs';
|
|
|
8
8
|
import { processToolBatch } from '../tool-batch.mjs';
|
|
9
9
|
import { CROSS_TURN_CAP, REPEAT_FAIL_LIMIT } from './loop-state.mjs';
|
|
10
10
|
import { markStepEffort } from './step-auto-effort.mjs';
|
|
11
|
+
import { resolveExecutionToolCalls } from './tool-call-resolution.mjs';
|
|
11
12
|
|
|
12
13
|
function isSleepLikeToolCall(call) {
|
|
13
14
|
const name = String(call?.name || call?.toolName || call?.function?.name || '').toLowerCase();
|
|
@@ -15,7 +16,7 @@ function isSleepLikeToolCall(call) {
|
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
export async function runToolPhase(state, round, sent, onToolCall) {
|
|
18
|
-
const { opts, messages, tools, sessionId, sessionRef, signal, response
|
|
19
|
+
const { opts, messages, tools, sessionId, sessionRef, signal, response } = state;
|
|
19
20
|
state.noToolTurn.noteToolCallTurn();
|
|
20
21
|
const calls = response.toolCalls;
|
|
21
22
|
round.resolveToolCallId.all(calls);
|
|
@@ -24,8 +25,7 @@ export async function runToolPhase(state, round, sent, onToolCall) {
|
|
|
24
25
|
// UI. Providers that stream via onTextDelta already rendered it; providers
|
|
25
26
|
// that return text only in response.content would otherwise show nothing
|
|
26
27
|
// before the tool card. The engine de-dups against already-streamed text.
|
|
27
|
-
|
|
28
|
-
if (!suppressMidTurnText && typeof response.content === 'string' && response.content.trim()) {
|
|
28
|
+
if (typeof response.content === 'string' && response.content.trim()) {
|
|
29
29
|
try {
|
|
30
30
|
opts.onAssistantText?.(response.content);
|
|
31
31
|
} catch {
|
|
@@ -34,9 +34,11 @@ export async function runToolPhase(state, round, sent, onToolCall) {
|
|
|
34
34
|
}
|
|
35
35
|
// Per-turn batch shape — one row per assistant turn so trace consumers can
|
|
36
36
|
// derive the multi-tool adoption ratio without scanning message bodies.
|
|
37
|
-
|
|
37
|
+
// Audit records what runs: a bridged call_tool is recorded as its target.
|
|
38
|
+
// The wire calls stay the transcript identity (assistant turn below).
|
|
39
|
+
const toolBatchId = recordToolBatch(sessionId, resolveExecutionToolCalls(calls, sessionRef), state.iterations);
|
|
38
40
|
await Promise.resolve(onToolCall?.(state.iterations, calls));
|
|
39
|
-
const assistantTurnMsg = buildToolCallAssistantMessage(response, { calls,
|
|
41
|
+
const assistantTurnMsg = buildToolCallAssistantMessage(response, { calls, opts });
|
|
40
42
|
commitAssistantMessage(messages, assistantTurnMsg, opts);
|
|
41
43
|
try {
|
|
42
44
|
opts.onToolPhaseStarted?.();
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
// abort-aware call wrapper is ask-call-interrupt. This file owns the lock,
|
|
7
7
|
// the loop and the runtime bookkeeping around each turn.
|
|
8
8
|
import { createHash } from 'node:crypto';
|
|
9
|
+
import { admitWorkspaceActivity } from '../../../../shared/worktrees/activity-gate.mjs';
|
|
9
10
|
import {
|
|
10
11
|
persistedAssistantTranscriptMetadata,
|
|
11
12
|
persistedUserTranscriptMetadata,
|
|
@@ -38,6 +39,16 @@ const traceAskStart = (sessionId, explicitPrefetch) => {
|
|
|
38
39
|
);
|
|
39
40
|
};
|
|
40
41
|
|
|
42
|
+
/** A background follow-up ask has no caller to reject to; its failure would
|
|
43
|
+
* otherwise strand the pending input silently. */
|
|
44
|
+
const logFollowUpFailure = (sessionId) => (error) => {
|
|
45
|
+
try {
|
|
46
|
+
process.stderr.write(`[agent-ask] follow-up ask failed session=${sessionId}: ${error?.message || error}\n`);
|
|
47
|
+
} catch {
|
|
48
|
+
/* best-effort */
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
41
52
|
/** The transcript timestamps the caller supplied for this ask: the persisted
|
|
42
53
|
* user metadata plus a one-shot reader for the assistant metadata. */
|
|
43
54
|
export function createAskTranscriptMeta(rawTranscriptMeta) {
|
|
@@ -66,7 +77,13 @@ export function createAskTranscriptMeta(rawTranscriptMeta) {
|
|
|
66
77
|
* the turn state and rethrows. Returns the terminal result preview and the
|
|
67
78
|
* follow-ups drained right after the provider accepted the turn. */
|
|
68
79
|
async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOverride, transcript, askStartedAt }) {
|
|
80
|
+
let releaseWorkspace;
|
|
69
81
|
try {
|
|
82
|
+
releaseWorkspace = await admitWorkspaceActivity(
|
|
83
|
+
sessionId,
|
|
84
|
+
cwdOverride || opened.turn.session.cwd || process.cwd(),
|
|
85
|
+
opened.runtime.controller?.signal
|
|
86
|
+
);
|
|
70
87
|
const prepared = await prepareAskTurn({ sessionId, opened, input, cwdOverride, transcriptMeta: transcript.user });
|
|
71
88
|
const result = await runAskAgentLoop({
|
|
72
89
|
sessionId,
|
|
@@ -105,8 +122,12 @@ async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOv
|
|
|
105
122
|
generation: opened.askGeneration,
|
|
106
123
|
turnCheckpointToken: opened.turnToken,
|
|
107
124
|
runtime: opened.runtime,
|
|
125
|
+
transcriptMeta: transcript.raw,
|
|
126
|
+
askStartedAt,
|
|
108
127
|
});
|
|
109
128
|
throw err;
|
|
129
|
+
} finally {
|
|
130
|
+
releaseWorkspace?.();
|
|
110
131
|
}
|
|
111
132
|
}
|
|
112
133
|
|
|
@@ -122,9 +143,12 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
122
143
|
process.stderr.write(`[agent-trace] lock-acquired waitedMs=${Date.now() - askStartedAt}\n`);
|
|
123
144
|
}
|
|
124
145
|
// A non-empty cross-process sweep starts an empty follow-up ask once the
|
|
125
|
-
// current session lock is released; it never delays completion.
|
|
146
|
+
// current session lock is released; it never delays completion. The
|
|
147
|
+
// failed-turn retry identity is one-shot: a follow-up runs queued input,
|
|
148
|
+
// never the retried turn. Nobody awaits it, so a failure is logged.
|
|
149
|
+
const followUpOpts = { ...askOpts, retryFailedTurn: undefined, retryTurnId: undefined, retryAttemptId: undefined };
|
|
126
150
|
const kickFollowUpAsk = () => {
|
|
127
|
-
askSession(sessionId, '', null, onToolCall, cwdOverride, null,
|
|
151
|
+
askSession(sessionId, '', null, onToolCall, cwdOverride, null, followUpOpts).catch(logFollowUpFailure(sessionId));
|
|
128
152
|
};
|
|
129
153
|
// The mutex is held for the WHOLE askSession call, including any follow-up
|
|
130
154
|
// turns drained from the pending-message queue below — the single outer
|
|
@@ -141,6 +165,7 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
141
165
|
// A failed-turn retry rewinds only the turn it retries, never a drained
|
|
142
166
|
// follow-up turn.
|
|
143
167
|
let retryFailedTurn = askOpts.retryFailedTurn === true;
|
|
168
|
+
let retryTurnId = askOpts.retryTurnId;
|
|
144
169
|
try {
|
|
145
170
|
// Turn loop (pendingMessages pattern): run the current prompt, then drain
|
|
146
171
|
// any `agent type=send` messages that were queued while this turn was in
|
|
@@ -163,6 +188,11 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
163
188
|
input.retryFailedTurn = true;
|
|
164
189
|
retryFailedTurn = false;
|
|
165
190
|
}
|
|
191
|
+
if (retryTurnId) {
|
|
192
|
+
input.retryTurnId = retryTurnId;
|
|
193
|
+
input.retryAttemptId = askOpts.retryAttemptId;
|
|
194
|
+
retryTurnId = null;
|
|
195
|
+
}
|
|
166
196
|
// Synchronous pre-await setup (must happen before any await so
|
|
167
197
|
// closeSession() can't interleave between load and registration).
|
|
168
198
|
const claimed = claimTurnRuntime({
|
|
@@ -217,7 +247,7 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
217
247
|
if (count <= 0) return;
|
|
218
248
|
kickFollowUpAsk();
|
|
219
249
|
})
|
|
220
|
-
.catch(()
|
|
250
|
+
.catch(logFollowUpFailure(sessionId));
|
|
221
251
|
});
|
|
222
252
|
return result;
|
|
223
253
|
}
|
|
@@ -13,10 +13,6 @@ export async function settleAskCleanup(promise, { timeoutMs } = {}) {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
// Live Agent projection is a per-ask send opt, never a session field.
|
|
16
|
-
// Callers that pass onTextDelta/onAssistantText still need `liveProjection`
|
|
17
|
-
// to un-suppress provider streaming: askSession always wraps those
|
|
18
|
-
// callbacks for interruption tracking, so agent-loop cannot infer intent
|
|
19
|
-
// from `typeof opts.onTextDelta === 'function'`.
|
|
20
16
|
export function resolveAskLiveProjection(askOpts = {}) {
|
|
21
17
|
return askOpts?.liveProjection === true;
|
|
22
18
|
}
|
|
@@ -15,8 +15,13 @@ import {
|
|
|
15
15
|
resolveAutoEffort,
|
|
16
16
|
} from '../../providers/auto-effort.mjs';
|
|
17
17
|
import { builtinFeatureActive } from '../../runtime-core/builtin-features.mjs';
|
|
18
|
-
import { effortOptionsFor } from '../../runtime-core/effort.mjs';
|
|
19
|
-
import {
|
|
18
|
+
import { effortOptionsFor, warnEmptyAutoEffortLadder } from '../../runtime-core/effort.mjs';
|
|
19
|
+
import {
|
|
20
|
+
effortJudgeSupportsSteps,
|
|
21
|
+
judgeTurn,
|
|
22
|
+
prewarmEffortJudge,
|
|
23
|
+
recordEffortDecision,
|
|
24
|
+
} from '../../../../effort-judge/judge-client.mjs';
|
|
20
25
|
import { promptContentText } from './prompt-utils.mjs';
|
|
21
26
|
|
|
22
27
|
// Every cache-safe route judges its tool-result steps the same way. Measured
|
|
@@ -53,6 +58,21 @@ export function autoEffortMode() {
|
|
|
53
58
|
}
|
|
54
59
|
}
|
|
55
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Starts the judge worker when a session is created or opened on a route that
|
|
63
|
+
* Auto effort can judge, so the first judged turn does not wait for the cold
|
|
64
|
+
* load. Fire-and-forget: it never throws and never waits on the load.
|
|
65
|
+
*/
|
|
66
|
+
export function prewarmSessionAutoEffort(session, provider) {
|
|
67
|
+
try {
|
|
68
|
+
if (autoEffortMode() === 'off' || session?.autoEffort === false) return false;
|
|
69
|
+
if (!turnEffortConfigurationMode(session, provider)) return false;
|
|
70
|
+
return prewarmEffortJudge();
|
|
71
|
+
} catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
56
76
|
function lastText(messages, role) {
|
|
57
77
|
for (let i = (messages?.length || 0) - 1; i >= 0; i--) {
|
|
58
78
|
const message = messages[i];
|
|
@@ -98,6 +118,7 @@ export async function resolveTurnAutoEffort({ sessionId, session, provider, inpu
|
|
|
98
118
|
// the judge is not asked (in observe mode too: nothing would be logged).
|
|
99
119
|
if (!autoEffortApplicable({ base, options })) {
|
|
100
120
|
recordEffortDecision({ ...record, skipped: 'default-outside-auto-range' });
|
|
121
|
+
warnEmptyAutoEffortLadder(session.provider, session.model, base);
|
|
101
122
|
return null;
|
|
102
123
|
}
|
|
103
124
|
// The previous user request shows the work a short follow-up continues.
|
|
@@ -120,22 +120,44 @@ function recordAgentRuntimeCall(session, result) {
|
|
|
120
120
|
export async function recordAskUsage({ session, result, askStartedAt, turnSignal }) {
|
|
121
121
|
const prefixHashForLog = recordAgentRuntimeCall(session, result);
|
|
122
122
|
if (!result.usage) return;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
123
|
+
await logSessionLlmUsage({
|
|
124
|
+
session,
|
|
125
|
+
usage: result.usage,
|
|
126
|
+
startedAt: askStartedAt,
|
|
127
|
+
signal: turnSignal,
|
|
128
|
+
prefixHash: prefixHashForLog,
|
|
129
|
+
transportTiming: result.transportTiming || null,
|
|
130
|
+
});
|
|
131
|
+
recordStandaloneStatusTelemetry(session, result, Date.now() - askStartedAt);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** The usage-ledger row of one provider call billed to `session`. `mode`
|
|
135
|
+
* labels a call made outside the turn loop (a /btw side question). */
|
|
136
|
+
export async function logSessionLlmUsage({
|
|
137
|
+
session,
|
|
138
|
+
usage,
|
|
139
|
+
startedAt,
|
|
140
|
+
signal = null,
|
|
141
|
+
prefixHash = null,
|
|
142
|
+
transportTiming = null,
|
|
143
|
+
mode = null,
|
|
144
|
+
}) {
|
|
145
|
+
const inputTokens = usage.inputTokens || 0;
|
|
146
|
+
const outputTokens = usage.outputTokens || 0;
|
|
147
|
+
const cacheReadTokens = usage.cachedTokens || 0;
|
|
148
|
+
const cacheWriteTokens = usage.cacheWriteTokens || 0;
|
|
127
149
|
// Unified total-prompt field. Anthropic = input+cache_read+cache_write
|
|
128
150
|
// (additive); OpenAI OAuth/API/Gemini = input_tokens already includes the
|
|
129
151
|
// cached portion (inclusive), so the fallback must not double-count.
|
|
130
152
|
const { isInclusiveProvider, computeCostUsd } = await runAbortable(
|
|
131
|
-
|
|
153
|
+
signal,
|
|
132
154
|
() => import('../../../../shared/llm/cost.mjs')
|
|
133
155
|
);
|
|
134
156
|
const inclusive = isInclusiveProvider(session.provider);
|
|
135
157
|
let promptTokens = inputTokens + cacheReadTokens + cacheWriteTokens;
|
|
136
|
-
if (typeof
|
|
158
|
+
if (typeof usage.promptTokens === 'number') promptTokens = usage.promptTokens;
|
|
137
159
|
else if (inclusive) promptTokens = Math.max(inputTokens, cacheReadTokens + cacheWriteTokens);
|
|
138
|
-
let costUsd =
|
|
160
|
+
let costUsd = usage.costUsd || 0;
|
|
139
161
|
if (!costUsd) {
|
|
140
162
|
try {
|
|
141
163
|
costUsd = computeCostUsd({
|
|
@@ -145,7 +167,7 @@ export async function recordAskUsage({ session, result, askStartedAt, turnSignal
|
|
|
145
167
|
outputTokens,
|
|
146
168
|
cacheReadTokens,
|
|
147
169
|
cacheWriteTokens,
|
|
148
|
-
cacheWrite1hTokens:
|
|
170
|
+
cacheWrite1hTokens: usage.cacheWrite1hTokens || 0,
|
|
149
171
|
});
|
|
150
172
|
} catch {
|
|
151
173
|
/* best-effort */
|
|
@@ -158,7 +180,8 @@ export async function recordAskUsage({ session, result, askStartedAt, turnSignal
|
|
|
158
180
|
preset: session.presetName || null,
|
|
159
181
|
model: session.model,
|
|
160
182
|
provider: session.provider,
|
|
161
|
-
|
|
183
|
+
...(mode ? { mode } : {}),
|
|
184
|
+
duration: Date.now() - startedAt,
|
|
162
185
|
profileId: session.profileId || null,
|
|
163
186
|
sessionId: session.id,
|
|
164
187
|
inputTokens,
|
|
@@ -166,11 +189,10 @@ export async function recordAskUsage({ session, result, askStartedAt, turnSignal
|
|
|
166
189
|
cacheReadTokens,
|
|
167
190
|
cacheWriteTokens,
|
|
168
191
|
promptTokens,
|
|
169
|
-
prefixHash
|
|
192
|
+
prefixHash,
|
|
170
193
|
costUsd,
|
|
171
|
-
transportTiming
|
|
194
|
+
transportTiming,
|
|
172
195
|
});
|
|
173
|
-
recordStandaloneStatusTelemetry(session, result, Date.now() - askStartedAt);
|
|
174
196
|
}
|
|
175
197
|
|
|
176
198
|
/** Persist opaque providerState for stateful providers. The update bit
|