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
|
@@ -1,50 +1,25 @@
|
|
|
1
|
-
// MCP server configuration: add/save/remove/toggle
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
// MCP server configuration: add/save/remove/toggle of the user's servers, and
|
|
2
|
+
// the per-server intent (enabled flag) of servers registered plugins declare.
|
|
3
|
+
// Plugin servers are derived live (mcp-glue/plugin-servers.mjs) and are never
|
|
4
|
+
// written into `mcpServers`; ordinary edits refuse them.
|
|
5
5
|
import { clean } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
|
|
6
6
|
import {
|
|
7
|
-
normalizePluginMcpServerConfig,
|
|
8
|
-
pluginMcpServerName,
|
|
9
|
-
pluginRawMcpServers,
|
|
10
|
-
pluginMcpEnableScript,
|
|
11
|
-
pluginServerMatcher,
|
|
12
|
-
resolveContainedPluginPath,
|
|
13
7
|
mergeMcpServerConfig,
|
|
8
|
+
MCP_TIMEOUT_FIELD_GROUPS,
|
|
14
9
|
} from '../runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs';
|
|
10
|
+
import { withAdoptedCopies, withPinnedCollisionNames, withPluginServerIntent } from './mcp-glue/plugin-servers.mjs';
|
|
11
|
+
import { findRegisteredPlugin } from './resource-plugins-api.mjs';
|
|
15
12
|
|
|
16
13
|
/** The `mcpServers` map of a config as a fresh object (never the live one). */
|
|
17
14
|
function mcpServersOf(config) {
|
|
18
15
|
return config.mcpServers && typeof config.mcpServers === 'object' ? { ...config.mcpServers } : {};
|
|
19
16
|
}
|
|
20
17
|
|
|
21
|
-
function
|
|
22
|
-
return
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Manifest-declared servers replace every entry the plugin owned before; a
|
|
29
|
-
// single server keeps the bare name.
|
|
30
|
-
function manifestPluginMcpServers(existing, { rawServers, mcpRoot }, { plugin, serverName, env }) {
|
|
31
|
-
const keys = Object.keys(rawServers).filter((k) => {
|
|
32
|
-
const v = rawServers[k];
|
|
33
|
-
return v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
34
|
-
});
|
|
35
|
-
const owned = pluginServerMatcher(serverName);
|
|
36
|
-
const nextServers = {};
|
|
37
|
-
for (const [k, v] of Object.entries(existing || {})) {
|
|
38
|
-
if (owned(k)) continue;
|
|
39
|
-
nextServers[k] = v;
|
|
40
|
-
}
|
|
41
|
-
for (const serverKey of keys) {
|
|
42
|
-
const cfg = normalizePluginMcpServerConfig(rawServers[serverKey], mcpRoot);
|
|
43
|
-
cfg.env = { ...(cfg.env || {}), ...env };
|
|
44
|
-
if (plugin.enabled === false) cfg._mixdogPluginDisabled = true;
|
|
45
|
-
nextServers[keys.length === 1 ? serverName : `${serverName}--${serverKey}`] = cfg;
|
|
46
|
-
}
|
|
47
|
-
return nextServers;
|
|
18
|
+
function pluginOwnedError(name, owner) {
|
|
19
|
+
return new Error(
|
|
20
|
+
`MCP server "${name}" is provided by plugin "${owner.id}" (server "${owner.key}"); ` +
|
|
21
|
+
'enable or disable it with set_mcp_enabled, or manage the plugin instead'
|
|
22
|
+
);
|
|
48
23
|
}
|
|
49
24
|
|
|
50
25
|
const transportType = (type) => (type === 'streamable-http' ? 'http' : type);
|
|
@@ -63,8 +38,13 @@ function mergedServerInput(input, existing, originalName) {
|
|
|
63
38
|
if (Object.hasOwn(input, key)) maps[key] = { ...(existing[key] || {}), ...input[key] };
|
|
64
39
|
}
|
|
65
40
|
}
|
|
41
|
+
// Existing timeouts are kept by mergeMcpServerConfig; the normalizer must only
|
|
42
|
+
// see (and validate) newly supplied ones, so a stored 0/'off' never blocks
|
|
43
|
+
// an unrelated save.
|
|
44
|
+
const { ...base } = transportChanged ? {} : existing;
|
|
45
|
+
for (const field of MCP_TIMEOUT_FIELD_GROUPS.flat()) delete base[field];
|
|
66
46
|
return {
|
|
67
|
-
...
|
|
47
|
+
...base,
|
|
68
48
|
...input,
|
|
69
49
|
...maps,
|
|
70
50
|
name: clean(input.name) || originalName,
|
|
@@ -74,83 +54,142 @@ function mergedServerInput(input, existing, originalName) {
|
|
|
74
54
|
export function createMcpResourceApi({ deps, sync, decorate }) {
|
|
75
55
|
const {
|
|
76
56
|
getConfig,
|
|
77
|
-
cfgMod,
|
|
78
|
-
STANDALONE_DATA_DIR,
|
|
79
57
|
saveConfigAndAdopt,
|
|
80
58
|
normalizeMcpServerInput,
|
|
81
59
|
mcpStatus,
|
|
82
60
|
getMcpServerConfig,
|
|
61
|
+
connectConfiguredMcp,
|
|
83
62
|
reloadFullConfig,
|
|
84
63
|
awaitKeychainPrewarm,
|
|
64
|
+
pluginsStatus,
|
|
65
|
+
resolveMcpCatalog = () => ({ adoption: null, plugins: {}, entries: {} }),
|
|
66
|
+
pluginMcpServer = () => null,
|
|
67
|
+
flushSkillsSave,
|
|
85
68
|
} = deps;
|
|
86
69
|
|
|
87
|
-
/**
|
|
70
|
+
/** The config with any adoptable plugin server copies already adopted, so
|
|
71
|
+
* every write also persists the adoption and never re-adds a copy. */
|
|
72
|
+
const adoptedConfig = () => withAdoptedCopies(getConfig(), resolveMcpCatalog().adoption);
|
|
73
|
+
|
|
74
|
+
/** Persist a new `mcpServers` map; project overrides never survive a global
|
|
75
|
+
* edit. A plugin server pushed off its name by the edit keeps the collision
|
|
76
|
+
* name it gets, so it does not flip again later. */
|
|
88
77
|
const saveServers = (servers) => {
|
|
89
|
-
const nextConfig = { ...
|
|
78
|
+
const nextConfig = { ...adoptedConfig() };
|
|
90
79
|
delete nextConfig.mcpProjectOverrides;
|
|
91
80
|
saveConfigAndAdopt({ ...nextConfig, mcpServers: servers });
|
|
81
|
+
const saved = getConfig();
|
|
82
|
+
const pinned = withPinnedCollisionNames(saved, resolveMcpCatalog());
|
|
83
|
+
if (pinned !== saved) saveConfigAndAdopt(pinned);
|
|
84
|
+
};
|
|
85
|
+
const userServers = () => mcpServersOf(adoptedConfig());
|
|
86
|
+
const refusePluginServer = (name) => {
|
|
87
|
+
const owned = name ? pluginMcpServer(name) : null;
|
|
88
|
+
if (owned) throw pluginOwnedError(name, owned.owner);
|
|
89
|
+
};
|
|
90
|
+
// Peers reload config from disk on receipt: land the write before publishing.
|
|
91
|
+
const persisted = async () => {
|
|
92
|
+
await flushSkillsSave?.();
|
|
92
93
|
};
|
|
93
94
|
|
|
94
95
|
return {
|
|
96
|
+
/** One-time, idempotent: move server copies an earlier plugin enable wrote
|
|
97
|
+
* into `mcpServers` to per-server plugin intent. Returns adopted names. */
|
|
98
|
+
migratePluginMcpCopies() {
|
|
99
|
+
const { adoption } = resolveMcpCatalog();
|
|
100
|
+
if (!adoption) return [];
|
|
101
|
+
saveConfigAndAdopt(withAdoptedCopies(getConfig(), adoption));
|
|
102
|
+
return adoption.removed;
|
|
103
|
+
},
|
|
95
104
|
mcpStatus() {
|
|
96
105
|
return decorate.mcp(mcpStatus());
|
|
97
106
|
},
|
|
98
107
|
getMcpServerConfig(name) {
|
|
99
108
|
return getMcpServerConfig(name);
|
|
100
109
|
},
|
|
101
|
-
async reconnectMcp() {
|
|
110
|
+
async reconnectMcp(name) {
|
|
102
111
|
await awaitKeychainPrewarm();
|
|
103
112
|
reloadFullConfig();
|
|
104
|
-
|
|
113
|
+
const serverName = clean(name);
|
|
114
|
+
if (!serverName) return sync.reconnectMcpAndAnnounce();
|
|
115
|
+
const { enabled } = getMcpServerConfig(serverName);
|
|
116
|
+
return sync.reconnectMcpAndAnnounce({ only: serverName, enabled });
|
|
105
117
|
},
|
|
106
118
|
async addMcpServer(input = {}) {
|
|
107
119
|
const { name, config: serverConfig } = normalizeMcpServerInput(input);
|
|
108
|
-
const servers =
|
|
120
|
+
const servers = userServers();
|
|
109
121
|
if (Object.hasOwn(servers, name)) throw new Error(`MCP server already exists: ${name}`);
|
|
122
|
+
const owned = pluginMcpServer(name);
|
|
123
|
+
if (owned) throw new Error(`MCP server already exists: ${name} (provided by plugin "${owned.owner.id}")`);
|
|
110
124
|
saveServers({ ...servers, [name]: serverConfig });
|
|
111
|
-
const status = await sync.reconnectMcpAndAnnounce();
|
|
125
|
+
const status = await sync.reconnectMcpAndAnnounce({ only: name, enabled: serverConfig.enabled !== false });
|
|
112
126
|
return { name, status };
|
|
113
127
|
},
|
|
114
128
|
async saveMcpServer(input = {}) {
|
|
115
|
-
const servers =
|
|
129
|
+
const servers = userServers();
|
|
116
130
|
// An explicit originalName must exist; a bare name edits a matching
|
|
117
|
-
// server and otherwise creates a new one.
|
|
131
|
+
// server and otherwise creates a new one. Plugin servers are never
|
|
132
|
+
// edited, renamed or shadowed here.
|
|
118
133
|
const explicitOriginal = clean(input.originalName);
|
|
119
134
|
if (explicitOriginal && !Object.hasOwn(servers, explicitOriginal)) {
|
|
135
|
+
refusePluginServer(explicitOriginal);
|
|
120
136
|
throw new Error(`MCP server not configured: ${explicitOriginal}`);
|
|
121
137
|
}
|
|
122
138
|
const bareName = clean(input.name);
|
|
139
|
+
if (!explicitOriginal && !Object.hasOwn(servers, bareName)) refusePluginServer(bareName);
|
|
123
140
|
const originalName = explicitOriginal || (Object.hasOwn(servers, bareName) ? bareName : '');
|
|
124
141
|
const existing = originalName ? servers[originalName] : {};
|
|
125
142
|
const normalizedInput = normalizeMcpServerInput(mergedServerInput(input, existing, originalName));
|
|
126
143
|
const name = originalName && clean(input.name) === originalName ? originalName : normalizedInput.name;
|
|
127
|
-
if (name !== originalName && Object.hasOwn(servers, name)) {
|
|
144
|
+
if (name !== originalName && (Object.hasOwn(servers, name) || pluginMcpServer(name))) {
|
|
128
145
|
throw new Error(`MCP server already exists: ${name}`);
|
|
129
146
|
}
|
|
130
147
|
if (originalName && originalName !== name) delete servers[originalName];
|
|
131
148
|
servers[name] = mergeMcpServerConfig(existing, normalizedInput.config);
|
|
132
149
|
saveServers(servers);
|
|
133
|
-
const status = await sync.reconnectMcpAndAnnounce(
|
|
150
|
+
const status = await sync.reconnectMcpAndAnnounce({
|
|
151
|
+
only: name,
|
|
152
|
+
enabled: servers[name].enabled !== false,
|
|
153
|
+
drop: originalName && originalName !== name ? [originalName] : [],
|
|
154
|
+
});
|
|
134
155
|
return { name, source: 'config', status };
|
|
135
156
|
},
|
|
136
157
|
async removeMcpServer(name) {
|
|
137
158
|
const serverName = clean(name);
|
|
138
159
|
if (!serverName) throw new Error('MCP server name is required');
|
|
139
|
-
const servers =
|
|
160
|
+
const servers = userServers();
|
|
140
161
|
if (!Object.hasOwn(servers, serverName)) {
|
|
162
|
+
refusePluginServer(serverName);
|
|
141
163
|
throw new Error(`MCP server not configured: ${serverName}`);
|
|
142
164
|
}
|
|
143
165
|
delete servers[serverName];
|
|
144
166
|
saveServers(servers);
|
|
145
|
-
return sync.reconnectMcpAndAnnounce();
|
|
167
|
+
return sync.reconnectMcpAndAnnounce({ drop: [serverName] });
|
|
146
168
|
},
|
|
147
169
|
async setMcpServerEnabled(name, enabled) {
|
|
148
170
|
const serverName = clean(name);
|
|
149
171
|
if (!serverName) throw new Error('MCP server name is required');
|
|
150
172
|
const want = enabled !== false;
|
|
173
|
+
const owned = pluginMcpServer(serverName);
|
|
174
|
+
if (owned) {
|
|
175
|
+
// Server intent only: the effective state still requires the plugin.
|
|
176
|
+
// Only a choice that differs from the declared default is stored.
|
|
177
|
+
const { owner, pluginEnabled, declaredEnabled } = owned;
|
|
178
|
+
saveConfigAndAdopt(
|
|
179
|
+
withPluginServerIntent(adoptedConfig(), owner.id, owner.key, (intent) => ({
|
|
180
|
+
...intent,
|
|
181
|
+
enabled: want === (declaredEnabled !== false) ? undefined : want,
|
|
182
|
+
}))
|
|
183
|
+
);
|
|
184
|
+
await persisted();
|
|
185
|
+
const effective = want && pluginEnabled;
|
|
186
|
+
const status = await sync.scheduleMcpToggle(serverName, effective);
|
|
187
|
+
await sync.publish('mcp', { mcpChanges: [{ name: serverName, enabled: effective }] });
|
|
188
|
+
return status;
|
|
189
|
+
}
|
|
151
190
|
const shadowRow = mcpStatus().servers.find((s) => s.name === serverName);
|
|
152
191
|
if (!shadowRow) throw new Error(`MCP server not configured: ${serverName}`);
|
|
153
|
-
const servers =
|
|
192
|
+
const servers = userServers();
|
|
154
193
|
const current = servers[serverName];
|
|
155
194
|
if (!current || typeof current !== 'object' || Array.isArray(current)) {
|
|
156
195
|
throw new Error(`MCP server not configured: ${serverName}`);
|
|
@@ -158,41 +197,39 @@ export function createMcpResourceApi({ deps, sync, decorate }) {
|
|
|
158
197
|
servers[serverName] = { ...current, enabled: want };
|
|
159
198
|
saveServers(servers);
|
|
160
199
|
const status = await sync.scheduleMcpToggle(serverName, want);
|
|
161
|
-
await sync.publish('mcp');
|
|
200
|
+
await sync.publish('mcp', { mcpChanges: [{ name: serverName, enabled: want }] });
|
|
162
201
|
return status;
|
|
163
202
|
},
|
|
203
|
+
/** Kept for older callers: plugin servers appear on their own once the
|
|
204
|
+
* plugin is registered and enabled. This clears any per-server "off"
|
|
205
|
+
* intent of the plugin's servers and reconnects them (here and on peers);
|
|
206
|
+
* a disabled plugin stays disabled. */
|
|
164
207
|
async enablePluginMcp(plugin = {}) {
|
|
165
|
-
const
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
throw new Error(`plugin MCP script not found: ${join(root, script)}`);
|
|
182
|
-
nextConfig.mcpServers = {
|
|
183
|
-
...(nextConfig.mcpServers || {}),
|
|
184
|
-
[serverName]: {
|
|
185
|
-
command: 'node',
|
|
186
|
-
args: [scriptPath],
|
|
187
|
-
cwd: root,
|
|
188
|
-
env,
|
|
189
|
-
...(plugin.enabled === false ? { _mixdogPluginDisabled: true } : {}),
|
|
190
|
-
},
|
|
191
|
-
};
|
|
208
|
+
const registered = findRegisteredPlugin(pluginsStatus, plugin) || plugin;
|
|
209
|
+
const id = clean(registered.id || registered.name);
|
|
210
|
+
const catalog = resolveMcpCatalog();
|
|
211
|
+
const row = catalog.plugins[id];
|
|
212
|
+
if (!row) throw new Error(`plugin not registered: ${clean(plugin.id || plugin.name || plugin) || id}`);
|
|
213
|
+
if (!row.servers.length) {
|
|
214
|
+
const detail = row.errors.map((error) => error.message).join('; ');
|
|
215
|
+
throw new Error(`plugin declares no MCP servers${detail ? `: ${detail}` : ''}`);
|
|
216
|
+
}
|
|
217
|
+
let next = withAdoptedCopies(getConfig(), catalog.adoption);
|
|
218
|
+
for (const name of row.servers) {
|
|
219
|
+
const { owner, declaredEnabled } = catalog.entries[name];
|
|
220
|
+
next = withPluginServerIntent(next, id, owner.key, (intent) => ({
|
|
221
|
+
...intent,
|
|
222
|
+
enabled: declaredEnabled === false ? true : undefined,
|
|
223
|
+
}));
|
|
192
224
|
}
|
|
193
|
-
saveConfigAndAdopt(
|
|
194
|
-
|
|
195
|
-
|
|
225
|
+
saveConfigAndAdopt(next);
|
|
226
|
+
await persisted();
|
|
227
|
+
const mcpChanges = row.servers.map((name) => ({ name, enabled: row.enabled }));
|
|
228
|
+
let status;
|
|
229
|
+
for (const change of mcpChanges)
|
|
230
|
+
status = await connectConfiguredMcp({ only: change.name, enabled: change.enabled });
|
|
231
|
+
await sync.announce('mcp', { detail: { mcpChanges } });
|
|
232
|
+
return { serverName: row.servers[0], serverNames: row.servers, status };
|
|
196
233
|
},
|
|
197
234
|
};
|
|
198
235
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
// Plugin registry edits
|
|
1
|
+
// Plugin registry edits. A plugin's MCP servers are derived from the registry
|
|
2
|
+
// (mcp-glue/plugin-servers.mjs), so each edit reconciles this runtime's MCP
|
|
3
|
+
// connections and then lets peer runtimes reconcile theirs.
|
|
2
4
|
import { clean } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
|
|
3
5
|
import {
|
|
4
6
|
addPlugin as registryAddPlugin,
|
|
@@ -6,7 +8,7 @@ import {
|
|
|
6
8
|
setPluginEnabled as registrySetPluginEnabled,
|
|
7
9
|
updatePlugin as registryUpdatePlugin,
|
|
8
10
|
} from './services/plugin-admin.mjs';
|
|
9
|
-
import {
|
|
11
|
+
import { withAdoptedCopies, withoutPluginIntents, withPinnedCollisionNames } from './mcp-glue/plugin-servers.mjs';
|
|
10
12
|
|
|
11
13
|
const pluginKey = (plugin) => clean(plugin.id || plugin.name || plugin);
|
|
12
14
|
|
|
@@ -24,22 +26,22 @@ export function createPluginsResourceApi({ deps, sync, decorate }) {
|
|
|
24
26
|
getConfig,
|
|
25
27
|
cfgMod,
|
|
26
28
|
saveConfigAndAdopt,
|
|
27
|
-
connectConfiguredMcp,
|
|
28
|
-
invalidatePreSessionToolSurface,
|
|
29
29
|
pluginsStatus,
|
|
30
|
+
resolveMcpCatalog = () => ({ adoption: null }),
|
|
31
|
+
flushSkillsSave,
|
|
30
32
|
} = deps;
|
|
31
33
|
const pluginData = () => cfgMod.getPluginData?.();
|
|
32
34
|
|
|
33
|
-
/**
|
|
34
|
-
*
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
/** Persist any adoptable copies of plugin servers while the registry still
|
|
36
|
+
* knows their plugin (a removal must not leave them stranded), and keep any
|
|
37
|
+
* collision name a plugin server was just given. */
|
|
38
|
+
async function adoptPluginServerCopies(transform = (config) => config) {
|
|
39
|
+
const current = getConfig();
|
|
40
|
+
const catalog = resolveMcpCatalog();
|
|
41
|
+
const next = transform(withPinnedCollisionNames(withAdoptedCopies(current, catalog.adoption), catalog));
|
|
42
|
+
if (next === current) return;
|
|
43
|
+
saveConfigAndAdopt(next);
|
|
44
|
+
await flushSkillsSave?.();
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
return {
|
|
@@ -47,49 +49,35 @@ export function createPluginsResourceApi({ deps, sync, decorate }) {
|
|
|
47
49
|
return decorate.plugins(pluginsStatus());
|
|
48
50
|
},
|
|
49
51
|
async reloadPlugins() {
|
|
50
|
-
await sync.
|
|
52
|
+
await sync.reconcilePluginsAndAnnounce();
|
|
51
53
|
return pluginsStatus();
|
|
52
54
|
},
|
|
53
55
|
async addPlugin(source) {
|
|
54
56
|
const plugin = registryAddPlugin(source, { dataDir: pluginData() });
|
|
55
|
-
await
|
|
57
|
+
await adoptPluginServerCopies();
|
|
58
|
+
await sync.reconcilePluginsAndAnnounce();
|
|
56
59
|
return { plugin, status: pluginsStatus() };
|
|
57
60
|
},
|
|
58
61
|
async updatePlugin(plugin = {}) {
|
|
59
62
|
const updated = registryUpdatePlugin(pluginKey(plugin), { dataDir: pluginData() });
|
|
60
|
-
await
|
|
63
|
+
await adoptPluginServerCopies();
|
|
64
|
+
await sync.reconcilePluginsAndAnnounce();
|
|
61
65
|
return { plugin: updated, status: pluginsStatus() };
|
|
62
66
|
},
|
|
63
67
|
async setPluginEnabled(plugin = {}, enabled = true) {
|
|
64
|
-
|
|
68
|
+
await adoptPluginServerCopies();
|
|
65
69
|
const updated = registrySetPluginEnabled(pluginKey(plugin), enabled, { dataDir: pluginData() });
|
|
66
|
-
await
|
|
67
|
-
const next = {};
|
|
68
|
-
for (const [name, value] of Object.entries(servers)) {
|
|
69
|
-
const config = value && typeof value === 'object' && !Array.isArray(value) ? { ...value } : value;
|
|
70
|
-
if (owned(name) && config && typeof config === 'object' && !Array.isArray(config)) {
|
|
71
|
-
if (enabled === false) config._mixdogPluginDisabled = true;
|
|
72
|
-
else delete config._mixdogPluginDisabled;
|
|
73
|
-
}
|
|
74
|
-
next[name] = config;
|
|
75
|
-
}
|
|
76
|
-
return next;
|
|
77
|
-
});
|
|
78
|
-
await sync.announce('plugins');
|
|
70
|
+
await sync.reconcilePluginsAndAnnounce();
|
|
79
71
|
return { plugin: updated, status: pluginsStatus() };
|
|
80
72
|
},
|
|
81
73
|
async removePlugin(plugin = {}) {
|
|
82
|
-
|
|
83
|
-
const
|
|
74
|
+
const owner = findRegisteredPlugin(pluginsStatus, plugin);
|
|
75
|
+
const ownerId = clean(owner?.id);
|
|
76
|
+
// Adopt first (the registry still knows the plugin), then drop the
|
|
77
|
+
// plugin's per-server intent together with the plugin.
|
|
78
|
+
await adoptPluginServerCopies((config) => (ownerId ? withoutPluginIntents(config, ownerId) : config));
|
|
84
79
|
const removed = registryRemovePlugin(pluginKey(plugin), { dataDir: pluginData() });
|
|
85
|
-
await
|
|
86
|
-
const next = { ...servers };
|
|
87
|
-
for (const name of Object.keys(next)) {
|
|
88
|
-
if (owned(name)) delete next[name];
|
|
89
|
-
}
|
|
90
|
-
return next;
|
|
91
|
-
});
|
|
92
|
-
await sync.announce('plugins');
|
|
80
|
+
await sync.reconcilePluginsAndAnnounce();
|
|
93
81
|
return { plugin: removed, status: pluginsStatus() };
|
|
94
82
|
},
|
|
95
83
|
};
|
|
@@ -7,19 +7,17 @@ import {
|
|
|
7
7
|
cwdWithinProjects,
|
|
8
8
|
extensionScopeProjects,
|
|
9
9
|
extensionScopesFromConfig,
|
|
10
|
-
pluginIdForMcpServer,
|
|
11
10
|
} from '../runtime/agent/orchestrator/runtime-core/extension-scopes.mjs';
|
|
12
11
|
|
|
13
12
|
function listOf(status, key) {
|
|
14
13
|
return Array.isArray(status?.[key]) ? status[key] : [];
|
|
15
14
|
}
|
|
16
15
|
|
|
17
|
-
export function createScopeDecorators({ getConfig, getCurrentCwd
|
|
18
|
-
function scopeInfo(kind, name, pluginId = '') {
|
|
16
|
+
export function createScopeDecorators({ getConfig, getCurrentCwd }) {
|
|
17
|
+
function scopeInfo(kind, name, pluginId = '', cwd = getCurrentCwd()) {
|
|
19
18
|
const scopes = extensionScopesFromConfig(getConfig());
|
|
20
19
|
const scope = extensionScopeProjects(scopes, kind, name);
|
|
21
20
|
const inheritedScope = pluginId ? extensionScopeProjects(scopes, 'plugins', pluginId) : null;
|
|
22
|
-
const cwd = getCurrentCwd();
|
|
23
21
|
const activeHere =
|
|
24
22
|
(scope ? cwdWithinProjects(cwd, scope) : true) &&
|
|
25
23
|
(inheritedScope ? cwdWithinProjects(cwd, inheritedScope) : true);
|
|
@@ -27,21 +25,21 @@ export function createScopeDecorators({ getConfig, getCurrentCwd, pluginsStatus
|
|
|
27
25
|
}
|
|
28
26
|
return {
|
|
29
27
|
mcp(status) {
|
|
30
|
-
const plugins = pluginsStatus()?.plugins || [];
|
|
31
28
|
return {
|
|
32
29
|
...status,
|
|
33
30
|
servers: listOf(status, 'servers').map((server) => ({
|
|
34
31
|
...server,
|
|
35
|
-
...scopeInfo('mcp', server.name,
|
|
32
|
+
...scopeInfo('mcp', server.name, server?.owner?.kind === 'plugin' ? clean(server.owner.id) : ''),
|
|
36
33
|
})),
|
|
37
34
|
};
|
|
38
35
|
},
|
|
39
|
-
|
|
36
|
+
/** `cwd`: decide `activeHere` for that folder instead of the current one. */
|
|
37
|
+
skills(status, cwd = getCurrentCwd()) {
|
|
40
38
|
return {
|
|
41
39
|
...status,
|
|
42
40
|
skills: listOf(status, 'skills').map((skill) => ({
|
|
43
41
|
...skill,
|
|
44
|
-
...scopeInfo('skills', skill.name, skill?.owner?.kind === 'plugin' ? clean(skill.owner.id) : ''),
|
|
42
|
+
...scopeInfo('skills', skill.name, skill?.owner?.kind === 'plugin' ? clean(skill.owner.id) : '', cwd),
|
|
45
43
|
})),
|
|
46
44
|
};
|
|
47
45
|
},
|
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
// Global Skill documents and the disabled-skill list.
|
|
2
|
+
import { statSync } from 'node:fs';
|
|
3
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
4
|
+
|
|
5
|
+
/** `skillsStatus({ cwd })`: the folder to list and scope skills for, in place
|
|
6
|
+
* of the session's own. Only an existing absolute directory; it reads the
|
|
7
|
+
* same skill roots a session opened there would, nothing wider. */
|
|
8
|
+
function statusCwd(options) {
|
|
9
|
+
if (options == null) return '';
|
|
10
|
+
const cwd = options?.cwd;
|
|
11
|
+
if (typeof cwd !== 'string' || !cwd || cwd.includes('\0') || !isAbsolute(cwd)) {
|
|
12
|
+
throw new TypeError('skillsStatus cwd must be an absolute path.');
|
|
13
|
+
}
|
|
14
|
+
const folder = resolve(cwd);
|
|
15
|
+
if (!statSync(folder, { throwIfNoEntry: false })?.isDirectory()) {
|
|
16
|
+
throw new TypeError('skillsStatus cwd is not a directory.');
|
|
17
|
+
}
|
|
18
|
+
return folder;
|
|
19
|
+
}
|
|
20
|
+
|
|
2
21
|
export function createSkillsResourceApi({ deps, sync, decorate }) {
|
|
3
22
|
const {
|
|
4
23
|
skillsStatus,
|
|
@@ -11,8 +30,10 @@ export function createSkillsResourceApi({ deps, sync, decorate }) {
|
|
|
11
30
|
flushSkillsSave,
|
|
12
31
|
} = deps;
|
|
13
32
|
return {
|
|
14
|
-
skillsStatus() {
|
|
15
|
-
|
|
33
|
+
skillsStatus(options) {
|
|
34
|
+
const cwd = statusCwd(options);
|
|
35
|
+
if (!cwd) return decorate.skills(skillsStatus());
|
|
36
|
+
return decorate.skills(skillsStatus({ cwd }), cwd);
|
|
16
37
|
},
|
|
17
38
|
skillContent(name) {
|
|
18
39
|
return skillContent(name);
|
|
@@ -5,6 +5,7 @@ import { ensureProviderEnabled } from '../runtime/agent/orchestrator/runtime-cor
|
|
|
5
5
|
import { clean } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
|
|
6
6
|
import { effortItemsFor } from '../runtime/agent/orchestrator/runtime-core/effort.mjs';
|
|
7
7
|
import { runAbortable, throwIfAborted } from '../runtime/shared/abort-race.mjs';
|
|
8
|
+
import { normalizeContextTokens } from '../runtime/shared/llm/default-context-window.mjs';
|
|
8
9
|
import { resolveRouteContextState, resolveRouteEffortState, routeModelDisplay } from './route-state.mjs';
|
|
9
10
|
|
|
10
11
|
export function createRouteResolution({ rt, collectProviderModels, ensureProvidersReady, lookupModelMeta }) {
|
|
@@ -53,14 +54,22 @@ export function createRouteResolution({ rt, collectProviderModels, ensureProvide
|
|
|
53
54
|
const selectedContextWindow = [contextState.selectedContextWindow, contextOption?.contextWindow]
|
|
54
55
|
.map(Number)
|
|
55
56
|
.find((value) => value > 0);
|
|
57
|
+
// Without a known window the exact selection is kept as requested; with
|
|
58
|
+
// one it is the clamped value, absent when it is the default window.
|
|
59
|
+
const contextTokens =
|
|
60
|
+
contextState.contextDefaultPercent === undefined
|
|
61
|
+
? normalizeContextTokens(targetRoute.contextTokens)
|
|
62
|
+
: contextState.contextTokens;
|
|
63
|
+
const { contextTokens: _requestedTokens, ...routeFields } = targetRoute;
|
|
56
64
|
rt.route = {
|
|
57
|
-
...
|
|
65
|
+
...routeFields,
|
|
58
66
|
fast: fastCapable ? targetRoute.fast === true : false,
|
|
59
67
|
fastCapable,
|
|
60
68
|
effectiveEffort,
|
|
61
69
|
effortOptions: effortItemsFor(rt.route.provider, modelMeta, effectiveEffort),
|
|
62
70
|
contextPercent: contextState.contextPercent,
|
|
63
71
|
contextDefaultPercent: contextState.contextDefaultPercent,
|
|
72
|
+
...(contextTokens ? { contextTokens } : {}),
|
|
64
73
|
...(selectedContextWindow ? { selectedContextWindow } : {}),
|
|
65
74
|
...(modelDisplay ? { modelDisplay } : {}),
|
|
66
75
|
};
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
// Pure route derivations: the effective effort / Fast capability of a route
|
|
2
2
|
// against provider model metadata, and its context-window percentage.
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
modelMetaLooksResolved,
|
|
5
|
+
modelSettingsFor,
|
|
6
|
+
} from '../runtime/agent/orchestrator/runtime-core/config-helpers.mjs';
|
|
4
7
|
import { clean, hasOwn } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
|
|
5
8
|
import { coerceEffortFor } from '../runtime/agent/orchestrator/runtime-core/effort.mjs';
|
|
6
9
|
import { fastCapableFor } from '../runtime/agent/orchestrator/runtime-core/model-capabilities.mjs';
|
|
7
10
|
import { providerCachedModelMetadataSync } from '../runtime/agent/orchestrator/providers/provider-catalog-cache.mjs';
|
|
8
|
-
import { contextWindowRange } from '../runtime/shared/llm/default-context-window.mjs';
|
|
11
|
+
import { contextWindowRange, normalizeContextTokens } from '../runtime/shared/llm/default-context-window.mjs';
|
|
9
12
|
|
|
10
13
|
export function resolveRouteEffortState(targetRoute = {}, modelMeta = null) {
|
|
11
14
|
const requested = hasOwn(targetRoute, 'effort') ? targetRoute.effort : targetRoute.preset?.effort || null;
|
|
@@ -68,6 +71,17 @@ export function resolveRouteContextState(targetRoute = {}, modelMeta = null, win
|
|
|
68
71
|
return { contextPercent: undefined, contextDefaultPercent: undefined, selectedContextWindow: undefined };
|
|
69
72
|
}
|
|
70
73
|
const contextDefaultPercent = Math.max(10, Math.min(100, Math.round((defaultWindow / maxWindow) * 10) * 10));
|
|
74
|
+
// An exact token selection overrides the 10% stops. It is clamped to the
|
|
75
|
+
// selectable range; one that lands on the default window is the default.
|
|
76
|
+
const requestedTokens = normalizeContextTokens(targetRoute?.contextTokens);
|
|
77
|
+
if (requestedTokens) {
|
|
78
|
+
const contextTokens = Math.max(Math.ceil(maxWindow * 0.1), Math.min(maxWindow, requestedTokens));
|
|
79
|
+
if (contextTokens === defaultWindow) {
|
|
80
|
+
return { contextPercent: contextDefaultPercent, contextDefaultPercent, selectedContextWindow: defaultWindow };
|
|
81
|
+
}
|
|
82
|
+
const contextPercent = Math.max(10, Math.min(100, Math.round((contextTokens / maxWindow) * 10) * 10));
|
|
83
|
+
return { contextPercent, contextDefaultPercent, selectedContextWindow: contextTokens, contextTokens };
|
|
84
|
+
}
|
|
71
85
|
const requested = Number(targetRoute?.contextPercent);
|
|
72
86
|
const contextPercent =
|
|
73
87
|
Number.isFinite(requested) && requested > 0
|
|
@@ -20,6 +20,7 @@ function bootParams({
|
|
|
20
20
|
fast,
|
|
21
21
|
modelParameters,
|
|
22
22
|
contextPercent,
|
|
23
|
+
contextTokens,
|
|
23
24
|
selectedContextWindow,
|
|
24
25
|
cwd = process.cwd(),
|
|
25
26
|
toolMode = 'full',
|
|
@@ -30,6 +31,7 @@ function bootParams({
|
|
|
30
31
|
initialConfig = null,
|
|
31
32
|
desktopSession = null,
|
|
32
33
|
sessionProfile = null,
|
|
34
|
+
worktree = null,
|
|
33
35
|
executeAgentControl = null,
|
|
34
36
|
} = {}) {
|
|
35
37
|
return {
|
|
@@ -39,6 +41,7 @@ function bootParams({
|
|
|
39
41
|
fast,
|
|
40
42
|
modelParameters,
|
|
41
43
|
contextPercent,
|
|
44
|
+
contextTokens,
|
|
42
45
|
selectedContextWindow,
|
|
43
46
|
cwd,
|
|
44
47
|
toolMode,
|
|
@@ -49,6 +52,8 @@ function bootParams({
|
|
|
49
52
|
initialConfig,
|
|
50
53
|
desktopSession,
|
|
51
54
|
sessionProfile,
|
|
55
|
+
// Creation-time worktree intent (workspace/transitions.mjs creationIntent).
|
|
56
|
+
worktree,
|
|
52
57
|
executeAgentControl,
|
|
53
58
|
};
|
|
54
59
|
}
|
|
@@ -74,6 +74,10 @@ export function createRuntimeFacade({
|
|
|
74
74
|
get fast() {
|
|
75
75
|
return state.route.fast === true;
|
|
76
76
|
},
|
|
77
|
+
// The route's Auto effort switch; absent means on.
|
|
78
|
+
get autoEffort() {
|
|
79
|
+
return state.route.autoEffort !== false;
|
|
80
|
+
},
|
|
77
81
|
get fastCapable() {
|
|
78
82
|
return state.route.fastCapable === true;
|
|
79
83
|
},
|
|
@@ -94,6 +98,10 @@ export function createRuntimeFacade({
|
|
|
94
98
|
// Picker preference for a new/inherited session, not the live gauge.
|
|
95
99
|
return state.route?.contextPercent ?? state.session?.contextPercent ?? null;
|
|
96
100
|
},
|
|
101
|
+
get contextTokens() {
|
|
102
|
+
// Exact window preference in tokens; null when the route uses a percent stop.
|
|
103
|
+
return state.route ? state.route.contextTokens || null : state.session?.contextTokens || null;
|
|
104
|
+
},
|
|
97
105
|
get rawContextWindow() {
|
|
98
106
|
return state.session?.rawContextWindow || state.session?.contextWindow || null;
|
|
99
107
|
},
|
|
@@ -2,7 +2,10 @@ import { registerCacheInvalidationListener } from '../runtime/agent/orchestrator
|
|
|
2
2
|
import { turnReviewReply } from '../runtime/shared/turn-review-reply.mjs';
|
|
3
3
|
import {
|
|
4
4
|
getSessionReviewDiff,
|
|
5
|
+
getTurnChanges,
|
|
5
6
|
getTurnReviewDiff,
|
|
7
|
+
reapplyTurnChanges,
|
|
8
|
+
revertTurnChanges,
|
|
6
9
|
revertTurnReview,
|
|
7
10
|
revertTurnReviewFile,
|
|
8
11
|
} from '../runtime/shared/turn-snapshot.mjs';
|
|
@@ -22,5 +25,11 @@ export function createRuntimeReviewApi({ getCwd, getSessionId }) {
|
|
|
22
25
|
getSessionReviewDiff: () => getSessionReviewDiff(getCwd(), getSessionId()),
|
|
23
26
|
revertTurnReview: (checkpointId) => revertTurnReview(getCwd(), getSessionId(), checkpointId),
|
|
24
27
|
revertTurnReviewFile: (file, checkpointId) => revertTurnReviewFile(getCwd(), getSessionId(), file, checkpointId),
|
|
28
|
+
// Historical per-turn changes, addressed by checkpointId (TurnChangesReply).
|
|
29
|
+
getTurnChanges: (options = {}) => getTurnChanges(getSessionId(), options),
|
|
30
|
+
revertTurnChanges: (checkpointId, file, revision) =>
|
|
31
|
+
revertTurnChanges(getSessionId(), checkpointId, file, revision),
|
|
32
|
+
reapplyTurnChanges: (checkpointId, file, revision) =>
|
|
33
|
+
reapplyTurnChanges(getSessionId(), checkpointId, file, revision),
|
|
25
34
|
};
|
|
26
35
|
}
|