mixdog 1.4.2 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/scripts/build-shipped-history.mjs +15 -5
- package/scripts/gate-local.mjs +65 -19
- package/scripts/graph-parity.mjs +8 -3
- package/scripts/lib/gate-scheduler.mjs +2 -1
- package/scripts/lib/run-node-tests.mjs +17 -5
- package/scripts/lib/test-failure-summary.mjs +1 -8
- package/scripts/lib/test-spawn-ledger.mjs +33 -2
- package/scripts/post-release-check.mjs +26 -16
- package/scripts/provider-pingpong-live.mjs +1 -1
- package/scripts/prune-embedding-runtime.mjs +3 -1
- package/scripts/release-paths.mjs +7 -1
- package/src/defaults/shipped-history.json +20 -0
- package/src/defaults/skills/setup/SKILL.md +2 -2
- package/src/defaults/skills/setup/references/actions.md +16 -3
- package/src/defaults/skills/setup/references/surfaces.md +3 -0
- package/src/defaults/skills/setup-guide/SKILL.md +6 -1
- package/src/lib/instruction-text.cjs +36 -0
- package/src/lib/rules-builder.cjs +34 -20
- package/src/orchestration/balanced.md +23 -0
- package/src/orchestration/focused.md +22 -0
- package/src/orchestration/none.md +5 -0
- package/src/orchestration/swarm.md +24 -0
- package/src/rules/agent-mode/AGENT_MODE.md +3 -1
- package/src/rules/agent-mode/MIXY.md +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +0 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +4 -2
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +0 -9
- package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +4 -4
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -1
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +199 -46
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +3 -5
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +9 -3
- package/src/runtime/agent/orchestrator/mcp/client.mjs +3 -5
- package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
- package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +10 -1
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +30 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
- package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
- package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
- package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
- package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
- package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
- package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -48
- package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
- package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +9 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
- package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
- package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +1 -2
- package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +57 -26
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +19 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +19 -10
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +31 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +42 -6
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
- package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
- package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +14 -5
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +7 -3
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +27 -9
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
- package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +0 -4
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
- package/src/runtime/attachments/attachment-reference.mjs +1 -1
- package/src/runtime/attachments/pdf-extract.mjs +1 -1
- package/src/runtime/attachments/store.d.mts +1 -0
- package/src/runtime/attachments/store.mjs +2 -2
- package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
- package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
- package/src/runtime/channels/lib/scheduler.mjs +33 -0
- package/src/runtime/channels/lib/schedules-db.mjs +11 -4
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
- package/src/runtime/channels/lib/whisper-server.mjs +12 -12
- package/src/runtime/channels/lib/worker-main.mjs +9 -31
- package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
- package/src/runtime/connectors/connector-accounts-mcp.mjs +169 -33
- package/src/runtime/connectors/gmail-app-password.mjs +2 -2
- package/src/runtime/connectors/google-mcp.mjs +1 -1
- package/src/runtime/effort-judge/judge-client.mjs +2 -2
- package/src/runtime/effort-judge/judge-input.mjs +4 -4
- package/src/runtime/explore/explorer.mjs +0 -5
- package/src/runtime/explore/tool.mjs +3 -3
- package/src/runtime/local-provider/hardware.mjs +1 -1
- package/src/runtime/media/adapters/codex-image.mjs +3 -3
- package/src/runtime/media/adapters/gemini-video.mjs +1 -1
- package/src/runtime/media/media-usage.mjs +1 -1
- package/src/runtime/media/store.mjs +1 -1
- package/src/runtime/memory/index.mjs +11 -1
- package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
- package/src/runtime/memory/lib/memory-embed.mjs +83 -14
- package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
- package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
- package/src/runtime/memory/lib/memory.mjs +17 -0
- package/src/runtime/memory/lib/pg/process.mjs +1 -1
- package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
- package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
- package/src/runtime/office/capabilities.mjs +1 -1
- package/src/runtime/office/core/office-core.mjs +1 -1
- package/src/runtime/office/design/content-model.mjs +3 -3
- package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
- package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
- package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
- package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
- package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
- package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
- package/src/runtime/office/portable/portable-soffice.mjs +8 -6
- package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
- package/src/runtime/shared/atomic-file.d.mts +8 -0
- package/src/runtime/shared/background-tasks.mjs +22 -4
- package/src/runtime/shared/background-wait.mjs +66 -0
- package/src/runtime/shared/child-guardian.mjs +17 -7
- package/src/runtime/shared/config.mjs +313 -16
- package/src/runtime/shared/connector-catalog.d.mts +4 -5
- package/src/runtime/shared/connector-catalog.mjs +11 -1
- package/src/runtime/shared/file-lock.mjs +8 -3
- package/src/runtime/shared/git-runner.mjs +7 -2
- package/src/runtime/shared/idle-gc.mjs +30 -7
- package/src/runtime/shared/llm/http-agent.mjs +8 -5
- package/src/runtime/shared/llm/system-proxy.mjs +2 -1
- package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
- package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
- package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
- package/src/runtime/shared/maintenance-schedule.mjs +109 -0
- package/src/runtime/shared/process-runner.mjs +8 -4
- package/src/runtime/shared/routine-trigger.d.mts +13 -0
- package/src/runtime/shared/routine-trigger.mjs +34 -0
- package/src/runtime/shared/run-child.d.mts +2 -1
- package/src/runtime/shared/run-child.mjs +70 -18
- package/src/runtime/shared/session-scratch.mjs +14 -2
- package/src/runtime/shared/shipped-definitions.mjs +7 -1
- package/src/runtime/shared/tool-card-model.golden.json +3 -12
- package/src/runtime/shared/tool-execution-contract.mjs +2 -0
- package/src/runtime/shared/tool-work-units.mjs +31 -6
- package/src/runtime/shared/turn-snapshot.mjs +26 -4
- package/src/runtime/shared/turn-worktree-snapshot.mjs +6 -11
- package/src/runtime/shared/worker-requests.mjs +17 -3
- package/src/runtime/shared/worktrees/branch-management.mjs +1 -5
- package/src/runtime/shared/worktrees/contract.mjs +16 -6
- package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
- package/src/runtime/shared/worktrees/disk.mjs +79 -2
- package/src/runtime/shared/worktrees/git.mjs +44 -11
- package/src/runtime/shared/worktrees/include.mjs +6 -4
- package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
- package/src/runtime/shared/worktrees/manager.mjs +772 -75
- package/src/runtime/shared/worktrees/settings.mjs +33 -7
- package/src/runtime/shared/worktrees/test-support.mjs +5 -1
- package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
- package/src/runtime/tidy/process.mjs +2 -1
- package/src/runtime/web-search/index.mjs +3 -22
- package/src/runtime/web-search/lib/web-tools.mjs +2 -2
- package/src/runtime/web-search/tool-defs.mjs +17 -26
- package/src/session-runtime/agent-profile-changes.mjs +55 -4
- package/src/session-runtime/boot/apis.mjs +27 -4
- package/src/session-runtime/boot/begin.mjs +2 -0
- package/src/session-runtime/boot/config.mjs +10 -1
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/providers.mjs +70 -3
- package/src/session-runtime/boot/session.mjs +2 -0
- package/src/session-runtime/boot/tools.mjs +69 -25
- package/src/session-runtime/channel-config-api.mjs +1 -0
- package/src/session-runtime/config-change-effects.mjs +179 -0
- package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
- package/src/session-runtime/config-lifecycle.mjs +160 -24
- package/src/session-runtime/conversation-import/discovery.mjs +86 -7
- package/src/session-runtime/conversation-import/service.mjs +3 -2
- package/src/session-runtime/goal-facade-api.mjs +49 -3
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +3 -11
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +18 -4
- package/src/session-runtime/internal-tool-executor.mjs +12 -19
- package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
- package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
- package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +4 -4
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/server-catalog.mjs +14 -3
- package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
- package/src/session-runtime/model-route/set-route.mjs +40 -7
- package/src/session-runtime/native-web-search/routes.mjs +3 -3
- package/src/session-runtime/provider-auth/refresh.mjs +6 -3
- package/src/session-runtime/provider-auth/setup.mjs +1 -1
- package/src/session-runtime/provider-readiness.mjs +53 -4
- package/src/session-runtime/resource-api.mjs +1 -1
- package/src/session-runtime/resource-extension-sync.mjs +4 -8
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +5 -1
- package/src/session-runtime/resource-mcp-secrets.mjs +3 -3
- package/src/session-runtime/resource-plugins-api.mjs +4 -0
- package/src/session-runtime/routine-executor.mjs +152 -0
- package/src/session-runtime/routine-home-turn.mjs +46 -5
- package/src/session-runtime/runtime-facade.mjs +5 -0
- package/src/session-runtime/runtime-feature-gates.mjs +2 -11
- package/src/session-runtime/schedule-session-run.mjs +1 -0
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +110 -6
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +24 -6
- package/src/session-runtime/services/agent-tool.mjs +51 -1
- package/src/session-runtime/services/channel-admin.mjs +18 -0
- package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
- package/src/session-runtime/services/plugin-admin.mjs +4 -0
- package/src/session-runtime/services/seeds.mjs +7 -0
- package/src/session-runtime/services/usage-stats-model.mjs +32 -11
- package/src/session-runtime/session-create/materialize.mjs +4 -2
- package/src/session-runtime/session-create/session-options.mjs +2 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +1 -9
- package/src/session-runtime/setup-tool/connector-widen-approval.mjs +1 -1
- package/src/session-runtime/setup-tool/executor.mjs +8 -1
- package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
- package/src/session-runtime/setup-tool/tool-defs.mjs +26 -1
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
- package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
- package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
- package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
- package/src/session-runtime/tool-policy-refresh.mjs +182 -5
- package/src/session-runtime/tool-surface.mjs +38 -1
- package/src/session-runtime/turn/agent-ops.mjs +10 -2
- package/src/session-runtime/turn/session-ops.mjs +2 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
- package/src/session-runtime/turn/turn-run.mjs +1 -1
- package/src/session-runtime/webhook-session-run.mjs +2 -0
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +1 -4
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +3 -10
- package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
- package/src/session-runtime/workflow-agents-api.mjs +2 -0
- package/src/session-runtime/workspace/project-branches.mjs +1 -1
- package/src/session-runtime/workspace/session-view.mjs +1 -1
- package/src/session-runtime/workspace/transitions.mjs +20 -4
- package/src/session-runtime/workspace/worktree-maintenance.mjs +126 -6
- package/src/session-runtime/workspace/worktree-setup.mjs +13 -1
- package/src/session-runtime/workspace/worktree-tool.mjs +16 -0
- package/src/standalone/daemon-agent-control.mjs +25 -8
- package/src/standalone/daemon-desktop-runtime.mjs +6 -2
- package/src/standalone/daemon-lag-profiler.mjs +7 -7
- package/src/standalone/daemon.mjs +54 -2
- package/src/standalone/local-session-runtime.mjs +16 -0
- package/src/standalone/session-client/daemon-unavailable.mjs +1 -1
- package/src/standalone/session-protocol.mjs +11 -0
- package/src/standalone/session-service/agent-route-follow.mjs +23 -20
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
- package/src/standalone/session-service/quota-resume.mjs +9 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
- package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
- package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
- package/src/standalone/session-service/session-calls.mjs +2 -1
- package/src/tui/App.jsx +8 -0
- package/src/tui/app/clipboard.mjs +1 -1
- package/src/tui/app/create-app-pickers.mjs +2 -0
- package/src/tui/app/doctor.mjs +2 -2
- package/src/tui/app/panel-signature.mjs +1 -1
- package/src/tui/app/settings-picker.mjs +53 -8
- package/src/tui/app/shell-layout/row-budgets.mjs +2 -2
- package/src/tui/app/slash-commands.mjs +1 -1
- package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
- package/src/tui/app/slash-dispatch/session-commands.mjs +1 -1
- package/src/tui/app/use-prompt-queue-history.mjs +2 -2
- package/src/tui/app/use-transcript-activity.mjs +1 -1
- package/src/tui/app/use-transcript-window/geometry.mjs +1 -1
- package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
- package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
- package/src/tui/components/question-panel-model.mjs +4 -4
- package/src/tui/components/tool-execution/standard-card.jsx +3 -4
- package/src/tui/components/user-message-skills.mjs +1 -1
- package/src/tui/dist/index.mjs +309 -30
- package/src/tui/markdown/render-ansi.mjs +1 -1
- package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
- package/src/tui/session/agent-job-feed.mjs +2 -0
- package/src/tui/session/context-state.mjs +3 -0
- package/src/tui/session/quota-resume.mjs +1 -1
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
- package/src/tui/session/session-api/routes-agent-definitions.mjs +5 -0
- package/src/tui/session/session-api/worktree.mjs +13 -1
- package/src/tui/session/session-flow/drain.mjs +11 -14
- package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
- package/src/tui/session/turn-quiet.mjs +1 -1
- package/src/tui/session/turn.mjs +3 -0
- package/src/tui/session/worktree-setup-notice.mjs +1 -1
- package/src/tui/spinner-meta.mjs +3 -3
- package/src/tui/spinner-verbs.mjs +2 -2
- package/src/defaults/skills/goal-management/SKILL.md +0 -169
- package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
- package/src/session-runtime/goal-tasks.mjs +0 -1
|
@@ -31,13 +31,27 @@ import {
|
|
|
31
31
|
} from '../model-recency.mjs';
|
|
32
32
|
import { createNativeWebSearch } from '../native-web-search.mjs';
|
|
33
33
|
import { createConfigLifecycle } from '../config-lifecycle.mjs';
|
|
34
|
+
import { createConfigChangeEffects, SETTINGS_CHANGED_SETUP_ACTION } from '../config-change-effects.mjs';
|
|
35
|
+
import { resetProviderAdmissionCooldowns } from '../../runtime/agent/orchestrator/providers/admission-scheduler.mjs';
|
|
34
36
|
import { usesInjectedConfig } from '../session-compaction-sync.mjs';
|
|
35
37
|
import { createQuickModelRows } from '../quick-model-rows.mjs';
|
|
36
38
|
import { createProviderModels } from '../provider-models.mjs';
|
|
37
39
|
import { createProviderUsage } from '../provider-usage.mjs';
|
|
38
40
|
import { bootProfile } from '../boot-profile.mjs';
|
|
39
41
|
import { standaloneDataDir } from '../runtime-paths.mjs';
|
|
40
|
-
import {
|
|
42
|
+
import { noteCacheWarmingEnabled } from '../../runtime/agent/orchestrator/session/cache-warm.mjs';
|
|
43
|
+
import { refreshLiveSessionsProviderCacheOpts } from '../../runtime/agent/orchestrator/session/manager/session-lifecycle.mjs';
|
|
44
|
+
import { publishStoredAgentRoute } from '../agent-profile-changes.mjs';
|
|
45
|
+
import {
|
|
46
|
+
ensureConnectorAccountIds,
|
|
47
|
+
forgetConversationConnectorAccounts,
|
|
48
|
+
} from '../../runtime/connectors/connector-accounts-mcp.mjs';
|
|
49
|
+
import { registerSessionPurgeHook } from '../../runtime/agent/orchestrator/session/store/session-observers.mjs';
|
|
50
|
+
import { effectiveAgentRoute } from '../workflow-agents-api/shared.mjs';
|
|
51
|
+
import { agentRouteFromConfig, outputStyleStatus, resolveRoute, webSearchCapableFor } from './shared.mjs';
|
|
52
|
+
|
|
53
|
+
// A conversation's connector accounts go with its session (once per process).
|
|
54
|
+
registerSessionPurgeHook((sessionId) => forgetConversationConnectorAccounts(sessionId));
|
|
41
55
|
|
|
42
56
|
export function wireProviders(boot) {
|
|
43
57
|
wireConfigLifecycle(boot);
|
|
@@ -52,6 +66,17 @@ export function wireProviders(boot) {
|
|
|
52
66
|
// injection.
|
|
53
67
|
function wireConfigLifecycle(boot) {
|
|
54
68
|
const { rt, cfgMod, sharedCfgMod } = boot;
|
|
69
|
+
// Every stored connector account gets its identity (an injected config is
|
|
70
|
+
// not the stored one). True when the stored config changed.
|
|
71
|
+
boot.ensureConnectorAccountIds = () => {
|
|
72
|
+
if (usesInjectedConfig(boot.params)) return false;
|
|
73
|
+
try {
|
|
74
|
+
return ensureConnectorAccountIds();
|
|
75
|
+
} catch (error) {
|
|
76
|
+
console.warn(`[connectors] giving accounts their identity failed: ${error?.message || error}`);
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
55
80
|
const lifecycle = createConfigLifecycle({
|
|
56
81
|
getConfig: () => rt.config,
|
|
57
82
|
setConfig: (next) => {
|
|
@@ -68,7 +93,7 @@ function wireConfigLifecycle(boot) {
|
|
|
68
93
|
},
|
|
69
94
|
getRoute: () => rt.route,
|
|
70
95
|
getSession: () => rt.session,
|
|
71
|
-
|
|
96
|
+
injectedConfig: usesInjectedConfig(boot.params),
|
|
72
97
|
setRouteState: (next) => {
|
|
73
98
|
rt.route = next;
|
|
74
99
|
},
|
|
@@ -82,7 +107,47 @@ function wireConfigLifecycle(boot) {
|
|
|
82
107
|
LAZY_SECRET_PROVIDERS,
|
|
83
108
|
clean,
|
|
84
109
|
resolve,
|
|
85
|
-
|
|
110
|
+
// Late-bound: the effect targets (notification bus, MCP connect, context
|
|
111
|
+
// status) are wired by later boot stages.
|
|
112
|
+
onConfigChanged: createConfigChangeEffects({
|
|
113
|
+
invalidateContextStatusCache: () => boot.invalidateContextStatusCache?.(),
|
|
114
|
+
reinitProviders: () => boot.reinitProviders(),
|
|
115
|
+
releaseAdmissionCooldowns: resetProviderAdmissionCooldowns,
|
|
116
|
+
// Fails (so the change step retries it) when a server failed to connect
|
|
117
|
+
// (other than needing a sign-in, which waits on the user) or the
|
|
118
|
+
// identities failed; the servers reconcile either way.
|
|
119
|
+
reconcileMcp: async () => {
|
|
120
|
+
// An account written by hand gets its identity; that write is one
|
|
121
|
+
// more change, reconciled in turn.
|
|
122
|
+
let idsError = null;
|
|
123
|
+
if (!usesInjectedConfig(boot.params)) {
|
|
124
|
+
try {
|
|
125
|
+
ensureConnectorAccountIds();
|
|
126
|
+
} catch (error) {
|
|
127
|
+
idsError = error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const status = await boot.connectConfiguredMcp?.({ reconcile: true });
|
|
131
|
+
if (idsError) throw idsError;
|
|
132
|
+
const failed = (status?.servers || []).filter((row) => row.enabled !== false && row.status === 'failed');
|
|
133
|
+
if (failed.length) {
|
|
134
|
+
throw new Error(
|
|
135
|
+
`MCP servers failed to connect: ${failed.map((row) => `${row.name} (${row.error})`).join(', ')}`
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
noteCacheWarmingEnabled,
|
|
140
|
+
refreshLiveSessionsCacheOpts: (config) => refreshLiveSessionsProviderCacheOpts(config),
|
|
141
|
+
// A bot whose stored route was cleared follows Main.
|
|
142
|
+
publishAgentRoute: (id, config) =>
|
|
143
|
+
publishStoredAgentRoute(id, effectiveAgentRoute({ agentRouteFromConfig, resolveRoute }, config, id)),
|
|
144
|
+
// Attached surfaces (TUI, desktop session lanes) re-read open settings.
|
|
145
|
+
announceSettingsChange: () =>
|
|
146
|
+
boot.emitRuntimeNotification?.('Settings changed', {
|
|
147
|
+
kind: 'setup-changed',
|
|
148
|
+
action: SETTINGS_CHANGED_SETUP_ACTION,
|
|
149
|
+
}),
|
|
150
|
+
}),
|
|
86
151
|
STANDALONE_DATA_DIR: standaloneDataDir(),
|
|
87
152
|
});
|
|
88
153
|
const {
|
|
@@ -98,11 +163,13 @@ function wireConfigLifecycle(boot) {
|
|
|
98
163
|
scheduleOutputStyleSave,
|
|
99
164
|
flushAllConfigSavesAsync,
|
|
100
165
|
reloadFullConfig,
|
|
166
|
+
applyConfigChange,
|
|
101
167
|
ensureFullConfig,
|
|
102
168
|
displayConfig,
|
|
103
169
|
ensureConfigForRouteProvider,
|
|
104
170
|
} = lifecycle;
|
|
105
171
|
Object.assign(boot, {
|
|
172
|
+
applyConfigChange,
|
|
106
173
|
disposeConfigSync,
|
|
107
174
|
getOutputStyleStatusCached,
|
|
108
175
|
invalidateOutputStyleStatusCache,
|
|
@@ -51,6 +51,8 @@ export function wireSessionLifecycle(boot) {
|
|
|
51
51
|
schemaAllowedTools: modelToolSchemaAllowlist(rt.toolProfile),
|
|
52
52
|
featureDisallowedTools: boot.featureDisallowedTools,
|
|
53
53
|
applyPreSessionToolSelection: boot.applyPreSessionToolSelection,
|
|
54
|
+
// Late-bound: the tool policy refresh is wired with the API slices.
|
|
55
|
+
noteToolAvailability: (session, coreMemory) => boot.noteToolAvailability?.(session, coreMemory),
|
|
54
56
|
statusRoutes: boot.statusRoutes,
|
|
55
57
|
warmupTimers: boot.warmupTimers,
|
|
56
58
|
providerModelCaches: boot.providerModelCaches,
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
} from '../../runtime/agent/orchestrator/runtime-core/context-status.mjs';
|
|
42
42
|
import { createInternalToolExecutor } from '../internal-tool-executor.mjs';
|
|
43
43
|
import { registerWorktreeToolHost } from '../../runtime/shared/worktrees/tool-host.mjs';
|
|
44
|
+
import { registerLiveFeatureGates } from '../../runtime/agent/orchestrator/runtime-core/tool-availability.mjs';
|
|
44
45
|
import { createWorktreeToolHost } from '../workspace/worktree-tool.mjs';
|
|
45
46
|
import { STANDALONE_ROOT, standaloneDataDir } from '../runtime-paths.mjs';
|
|
46
47
|
import { dataDirOf, workflowHelpers } from './shared.mjs';
|
|
@@ -61,8 +62,14 @@ export function wireTools(boot) {
|
|
|
61
62
|
})
|
|
62
63
|
)
|
|
63
64
|
.catch((error) => bootProfile('mcp:failed', { error: error?.message || String(error) }));
|
|
65
|
+
// A lost reload leaves the old timers armed; the scheduler re-reads each
|
|
66
|
+
// schedule before it fires (scheduler.mjs fireTimed), so it is only reported.
|
|
64
67
|
boot.reloadChannelsSoon = () => {
|
|
65
|
-
boot.channels
|
|
68
|
+
boot.channels
|
|
69
|
+
.execute('reload_config', {})
|
|
70
|
+
.catch((error) =>
|
|
71
|
+
process.stderr.write(`[channels] schedule reload failed: ${error?.message || String(error)}\n`)
|
|
72
|
+
);
|
|
66
73
|
};
|
|
67
74
|
}
|
|
68
75
|
|
|
@@ -183,23 +190,29 @@ function wireToolSurface(boot) {
|
|
|
183
190
|
skillToolEnabled: !envFlag('MIXDOG_DISABLE_SKILLS'),
|
|
184
191
|
});
|
|
185
192
|
bootProfile('tools:ready', { ms: (performance.now() - toolsStartedAt).toFixed(1), count: standaloneTools.length });
|
|
186
|
-
const {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
193
|
+
const {
|
|
194
|
+
modelStandaloneTools,
|
|
195
|
+
invalidatePreSessionToolSurface,
|
|
196
|
+
activeToolSurface,
|
|
197
|
+
applyPreSessionToolSelection,
|
|
198
|
+
toolDefinitionsFor,
|
|
199
|
+
surfaceGeneration,
|
|
200
|
+
} = createToolSurface({
|
|
201
|
+
mgr,
|
|
202
|
+
mode: rt.mode,
|
|
203
|
+
standaloneTools,
|
|
204
|
+
agentToolNames,
|
|
205
|
+
getSession: () => rt.session,
|
|
206
|
+
getRoute: () => rt.route,
|
|
207
|
+
getConfig: () => rt.config,
|
|
208
|
+
getToolProfile: () => rt.toolProfile,
|
|
209
|
+
getMcpScopeId: () => rt.mcpScopeId,
|
|
210
|
+
getCurrentCwd: () => rt.currentCwd,
|
|
211
|
+
cfgMod,
|
|
212
|
+
delegatableAgentIds: workflowHelpers.delegatableAgentIds,
|
|
213
|
+
dataDir: standaloneDataDir(),
|
|
214
|
+
getFeatureDisallowedTools: featureDisallowedTools,
|
|
215
|
+
});
|
|
203
216
|
Object.assign(boot, {
|
|
204
217
|
standaloneTools,
|
|
205
218
|
internalToolDefs,
|
|
@@ -208,10 +221,15 @@ function wireToolSurface(boot) {
|
|
|
208
221
|
invalidatePreSessionToolSurface,
|
|
209
222
|
activeToolSurface,
|
|
210
223
|
applyPreSessionToolSelection,
|
|
224
|
+
toolDefinitionsFor,
|
|
225
|
+
surfaceGeneration,
|
|
211
226
|
});
|
|
212
227
|
}
|
|
213
228
|
|
|
214
|
-
|
|
229
|
+
/** The setup-changed action of a context status an empty session's reconcile moved. */
|
|
230
|
+
export const CONTEXT_STATUS_REFRESHED_ACTION = 'context_status_refreshed';
|
|
231
|
+
|
|
232
|
+
export function wireContextStatus(boot) {
|
|
215
233
|
const { rt } = boot;
|
|
216
234
|
const { contextStatus: computeContextStatus, invalidateContextStatusCache } = createContextStatus({
|
|
217
235
|
getSession: () => rt.session,
|
|
@@ -221,7 +239,33 @@ function wireContextStatus(boot) {
|
|
|
221
239
|
getMode: () => rt.mode,
|
|
222
240
|
});
|
|
223
241
|
Object.assign(boot, {
|
|
224
|
-
|
|
242
|
+
// The synchronous accessor (the local TUI): an empty session whose
|
|
243
|
+
// settings gates moved starts the shared turn-start reconcile
|
|
244
|
+
// (late-bound); when it rebuilt anything the cache is dropped and the
|
|
245
|
+
// attached surfaces are told to read again.
|
|
246
|
+
computeContextStatus: (...args) => {
|
|
247
|
+
if (boot.emptySessionStale?.()) {
|
|
248
|
+
boot
|
|
249
|
+
.reconcileEmptySession()
|
|
250
|
+
.then((result) => {
|
|
251
|
+
if (!result) return;
|
|
252
|
+
invalidateContextStatusCache();
|
|
253
|
+
boot.emitRuntimeNotification?.('Context status refreshed', {
|
|
254
|
+
kind: 'setup-changed',
|
|
255
|
+
action: CONTEXT_STATUS_REFRESHED_ACTION,
|
|
256
|
+
});
|
|
257
|
+
})
|
|
258
|
+
.catch(() => {});
|
|
259
|
+
}
|
|
260
|
+
return computeContextStatus(...args);
|
|
261
|
+
},
|
|
262
|
+
// Async boundaries (desktop, remote, IPC) wait for the same reconcile.
|
|
263
|
+
computeContextStatusSettled: async (...args) => {
|
|
264
|
+
if (boot.emptySessionStale?.()) {
|
|
265
|
+
if (await boot.reconcileEmptySession()) invalidateContextStatusCache();
|
|
266
|
+
}
|
|
267
|
+
return computeContextStatus(...args);
|
|
268
|
+
},
|
|
225
269
|
invalidateContextStatusCache,
|
|
226
270
|
computeContextStatusForSession: (session) =>
|
|
227
271
|
contextStatusForSession(session, {
|
|
@@ -255,11 +299,7 @@ function wireInternalTools(boot) {
|
|
|
255
299
|
goalRuntime: boot.goalRuntime,
|
|
256
300
|
agentTool: boot.routedAgentTool,
|
|
257
301
|
setupTool,
|
|
258
|
-
|
|
259
|
-
memoryToolsEnabled: boot.memoryToolsEnabledFn,
|
|
260
|
-
officeToolsEnabled: boot.officeToolsEnabledFn,
|
|
261
|
-
mediaToolEnabled: boot.mediaToolEnabledFn,
|
|
262
|
-
tidyToolEnabled: boot.tidyToolEnabledFn,
|
|
302
|
+
featureDisallowedTools: boot.featureDisallowedTools,
|
|
263
303
|
getWebSearchModule: boot.getWebSearchModule,
|
|
264
304
|
getMemoryModule: boot.getMemoryModule,
|
|
265
305
|
getCodeGraphModule: boot.getCodeGraphModule,
|
|
@@ -288,9 +328,13 @@ function wireInternalTools(boot) {
|
|
|
288
328
|
executeSessionControl: boot.params.executeSessionControl || null,
|
|
289
329
|
}).run,
|
|
290
330
|
});
|
|
331
|
+
// Dispatch refuses a model call of a tool a setting turned off from this
|
|
332
|
+
// runtime's live gates (a turn already running when it changed included).
|
|
333
|
+
const disposeLiveGates = registerLiveFeatureGates(rt.mcpScopeId, boot.featureDisallowedTools);
|
|
291
334
|
Object.assign(boot, {
|
|
292
335
|
setupTool,
|
|
293
336
|
disposeInternalTools: () => {
|
|
337
|
+
disposeLiveGates();
|
|
294
338
|
disposeWorktreeToolHost();
|
|
295
339
|
// Its turn snapshot cleanups stop with the runtime (maintenance finishes them).
|
|
296
340
|
boot.workspaceApi?.dispose();
|
|
@@ -167,6 +167,7 @@ export function createChannelConfigApi({ channels, reloadChannelsSoon, ensureAut
|
|
|
167
167
|
{
|
|
168
168
|
name: endpoint.name,
|
|
169
169
|
ownerAgentId: endpoint.ownerAgentId,
|
|
170
|
+
executorAgentId: endpoint.executorAgentId || null,
|
|
170
171
|
cwd: endpoint.cwd || null,
|
|
171
172
|
attachments: endpoint.attachments || null,
|
|
172
173
|
event: webhookEventSummary(payload.headers ?? {}, payload.body ?? {}),
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// The change-driven effect step of one runtime. Every persisted change (a
|
|
2
|
+
// config write or a keychain write, by this runtime, another runtime, another
|
|
3
|
+
// process or a hand edit) reaches each subscribing runtime as one
|
|
4
|
+
// notification; the runtime reloads, compares the result with the snapshot it
|
|
5
|
+
// last applied, and runs only the effects keyed by what changed. The writer
|
|
6
|
+
// takes the same step, so no effect depends on which process wrote.
|
|
7
|
+
|
|
8
|
+
/** The setup-changed action announcing a settings change this runtime applied. */
|
|
9
|
+
export const SETTINGS_CHANGED_SETUP_ACTION = 'settings_changed';
|
|
10
|
+
|
|
11
|
+
// Provider credentials: `agent.<id>.apiKey` and a custom provider's extra keys
|
|
12
|
+
// `agent.<id>.apiKey.<keyId>` (custom-provider-keys.mjs).
|
|
13
|
+
// A deletion (config.mjs `#deleted`) may remove a secret the marker never
|
|
14
|
+
// listed (stored before it existed), so it counts for providers and MCP alike.
|
|
15
|
+
const PROVIDER_SECRET_ACCOUNT = /^(agent\.[^.]+\.apiKey(\.|$)|#deleted$)/;
|
|
16
|
+
// What an MCP connection depends on beside its config: OAuth sign-ins and
|
|
17
|
+
// client secrets, Gmail app passwords, and the plugin registry (plugin
|
|
18
|
+
// servers). Token refreshes are not announced (oauth-credentials.mjs).
|
|
19
|
+
const MCP_STATE_ACCOUNT = /^(mcp-oauth\.|mcp-oauth-client\.|gmail-app-password\.|#plugins$|#deleted$)/;
|
|
20
|
+
|
|
21
|
+
// Secret values are compared through their change tokens, never by value.
|
|
22
|
+
function tokensSignature(tokens, filter = () => true) {
|
|
23
|
+
const entries = Object.entries(tokens && typeof tokens === 'object' ? tokens : {});
|
|
24
|
+
return JSON.stringify(entries.filter(([account]) => filter(account)).sort(([a], [b]) => a.localeCompare(b)));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** What a runtime last applied: the persisted root (the desktop section has
|
|
28
|
+
* its own owners), the applied secret change tokens and the effective MCP
|
|
29
|
+
* servers. Provider and settings changes are judged on the stored state, not
|
|
30
|
+
* the effective provider entries: those depend on whether a load read secrets
|
|
31
|
+
* and ran credential probes (boot loads without), so the boot config is an
|
|
32
|
+
* exact first baseline. MCP servers load the same either way. */
|
|
33
|
+
export function configChangeSnapshot({ config, root, secretTokens }) {
|
|
34
|
+
const { desktop: _desktop, ...settingsRoot } = root && typeof root === 'object' ? root : {};
|
|
35
|
+
const agents = config?.agents && typeof config.agents === 'object' ? config.agents : {};
|
|
36
|
+
return {
|
|
37
|
+
providers: JSON.stringify([
|
|
38
|
+
settingsRoot.agent?.providers ?? null,
|
|
39
|
+
// Developer provider options (e.g. cursorOAuth) shape provider clients.
|
|
40
|
+
config?.developer ?? null,
|
|
41
|
+
tokensSignature(secretTokens, (account) => PROVIDER_SECRET_ACCOUNT.test(account)),
|
|
42
|
+
]),
|
|
43
|
+
cacheWarming: config?.promptCacheWarming === true,
|
|
44
|
+
autoClear: JSON.stringify(config?.autoClear ?? null),
|
|
45
|
+
agentRoutes: Object.fromEntries(Object.entries(agents).map(([id, route]) => [id, JSON.stringify(route ?? null)])),
|
|
46
|
+
mcp: JSON.stringify([
|
|
47
|
+
config?.mcpServers ?? null,
|
|
48
|
+
config?.pluginMcp ?? null,
|
|
49
|
+
tokensSignature(secretTokens, (account) => MCP_STATE_ACCOUNT.test(account)),
|
|
50
|
+
]),
|
|
51
|
+
settings: JSON.stringify([settingsRoot, tokensSignature(secretTokens)]),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function diffConfigSnapshots(before, after) {
|
|
56
|
+
const routes = new Set([...Object.keys(before.agentRoutes || {}), ...Object.keys(after.agentRoutes || {})]);
|
|
57
|
+
return {
|
|
58
|
+
providers: before.providers !== after.providers,
|
|
59
|
+
mcp: before.mcp !== after.mcp,
|
|
60
|
+
settings: before.settings !== after.settings,
|
|
61
|
+
// The new value when it changed, else null.
|
|
62
|
+
cacheWarming: before.cacheWarming !== after.cacheWarming ? after.cacheWarming : null,
|
|
63
|
+
autoClear: before.autoClear !== after.autoClear,
|
|
64
|
+
// Bots whose stored route was set, changed or cleared.
|
|
65
|
+
agentRoutes: [...routes].filter((id) => before.agentRoutes?.[id] !== after.agentRoutes?.[id]).sort(),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Whether a diff found nothing changed. */
|
|
70
|
+
export function configChangeIsEmpty(change) {
|
|
71
|
+
return (
|
|
72
|
+
!change.providers &&
|
|
73
|
+
!change.mcp &&
|
|
74
|
+
!change.settings &&
|
|
75
|
+
change.cacheWarming === null &&
|
|
76
|
+
!change.autoClear &&
|
|
77
|
+
!change.agentRoutes.length
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// A domain whose effect failed: it differs from every snapshot value, so the
|
|
82
|
+
// next diff carries the domain again and its effect is retried.
|
|
83
|
+
const PENDING = Symbol('pending');
|
|
84
|
+
|
|
85
|
+
/** The effect domains a diff carries (`agentRoutes:<id>` per bot). */
|
|
86
|
+
export function configChangeDomains(change) {
|
|
87
|
+
return [
|
|
88
|
+
...['providers', 'mcp', 'autoClear', 'settings'].filter((domain) => change[domain]),
|
|
89
|
+
...(change.cacheWarming !== null && change.cacheWarming !== undefined ? ['cacheWarming'] : []),
|
|
90
|
+
...(change.agentRoutes || []).map((id) => `agentRoutes:${id}`),
|
|
91
|
+
];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** `snapshot` with `domain` marked not applied. */
|
|
95
|
+
export function withConfigDomainPending(snapshot, domain) {
|
|
96
|
+
if (domain.startsWith('agentRoutes:')) {
|
|
97
|
+
const id = domain.slice('agentRoutes:'.length);
|
|
98
|
+
return { ...snapshot, agentRoutes: { ...snapshot.agentRoutes, [id]: PENDING } };
|
|
99
|
+
}
|
|
100
|
+
return { ...snapshot, [domain]: PENDING };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** The effects themselves, keyed by the diff. `change` may be all-false (a
|
|
104
|
+
* rewrite of identical content): only the always-on invalidation runs.
|
|
105
|
+
* `config` is the reloaded effective config the diff was taken against.
|
|
106
|
+
* Answers a promise of the domains whose effect failed. One domain's effects
|
|
107
|
+
* never overlap: a later one starts once the earlier settled (it runs at
|
|
108
|
+
* once when none is in flight), so the latest change is applied last. */
|
|
109
|
+
export function createConfigChangeEffects({
|
|
110
|
+
invalidateContextStatusCache,
|
|
111
|
+
reinitProviders,
|
|
112
|
+
releaseAdmissionCooldowns,
|
|
113
|
+
reconcileMcp,
|
|
114
|
+
announceSettingsChange,
|
|
115
|
+
noteCacheWarmingEnabled = () => {},
|
|
116
|
+
refreshLiveSessionsCacheOpts = () => {},
|
|
117
|
+
publishAgentRoute = () => {},
|
|
118
|
+
}) {
|
|
119
|
+
const inFlight = new Map();
|
|
120
|
+
// domain → the failure last warned about: a retry failing the same way is
|
|
121
|
+
// not warned about again until the domain recovers.
|
|
122
|
+
const warned = new Map();
|
|
123
|
+
function run(domain, effect) {
|
|
124
|
+
const attempt = () => {
|
|
125
|
+
try {
|
|
126
|
+
return Promise.resolve(effect()).then(
|
|
127
|
+
() => {
|
|
128
|
+
warned.delete(domain);
|
|
129
|
+
return null;
|
|
130
|
+
},
|
|
131
|
+
(error) => failed(domain, error)
|
|
132
|
+
);
|
|
133
|
+
} catch (error) {
|
|
134
|
+
return Promise.resolve(failed(domain, error));
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
const prior = inFlight.get(domain);
|
|
138
|
+
const done = prior ? prior.then(attempt) : attempt();
|
|
139
|
+
inFlight.set(domain, done);
|
|
140
|
+
void done.then(() => {
|
|
141
|
+
if (inFlight.get(domain) === done) inFlight.delete(domain);
|
|
142
|
+
});
|
|
143
|
+
return done;
|
|
144
|
+
}
|
|
145
|
+
function failed(domain, error) {
|
|
146
|
+
const message = error?.message || String(error);
|
|
147
|
+
if (warned.get(domain) !== message) {
|
|
148
|
+
warned.set(domain, message);
|
|
149
|
+
console.warn(`[config] applying the ${domain} change failed: ${message}`);
|
|
150
|
+
}
|
|
151
|
+
return domain;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return function applyConfigChangeEffects(change, config) {
|
|
155
|
+
invalidateContextStatusCache();
|
|
156
|
+
const runs = [];
|
|
157
|
+
if (change.providers) {
|
|
158
|
+
// Cooldowns and initialized clients belong to the old credentials.
|
|
159
|
+
runs.push(
|
|
160
|
+
run('providers', () => {
|
|
161
|
+
releaseAdmissionCooldowns();
|
|
162
|
+
return reinitProviders();
|
|
163
|
+
})
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
if (change.mcp) runs.push(run('mcp', reconcileMcp));
|
|
167
|
+
// Every session of this process warms (or stops warming, armed chains
|
|
168
|
+
// included) as the setting now says.
|
|
169
|
+
if (change.cacheWarming !== null && change.cacheWarming !== undefined) {
|
|
170
|
+
runs.push(run('cacheWarming', () => noteCacheWarmingEnabled(change.cacheWarming)));
|
|
171
|
+
}
|
|
172
|
+
// Live sessions take the new idle window as their cache lifetime.
|
|
173
|
+
if (change.autoClear) runs.push(run('autoClear', () => refreshLiveSessionsCacheOpts(config)));
|
|
174
|
+
// The bots' chats this process hosts move onto their new routes.
|
|
175
|
+
for (const id of change.agentRoutes || []) runs.push(run(`agentRoutes:${id}`, () => publishAgentRoute(id, config)));
|
|
176
|
+
if (change.settings) runs.push(run('settings', announceSettingsChange));
|
|
177
|
+
return Promise.all(runs).then((results) => results.filter(Boolean));
|
|
178
|
+
};
|
|
179
|
+
}
|
|
@@ -150,5 +150,6 @@ export function createConfigWriters({ cfgMod, sharedCfgMod }) {
|
|
|
150
150
|
hasPendingConfigChanges: () => configWriter.hasPending(),
|
|
151
151
|
pendingConfigChanges: () => pendingConfigChanges,
|
|
152
152
|
pendingSkills: () => skillsWriter.getPending(),
|
|
153
|
+
pendingOutputStyle: () => outputStyleWriter.getPending(),
|
|
153
154
|
};
|
|
154
155
|
}
|