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
|
@@ -91,6 +91,7 @@ function createStandaloneMemoryRuntime({ entry, dataDir, cwd = process.cwd() } =
|
|
|
91
91
|
warmupEmbedding: calls.warmupEmbedding,
|
|
92
92
|
appendEntry: calls.appendEntry,
|
|
93
93
|
ingestTranscript: calls.ingestTranscript,
|
|
94
|
+
forgetTranscripts: calls.forgetTranscripts,
|
|
94
95
|
recordTraceEvents: calls.recordTraceEvents,
|
|
95
96
|
moduleUrl: pathToFileURL(entry).href,
|
|
96
97
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
2
|
import { renameSync } from 'node:fs';
|
|
3
|
+
import { modelProxyClientMode, serverModelCredentialsDisabledError } from '../../runtime/shared/model-proxy-mode.mjs';
|
|
3
4
|
import { sameAccountIdentity } from '../../runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs';
|
|
4
5
|
import {
|
|
5
6
|
AGENT_PROVIDER_ENV,
|
|
@@ -94,6 +95,7 @@ import {
|
|
|
94
95
|
} from '../../runtime/shared/provider-accounts.mjs';
|
|
95
96
|
import { currentProviderAccountId, withProviderAccount } from '../../runtime/shared/provider-auth-binding.mjs';
|
|
96
97
|
import {
|
|
98
|
+
CUSTOM_API_KEY_ENV_RE,
|
|
97
99
|
effectiveCustomModelRows,
|
|
98
100
|
normalizeCustomProviderConfig as normalizeStoredCustomConfig,
|
|
99
101
|
} from '../../runtime/agent/orchestrator/providers/custom-provider-config.mjs';
|
|
@@ -439,14 +441,22 @@ function customProviderRow(id, entry, checkSecrets = true) {
|
|
|
439
441
|
const { config, error: configError } = inspectStoredCustomConfig(entry);
|
|
440
442
|
const configuredEnabled = entry.enabled !== false;
|
|
441
443
|
const keyless = (config?.auth ?? entry.auth) === 'none';
|
|
444
|
+
const apiKeyEnv = keyless ? '' : config?.apiKeyEnv || '';
|
|
445
|
+
const envSet = Boolean(apiKeyEnv && process.env[apiKeyEnv]);
|
|
442
446
|
const stored = checkSecrets ? hasStoredSecret(SECRET_ACCOUNTS.agentApiKey(id)) : false;
|
|
443
447
|
const unstoredStatus = configuredEnabled ? 'No Key' : 'Off';
|
|
444
448
|
let status = stored ? 'Set' : unstoredStatus;
|
|
445
449
|
let detail = stored ? 'stored in keychain' : 'custom endpoint';
|
|
450
|
+
if (apiKeyEnv) {
|
|
451
|
+
status = envSet ? 'Env' : unstoredStatus;
|
|
452
|
+
detail = apiKeyEnv;
|
|
453
|
+
}
|
|
446
454
|
if (keyless) {
|
|
447
455
|
status = configuredEnabled ? 'Keyless' : 'Off';
|
|
448
456
|
detail = 'no API key required';
|
|
449
457
|
}
|
|
458
|
+
let keyAuthenticated = checkSecrets ? stored : configuredEnabled;
|
|
459
|
+
if (apiKeyEnv) keyAuthenticated = envSet;
|
|
450
460
|
const row = {
|
|
451
461
|
id,
|
|
452
462
|
name: entry.name,
|
|
@@ -457,17 +467,20 @@ function customProviderRow(id, entry, checkSecrets = true) {
|
|
|
457
467
|
group: 'api',
|
|
458
468
|
type: 'api-key',
|
|
459
469
|
enabled: configuredEnabled,
|
|
460
|
-
authenticated: keyless ||
|
|
470
|
+
authenticated: keyless || keyAuthenticated,
|
|
461
471
|
stored,
|
|
462
|
-
env:
|
|
463
|
-
envName: null,
|
|
472
|
+
env: envSet,
|
|
473
|
+
envName: apiKeyEnv || null,
|
|
464
474
|
status,
|
|
465
475
|
detail,
|
|
466
476
|
};
|
|
477
|
+
if (apiKeyEnv) row.apiKeyEnv = apiKeyEnv;
|
|
467
478
|
row.schemaVersion = config?.schemaVersion ?? entry.schemaVersion;
|
|
468
479
|
row.auth = keyless ? 'none' : 'key';
|
|
469
480
|
row.discovery = structuredClone(config?.discovery ?? entry.discovery ?? { newModelsHidden: false });
|
|
470
481
|
row.modelOverrides = structuredClone(config?.modelOverrides ?? entry.modelOverrides ?? {});
|
|
482
|
+
if (config?.wires) row.wires = [...config.wires];
|
|
483
|
+
if (config?.modelWires) row.modelWires = { ...config.modelWires };
|
|
471
484
|
// A stored config that does not normalize cannot run (the registry skips
|
|
472
485
|
// it): say so explicitly instead of listing it as connected.
|
|
473
486
|
// Every readiness flag consumers read says "not ready" (`stored` stays the
|
|
@@ -490,6 +503,7 @@ function customProviderRows(providers, checkSecrets) {
|
|
|
490
503
|
}
|
|
491
504
|
|
|
492
505
|
export async function providerSetup(config = {}, options = {}) {
|
|
506
|
+
if (modelProxyClientMode()) return modelProxyProviderSetup(options);
|
|
493
507
|
const providers = config.providers || {};
|
|
494
508
|
const checkSecrets = options?.checkSecrets !== false;
|
|
495
509
|
const keychain = checkSecrets ? keychainIssueFor(true) : null;
|
|
@@ -504,6 +518,59 @@ export async function providerSetup(config = {}, options = {}) {
|
|
|
504
518
|
};
|
|
505
519
|
}
|
|
506
520
|
|
|
521
|
+
// The desktop's hidden custom models, in the override shape pickers already read.
|
|
522
|
+
function hiddenModelOverrides(entry) {
|
|
523
|
+
const ids = Array.isArray(entry?.hiddenModels) ? entry.hiddenModels : [];
|
|
524
|
+
return Object.fromEntries(ids.filter((id) => typeof id === 'string').map((id) => [id, { hidden: true }]));
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// SSH servers have no model credentials. Project only the PC's advertised
|
|
528
|
+
// availability; account identities and credential management stay on the PC.
|
|
529
|
+
async function modelProxyProviderSetup(options) {
|
|
530
|
+
const { loadModelProxyProviderConfig } = await import(
|
|
531
|
+
'../../runtime/agent/orchestrator/providers/model-proxy-provider.mjs'
|
|
532
|
+
);
|
|
533
|
+
let providers;
|
|
534
|
+
try {
|
|
535
|
+
providers = await loadModelProxyProviderConfig({ force: options.force === true, waitMs: 1_000 });
|
|
536
|
+
} catch (error) {
|
|
537
|
+
if (error?.code !== 'MODEL_PROXY_UNAVAILABLE') throw error;
|
|
538
|
+
return { managedByClient: true, unavailable: true, api: [], oauth: [], local: [] };
|
|
539
|
+
}
|
|
540
|
+
const project = (definitions, group, type) =>
|
|
541
|
+
definitions
|
|
542
|
+
.filter(({ id }) => Object.hasOwn(providers, id))
|
|
543
|
+
.map(({ id, name }) => {
|
|
544
|
+
const enabled = providers[id]?.enabled === true;
|
|
545
|
+
const authState = providers[id]?.authState;
|
|
546
|
+
// Older desktops advertise only enabled; new desktops distinguish a
|
|
547
|
+
// missing credential from a transiently unreadable, preserved adapter.
|
|
548
|
+
const authenticated = authState == null ? enabled : authState === 'present';
|
|
549
|
+
const usable = enabled && authState !== 'absent';
|
|
550
|
+
let status = usable ? 'Connected' : 'Not connected';
|
|
551
|
+
if (enabled && authState === 'unreadable') status = 'Checking…';
|
|
552
|
+
// Signed in but switched off on the desktop.
|
|
553
|
+
else if (!enabled && authState === 'present') status = 'Off';
|
|
554
|
+
return {
|
|
555
|
+
id, name, group, type, enabled,
|
|
556
|
+
authenticated,
|
|
557
|
+
usable,
|
|
558
|
+
...(group === 'local' ? { detected: enabled } : {}),
|
|
559
|
+
...(type === 'custom' ? { custom: true, modelOverrides: hiddenModelOverrides(providers[id]) } : {}),
|
|
560
|
+
status,
|
|
561
|
+
};
|
|
562
|
+
});
|
|
563
|
+
const custom = Object.entries(providers)
|
|
564
|
+
.filter(([id, entry]) => isCustomProviderId(id) && entry?.type === 'custom')
|
|
565
|
+
.map(([id]) => ({ id, name: id }));
|
|
566
|
+
return {
|
|
567
|
+
managedByClient: true,
|
|
568
|
+
api: [...project(API_PROVIDERS, 'api', 'api-key'), ...project(custom, 'api', 'custom')],
|
|
569
|
+
oauth: project(OAUTH_PROVIDERS, 'oauth', 'oauth'),
|
|
570
|
+
local: project([{ id: 'mixdog-local', name: 'Local Provider' }], 'local', 'local'),
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
|
|
507
574
|
function apiProviderStatusRow(p, config) {
|
|
508
575
|
const configured = config.providers?.[p.id] || {};
|
|
509
576
|
const envName = AGENT_PROVIDER_ENV[p.id] || p.env;
|
|
@@ -547,8 +614,8 @@ export function providerStatus(config = {}) {
|
|
|
547
614
|
enabled: row.enabled,
|
|
548
615
|
authenticated: row.authenticated,
|
|
549
616
|
stored: row.stored,
|
|
550
|
-
env:
|
|
551
|
-
envName:
|
|
617
|
+
env: row.env,
|
|
618
|
+
envName: row.envName,
|
|
552
619
|
label: row.name,
|
|
553
620
|
})),
|
|
554
621
|
...availableOAuthProviders().map((p) => oauthProviderStatusRow(p, config)),
|
|
@@ -572,7 +639,12 @@ export function renderProviderStatus(config = {}) {
|
|
|
572
639
|
.join('\n');
|
|
573
640
|
}
|
|
574
641
|
|
|
642
|
+
function requireLocalProviderManagement() {
|
|
643
|
+
if (modelProxyClientMode()) throw serverModelCredentialsDisabledError('Provider account management');
|
|
644
|
+
}
|
|
645
|
+
|
|
575
646
|
export async function authenticateProvider(provider, secret) {
|
|
647
|
+
requireLocalProviderManagement();
|
|
576
648
|
const id = String(provider || '').trim();
|
|
577
649
|
if (!id) throw new Error('provider id is required');
|
|
578
650
|
|
|
@@ -593,6 +665,7 @@ export async function authenticateProvider(provider, secret) {
|
|
|
593
665
|
}
|
|
594
666
|
|
|
595
667
|
export async function loginOAuthProvider(cfgMod, provider) {
|
|
668
|
+
requireLocalProviderManagement();
|
|
596
669
|
const id = String(provider || '').trim();
|
|
597
670
|
const oauth = availableOAuthProvider(id);
|
|
598
671
|
if (!oauth) throw new Error(`unknown OAuth provider "${id}"`);
|
|
@@ -679,6 +752,7 @@ async function settleOAuthLogin(
|
|
|
679
752
|
}
|
|
680
753
|
|
|
681
754
|
export async function beginOAuthProviderLogin(cfgMod, provider, options = {}) {
|
|
755
|
+
requireLocalProviderManagement();
|
|
682
756
|
const id = String(provider || '').trim();
|
|
683
757
|
const oauth = availableOAuthProvider(id);
|
|
684
758
|
if (!oauth) throw new Error(`unknown OAuth provider "${id}"`);
|
|
@@ -751,6 +825,10 @@ export async function beginOAuthProviderLogin(cfgMod, provider, options = {}) {
|
|
|
751
825
|
}
|
|
752
826
|
|
|
753
827
|
export function listProviderAccounts(provider) {
|
|
828
|
+
if (!OAUTH_BY_ID.has(provider)) throw new TypeError('Unknown OAuth provider.');
|
|
829
|
+
// Client mode: accounts live on the desktop, so this server's roster is
|
|
830
|
+
// empty whatever this server's own provider availability says.
|
|
831
|
+
if (modelProxyClientMode()) return { provider, auto: true, useCredits: false, selectedId: null, accounts: [] };
|
|
754
832
|
const oauth = availableOAuthProvider(provider);
|
|
755
833
|
if (!oauth) throw new TypeError('Unknown OAuth provider.');
|
|
756
834
|
const pool = readProviderAccountPool(provider);
|
|
@@ -795,6 +873,7 @@ function defaultAccountRows(provider, oauth) {
|
|
|
795
873
|
// Store the implicit signed-in `default` account in the roster, so a change or
|
|
796
874
|
// a usage measurement has a row to land on. Returns the current roster view.
|
|
797
875
|
export async function materializeProviderAccounts(provider) {
|
|
876
|
+
requireLocalProviderManagement();
|
|
798
877
|
const current = listProviderAccounts(provider);
|
|
799
878
|
if (readProviderAccountPool(provider).accounts.length || !current.accounts.length) return current;
|
|
800
879
|
await registerProviderAccount(provider, 'default', { label: 'Account 1' });
|
|
@@ -802,6 +881,7 @@ export async function materializeProviderAccounts(provider) {
|
|
|
802
881
|
}
|
|
803
882
|
|
|
804
883
|
export async function updateProviderAccounts(provider, change) {
|
|
884
|
+
requireLocalProviderManagement();
|
|
805
885
|
await materializeProviderAccounts(provider);
|
|
806
886
|
await changeProviderAccounts(provider, change);
|
|
807
887
|
// Picking an account by hand is a decision to use it NOW, so the refusal
|
|
@@ -813,6 +893,7 @@ export async function updateProviderAccounts(provider, change) {
|
|
|
813
893
|
}
|
|
814
894
|
|
|
815
895
|
export async function saveProviderApiKey(cfgMod, provider, secret) {
|
|
896
|
+
requireLocalProviderManagement();
|
|
816
897
|
const id = String(provider || '').trim();
|
|
817
898
|
if (!API_PROVIDER_IDS.has(id)) throw new Error(`unknown API-key provider "${id}"`);
|
|
818
899
|
const value = String(secret || '').trim();
|
|
@@ -867,6 +948,20 @@ function validateCustomTransportFields(input) {
|
|
|
867
948
|
throw new TypeError('custom provider id is invalid');
|
|
868
949
|
if (input.apiKey !== undefined && (typeof input.apiKey !== 'string' || input.apiKey.length > CUSTOM_API_KEY_MAX))
|
|
869
950
|
throw new TypeError('custom provider apiKey is invalid');
|
|
951
|
+
if (input.apiKeyEnv !== undefined && input.apiKeyEnv !== null) {
|
|
952
|
+
if (typeof input.apiKeyEnv !== 'string' || !CUSTOM_API_KEY_ENV_RE.test(input.apiKeyEnv))
|
|
953
|
+
throw new TypeError('custom provider apiKeyEnv is invalid');
|
|
954
|
+
if (input.auth === 'none') throw new TypeError('custom provider apiKeyEnv requires key auth');
|
|
955
|
+
if (typeof input.apiKey === 'string' && input.apiKey !== '')
|
|
956
|
+
throw new TypeError('custom provider apiKey and apiKeyEnv are mutually exclusive');
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
/** Whether the named environment variable is set to a non-empty value. */
|
|
961
|
+
export function checkCustomProviderKeyEnv(name) {
|
|
962
|
+
if (typeof name !== 'string' || !CUSTOM_API_KEY_ENV_RE.test(name))
|
|
963
|
+
throw new TypeError('environment variable name is invalid');
|
|
964
|
+
return { found: Boolean(process.env[name]) };
|
|
870
965
|
}
|
|
871
966
|
|
|
872
967
|
function inputObject(input) {
|
|
@@ -886,9 +981,16 @@ function withStoredSettings(input, entry) {
|
|
|
886
981
|
}
|
|
887
982
|
const out = { ...input };
|
|
888
983
|
if (out.auth === undefined) out.auth = stored.auth;
|
|
984
|
+
if (out.apiKeyEnv === undefined && stored.apiKeyEnv) out.apiKeyEnv = stored.apiKeyEnv;
|
|
889
985
|
if (out.schemaVersion === stored.schemaVersion) {
|
|
890
986
|
if (out.discovery === undefined) out.discovery = stored.discovery;
|
|
891
987
|
if (out.modelOverrides === undefined) out.modelOverrides = stored.modelOverrides;
|
|
988
|
+
// Served wires and per-model wires have no setup field yet: an edit on
|
|
989
|
+
// the same protocol keeps them (another protocol serves other wires).
|
|
990
|
+
if ((out.protocol ?? stored.protocol) === stored.protocol) {
|
|
991
|
+
if (out.wires === undefined && stored.wires) out.wires = stored.wires;
|
|
992
|
+
if (out.modelWires === undefined && stored.modelWires) out.modelWires = stored.modelWires;
|
|
993
|
+
}
|
|
892
994
|
}
|
|
893
995
|
return out;
|
|
894
996
|
}
|
|
@@ -904,20 +1006,24 @@ async function resolveCustomInput(cfgMod, rawInput, options) {
|
|
|
904
1006
|
const config = normalizeCustomProviderConfig(input, options);
|
|
905
1007
|
const typed = typeof input.apiKey === 'string' ? input.apiKey.trim() : '';
|
|
906
1008
|
const keyless = config.auth === 'none';
|
|
1009
|
+
const envName = keyless ? '' : config.apiKeyEnv || '';
|
|
907
1010
|
let apiKey = '';
|
|
908
|
-
if (
|
|
909
|
-
|
|
1011
|
+
if (envName) apiKey = process.env[envName] || '';
|
|
1012
|
+
else if (!keyless) apiKey = typed || (id ? getAgentApiKey(id) || '' : '');
|
|
1013
|
+
return { id, config, typed: keyless || envName ? '' : typed, apiKey, keyless, envName };
|
|
910
1014
|
}
|
|
911
1015
|
|
|
912
1016
|
export async function saveCustomProvider(cfgMod, rawInput) {
|
|
1017
|
+
requireLocalProviderManagement();
|
|
913
1018
|
const {
|
|
914
1019
|
id: existingId,
|
|
915
1020
|
config,
|
|
916
1021
|
typed,
|
|
917
1022
|
apiKey,
|
|
918
1023
|
keyless,
|
|
1024
|
+
envName,
|
|
919
1025
|
} = await resolveCustomInput(cfgMod, rawInput, { requireModels: false });
|
|
920
|
-
if (!keyless && !apiKey) throw new Error('API key is required');
|
|
1026
|
+
if (!keyless && !envName && !apiKey) throw new Error('API key is required');
|
|
921
1027
|
const id = existingId || `custom-${randomUUID()}`;
|
|
922
1028
|
const entry = { ...config, type: 'custom', enabled: config.enabled !== false };
|
|
923
1029
|
const account = SECRET_ACCOUNTS.agentApiKey(id);
|
|
@@ -963,6 +1069,7 @@ function plainPatch(value, allowed, label) {
|
|
|
963
1069
|
// removes the whole override; reasoning is merged key by key with the same
|
|
964
1070
|
// tri-state rules. Semantic validation is the runtime normalizer's.
|
|
965
1071
|
export async function updateCustomProviderModel(cfgMod, rawId, rawModelId, patch) {
|
|
1072
|
+
requireLocalProviderManagement();
|
|
966
1073
|
const id = String(rawId || '').trim();
|
|
967
1074
|
const modelId = typeof rawModelId === 'string' ? rawModelId.trim() : '';
|
|
968
1075
|
if (!modelId) throw new TypeError('model id is required');
|
|
@@ -1021,17 +1128,43 @@ export async function updateCustomProviderModel(cfgMod, rawId, rawModelId, patch
|
|
|
1021
1128
|
return customProviderRow(id, saved);
|
|
1022
1129
|
}
|
|
1023
1130
|
|
|
1131
|
+
// Drops every stored model setting and route that names the provider.
|
|
1132
|
+
function withoutProviderReferences(config, id) {
|
|
1133
|
+
const next = { ...config };
|
|
1134
|
+
const names = (route) => route?.provider === id;
|
|
1135
|
+
if (next.modelSettings) {
|
|
1136
|
+
next.modelSettings = Object.fromEntries(
|
|
1137
|
+
Object.entries(next.modelSettings).filter(([key]) => !key.startsWith(`${id}/`))
|
|
1138
|
+
);
|
|
1139
|
+
}
|
|
1140
|
+
if (next.agents) {
|
|
1141
|
+
next.agents = Object.fromEntries(Object.entries(next.agents).filter(([, route]) => !names(route)));
|
|
1142
|
+
}
|
|
1143
|
+
if (names(next.webSearchRoute)) delete next.webSearchRoute;
|
|
1144
|
+
if (Array.isArray(next.presets)) {
|
|
1145
|
+
const dropped = new Set(next.presets.filter(names).map((preset) => preset.id));
|
|
1146
|
+
next.presets = next.presets.filter((preset) => !names(preset));
|
|
1147
|
+
if (dropped.has(next.default)) delete next.default;
|
|
1148
|
+
}
|
|
1149
|
+
return next;
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1024
1152
|
export async function removeCustomProvider(cfgMod, rawId) {
|
|
1153
|
+
requireLocalProviderManagement();
|
|
1025
1154
|
const id = String(rawId || '').trim();
|
|
1026
1155
|
existingCustomEntry(cfgMod, id);
|
|
1156
|
+
// Secret first: a real keychain failure (locked, permission) leaves the
|
|
1157
|
+
// provider registered so the removal can be retried. A missing secret
|
|
1158
|
+
// (keyless provider) is not an error.
|
|
1159
|
+
await deleteSecretAsync(SECRET_ACCOUNTS.agentApiKey(id));
|
|
1027
1160
|
const current = cfgMod.loadConfig();
|
|
1028
1161
|
const { [id]: _removed, ...providers } = current.providers || {};
|
|
1029
|
-
cfgMod.saveConfig({ ...current, providers }, { baseConfig: current });
|
|
1030
|
-
await deleteSecretAsync(SECRET_ACCOUNTS.agentApiKey(id));
|
|
1162
|
+
cfgMod.saveConfig(withoutProviderReferences({ ...current, providers }, id), { baseConfig: current });
|
|
1031
1163
|
return { provider: id, type: 'custom', removed: true };
|
|
1032
1164
|
}
|
|
1033
1165
|
|
|
1034
1166
|
export async function testCustomProvider(cfgMod, rawInput) {
|
|
1167
|
+
requireLocalProviderManagement();
|
|
1035
1168
|
const { id, config, apiKey } = await resolveCustomInput(cfgMod, rawInput, { requireModels: false });
|
|
1036
1169
|
try {
|
|
1037
1170
|
// The first visible manual model needs no discovery; otherwise the first
|
|
@@ -1057,11 +1190,18 @@ export async function testCustomProvider(cfgMod, rawInput) {
|
|
|
1057
1190
|
);
|
|
1058
1191
|
return { ok: true };
|
|
1059
1192
|
} catch (error) {
|
|
1060
|
-
throw sanitizeCustomError(error,
|
|
1193
|
+
throw sanitizeCustomError(error, customSecrets(apiKey, config));
|
|
1061
1194
|
}
|
|
1062
1195
|
}
|
|
1063
1196
|
|
|
1197
|
+
// Every key the operation may have sent: env mode re-reads the variable on an
|
|
1198
|
+
// auth retry, so its current value is redacted alongside the initial key.
|
|
1199
|
+
function customSecrets(apiKey, config) {
|
|
1200
|
+
return [apiKey, config.apiKeyEnv ? process.env[config.apiKeyEnv] : ''];
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1064
1203
|
export async function discoverCustomProviderModels(cfgMod, rawInput) {
|
|
1204
|
+
requireLocalProviderManagement();
|
|
1065
1205
|
const { id, config, apiKey } = await resolveCustomInput(cfgMod, rawInput, { requireModels: false });
|
|
1066
1206
|
try {
|
|
1067
1207
|
const { createCustomProvider } = await loadCustomProviderModule();
|
|
@@ -1070,23 +1210,24 @@ export async function discoverCustomProviderModels(cfgMod, rawInput) {
|
|
|
1070
1210
|
const models = publicCustomModelRows(listed);
|
|
1071
1211
|
// A failed discovery that still left manual rows reports its error too.
|
|
1072
1212
|
const failure = provider.customDiscoveryError;
|
|
1073
|
-
return failure ? { models, error: discoveryErrorView(failure, apiKey) } : { models };
|
|
1213
|
+
return failure ? { models, error: discoveryErrorView(failure, customSecrets(apiKey, config)) } : { models };
|
|
1074
1214
|
} catch (error) {
|
|
1075
|
-
return { models: [], error: discoveryErrorView(error, apiKey) };
|
|
1215
|
+
return { models: [], error: discoveryErrorView(error, customSecrets(apiKey, config)) };
|
|
1076
1216
|
}
|
|
1077
1217
|
}
|
|
1078
1218
|
|
|
1079
|
-
function discoveryErrorView(error,
|
|
1219
|
+
function discoveryErrorView(error, secrets) {
|
|
1080
1220
|
const status = Number.isInteger(error?.status) ? error.status : undefined;
|
|
1081
1221
|
const authKind = status === 401 || status === 403 ? 'authentication' : 'request';
|
|
1082
1222
|
return {
|
|
1083
1223
|
kind: status === 404 || status === 405 ? 'unavailable' : authKind,
|
|
1084
1224
|
...(status === undefined ? {} : { status }),
|
|
1085
|
-
message: sanitizeCustomError(error,
|
|
1225
|
+
message: sanitizeCustomError(error, secrets).message,
|
|
1086
1226
|
};
|
|
1087
1227
|
}
|
|
1088
1228
|
|
|
1089
1229
|
export async function saveOpenAIUsageSessionKey(cfgMod, secret) {
|
|
1230
|
+
requireLocalProviderManagement();
|
|
1090
1231
|
const value = String(secret || '').trim();
|
|
1091
1232
|
if (!value) throw new Error('OpenAI usage session key is required for credit lookup');
|
|
1092
1233
|
await saveSecretAsync(SECRET_ACCOUNTS.openaiUsageSessionKey, value);
|
|
@@ -1095,6 +1236,7 @@ export async function saveOpenAIUsageSessionKey(cfgMod, secret) {
|
|
|
1095
1236
|
}
|
|
1096
1237
|
|
|
1097
1238
|
export async function saveOpenCodeGoUsageAuth(cfgMod, { apiKey } = {}) {
|
|
1239
|
+
requireLocalProviderManagement();
|
|
1098
1240
|
const secret = String(apiKey || '').trim();
|
|
1099
1241
|
if (!secret) throw new Error('OpenCode console API key is required for usage lookup');
|
|
1100
1242
|
// Subscription meters are read with a console service-account key holding the
|
|
@@ -1111,6 +1253,7 @@ export async function saveOpenCodeGoUsageAuth(cfgMod, { apiKey } = {}) {
|
|
|
1111
1253
|
}
|
|
1112
1254
|
|
|
1113
1255
|
export async function forgetProviderAuth(cfgModOrProvider, maybeProvider, requestedAccountId) {
|
|
1256
|
+
requireLocalProviderManagement();
|
|
1114
1257
|
const cfgMod = maybeProvider === undefined ? null : cfgModOrProvider;
|
|
1115
1258
|
const id = String(maybeProvider === undefined ? cfgModOrProvider : maybeProvider || '').trim();
|
|
1116
1259
|
const oauth = availableOAuthProvider(id);
|
|
@@ -16,6 +16,7 @@ function agentOwnedSessionFields(sessionProfile) {
|
|
|
16
16
|
visibility: 'agent-only',
|
|
17
17
|
agentTag: sessionProfile?.agentTag || null,
|
|
18
18
|
taskType: sessionProfile?.taskType || null,
|
|
19
|
+
...(sessionProfile?.routeFallbacks !== undefined ? { routeFallbacks: sessionProfile.routeFallbacks } : {}),
|
|
19
20
|
permission: sessionProfile?.permission || undefined,
|
|
20
21
|
permissionMode: sessionProfile?.permissionMode || undefined,
|
|
21
22
|
schemaAllowedTools: Array.isArray(sessionProfile?.schemaAllowedTools)
|
|
@@ -38,6 +39,10 @@ export function sessionOptions(deps, coreMemoryContext) {
|
|
|
38
39
|
const agentOwned = sessionProfile?.owner === 'agent' || sessionProfile?.visibility === 'agent-only';
|
|
39
40
|
// Agent-owned sessions keep the Active Workflow block only.
|
|
40
41
|
const workflowContext = agentOwned ? packContext : leadWorkflowContext;
|
|
42
|
+
const callerDisallowedTools = [
|
|
43
|
+
...(agentOwned ? [] : LEAD_DISALLOWED_TOOLS),
|
|
44
|
+
...(!agentOwned && rt.disallowDelegation ? ['agent'] : []),
|
|
45
|
+
];
|
|
41
46
|
const sessionOpts = {
|
|
42
47
|
...(rt.reservedSessionId ? { id: rt.reservedSessionId } : {}),
|
|
43
48
|
provider: rt.route.provider,
|
|
@@ -59,11 +64,8 @@ export function sessionOptions(deps, coreMemoryContext) {
|
|
|
59
64
|
...(rt.approvalMode ? { approvalMode: rt.approvalMode } : {}),
|
|
60
65
|
clientHostPid: sessionProfile?.clientHostPid || process.pid,
|
|
61
66
|
mcpScopeId: rt.mcpScopeId,
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
...(!agentOwned && rt.disallowDelegation ? ['agent'] : []),
|
|
65
|
-
...featureDisallowedTools(),
|
|
66
|
-
],
|
|
67
|
+
callerDisallowedTools,
|
|
68
|
+
disallowedTools: [...callerDisallowedTools, ...featureDisallowedTools()],
|
|
67
69
|
cwd: rt.currentCwd,
|
|
68
70
|
...(rt.desktopSession && typeof rt.desktopSession === 'object' ? { desktopSession: rt.desktopSession } : {}),
|
|
69
71
|
coreMemoryContext,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// session-create/session-start-hook.mjs — the SessionStart project hook:
|
|
2
2
|
// best-effort dispatch whose additionalContext lands before the first turn.
|
|
3
3
|
import { runAbortable, throwIfAborted } from '../../runtime/shared/abort-race.mjs';
|
|
4
|
+
import { contextAckMessage } from '../../runtime/agent/orchestrator/session/compact/user-message-kind.mjs';
|
|
4
5
|
|
|
5
6
|
function sessionStartSource(reason) {
|
|
6
7
|
const reasonText = String(reason || '');
|
|
@@ -29,7 +30,7 @@ export async function dispatchSessionStart(deps, reason, signal) {
|
|
|
29
30
|
role: 'user',
|
|
30
31
|
content: `<system-reminder>\n# SessionStart Hook Context\n${startContext.trim()}\n</system-reminder>`,
|
|
31
32
|
});
|
|
32
|
-
rt.session.messages.push(
|
|
33
|
+
rt.session.messages.push(contextAckMessage());
|
|
33
34
|
rt.session.updatedAt = Date.now();
|
|
34
35
|
}
|
|
35
36
|
} catch {
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// A hard-deleted session takes its conversation transcript
|
|
2
|
+
// (`<home>/projects/<slug>/<id>.jsonl`) and the memory ingest read positions
|
|
3
|
+
// keyed by that file with it. Registered once per process as a store purge hook:
|
|
4
|
+
// the file removal is synchronous under the delete's commit lock, the offset
|
|
5
|
+
// removal is a best-effort request to the memory service.
|
|
6
|
+
import { registerSessionPurgeHook } from '../runtime/agent/orchestrator/session/store.mjs';
|
|
7
|
+
import { mixdogHome } from '../runtime/shared/plugin-paths.mjs';
|
|
8
|
+
import { purgeSessionTranscripts } from '../runtime/shared/transcript-writer/purge.mjs';
|
|
9
|
+
|
|
10
|
+
const logError = (message) => {
|
|
11
|
+
try {
|
|
12
|
+
process.stderr.write(`mixdog: transcript-purge: ${message}\n`);
|
|
13
|
+
} catch {
|
|
14
|
+
/* logging is best effort */
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** @param {{ forgetOffsets?: (transcriptPaths: string[]) => Promise<unknown> }} options */
|
|
19
|
+
export function registerTranscriptPurgeHook({ forgetOffsets } = {}) {
|
|
20
|
+
return registerSessionPurgeHook((sessionId, context) => {
|
|
21
|
+
const transcriptPaths = purgeSessionTranscripts({
|
|
22
|
+
mixdogHome: mixdogHome(),
|
|
23
|
+
sessionId,
|
|
24
|
+
cwds: context?.cwds,
|
|
25
|
+
onError: (target, error) => logError(`could not remove ${target}: ${error?.message || error}`),
|
|
26
|
+
});
|
|
27
|
+
if (!transcriptPaths.length || typeof forgetOffsets !== 'function') return;
|
|
28
|
+
Promise.resolve()
|
|
29
|
+
.then(() => forgetOffsets(transcriptPaths))
|
|
30
|
+
.catch((error) => logError(`could not drop ingest offsets of ${sessionId}: ${error?.message || error}`));
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Session transcript writer: every
|
|
1
|
+
// Session transcript writer: every session owns a
|
|
2
2
|
// conversation JSONL that the always-on memory watcher tails. The mutable
|
|
3
3
|
// runtime-core locals it needs are injected as accessors.
|
|
4
4
|
import { createTranscriptWriter } from '../runtime/shared/transcript-writer.mjs';
|
|
@@ -20,12 +20,10 @@ export function createSessionTranscript({ getSession, getCwd }) {
|
|
|
20
20
|
ensureSessionTranscriptWriter,
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
-
//
|
|
24
|
-
// memory watcher tails this same file. Agent-owned sessions stay out of the
|
|
25
|
-
// user's recall pool and generate a session-local handoff when compacting.
|
|
23
|
+
// Agent conversations use the same writer but remain outside memory ingestion.
|
|
26
24
|
function ensureSessionTranscriptWriter() {
|
|
27
25
|
const session = getSession();
|
|
28
|
-
if (!session?.id
|
|
26
|
+
if (!session?.id) return false;
|
|
29
27
|
const cwd = getCwd();
|
|
30
28
|
const key = `${session.id}\u0000${cwd}`;
|
|
31
29
|
if (writerKey !== key) {
|
|
@@ -35,6 +33,7 @@ export function createSessionTranscript({ getSession, getCwd }) {
|
|
|
35
33
|
sessionId: session.id,
|
|
36
34
|
cwd,
|
|
37
35
|
pid: process.pid,
|
|
36
|
+
memoryEligible: !isAgentOwner(session),
|
|
38
37
|
});
|
|
39
38
|
writerKey = key;
|
|
40
39
|
} catch (error) {
|
|
@@ -1,40 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* src/session-runtime/session-turn-api.mjs - turn execution (ask) plus the
|
|
3
|
-
* between-turn session
|
|
3
|
+
* between-turn session and agent/tool-surface commands. Stateless
|
|
4
4
|
* helpers are imported by the groups; the runtime injects live
|
|
5
5
|
* getters/setters for the mutable session/mode/turn-counter/transcript-writer
|
|
6
6
|
* locals plus the closure callbacks.
|
|
7
7
|
*/
|
|
8
8
|
import { createTurnRunner } from './turn/turn-run.mjs';
|
|
9
9
|
import { createSessionOps } from './turn/session-ops.mjs';
|
|
10
|
-
import {
|
|
10
|
+
import { createCompactionGate } from './turn/compaction-gate.mjs';
|
|
11
11
|
import { createAgentOps } from './turn/agent-ops.mjs';
|
|
12
|
+
import { createSideQuestionOps } from './turn/side-question-ops.mjs';
|
|
12
13
|
|
|
13
14
|
export function createSessionTurnApi(deps) {
|
|
14
|
-
|
|
15
|
+
// A model-scheduled compaction runs chained after its turn; the next turn
|
|
16
|
+
// and any manual compact/clear/rewind wait on it so nothing races it.
|
|
17
|
+
const gate = createCompactionGate({ getSessionId: () => deps.getSession()?.id, compact: () => session.compact() });
|
|
18
|
+
const afterCompaction = gate.after;
|
|
19
|
+
const runner = createTurnRunner({ ...deps, runPendingCompact: gate.run });
|
|
15
20
|
const session = createSessionOps(deps);
|
|
16
|
-
const share = createShareOps(deps);
|
|
17
21
|
const agent = createAgentOps(deps);
|
|
22
|
+
const side = createSideQuestionOps(deps);
|
|
18
23
|
return {
|
|
19
|
-
|
|
24
|
+
askSide: side.askSide,
|
|
25
|
+
cancelSide: side.cancelSide,
|
|
20
26
|
getTurnLiveness: runner.getTurnLiveness,
|
|
21
|
-
ask: runner.ask,
|
|
22
|
-
clear: session.clear,
|
|
23
|
-
rewindMessages: session.rewindMessages,
|
|
24
|
-
compact: session.compact,
|
|
27
|
+
ask: afterCompaction(runner.ask),
|
|
28
|
+
clear: afterCompaction(session.clear),
|
|
29
|
+
rewindMessages: afterCompaction(session.rewindMessages),
|
|
30
|
+
compact: afterCompaction(session.compact),
|
|
25
31
|
setToolMode: session.setToolMode,
|
|
26
32
|
agentStatus: session.agentStatus,
|
|
27
33
|
interruptTaskWait: session.interruptTaskWait,
|
|
28
34
|
readModelMessages: session.readModelMessages,
|
|
29
35
|
onAgentStatusChange: session.onAgentStatusChange,
|
|
30
|
-
takeRemoteInjections: share.takeRemoteInjections,
|
|
31
|
-
pendingSpoolPath: share.pendingSpoolPath,
|
|
32
|
-
publishSessionPresence: share.publishSessionPresence,
|
|
33
|
-
clearSessionPresence: share.clearSessionPresence,
|
|
34
|
-
sessionOwnerGone: share.sessionOwnerGone,
|
|
35
36
|
agentControl: agent.agentControl,
|
|
36
37
|
taskControl: agent.taskControl,
|
|
37
38
|
stopShellJob: agent.stopShellJob,
|
|
39
|
+
releaseShellJob: agent.releaseShellJob,
|
|
40
|
+
listShellJobs: agent.listShellJobs,
|
|
38
41
|
onNotification: agent.onNotification,
|
|
39
42
|
toolsStatus: agent.toolsStatus,
|
|
40
43
|
selectTools: agent.selectTools,
|
|
@@ -9,10 +9,7 @@ import {
|
|
|
9
9
|
} from '../runtime/agent/orchestrator/runtime-core/builtin-features.mjs';
|
|
10
10
|
import { featureEnvOverride, moduleEnabled } from '../runtime/agent/orchestrator/runtime-core/config-helpers.mjs';
|
|
11
11
|
import { LOCAL_PROVIDER_ID } from '../runtime/local-provider/managed-runtime.mjs';
|
|
12
|
-
import {
|
|
13
|
-
INSTRUCTION_FILES_MODES,
|
|
14
|
-
normalizeInstructionFilesMode,
|
|
15
|
-
} from '../runtime/shared/instruction-files-mode.mjs';
|
|
12
|
+
import { INSTRUCTION_FILES_MODES, normalizeInstructionFilesMode } from '../runtime/shared/instruction-files-mode.mjs';
|
|
16
13
|
import { getEmbeddingInfo } from '../runtime/memory/lib/embedding-provider.mjs';
|
|
17
14
|
import { onnxRuntimeSupported } from '../runtime/shared/onnx-runtime-support.mjs';
|
|
18
15
|
import {
|
|
@@ -24,7 +21,7 @@ import {
|
|
|
24
21
|
shutdownEffortJudge,
|
|
25
22
|
} from '../runtime/effort-judge/judge-client.mjs';
|
|
26
23
|
|
|
27
|
-
const TOGGLEABLE_BUILTINS = ['git', 'office', 'tidy', 'localProvider', 'autoEffort', 'visualize'];
|
|
24
|
+
const TOGGLEABLE_BUILTINS = ['git', 'office', 'tidy', 'localProvider', 'autoEffort', 'visualize', 'media'];
|
|
28
25
|
|
|
29
26
|
function setLocalProviderEnabledInConfig(configLike, enabled) {
|
|
30
27
|
const next = { ...(configLike || {}) };
|
|
@@ -79,6 +76,15 @@ export function createBuiltinToolSettings(
|
|
|
79
76
|
invalidateContextStatusCache();
|
|
80
77
|
return this.getRecapSettings();
|
|
81
78
|
},
|
|
79
|
+
// Whether the model may title the session (session tool, action=rename).
|
|
80
|
+
// Absent config means on; only the opt-out is stored.
|
|
81
|
+
getSessionTitleSettings() {
|
|
82
|
+
return { aiSessionTitles: getConfig()?.aiSessionTitles !== false };
|
|
83
|
+
},
|
|
84
|
+
setAiSessionTitles(enabled) {
|
|
85
|
+
saveConfigAndAdopt({ ...getConfig(), aiSessionTitles: enabled !== false });
|
|
86
|
+
return this.getSessionTitleSettings();
|
|
87
|
+
},
|
|
82
88
|
getToolModuleSettings() {
|
|
83
89
|
const config = getConfig();
|
|
84
90
|
const localProvider = getLocalProviderStatus?.() || {};
|
|
@@ -104,6 +110,12 @@ export function createBuiltinToolSettings(
|
|
|
104
110
|
enabled: featureEnvOverride('MIXDOG_FEATURE_VISUALIZE') ?? moduleEnabled(config, 'visualize', true),
|
|
105
111
|
installed: true,
|
|
106
112
|
},
|
|
113
|
+
// Image and video generation ships with the runtime and is on unless
|
|
114
|
+
// switched off; the image/video skills follow it (`requires: media`).
|
|
115
|
+
media: {
|
|
116
|
+
enabled: featureEnvOverride('MIXDOG_FEATURE_MEDIA') ?? moduleEnabled(config, 'media', true),
|
|
117
|
+
installed: true,
|
|
118
|
+
},
|
|
107
119
|
localProvider: {
|
|
108
120
|
...localProvider,
|
|
109
121
|
...localSettings.status(),
|
|
@@ -159,7 +171,7 @@ export function createBuiltinToolSettings(
|
|
|
159
171
|
},
|
|
160
172
|
async setBuiltinToolEnabled(name, enabled) {
|
|
161
173
|
if (!TOGGLEABLE_BUILTINS.includes(name)) {
|
|
162
|
-
throw new TypeError('Built-in tool must be git, office, tidy, localProvider, autoEffort, or
|
|
174
|
+
throw new TypeError('Built-in tool must be git, office, tidy, localProvider, autoEffort, visualize, or media.');
|
|
163
175
|
}
|
|
164
176
|
if (name === 'autoEffort' && enabled !== false && !onnxRuntimeSupported()) {
|
|
165
177
|
throw new Error(EFFORT_JUDGE_UNSUPPORTED);
|