mixdog 1.1.2 → 1.2.1
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 +8 -5
- package/package.json +2 -1
- package/scripts/lib/run-node-tests.mjs +9 -0
- package/scripts/prune-desktop-runtime.mjs +3 -0
- package/scripts/test-direct.mjs +4 -2
- package/src/defaults/shipped-history.json +10 -0
- package/src/defaults/skills/pptx/SKILL.md +6 -6
- package/src/defaults/skills/pptx/references/review.md +6 -4
- package/src/defaults/skills/pptx/scripts/source-extract.mjs +1 -1
- package/src/defaults/skills/setup/references/actions.md +18 -5
- package/src/defaults/skills/visualize/SKILL.md +160 -0
- package/src/defaults/skills/visualize/references/craft.md +88 -0
- package/src/headless-command.mjs +56 -3
- package/src/headless-exec.mjs +17 -1
- package/src/help.mjs +2 -0
- package/src/rules/shared/60-verification.md +3 -1
- package/src/rules/shared/70-delivery.md +4 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +1 -0
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +2 -0
- package/src/runtime/agent/orchestrator/cache-mtime.mjs +26 -5
- package/src/runtime/agent/orchestrator/config-presets.mjs +2 -0
- package/src/runtime/agent/orchestrator/config-providers-merge.mjs +17 -11
- package/src/runtime/agent/orchestrator/config-storage.mjs +1 -0
- package/src/runtime/agent/orchestrator/config.mjs +19 -5
- package/src/runtime/agent/orchestrator/context/collect.mjs +2 -1
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +11 -5
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +74 -21
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +133 -15
- package/src/runtime/agent/orchestrator/mcp/client-handshake.mjs +55 -8
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +86 -8
- package/src/runtime/agent/orchestrator/mcp/client.mjs +474 -164
- package/src/runtime/agent/orchestrator/mcp/lazy-output-validator.mjs +25 -0
- package/src/runtime/agent/orchestrator/mcp/plugin-placeholders.mjs +54 -0
- package/src/runtime/agent/orchestrator/mcp/reconnect-singleflight.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +108 -17
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +15 -1
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +32 -12
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +337 -0
- package/src/runtime/agent/orchestrator/providers/command-code-oauth-tokens.mjs +159 -0
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +444 -0
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-wire-normalization.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +7 -4
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +21 -6
- package/src/runtime/agent/orchestrator/providers/effort-rejection.mjs +244 -0
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +41 -28
- 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/lib/gemini-model-catalog.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +8 -40
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-tokens.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +51 -12
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +37 -2
- package/src/runtime/agent/orchestrator/providers/model-proxy-bridge.mjs +1080 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +82 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +556 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +251 -0
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth-tokens.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +69 -102
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +15 -0
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +6 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +15 -4
- package/src/runtime/agent/orchestrator/providers/openai-oauth-catalog-store.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-catalog.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/registry.mjs +47 -7
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +10 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +36 -3
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -11
- package/src/runtime/agent/orchestrator/runtime-core/extension-scopes.mjs +15 -55
- package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +15 -2
- package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +16 -1
- package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +278 -84
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +21 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +54 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +10 -3
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +9 -5
- package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +18 -8
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +284 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +268 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/sqlite-gate.mjs +27 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +628 -0
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +10 -3
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +24 -13
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +13 -5
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +362 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +253 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +184 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +136 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +128 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +127 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +101 -0
- package/src/runtime/agent/orchestrator/session/explicit-skills.mjs +83 -5
- package/src/runtime/agent/orchestrator/session/imported-message.mjs +11 -0
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/continuation.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/diagnostic.mjs +1 -7
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/refusal.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +7 -4
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +21 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +15 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +22 -12
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +9 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +9 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +37 -16
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +17 -4
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +90 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +22 -12
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +32 -3
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +27 -0
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +16 -1
- package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +0 -1
- package/src/runtime/agent/orchestrator/session/message-ids.mjs +123 -0
- package/src/runtime/agent/orchestrator/session/message-ids.test-support.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +33 -22
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +6 -2
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +10 -3
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +11 -0
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +817 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +36 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +23 -12
- package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +158 -0
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +202 -374
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +20 -3
- package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +48 -9
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +161 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +17 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -0
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +52 -2
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +32 -22
- package/src/runtime/agent/orchestrator/tools/builtin/git-repo-rw-lock.mjs +10 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/list-helpers.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +6 -6
- package/src/runtime/agent/orchestrator/tools/builtin/read-cache-policy.mjs +8 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +203 -33
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +32 -35
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-guards.mjs +8 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +11 -12
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +9 -6
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +83 -68
- package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +8 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-source-windows.mjs +20 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +16 -7
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +137 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +11 -10
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +21 -11
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +12 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +13 -10
- package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +17 -12
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +56 -13
- package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +58 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +25 -1
- package/src/runtime/agent/orchestrator/tools/patch/apply-patch/codex-batch.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/patch/apply-patch/route.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/read-redirects.mjs +34 -30
- package/src/runtime/agent/orchestrator/tools/patch/sequence/units.mjs +7 -7
- package/src/runtime/agent/orchestrator/tools/patch/sequence.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +78 -5
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +4 -0
- package/src/runtime/attachments/store.d.mts +3 -0
- package/src/runtime/attachments/store.mjs +38 -0
- package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +1 -1
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +16 -4
- package/src/runtime/channels/lib/worker-main.mjs +17 -14
- package/src/runtime/computer-bridge/linux-readiness.mjs +0 -2
- package/src/runtime/effort-judge/judge-client.mjs +56 -18
- package/src/runtime/memory/lib/memory.mjs +1 -1
- package/src/runtime/memory/lib/session-ingest.mjs +2 -2
- package/src/runtime/shared/atomic-file.mjs +33 -6
- package/src/runtime/shared/best-effort-stderr.mjs +8 -0
- package/src/runtime/shared/code-graph-state.mjs +12 -0
- package/src/runtime/shared/defaults-separation.mjs +2 -0
- package/src/runtime/shared/extension-scopes.mjs +5 -3
- package/src/runtime/shared/file-lock.mjs +37 -11
- package/src/runtime/shared/git-runner-worker.mjs +3 -2
- package/src/runtime/shared/git-runner.mjs +4 -3
- package/src/runtime/shared/llm/anthropic-effort.mjs +14 -0
- package/src/runtime/shared/llm/default-context-window.mjs +6 -0
- package/src/runtime/shared/llm/model-catalog-projection.mjs +5 -4
- package/src/runtime/shared/llm/model-catalog.mjs +240 -130
- package/src/runtime/shared/llm/provider-catalog-cache.mjs +36 -28
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +162 -0
- package/src/runtime/shared/llm/provider-seed-rosters.mjs +130 -0
- package/src/runtime/shared/model-proxy-mode.d.mts +3 -0
- package/src/runtime/shared/model-proxy-mode.mjs +19 -0
- package/src/runtime/shared/plugin-manifest.mjs +18 -9
- package/src/runtime/shared/pristine-execution-contract.json +9 -2
- package/src/runtime/shared/pristine-execution.mjs +28 -4
- package/src/runtime/shared/provider-accounts.mjs +125 -21
- package/src/runtime/shared/provider-api-key.mjs +33 -1
- package/src/runtime/shared/schedule-model-ref.mjs +11 -2
- package/src/runtime/shared/session-usage-totals.mjs +19 -0
- package/src/runtime/shared/sharp-electron-linux.mjs +25 -0
- package/src/runtime/shared/shell-display.mjs +9 -3
- package/src/runtime/shared/singleton-owner.mjs +36 -6
- package/src/runtime/shared/skill-mentions.d.mts +10 -0
- package/src/runtime/shared/skill-mentions.mjs +133 -0
- package/src/runtime/shared/skill-script-runtime.mjs +264 -0
- package/src/runtime/shared/statusline/statusline-segments.mjs +68 -14
- package/src/runtime/shared/tool-primitives.mjs +35 -2
- package/src/runtime/shared/tool-surface.mjs +7 -0
- package/src/runtime/shared/tool-work-units.mjs +14 -0
- package/src/runtime/shared/transcript-metadata.mjs +17 -1
- package/src/runtime/shared/turn-changes.mjs +791 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +346 -12
- package/src/runtime/shared/turn-snapshot.mjs +690 -81
- package/src/runtime/shared/turn-worktree-snapshot.mjs +185 -15
- package/src/runtime/shared/worker-requests.mjs +15 -2
- package/src/runtime/shared/worktrees/cache-cleanups.mjs +52 -0
- package/src/runtime/shared/worktrees/contract.mjs +551 -0
- package/src/runtime/shared/worktrees/disk.mjs +57 -0
- package/src/runtime/shared/worktrees/git.mjs +247 -0
- package/src/runtime/shared/worktrees/include.mjs +480 -0
- package/src/runtime/shared/worktrees/lock.mjs +46 -0
- package/src/runtime/shared/worktrees/maintenance.mjs +96 -0
- package/src/runtime/shared/worktrees/manager.mjs +1215 -0
- package/src/runtime/shared/worktrees/merge.mjs +182 -0
- package/src/runtime/shared/worktrees/owner.mjs +46 -0
- package/src/runtime/shared/worktrees/paths.mjs +62 -0
- package/src/runtime/shared/worktrees/registry.mjs +110 -0
- package/src/runtime/shared/worktrees/settings.mjs +84 -0
- package/src/runtime/shared/worktrees/slug.mjs +62 -0
- package/src/runtime/shared/worktrees/test-support.mjs +96 -0
- package/src/runtime/visualize-bridge/client.mjs +181 -0
- package/src/runtime/visualize-bridge/tool-defs.mjs +97 -0
- package/src/session-runtime/automation-agents.mjs +8 -2
- package/src/session-runtime/boot/apis.mjs +90 -0
- package/src/session-runtime/boot/config.mjs +7 -2
- package/src/session-runtime/boot/facade.mjs +21 -0
- package/src/session-runtime/boot/infrastructure.mjs +30 -18
- package/src/session-runtime/boot/session.mjs +1 -0
- package/src/session-runtime/boot/tools.mjs +4 -0
- package/src/session-runtime/config-lifecycle.mjs +10 -1
- package/src/session-runtime/conversation-import/discovery.mjs +698 -0
- package/src/session-runtime/conversation-import/service.mjs +369 -0
- package/src/session-runtime/cwd-plugins/cwd-apply.mjs +21 -6
- package/src/session-runtime/cwd-plugins/plugin-status.mjs +47 -42
- package/src/session-runtime/global-extensions.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +27 -2
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +32 -1
- package/src/session-runtime/internal-tool-executor.mjs +9 -1
- package/src/session-runtime/lifecycle/session-catalog.mjs +8 -1
- package/src/session-runtime/lifecycle/session-switch/context-switch.mjs +5 -0
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +21 -3
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +16 -0
- package/src/session-runtime/mcp-glue/connect.mjs +68 -16
- package/src/session-runtime/mcp-glue/plugin-servers.mjs +499 -0
- package/src/session-runtime/mcp-glue/server-catalog.mjs +122 -33
- package/src/session-runtime/mcp-glue/server-input.mjs +29 -0
- package/src/session-runtime/mcp-glue.mjs +22 -2
- package/src/session-runtime/model-route/route-persist.mjs +3 -0
- package/src/session-runtime/model-route/set-route.mjs +15 -2
- package/src/session-runtime/new-session-config.mjs +3 -2
- package/src/session-runtime/notification-bus.mjs +18 -3
- package/src/session-runtime/provider-auth/accounts.mjs +33 -15
- package/src/session-runtime/provider-models/row-hydration.mjs +2 -0
- package/src/session-runtime/provider-models/web-search-catalog.mjs +5 -1
- package/src/session-runtime/provider-readiness.mjs +16 -10
- package/src/session-runtime/resource-extension-sync.mjs +45 -7
- package/src/session-runtime/resource-mcp-api.mjs +121 -84
- package/src/session-runtime/resource-plugins-api.mjs +29 -41
- package/src/session-runtime/resource-scope-decorate.mjs +6 -8
- package/src/session-runtime/resource-skills-api.mjs +23 -2
- package/src/session-runtime/route-resolution.mjs +10 -1
- package/src/session-runtime/route-state.mjs +16 -2
- package/src/session-runtime/runtime-core.mjs +5 -0
- package/src/session-runtime/runtime-facade.mjs +8 -0
- package/src/session-runtime/runtime-review-api.mjs +9 -0
- package/src/session-runtime/schedule-session-run.mjs +1 -1
- package/src/session-runtime/services/agent-tool/helpers.mjs +5 -0
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +3 -0
- package/src/session-runtime/services/agent-tool/job-views/job-lookup.mjs +1 -0
- package/src/session-runtime/services/agent-tool/job-views/spawn-meta.mjs +1 -0
- package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +15 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +1 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +10 -2
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -7
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +2 -1
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -0
- package/src/session-runtime/services/agent-tool/worker-rows.mjs +1 -0
- package/src/session-runtime/services/agent-tool.mjs +1 -0
- package/src/session-runtime/services/channel-session-router.mjs +4 -1
- package/src/session-runtime/services/daemon-candidate.mjs +3 -2
- package/src/session-runtime/services/daemon-crash-capture/spawn-capture.mjs +55 -0
- package/src/session-runtime/services/hook-bus/command-handler.mjs +4 -1
- package/src/session-runtime/services/hook-bus/handlers.mjs +7 -3
- package/src/session-runtime/services/provider-admin.mjs +64 -18
- package/src/session-runtime/services/usage-dashboard-model.mjs +3 -0
- package/src/session-runtime/session-create/session-options.mjs +10 -1
- package/src/session-runtime/session-turn-api.mjs +1 -0
- package/src/session-runtime/settings-api.mjs +4 -2
- package/src/session-runtime/settings-builtin-tools-api.mjs +9 -2
- package/src/session-runtime/settings-worktree-api.mjs +17 -0
- package/src/session-runtime/setup-tool/executor.mjs +23 -5
- package/src/session-runtime/setup-tool/extended-actions.mjs +1 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +4 -1
- package/src/session-runtime/setup-tool/tool-defs.mjs +38 -4
- package/src/session-runtime/skills-api.mjs +7 -3
- package/src/session-runtime/turn/agent-ops.mjs +12 -1
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +14 -3
- package/src/session-runtime/turn/turn-run/snapshot-tracker.mjs +20 -15
- package/src/session-runtime/turn/turn-run/turn-open.mjs +4 -5
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +29 -1
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +6 -1
- package/src/session-runtime/turn/turn-run.mjs +6 -7
- package/src/session-runtime/webhook-session-run.mjs +16 -4
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -3
- package/src/session-runtime/workspace/admission-gate.mjs +197 -0
- package/src/session-runtime/workspace/project-branches.mjs +136 -0
- package/src/session-runtime/workspace/transition-steps.mjs +364 -0
- package/src/session-runtime/workspace/transitions.mjs +651 -0
- package/src/session-runtime/workspace/workspace-state.mjs +112 -0
- package/src/skill-script-entry.mjs +36 -0
- package/src/standalone/channel-transport/http-routes.mjs +17 -0
- package/src/standalone/channel-transport.mjs +13 -1
- package/src/standalone/daemon-desktop-runtime.mjs +1 -0
- package/src/standalone/daemon-owner.mjs +372 -0
- package/src/standalone/daemon-stored-session-views.mjs +15 -4
- package/src/standalone/daemon.mjs +179 -8
- package/src/standalone/desktop-service-registry.mjs +20 -0
- package/src/standalone/local-session-runtime.mjs +11 -0
- package/src/standalone/session-client/attachment-calls.mjs +3 -1
- package/src/standalone/session-client/daemon-unavailable.mjs +62 -0
- package/src/standalone/session-client/lease-heartbeat.mjs +47 -0
- package/src/standalone/session-client.mjs +104 -13
- package/src/standalone/session-protocol.mjs +21 -0
- package/src/standalone/session-proxy.mjs +3 -0
- package/src/standalone/session-service/agent-tree/agent-child.mjs +4 -0
- package/src/standalone/session-service/agent-tree/agent-rehydrate.mjs +1 -0
- package/src/standalone/session-service/entries/lifecycle.mjs +6 -0
- package/src/standalone/session-service/projection/revisions.mjs +2 -0
- package/src/standalone/session-service/projection/transcript-window.mjs +149 -19
- package/src/standalone/session-service/projection/workspace.mjs +14 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +17 -4
- package/src/standalone/session-transport/call-route.mjs +13 -0
- package/src/standalone/session-transport/client-registry/client-grace.mjs +45 -3
- package/src/standalone/session-transport/client-registry/registration-replays.mjs +1 -0
- package/src/standalone/session-transport/client-registry.mjs +20 -3
- package/src/standalone/session-transport/routes.mjs +79 -2
- package/src/standalone/session-transport/stack.mjs +2 -0
- package/src/standalone/session-transport.mjs +24 -1
- package/src/tui/App.jsx +9 -1
- package/src/tui/app/app-view/floating-panel.jsx +9 -1
- package/src/tui/app/app-view.jsx +6 -0
- package/src/tui/app/extension-pickers/plugins-pickers.mjs +35 -16
- package/src/tui/app/message-selector.mjs +2 -1
- package/src/tui/app/model-options.mjs +37 -5
- package/src/tui/app/model-picker/provider-models-list.mjs +2 -2
- package/src/tui/app/model-picker.mjs +4 -2
- package/src/tui/app/skill-mention-palette.mjs +88 -0
- package/src/tui/app/slash-palette.mjs +23 -7
- package/src/tui/app/transcript-row-estimate.mjs +11 -3
- package/src/tui/app/use-prompt-draft-flow.mjs +7 -2
- package/src/tui/app/use-prompt-state.mjs +5 -0
- package/src/tui/components/Message.jsx +22 -1
- package/src/tui/components/PromptInput.jsx +21 -3
- package/src/tui/components/SlashCommandPalette.jsx +12 -3
- package/src/tui/components/TranscriptItem.jsx +9 -1
- package/src/tui/components/prompt-input/key-handler.mjs +21 -8
- package/src/tui/components/user-message-skills.mjs +38 -0
- package/src/tui/dist/index.mjs +839 -207
- package/src/tui/index.jsx +10 -2
- package/src/tui/session/compaction-view.mjs +147 -0
- package/src/tui/session/context-state.mjs +6 -0
- package/src/tui/session/initial-state.mjs +3 -0
- package/src/tui/session/queue-helpers.mjs +7 -2
- package/src/tui/session/quota-resume.mjs +2 -1
- package/src/tui/session/session-api/commands.mjs +10 -2
- package/src/tui/session/session-api/controls.mjs +4 -0
- package/src/tui/session/session-api/extensions.mjs +4 -2
- package/src/tui/session/session-api/intake/rewind.mjs +2 -1
- package/src/tui/session/session-api/integrations.mjs +17 -0
- package/src/tui/session/session-api/lifecycle/dispose.mjs +6 -1
- package/src/tui/session/session-api/lifecycle/inheritance.mjs +2 -0
- package/src/tui/session/session-api/lifecycle/resume.mjs +3 -0
- package/src/tui/session/session-api/routes.mjs +10 -1
- package/src/tui/session/session-api/settings.mjs +9 -0
- package/src/tui/session/session-api/worktree.mjs +60 -0
- package/src/tui/session/session-api.mjs +2 -0
- package/src/tui/session/session-flow/auto-clear.mjs +31 -12
- package/src/tui/session/session-flow/drain.mjs +27 -3
- package/src/tui/session/session-flow/session-reset.mjs +4 -3
- package/src/tui/session/session-flow.mjs +2 -0
- package/src/tui/session/transcript-intake.mjs +14 -5
- package/src/tui/session/tui-steering-persist.mjs +25 -9
- package/src/tui/session/turn-stream.mjs +32 -4
- package/src/tui/session/turn-tool-cards.mjs +10 -2
- package/src/tui/session/turn.mjs +56 -10
- package/src/runtime/effort-judge/previous-human-request.mjs +0 -162
- package/src/runtime/effort-judge/verified-context-input.mjs +0 -10
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Where each mixdog provider's model metadata comes from. One table read by
|
|
2
|
+
// both lookup paths (async list enrichment and the sync lookup), so every
|
|
3
|
+
// provider resolves effort ladders, limits, capabilities and pricing in the
|
|
4
|
+
// same precedence order (see lookupModelMetadata in model-catalog.mjs).
|
|
5
|
+
//
|
|
6
|
+
// Fields:
|
|
7
|
+
// modelsDev models.dev provider id holding this provider's rows.
|
|
8
|
+
// sameEndpoint true when that models.dev entry describes the endpoint this
|
|
9
|
+
// provider actually calls; its effort ladders, limits and
|
|
10
|
+
// capabilities then apply. Otherwise it is only the same
|
|
11
|
+
// vendor (another endpoint/account plan): it prices the model
|
|
12
|
+
// and is a first guess for capabilities and the effort ladder
|
|
13
|
+
// the provider's own sources leave undeclared — never limits.
|
|
14
|
+
// relay sells other vendors' models; the serving vendor (read off
|
|
15
|
+
// the model id) is likewise a first guess for capabilities
|
|
16
|
+
// and the effort ladder, and prices a model with no own rates.
|
|
17
|
+
// rosterFiles live-roster cache files the provider's listModels persists.
|
|
18
|
+
// rosterLimitsAuthoritative
|
|
19
|
+
// live-roster limits beat catalog limits (the roster reflects
|
|
20
|
+
// the account/backend window); otherwise they only fill gaps.
|
|
21
|
+
// rosterLadderFinal
|
|
22
|
+
// a roster row's effort ladder is complete, empty included:
|
|
23
|
+
// no guessed ladder is added to a model the roster lists.
|
|
24
|
+
// seedRow offline seed row for a model id, applied after fetched data.
|
|
25
|
+
import { mimoSeedRow, museSeedRow } from './provider-seed-rosters.mjs';
|
|
26
|
+
|
|
27
|
+
function mimoSeedMetadata(model) {
|
|
28
|
+
const seed = mimoSeedRow(model);
|
|
29
|
+
return seed
|
|
30
|
+
? {
|
|
31
|
+
contextWindow: seed.contextWindow,
|
|
32
|
+
outputTokens: seed.outputTokens,
|
|
33
|
+
supportsReasoning: seed.reasoning === true,
|
|
34
|
+
supportsVision: seed.vision === true,
|
|
35
|
+
}
|
|
36
|
+
: null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const PROVIDER_CATALOGS = Object.freeze({
|
|
40
|
+
// api.openai.com — the endpoint models.dev `openai` describes.
|
|
41
|
+
openai: { modelsDev: 'openai', sameEndpoint: true },
|
|
42
|
+
// chatgpt.com/backend-api/codex: subscription backend, not the public API.
|
|
43
|
+
'openai-oauth': {
|
|
44
|
+
modelsDev: 'openai',
|
|
45
|
+
sameEndpoint: false,
|
|
46
|
+
rosterFiles: ['openai-oauth-models.json'],
|
|
47
|
+
rosterLimitsAuthoritative: true,
|
|
48
|
+
},
|
|
49
|
+
// api.anthropic.com with a subscription token: account-scoped windows and
|
|
50
|
+
// effort surface differ from the public API SKU.
|
|
51
|
+
'anthropic-oauth': {
|
|
52
|
+
modelsDev: 'anthropic',
|
|
53
|
+
sameEndpoint: false,
|
|
54
|
+
rosterFiles: ['anthropic-oauth-models.json'],
|
|
55
|
+
rosterLimitsAuthoritative: true,
|
|
56
|
+
},
|
|
57
|
+
// api.anthropic.com with an API key. Shares the OAuth roster file.
|
|
58
|
+
anthropic: { modelsDev: 'anthropic', sameEndpoint: true, rosterFiles: ['anthropic-oauth-models.json'] },
|
|
59
|
+
// generativelanguage.googleapis.com — the endpoint models.dev `google` describes.
|
|
60
|
+
gemini: { modelsDev: 'google', sameEndpoint: true, rosterFiles: ['gemini-models.json'] },
|
|
61
|
+
// cli-chat-proxy.grok.com, not api.x.ai.
|
|
62
|
+
'grok-oauth': {
|
|
63
|
+
modelsDev: 'xai',
|
|
64
|
+
sameEndpoint: false,
|
|
65
|
+
rosterFiles: ['grok-oauth-models.json'],
|
|
66
|
+
rosterLimitsAuthoritative: true,
|
|
67
|
+
},
|
|
68
|
+
// api.meta.ai/v1 — the endpoint models.dev `meta` describes.
|
|
69
|
+
'muse-code-oauth': {
|
|
70
|
+
modelsDev: 'meta',
|
|
71
|
+
sameEndpoint: true,
|
|
72
|
+
rosterFiles: ['muse-code-oauth-models.json'],
|
|
73
|
+
rosterLimitsAuthoritative: true,
|
|
74
|
+
seedRow: museSeedRow,
|
|
75
|
+
},
|
|
76
|
+
// token-plan-*.xiaomimimo.com subscription gateway, not the public API.
|
|
77
|
+
'mimo-oauth': {
|
|
78
|
+
modelsDev: 'xiaomi',
|
|
79
|
+
sameEndpoint: false,
|
|
80
|
+
rosterFiles: ['mimo-oauth-models.json'],
|
|
81
|
+
rosterLimitsAuthoritative: true,
|
|
82
|
+
seedRow: mimoSeedMetadata,
|
|
83
|
+
},
|
|
84
|
+
// Relays: their own models.dev id (when published) is their own endpoint.
|
|
85
|
+
// Effort tiers live in the wire id; a row without levels has no effort
|
|
86
|
+
// surface (resolveAntigravityWireModel drops the effort).
|
|
87
|
+
'antigravity-oauth': { relay: true, rosterFiles: ['antigravity-oauth-models.json'], rosterLadderFinal: true },
|
|
88
|
+
// api.commandcode.ai/provider/v1 relays other vendors' models.
|
|
89
|
+
'command-code-oauth': {
|
|
90
|
+
relay: true,
|
|
91
|
+
rosterFiles: ['command-code-oauth-models.json'],
|
|
92
|
+
rosterLimitsAuthoritative: true,
|
|
93
|
+
},
|
|
94
|
+
'cursor-oauth': { relay: true },
|
|
95
|
+
'cursor-api': { relay: true },
|
|
96
|
+
'opencode-go': { relay: true },
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Confirmed upstream catalog gaps, keyed provider → model. Each entry patches
|
|
100
|
+
// the mapped models.dev row; a live roster that declares the field still wins.
|
|
101
|
+
const VERIFIED_CORRECTIONS = Object.freeze({
|
|
102
|
+
'muse-code-oauth': Object.freeze({
|
|
103
|
+
// models.dev `meta` stops this ladder at xhigh; the Muse OAuth endpoint
|
|
104
|
+
// accepts reasoning.effort "max" for the contributor tier as for 1.3.
|
|
105
|
+
'muse-spark-1.3-contributor': Object.freeze({
|
|
106
|
+
reasoningOptions: Object.freeze([
|
|
107
|
+
Object.freeze({ type: 'effort', values: Object.freeze(['minimal', 'low', 'medium', 'high', 'xhigh', 'max']) }),
|
|
108
|
+
]),
|
|
109
|
+
}),
|
|
110
|
+
}),
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
const key = (provider) =>
|
|
114
|
+
String(provider || '')
|
|
115
|
+
.trim()
|
|
116
|
+
.toLowerCase();
|
|
117
|
+
|
|
118
|
+
/** Registry entry with defaults; an unlisted provider is its own models.dev id and endpoint. */
|
|
119
|
+
export function providerCatalogEntry(provider) {
|
|
120
|
+
const p = key(provider);
|
|
121
|
+
if (!p) return null;
|
|
122
|
+
const entry = PROVIDER_CATALOGS[p] || {};
|
|
123
|
+
return {
|
|
124
|
+
provider: p,
|
|
125
|
+
modelsDev: entry.modelsDev || p,
|
|
126
|
+
sameEndpoint: entry.sameEndpoint !== false,
|
|
127
|
+
relay: entry.relay === true,
|
|
128
|
+
rosterFiles: entry.rosterFiles || [],
|
|
129
|
+
rosterLimitsAuthoritative: entry.rosterLimitsAuthoritative === true,
|
|
130
|
+
rosterLadderFinal: entry.rosterLadderFinal === true,
|
|
131
|
+
seedRow: entry.seedRow || null,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export function modelsDevProviderId(provider) {
|
|
136
|
+
return providerCatalogEntry(provider)?.modelsDev || null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function providerRosterFiles(provider) {
|
|
140
|
+
return providerCatalogEntry(provider)?.rosterFiles || [];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Providers owning a live-roster file; a provider reading another's file is skipped. */
|
|
144
|
+
export function rosterProviders() {
|
|
145
|
+
const seen = new Set();
|
|
146
|
+
const out = [];
|
|
147
|
+
for (const [provider, entry] of Object.entries(PROVIDER_CATALOGS)) {
|
|
148
|
+
const files = entry.rosterFiles || [];
|
|
149
|
+
if (!files.length || files.every((file) => seen.has(file))) continue;
|
|
150
|
+
for (const file of files) seen.add(file);
|
|
151
|
+
out.push(provider);
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function providerSeedRow(provider, model) {
|
|
157
|
+
return providerCatalogEntry(provider)?.seedRow?.(String(model || '')) || null;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function providerMetadataCorrection(provider, model) {
|
|
161
|
+
return VERIFIED_CORRECTIONS[key(provider)]?.[String(model || '')] || null;
|
|
162
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// Offline seed rosters for providers whose discovery endpoint lists bare ids.
|
|
2
|
+
// A seed is the cold-start fallback only: the metadata lookup applies it to
|
|
3
|
+
// fields nothing fetched (live roster, models.dev) supplied, and provider
|
|
4
|
+
// rows never let it override discovered data. Pure data, no provider imports,
|
|
5
|
+
// so the shared sync lookup and the provider transports read one copy.
|
|
6
|
+
|
|
7
|
+
// ── Muse Code (Meta Muse Spark) ─────────────────────────────────────────────
|
|
8
|
+
export const MUSE_DEFAULT_EFFORT_LEVELS = Object.freeze(['minimal', 'low', 'medium', 'high', 'xhigh']);
|
|
9
|
+
const MUSE_SIX_LEVELS = Object.freeze([...MUSE_DEFAULT_EFFORT_LEVELS, 'max']);
|
|
10
|
+
const MUSE_SPARK_CONTEXT = 1_048_576;
|
|
11
|
+
export const MUSE_SPARK_MAX_OUTPUT = 131_072;
|
|
12
|
+
const STANDARD_COST = { inputCostPerM: 1.25, outputCostPerM: 4.25, cacheReadCostPerM: 0.15, cacheWriteCostPerM: 0 };
|
|
13
|
+
const CONTRIBUTOR_COST = { inputCostPerM: 0.1, outputCostPerM: 0.2, cacheReadCostPerM: 0.002, cacheWriteCostPerM: 0 };
|
|
14
|
+
|
|
15
|
+
// Only the 1.3 revisions accept `max`.
|
|
16
|
+
const MUSE_SEEDS = Object.freeze({
|
|
17
|
+
'muse-spark-1.1': { name: 'Muse Spark 1.1', levels: MUSE_DEFAULT_EFFORT_LEVELS, cost: STANDARD_COST },
|
|
18
|
+
'muse-spark-1.2': { name: 'Muse Spark 1.2', levels: MUSE_DEFAULT_EFFORT_LEVELS, cost: STANDARD_COST },
|
|
19
|
+
'muse-spark-1.2-contributor': {
|
|
20
|
+
name: 'Muse Spark 1.2 (C)',
|
|
21
|
+
levels: MUSE_DEFAULT_EFFORT_LEVELS,
|
|
22
|
+
cost: CONTRIBUTOR_COST,
|
|
23
|
+
},
|
|
24
|
+
'muse-spark-1.3': { name: 'Muse Spark 1.3', levels: MUSE_SIX_LEVELS, cost: STANDARD_COST },
|
|
25
|
+
'muse-spark-1.3-contributor': { name: 'Muse Spark 1.3 (C)', levels: MUSE_SIX_LEVELS, cost: CONTRIBUTOR_COST },
|
|
26
|
+
});
|
|
27
|
+
export const MUSE_SEED_IDS = Object.freeze(Object.keys(MUSE_SEEDS));
|
|
28
|
+
|
|
29
|
+
function museEffortRow(id, name, levels, cost) {
|
|
30
|
+
return {
|
|
31
|
+
id,
|
|
32
|
+
name,
|
|
33
|
+
provider: 'muse-code-oauth',
|
|
34
|
+
family: 'muse-spark',
|
|
35
|
+
contextWindow: MUSE_SPARK_CONTEXT,
|
|
36
|
+
outputTokens: MUSE_SPARK_MAX_OUTPUT,
|
|
37
|
+
supportsReasoning: true,
|
|
38
|
+
supportsVision: true,
|
|
39
|
+
supportsFunctionCalling: true,
|
|
40
|
+
reasoningLevels: [...levels],
|
|
41
|
+
reasoningOptions: [{ type: 'effort', values: [...levels] }],
|
|
42
|
+
...cost,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Revisioned Spark ids the seed does not list inherit the newest seeded
|
|
47
|
+
// revision of their tier (limits, vision, pricing) but take the five-level
|
|
48
|
+
// ladder: only reviewed seeds advertise `max`.
|
|
49
|
+
const SPARK_ID_RE = /^muse-spark-(\d+)\.(\d+)(?:\.(\d+))?(-contributor)?$/i;
|
|
50
|
+
|
|
51
|
+
function revisionOf(id) {
|
|
52
|
+
const m = SPARK_ID_RE.exec(id);
|
|
53
|
+
return m ? [Number(m[1]), Number(m[2]), Number(m[3] || 0)] : null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function compareRevision(a, b) {
|
|
57
|
+
for (let i = 0; i < 3; i += 1) if (a[i] !== b[i]) return a[i] - b[i];
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function museLineageRow(id) {
|
|
62
|
+
const match = SPARK_ID_RE.exec(id);
|
|
63
|
+
if (!match) return null;
|
|
64
|
+
const contributor = Boolean(match[4]);
|
|
65
|
+
let template = null;
|
|
66
|
+
let templateRevision = null;
|
|
67
|
+
for (const seedId of MUSE_SEED_IDS) {
|
|
68
|
+
if (SPARK_ID_RE.exec(seedId)[4] ? !contributor : contributor) continue;
|
|
69
|
+
const candidate = revisionOf(seedId);
|
|
70
|
+
if (!templateRevision || compareRevision(candidate, templateRevision) > 0) {
|
|
71
|
+
template = seedId;
|
|
72
|
+
templateRevision = candidate;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (!template) return null;
|
|
76
|
+
const revision =
|
|
77
|
+
match[3] && Number(match[3]) !== 0 ? `${match[1]}.${match[2]}.${match[3]}` : `${match[1]}.${match[2]}`;
|
|
78
|
+
return museEffortRow(
|
|
79
|
+
id,
|
|
80
|
+
`Muse Spark ${revision}${contributor ? ' (C)' : ''}`,
|
|
81
|
+
MUSE_DEFAULT_EFFORT_LEVELS,
|
|
82
|
+
MUSE_SEEDS[template].cost
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Seed row for a seeded id, else the lineage row of a revisioned Spark id, else null. */
|
|
87
|
+
export function museSeedRow(id) {
|
|
88
|
+
const key = String(id || '');
|
|
89
|
+
const seed = MUSE_SEEDS[key];
|
|
90
|
+
if (seed) return museEffortRow(key, seed.name, seed.levels, seed.cost);
|
|
91
|
+
return museLineageRow(key);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ── Xiaomi MiMo ─────────────────────────────────────────────────────────────
|
|
95
|
+
const MIMO_SEED_CONTEXT = 1_048_576;
|
|
96
|
+
const MIMO_SEED_OUTPUT = 131_072;
|
|
97
|
+
export const MIMO_SEED_MODELS = Object.freeze(
|
|
98
|
+
[
|
|
99
|
+
['mimo-v2.6-pro', 'MiMo-V2.6-Pro', MIMO_SEED_CONTEXT],
|
|
100
|
+
['mimo-v2.6-flash', 'MiMo-V2.6-Flash', MIMO_SEED_CONTEXT],
|
|
101
|
+
['mimo-v2.6-pro-ultraspeed', 'MiMo-V2.6-Pro-Ultraspeed', MIMO_SEED_CONTEXT],
|
|
102
|
+
['mimo-v2.5-pro', 'MiMo-V2.5-Pro', MIMO_SEED_CONTEXT],
|
|
103
|
+
['mimo-v2.5', 'MiMo-V2.5', MIMO_SEED_CONTEXT],
|
|
104
|
+
['mimo-v2-pro', 'MiMo-V2-Pro', MIMO_SEED_CONTEXT],
|
|
105
|
+
['mimo-v2-omni', 'MiMo-V2-Omni', 262_144],
|
|
106
|
+
].map(([id, display_name, context_window]) =>
|
|
107
|
+
Object.freeze({ id, display_name, context_window, max_output_tokens: MIMO_SEED_OUTPUT })
|
|
108
|
+
)
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
/** Exact seed id, else the longest seed whose id is a lineage prefix of the
|
|
112
|
+
* model (dated or suffixed variants of a seeded model). */
|
|
113
|
+
export function mimoSeedRow(model) {
|
|
114
|
+
const id = String(model || '').toLowerCase();
|
|
115
|
+
let seed = MIMO_SEED_MODELS.find((item) => item.id === id) || null;
|
|
116
|
+
if (!seed) {
|
|
117
|
+
for (const item of MIMO_SEED_MODELS) {
|
|
118
|
+
if (id.startsWith(`${item.id}-`) && (!seed || item.id.length > seed.id.length)) seed = item;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (!seed) return null;
|
|
122
|
+
return {
|
|
123
|
+
id: String(model),
|
|
124
|
+
contextWindow: seed.context_window,
|
|
125
|
+
outputTokens: seed.max_output_tokens,
|
|
126
|
+
reasoning: true,
|
|
127
|
+
vision: true,
|
|
128
|
+
inputModalities: ['text', 'image'],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Remote (SSH) mode switch. With MIXDOG_MODEL_PROXY=client the daemon runs on
|
|
2
|
+
// a server that must never hold model credentials: every model call is
|
|
3
|
+
// executed by the connected desktop client on the user's PC and streamed back
|
|
4
|
+
// (providers/model-proxy-channel.mjs). Read per call so a test or host can
|
|
5
|
+
// flip the environment without reloading modules.
|
|
6
|
+
export const MODEL_PROXY_ENV = 'MIXDOG_MODEL_PROXY';
|
|
7
|
+
|
|
8
|
+
export function modelProxyClientMode(env = process.env) {
|
|
9
|
+
return env?.[MODEL_PROXY_ENV] === 'client';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** The refusal every server-side credential refresh raises in this mode. */
|
|
13
|
+
export function serverModelCredentialsDisabledError(what = 'model credentials') {
|
|
14
|
+
const error = new Error(
|
|
15
|
+
`${what} are not available on this server: ${MODEL_PROXY_ENV}=client runs every model call on the client PC.`
|
|
16
|
+
);
|
|
17
|
+
error.code = 'MODEL_CREDENTIALS_DISABLED';
|
|
18
|
+
return error;
|
|
19
|
+
}
|
|
@@ -7,10 +7,19 @@
|
|
|
7
7
|
import { isAbsolute, join, relative, resolve } from 'node:path';
|
|
8
8
|
import { readJsonSafe } from './json-file.mjs';
|
|
9
9
|
|
|
10
|
-
/** `.codex-plugin/plugin.json
|
|
11
|
-
*
|
|
10
|
+
/** Manifest files in precedence order: `.codex-plugin/plugin.json`, a
|
|
11
|
+
* root-level `plugin.json`, then Claude Code's `.claude-plugin/plugin.json`. */
|
|
12
|
+
export const PLUGIN_MANIFEST_FILES = ['.codex-plugin/plugin.json', 'plugin.json', '.claude-plugin/plugin.json'];
|
|
13
|
+
|
|
14
|
+
/** First readable manifest in `PLUGIN_MANIFEST_FILES` order; a plugin without
|
|
15
|
+
* any is an empty manifest, never an error. A Claude Code manifest's `skills`
|
|
16
|
+
* is a plugin-relative path (e.g. `./.claude/skills/`). */
|
|
12
17
|
export function pluginManifest(root) {
|
|
13
|
-
|
|
18
|
+
for (const rel of PLUGIN_MANIFEST_FILES) {
|
|
19
|
+
const manifest = readJsonSafe(join(root, ...rel.split('/')));
|
|
20
|
+
if (manifest) return manifest;
|
|
21
|
+
}
|
|
22
|
+
return {};
|
|
14
23
|
}
|
|
15
24
|
|
|
16
25
|
/** Resolve a manifest-relative path, refusing absolute paths and anything
|
|
@@ -21,22 +30,22 @@ export function resolveContainedPluginPath(root, rel) {
|
|
|
21
30
|
const base = resolve(root);
|
|
22
31
|
const abs = resolve(base, trimmed);
|
|
23
32
|
const relToBase = relative(base, abs);
|
|
24
|
-
if (relToBase.
|
|
33
|
+
if (relToBase.split(/[\\/]/)[0] === '..' || isAbsolute(relToBase)) return null;
|
|
25
34
|
return abs;
|
|
26
35
|
}
|
|
27
36
|
|
|
28
|
-
/** Skill roots a plugin contributes: the conventional `<root>/skills/` plus
|
|
29
|
-
*
|
|
37
|
+
/** Skill roots a plugin contributes: the conventional `<root>/skills/` plus the
|
|
38
|
+
* manifest `skills` field, a path or a list of paths. Deduplicated, absolute,
|
|
39
|
+
* root-contained. */
|
|
30
40
|
export function pluginSkillsRoots(root) {
|
|
31
41
|
const manifest = pluginManifest(root);
|
|
32
42
|
const roots = new Set();
|
|
33
43
|
const add = (rel) => {
|
|
44
|
+
if (typeof rel !== 'string' || !rel.trim()) return;
|
|
34
45
|
const abs = resolveContainedPluginPath(root, rel);
|
|
35
46
|
if (abs) roots.add(abs);
|
|
36
47
|
};
|
|
37
48
|
add('./skills/');
|
|
38
|
-
|
|
39
|
-
add(manifest.skills.trim());
|
|
40
|
-
}
|
|
49
|
+
for (const rel of Array.isArray(manifest.skills) ? manifest.skills : [manifest.skills]) add(rel);
|
|
41
50
|
return [...roots];
|
|
42
51
|
}
|
|
@@ -66,11 +66,18 @@
|
|
|
66
66
|
},
|
|
67
67
|
"muse-code-oauth": {
|
|
68
68
|
"credentialFile": "muse-code-oauth.json",
|
|
69
|
-
"credentialPathEnv": "MUSE_CODE_OAUTH_CREDENTIALS_PATH"
|
|
69
|
+
"credentialPathEnv": "MUSE_CODE_OAUTH_CREDENTIALS_PATH",
|
|
70
|
+
"modelCatalogFile": "muse-code-oauth-models.json"
|
|
71
|
+
},
|
|
72
|
+
"command-code-oauth": {
|
|
73
|
+
"credentialFile": "command-code-oauth.json",
|
|
74
|
+
"credentialPathEnv": "COMMAND_CODE_OAUTH_CREDENTIALS_PATH",
|
|
75
|
+
"modelCatalogFile": "command-code-oauth-models.json"
|
|
70
76
|
},
|
|
71
77
|
"mimo-oauth": {
|
|
72
78
|
"credentialFile": "mimo-oauth.json",
|
|
73
|
-
"credentialPathEnv": "MIMO_OAUTH_CREDENTIALS_PATH"
|
|
79
|
+
"credentialPathEnv": "MIMO_OAUTH_CREDENTIALS_PATH",
|
|
80
|
+
"modelCatalogFile": "mimo-oauth-models.json"
|
|
74
81
|
},
|
|
75
82
|
"cursor-oauth": {
|
|
76
83
|
"credentialFile": "cursor-oauth.json",
|
|
@@ -8,6 +8,12 @@ import { ACCOUNT_PROVIDERS, providerAccountPath, readProviderAccountPool } from
|
|
|
8
8
|
import { AGENT_PROVIDER_ENV_ALIASES, getAgentApiKey } from './provider-api-key.mjs';
|
|
9
9
|
import { platformEntryKey } from './native-asset.mjs';
|
|
10
10
|
import { clean } from './clean.mjs';
|
|
11
|
+
import { MODEL_PROXY_ENV, modelProxyClientMode } from './model-proxy-mode.mjs';
|
|
12
|
+
import { installModelProxyChannel } from '../agent/orchestrator/providers/model-proxy-channel.mjs';
|
|
13
|
+
import {
|
|
14
|
+
ModelProxyBridgeChannel,
|
|
15
|
+
readModelProxyBridgeDiscovery,
|
|
16
|
+
} from '../agent/orchestrator/providers/model-proxy-bridge.mjs';
|
|
11
17
|
|
|
12
18
|
const contractPath = fileURLToPath(new URL('./pristine-execution-contract.json', import.meta.url));
|
|
13
19
|
|
|
@@ -205,6 +211,12 @@ export function createPristineExecutionBoundary({
|
|
|
205
211
|
|
|
206
212
|
const contract = PRISTINE_EXECUTION_CONTRACT;
|
|
207
213
|
const hostEnv = { ...env };
|
|
214
|
+
// Remote (SSH) mode: this server holds no model credentials, so the child
|
|
215
|
+
// runtime's model calls go through the daemon's model proxy bridge. Its
|
|
216
|
+
// endpoint is read from the HOST runtime root, before it is retargeted
|
|
217
|
+
// below; a missing or stale one fails closed (never a local credential).
|
|
218
|
+
const proxyMode = modelProxyClientMode(hostEnv);
|
|
219
|
+
const bridgeEndpoint = proxyMode ? readModelProxyBridgeDiscovery(hostEnv.MIXDOG_RUNTIME_ROOT) : null;
|
|
208
220
|
const originalEnv = new Map();
|
|
209
221
|
const touchedKeys = new Set();
|
|
210
222
|
const rememberEnv = (name) => {
|
|
@@ -227,6 +239,8 @@ export function createPristineExecutionBoundary({
|
|
|
227
239
|
mkdirSync(runtimeRoot, { recursive: true, mode: 0o700 });
|
|
228
240
|
let cleaned = false;
|
|
229
241
|
let restoreAuthBindings = () => {};
|
|
242
|
+
let bridgeChannel = null;
|
|
243
|
+
let restoreModelProxyChannel = () => {};
|
|
230
244
|
// rmSync backs off linearly (retryDelay × attempt), so 50 retries at 100ms
|
|
231
245
|
// is a ≈128s budget per attempt. Callers whose result is already complete
|
|
232
246
|
// (headless exec) pass a smaller budget and leave stragglers to the sweep.
|
|
@@ -238,6 +252,8 @@ export function createPristineExecutionBoundary({
|
|
|
238
252
|
else env[name] = value;
|
|
239
253
|
}
|
|
240
254
|
restoreAuthBindings();
|
|
255
|
+
restoreModelProxyChannel();
|
|
256
|
+
bridgeChannel?.dispose('the headless run finished');
|
|
241
257
|
const removal = { recursive: true, force: true, maxRetries: rootRemovalRetries, retryDelay: 100 };
|
|
242
258
|
// Windows releases file handles (pg.log, sockets) a beat after the owning
|
|
243
259
|
// process exits; rmSync retries absorb that EBUSY/EPERM window.
|
|
@@ -280,7 +296,7 @@ export function createPristineExecutionBoundary({
|
|
|
280
296
|
const oauth = contract.oauthProviders[selectedProvider];
|
|
281
297
|
const apiKeyEnv = contract.apiKeyProviders[selectedProvider];
|
|
282
298
|
let selectedApiKey = null;
|
|
283
|
-
if (apiKeyEnv) {
|
|
299
|
+
if (apiKeyEnv && !proxyMode) {
|
|
284
300
|
// Resolve before scrubbing so the selected provider may use its standard,
|
|
285
301
|
// MIXDOG_AGENT_*, alias, or one provider-scoped keychain account. No
|
|
286
302
|
// general config loader or all-provider credential scan is involved.
|
|
@@ -311,7 +327,15 @@ export function createPristineExecutionBoundary({
|
|
|
311
327
|
|
|
312
328
|
let authMode = 'provider-managed';
|
|
313
329
|
let catalogCount = 0;
|
|
314
|
-
if (
|
|
330
|
+
if (proxyMode) {
|
|
331
|
+
// No API key, OAuth account or credential binding: the PC behind the
|
|
332
|
+
// daemon runs every call. The runtime root stays the pristine one, for
|
|
333
|
+
// the services this run owns; only model calls reach the daemon.
|
|
334
|
+
setEnv(MODEL_PROXY_ENV, 'client');
|
|
335
|
+
bridgeChannel = new ModelProxyBridgeChannel(bridgeEndpoint);
|
|
336
|
+
restoreModelProxyChannel = installModelProxyChannel(bridgeChannel);
|
|
337
|
+
authMode = 'model-proxy-bridge';
|
|
338
|
+
} else if (oauth) {
|
|
315
339
|
// Sign-in writes the selected account of the host's provider-accounts
|
|
316
340
|
// pool; the single legacy file remains for hosts that predate the pool.
|
|
317
341
|
// An explicit credential path still overrides both. Read the pool from
|
|
@@ -340,8 +364,8 @@ export function createPristineExecutionBoundary({
|
|
|
340
364
|
[selectedProvider]: sourceCredential,
|
|
341
365
|
});
|
|
342
366
|
authMode = 'in-process-host-oauth-binding';
|
|
343
|
-
const sourceCatalog = join(sourceDataDir, oauth.modelCatalogFile);
|
|
344
|
-
if (
|
|
367
|
+
const sourceCatalog = oauth.modelCatalogFile && join(sourceDataDir, oauth.modelCatalogFile);
|
|
368
|
+
if (sourceCatalog && existsSync(sourceCatalog)) {
|
|
345
369
|
copyFileSync(sourceCatalog, join(dataDir, oauth.modelCatalogFile));
|
|
346
370
|
catalogCount = 1;
|
|
347
371
|
}
|