mixdog 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/package.json +2 -1
- package/scripts/gate-local.mjs +6 -4
- package/scripts/lib/gate-scheduler.mjs +29 -11
- package/scripts/probe-provider-catalog.mjs +31 -0
- package/scripts/provider-pingpong-live.mjs +599 -0
- package/scripts/session-sweep.mjs +5 -25
- package/src/agents/advisor/AGENT.md +1 -1
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/maintainer/AGENT.md +1 -1
- package/src/agents/maintainer/agent.json +1 -1
- package/src/agents/reviewer/AGENT.md +2 -4
- package/src/agents/security/AGENT.md +1 -2
- package/src/agents/writer/AGENT.md +2 -3
- package/src/defaults/shipped-history.json +11 -1
- package/src/defaults/skills/image/SKILL.md +21 -23
- package/src/defaults/skills/setup/SKILL.md +6 -1
- package/src/defaults/skills/setup/references/actions.md +44 -22
- package/src/defaults/skills/setup/references/surfaces.md +10 -8
- package/src/headless-exec.mjs +15 -8
- package/src/lib/keychain-cjs.cjs +20 -15
- package/src/output-styles/common.md +11 -10
- package/src/rules/agent/AGENT.md +6 -4
- package/src/rules/lead/LEAD.md +7 -9
- package/src/rules/shared/45-destructive.md +4 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
- package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
- package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
- package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
- package/src/runtime/agent/orchestrator/config.mjs +5 -0
- package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +9 -9
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +31 -15
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +10 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +131 -9
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +125 -8
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +12 -62
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +117 -41
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
- package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +39 -5
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
- package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +42 -11
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +109 -6
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +17 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -2
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +73 -7
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +75 -6
- package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
- package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
- package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +29 -5
- package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +36 -13
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +101 -11
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +19 -14
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +371 -41
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +97 -49
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +81 -10
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +35 -8
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +253 -42
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
- package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +392 -0
- package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
- package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
- package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
- package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +50 -22
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +133 -21
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +92 -16
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -13
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +133 -62
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +39 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +84 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
- package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +155 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +40 -24
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +63 -25
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +183 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +87 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +103 -26
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +23 -4
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +11 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +17 -2
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +28 -5
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +72 -24
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +50 -16
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -19
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -36
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +18 -9
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +181 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +78 -70
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +74 -0
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +150 -10
- package/src/runtime/agent/orchestrator/providers/registry.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
- package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
- package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +164 -0
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +522 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +195 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +104 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +24 -0
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
- package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
- package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +16 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +178 -71
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +102 -12
- package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
- package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +5 -11
- package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
- package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +16 -93
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +148 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +89 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
- package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -27
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +24 -10
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +135 -0
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +31 -4
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +10 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +29 -5
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +147 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -5
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +23 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +54 -13
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +11 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +22 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
- package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +231 -16
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
- package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +47 -17
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +26 -4
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +36 -35
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +4 -10
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +17 -1
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/side-question.mjs +197 -0
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +22 -15
- package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
- package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +44 -37
- package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -21
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +136 -196
- package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +53 -115
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +10 -1
- package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
- package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +17 -10
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
- package/src/runtime/agent/orchestrator/session/store.mjs +22 -19
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +12 -12
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +38 -14
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
- package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +79 -0
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
- package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +218 -20
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
- package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
- package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +247 -49
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
- package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
- package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
- package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
- package/src/runtime/attachments/store.d.mts +9 -0
- package/src/runtime/attachments/store.mjs +80 -9
- package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
- package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
- package/src/runtime/computer-bridge/action-schema.mjs +219 -196
- package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
- package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
- package/src/runtime/effort-judge/judge-client.mjs +21 -4
- package/src/runtime/effort-judge/judge-worker.mjs +4 -1
- package/src/runtime/github/tool.mjs +208 -17
- package/src/runtime/media/adapters/codex-image.mjs +140 -21
- package/src/runtime/media/catalog.mjs +4 -4
- package/src/runtime/media/chatgpt-usage.mjs +55 -0
- package/src/runtime/media/defaults.mjs +37 -0
- package/src/runtime/media/jobs.mjs +12 -2
- package/src/runtime/media/lanes.mjs +12 -0
- package/src/runtime/media/tool-defs.mjs +15 -4
- package/src/runtime/media/tool.mjs +41 -12
- package/src/runtime/media/upstream-error.mjs +72 -6
- package/src/runtime/memory/index.mjs +1 -0
- package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
- package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
- package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
- package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
- package/src/runtime/memory/lib/pg/process.mjs +36 -33
- package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +112 -4
- package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
- package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
- package/src/runtime/office/README.md +1 -1
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/html-browser.mjs +18 -8
- package/src/runtime/office/authoring/html-document-author.mjs +2 -0
- package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-measure.mjs +3 -1
- package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +3 -1
- package/src/runtime/office/core/office-actions-read.mjs +3 -0
- package/src/runtime/office/core/office-render-preview.mjs +2 -0
- package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
- package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
- package/src/runtime/office/core/office-sessions.mjs +5 -0
- package/src/runtime/office/core/office-transactions.mjs +3 -0
- package/src/runtime/office/core/office-write-ledger.mjs +94 -0
- package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
- package/src/runtime/office/index.mjs +29 -0
- package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
- package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
- package/src/runtime/office/pdf/pdf-render.mjs +23 -7
- package/src/runtime/office/pdf/pdf-security.mjs +2 -0
- package/src/runtime/office/portable/portable-opc.mjs +4 -1
- package/src/runtime/office/quality/visual-diff.mjs +2 -0
- package/src/runtime/session-search/session-search-ingest.mjs +1 -1
- package/src/runtime/shared/agent-reap-state.mjs +13 -0
- package/src/runtime/shared/atomic-file.d.mts +1 -1
- package/src/runtime/shared/background-tasks.mjs +6 -1
- package/src/runtime/shared/bounded-file-read.mjs +13 -0
- package/src/runtime/shared/bounded-line-diff.mjs +191 -0
- package/src/runtime/shared/browser-launch.mjs +15 -0
- package/src/runtime/shared/buffered-appender.mjs +18 -0
- package/src/runtime/shared/config.mjs +78 -18
- package/src/runtime/shared/err-text.mjs +48 -4
- package/src/runtime/shared/file-lock.mjs +6 -5
- package/src/runtime/shared/file-permissions.d.mts +6 -1
- package/src/runtime/shared/file-permissions.mjs +54 -6
- package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
- package/src/runtime/shared/llm/anthropic-effort.mjs +6 -0
- package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
- package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
- package/src/runtime/shared/loopback-listener.mjs +9 -0
- package/src/runtime/shared/model-route-chain.d.mts +8 -0
- package/src/runtime/shared/model-route-chain.mjs +48 -0
- package/src/runtime/shared/model-route-fallback.mjs +22 -0
- package/src/runtime/shared/pid-liveness.mjs +12 -0
- package/src/runtime/shared/provider-api-key.mjs +8 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
- package/src/runtime/shared/quiet-progress.d.mts +35 -0
- package/src/runtime/shared/quiet-progress.mjs +101 -0
- package/src/runtime/shared/quota-resume-store.mjs +32 -1
- package/src/runtime/shared/read-row-numbers.mjs +44 -0
- package/src/runtime/shared/remote-intent.mjs +2 -42
- package/src/runtime/shared/review-diff.mjs +52 -0
- package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
- package/src/runtime/shared/session-sidebar-host.mjs +38 -0
- package/src/runtime/shared/slow-span.mjs +121 -0
- package/src/runtime/shared/statusline/statusline-segments.mjs +52 -6
- package/src/runtime/shared/tool-card-model/card-header.mjs +7 -1
- package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
- package/src/runtime/shared/tool-card-model.mjs +5 -2
- package/src/runtime/shared/tool-output-budget.mjs +2 -0
- package/src/runtime/shared/tool-output-limit.mjs +4 -0
- package/src/runtime/shared/tool-primitives.mjs +13 -0
- package/src/runtime/shared/tool-result-summary.mjs +22 -1
- package/src/runtime/shared/tool-status.mjs +3 -2
- package/src/runtime/shared/tool-surface.mjs +20 -6
- package/src/runtime/shared/tool-work-units.mjs +54 -11
- package/src/runtime/shared/transcript-metadata.mjs +49 -1
- package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
- package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
- package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
- package/src/runtime/shared/transcript-writer.mjs +24 -6
- package/src/runtime/shared/turn-changes.mjs +269 -100
- package/src/runtime/shared/turn-review-reply.mjs +8 -39
- package/src/runtime/shared/turn-snapshot-store.mjs +19 -108
- package/src/runtime/shared/turn-snapshot.mjs +865 -683
- package/src/runtime/shared/turn-worktree-snapshot.mjs +183 -255
- package/src/runtime/shared/user-data-guard.mjs +262 -49
- package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
- package/src/runtime/shared/worktrees/carry.mjs +533 -0
- package/src/runtime/shared/worktrees/contract.mjs +60 -0
- package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
- package/src/runtime/shared/worktrees/file-recovery.mjs +84 -0
- package/src/runtime/shared/worktrees/git-head.mjs +214 -0
- package/src/runtime/shared/worktrees/git.mjs +8 -3
- package/src/runtime/shared/worktrees/include.mjs +125 -7
- package/src/runtime/shared/worktrees/lock.mjs +1 -1
- package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
- package/src/runtime/shared/worktrees/manager.mjs +525 -31
- package/src/runtime/shared/worktrees/merge.mjs +31 -21
- package/src/runtime/shared/worktrees/owner.mjs +2 -1
- package/src/runtime/shared/worktrees/paths.d.mts +6 -0
- package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
- package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
- package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
- package/src/runtime/terminal-bridge/client.mjs +57 -20
- package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
- package/src/runtime/tidy/apply.mjs +47 -2
- package/src/runtime/tidy/run-engines.mjs +11 -5
- package/src/session-runtime/agent-tool-routing.mjs +19 -13
- package/src/session-runtime/boot/apis.mjs +20 -6
- package/src/session-runtime/boot/config.mjs +2 -0
- package/src/session-runtime/boot/facade.mjs +4 -0
- package/src/session-runtime/boot/infrastructure.mjs +6 -1
- package/src/session-runtime/boot/session.mjs +3 -3
- package/src/session-runtime/boot/tools.mjs +7 -1
- package/src/session-runtime/conversation-import/service.mjs +1 -1
- package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
- package/src/session-runtime/goal-facade-api.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +91 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +15 -5
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +137 -26
- package/src/session-runtime/internal-tool-executor.mjs +8 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +187 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
- package/src/session-runtime/lifecycle/session-catalog.mjs +25 -18
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +36 -48
- package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
- package/src/session-runtime/lifecycle/shared.mjs +5 -6
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
- package/src/session-runtime/lifecycle/teardown.mjs +70 -14
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/connect.mjs +17 -5
- package/src/session-runtime/media-api.mjs +8 -0
- package/src/session-runtime/model-route/route-ownership.mjs +60 -0
- package/src/session-runtime/model-route/route-persist.mjs +3 -2
- package/src/session-runtime/model-route/set-route.mjs +116 -36
- package/src/session-runtime/model-route/web-search-route.mjs +7 -2
- package/src/session-runtime/model-route-api.mjs +4 -2
- package/src/session-runtime/native-web-search/routes.mjs +37 -24
- package/src/session-runtime/native-web-search-usage.mjs +51 -0
- package/src/session-runtime/native-web-search.mjs +19 -9
- package/src/session-runtime/new-session-config.mjs +4 -2
- package/src/session-runtime/provider-auth/login.mjs +4 -0
- package/src/session-runtime/provider-auth/setup.mjs +4 -0
- package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
- package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
- package/src/session-runtime/provider-models.mjs +1 -0
- package/src/session-runtime/provider-usage.mjs +4 -0
- package/src/session-runtime/resource-scope-decorate.mjs +10 -3
- package/src/session-runtime/route-resolution.mjs +3 -1
- package/src/session-runtime/runtime-core.mjs +4 -0
- package/src/session-runtime/runtime-facade.mjs +6 -0
- package/src/session-runtime/runtime-review-api.mjs +8 -2
- package/src/session-runtime/services/agent-task-status.mjs +2 -0
- package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
- package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
- package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
- package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
- package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
- package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
- package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
- package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
- package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
- package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
- package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +82 -13
- package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
- package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
- package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +18 -10
- package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
- package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
- package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
- package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
- package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
- package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
- package/src/session-runtime/services/agent-tool/worker-index.mjs +74 -15
- package/src/session-runtime/services/agent-tool.mjs +7 -0
- package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
- package/src/session-runtime/services/channel-admin.mjs +19 -3
- package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
- package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
- package/src/session-runtime/services/provider-admin.mjs +158 -15
- package/src/session-runtime/session-create/session-options.mjs +7 -5
- package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
- package/src/session-runtime/session-transcript-purge.mjs +32 -0
- package/src/session-runtime/session-transcript.mjs +4 -5
- package/src/session-runtime/session-turn-api.mjs +17 -14
- package/src/session-runtime/settings-builtin-tools-api.mjs +18 -6
- package/src/session-runtime/setup-tool/executor.mjs +57 -9
- package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +18 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +25 -4
- package/src/session-runtime/skills-api.mjs +3 -5
- package/src/session-runtime/tool-policy-refresh.mjs +83 -32
- package/src/session-runtime/tool-surface.mjs +5 -1
- package/src/session-runtime/turn/agent-ops.mjs +49 -2
- package/src/session-runtime/turn/compaction-gate.mjs +25 -0
- package/src/session-runtime/turn/session-ops.mjs +7 -5
- package/src/session-runtime/turn/side-question-ops.mjs +19 -0
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +7 -1
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +12 -3
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +18 -2
- package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
- package/src/session-runtime/turn/turn-run.mjs +26 -45
- package/src/session-runtime/usage-stats-api.mjs +46 -11
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
- package/src/session-runtime/workspace/admission-gate.mjs +44 -15
- package/src/session-runtime/workspace/project-branches.mjs +35 -41
- package/src/session-runtime/workspace/transition-steps.mjs +215 -116
- package/src/session-runtime/workspace/transitions.mjs +428 -73
- package/src/standalone/channel-transport.mjs +3 -4
- package/src/standalone/daemon-agent-control.mjs +9 -1
- package/src/standalone/daemon-desktop-runtime.mjs +32 -1
- package/src/standalone/daemon-local-session-bridge.mjs +14 -1
- package/src/standalone/daemon-owner.mjs +17 -4
- package/src/standalone/daemon-pg-stop.mjs +49 -0
- package/src/standalone/daemon-session-control.mjs +88 -0
- package/src/standalone/daemon-stop-budget.d.mts +2 -0
- package/src/standalone/daemon-stop-budget.mjs +18 -0
- package/src/standalone/daemon-stored-session-views.mjs +25 -3
- package/src/standalone/daemon-telemetry.mjs +19 -0
- package/src/standalone/daemon.mjs +63 -1
- package/src/standalone/desktop-service-registry.mjs +5 -0
- package/src/standalone/local-session-runtime.mjs +80 -30
- package/src/standalone/session-client.mjs +42 -0
- package/src/standalone/session-protocol.mjs +14 -0
- package/src/standalone/session-proxy/projection.mjs +41 -4
- package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
- package/src/standalone/session-runtime-inline-host.mjs +3 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
- package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
- package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
- package/src/standalone/session-service/agent-tree.mjs +28 -2
- package/src/standalone/session-service/entries/session-loads.mjs +16 -5
- package/src/standalone/session-service/entries.mjs +1 -0
- package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
- package/src/standalone/session-service/quota-resume.mjs +28 -13
- package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
- package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
- package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
- package/src/standalone/session-service-api.mjs +6 -1
- package/src/standalone/session-state-patch.d.mts +2 -1
- package/src/standalone/session-state-patch.mjs +41 -1
- package/src/standalone/session-tool-output.mjs +82 -0
- package/src/tui/App.jsx +25 -0
- package/src/tui/app/app-view/floating-panel.jsx +26 -1
- package/src/tui/app/app-view.jsx +2 -1
- package/src/tui/app/btw-controller.mjs +118 -0
- package/src/tui/app/create-app-pickers.mjs +2 -0
- package/src/tui/app/provider-setup/provider-items.mjs +8 -0
- package/src/tui/app/provider-setup-picker.mjs +15 -3
- package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
- package/src/tui/app/shell-layout/surfaces.mjs +3 -1
- package/src/tui/app/slash-commands.mjs +19 -3
- package/src/tui/app/slash-dispatch/session-commands.mjs +68 -6
- package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
- package/src/tui/app/use-global-key-input.mjs +5 -12
- package/src/tui/app/use-prompt-handlers.mjs +11 -0
- package/src/tui/components/BtwPanel.jsx +53 -0
- package/src/tui/components/QuestionPanel.jsx +275 -0
- package/src/tui/components/Spinner.jsx +4 -0
- package/src/tui/components/SpinnerByline.jsx +21 -2
- package/src/tui/components/question-panel-model.mjs +156 -0
- package/src/tui/components/status-line/local-line.mjs +10 -2
- package/src/tui/dist/index.mjs +2897 -1722
- package/src/tui/session/active-tool-summary.mjs +1 -1
- package/src/tui/session/context-state.mjs +4 -5
- package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
- package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
- package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
- package/src/tui/session/quota-resume.mjs +140 -61
- package/src/tui/session/session-api/commands.mjs +14 -10
- package/src/tui/session/session-api/controls.mjs +14 -2
- package/src/tui/session/session-api/integrations.mjs +9 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +3 -9
- package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
- package/src/tui/session/session-api/lifecycle.mjs +14 -11
- package/src/tui/session/session-api/media.mjs +2 -0
- package/src/tui/session/session-api/routes.mjs +81 -57
- package/src/tui/session/session-api/settings.mjs +9 -3
- package/src/tui/session/session-api/worktree.mjs +3 -2
- package/src/tui/session/session-api.mjs +1 -0
- package/src/tui/session/session-flow/auto-clear.mjs +1 -3
- package/src/tui/session/session-flow/drain.mjs +6 -4
- package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
- package/src/tui/session/session-flow/queue.mjs +1 -1
- package/src/tui/session/tool-approval.mjs +20 -8
- package/src/tui/session/transcript-spill.mjs +14 -7
- package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
- package/src/tui/session/tui-steering-persist.mjs +3 -5
- package/src/tui/session/turn-quiet.mjs +53 -0
- package/src/tui/session/turn-stream.mjs +179 -32
- package/src/tui/session/turn.mjs +50 -36
- package/src/tui/session/worktree-setup-notice.mjs +38 -0
- package/src/tui/spinner-meta.mjs +10 -0
- package/src/tui/spinner-verbs.mjs +3 -0
- package/src/ui/statusline.mjs +13 -3
- package/src/workflows/default/WORKFLOW.md +3 -1
- package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
- package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
- package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
- package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -246
- package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
- package/src/session-runtime/turn/share-ops.mjs +0 -77
- package/src/tui/session/cross-surface-share.mjs +0 -406
- package/src/tui/session/live-share/delta.mjs +0 -153
- package/src/tui/session/live-share/mirror.mjs +0 -106
- package/src/tui/session/live-share/owner.mjs +0 -254
- package/src/tui/session/live-share/retry.mjs +0 -54
- package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
- package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
- package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
- package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
- package/src/tui/session/live-share/viewer.mjs +0 -99
- package/src/tui/session/live-share/wire.mjs +0 -44
- package/src/tui/session/live-share.mjs +0 -154
- package/src/tui/session/shared-dir-watch.mjs +0 -69
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// Shared by xai-tool-search.test.mjs and the one-off generator that produced
|
|
2
|
+
// xai-tool-search-head-parity.json by running these same captures against the
|
|
3
|
+
// pre-change xAI send path. The WebSocket transport is driven through the real
|
|
4
|
+
// sendViaWebSocket with a scripted socket, so the real stream collector and
|
|
5
|
+
// delta framing run; only the connection is replaced.
|
|
6
|
+
import { mock } from 'node:test';
|
|
7
|
+
import { EventEmitter } from 'node:events';
|
|
8
|
+
import * as realWs from './openai-oauth-ws.mjs';
|
|
9
|
+
|
|
10
|
+
export const ws = { bodies: [], frames: [], scripts: [] };
|
|
11
|
+
|
|
12
|
+
function scriptedEntry() {
|
|
13
|
+
const socket = new EventEmitter();
|
|
14
|
+
socket.readyState = 1;
|
|
15
|
+
socket.close = () => {
|
|
16
|
+
socket.readyState = 3;
|
|
17
|
+
};
|
|
18
|
+
socket.terminate = socket.close;
|
|
19
|
+
return { socket, ephemeral: true };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
mock.module(new URL('./openai-oauth-ws.mjs', import.meta.url).href, {
|
|
23
|
+
namedExports: {
|
|
24
|
+
...realWs,
|
|
25
|
+
sendViaWebSocket: (args) => {
|
|
26
|
+
ws.bodies.push(structuredClone(args.body));
|
|
27
|
+
return realWs.sendViaWebSocket({
|
|
28
|
+
...args,
|
|
29
|
+
_acquireWithRetryFn: async () => ({ entry: scriptedEntry(), reused: false }),
|
|
30
|
+
_sendFrameFn: async (entry, frame) => {
|
|
31
|
+
ws.frames.push(structuredClone(frame));
|
|
32
|
+
const events = ws.scripts.shift() || [COMPLETED_REPLY];
|
|
33
|
+
setImmediate(() => {
|
|
34
|
+
for (const event of events) entry.socket.emit('message', Buffer.from(JSON.stringify(event)));
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const { sendXaiResponses, sendXaiResponsesWebSocket } = await import('./openai-compat-xai-send.mjs');
|
|
43
|
+
const { nativeHistory, oauthHistory } = await import('./openai-compat-responses-parity.fixtures.mjs');
|
|
44
|
+
export { sendXaiResponses, sendXaiResponsesWebSocket, nativeHistory, oauthHistory };
|
|
45
|
+
|
|
46
|
+
export const REPLY = { type: 'message', role: 'assistant', content: [{ type: 'output_text', text: 'ok' }] };
|
|
47
|
+
export const COMPLETED_REPLY = {
|
|
48
|
+
type: 'response.completed',
|
|
49
|
+
response: { id: 'resp-1', model: 'grok-4', status: 'completed', output: [REPLY] },
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// A recorded xAI server-side tool-search turn (shapes per xAI's OpenAPI schema
|
|
53
|
+
// ToolSearchCall / ToolSearchOutput: execution always "server", call_id null).
|
|
54
|
+
export const ENCRYPTED_REASONING = { type: 'reasoning', id: 'rs_1', encrypted_content: 'ENC', summary: [] };
|
|
55
|
+
export const TS_CALL = {
|
|
56
|
+
type: 'tool_search_call',
|
|
57
|
+
id: 'tsc_1',
|
|
58
|
+
call_id: null,
|
|
59
|
+
execution: 'server',
|
|
60
|
+
status: 'completed',
|
|
61
|
+
arguments: { query: 'mcp__weather__forecast', limit: 1 },
|
|
62
|
+
};
|
|
63
|
+
export const TS_OUTPUT = {
|
|
64
|
+
type: 'tool_search_output',
|
|
65
|
+
id: 'tso_1',
|
|
66
|
+
call_id: null,
|
|
67
|
+
execution: 'server',
|
|
68
|
+
status: 'completed',
|
|
69
|
+
tools: [
|
|
70
|
+
{
|
|
71
|
+
type: 'function',
|
|
72
|
+
name: 'mcp__weather__forecast',
|
|
73
|
+
description: 'Forecast',
|
|
74
|
+
parameters: { type: 'object', properties: { city: { type: 'string' } } },
|
|
75
|
+
defer_loading: true,
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
export const FN_CALL = {
|
|
80
|
+
type: 'function_call',
|
|
81
|
+
id: 'fc_1',
|
|
82
|
+
call_id: 'call_w',
|
|
83
|
+
name: 'mcp__weather__forecast',
|
|
84
|
+
arguments: '{"city":"Seoul"}',
|
|
85
|
+
status: 'completed',
|
|
86
|
+
};
|
|
87
|
+
export const TURN_OUTPUT = [ENCRYPTED_REASONING, TS_CALL, TS_OUTPUT, FN_CALL];
|
|
88
|
+
|
|
89
|
+
/** The stream events one server tool-search turn emits, in wire order. */
|
|
90
|
+
export function serverSearchEvents(model = 'grok-4') {
|
|
91
|
+
return [
|
|
92
|
+
{ type: 'response.created', response: { id: 'resp_ts', model } },
|
|
93
|
+
{ type: 'response.output_item.done', item: ENCRYPTED_REASONING },
|
|
94
|
+
{ type: 'response.output_item.added', item: { ...TS_CALL, status: 'in_progress' } },
|
|
95
|
+
{ type: 'response.output_item.done', item: TS_CALL },
|
|
96
|
+
{ type: 'response.output_item.added', item: TS_OUTPUT },
|
|
97
|
+
{ type: 'response.output_item.done', item: TS_OUTPUT },
|
|
98
|
+
{ type: 'response.output_item.added', item: { ...FN_CALL, arguments: '', status: 'in_progress' } },
|
|
99
|
+
{ type: 'response.function_call_arguments.done', item_id: 'fc_1', arguments: FN_CALL.arguments },
|
|
100
|
+
{ type: 'response.output_item.done', item: FN_CALL },
|
|
101
|
+
{
|
|
102
|
+
type: 'response.completed',
|
|
103
|
+
response: { id: 'resp_ts', model, status: 'completed', output: TURN_OUTPUT },
|
|
104
|
+
},
|
|
105
|
+
];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export const SESSION_TOOLS = [
|
|
109
|
+
{
|
|
110
|
+
name: 'Read',
|
|
111
|
+
description: 'Read a file',
|
|
112
|
+
inputSchema: { type: 'object', properties: { path: { type: 'string' } } },
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'load_tool',
|
|
116
|
+
description: 'Load tools',
|
|
117
|
+
inputSchema: { type: 'object', properties: { names: { type: 'array' } } },
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
export const DEFERRED_TOOLS = [
|
|
121
|
+
...SESSION_TOOLS,
|
|
122
|
+
{
|
|
123
|
+
name: 'mcp__weather__forecast',
|
|
124
|
+
description: 'Forecast',
|
|
125
|
+
inputSchema: { type: 'object', properties: { city: { type: 'string' } } },
|
|
126
|
+
deferLoading: true,
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
|
|
130
|
+
export function xaiProvider(config = {}, events = null) {
|
|
131
|
+
const requests = [];
|
|
132
|
+
const provider = {
|
|
133
|
+
name: 'xai',
|
|
134
|
+
config: { apiKey: 'test-key', preconnect: false, ...config },
|
|
135
|
+
nativePdf: true,
|
|
136
|
+
client: {
|
|
137
|
+
responses: {
|
|
138
|
+
create: async (params) => {
|
|
139
|
+
requests.push(structuredClone(params));
|
|
140
|
+
return (async function* () {
|
|
141
|
+
for (const event of events || [COMPLETED_REPLY]) yield event;
|
|
142
|
+
})();
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
return { provider, requests };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** The history left by a recorded server tool-search turn (replay owner xai-responses). */
|
|
151
|
+
export function serverSearchHistory() {
|
|
152
|
+
return [
|
|
153
|
+
{ role: 'user', content: 'weather in Seoul?' },
|
|
154
|
+
{
|
|
155
|
+
role: 'assistant',
|
|
156
|
+
content: '',
|
|
157
|
+
toolCalls: [{ id: 'call_w', name: 'mcp__weather__forecast', arguments: { city: 'Seoul' } }],
|
|
158
|
+
providerReplay: { version: 1, provider: 'xai-responses', items: structuredClone(TURN_OUTPUT) },
|
|
159
|
+
},
|
|
160
|
+
{ role: 'tool', toolCallId: 'call_w', content: 'sunny' },
|
|
161
|
+
{ role: 'user', content: 'and Busan?' },
|
|
162
|
+
];
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export const CASES = [
|
|
166
|
+
['native/plain-tools', () => nativeHistory(), SESSION_TOOLS],
|
|
167
|
+
['oauth/plain-tools', () => oauthHistory(), SESSION_TOOLS],
|
|
168
|
+
['server-replay/plain-tools', () => serverSearchHistory(), SESSION_TOOLS],
|
|
169
|
+
['server-replay/deferred-tools', () => serverSearchHistory(), DEFERRED_TOOLS],
|
|
170
|
+
['native/deferred-tools', () => nativeHistory(), DEFERRED_TOOLS],
|
|
171
|
+
];
|
|
172
|
+
|
|
173
|
+
/** The request body each transport sends for `history`, plus any option overrides. */
|
|
174
|
+
export async function captureBodies(history, tools, { config = {}, opts = {} } = {}) {
|
|
175
|
+
const http = xaiProvider(config);
|
|
176
|
+
await sendXaiResponses(http.provider, history, 'grok-4', tools, { sessionId: 'sess-1', ...opts });
|
|
177
|
+
const before = ws.bodies.length;
|
|
178
|
+
const socket = xaiProvider(config);
|
|
179
|
+
await sendXaiResponsesWebSocket(socket.provider, history, 'grok-4', tools, {
|
|
180
|
+
sessionId: 'sess-1',
|
|
181
|
+
iteration: 1,
|
|
182
|
+
...opts,
|
|
183
|
+
});
|
|
184
|
+
return { http: http.requests[0], ws: ws.bodies[before] };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export async function captureAll() {
|
|
188
|
+
const out = {};
|
|
189
|
+
for (const [label, build, tools] of CASES) {
|
|
190
|
+
const { http, ws: socketBody } = await captureBodies(build(), tools);
|
|
191
|
+
out[`http/${label}`] = http;
|
|
192
|
+
out[`ws/${label}`] = socketBody;
|
|
193
|
+
}
|
|
194
|
+
return out;
|
|
195
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export const ASK_USER_MAX_QUESTIONS = 4;
|
|
2
|
+
export const ASK_USER_MAX_TEXT = 4000;
|
|
3
|
+
export const ASK_USER_MAX_LABEL = 80;
|
|
4
|
+
|
|
5
|
+
export const ASK_USER_TOOL_DEFS = Object.freeze([
|
|
6
|
+
{
|
|
7
|
+
name: 'ask_user',
|
|
8
|
+
title: 'Ask User',
|
|
9
|
+
trigger:
|
|
10
|
+
'Ask the user 1–4 multiple-choice questions and wait; when a plan needs the user to pick between clear options, instead of listing them in chat.',
|
|
11
|
+
description:
|
|
12
|
+
'Ask the user multiple-choice questions and wait. Only while planning, for a decision only the user can make with clear options; open questions, minor choices and plan approval go in chat. Do not repeat the options in your message.',
|
|
13
|
+
annotations: {
|
|
14
|
+
title: 'Ask User',
|
|
15
|
+
readOnlyHint: true,
|
|
16
|
+
destructiveHint: false,
|
|
17
|
+
idempotentHint: false,
|
|
18
|
+
openWorldHint: false,
|
|
19
|
+
agentHidden: true,
|
|
20
|
+
},
|
|
21
|
+
inputSchema: {
|
|
22
|
+
type: 'object',
|
|
23
|
+
properties: {
|
|
24
|
+
questions: {
|
|
25
|
+
type: 'array',
|
|
26
|
+
minItems: 1,
|
|
27
|
+
maxItems: ASK_USER_MAX_QUESTIONS,
|
|
28
|
+
items: {
|
|
29
|
+
type: 'object',
|
|
30
|
+
properties: {
|
|
31
|
+
question: { type: 'string', description: 'Full question, without the options.' },
|
|
32
|
+
header: { type: 'string', maxLength: 12, description: 'Chip label.' },
|
|
33
|
+
options: {
|
|
34
|
+
type: 'array',
|
|
35
|
+
minItems: 2,
|
|
36
|
+
maxItems: 4,
|
|
37
|
+
description: 'Distinct; free text is added, never "Other".',
|
|
38
|
+
items: {
|
|
39
|
+
type: 'object',
|
|
40
|
+
properties: {
|
|
41
|
+
label: { type: 'string', maxLength: 80, description: '1-5 words.' },
|
|
42
|
+
description: { type: 'string', description: 'One-sentence tradeoff.' },
|
|
43
|
+
},
|
|
44
|
+
required: ['label', 'description'],
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
multi_select: { type: 'boolean' },
|
|
49
|
+
recommended: { type: 'integer', minimum: 0, description: 'Recommended option index.' },
|
|
50
|
+
},
|
|
51
|
+
required: ['question', 'header', 'options'],
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
required: ['questions'],
|
|
56
|
+
additionalProperties: false,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
|
|
61
|
+
/** Throws a clear error when the questions are malformed; returns the list. */
|
|
62
|
+
export function validateAskUserQuestions(args) {
|
|
63
|
+
const questions = args?.questions;
|
|
64
|
+
if (!Array.isArray(questions) || questions.length < 1 || questions.length > ASK_USER_MAX_QUESTIONS) {
|
|
65
|
+
throw new Error(`ask_user requires 1-${ASK_USER_MAX_QUESTIONS} questions`);
|
|
66
|
+
}
|
|
67
|
+
const seenQuestions = new Set();
|
|
68
|
+
questions.forEach((q, i) => {
|
|
69
|
+
const at = `ask_user question ${i + 1}`;
|
|
70
|
+
if (!q || typeof q !== 'object') throw new Error(`${at} must be an object`);
|
|
71
|
+
if (typeof q.question !== 'string' || !q.question.trim()) throw new Error(`${at} needs question text`);
|
|
72
|
+
if (typeof q.header !== 'string' || !q.header.trim() || q.header.length > 12) {
|
|
73
|
+
throw new Error(`${at} needs a header of at most 12 characters`);
|
|
74
|
+
}
|
|
75
|
+
if (seenQuestions.has(q.question)) throw new Error(`${at} duplicates another question text`);
|
|
76
|
+
seenQuestions.add(q.question);
|
|
77
|
+
if (!Array.isArray(q.options) || q.options.length < 2 || q.options.length > 4) {
|
|
78
|
+
throw new Error(`${at} needs 2-4 options`);
|
|
79
|
+
}
|
|
80
|
+
const labels = new Set();
|
|
81
|
+
for (const option of q.options) {
|
|
82
|
+
if (!option || typeof option.label !== 'string' || !option.label.trim()) {
|
|
83
|
+
throw new Error(`${at} has an option without a label`);
|
|
84
|
+
}
|
|
85
|
+
if (option.label.length > 80) throw new Error(`${at} has an option label over 80 characters`);
|
|
86
|
+
if (typeof option.description !== 'string' || !option.description.trim()) {
|
|
87
|
+
throw new Error(`${at} option "${option.label}" needs a one-sentence description`);
|
|
88
|
+
}
|
|
89
|
+
if (option.description.length > 200) throw new Error(`${at} has an option description over 200 characters`);
|
|
90
|
+
if (Object.keys(option).some((key) => key !== 'label' && key !== 'description')) {
|
|
91
|
+
throw new Error(`${at}: options take only a label and a description`);
|
|
92
|
+
}
|
|
93
|
+
if (labels.has(option.label)) throw new Error(`${at} has duplicate option label "${option.label}"`);
|
|
94
|
+
labels.add(option.label);
|
|
95
|
+
}
|
|
96
|
+
if (
|
|
97
|
+
q.recommended != null &&
|
|
98
|
+
(!Number.isInteger(q.recommended) || q.recommended < 0 || q.recommended >= q.options.length)
|
|
99
|
+
) {
|
|
100
|
+
throw new Error(`${at} recommended must be an index below ${q.options.length}`);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
return questions;
|
|
104
|
+
}
|
|
@@ -189,18 +189,20 @@ const AUTO_CLEAR_DEFAULT_IDLE_MS = 60 * 60 * 1000;
|
|
|
189
189
|
// rewrite the accumulated tail. Anthropic agent tails are 5m and compact once
|
|
190
190
|
// expired; their terminal reap keeps this 1h window so a completed agent stays
|
|
191
191
|
// reusable. Gemini, xAI and Mistral
|
|
192
|
-
// caches run ~1h, Groq's implicit cache persists ~2h,
|
|
193
|
-
//
|
|
194
|
-
// (Codex
|
|
195
|
-
// GPT-5.6+
|
|
196
|
-
//
|
|
192
|
+
// caches run ~1h, Groq's implicit cache persists ~2h, and DeepSeek's
|
|
193
|
+
// implicit cache is evicted after "a few hours to a few days" (kept at 24h).
|
|
194
|
+
// OpenAI (direct and OAuth/Codex) guarantees a 30-minute minimum prompt-cache
|
|
195
|
+
// TTL on GPT-5.6+ (refreshed on use; no 24h retention there), so the sweep
|
|
196
|
+
// matches that window. Older OpenAI models that still take
|
|
197
|
+
// prompt_cache_retention='24h' are not distinguished: these call sites only
|
|
198
|
+
// know the provider, not the model, so 30m applies to the whole provider.
|
|
197
199
|
// Unknown/unrecognized providers fall back to the 'default' 1h entry.
|
|
198
200
|
const AUTO_CLEAR_PROVIDER_IDLE_MS = Object.freeze({
|
|
199
201
|
anthropic: 60 * 60 * 1000,
|
|
200
202
|
'anthropic-oauth': 60 * 60 * 1000,
|
|
201
203
|
gemini: 60 * 60 * 1000,
|
|
202
204
|
groq: 2 * 60 * 60 * 1000,
|
|
203
|
-
openai:
|
|
205
|
+
openai: 30 * 60 * 1000,
|
|
204
206
|
deepseek: 24 * 60 * 60 * 1000,
|
|
205
207
|
xai: 60 * 60 * 1000,
|
|
206
208
|
'openai-oauth': 30 * 60 * 1000,
|
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
const lowerName = (name) => String(name || '').toLowerCase();
|
|
2
|
+
|
|
3
|
+
/** The persisted schema allowlist (also the execution allowlist) leaves `name` out. */
|
|
4
|
+
export function sessionAllowlistExcludes(session, name) {
|
|
5
|
+
if (!Array.isArray(session?.schemaAllowedTools)) return false;
|
|
6
|
+
return !session.schemaAllowedTools.some((allowed) => lowerName(allowed) === lowerName(name));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** The session's denied tools name `name`. */
|
|
10
|
+
export function sessionDisallows(session, name) {
|
|
11
|
+
return (
|
|
12
|
+
Array.isArray(session?.disallowedTools) &&
|
|
13
|
+
session.disallowedTools.some((denied) => lowerName(denied) === lowerName(name))
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The session's own tool policy permits `name`: discovery (load_tool by name
|
|
19
|
+
* or query) shows, selects and describes only what execution would run.
|
|
20
|
+
*/
|
|
21
|
+
export function isToolPermittedBySessionPolicy(session, name) {
|
|
22
|
+
return !sessionAllowlistExcludes(session, name) && !sessionDisallows(session, name);
|
|
23
|
+
}
|
|
24
|
+
|
|
1
25
|
// Discovery history retains definitions; only the latest scoped MCP snapshot
|
|
2
26
|
// grants availability. An absent snapshot preserves pre-initialization behavior.
|
|
3
27
|
export function isDeferredToolAvailable(session, name) {
|
|
@@ -114,6 +114,21 @@ function catalogEffortOptions(provider, model) {
|
|
|
114
114
|
return providerAllowed ? [...providerAllowed] : [];
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
+
const warnedEmptyLadders = new Set();
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Auto effort skipped a judgment because the base is off the model's ladder.
|
|
121
|
+
* A user-chosen max/ultra is expected to skip; any other base means the route
|
|
122
|
+
* has no usable ladder, so say so once per provider/model per process.
|
|
123
|
+
*/
|
|
124
|
+
export function warnEmptyAutoEffortLadder(provider, model, base) {
|
|
125
|
+
if (base === 'max' || base === 'ultra') return;
|
|
126
|
+
const key = `${provider}/${model}`;
|
|
127
|
+
if (warnedEmptyLadders.has(key)) return;
|
|
128
|
+
warnedEmptyLadders.add(key);
|
|
129
|
+
process.stderr.write(`[auto-effort] no effort ladder for ${key}; judge skipped\n`);
|
|
130
|
+
}
|
|
131
|
+
|
|
117
132
|
export function coerceEffortFor(provider, model, effort) {
|
|
118
133
|
if (!effort) return null;
|
|
119
134
|
if (model?.customReasoning) return snapCustomEffort(customEffortLevels(model), effort);
|
|
@@ -86,7 +86,7 @@ export function createGoalStore(ctx) {
|
|
|
86
86
|
}
|
|
87
87
|
};
|
|
88
88
|
|
|
89
|
-
const commit = async (sessionId, goal) => {
|
|
89
|
+
const commit = async (sessionId, goal, { isCurrent, accept } = {}) => {
|
|
90
90
|
const id = assertSessionId(sessionId);
|
|
91
91
|
const previous = goal ? readRecord(id).goal : null;
|
|
92
92
|
let committedGoal = null;
|
|
@@ -101,7 +101,35 @@ export function createGoalStore(ctx) {
|
|
|
101
101
|
? previous.revision + Number(revisionStateKey(previous) !== revisionStateKey(committedGoal))
|
|
102
102
|
: 1;
|
|
103
103
|
}
|
|
104
|
-
|
|
104
|
+
const rollback = async () => {
|
|
105
|
+
try {
|
|
106
|
+
await storage.write(id, { version: GOAL_FILE_VERSION, goal: previous });
|
|
107
|
+
} catch (error) {
|
|
108
|
+
error.quotaResumeRollbackFailed = true;
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
ctx.deadlines.armDeadline(id);
|
|
112
|
+
};
|
|
113
|
+
try {
|
|
114
|
+
await storage.write(id, { version: GOAL_FILE_VERSION, goal: committedGoal });
|
|
115
|
+
} catch (error) {
|
|
116
|
+
if (isCurrent || accept) await rollback();
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
if (isCurrent || accept) {
|
|
120
|
+
let accepted = false;
|
|
121
|
+
let admissionError = null;
|
|
122
|
+
try {
|
|
123
|
+
accepted = (!isCurrent || isCurrent()) && (!accept || accept() === true);
|
|
124
|
+
} catch (error) {
|
|
125
|
+
admissionError = error;
|
|
126
|
+
}
|
|
127
|
+
if (!accepted) {
|
|
128
|
+
await rollback();
|
|
129
|
+
if (admissionError) throw admissionError;
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
105
133
|
ctx.deadlines.armDeadline(id);
|
|
106
134
|
emit(id);
|
|
107
135
|
return publicGoal(committedGoal, now());
|
|
@@ -171,8 +171,9 @@ export function createGoalTurnLifecycle(ctx) {
|
|
|
171
171
|
// A quota resume revives exactly the Goal its failure suspended, and only
|
|
172
172
|
// while that Goal is still waiting on the limit: a Goal the user paused,
|
|
173
173
|
// stopped, replaced or completed meanwhile stays as it is.
|
|
174
|
-
reactivateUsageLimited(sessionId, goalId) {
|
|
174
|
+
reactivateUsageLimited(sessionId, goalId, options = {}) {
|
|
175
175
|
return withMutation(sessionId, async (id) => {
|
|
176
|
+
if (options.isCurrent && !options.isCurrent()) return null;
|
|
176
177
|
const goal = readRecord(id).goal;
|
|
177
178
|
if (!goal || goal.archivedAt || goal.id !== clean(goalId) || goal.status !== 'usage_limited') return null;
|
|
178
179
|
try {
|
|
@@ -180,7 +181,7 @@ export function createGoalTurnLifecycle(ctx) {
|
|
|
180
181
|
} catch {
|
|
181
182
|
return null;
|
|
182
183
|
}
|
|
183
|
-
return commit(id, goal);
|
|
184
|
+
return commit(id, goal, options);
|
|
184
185
|
});
|
|
185
186
|
},
|
|
186
187
|
continuation(sessionId, { agentStatus = null } = {}) {
|
|
@@ -5,9 +5,10 @@ const BATCHING = {
|
|
|
5
5
|
self-contained supporting work, one agent per role; batch related tasks
|
|
6
6
|
rather than splitting them for parallelism.`,
|
|
7
7
|
balanced: `Delegate independent work by coherent feature or module, one agent per
|
|
8
|
-
scope. Batch related tasks within the
|
|
9
|
-
splitting every file or step.`,
|
|
10
|
-
swarm: `Delegate every independent scope to its own agent
|
|
8
|
+
scope; a scope is one verifiable deliverable. Batch related tasks within the
|
|
9
|
+
same change scope rather than splitting every file or step.`,
|
|
10
|
+
swarm: `Delegate every independent scope to its own agent; a scope is one
|
|
11
|
+
verifiable deliverable, not a bundle of steps. Treat disjoint file or
|
|
11
12
|
module sets as independent and merge scopes only on a true output
|
|
12
13
|
dependency. Prefer parallel scopes over sequential slices in one agent.`,
|
|
13
14
|
};
|
|
@@ -38,6 +39,10 @@ scopes does not change this.
|
|
|
38
39
|
|
|
39
40
|
Dispatch all ready independent scopes in one turn. Only a scope that requires
|
|
40
41
|
another's output waits. Brief each agent as the Lead rules describe.
|
|
42
|
+
A running agent receives only changes within its own scope; a new independent
|
|
43
|
+
need goes to a new agent. When scopes touch the same file, name one owner for
|
|
44
|
+
that file in each brief. Agents run only the checks covering their own change;
|
|
45
|
+
Lead runs the full suite once after integration.
|
|
41
46
|
Use only available agents; when none fits a role, Lead does that work itself
|
|
42
47
|
and never changes settings to enable one. If the reviewer is disabled or
|
|
43
48
|
unavailable, Lead alone reviews the result against the approved scope and
|
|
@@ -3,7 +3,7 @@ import { types } from 'node:util';
|
|
|
3
3
|
import { clean } from './session-text.mjs';
|
|
4
4
|
import { isDeferredToolAvailable } from './deferred-tool-availability.mjs';
|
|
5
5
|
import { finalizeProviderRequestTools } from './provider-request-tools.mjs';
|
|
6
|
-
import { parseToolSelection, ANTHROPIC_NATIVE_PROVIDERS } from './tool-catalog-schema.mjs';
|
|
6
|
+
import { parseToolSelection, nativeProviderFamily, ANTHROPIC_NATIVE_PROVIDERS } from './tool-catalog-schema.mjs';
|
|
7
7
|
|
|
8
8
|
const OMIT_REQUEST_TOOL_VALUE = Symbol('omit-request-tool-value');
|
|
9
9
|
const MAX_PROVIDER_SNAPSHOT_ARRAY_LENGTH = 1_000_000;
|
|
@@ -378,9 +378,13 @@ const requestToolSnapshotMemo = new WeakMap();
|
|
|
378
378
|
export function snapshotProviderRequestTools(options = {}) {
|
|
379
379
|
const { provider, tools, nativeTools, messages, session } = options;
|
|
380
380
|
const normalizedProvider = clean(provider || session?.provider).toLowerCase();
|
|
381
|
-
|
|
381
|
+
// Server-hosted definitions stay first-party Anthropic only; defer_loading
|
|
382
|
+
// expansion follows the session's native family, which a gateway gets from
|
|
383
|
+
// its pinned Messages route with verified support.
|
|
384
|
+
const firstPartyAnthropic = ANTHROPIC_NATIVE_PROVIDERS.has(normalizedProvider);
|
|
385
|
+
const anthropic = nativeProviderFamily(normalizedProvider, session?.wireRoute) === 'anthropic';
|
|
382
386
|
const activeTools = entriesOf(tools);
|
|
383
|
-
const nativeList =
|
|
387
|
+
const nativeList = firstPartyAnthropic ? entriesOf(nativeTools) : NO_ENTRIES;
|
|
384
388
|
const mcpNames = Array.isArray(session?.deferredMcpToolNames) ? session.deferredMcpToolNames : null;
|
|
385
389
|
let base = Array.isArray(tools) ? requestToolSnapshotMemo.get(tools) : null;
|
|
386
390
|
if (
|
|
@@ -15,6 +15,26 @@ function hasMeaningfulTitleText(value) {
|
|
|
15
15
|
return /[\p{L}\p{N}]/u.test(String(value || ''));
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
const graphemeSegmenter =
|
|
19
|
+
typeof Intl !== 'undefined' && typeof Intl.Segmenter === 'function'
|
|
20
|
+
? new Intl.Segmenter(undefined, { granularity: 'grapheme' })
|
|
21
|
+
: null;
|
|
22
|
+
|
|
23
|
+
/** The longest prefix of `text` within `limit` UTF-16 units that ends on a
|
|
24
|
+
* grapheme (else code point) boundary, so a surrogate pair or emoji sequence
|
|
25
|
+
* is never split. */
|
|
26
|
+
function prefixWithinLimit(text, limit) {
|
|
27
|
+
const pieces = graphemeSegmenter
|
|
28
|
+
? Array.from(graphemeSegmenter.segment(text), (part) => part.segment)
|
|
29
|
+
: Array.from(text);
|
|
30
|
+
let head = '';
|
|
31
|
+
for (const piece of pieces) {
|
|
32
|
+
if (head.length + piece.length > limit) break;
|
|
33
|
+
head += piece;
|
|
34
|
+
}
|
|
35
|
+
return head;
|
|
36
|
+
}
|
|
37
|
+
|
|
18
38
|
export function compactSessionTitle(value, maximum = 32) {
|
|
19
39
|
const line =
|
|
20
40
|
String(value || '')
|
|
@@ -25,7 +45,7 @@ export function compactSessionTitle(value, maximum = 32) {
|
|
|
25
45
|
const text = cleanSessionPreview(line, Math.max(maximum * 4, 128));
|
|
26
46
|
if (!hasMeaningfulTitleText(text)) return '';
|
|
27
47
|
if (text.length <= maximum) return text;
|
|
28
|
-
const clipped = text
|
|
48
|
+
const clipped = prefixWithinLimit(text, maximum - 1);
|
|
29
49
|
const boundary = clipped.lastIndexOf(' ');
|
|
30
50
|
const head = boundary >= Math.floor(maximum * 0.6) ? clipped.slice(0, boundary) : clipped;
|
|
31
51
|
return `${head.trimEnd()}…`;
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { deferredCatalogUnion, selectDeferredTools, toolSearchNativePayload } from './tool-catalog.mjs';
|
|
4
4
|
import { preDispatchDenyForSession } from '../session/loop/pre-dispatch-deny.mjs';
|
|
5
5
|
import { parseMcpToolName } from '../../../shared/tool-primitives.mjs';
|
|
6
|
+
import { isToolBridgeEnabled } from './tool-exposure.mjs';
|
|
6
7
|
|
|
7
8
|
export function loadSkillToolDependencies(envelope, session, mode) {
|
|
8
9
|
if (!envelope?.__toolEnvelope) return envelope;
|
|
@@ -46,11 +47,24 @@ export function loadSkillToolDependencies(envelope, session, mode) {
|
|
|
46
47
|
if (loaded.length) {
|
|
47
48
|
session.skillLoadedTools = [...new Set([...(session.skillLoadedTools || []), ...loaded])];
|
|
48
49
|
}
|
|
50
|
+
const eager = new Set((session?.tools || []).map((tool) => tool.name));
|
|
51
|
+
// Bridge exposure never promotes a schema: deferred dependencies stay
|
|
52
|
+
// reachable through call_tool while the eager surface keeps its bytes.
|
|
53
|
+
const bridged = isToolBridgeEnabled(session) ? loaded.filter((name) => !eager.has(name)) : [];
|
|
54
|
+
const direct = loaded.filter((name) => !bridged.includes(name));
|
|
49
55
|
const summary = [
|
|
50
56
|
envelope.result,
|
|
51
|
-
...(
|
|
57
|
+
...(direct.length && !isToolBridgeEnabled(session)
|
|
58
|
+
? [
|
|
59
|
+
`Required tools loaded: ${direct.join(', ')}. Their full definitions are available on your next request; use them directly without load_tool.`,
|
|
60
|
+
]
|
|
61
|
+
: []),
|
|
62
|
+
...(direct.length && isToolBridgeEnabled(session)
|
|
63
|
+
? [`Required tools available directly: ${direct.join(', ')}.`]
|
|
64
|
+
: []),
|
|
65
|
+
...(bridged.length
|
|
52
66
|
? [
|
|
53
|
-
`Required tools
|
|
67
|
+
`Required tools available through call_tool: ${bridged.join(', ')}. Read a definition with load_tool, then run it with call_tool {name, arguments}.`,
|
|
54
68
|
]
|
|
55
69
|
: []),
|
|
56
70
|
...(unavailable.length
|
|
@@ -60,7 +74,6 @@ export function loadSkillToolDependencies(envelope, session, mode) {
|
|
|
60
74
|
]
|
|
61
75
|
: []),
|
|
62
76
|
].join('\n');
|
|
63
|
-
const eager = new Set((session?.tools || []).map((tool) => tool.name));
|
|
64
77
|
const native = selection?.native
|
|
65
78
|
? toolSearchNativePayload(
|
|
66
79
|
[...catalog.values()],
|