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
|
@@ -259,6 +259,56 @@ export const PROVIDER_WS_SEMANTIC_IDLE_TIMEOUT_MS = resolveTimeoutMs(
|
|
|
259
259
|
{ minMs: 10_000, maxMs: Math.max(10_000, STALL_ABORT_MS - STALL_TICK_MS) }
|
|
260
260
|
);
|
|
261
261
|
|
|
262
|
+
/**
|
|
263
|
+
* The longest a provider's own first-byte handling may legitimately run
|
|
264
|
+
* before it gives up, over every attempt it permits: `windowMs(n)` is the wait
|
|
265
|
+
* of attempt n, applied to the response headers and again to the first chunk,
|
|
266
|
+
* and `backoffMs[n]` the sleep before attempt n (index 0 unused, the last
|
|
267
|
+
* value repeats). `transportMs` covers the header stage only; `semanticMs`
|
|
268
|
+
* covers headers plus first chunk. The agent watchdog's first-response
|
|
269
|
+
* deadlines sit above these, so the provider's timeout and retry decide first.
|
|
270
|
+
*/
|
|
271
|
+
export function providerFirstResponseBudget({ attempts, windowMs, backoffMs = [] }) {
|
|
272
|
+
let transportMs = 0;
|
|
273
|
+
let semanticMs = 0;
|
|
274
|
+
for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
|
|
275
|
+
const backoff = attempt > 0 ? (backoffMs[Math.min(attempt, backoffMs.length - 1)] ?? 0) : 0;
|
|
276
|
+
const window = windowMs(attempt);
|
|
277
|
+
transportMs += backoff + window;
|
|
278
|
+
semanticMs += backoff + 2 * window;
|
|
279
|
+
}
|
|
280
|
+
return { transportMs, semanticMs };
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* A provider's first-byte policy `{ timeoutMs, maxMs, retries }`: `timeoutMs`
|
|
285
|
+
* is the first attempt's window (headers, and again the first chunk); each
|
|
286
|
+
* first-byte timeout doubles the next window up to `maxMs`, and `retries` caps
|
|
287
|
+
* how many of those timeouts are retried. `retries: null` leaves first-byte
|
|
288
|
+
* timeouts to the provider's ordinary ladder, every attempt on `timeoutMs`.
|
|
289
|
+
* Returns the window of an attempt after `timeouts` first-byte timeouts.
|
|
290
|
+
*/
|
|
291
|
+
export function firstByteWindowMs(policy, timeouts = 0) {
|
|
292
|
+
if (policy.retries == null) return policy.timeoutMs;
|
|
293
|
+
return Math.min(policy.timeoutMs * 2 ** timeouts, Math.max(policy.timeoutMs, policy.maxMs));
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* providerFirstResponseBudget for a first-byte policy over a ladder of
|
|
298
|
+
* `attempts` sends. Connection drops and 5xx responses share that ladder with
|
|
299
|
+
* first-byte timeouts, and such a failure can land just before the timeout, so
|
|
300
|
+
* every attempt is budgeted a full window. A window only grows with the
|
|
301
|
+
* timeouts before it and at most `retries` timeouts are retried, so the worst
|
|
302
|
+
* case has the timeouts first, then later attempts at the widest window.
|
|
303
|
+
*/
|
|
304
|
+
export function firstBytePolicyBudget(policy, { attempts, backoffMs }) {
|
|
305
|
+
return providerFirstResponseBudget({
|
|
306
|
+
attempts,
|
|
307
|
+
windowMs: (attempt) => firstByteWindowMs(policy, Math.min(attempt, policy.retries ?? 0)),
|
|
308
|
+
backoffMs,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
|
|
262
312
|
// First retry has a small floor (250ms) instead of 0ms: an immediate reissue on
|
|
263
313
|
// a transient 5xx burst lets parallel workers thundering-herd the backend in
|
|
264
314
|
// lockstep (jitter alone can't decluster a 0ms base). Subsequent steps keep the
|
|
@@ -68,6 +68,12 @@ export function buildBashPolicyScanTargets(command) {
|
|
|
68
68
|
return out;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
export function
|
|
72
|
-
return
|
|
71
|
+
export function evaluateExecPolicy(command) {
|
|
72
|
+
return evaluateExecPolicyFromTargets(buildBashPolicyScanTargets(command));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// `elevationApproved` is runtime-supplied: the user approved this call's
|
|
76
|
+
// 'ask' (elevation) decision. It never lifts a deny.
|
|
77
|
+
export function checkExecPolicyMessage(command, { elevationApproved = false } = {}) {
|
|
78
|
+
return formatExecPolicyBlockMessage(evaluateExecPolicy(command), { elevationApproved });
|
|
73
79
|
}
|
|
@@ -8,11 +8,11 @@ import { formatShellToolFailure } from './result-format.mjs';
|
|
|
8
8
|
// Policy + shell-specific rewrites before any shell dispatch. Returns either
|
|
9
9
|
// `{ failure }` (a formatted tool failure) or the command to run with the
|
|
10
10
|
// resolved shell spec and the wmic rewrite (if any).
|
|
11
|
-
export function prepareShellCommand(args) {
|
|
11
|
+
export function prepareShellCommand(args, { elevationApproved = false } = {}) {
|
|
12
12
|
// Run hard-block policy before any shell dispatch.
|
|
13
13
|
const rawCmd = String(args && args.command != null ? args.command : '');
|
|
14
14
|
if (rawCmd) {
|
|
15
|
-
const policyBlock = checkExecPolicyMessage(rawCmd);
|
|
15
|
+
const policyBlock = checkExecPolicyMessage(rawCmd, { elevationApproved });
|
|
16
16
|
if (policyBlock) return { failure: formatShellToolFailure(policyBlock) };
|
|
17
17
|
}
|
|
18
18
|
let command = args.command;
|
|
@@ -52,7 +52,7 @@ export function prepareShellCommand(args) {
|
|
|
52
52
|
: null;
|
|
53
53
|
if (bashismRewrite) command = bashismRewrite.command;
|
|
54
54
|
|
|
55
|
-
const execPolicyBlock = checkExecPolicyMessage(command);
|
|
55
|
+
const execPolicyBlock = checkExecPolicyMessage(command, { elevationApproved });
|
|
56
56
|
if (execPolicyBlock) return { failure: formatShellToolFailure(execPolicyBlock) };
|
|
57
57
|
return { command, analysisCommand, resolvedSpec, wmicRewrite, bashismRewrite };
|
|
58
58
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { renderBackgroundTask, startBackgroundTask } from '../../../../../shared/background-tasks.mjs';
|
|
2
2
|
import { killShellDescendants, waitForShellDescendants } from '../../lib/shell-descendants.mjs';
|
|
3
|
+
import { releaseShellJobWorkspace } from '../lib/shell-job-records.mjs';
|
|
3
4
|
import { consumeFilterTeeCapture } from '../shell-analysis.mjs';
|
|
4
5
|
import { compactShellOutputLosslessly, renderShellOutputBody } from '../shell-lossless-compact.mjs';
|
|
5
6
|
import { removeTransportFileNow } from './transport-artifacts.mjs';
|
|
@@ -33,7 +34,10 @@ function trackSurvivingDescendants(handle, { command, cwd, options, startedAtMs
|
|
|
33
34
|
meta: { task_id: handle.taskId, stdout: null, stderr: null, cwd, timeoutMs: 0 },
|
|
34
35
|
resultType: 'shell_task_result',
|
|
35
36
|
run: async () => {
|
|
36
|
-
await waitForShellDescendants(handle
|
|
37
|
+
await waitForShellDescendants(handle);
|
|
38
|
+
// The folder reservation the finished command handed to its
|
|
39
|
+
// survivors ends with the last of them.
|
|
40
|
+
releaseShellJobWorkspace(handle.taskId);
|
|
37
41
|
return {
|
|
38
42
|
task_id: handle.taskId,
|
|
39
43
|
status: 'completed',
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
1
2
|
import { writeFileSync } from 'node:fs';
|
|
2
3
|
import { tmpdir } from 'node:os';
|
|
3
4
|
import { join as pathJoin } from 'node:path';
|
|
@@ -23,12 +24,15 @@ export function hoistInlineScript(command, shellType) {
|
|
|
23
24
|
planLongShellScriptFileTransport(command, transport);
|
|
24
25
|
if (!hoist) return { command, hoistPath: null };
|
|
25
26
|
try {
|
|
26
|
-
|
|
27
|
+
// One file per command: parallel calls start within the same millisecond,
|
|
28
|
+
// and a shared name let a later script overwrite an earlier one before it
|
|
29
|
+
// ran. The exclusive flag refuses any name that already exists.
|
|
30
|
+
const file = pathJoin(tmpdir(), `mixdog-inline-${process.pid}-${randomUUID()}${hoist.extension}`);
|
|
27
31
|
// Windows PowerShell 5.1 interprets UTF-8 without BOM as the active ANSI
|
|
28
32
|
// codepage. Preserve non-ASCII command text when the transport changes a
|
|
29
33
|
// long command into a .ps1 file.
|
|
30
34
|
const fileBody = hoist.extension === '.ps1' ? `\uFEFF${hoist.body}` : hoist.body;
|
|
31
|
-
writeFileSync(file, fileBody, 'utf8');
|
|
35
|
+
writeFileSync(file, fileBody, { encoding: 'utf8', flag: 'wx' });
|
|
32
36
|
return { command: hoist.replace(file.replace(/\\/g, '/')), hoistPath: file };
|
|
33
37
|
} catch {
|
|
34
38
|
return { command, hoistPath: null };
|
|
@@ -61,7 +61,9 @@ export async function executeBashTool(args, workDir, options = {}) {
|
|
|
61
61
|
// Every call starts from the current Project root. A command-local `cd`
|
|
62
62
|
// never creates a second session cwd authority beside the dedicated cwd tool.
|
|
63
63
|
const bashWorkDir = workDir;
|
|
64
|
-
|
|
64
|
+
// Approval comes from the runtime's options, never from model-supplied args.
|
|
65
|
+
const elevationApproved = options?.elevationApproved === true;
|
|
66
|
+
const prepared = prepareShellCommand(args, { elevationApproved });
|
|
65
67
|
if (prepared.failure) return prepared.failure;
|
|
66
68
|
const { resolvedSpec, wmicRewrite, bashismRewrite } = prepared;
|
|
67
69
|
// Effects are analyzed on the command as the caller meant it, before the
|
|
@@ -97,6 +99,7 @@ export async function executeBashTool(args, workDir, options = {}) {
|
|
|
97
99
|
command: invocation.wrappedCommand,
|
|
98
100
|
execScript: invocation.execScript,
|
|
99
101
|
directArgv: invocation.directArgv,
|
|
102
|
+
elevationApproved,
|
|
100
103
|
env: invocation.spawnEnv,
|
|
101
104
|
cwd: bashWorkDir,
|
|
102
105
|
timeoutMs: deadlines.timeout,
|
|
@@ -12,9 +12,16 @@
|
|
|
12
12
|
// adapter expects — the caller (builtin.mjs default: case) falls back to
|
|
13
13
|
// the existing EXTERNAL_TOOL_REDIRECTS guidance message in that case.
|
|
14
14
|
import { readFileSync, mkdirSync, existsSync, lstatSync, realpathSync, statSync } from 'node:fs';
|
|
15
|
-
import { dirname } from 'node:path';
|
|
15
|
+
import { dirname, relative, resolve } from 'node:path';
|
|
16
16
|
import { atomicWrite, symlinkWriteTarget } from './atomic-write.mjs';
|
|
17
|
-
import { fileVersion } from './file-version.mjs';
|
|
17
|
+
import { fileVersion, sameFileVersion } from './file-version.mjs';
|
|
18
|
+
import { withBuiltinPathLocks } from './path-locks.mjs';
|
|
19
|
+
import { withAdvisoryLocks } from './advisory-lock.mjs';
|
|
20
|
+
import { canonicalCachePath } from './read-range-index.mjs';
|
|
21
|
+
import { readSourceWindows } from './read-source-windows.mjs';
|
|
22
|
+
import { isReadLineClipped } from './read-formatting.mjs';
|
|
23
|
+
import { readSourceWindow } from '../../../../shared/read-row-numbers.mjs';
|
|
24
|
+
import { cursorNativeCall, releaseCursorNativeCall } from '../../providers/cursor-native-context.mjs';
|
|
18
25
|
import { assertPathsReachable } from './fs-reachability.mjs';
|
|
19
26
|
import {
|
|
20
27
|
normalizeInputPath,
|
|
@@ -30,13 +37,14 @@ import {
|
|
|
30
37
|
isBlockedDevicePath,
|
|
31
38
|
isSpecialFileStat,
|
|
32
39
|
} from './device-paths.mjs';
|
|
33
|
-
import { recordReadSnapshot } from './read-snapshot-runtime.mjs';
|
|
40
|
+
import { recordReadSnapshot, getReadSnapshot } from './read-snapshot-runtime.mjs';
|
|
34
41
|
import { executeBashTool } from './bash-tool.mjs';
|
|
35
42
|
import { nativeEditSessionSatisfiesContract, runServerEdit } from '../patch/native-server.mjs';
|
|
36
43
|
import { decodeValidUtf8OrNull, detectPatchTargetCodec, nearestPatchLineMatch } from '../patch/matcher.mjs';
|
|
37
44
|
import { hashText } from './hash-utils.mjs';
|
|
38
|
-
import { invalidateBuiltinResultCache } from './cache-layers.mjs';
|
|
45
|
+
import { invalidateBuiltinResultCache, rawContentCacheGet } from './cache-layers.mjs';
|
|
39
46
|
import { markCodeGraphDirtyPaths } from '../code-graph-state.mjs';
|
|
47
|
+
import { reviewFileContent } from '../../../../shared/bounded-file-read.mjs';
|
|
40
48
|
|
|
41
49
|
const STR_REPLACE_NAMES = new Set(['edit', 'strreplace', 'str_replace', 'str_replace_editor', 'search_replace']);
|
|
42
50
|
const WRITE_NAMES = new Set(['write', 'create_file', 'createfile']);
|
|
@@ -189,26 +197,27 @@ function recordEditSnapshot(fullPath, options, contentHash = null, preMutationSt
|
|
|
189
197
|
// UI diff parity with apply_patch: register the before/after pair on the
|
|
190
198
|
// shared per-call side channel so tool cards render edit results with the
|
|
191
199
|
// same diff markup. Lazy import breaks the orchestrator→builtin→adapters
|
|
192
|
-
// module cycle; failures never affect the edit result.
|
|
193
|
-
|
|
200
|
+
// module cycle; failures never affect the edit result. `sides()` yields the
|
|
201
|
+
// file's `{ before, after }` content (null = absent).
|
|
202
|
+
async function recordToolUiDiff(options, workDir, fullPath, sides) {
|
|
194
203
|
const callId = options?.toolCallId;
|
|
195
204
|
const sessionId = options?.sessionId || options?.readStateScope;
|
|
196
205
|
if (!callId || !sessionId) return;
|
|
197
206
|
try {
|
|
198
207
|
const { registerEditToolUiDiff } = await import('../patch/orchestrator.mjs');
|
|
199
|
-
registerEditToolUiDiff({
|
|
200
|
-
callId,
|
|
201
|
-
sessionId,
|
|
202
|
-
basePath: workDir,
|
|
203
|
-
fullPath,
|
|
204
|
-
before: before === null ? null : encodeEditContent(before, encoding),
|
|
205
|
-
after: after === null ? null : encodeEditContent(after, encoding),
|
|
206
|
-
});
|
|
208
|
+
registerEditToolUiDiff({ callId, sessionId, basePath: workDir, fullPath, ...sides() });
|
|
207
209
|
} catch {
|
|
208
210
|
/* best-effort display channel */
|
|
209
211
|
}
|
|
210
212
|
}
|
|
211
213
|
|
|
214
|
+
async function recordEditUiDiff(options, workDir, fullPath, before, after, encoding) {
|
|
215
|
+
await recordToolUiDiff(options, workDir, fullPath, () => ({
|
|
216
|
+
before: before === null ? null : encodeEditContent(before, encoding),
|
|
217
|
+
after: after === null ? null : encodeEditContent(after, encoding),
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
|
|
212
221
|
// The 0-based line the failure excerpt centres on, or -1: the engine's
|
|
213
222
|
// "nearest match" hint, else the exact old_string, else its longest tokens,
|
|
214
223
|
// else the fuzzy line scorer.
|
|
@@ -513,13 +522,14 @@ function readEditTarget(fullPath) {
|
|
|
513
522
|
let statBefore = {};
|
|
514
523
|
let content;
|
|
515
524
|
let fileEnc;
|
|
525
|
+
let rawBuf;
|
|
516
526
|
try {
|
|
517
527
|
try {
|
|
518
528
|
statBefore = { ...fileVersion(statSync(fullPath)) };
|
|
519
529
|
} catch {
|
|
520
530
|
/* readFileSync below surfaces the real error */
|
|
521
531
|
}
|
|
522
|
-
|
|
532
|
+
rawBuf = readFileSync(fullPath);
|
|
523
533
|
fileEnc = detectPatchTargetCodec(rawBuf);
|
|
524
534
|
content = fileEnc.certain ? decodeEditBuffer(rawBuf, fileEnc) : null;
|
|
525
535
|
} catch (err) {
|
|
@@ -534,7 +544,7 @@ function readEditTarget(fullPath) {
|
|
|
534
544
|
' Convert the encoding first.',
|
|
535
545
|
};
|
|
536
546
|
}
|
|
537
|
-
return { content, fileEnc, statBefore };
|
|
547
|
+
return { content, fileEnc, statBefore, rawBuf };
|
|
538
548
|
}
|
|
539
549
|
|
|
540
550
|
/**
|
|
@@ -757,7 +767,7 @@ function resolveStrReplaceArgs(args) {
|
|
|
757
767
|
return out;
|
|
758
768
|
}
|
|
759
769
|
|
|
760
|
-
async function adaptStrReplace(args, workDir, options) {
|
|
770
|
+
async function adaptStrReplace(args, workDir, options, resolvedTarget = null) {
|
|
761
771
|
const resolved = resolveStrReplaceArgs(args);
|
|
762
772
|
if (resolved.error) return resolved.error;
|
|
763
773
|
let oldStr = resolved.old_string;
|
|
@@ -767,7 +777,16 @@ async function adaptStrReplace(args, workDir, options) {
|
|
|
767
777
|
}
|
|
768
778
|
if (oldStr === newStr) return SAME_STRINGS_ERROR;
|
|
769
779
|
const replaceAll = args?.replace_all === true || String(args?.replace_all || '').toLowerCase() === 'true';
|
|
770
|
-
|
|
780
|
+
if (!resolvedTarget) {
|
|
781
|
+
return withEditTargetLock(
|
|
782
|
+
args,
|
|
783
|
+
workDir,
|
|
784
|
+
options,
|
|
785
|
+
(target) => adaptStrReplace(args, workDir, options, target),
|
|
786
|
+
oldStr.length === 0
|
|
787
|
+
);
|
|
788
|
+
}
|
|
789
|
+
const target = resolvedTarget || (await resolveTargetPath(args, workDir));
|
|
771
790
|
if (!target) return null;
|
|
772
791
|
if (target.error) return target.error;
|
|
773
792
|
const fullPath = target.full;
|
|
@@ -820,14 +839,18 @@ async function adaptStrReplace(args, workDir, options) {
|
|
|
820
839
|
return applyEditNative(edit, oldStr, newStr, editPlan, replaceAll);
|
|
821
840
|
}
|
|
822
841
|
|
|
823
|
-
async function adaptWrite(args, workDir, options) {
|
|
842
|
+
async function adaptWrite(args, workDir, options, resolvedTarget = null) {
|
|
824
843
|
const contents = args?.contents ?? args?.content ?? args?.file_text;
|
|
825
844
|
if (typeof contents !== 'string') return null;
|
|
826
|
-
|
|
845
|
+
if (!resolvedTarget) {
|
|
846
|
+
return withEditTargetLock(args, workDir, options, (target) => adaptWrite(args, workDir, options, target));
|
|
847
|
+
}
|
|
848
|
+
const target = resolvedTarget || (await resolveTargetPath(args, workDir));
|
|
827
849
|
if (!target) return null;
|
|
828
850
|
if (target.error) return target.error;
|
|
829
851
|
const fullPath = target.full;
|
|
830
852
|
const existed = existsSync(fullPath);
|
|
853
|
+
const before = existed ? reviewFileContent(fullPath) : null;
|
|
831
854
|
try {
|
|
832
855
|
mkdirSync(dirname(fullPath), { recursive: true });
|
|
833
856
|
} catch {
|
|
@@ -835,6 +858,7 @@ async function adaptWrite(args, workDir, options) {
|
|
|
835
858
|
}
|
|
836
859
|
await atomicWrite(fullPath, contents, { sessionId: editScope(options) });
|
|
837
860
|
invalidateAfterWrite(fullPath);
|
|
861
|
+
await recordToolUiDiff(options, workDir, fullPath, () => ({ before, after: contents }));
|
|
838
862
|
return `${existed ? 'Updated' : 'Created'} ${fullPath} (${Buffer.byteLength(contents, 'utf8')} bytes)`;
|
|
839
863
|
}
|
|
840
864
|
|
|
@@ -845,6 +869,180 @@ async function adaptBash(key, args, workDir, options) {
|
|
|
845
869
|
return executeBashTool(shellArgs, workDir, options);
|
|
846
870
|
}
|
|
847
871
|
|
|
872
|
+
async function withEditTargetLock(args, workDir, options, run, allowCreate = true) {
|
|
873
|
+
if (options?.signal?.aborted) throw options.signal.reason || new Error('Edit cancelled');
|
|
874
|
+
const target = await resolveTargetPath(args, workDir);
|
|
875
|
+
if (!target || target.error) return target?.error ?? null;
|
|
876
|
+
if (!allowCreate && !existsSync(target.full)) {
|
|
877
|
+
return `Error: cannot read ${target.full} (target is missing or inaccessible)`;
|
|
878
|
+
}
|
|
879
|
+
const resolveReal = () => {
|
|
880
|
+
const nearest = realpathNearestExisting(target.full);
|
|
881
|
+
return nearest ? resolve(nearest.real, relative(nearest.probe, target.full)) : null;
|
|
882
|
+
};
|
|
883
|
+
const real = resolveReal();
|
|
884
|
+
if (!real) return 'Error: cannot resolve edit target for locking';
|
|
885
|
+
return withBuiltinPathLocks([target.full, real], () =>
|
|
886
|
+
withAdvisoryLocks([real], async () => {
|
|
887
|
+
if (options?.signal?.aborted) throw options.signal.reason || new Error('Edit cancelled');
|
|
888
|
+
if (resolveReal() !== real) return 'Error: edit target changed while acquiring its lock';
|
|
889
|
+
return run(target);
|
|
890
|
+
})
|
|
891
|
+
);
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
const NATIVE_SNAPSHOT_MAX_BYTES = 1024 * 1024;
|
|
895
|
+
|
|
896
|
+
// Structured truncation report for a returned read window, taken from the raw
|
|
897
|
+
// source lines of that window with the read display's own clip predicate. A
|
|
898
|
+
// window that cannot be verified is reported clipped (fail closed).
|
|
899
|
+
async function nativeReadWindowReport(fullPath, source) {
|
|
900
|
+
if (source.startLine == null || source.endLine < source.startLine) return { lineClipped: false };
|
|
901
|
+
try {
|
|
902
|
+
const rows = await readSourceWindows(fullPath, [{ start: source.startLine, end: source.endLine }]);
|
|
903
|
+
return { lineClipped: [...rows.values()].some((row) => isReadLineClipped(row)) };
|
|
904
|
+
} catch {
|
|
905
|
+
return { lineClipped: true };
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
/** Clip report of an ordinary read result, for a Cursor read the daemon runs
|
|
910
|
+
* for a remote/proxied provider: `{ lineClipped: true }`, or null when the
|
|
911
|
+
* result is no source window or none of its lines were clipped. */
|
|
912
|
+
export async function remoteReadWindowReport(args, workDir, result) {
|
|
913
|
+
const source = readSourceWindow(typeof result === 'string' ? result : '');
|
|
914
|
+
if (!source) return null;
|
|
915
|
+
const target = await resolveTargetPath(args, workDir);
|
|
916
|
+
const report = !target || target.error ? { lineClipped: true } : await nativeReadWindowReport(target.full, source);
|
|
917
|
+
return report.lineClipped ? report : null;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
async function captureNativeRead(context, args, workDir, options, result) {
|
|
921
|
+
const pending = context.pending;
|
|
922
|
+
delete pending.nativeSnapshot;
|
|
923
|
+
delete pending.nativeReadReply;
|
|
924
|
+
delete pending.nativeReadWindow;
|
|
925
|
+
const target = await resolveTargetPath(args, workDir);
|
|
926
|
+
if (!target || target.error) return;
|
|
927
|
+
let stat;
|
|
928
|
+
try {
|
|
929
|
+
stat = statSync(target.full);
|
|
930
|
+
} catch (error) {
|
|
931
|
+
if (error.code === 'ENOENT') pending.nativeReadReply = { fileNotFound: { path: pending.native.args.path } };
|
|
932
|
+
return;
|
|
933
|
+
}
|
|
934
|
+
const source = readSourceWindow(typeof result === 'string' ? result : '');
|
|
935
|
+
if (source) pending.nativeReadWindow = await nativeReadWindowReport(target.full, source);
|
|
936
|
+
if (
|
|
937
|
+
!source ||
|
|
938
|
+
source.truncated ||
|
|
939
|
+
source.startLine !== 1 ||
|
|
940
|
+
args.offset ||
|
|
941
|
+
args.limit ||
|
|
942
|
+
stat.size > NATIVE_SNAPSHOT_MAX_BYTES ||
|
|
943
|
+
!stat.isFile()
|
|
944
|
+
)
|
|
945
|
+
return;
|
|
946
|
+
const observed = getReadSnapshot(target.full, options?.readStateScope ?? options?.sessionId ?? null);
|
|
947
|
+
if (!observed?.bodyDelivered || !sameFileVersion(observed, stat)) return;
|
|
948
|
+
const cached = rawContentCacheGet(target.full, stat);
|
|
949
|
+
if (!cached) return;
|
|
950
|
+
const bytes = Buffer.from(cached);
|
|
951
|
+
const text = bytes.toString('utf8');
|
|
952
|
+
if (text.includes('\0') || !Buffer.from(text, 'utf8').equals(bytes)) return;
|
|
953
|
+
const displayed = text
|
|
954
|
+
.replace(/^\uFEFF/, '')
|
|
955
|
+
.replace(/\r\n/g, '\n')
|
|
956
|
+
.replace(/\n$/, '');
|
|
957
|
+
if (displayed !== source.content) return;
|
|
958
|
+
const realPath = canonicalCachePath(realpathSync(target.full));
|
|
959
|
+
if (!sameFileVersion(stat, statSync(target.full))) return;
|
|
960
|
+
pending.nativeSnapshot = {
|
|
961
|
+
bytes,
|
|
962
|
+
text,
|
|
963
|
+
version: fileVersion(stat),
|
|
964
|
+
realPath,
|
|
965
|
+
path: canonicalCachePath(target.full),
|
|
966
|
+
delivered: false,
|
|
967
|
+
};
|
|
968
|
+
pending.nativeReadReply = {
|
|
969
|
+
success: {
|
|
970
|
+
path: pending.native.args.path,
|
|
971
|
+
content: text,
|
|
972
|
+
totalLines: source.totalLines,
|
|
973
|
+
fileSize: bytes.length,
|
|
974
|
+
truncated: false,
|
|
975
|
+
rangeApplied: false,
|
|
976
|
+
},
|
|
977
|
+
};
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
async function replaceNativeSnapshot(context, args, workDir, options) {
|
|
981
|
+
return withEditTargetLock(args, workDir, options, async (target) => {
|
|
982
|
+
const parent = context.pending.native.args.toolCallId;
|
|
983
|
+
if (typeof parent !== 'string' || parent.length === 0) {
|
|
984
|
+
return adaptStrReplace(args, workDir, options, target);
|
|
985
|
+
}
|
|
986
|
+
const path = canonicalCachePath(target.full);
|
|
987
|
+
const reads = [...context.executions.values()].filter(
|
|
988
|
+
(entry) =>
|
|
989
|
+
entry.native?.resultType === 'readResult' &&
|
|
990
|
+
entry.native.args.toolCallId === parent &&
|
|
991
|
+
entry.nativeSnapshot?.path === path
|
|
992
|
+
);
|
|
993
|
+
// Creating a missing/empty file retains the normal create-only contract.
|
|
994
|
+
if (reads.length === 0) return adaptStrReplace(args, workDir, options, target);
|
|
995
|
+
if (reads.length !== 1 || !reads[0].nativeSnapshot.delivered) {
|
|
996
|
+
return 'Error: native edit has no unambiguous, delivered full-file snapshot; use MCP edit with explicit old_string';
|
|
997
|
+
}
|
|
998
|
+
const snapshot = reads[0].nativeSnapshot;
|
|
999
|
+
const read = readEditTarget(target.full);
|
|
1000
|
+
if (read.error) return read.error;
|
|
1001
|
+
if (
|
|
1002
|
+
canonicalCachePath(realpathSync(target.full)) !== snapshot.realPath ||
|
|
1003
|
+
!sameFileVersion(snapshot.version, read.statBefore) ||
|
|
1004
|
+
!read.rawBuf.equals(snapshot.bytes)
|
|
1005
|
+
) {
|
|
1006
|
+
return 'Error: native edit target changed since its read; no replacement was written';
|
|
1007
|
+
}
|
|
1008
|
+
let after = args.new_string;
|
|
1009
|
+
if (typeof after !== 'string') return 'Error: native replacement requires text';
|
|
1010
|
+
if (read.fileEnc.bomLen && after.startsWith('\uFEFF')) after = after.slice(1);
|
|
1011
|
+
const lineEndings = new Set(read.content.match(/\r\n|\r|\n/g) || []);
|
|
1012
|
+
if (lineEndings.size > 1) {
|
|
1013
|
+
return 'Error: native full-file replacement cannot preserve mixed line endings; use MCP edit with explicit old_string';
|
|
1014
|
+
}
|
|
1015
|
+
if (lineEndings.size === 1) after = convertTextEol(after, lineEndings.values().next().value);
|
|
1016
|
+
const edit = { fullPath: target.full, workDir, options, ...read };
|
|
1017
|
+
const bytes = encodeEditContent(after, read.fileEnc);
|
|
1018
|
+
const stale = await commitEdit(edit, {
|
|
1019
|
+
bytes,
|
|
1020
|
+
after,
|
|
1021
|
+
staleMessage: STALE_DURING_EDIT,
|
|
1022
|
+
});
|
|
1023
|
+
if (!stale) context.pending.nativeWrittenBytes = bytes.length;
|
|
1024
|
+
return stale ?? `Updated ${editDisplayPath(edit)} (conditional native replacement)`;
|
|
1025
|
+
});
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
// Called only after normal runtime permission checks. The capability is tied to
|
|
1029
|
+
// the streamed execution, not to a flag supplied in model arguments.
|
|
1030
|
+
export async function executeCursorNativeBuiltin(name, args, workDir, options, execute) {
|
|
1031
|
+
const context = cursorNativeCall(options.sessionId, options.toolCallId, name, args);
|
|
1032
|
+
if (!context) return execute(name, args, workDir, options);
|
|
1033
|
+
if (name === 'read') {
|
|
1034
|
+
const result = await execute(name, args, workDir, { ...options, suppressReadUnchangedStub: true });
|
|
1035
|
+
await captureNativeRead(context, args, workDir, options, result);
|
|
1036
|
+
return result;
|
|
1037
|
+
}
|
|
1038
|
+
releaseCursorNativeCall(context.pending);
|
|
1039
|
+
try {
|
|
1040
|
+
return await replaceNativeSnapshot(context, args, workDir, options);
|
|
1041
|
+
} catch (error) {
|
|
1042
|
+
return `Error: native edit failed (${error?.message || error})`;
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
|
|
848
1046
|
export async function tryExecuteExternalToolAdapter(name, args, workDir, options) {
|
|
849
1047
|
if (typeof name !== 'string' || !name) return null;
|
|
850
1048
|
if (!args || typeof args !== 'object' || Array.isArray(args)) return null;
|