mixdog 1.2.1 → 1.2.3
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 +19 -3
- package/scripts/model-catalog-audit.mjs +1 -15
- package/scripts/provider-pingpong-live.mjs +509 -0
- package/src/agents/advisor/AGENT.md +1 -1
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/reviewer/AGENT.md +3 -3
- package/src/agents/reviewer/agent.json +1 -1
- package/src/defaults/shipped-history.json +6 -0
- 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 +7 -4
- package/src/output-styles/common.md +11 -10
- package/src/repl/slash-commands.mjs +16 -1
- package/src/rules/agent/AGENT.md +5 -5
- package/src/rules/lead/LEAD.md +5 -5
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -4
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +10 -0
- 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/client-config.mjs +36 -7
- package/src/runtime/agent/orchestrator/mcp/client-handshake.mjs +49 -10
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +40 -3
- package/src/runtime/agent/orchestrator/mcp/client.mjs +230 -96
- package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +103 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +150 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +111 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +87 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +95 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-request.mjs +122 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-shared.mjs +9 -0
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +229 -0
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +188 -29
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +94 -31
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +98 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-fast-mode.mjs +39 -18
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +55 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +48 -37
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +10 -7
- package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +18 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +13 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-midstream.mjs +10 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-recovery.mjs +23 -9
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +46 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request.mjs +14 -9
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +102 -45
- package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +69 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-server-fallback.mjs +4 -0
- 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 +10 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +40 -7
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +30 -9
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +88 -21
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +30 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +106 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +10 -61
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +94 -15
- 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 +75 -10
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +97 -2
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +103 -23
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +43 -2
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +103 -33
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +32 -6
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +27 -3
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +64 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +70 -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 +80 -18
- package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +46 -8
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +273 -0
- package/src/runtime/agent/orchestrator/providers/gemini-family.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/gemini-history-signatures.mjs +9 -4
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +180 -0
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +369 -112
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +140 -35
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +70 -24
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +80 -29
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +69 -19
- 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 +246 -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 +388 -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/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 +48 -22
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +119 -18
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +2 -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 +33 -1
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +4 -9
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +123 -61
- 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 +27 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +37 -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 +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +50 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +47 -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 +151 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +64 -23
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +79 -33
- 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 +172 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-state.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +144 -15
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +193 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +66 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +109 -26
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +27 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +34 -20
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +23 -4
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +37 -28
- package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +274 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +72 -32
- 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 +43 -15
- 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 +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-stamps.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +7 -3
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +1 -3
- package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +37 -4
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +12 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +22 -2
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +12 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +76 -33
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +44 -16
- package/src/runtime/agent/orchestrator/providers/openai-retry-policy.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -16
- package/src/runtime/agent/orchestrator/providers/openai-ws-handshake.mjs +16 -8
- 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 -35
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/policy.mjs +25 -14
- 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-terminal.mjs +18 -11
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +41 -22
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +170 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +75 -70
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +75 -0
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +720 -0
- package/src/runtime/agent/orchestrator/providers/registry.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/retry-backoff.mjs +46 -7
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +123 -219
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +148 -45
- package/src/runtime/agent/orchestrator/providers/retry-midstream.mjs +81 -16
- 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 +157 -0
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +512 -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 +183 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +100 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +21 -0
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
- package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +0 -18
- package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +57 -28
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +19 -16
- package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +1 -97
- 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 +14 -3
- 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 +176 -71
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +62 -10
- package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +14 -93
- package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +120 -0
- 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/eager-dispatch/admission.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +91 -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 -0
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +21 -10
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +132 -0
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +30 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +104 -19
- package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -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 +15 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +150 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +30 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +11 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +57 -21
- 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 +6 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +5 -10
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +208 -14
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +16 -4
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +25 -3
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +19 -2
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +18 -7
- package/src/runtime/agent/orchestrator/session/manager.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +168 -29
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/side-question.mjs +192 -0
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +17 -3
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +58 -2
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +41 -28
- package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +22 -10
- package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/store.mjs +19 -3
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
- 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 +77 -0
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +20 -1
- package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +12 -15
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +5 -5
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +14 -10
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +49 -34
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
- 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/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/computer-bridge/action-schema.mjs +44 -21
- package/src/runtime/github/tool.mjs +92 -2
- 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/pg/adapter.mjs +98 -1
- package/src/runtime/memory/lib/pg/process.mjs +65 -50
- package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +124 -16
- 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 +2 -2
- package/src/runtime/office/authoring/html-document-author.mjs +2 -0
- package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-measure.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +2 -0
- 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 +98 -0
- package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
- package/src/runtime/office/index.mjs +30 -0
- 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/office/shared/values.mjs +0 -5
- package/src/runtime/shared/background-tasks.mjs +92 -14
- package/src/runtime/shared/bounded-file-read.mjs +13 -0
- package/src/runtime/shared/bounded-line-diff.mjs +182 -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 +31 -0
- package/src/runtime/shared/error-presentation.mjs +159 -19
- 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 +4 -3
- package/src/runtime/shared/llm/anthropic-effort.mjs +129 -134
- package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +50 -14
- package/src/runtime/shared/llm/model-catalog.mjs +53 -40
- package/src/runtime/shared/llm/openai-daybreak.mjs +4 -16
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +11 -0
- package/src/runtime/shared/llm/provider-model-identities.mjs +13 -4
- 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/llm/usage-rollup.mjs +0 -1
- package/src/runtime/shared/loopback-listener.mjs +9 -0
- package/src/runtime/shared/model-display.mjs +13 -0
- package/src/runtime/shared/provider-api-key.mjs +2 -0
- package/src/runtime/shared/quota-resume-store.mjs +11 -0
- package/src/runtime/shared/review-diff.mjs +52 -0
- package/src/runtime/shared/session-baseline-store.mjs +960 -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 +114 -0
- package/src/runtime/shared/statusline/statusline-format.mjs +4 -4
- package/src/runtime/shared/statusline/statusline-segments.mjs +28 -4
- package/src/runtime/shared/task-notification-envelope.mjs +2 -2
- package/src/runtime/shared/tool-card-model/card-header.mjs +6 -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-limit.mjs +4 -0
- package/src/runtime/shared/tool-primitives.mjs +13 -0
- package/src/runtime/shared/tool-result-summary.mjs +8 -1
- package/src/runtime/shared/tool-surface.mjs +18 -3
- package/src/runtime/shared/tool-work-units.mjs +40 -4
- package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
- package/src/runtime/shared/transcript-writer.mjs +10 -2
- package/src/runtime/shared/turn-changes.mjs +670 -274
- package/src/runtime/shared/turn-review-reply.mjs +8 -39
- package/src/runtime/shared/turn-snapshot-store.mjs +94 -2
- package/src/runtime/shared/turn-snapshot.mjs +986 -690
- package/src/runtime/shared/turn-worktree-snapshot.mjs +279 -262
- package/src/runtime/shared/user-data-guard.mjs +262 -49
- package/src/runtime/shared/worktrees/carry.mjs +531 -0
- package/src/runtime/shared/worktrees/contract.mjs +34 -24
- package/src/runtime/shared/worktrees/file-recovery.mjs +68 -0
- package/src/runtime/shared/worktrees/git-head.mjs +205 -0
- package/src/runtime/shared/worktrees/git.mjs +8 -3
- package/src/runtime/shared/worktrees/maintenance.mjs +1 -1
- package/src/runtime/shared/worktrees/manager.mjs +156 -8
- package/src/runtime/shared/worktrees/merge.mjs +31 -21
- package/src/runtime/shared/worktrees/paths.d.mts +6 -0
- package/src/runtime/shared/worktrees/test-support.mjs +19 -4
- package/src/runtime/terminal-bridge/client.mjs +44 -11
- 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 +19 -5
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/infrastructure.mjs +12 -1
- package/src/session-runtime/boot/session.mjs +0 -1
- package/src/session-runtime/boot/tools.mjs +4 -1
- package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +65 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +11 -4
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +115 -18
- package/src/session-runtime/internal-tool-executor.mjs +6 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +188 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
- package/src/session-runtime/lifecycle/session-catalog.mjs +14 -3
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +29 -6
- package/src/session-runtime/lifecycle/teardown.mjs +73 -8
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/connect.mjs +46 -14
- package/src/session-runtime/mcp-glue/server-catalog.mjs +20 -3
- package/src/session-runtime/mcp-glue.mjs +3 -0
- package/src/session-runtime/mcp-oauth-login.mjs +174 -0
- package/src/session-runtime/model-route/model-switch-target.mjs +34 -0
- package/src/session-runtime/model-route/set-route.mjs +85 -17
- package/src/session-runtime/model-route/web-search-route.mjs +1 -1
- package/src/session-runtime/native-web-search/routes.mjs +22 -3
- package/src/session-runtime/native-web-search-usage.mjs +51 -0
- package/src/session-runtime/native-web-search.mjs +10 -1
- 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-models/model-meta.mjs +12 -3
- package/src/session-runtime/quick-model-rows/web-search-rows.mjs +13 -8
- package/src/session-runtime/quick-web-search-models.mjs +13 -38
- package/src/session-runtime/resource-extension-sync.mjs +4 -0
- package/src/session-runtime/resource-mcp-api.mjs +98 -2
- package/src/session-runtime/resource-scope-decorate.mjs +10 -3
- package/src/session-runtime/runtime-review-api.mjs +21 -2
- package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +13 -1
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +7 -2
- 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.mjs +73 -7
- package/src/session-runtime/services/agent-tool/send-flow.mjs +22 -4
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +2 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +22 -5
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +15 -1
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +8 -1
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -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 +46 -7
- package/src/session-runtime/services/agent-tool/worker-rows.mjs +17 -0
- package/src/session-runtime/services/agent-tool.mjs +3 -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 +81 -15
- package/src/session-runtime/session-transcript-purge.mjs +32 -0
- package/src/session-runtime/session-turn-api.mjs +14 -5
- package/src/session-runtime/settings-builtin-tools-api.mjs +9 -0
- package/src/session-runtime/settings-compaction-api.mjs +1 -0
- package/src/session-runtime/setup-tool/executor.mjs +36 -6
- package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +13 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +13 -4
- package/src/session-runtime/skills-api.mjs +3 -5
- package/src/session-runtime/tool-surface.mjs +5 -1
- 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 +22 -0
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +5 -1
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +8 -3
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +10 -0
- package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
- package/src/session-runtime/turn/turn-run.mjs +25 -9
- package/src/session-runtime/usage-stats-api.mjs +43 -11
- package/src/session-runtime/workspace/project-branches.mjs +7 -5
- package/src/session-runtime/workspace/transition-steps.mjs +129 -31
- package/src/session-runtime/workspace/transitions.mjs +190 -15
- package/src/standalone/daemon-agent-control.mjs +9 -1
- package/src/standalone/daemon-drain-policy.mjs +8 -0
- 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 +51 -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 +2 -0
- package/src/standalone/daemon-telemetry.mjs +74 -0
- package/src/standalone/daemon.mjs +64 -8
- package/src/standalone/desktop-service-registry.mjs +5 -0
- package/src/standalone/local-session-runtime.mjs +70 -19
- 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 +1 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +33 -2
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +26 -10
- package/src/standalone/session-service/agent-tree.mjs +12 -0
- package/src/standalone/session-service/quota-resume.mjs +8 -0
- package/src/standalone/session-service/retention/busy.mjs +15 -1
- package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
- package/src/standalone/session-service-api.mjs +11 -1
- package/src/standalone/session-service.mjs +1 -0
- package/src/standalone/session-state-patch.d.mts +2 -1
- package/src/standalone/session-state-patch.mjs +41 -1
- 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 +1 -0
- package/src/tui/app/btw-controller.mjs +118 -0
- package/src/tui/app/create-app-pickers.mjs +6 -0
- package/src/tui/app/extension-pickers/mcp-login.mjs +107 -0
- package/src/tui/app/extension-pickers/mcp-servers-picker.mjs +2 -1
- package/src/tui/app/extension-pickers.mjs +2 -1
- package/src/tui/app/model-options.mjs +11 -16
- 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 +20 -5
- package/src/tui/app/slash-dispatch/panel-commands.mjs +16 -1
- package/src/tui/app/slash-dispatch/session-commands.mjs +19 -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/StatusLine.jsx +2 -0
- package/src/tui/components/question-panel-model.mjs +156 -0
- package/src/tui/components/status-line/local-line.mjs +5 -2
- package/src/tui/components/status-line/use-statusline-text.mjs +7 -1
- package/src/tui/dist/index.mjs +3221 -1500
- package/src/tui/session/context-state.mjs +4 -2
- package/src/tui/session/quota-resume.mjs +46 -14
- package/src/tui/session/session-api/commands.mjs +43 -24
- package/src/tui/session/session-api/controls.mjs +2 -2
- package/src/tui/session/session-api/extensions.mjs +22 -0
- package/src/tui/session/session-api/integrations.mjs +16 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle.mjs +7 -2
- package/src/tui/session/session-api/routes.mjs +71 -7
- package/src/tui/session/session-api/settings.mjs +11 -14
- package/src/tui/session/session-api.mjs +1 -0
- package/src/tui/session/session-flow/drain.mjs +7 -1
- package/src/tui/session/session-flow/failed-turn-rewind.mjs +10 -4
- package/src/tui/session/tool-approval.mjs +10 -7
- package/src/tui/session/transcript-spill.mjs +14 -7
- package/src/tui/session/turn-stream.mjs +174 -31
- package/src/tui/session/turn.mjs +46 -16
- package/src/tui/statusline-ansi-bridge.mjs +1 -1
- package/src/ui/statusline-agents.mjs +15 -4
- package/src/ui/statusline.mjs +7 -3
- package/src/ui/streaming-markdown-heal.mjs +34 -3
- package/src/vendor/statusline/src/gateway/claude-current.mjs +14 -4
- package/src/workflows/default/WORKFLOW.md +3 -1
- package/src/runtime/memory/lib/memory-session-merge.mjs +0 -32
- package/src/runtime/shared/llm/usage-session-history.mjs +0 -266
|
@@ -94,6 +94,7 @@ import {
|
|
|
94
94
|
} from '../../runtime/shared/provider-accounts.mjs';
|
|
95
95
|
import { currentProviderAccountId, withProviderAccount } from '../../runtime/shared/provider-auth-binding.mjs';
|
|
96
96
|
import {
|
|
97
|
+
CUSTOM_API_KEY_ENV_RE,
|
|
97
98
|
effectiveCustomModelRows,
|
|
98
99
|
normalizeCustomProviderConfig as normalizeStoredCustomConfig,
|
|
99
100
|
} from '../../runtime/agent/orchestrator/providers/custom-provider-config.mjs';
|
|
@@ -439,14 +440,22 @@ function customProviderRow(id, entry, checkSecrets = true) {
|
|
|
439
440
|
const { config, error: configError } = inspectStoredCustomConfig(entry);
|
|
440
441
|
const configuredEnabled = entry.enabled !== false;
|
|
441
442
|
const keyless = (config?.auth ?? entry.auth) === 'none';
|
|
443
|
+
const apiKeyEnv = keyless ? '' : config?.apiKeyEnv || '';
|
|
444
|
+
const envSet = Boolean(apiKeyEnv && process.env[apiKeyEnv]);
|
|
442
445
|
const stored = checkSecrets ? hasStoredSecret(SECRET_ACCOUNTS.agentApiKey(id)) : false;
|
|
443
446
|
const unstoredStatus = configuredEnabled ? 'No Key' : 'Off';
|
|
444
447
|
let status = stored ? 'Set' : unstoredStatus;
|
|
445
448
|
let detail = stored ? 'stored in keychain' : 'custom endpoint';
|
|
449
|
+
if (apiKeyEnv) {
|
|
450
|
+
status = envSet ? 'Env' : unstoredStatus;
|
|
451
|
+
detail = apiKeyEnv;
|
|
452
|
+
}
|
|
446
453
|
if (keyless) {
|
|
447
454
|
status = configuredEnabled ? 'Keyless' : 'Off';
|
|
448
455
|
detail = 'no API key required';
|
|
449
456
|
}
|
|
457
|
+
let keyAuthenticated = checkSecrets ? stored : configuredEnabled;
|
|
458
|
+
if (apiKeyEnv) keyAuthenticated = envSet;
|
|
450
459
|
const row = {
|
|
451
460
|
id,
|
|
452
461
|
name: entry.name,
|
|
@@ -457,17 +466,20 @@ function customProviderRow(id, entry, checkSecrets = true) {
|
|
|
457
466
|
group: 'api',
|
|
458
467
|
type: 'api-key',
|
|
459
468
|
enabled: configuredEnabled,
|
|
460
|
-
authenticated: keyless ||
|
|
469
|
+
authenticated: keyless || keyAuthenticated,
|
|
461
470
|
stored,
|
|
462
|
-
env:
|
|
463
|
-
envName: null,
|
|
471
|
+
env: envSet,
|
|
472
|
+
envName: apiKeyEnv || null,
|
|
464
473
|
status,
|
|
465
474
|
detail,
|
|
466
475
|
};
|
|
476
|
+
if (apiKeyEnv) row.apiKeyEnv = apiKeyEnv;
|
|
467
477
|
row.schemaVersion = config?.schemaVersion ?? entry.schemaVersion;
|
|
468
478
|
row.auth = keyless ? 'none' : 'key';
|
|
469
479
|
row.discovery = structuredClone(config?.discovery ?? entry.discovery ?? { newModelsHidden: false });
|
|
470
480
|
row.modelOverrides = structuredClone(config?.modelOverrides ?? entry.modelOverrides ?? {});
|
|
481
|
+
if (config?.wires) row.wires = [...config.wires];
|
|
482
|
+
if (config?.modelWires) row.modelWires = { ...config.modelWires };
|
|
471
483
|
// A stored config that does not normalize cannot run (the registry skips
|
|
472
484
|
// it): say so explicitly instead of listing it as connected.
|
|
473
485
|
// Every readiness flag consumers read says "not ready" (`stored` stays the
|
|
@@ -547,8 +559,8 @@ export function providerStatus(config = {}) {
|
|
|
547
559
|
enabled: row.enabled,
|
|
548
560
|
authenticated: row.authenticated,
|
|
549
561
|
stored: row.stored,
|
|
550
|
-
env:
|
|
551
|
-
envName:
|
|
562
|
+
env: row.env,
|
|
563
|
+
envName: row.envName,
|
|
552
564
|
label: row.name,
|
|
553
565
|
})),
|
|
554
566
|
...availableOAuthProviders().map((p) => oauthProviderStatusRow(p, config)),
|
|
@@ -867,6 +879,20 @@ function validateCustomTransportFields(input) {
|
|
|
867
879
|
throw new TypeError('custom provider id is invalid');
|
|
868
880
|
if (input.apiKey !== undefined && (typeof input.apiKey !== 'string' || input.apiKey.length > CUSTOM_API_KEY_MAX))
|
|
869
881
|
throw new TypeError('custom provider apiKey is invalid');
|
|
882
|
+
if (input.apiKeyEnv !== undefined && input.apiKeyEnv !== null) {
|
|
883
|
+
if (typeof input.apiKeyEnv !== 'string' || !CUSTOM_API_KEY_ENV_RE.test(input.apiKeyEnv))
|
|
884
|
+
throw new TypeError('custom provider apiKeyEnv is invalid');
|
|
885
|
+
if (input.auth === 'none') throw new TypeError('custom provider apiKeyEnv requires key auth');
|
|
886
|
+
if (typeof input.apiKey === 'string' && input.apiKey !== '')
|
|
887
|
+
throw new TypeError('custom provider apiKey and apiKeyEnv are mutually exclusive');
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
/** Whether the named environment variable is set to a non-empty value. */
|
|
892
|
+
export function checkCustomProviderKeyEnv(name) {
|
|
893
|
+
if (typeof name !== 'string' || !CUSTOM_API_KEY_ENV_RE.test(name))
|
|
894
|
+
throw new TypeError('environment variable name is invalid');
|
|
895
|
+
return { found: Boolean(process.env[name]) };
|
|
870
896
|
}
|
|
871
897
|
|
|
872
898
|
function inputObject(input) {
|
|
@@ -886,9 +912,16 @@ function withStoredSettings(input, entry) {
|
|
|
886
912
|
}
|
|
887
913
|
const out = { ...input };
|
|
888
914
|
if (out.auth === undefined) out.auth = stored.auth;
|
|
915
|
+
if (out.apiKeyEnv === undefined && stored.apiKeyEnv) out.apiKeyEnv = stored.apiKeyEnv;
|
|
889
916
|
if (out.schemaVersion === stored.schemaVersion) {
|
|
890
917
|
if (out.discovery === undefined) out.discovery = stored.discovery;
|
|
891
918
|
if (out.modelOverrides === undefined) out.modelOverrides = stored.modelOverrides;
|
|
919
|
+
// Served wires and per-model wires have no setup field yet: an edit on
|
|
920
|
+
// the same protocol keeps them (another protocol serves other wires).
|
|
921
|
+
if ((out.protocol ?? stored.protocol) === stored.protocol) {
|
|
922
|
+
if (out.wires === undefined && stored.wires) out.wires = stored.wires;
|
|
923
|
+
if (out.modelWires === undefined && stored.modelWires) out.modelWires = stored.modelWires;
|
|
924
|
+
}
|
|
892
925
|
}
|
|
893
926
|
return out;
|
|
894
927
|
}
|
|
@@ -904,9 +937,11 @@ async function resolveCustomInput(cfgMod, rawInput, options) {
|
|
|
904
937
|
const config = normalizeCustomProviderConfig(input, options);
|
|
905
938
|
const typed = typeof input.apiKey === 'string' ? input.apiKey.trim() : '';
|
|
906
939
|
const keyless = config.auth === 'none';
|
|
940
|
+
const envName = keyless ? '' : config.apiKeyEnv || '';
|
|
907
941
|
let apiKey = '';
|
|
908
|
-
if (
|
|
909
|
-
|
|
942
|
+
if (envName) apiKey = process.env[envName] || '';
|
|
943
|
+
else if (!keyless) apiKey = typed || (id ? getAgentApiKey(id) || '' : '');
|
|
944
|
+
return { id, config, typed: keyless || envName ? '' : typed, apiKey, keyless, envName };
|
|
910
945
|
}
|
|
911
946
|
|
|
912
947
|
export async function saveCustomProvider(cfgMod, rawInput) {
|
|
@@ -916,8 +951,9 @@ export async function saveCustomProvider(cfgMod, rawInput) {
|
|
|
916
951
|
typed,
|
|
917
952
|
apiKey,
|
|
918
953
|
keyless,
|
|
954
|
+
envName,
|
|
919
955
|
} = await resolveCustomInput(cfgMod, rawInput, { requireModels: false });
|
|
920
|
-
if (!keyless && !apiKey) throw new Error('API key is required');
|
|
956
|
+
if (!keyless && !envName && !apiKey) throw new Error('API key is required');
|
|
921
957
|
const id = existingId || `custom-${randomUUID()}`;
|
|
922
958
|
const entry = { ...config, type: 'custom', enabled: config.enabled !== false };
|
|
923
959
|
const account = SECRET_ACCOUNTS.agentApiKey(id);
|
|
@@ -1021,13 +1057,37 @@ export async function updateCustomProviderModel(cfgMod, rawId, rawModelId, patch
|
|
|
1021
1057
|
return customProviderRow(id, saved);
|
|
1022
1058
|
}
|
|
1023
1059
|
|
|
1060
|
+
// Drops every stored model setting and route that names the provider.
|
|
1061
|
+
function withoutProviderReferences(config, id) {
|
|
1062
|
+
const next = { ...config };
|
|
1063
|
+
const names = (route) => route?.provider === id;
|
|
1064
|
+
if (next.modelSettings) {
|
|
1065
|
+
next.modelSettings = Object.fromEntries(
|
|
1066
|
+
Object.entries(next.modelSettings).filter(([key]) => !key.startsWith(`${id}/`))
|
|
1067
|
+
);
|
|
1068
|
+
}
|
|
1069
|
+
if (next.agents) {
|
|
1070
|
+
next.agents = Object.fromEntries(Object.entries(next.agents).filter(([, route]) => !names(route)));
|
|
1071
|
+
}
|
|
1072
|
+
if (names(next.webSearchRoute)) delete next.webSearchRoute;
|
|
1073
|
+
if (Array.isArray(next.presets)) {
|
|
1074
|
+
const dropped = new Set(next.presets.filter(names).map((preset) => preset.id));
|
|
1075
|
+
next.presets = next.presets.filter((preset) => !names(preset));
|
|
1076
|
+
if (dropped.has(next.default)) delete next.default;
|
|
1077
|
+
}
|
|
1078
|
+
return next;
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1024
1081
|
export async function removeCustomProvider(cfgMod, rawId) {
|
|
1025
1082
|
const id = String(rawId || '').trim();
|
|
1026
1083
|
existingCustomEntry(cfgMod, id);
|
|
1084
|
+
// Secret first: a real keychain failure (locked, permission) leaves the
|
|
1085
|
+
// provider registered so the removal can be retried. A missing secret
|
|
1086
|
+
// (keyless provider) is not an error.
|
|
1087
|
+
await deleteSecretAsync(SECRET_ACCOUNTS.agentApiKey(id));
|
|
1027
1088
|
const current = cfgMod.loadConfig();
|
|
1028
1089
|
const { [id]: _removed, ...providers } = current.providers || {};
|
|
1029
|
-
cfgMod.saveConfig({ ...current, providers }, { baseConfig: current });
|
|
1030
|
-
await deleteSecretAsync(SECRET_ACCOUNTS.agentApiKey(id));
|
|
1090
|
+
cfgMod.saveConfig(withoutProviderReferences({ ...current, providers }, id), { baseConfig: current });
|
|
1031
1091
|
return { provider: id, type: 'custom', removed: true };
|
|
1032
1092
|
}
|
|
1033
1093
|
|
|
@@ -1057,10 +1117,16 @@ export async function testCustomProvider(cfgMod, rawInput) {
|
|
|
1057
1117
|
);
|
|
1058
1118
|
return { ok: true };
|
|
1059
1119
|
} catch (error) {
|
|
1060
|
-
throw sanitizeCustomError(error,
|
|
1120
|
+
throw sanitizeCustomError(error, customSecrets(apiKey, config));
|
|
1061
1121
|
}
|
|
1062
1122
|
}
|
|
1063
1123
|
|
|
1124
|
+
// Every key the operation may have sent: env mode re-reads the variable on an
|
|
1125
|
+
// auth retry, so its current value is redacted alongside the initial key.
|
|
1126
|
+
function customSecrets(apiKey, config) {
|
|
1127
|
+
return [apiKey, config.apiKeyEnv ? process.env[config.apiKeyEnv] : ''];
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1064
1130
|
export async function discoverCustomProviderModels(cfgMod, rawInput) {
|
|
1065
1131
|
const { id, config, apiKey } = await resolveCustomInput(cfgMod, rawInput, { requireModels: false });
|
|
1066
1132
|
try {
|
|
@@ -1070,19 +1136,19 @@ export async function discoverCustomProviderModels(cfgMod, rawInput) {
|
|
|
1070
1136
|
const models = publicCustomModelRows(listed);
|
|
1071
1137
|
// A failed discovery that still left manual rows reports its error too.
|
|
1072
1138
|
const failure = provider.customDiscoveryError;
|
|
1073
|
-
return failure ? { models, error: discoveryErrorView(failure, apiKey) } : { models };
|
|
1139
|
+
return failure ? { models, error: discoveryErrorView(failure, customSecrets(apiKey, config)) } : { models };
|
|
1074
1140
|
} catch (error) {
|
|
1075
|
-
return { models: [], error: discoveryErrorView(error, apiKey) };
|
|
1141
|
+
return { models: [], error: discoveryErrorView(error, customSecrets(apiKey, config)) };
|
|
1076
1142
|
}
|
|
1077
1143
|
}
|
|
1078
1144
|
|
|
1079
|
-
function discoveryErrorView(error,
|
|
1145
|
+
function discoveryErrorView(error, secrets) {
|
|
1080
1146
|
const status = Number.isInteger(error?.status) ? error.status : undefined;
|
|
1081
1147
|
const authKind = status === 401 || status === 403 ? 'authentication' : 'request';
|
|
1082
1148
|
return {
|
|
1083
1149
|
kind: status === 404 || status === 405 ? 'unavailable' : authKind,
|
|
1084
1150
|
...(status === undefined ? {} : { status }),
|
|
1085
|
-
message: sanitizeCustomError(error,
|
|
1151
|
+
message: sanitizeCustomError(error, secrets).message,
|
|
1086
1152
|
};
|
|
1087
1153
|
}
|
|
1088
1154
|
|
|
@@ -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
|
+
}
|
|
@@ -7,21 +7,30 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { createTurnRunner } from './turn/turn-run.mjs';
|
|
9
9
|
import { createSessionOps } from './turn/session-ops.mjs';
|
|
10
|
+
import { createCompactionGate } from './turn/compaction-gate.mjs';
|
|
10
11
|
import { createShareOps } from './turn/share-ops.mjs';
|
|
11
12
|
import { createAgentOps } from './turn/agent-ops.mjs';
|
|
13
|
+
import { createSideQuestionOps } from './turn/side-question-ops.mjs';
|
|
12
14
|
|
|
13
15
|
export function createSessionTurnApi(deps) {
|
|
14
|
-
|
|
16
|
+
// A model-scheduled compaction runs chained after its turn; the next turn
|
|
17
|
+
// and any manual compact/clear/rewind wait on it so nothing races it.
|
|
18
|
+
const gate = createCompactionGate({ getSessionId: () => deps.getSession()?.id, compact: () => session.compact() });
|
|
19
|
+
const afterCompaction = gate.after;
|
|
20
|
+
const runner = createTurnRunner({ ...deps, runPendingCompact: gate.run });
|
|
15
21
|
const session = createSessionOps(deps);
|
|
16
22
|
const share = createShareOps(deps);
|
|
17
23
|
const agent = createAgentOps(deps);
|
|
24
|
+
const side = createSideQuestionOps(deps);
|
|
18
25
|
return {
|
|
26
|
+
askSide: side.askSide,
|
|
27
|
+
cancelSide: side.cancelSide,
|
|
19
28
|
enqueueRemoteAttachedPrompt: runner.enqueueRemoteAttachedPrompt,
|
|
20
29
|
getTurnLiveness: runner.getTurnLiveness,
|
|
21
|
-
ask: runner.ask,
|
|
22
|
-
clear: session.clear,
|
|
23
|
-
rewindMessages: session.rewindMessages,
|
|
24
|
-
compact: session.compact,
|
|
30
|
+
ask: afterCompaction(runner.ask),
|
|
31
|
+
clear: afterCompaction(session.clear),
|
|
32
|
+
rewindMessages: afterCompaction(session.rewindMessages),
|
|
33
|
+
compact: afterCompaction(session.compact),
|
|
25
34
|
setToolMode: session.setToolMode,
|
|
26
35
|
agentStatus: session.agentStatus,
|
|
27
36
|
interruptTaskWait: session.interruptTaskWait,
|
|
@@ -79,6 +79,15 @@ export function createBuiltinToolSettings(
|
|
|
79
79
|
invalidateContextStatusCache();
|
|
80
80
|
return this.getRecapSettings();
|
|
81
81
|
},
|
|
82
|
+
// Whether the model may title the session (session tool, action=rename).
|
|
83
|
+
// Absent config means on; only the opt-out is stored.
|
|
84
|
+
getSessionTitleSettings() {
|
|
85
|
+
return { aiSessionTitles: getConfig()?.aiSessionTitles !== false };
|
|
86
|
+
},
|
|
87
|
+
setAiSessionTitles(enabled) {
|
|
88
|
+
saveConfigAndAdopt({ ...getConfig(), aiSessionTitles: enabled !== false });
|
|
89
|
+
return this.getSessionTitleSettings();
|
|
90
|
+
},
|
|
82
91
|
getToolModuleSettings() {
|
|
83
92
|
const config = getConfig();
|
|
84
93
|
const localProvider = getLocalProviderStatus?.() || {};
|
|
@@ -82,6 +82,7 @@ export function createCompactionSettings({
|
|
|
82
82
|
const next = { ...current };
|
|
83
83
|
if (hasOwn(input, 'auto')) next.auto = input.auto !== false;
|
|
84
84
|
if (hasOwn(input, 'enabled')) next.auto = input.enabled !== false;
|
|
85
|
+
if (hasOwn(input, 'onModelChange')) next.onModelChange = input.onModelChange !== false;
|
|
85
86
|
// Legacy Compact type fields are intentionally ignored. There is one
|
|
86
87
|
// fresh-context Compact contract for every session.
|
|
87
88
|
// A new budget representation replaces the previous one. Otherwise a
|
|
@@ -92,6 +92,7 @@ function routeInput(source) {
|
|
|
92
92
|
if (clean(source.model)) next.model = clean(source.model);
|
|
93
93
|
if (clean(source.effort)) next.effort = clean(source.effort);
|
|
94
94
|
if (typeof source.fast === 'boolean') next.fast = source.fast;
|
|
95
|
+
if (typeof source.autoEffort === 'boolean') next.autoEffort = source.autoEffort;
|
|
95
96
|
if (Object.hasOwn(source, 'modelParameters')) next.modelParameters = { ...source.modelParameters };
|
|
96
97
|
if (Object.hasOwn(source, 'contextPercent')) next.contextPercent = source.contextPercent;
|
|
97
98
|
if (Object.hasOwn(source, 'contextTokens')) next.contextTokens = source.contextTokens;
|
|
@@ -141,6 +142,34 @@ function publicProviderRows(setup) {
|
|
|
141
142
|
};
|
|
142
143
|
}
|
|
143
144
|
|
|
145
|
+
/** Minimal provider rows for the model: only providers with a credential (or
|
|
146
|
+
* one needing re-authentication), counts instead of account rosters. */
|
|
147
|
+
function configuredProviderRows(rows, accountCount) {
|
|
148
|
+
const providers = [];
|
|
149
|
+
let notConfigured = 0;
|
|
150
|
+
for (const [kind, list] of [
|
|
151
|
+
['api', rows.api],
|
|
152
|
+
['oauth', rows.oauth],
|
|
153
|
+
['local', rows.local],
|
|
154
|
+
]) {
|
|
155
|
+
for (const row of list) {
|
|
156
|
+
if (!row.authenticated && !row.reauthRequired) {
|
|
157
|
+
notConfigured += 1;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
providers.push({
|
|
161
|
+
id: row.id,
|
|
162
|
+
kind,
|
|
163
|
+
authenticated: row.authenticated,
|
|
164
|
+
status: row.status,
|
|
165
|
+
...(row.reauthRequired ? { reauthRequired: true } : {}),
|
|
166
|
+
...(kind === 'oauth' ? { accounts: row.authenticated ? accountCount(row.id) : 0 } : {}),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return { ...(rows.pendingSecrets ? { pendingSecrets: true } : {}), providers, notConfigured };
|
|
171
|
+
}
|
|
172
|
+
|
|
144
173
|
/** OAuth account roster without usage meters or provider-side identities. */
|
|
145
174
|
function publicAccounts(pool) {
|
|
146
175
|
return {
|
|
@@ -300,8 +329,9 @@ const SETUP_STATUS_READERS = {
|
|
|
300
329
|
'local-provider': (rt) => rt.getToolModuleSettings().localProvider,
|
|
301
330
|
features: (rt, { getConfig }) => featureStatus(rt, getConfig),
|
|
302
331
|
shell: (rt) => rt.getSystemShell?.() || {},
|
|
303
|
-
providers: async (rt) => {
|
|
332
|
+
providers: async (rt, { detail }) => {
|
|
304
333
|
const rows = publicProviderRows(await rt.getProviderSetup?.({}));
|
|
334
|
+
if (!detail) return configuredProviderRows(rows, (id) => rt.getProviderAccounts(id).accounts.length);
|
|
305
335
|
rows.oauth = rows.oauth.map((row) =>
|
|
306
336
|
row.authenticated ? { ...row, accounts: publicAccounts(rt.getProviderAccounts(row.id)) } : row
|
|
307
337
|
);
|
|
@@ -339,7 +369,7 @@ function validateSetupInput(args) {
|
|
|
339
369
|
if (action !== 'set_agent_route' && Object.hasOwn(args.route, 'disabled')) {
|
|
340
370
|
throw new Error('route.disabled is only accepted by set_agent_route');
|
|
341
371
|
}
|
|
342
|
-
for (const field of ['contextPercent', 'contextTokens']) {
|
|
372
|
+
for (const field of ['contextPercent', 'contextTokens', 'autoEffort']) {
|
|
343
373
|
if (action !== 'set_route' && action !== 'set_agent_route' && Object.hasOwn(args.route, field)) {
|
|
344
374
|
throw new Error(`route.${field} is only accepted by set_route and set_agent_route`);
|
|
345
375
|
}
|
|
@@ -401,7 +431,7 @@ const SETUP_ACTION_HANDLERS = {
|
|
|
401
431
|
status: async (_rt, args, { readStatus, requestDesktop }) => {
|
|
402
432
|
const domain = clean(args.domain) || 'summary';
|
|
403
433
|
requireEnum(domain, SETUP_STATUS_DOMAINS, 'domain');
|
|
404
|
-
return { domain, ...(await readStatus(domain, requestDesktop)) };
|
|
434
|
+
return { domain, ...(await readStatus(domain, requestDesktop, args.detail === true)) };
|
|
405
435
|
},
|
|
406
436
|
open: (_rt, args, { openSurface }) => openSurface(args.target),
|
|
407
437
|
set_route: async (rt, args) => {
|
|
@@ -631,11 +661,11 @@ export function createSetupToolExecutor({ getApi, getConfig, notifySessionUi, ge
|
|
|
631
661
|
return facade;
|
|
632
662
|
};
|
|
633
663
|
|
|
634
|
-
async function readStatus(domain, requestDesktop) {
|
|
664
|
+
async function readStatus(domain, requestDesktop, detail) {
|
|
635
665
|
const rt = api();
|
|
636
666
|
if (SETUP_DESKTOP_DOMAINS.includes(domain)) return requestDesktop({ action: 'status', domain });
|
|
637
667
|
if (!Object.hasOwn(SETUP_STATUS_READERS, domain)) throw new Error(`setup: unknown status domain "${domain}"`);
|
|
638
|
-
return SETUP_STATUS_READERS[domain](rt, { domain, getConfig: () => getConfig?.() || {} });
|
|
668
|
+
return SETUP_STATUS_READERS[domain](rt, { domain, detail, getConfig: () => getConfig?.() || {} });
|
|
639
669
|
}
|
|
640
670
|
|
|
641
671
|
function openSurface(target) {
|
|
@@ -669,7 +699,7 @@ export function createSetupToolExecutor({ getApi, getConfig, notifySessionUi, ge
|
|
|
669
699
|
dispose: desktop.dispose,
|
|
670
700
|
async execute(args = {}, options = {}) {
|
|
671
701
|
const result = await execute(args, options);
|
|
672
|
-
if (READ_ONLY_SETUP_ACTIONS.has(args.action)) return JSON.stringify(result ?? {}
|
|
702
|
+
if (READ_ONLY_SETUP_ACTIONS.has(args.action)) return JSON.stringify(result ?? {});
|
|
673
703
|
await flushSettings?.();
|
|
674
704
|
// Attached surfaces re-read what changed instead of waiting for their
|
|
675
705
|
// next open or cache expiry.
|
|
@@ -1,11 +1,81 @@
|
|
|
1
1
|
import { SETUP_EXTENDED_PROPERTIES, SETUP_DESKTOP_ACTIONS } from './settings-contract.mjs';
|
|
2
2
|
import { MEDIA_KINDS } from '../../runtime/media/tool-defs.mjs';
|
|
3
|
+
import { OPENAI_COMPAT_PRESETS } from '../../runtime/agent/orchestrator/providers/openai-compat-presets.mjs';
|
|
3
4
|
|
|
4
5
|
const own = (value, key) => Object.hasOwn(value || {}, key);
|
|
5
6
|
const pick = (value, keys) => Object.fromEntries(keys.filter((key) => own(value, key)).map((key) => [key, value[key]]));
|
|
6
7
|
const entryKeys = Object.keys(SETUP_EXTENDED_PROPERTIES.entry.properties);
|
|
7
8
|
const definitionKeys = Object.keys(SETUP_EXTENDED_PROPERTIES.definition.properties);
|
|
8
9
|
|
|
10
|
+
const MODEL_PAGE_DEFAULT = 25;
|
|
11
|
+
|
|
12
|
+
function providerIndex(rows) {
|
|
13
|
+
const counts = new Map();
|
|
14
|
+
for (const row of rows) counts.set(row.provider, (counts.get(row.provider) || 0) + 1);
|
|
15
|
+
return [...counts].map(([provider, count]) => {
|
|
16
|
+
const defaultModel = OPENAI_COMPAT_PRESETS[provider]?.defaultModel;
|
|
17
|
+
return { provider, count, ...(defaultModel ? { defaultModel } : {}) };
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function compactModelRow(row) {
|
|
22
|
+
const context = row.contextWindow || null;
|
|
23
|
+
const maxContext = Number(row.maxContextWindow) || 0;
|
|
24
|
+
return {
|
|
25
|
+
id: row.id,
|
|
26
|
+
display: row.display || row.id,
|
|
27
|
+
context,
|
|
28
|
+
...(maxContext > (context || 0) ? { maxContext } : {}),
|
|
29
|
+
efforts: (row.effortOptions || []).map((option) => option.value),
|
|
30
|
+
...(row.fastCapable === true ? { fast: true } : {}),
|
|
31
|
+
...(row.supportsVision === true ? { vision: true } : {}),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const isPresent = (value) =>
|
|
36
|
+
value != null &&
|
|
37
|
+
value !== '' &&
|
|
38
|
+
value !== false &&
|
|
39
|
+
!(typeof value === 'object' && !Object.keys(value).length);
|
|
40
|
+
|
|
41
|
+
/** Everything set_route can use for one model; empty and false fields omitted. */
|
|
42
|
+
function modelDetail(row) {
|
|
43
|
+
const detail = {
|
|
44
|
+
provider: row.provider,
|
|
45
|
+
id: row.id,
|
|
46
|
+
display: row.display || row.id,
|
|
47
|
+
context: row.contextWindow,
|
|
48
|
+
maxContext: Number(row.maxContextWindow) > row.contextWindow ? row.maxContextWindow : null,
|
|
49
|
+
outputTokens: row.outputTokens,
|
|
50
|
+
vision: row.supportsVision,
|
|
51
|
+
webSearch: row.supportsWebSearch,
|
|
52
|
+
reasoning: row.supportsReasoning,
|
|
53
|
+
effortOptions: (row.effortOptions || []).map(({ value, label }) => ({ value, label })),
|
|
54
|
+
defaultEffort: row.defaultEffort,
|
|
55
|
+
fastCapable: row.fastCapable,
|
|
56
|
+
fastEfforts: row.fastEfforts,
|
|
57
|
+
defaultFast: row.defaultFast,
|
|
58
|
+
serviceTiers: row.serviceTiers,
|
|
59
|
+
defaultServiceTier: row.defaultServiceTier,
|
|
60
|
+
additionalSpeedTiers: row.additionalSpeedTiers,
|
|
61
|
+
modelParameterOptions: row.modelParameterOptions,
|
|
62
|
+
parameterVariants: row.parameterVariants,
|
|
63
|
+
defaultModelParameters: row.defaultModelParameters,
|
|
64
|
+
supportsMaxMode: row.supportsMaxMode,
|
|
65
|
+
};
|
|
66
|
+
return Object.fromEntries(Object.entries(detail).filter(([, value]) => isPresent(value)));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function findModel(rows, id, provider) {
|
|
70
|
+
const matches = rows.filter((row) => row.id === id && (!provider || row.provider === provider));
|
|
71
|
+
if (!matches.length) {
|
|
72
|
+
throw new Error(`model "${id}" not found${provider ? ` for provider "${provider}"` : ''}; list_models with catalog.provider returns its model ids`);
|
|
73
|
+
}
|
|
74
|
+
const providers = [...new Set(matches.map((row) => row.provider))];
|
|
75
|
+
if (providers.length > 1) throw new Error(`model "${id}" is offered by ${providers.join(', ')}; pass catalog.provider`);
|
|
76
|
+
return matches[0];
|
|
77
|
+
}
|
|
78
|
+
|
|
9
79
|
export function publicAutomation(row) {
|
|
10
80
|
const result = {
|
|
11
81
|
...pick(row, entryKeys),
|
|
@@ -136,12 +206,22 @@ async function saveDefinition(rt, args) {
|
|
|
136
206
|
export const EXTENDED_SETUP_HANDLERS = Object.freeze({
|
|
137
207
|
set_local_context: (rt, args) => rt.setLocalProviderContext(args.modelId, args.localContextWindow),
|
|
138
208
|
async list_models(rt, args) {
|
|
139
|
-
const
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
return {
|
|
209
|
+
const { provider, model, page = 1, limit = MODEL_PAGE_DEFAULT, webSearch, refresh } = args.catalog || {};
|
|
210
|
+
const rows = webSearch
|
|
211
|
+
? await rt.listWebSearchModels({ refresh: refresh === true })
|
|
212
|
+
: await rt.listProviderModels({ refresh: refresh === true });
|
|
213
|
+
if (model) return { model: modelDetail(findModel(rows, model, provider)) };
|
|
214
|
+
if (!provider) return { providers: providerIndex(rows) };
|
|
215
|
+
const own = rows.filter((row) => row.provider === provider);
|
|
216
|
+
const pages = Math.max(1, Math.ceil(own.length / limit));
|
|
217
|
+
return {
|
|
218
|
+
provider,
|
|
219
|
+
total: own.length,
|
|
220
|
+
page,
|
|
221
|
+
pages,
|
|
222
|
+
...(page < pages ? { nextPage: page + 1 } : {}),
|
|
223
|
+
models: own.slice((page - 1) * limit, page * limit).map(compactModelRow),
|
|
224
|
+
};
|
|
145
225
|
},
|
|
146
226
|
set_orchestration_mode: (rt, args) => rt.setOrchestrationMode(args.mode),
|
|
147
227
|
get_mcp_server: async (rt, args) => publicMcpConfig(await rt.getMcpServerConfig(args.name)),
|
|
@@ -114,9 +114,19 @@ export const SETUP_MCP_SCHEMA = object({
|
|
|
114
114
|
|
|
115
115
|
export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
|
|
116
116
|
catalog: object({
|
|
117
|
-
provider:
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
provider: {
|
|
118
|
+
...text,
|
|
119
|
+
description: 'list_models: omit for the provider index; set for that provider\'s compact model rows.',
|
|
120
|
+
},
|
|
121
|
+
model: {
|
|
122
|
+
...text,
|
|
123
|
+
description:
|
|
124
|
+
'list_models: one model id; returns its full options (efforts, fast, service tiers, modelParameterOptions, parameterVariants) for set_route. Add provider when several offer the id.',
|
|
125
|
+
},
|
|
126
|
+
page: { type: 'integer', minimum: 1, description: 'list_models with provider: 1-based page; default 1.' },
|
|
127
|
+
limit: { type: 'integer', minimum: 1, maximum: 100, description: 'list_models with provider: rows per page; default 25.' },
|
|
128
|
+
webSearch: { ...boolean, description: 'list_models: native-search capable models only.' },
|
|
129
|
+
refresh: { ...boolean, description: 'list_models: refresh the catalog first.' },
|
|
120
130
|
}),
|
|
121
131
|
localContextWindow: {
|
|
122
132
|
type: ['integer', 'null'],
|
|
@@ -68,7 +68,7 @@ export const SETUP_OPEN_TARGETS = Object.freeze([
|
|
|
68
68
|
// Runtime dispatch contract. A trailing ? denotes an optional field. Keep
|
|
69
69
|
// this out of the wire schema: field descriptions already name their actions.
|
|
70
70
|
export const SETUP_ACTION_FIELDS = Object.freeze({
|
|
71
|
-
status: 'domain?',
|
|
71
|
+
status: 'domain? detail?',
|
|
72
72
|
open: 'target',
|
|
73
73
|
set_route: 'route',
|
|
74
74
|
set_agent_route: 'agent route',
|
|
@@ -136,6 +136,10 @@ const ROUTE_SCHEMA = {
|
|
|
136
136
|
model: { type: 'string' },
|
|
137
137
|
effort: { type: 'string' },
|
|
138
138
|
fast: { type: 'boolean' },
|
|
139
|
+
autoEffort: {
|
|
140
|
+
type: 'boolean',
|
|
141
|
+
description: 'Main and agent routes only: Auto reasoning for this route; omitted = preserved.',
|
|
142
|
+
},
|
|
139
143
|
modelParameters: { type: 'object', additionalProperties: { type: 'string' } },
|
|
140
144
|
// A typed enum is unrepresentable on Gemini; the bounds project everywhere
|
|
141
145
|
// and the executor rejects values that are not a multiple of 10.
|
|
@@ -157,7 +161,7 @@ export const SETUP_TOOL_DEFS = Object.freeze([
|
|
|
157
161
|
name: 'setup',
|
|
158
162
|
title: 'Setup',
|
|
159
163
|
description:
|
|
160
|
-
"Read or change this Mixdog installation's settings through the runtime. Load the setup skill first (local-provider for managed local-model installation). status reads one domain; open navigates the attached app to a settings surface. Secrets (API keys, OAuth) are never accepted. Changes apply to new sessions unless the result says otherwise.",
|
|
164
|
+
"Read or change this Mixdog installation's settings through the runtime. Load the setup skill first (local-provider for managed local-model installation). status reads one domain; open navigates the attached app to a settings surface; list_models returns a provider index, then one provider's paged compact rows, then one model's full options (catalog.model). Results are compact JSON. Secrets (API keys, OAuth) are never accepted. Changes apply to new sessions unless the result says otherwise.",
|
|
161
165
|
annotations: {
|
|
162
166
|
title: 'Setup',
|
|
163
167
|
readOnlyHint: false,
|
|
@@ -177,6 +181,11 @@ export const SETUP_TOOL_DEFS = Object.freeze([
|
|
|
177
181
|
enum: [...SETUP_STATUS_DOMAINS],
|
|
178
182
|
description: 'status: which domain to read; default summary.',
|
|
179
183
|
},
|
|
184
|
+
detail: {
|
|
185
|
+
type: 'boolean',
|
|
186
|
+
description:
|
|
187
|
+
'status providers: full rows for every provider (key URLs, expiry, account ids) instead of configured providers only.',
|
|
188
|
+
},
|
|
180
189
|
target: {
|
|
181
190
|
type: 'string',
|
|
182
191
|
enum: [...SETUP_OPEN_TARGETS],
|
|
@@ -236,7 +245,7 @@ export const SETUP_TOOL_DEFS = Object.freeze([
|
|
|
236
245
|
accountId: {
|
|
237
246
|
type: 'string',
|
|
238
247
|
description:
|
|
239
|
-
'forget_provider_auth: OAuth account id from status providers; required when the provider has several accounts.',
|
|
248
|
+
'forget_provider_auth: OAuth account id from status providers with detail:true; required when the provider has several accounts.',
|
|
240
249
|
},
|
|
241
250
|
providerAccount: {
|
|
242
251
|
type: 'object',
|
|
@@ -263,7 +272,7 @@ export const SETUP_TOOL_DEFS = Object.freeze([
|
|
|
263
272
|
properties: { id: { type: 'string' }, label: { type: 'string', maxLength: 80 } },
|
|
264
273
|
},
|
|
265
274
|
},
|
|
266
|
-
description: 'set_provider_account: OAuth account change; account ids from status providers.',
|
|
275
|
+
description: 'set_provider_account: OAuth account change; account ids from status providers with detail:true.',
|
|
267
276
|
},
|
|
268
277
|
modelId: {
|
|
269
278
|
type: 'string',
|
|
@@ -46,18 +46,16 @@ export function createSkillsApi({ contextMod, getCwd, getTools = () => [] }) {
|
|
|
46
46
|
}
|
|
47
47
|
return { kind: 'user' };
|
|
48
48
|
};
|
|
49
|
+
const enabledFlags = contextMod.skillEnabledFlags(skills);
|
|
49
50
|
return {
|
|
50
51
|
cwd,
|
|
51
52
|
count: skills.length,
|
|
52
53
|
tools: getTools().map(({ name }) => ({ name })),
|
|
53
|
-
skills: skills.map((skill) => {
|
|
54
|
+
skills: skills.map((skill, index) => {
|
|
54
55
|
const source = sourceForSkill(skill);
|
|
55
56
|
return {
|
|
56
57
|
name: skill.name,
|
|
57
|
-
enabled:
|
|
58
|
-
contextMod.isSkillDisabled?.(skill.name, null, skills) ||
|
|
59
|
-
contextMod.skillMissingFeature?.(skill.name, null, skills)
|
|
60
|
-
),
|
|
58
|
+
enabled: enabledFlags[index],
|
|
61
59
|
description: skill.description || '',
|
|
62
60
|
whenToUse: skill.whenToUse || '',
|
|
63
61
|
filePath: skill.filePath || null,
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
filterDisallowedTools,
|
|
7
7
|
selectDeferredTools,
|
|
8
8
|
} from '../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
|
|
9
|
+
import { AGENT_WORKER_DENIED_TOOLS } from '../runtime/agent/orchestrator/session/manager/tool-resolution.mjs';
|
|
9
10
|
import { LEAD_DISALLOWED_TOOLS } from '../runtime/agent/orchestrator/runtime-core/tool-defs.mjs';
|
|
10
11
|
import { deferredSurfaceModeForLead, toolSpecForMode } from '../runtime/agent/orchestrator/runtime-core/effort.mjs';
|
|
11
12
|
import { loadSkillToolDependencies } from '../runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs';
|
|
@@ -52,8 +53,11 @@ export function createToolSurface({
|
|
|
52
53
|
const workflowTools = hideAgentTool
|
|
53
54
|
? profileTools.filter((tool) => !agentToolNames.has(String(tool?.name || '')))
|
|
54
55
|
: profileTools;
|
|
56
|
+
const visibleTools = agentOwned
|
|
57
|
+
? workflowTools.filter((tool) => !AGENT_WORKER_DENIED_TOOLS.has(String(tool?.name || '').toLowerCase()))
|
|
58
|
+
: workflowTools;
|
|
55
59
|
const denied = new Set(getFeatureDisallowedTools().map((name) => String(name || '')));
|
|
56
|
-
return denied.size ?
|
|
60
|
+
return denied.size ? visibleTools.filter((tool) => !denied.has(String(tool?.name || ''))) : visibleTools;
|
|
57
61
|
}
|
|
58
62
|
|
|
59
63
|
function disallowedTools() {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/session-runtime/turn/compaction-gate.mjs - serializes a model-scheduled
|
|
3
|
+
* compaction (session tool) with everything that follows its turn. The
|
|
4
|
+
* compaction is chained, never left dangling: `after(fn)` wraps a command so it
|
|
5
|
+
* waits for the compaction in flight, and the compaction itself only runs if
|
|
6
|
+
* the session it was scheduled for is still the live one.
|
|
7
|
+
*/
|
|
8
|
+
export function createCompactionGate({ getSessionId, compact }) {
|
|
9
|
+
let tail = Promise.resolve();
|
|
10
|
+
const run = (sessionId) => {
|
|
11
|
+
tail = tail
|
|
12
|
+
.then(() => (getSessionId() === sessionId ? compact() : null))
|
|
13
|
+
.catch(() => {
|
|
14
|
+
/* best-effort: a scheduled compaction must never break teardown */
|
|
15
|
+
});
|
|
16
|
+
return tail;
|
|
17
|
+
};
|
|
18
|
+
const after =
|
|
19
|
+
(fn) =>
|
|
20
|
+
async (...args) => {
|
|
21
|
+
await tail;
|
|
22
|
+
return fn(...args);
|
|
23
|
+
};
|
|
24
|
+
return { run, after };
|
|
25
|
+
}
|