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
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
// atomicWrite, and each written path runs the same post-write invalidation trio
|
|
3
3
|
// the builtin edit adapters run (external-tool-adapters.mjs:16-26) — result
|
|
4
4
|
// cache, code-graph dirty paths, read snapshot — so a formatted file is not
|
|
5
|
-
// served from a stale cache or hidden behind "[file unchanged]".
|
|
5
|
+
// served from a stale cache or hidden behind "[file unchanged]". Every write
|
|
6
|
+
// also reaches the session's turn review as its own file change (counted and
|
|
7
|
+
// undoable like an edit-tool write).
|
|
6
8
|
import { readFileSync, statSync } from 'node:fs';
|
|
7
9
|
import { isAbsolute, resolve } from 'node:path';
|
|
8
10
|
import { atomicWrite } from '../agent/orchestrator/tools/builtin/atomic-write.mjs';
|
|
@@ -15,6 +17,7 @@ import {
|
|
|
15
17
|
isWindowsDevicePath,
|
|
16
18
|
} from '../shared/device-paths.mjs';
|
|
17
19
|
import { markCodeGraphDirtyPaths } from '../shared/code-graph-state.mjs';
|
|
20
|
+
import { reviewFileContent } from '../shared/bounded-file-read.mjs';
|
|
18
21
|
|
|
19
22
|
/** Same write-target guards the builtin edit surfaces enforce. */
|
|
20
23
|
export function guardTidyWritePath(fullPath) {
|
|
@@ -130,6 +133,8 @@ async function writeThroughPipeline(fullPath, content, { sessionId = null, signa
|
|
|
130
133
|
export async function applyStructuralFixes({ cwd, matchesByFile, sessionId = null, signal = null } = {}) {
|
|
131
134
|
const applied = [];
|
|
132
135
|
const rejected = [];
|
|
136
|
+
// Every file written, with its exact before/after bytes, for the turn review.
|
|
137
|
+
const written = [];
|
|
133
138
|
for (const [file, matches] of Object.entries(matchesByFile || {})) {
|
|
134
139
|
const fixes = matches.filter((match) => match?.fix).map((match) => ({ ...match.fix, ruleId: match.ruleId }));
|
|
135
140
|
if (fixes.length === 0) continue;
|
|
@@ -153,12 +158,52 @@ export async function applyStructuralFixes({ cwd, matchesByFile, sessionId = nul
|
|
|
153
158
|
continue;
|
|
154
159
|
}
|
|
155
160
|
try {
|
|
156
|
-
const
|
|
161
|
+
const current = readFileSync(fullPath);
|
|
162
|
+
const next = applyReplacements(current, plan.replacements);
|
|
157
163
|
await writeThroughPipeline(fullPath, next, { sessionId, signal });
|
|
164
|
+
written.push({ fullPath, before: current, after: next });
|
|
158
165
|
applied.push({ file, fixes: plan.replacements.length });
|
|
159
166
|
} catch (error) {
|
|
160
167
|
rejected.push({ file, reason: error?.message || String(error) });
|
|
161
168
|
}
|
|
162
169
|
}
|
|
170
|
+
await recordTidyWrites(cwd, sessionId, written);
|
|
163
171
|
return { applied, rejected };
|
|
164
172
|
}
|
|
173
|
+
|
|
174
|
+
// The turn-review recorder is loaded on first use: it pulls in the edit-tool
|
|
175
|
+
// stack, which a tidy check never needs.
|
|
176
|
+
async function recordTidyWrites(cwd, sessionId, changes) {
|
|
177
|
+
if (!sessionId || changes.length === 0) return;
|
|
178
|
+
const { recordToolFileChanges } = await import('../agent/orchestrator/tools/patch/ui-diff.mjs');
|
|
179
|
+
recordToolFileChanges({ sessionId, basePath: cwd, changes });
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** Each file's state before an engine rewrites it in place, for the turn
|
|
183
|
+
* review (see reviewFileContent); a path that cannot be read is left out. */
|
|
184
|
+
export function captureWriteBaselines(fullPaths) {
|
|
185
|
+
const baselines = new Map();
|
|
186
|
+
for (const fullPath of fullPaths) {
|
|
187
|
+
try {
|
|
188
|
+
baselines.set(fullPath, reviewFileContent(fullPath));
|
|
189
|
+
} catch {
|
|
190
|
+
/* not a readable regular file: never recorded */
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return baselines;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** Record in-place engine rewrites of `fullPaths` as this session's own file
|
|
197
|
+
* changes: their captured before-states against the disk now. */
|
|
198
|
+
export async function recordEngineWrites({ cwd, sessionId, baselines, fullPaths }) {
|
|
199
|
+
const changes = [];
|
|
200
|
+
for (const fullPath of fullPaths) {
|
|
201
|
+
if (!baselines.has(fullPath)) continue;
|
|
202
|
+
try {
|
|
203
|
+
changes.push({ fullPath, before: baselines.get(fullPath), after: reviewFileContent(fullPath) });
|
|
204
|
+
} catch {
|
|
205
|
+
/* no longer a readable regular file: never recorded */
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
await recordTidyWrites(cwd, sessionId, changes);
|
|
209
|
+
}
|
|
@@ -8,7 +8,13 @@ import { filesForLanguages } from './languages.mjs';
|
|
|
8
8
|
import { mapLimit } from './process.mjs';
|
|
9
9
|
import { runnerFor } from './runners/index.mjs';
|
|
10
10
|
import { DEFAULT_ENGINE_TIMEOUT_MS } from './runners/shared.mjs';
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
captureWriteBaselines,
|
|
13
|
+
fullPathFor,
|
|
14
|
+
guardTidyWritePath,
|
|
15
|
+
noteWrittenFiles,
|
|
16
|
+
recordEngineWrites,
|
|
17
|
+
} from './apply.mjs';
|
|
12
18
|
|
|
13
19
|
const CHECK_CONCURRENCY = 3;
|
|
14
20
|
|
|
@@ -75,6 +81,7 @@ async function runOne({ engine, files, cwd, mode, apply, timeoutMs, signal, sess
|
|
|
75
81
|
return result;
|
|
76
82
|
}
|
|
77
83
|
const before = new Map(candidates.map((file) => [file, fileDigest(fullPathFor(cwd, file))]));
|
|
84
|
+
const baselines = sessionId ? captureWriteBaselines(candidates.map((file) => fullPathFor(cwd, file))) : null;
|
|
78
85
|
let fixResult;
|
|
79
86
|
try {
|
|
80
87
|
fixResult = await runner.fix({
|
|
@@ -92,10 +99,9 @@ async function runOne({ engine, files, cwd, mode, apply, timeoutMs, signal, sess
|
|
|
92
99
|
const changed = candidates.filter((file) => fileDigest(fullPathFor(cwd, file)) !== before.get(file));
|
|
93
100
|
// The engine wrote in place; run the same invalidation trio a pipeline write
|
|
94
101
|
// would have run for each file it touched.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
);
|
|
102
|
+
const changedPaths = changed.map((file) => fullPathFor(cwd, file));
|
|
103
|
+
noteWrittenFiles(changedPaths, { sessionId });
|
|
104
|
+
if (baselines) await recordEngineWrites({ cwd, sessionId, baselines, fullPaths: changedPaths });
|
|
99
105
|
result.filesChanged = changed;
|
|
100
106
|
if (fixResult?.error) result.error = fixResult.error;
|
|
101
107
|
if (fixResult?.truncated) result.truncated = true;
|
|
@@ -15,19 +15,25 @@ export function createRoutedAgentTool({ rt, agentTool, executeAgentControl = nul
|
|
|
15
15
|
if (typeof executeAgentControl !== 'function') {
|
|
16
16
|
return agentTool.closeAll(reason, scope);
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
18
|
+
// The promise is returned so teardown can wait for closing to finish
|
|
19
|
+
// producing its final index writes before it drains them.
|
|
20
|
+
return Promise.resolve(
|
|
21
|
+
executeAgentControl(
|
|
22
|
+
{
|
|
23
|
+
type: '__close_all',
|
|
24
|
+
reason: String(reason || 'agent owner closed'),
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
callerCwd: rt.currentCwd,
|
|
28
|
+
invocationSource: 'runtime-lifecycle',
|
|
29
|
+
callerSessionId: scope?.callerSessionId || rt.session?.id || null,
|
|
30
|
+
clientHostPid: rt.session?.clientHostPid || process.pid,
|
|
31
|
+
}
|
|
32
|
+
)
|
|
33
|
+
).then(
|
|
34
|
+
() => undefined,
|
|
35
|
+
() => undefined
|
|
36
|
+
);
|
|
31
37
|
},
|
|
32
38
|
};
|
|
33
39
|
const agentStatusState = () => {
|
|
@@ -138,6 +138,7 @@ function wireToolPolicyRefresh(boot) {
|
|
|
138
138
|
getMode: () => rt.mode,
|
|
139
139
|
getConfig: () => rt.config,
|
|
140
140
|
getDataDir: () => dataDirOf(cfgMod),
|
|
141
|
+
getActiveTurnCount: () => rt.activeTurnCount || 0,
|
|
141
142
|
modelStandaloneTools: boot.modelStandaloneTools,
|
|
142
143
|
featureDisallowedTools: boot.featureDisallowedTools,
|
|
143
144
|
loadCoreMemoryContext: boot.loadCoreMemoryContext,
|
|
@@ -231,7 +232,11 @@ function developerAdapters(boot) {
|
|
|
231
232
|
reg.disableProvider?.(provider);
|
|
232
233
|
return;
|
|
233
234
|
}
|
|
234
|
-
|
|
235
|
+
// Provider init can take long (OAuth/network); the option is already saved
|
|
236
|
+
// and adopted, so the toggle must not wait on it.
|
|
237
|
+
void ensureProvidersReady(config?.providers || {}).catch((error) => {
|
|
238
|
+
console.warn(`[providers] ${provider} init after enabling failed: ${error?.message || error}`);
|
|
239
|
+
});
|
|
235
240
|
},
|
|
236
241
|
};
|
|
237
242
|
}
|
|
@@ -488,6 +493,7 @@ function modelRouteApiFor(boot) {
|
|
|
488
493
|
rt.route = v;
|
|
489
494
|
},
|
|
490
495
|
getSession: () => rt.session,
|
|
496
|
+
getSessionGeneration: () => rt.sessionGeneration,
|
|
491
497
|
setSession: boot.adoptSession,
|
|
492
498
|
getAddressedSessionId: () => rt.addressedSessionId,
|
|
493
499
|
getConfigHasSecrets: () => rt.configHasSecrets,
|
|
@@ -562,12 +568,18 @@ function workspaceApiFor(boot) {
|
|
|
562
568
|
getReservedSessionId: () => rt.reservedSessionId,
|
|
563
569
|
getCurrentCwd: () => rt.currentCwd,
|
|
564
570
|
getDesktopSession: () => rt.desktopSession,
|
|
571
|
+
setDesktopSession: (next) => {
|
|
572
|
+
rt.desktopSession = next;
|
|
573
|
+
},
|
|
565
574
|
getConfig: () => rt.config,
|
|
566
575
|
createCurrentSession: (reason) => boot.createCurrentSession(reason),
|
|
567
|
-
applyResolvedCwd: (cwd) => boot.applyResolvedCwd(cwd),
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
576
|
+
applyResolvedCwd: (cwd, options) => boot.applyResolvedCwd(cwd, options),
|
|
577
|
+
// Durable save: on disk when it returns, throws when the write fails
|
|
578
|
+
// (immediate mode only queues it). Synchronous, so a transition never
|
|
579
|
+
// waits on the save worker, which may never come up.
|
|
580
|
+
persistSession: (session) => saveSession(session, { sync: true }),
|
|
581
|
+
refreshWorkspaceContext: (session, cwd, move) =>
|
|
582
|
+
refreshWorkspacePrompt(session, cwd, { loadCoreMemoryContext: boot.loadCoreMemoryContext, move }),
|
|
571
583
|
invalidateCaches: () => {
|
|
572
584
|
boot.invalidateContextStatusCache();
|
|
573
585
|
boot.invalidatePreSessionToolSurface();
|
|
@@ -583,6 +595,7 @@ function workspaceApiFor(boot) {
|
|
|
583
595
|
function sessionTurnApiFor(boot) {
|
|
584
596
|
const { rt, tunables, remoteTranscript, routePreparation } = boot;
|
|
585
597
|
return createSessionTurnApi({
|
|
598
|
+
applyPendingRoute: () => boot.modelRouteApi.applyPendingRoute(),
|
|
586
599
|
prepareTurnWorkspace: boot.workspaceApi.prepareTurnWorkspace,
|
|
587
600
|
admitTurnWorkspace: boot.workspaceApi.admitTurnWorkspace,
|
|
588
601
|
getSession: () => rt.session,
|
|
@@ -594,6 +607,7 @@ function sessionTurnApiFor(boot) {
|
|
|
594
607
|
rt.mode = v;
|
|
595
608
|
},
|
|
596
609
|
getActiveTurnCount: () => rt.activeTurnCount,
|
|
610
|
+
takePendingCompact: (sessionId) => rt.pendingCompactSessionIds?.delete(sessionId) === true,
|
|
597
611
|
setActiveTurnCount: (v) => {
|
|
598
612
|
rt.activeTurnCount = v;
|
|
599
613
|
},
|
|
@@ -631,7 +645,7 @@ function sessionTurnApiFor(boot) {
|
|
|
631
645
|
invalidatePreSessionToolSurface: boot.invalidatePreSessionToolSurface,
|
|
632
646
|
refreshEmptySessionToolPolicy: boot.refreshEmptySessionToolPolicy,
|
|
633
647
|
activeToolSurface: boot.activeToolSurface,
|
|
634
|
-
|
|
648
|
+
switchProject: boot.workspaceApi.switchProject,
|
|
635
649
|
resolveCwdPath: boot.resolveCwdPath,
|
|
636
650
|
agentStatusState: boot.agentStatusState,
|
|
637
651
|
notificationListeners: boot.notificationListeners,
|
|
@@ -10,6 +10,7 @@ import { bootProfile } from '../boot-profile.mjs';
|
|
|
10
10
|
import { createHookPayload } from '../hook-payload.mjs';
|
|
11
11
|
import { readRuntimeTunables } from '../runtime-tunables.mjs';
|
|
12
12
|
import { initSessionAddress } from '../session-address.mjs';
|
|
13
|
+
import { trackSessionGeneration } from '../model-route/route-ownership.mjs';
|
|
13
14
|
import { resolveRoute } from './shared.mjs';
|
|
14
15
|
|
|
15
16
|
export async function resolveConfig(boot) {
|
|
@@ -74,6 +75,7 @@ export async function resolveConfig(boot) {
|
|
|
74
75
|
|
|
75
76
|
function initRuntimeState(rt, params) {
|
|
76
77
|
rt.mode = normalizeToolMode(params.toolMode);
|
|
78
|
+
trackSessionGeneration(rt);
|
|
77
79
|
rt.session = null;
|
|
78
80
|
// A daemon-issued address may exist before provider setup. It is consumed by
|
|
79
81
|
// createCurrentSession on the first actual turn, avoiding eager auth/model
|
|
@@ -38,16 +38,20 @@ export function buildFacade(boot) {
|
|
|
38
38
|
},
|
|
39
39
|
applyWorkspaceTransition: boot.workspaceApi.applyWorkspaceTransition,
|
|
40
40
|
getWorkspace: boot.workspaceApi.getWorkspace,
|
|
41
|
+
getLiveWorkspace: boot.workspaceApi.getLiveWorkspace,
|
|
41
42
|
getBranchMenu: boot.workspaceApi.getBranchMenu,
|
|
42
43
|
getProjectBranchMenu: boot.workspaceApi.getProjectBranchMenu,
|
|
43
44
|
selectBranch: boot.workspaceApi.selectBranch,
|
|
44
45
|
selectProjectBranch: boot.workspaceApi.selectProjectBranch,
|
|
45
46
|
mergeProjectBranch: boot.workspaceApi.mergeProjectBranch,
|
|
47
|
+
inspectProjectBranch: boot.workspaceApi.inspectProjectBranch,
|
|
48
|
+
manageProjectBranch: boot.workspaceApi.manageProjectBranch,
|
|
46
49
|
requestWorktree: boot.workspaceApi.requestWorktree,
|
|
47
50
|
mergeWorkspace: boot.workspaceApi.mergeWorkspace,
|
|
48
51
|
removeWorktree: boot.workspaceApi.removeWorktree,
|
|
49
52
|
listWorktrees: boot.workspaceApi.listWorktrees,
|
|
50
53
|
pruneWorktrees: boot.workspaceApi.pruneWorktrees,
|
|
54
|
+
onWorktreeSetup: boot.workspaceApi.onWorktreeSetup,
|
|
51
55
|
claimSetupRequest: setupTool.claimSetupRequest,
|
|
52
56
|
isSetupRequestActive: setupTool.isSetupRequestActive,
|
|
53
57
|
completeSetupRequest: setupTool.completeSetupRequest,
|
|
@@ -14,6 +14,8 @@ import { createSelfUpdateController } from '../self-update.mjs';
|
|
|
14
14
|
import { createCompletionWakeScheduler, createNotificationBus } from '../notification-bus.mjs';
|
|
15
15
|
import { createSkillsApi } from '../skills-api.mjs';
|
|
16
16
|
import { createCwdPlugins } from '../cwd-plugins.mjs';
|
|
17
|
+
import { listProjectsStrict } from '../../runtime/shared/projects.mjs';
|
|
18
|
+
import { isWithin } from '../../runtime/shared/worktrees/paths.mjs';
|
|
17
19
|
import { STANDALONE_DATA_DIR } from '../runtime-paths.mjs';
|
|
18
20
|
import { SessionAddressError, isAdmissionOpen, ownerLifecycle } from '../session-address.mjs';
|
|
19
21
|
import { dataDirOf } from './shared.mjs';
|
|
@@ -188,10 +190,12 @@ export function sessionAdopter(boot) {
|
|
|
188
190
|
// Bind every adopted session, including a cold resume and a session
|
|
189
191
|
// materialized before ask(). The shared tool executor must never fall
|
|
190
192
|
// back to changing only a detached session object's cwd.
|
|
193
|
+
// The Lead's own `session set-project` call: the Project switch
|
|
194
|
+
// authority, tolerating the calling turn.
|
|
191
195
|
Object.defineProperty(v, '_applyResolvedCwdForCaller', {
|
|
192
196
|
value: (nextCwd) => {
|
|
193
197
|
if (rt.session?.id !== v.id) throw new Error('cwd: the calling session is no longer active');
|
|
194
|
-
return boot.
|
|
198
|
+
return boot.workspaceApi.switchProject(nextCwd, { ownTurn: true });
|
|
195
199
|
},
|
|
196
200
|
enumerable: false,
|
|
197
201
|
configurable: true,
|
|
@@ -268,6 +272,7 @@ function wireCwdPlugins(boot) {
|
|
|
268
272
|
onCwdChanged: () => {
|
|
269
273
|
void boot.connectConfiguredMcp({ reconcile: true }).catch(() => {});
|
|
270
274
|
},
|
|
275
|
+
isProjectFolder: (cwd) => listProjectsStrict().some((project) => isWithin(project.path, cwd)),
|
|
271
276
|
countSkillFiles,
|
|
272
277
|
writeLastSessionCwd,
|
|
273
278
|
updateCurrentCwdOverride,
|
|
@@ -24,7 +24,6 @@ export function wireSessionLifecycle(boot) {
|
|
|
24
24
|
params.modelParameters !== undefined,
|
|
25
25
|
invalidatePreSessionToolSurface: boot.invalidatePreSessionToolSurface,
|
|
26
26
|
invalidateOutputStyleStatusCache: boot.invalidateOutputStyleStatusCache,
|
|
27
|
-
invalidateSkills: boot.invalidateSkills,
|
|
28
27
|
connectConfiguredMcp: boot.connectConfiguredMcp,
|
|
29
28
|
configureEmbedding,
|
|
30
29
|
});
|
|
@@ -125,6 +124,7 @@ export function wireSessionLifecycle(boot) {
|
|
|
125
124
|
scheduleModelCatalogWarmup();
|
|
126
125
|
scheduleStatuslineUsageWarmup();
|
|
127
126
|
scheduleAutomationAutostart(tunables.remoteAutoStartDelayMs);
|
|
128
|
-
// Auto effort touches neither network nor memory at boot:
|
|
129
|
-
//
|
|
127
|
+
// Auto effort touches neither network nor memory at boot: creating or
|
|
128
|
+
// opening a session loads the judge, and the first judged turn
|
|
129
|
+
// fetches/updates the model (judge-client.mjs).
|
|
130
130
|
}
|
|
@@ -21,6 +21,7 @@ import { TOOL_DEFS as OFFICE_TOOL_DEFS } from '../../runtime/office/tool-defs.mj
|
|
|
21
21
|
import { TOOL_DEFS as MEDIA_TOOL_DEFS } from '../../runtime/media/tool-defs.mjs';
|
|
22
22
|
import { TOOL_DEFS as TIDY_TOOL_DEFS } from '../../runtime/tidy/tool-defs.mjs';
|
|
23
23
|
import { TOOL_DEFS as VISUALIZE_BRIDGE_TOOL_DEFS } from '../../runtime/visualize-bridge/tool-defs.mjs';
|
|
24
|
+
import { ASK_USER_TOOL_DEFS } from '../../runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs';
|
|
24
25
|
import { SETUP_TOOL_DEFS } from '../setup-tool/tool-defs.mjs';
|
|
25
26
|
import { createSetupToolExecutor } from '../setup-tool/executor.mjs';
|
|
26
27
|
import { bootProfile } from '../boot-profile.mjs';
|
|
@@ -70,6 +71,8 @@ function wireAgent(boot) {
|
|
|
70
71
|
mcpScopeId: rt.mcpScopeId,
|
|
71
72
|
awaitKeychainPrewarm,
|
|
72
73
|
isKeychainPrewarmReady: () => rt.keychainPrewarmWaitDone,
|
|
74
|
+
// Lazy: wireProviders runs after wireTools and defines the catalog.
|
|
75
|
+
listProviderModels: (options) => boot.collectProviderModels(options),
|
|
73
76
|
notifySessionCompletion,
|
|
74
77
|
// SubagentStart/SubagentStop: bridge internal worker spawn/finish to the
|
|
75
78
|
// standard hook bus. agent_type is passed top-level via hookCommonPayload.
|
|
@@ -159,6 +162,7 @@ function wireToolSurface(boot) {
|
|
|
159
162
|
tidyToolDefs: TIDY_TOOL_DEFS,
|
|
160
163
|
visualizeToolDefs: VISUALIZE_BRIDGE_TOOL_DEFS,
|
|
161
164
|
setupToolDefs: SETUP_TOOL_DEFS,
|
|
165
|
+
askUserToolDefs: ASK_USER_TOOL_DEFS,
|
|
162
166
|
goalTools: goalRuntime.tools,
|
|
163
167
|
agentTools: agentTool.tools,
|
|
164
168
|
skillToolEnabled: !envFlag('MIXDOG_DISABLE_SKILLS'),
|
|
@@ -246,10 +250,12 @@ function wireInternalTools(boot) {
|
|
|
246
250
|
runNativeWebSearch: (...a) => boot.runNativeWebSearch(...a),
|
|
247
251
|
activeToolSurface: boot.activeToolSurface,
|
|
248
252
|
mcpStatus: boot.mcpStatus,
|
|
249
|
-
applyResolvedCwd: boot.applyResolvedCwd,
|
|
250
253
|
skillToolContent: boot.skillToolContent,
|
|
251
254
|
// Late-bound: the workspace authority is built with the API slices.
|
|
252
255
|
getWorkspaceApi: () => boot.workspaceApi || null,
|
|
256
|
+
getSessionManager: () => boot.mgr || null,
|
|
257
|
+
getLifecycleApi: () => boot.lifecycleApi || null,
|
|
258
|
+
executeSessionControl: boot.params.executeSessionControl,
|
|
253
259
|
}),
|
|
254
260
|
});
|
|
255
261
|
Object.assign(boot, { setupTool, disposeInternalTools });
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
importOriginKey,
|
|
21
21
|
} from '../../runtime/agent/orchestrator/session/conversation-import/imported-session.mjs';
|
|
22
22
|
import { IMPORT_WARNING_CWD_MISSING } from '../../runtime/agent/orchestrator/session/conversation-import/turns.mjs';
|
|
23
|
-
import { sessionPath } from '../../runtime/agent/orchestrator/session/store/paths
|
|
23
|
+
import { sessionPath } from '../../runtime/agent/orchestrator/session/store/session-paths.mjs';
|
|
24
24
|
import {
|
|
25
25
|
cachedMeta,
|
|
26
26
|
convertCandidateFile,
|
|
@@ -21,20 +21,21 @@ export function createCwdApply({
|
|
|
21
21
|
updateCurrentCwdOverride,
|
|
22
22
|
persistSession,
|
|
23
23
|
onCwdChanged,
|
|
24
|
+
isProjectFolder,
|
|
24
25
|
clean,
|
|
25
26
|
resolve,
|
|
26
27
|
statSync,
|
|
27
28
|
}) {
|
|
28
29
|
function resolveCwdPath(value) {
|
|
29
30
|
const raw = clean(value);
|
|
30
|
-
if (!raw) throw new Error('
|
|
31
|
+
if (!raw) throw new Error('session: path is required for action=set-project');
|
|
31
32
|
const next = resolve(getCurrentCwd() || process.cwd(), raw);
|
|
32
33
|
const stat = statSync(next);
|
|
33
34
|
if (!stat.isDirectory()) throw new Error(`cwd: not a directory: ${next}`);
|
|
34
35
|
return next;
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
function persistProjectSelection(session, currentCwd) {
|
|
38
|
+
function persistProjectSelection(session, currentCwd, classifyByMembership) {
|
|
38
39
|
// A Lead in its worktree keeps the registered Project as projectPath; a
|
|
39
40
|
// switch elsewhere leaves the worktree at a new workspace revision.
|
|
40
41
|
const { workspace, projectPath } = workspaceForProjectSelection(session, currentCwd);
|
|
@@ -44,7 +45,13 @@ export function createCwdApply({
|
|
|
44
45
|
}
|
|
45
46
|
const desktop = getDesktopSession?.() || session?.desktopSession;
|
|
46
47
|
if (desktop && typeof desktop === 'object') {
|
|
47
|
-
|
|
48
|
+
// A desktop/remote move (classifyByMembership) names a registered
|
|
49
|
+
// Project or the task workspace: outside every registered Project it is
|
|
50
|
+
// a task again. The model's own set-project keeps any folder it picked.
|
|
51
|
+
const nextDesktop =
|
|
52
|
+
classifyByMembership && !isProjectFolder(projectPath)
|
|
53
|
+
? { classification: 'task', projectPath: null }
|
|
54
|
+
: { classification: 'project', projectPath };
|
|
48
55
|
setDesktopSession?.(nextDesktop);
|
|
49
56
|
if (session) session.desktopSession = nextDesktop;
|
|
50
57
|
}
|
|
@@ -59,7 +66,7 @@ export function createCwdApply({
|
|
|
59
66
|
// message history. The live execution cwd is retargeted in place; the BP3
|
|
60
67
|
// session snapshot remains the session-start environment. `onCwdChanged`
|
|
61
68
|
// lets MCP reconnect only the plugin servers that run in the session cwd.
|
|
62
|
-
function applyResolvedCwd(nextCwd, { persistProjectSelection: persist = false } = {}) {
|
|
69
|
+
function applyResolvedCwd(nextCwd, { persistProjectSelection: persist = false, classifyByMembership = false } = {}) {
|
|
63
70
|
const resolved = resolve(nextCwd);
|
|
64
71
|
const stat = statSync(resolved);
|
|
65
72
|
if (!stat.isDirectory()) throw new Error(`cwd: not a directory: ${resolved}`);
|
|
@@ -70,7 +77,7 @@ export function createCwdApply({
|
|
|
70
77
|
if (session) session.cwd = currentCwd;
|
|
71
78
|
updateCurrentCwdOverride?.(currentCwd);
|
|
72
79
|
writeLastSessionCwd(currentCwd, session?.clientHostPid);
|
|
73
|
-
if (persist) persistProjectSelection(session, currentCwd);
|
|
80
|
+
if (persist) persistProjectSelection(session, currentCwd, classifyByMembership);
|
|
74
81
|
// Lazy mode: before the first turn (e.g. the initial project-selection
|
|
75
82
|
// cwd set), do NOT prewarm — that is exactly the post-first-frame freeze
|
|
76
83
|
// we are avoiding. Once a turn has run, an in-session cwd switch DOES
|
|
@@ -44,9 +44,9 @@ export function createGoalFacadeApi({ agentStatusState, createCurrentSession, ge
|
|
|
44
44
|
const sessionId = getSessionId();
|
|
45
45
|
return sessionId ? goalRuntime.settleTurn(sessionId, detail) : null;
|
|
46
46
|
},
|
|
47
|
-
reactivateUsageLimitedGoal(goalId) {
|
|
47
|
+
reactivateUsageLimitedGoal(goalId, options) {
|
|
48
48
|
const sessionId = getSessionId();
|
|
49
|
-
return sessionId ? goalRuntime.reactivateUsageLimited(sessionId, goalId) : null;
|
|
49
|
+
return sessionId ? goalRuntime.reactivateUsageLimited(sessionId, goalId, options) : null;
|
|
50
50
|
},
|
|
51
51
|
archiveCompletedGoalOnUserInput() {
|
|
52
52
|
const sessionId = getSessionId();
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// ask_user: put 1-4 multiple-choice questions to the user through the session's
|
|
2
|
+
// tool-approval hook (kind: 'question') and report the answers to the model.
|
|
3
|
+
import {
|
|
4
|
+
validateAskUserQuestions,
|
|
5
|
+
ASK_USER_MAX_TEXT,
|
|
6
|
+
} from '../../runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs';
|
|
7
|
+
import { createCallerContextResolvers } from './caller-context.mjs';
|
|
8
|
+
import { runAbortable } from '../../runtime/shared/abort-race.mjs';
|
|
9
|
+
|
|
10
|
+
const NO_USER =
|
|
11
|
+
'No user is available to answer in this session. Proceed with your best judgment and state the choices you made.';
|
|
12
|
+
const DISMISSED =
|
|
13
|
+
'User closed the questions without answering. Proceed with your best judgment; ask again only if something new depends on it.';
|
|
14
|
+
|
|
15
|
+
/** Wire answers -> array aligned with questions; invalid entries become null. */
|
|
16
|
+
export function normalizeAskUserAnswers(answers, questions) {
|
|
17
|
+
const list = Array.isArray(answers) ? answers.slice(0, 4) : [];
|
|
18
|
+
return questions.map((q, i) => {
|
|
19
|
+
const entry = list[i];
|
|
20
|
+
if (!entry || typeof entry !== 'object') return null;
|
|
21
|
+
const labels = new Set(q.options.map((o) => o.label));
|
|
22
|
+
const rawSelected = entry.selected == null ? [] : entry.selected;
|
|
23
|
+
if (!Array.isArray(rawSelected) || !rawSelected.every((l) => typeof l === 'string' && labels.has(l))) return null;
|
|
24
|
+
if (entry.text != null && (typeof entry.text !== 'string' || entry.text.length > ASK_USER_MAX_TEXT)) return null;
|
|
25
|
+
const selected = q.multi_select === true ? [...new Set(rawSelected)] : rawSelected.slice(0, 1);
|
|
26
|
+
const text = typeof entry.text === 'string' ? entry.text.trim() : '';
|
|
27
|
+
if (!selected.length && !text) return null;
|
|
28
|
+
return text ? { selected, text } : { selected };
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Strings are JSON-quoted so a quote inside one cannot end it early; typed
|
|
33
|
+
// text stays apart from the picked labels (`"picked" + "typed" (typed)`).
|
|
34
|
+
export function formatAskUserAnswers(questions, answers) {
|
|
35
|
+
const quote = (text) => JSON.stringify(text);
|
|
36
|
+
const parts = questions.map((q, i) => {
|
|
37
|
+
const a = answers[i];
|
|
38
|
+
if (!a) return `${quote(q.question)}=(no answer)`;
|
|
39
|
+
const picked = a.selected.length ? quote(a.selected.join(', ')) : '';
|
|
40
|
+
const typed = a.text ? `${quote(a.text)} (typed)` : '';
|
|
41
|
+
return `${quote(q.question)}=${[picked, typed].filter(Boolean).join(' + ')}`;
|
|
42
|
+
});
|
|
43
|
+
return `User has answered your questions: ${parts.join('; ')}. You can now continue with these answers in mind.`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** A composer message sent instead of (or with) picking: kept when it is a
|
|
47
|
+
* non-empty string within the typed-answer limit, else dropped. */
|
|
48
|
+
export function normalizeAskUserReply(reply) {
|
|
49
|
+
if (typeof reply !== 'string' || reply.length > ASK_USER_MAX_TEXT) return '';
|
|
50
|
+
return reply.trim();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// `User replied in chat: "<reply>". ` leads, then the usual picks sentence
|
|
54
|
+
// when any question was answered, else just the closing sentence.
|
|
55
|
+
export function formatAskUserResult(questions, answers, reply) {
|
|
56
|
+
if (!reply) return formatAskUserAnswers(questions, answers);
|
|
57
|
+
const lead = `User replied in chat: ${JSON.stringify(reply)}. `;
|
|
58
|
+
if (answers.some(Boolean)) return `${lead}${formatAskUserAnswers(questions, answers)}`;
|
|
59
|
+
return `${lead}You can now continue with these answers in mind.`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function createAskUserToolHandlers({ rt }) {
|
|
63
|
+
const { sessionIdFor, signalFor } = createCallerContextResolvers(rt);
|
|
64
|
+
return {
|
|
65
|
+
ask_user: async (args, { callerCtx }) => {
|
|
66
|
+
const questions = validateAskUserQuestions(args);
|
|
67
|
+
const hook = callerCtx?.toolApprovalHook;
|
|
68
|
+
if (typeof hook !== 'function') return NO_USER;
|
|
69
|
+
// No wait limit (timeoutMs: null): the question settles when the user
|
|
70
|
+
// answers or dismisses it, or the turn is aborted.
|
|
71
|
+
const result = await runAbortable(signalFor(callerCtx), () =>
|
|
72
|
+
hook({
|
|
73
|
+
name: 'ask_user',
|
|
74
|
+
kind: 'question',
|
|
75
|
+
args: { questions },
|
|
76
|
+
reason: '',
|
|
77
|
+
timeoutMs: null,
|
|
78
|
+
sessionId: sessionIdFor(callerCtx),
|
|
79
|
+
toolCallId: callerCtx?.toolCallId || null,
|
|
80
|
+
})
|
|
81
|
+
);
|
|
82
|
+
if (result?.approved === true)
|
|
83
|
+
return formatAskUserResult(
|
|
84
|
+
questions,
|
|
85
|
+
normalizeAskUserAnswers(result.answers, questions),
|
|
86
|
+
normalizeAskUserReply(result.reply)
|
|
87
|
+
);
|
|
88
|
+
return DISMISSED;
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
@@ -40,13 +40,15 @@ export function createBridgeToolHandlers({ rt }) {
|
|
|
40
40
|
});
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
-
//
|
|
43
|
+
// `run` is gated by the exec policy; the elevation approval comes from the
|
|
44
|
+
// runtime's gate (callerCtx), never from the model's args.
|
|
44
45
|
const terminal = async (args, { callerCtx }) => {
|
|
45
46
|
if (environmentDisabled(callerCtx, 'MIXDOG_FEATURE_TERMINAL')) {
|
|
46
47
|
throw new Error('the terminal tool is disabled in this environment');
|
|
47
48
|
}
|
|
48
49
|
return await executeTerminalTool(args, {
|
|
49
50
|
sessionId: sessionIdFor(callerCtx),
|
|
51
|
+
elevationApproved: callerCtx?.elevationApproved === true,
|
|
50
52
|
signal: signalFor(callerCtx),
|
|
51
53
|
});
|
|
52
54
|
};
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
// Tools that read rather than act: web search/fetch, memory, the code graph,
|
|
2
2
|
// the deferred tool catalog, and skill bodies.
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
refreshDeferredMcpToolCatalog,
|
|
5
|
+
renderToolSearch,
|
|
6
|
+
} from '../../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
|
|
7
|
+
import { resolveDeferredSelectMode } from '../../runtime/agent/orchestrator/session/loop/deferred-call-through.mjs';
|
|
4
8
|
import { dispatchWebSearchRuntimeTool, memoryToolArgsForCaller } from '../runtime-tool-routing.mjs';
|
|
5
9
|
import { createCallerContextResolvers } from './caller-context.mjs';
|
|
6
10
|
|
|
@@ -31,10 +35,16 @@ export function createKnowledgeToolHandlers({
|
|
|
31
35
|
return await memoryMod.handleToolCall(name, memoryToolArgsForCaller(args, callerCwd), signalFor(callerCtx));
|
|
32
36
|
};
|
|
33
37
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
// Catalog tools answer for the calling session's own scope, bridge or
|
|
39
|
+
// native: a worker sees its own catalog (its own allow/deny), never the
|
|
40
|
+
// lead's. Only a call that names no session uses the active surface.
|
|
41
|
+
const scopeSession = (callerCtx) => callerCtx?.callerSession || activeToolSurface();
|
|
42
|
+
const scopeMode = (session) => session?.deferredSurfaceMode || resolveDeferredSelectMode(session) || rt.mode;
|
|
43
|
+
|
|
44
|
+
const toolSearch = (args, { callerCtx } = {}) => {
|
|
45
|
+
const session = scopeSession(callerCtx);
|
|
46
|
+
refreshDeferredMcpToolCatalog(session, rt.config);
|
|
47
|
+
return renderToolSearch(args, session, scopeMode(session), { mcpStatus });
|
|
38
48
|
};
|
|
39
49
|
|
|
40
50
|
return {
|