mixdog 1.4.1 → 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 +4 -3
- package/scripts/build-shipped-history.mjs +125 -33
- package/scripts/gate-local.mjs +220 -63
- package/scripts/graph-parity.mjs +8 -3
- package/scripts/lib/gate-scheduler.mjs +139 -32
- package/scripts/lib/gate-timing-reporter.mjs +16 -0
- package/scripts/lib/run-node-tests.mjs +71 -34
- package/scripts/lib/scoped-temp.mjs +1 -0
- package/scripts/lib/test-failure-records.mjs +14 -1
- package/scripts/lib/test-failure-summary.mjs +9 -4
- package/scripts/lib/test-spawn-ledger.mjs +43 -3
- package/scripts/post-release-check.mjs +26 -16
- package/scripts/pptx-kit-index.mjs +5 -6
- package/scripts/provider-pingpong-live.mjs +1 -1
- package/scripts/prune-embedding-runtime.mjs +3 -1
- package/scripts/release-paths.mjs +7 -1
- package/scripts/suite-health.mjs +110 -28
- package/scripts/test.mjs +9 -14
- package/src/agents/advisor/AGENT.md +4 -4
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/explore/AGENT.md +22 -0
- package/src/agents/explore/agent.json +6 -0
- package/src/cli.mjs +7 -0
- package/src/defaults/agents.json +7 -0
- package/src/defaults/shipped-history.json +38 -2
- package/src/defaults/skills/browser-use/SKILL.md +4 -1
- package/src/defaults/skills/code-tidy/SKILL.md +71 -102
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
- package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
- package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
- package/src/defaults/skills/computer-use/SKILL.md +12 -2
- package/src/defaults/skills/setup/SKILL.md +2 -2
- package/src/defaults/skills/setup/references/actions.md +28 -9
- package/src/defaults/skills/setup/references/surfaces.md +5 -2
- package/src/defaults/skills/setup-guide/SKILL.md +11 -3
- package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
- package/src/defaults/skills/skill-creator/SKILL.md +85 -190
- package/src/defaults/skills/skill-creator/references/design.md +70 -162
- package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
- package/src/defaults/skills/test-suite/SKILL.md +194 -0
- package/src/defaults/skills/test-suite/references/case-management.md +51 -0
- package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
- package/src/defaults/skills/test-suite/references/reliability.md +49 -0
- package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
- package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
- package/src/defaults/skills/visualize/SKILL.md +6 -2
- package/src/lib/instruction-text.cjs +36 -0
- package/src/lib/rules-builder.cjs +40 -50
- 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/rules/lead/LEAD.md +3 -3
- package/src/rules/shared/20-research.md +3 -6
- package/src/rules/shared/40-editing.md +1 -0
- package/src/rules/shared/60-verification.md +10 -9
- package/src/rules/shared/70-delivery.md +4 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +132 -21
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -9
- package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
- 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/config.mjs +12 -7
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -30
- package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +124 -12
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +204 -49
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +16 -7
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +157 -57
- package/src/runtime/agent/orchestrator/mcp/client.mjs +54 -23
- 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-login.mjs +83 -52
- 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 +43 -27
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
- package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
- 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-oauth-login.mjs +26 -28
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
- package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +576 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +32 -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 -47
- 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 +12 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +15 -6
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
- 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/agent-room.d.mts +30 -5
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
- package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
- 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 +4 -4
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +11 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +6 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
- package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +37 -8
- 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/fresh-context.mjs +5 -3
- 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 +27 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +18 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
- package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
- 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 +103 -50
- 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 +20 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -14
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +56 -14
- package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +59 -20
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +18 -4
- 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 +48 -30
- package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
- 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 +12 -6
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -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-summary-reader.mjs +243 -38
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +177 -8
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
- 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/completed-result.mjs +6 -2
- 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 +42 -28
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +30 -14
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
- 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/runtime-capabilities.mjs +20 -15
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +95 -20
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
- 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/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +105 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +35 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -6
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- 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-port.mjs +19 -10
- package/src/runtime/channels/lib/whisper-server.mjs +22 -13
- 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 +372 -103
- package/src/runtime/connectors/gmail-app-password.mjs +4 -4
- 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 +88 -0
- package/src/runtime/explore/tool-defs.mjs +35 -0
- package/src/runtime/explore/tool.mjs +123 -0
- 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 +15 -1
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
- package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
- package/src/runtime/memory/lib/embedding-worker.mjs +4 -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/office/quality/assurance-structure-docx.mjs +1 -1
- package/src/runtime/shared/agent-route-config.mjs +17 -2
- package/src/runtime/shared/atomic-file.d.mts +8 -0
- package/src/runtime/shared/atomic-file.mjs +103 -2
- package/src/runtime/shared/background-tasks.mjs +37 -10
- 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-accounts.mjs +5 -5
- package/src/runtime/shared/connector-catalog.d.mts +14 -8
- package/src/runtime/shared/connector-catalog.mjs +70 -52
- package/src/runtime/shared/custom-provider-keys.mjs +20 -0
- package/src/runtime/shared/file-has-data.mjs +26 -2
- package/src/runtime/shared/file-lock.mjs +21 -18
- package/src/runtime/shared/git-launch.d.mts +9 -0
- package/src/runtime/shared/git-launch.mjs +213 -0
- package/src/runtime/shared/git-runner-worker.mjs +2 -1
- package/src/runtime/shared/git-runner.mjs +7 -2
- package/src/runtime/shared/idle-gc.mjs +30 -7
- package/src/runtime/shared/llm/cost.mjs +6 -1
- package/src/runtime/shared/llm/http-agent.mjs +316 -29
- package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
- package/src/runtime/shared/llm/model-catalog.mjs +46 -6
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
- package/src/runtime/shared/llm/system-proxy.mjs +453 -0
- 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/provider-accounts.mjs +52 -2
- 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/staged-install-worker.mjs +5 -0
- package/src/runtime/shared/staged-update.mjs +47 -2
- 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-surface.mjs +110 -36
- package/src/runtime/shared/tool-work-units.mjs +35 -6
- package/src/runtime/shared/turn-snapshot.mjs +26 -4
- package/src/runtime/shared/turn-worktree-snapshot.mjs +409 -54
- package/src/runtime/shared/worker-requests.mjs +17 -3
- package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
- package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
- package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +5 -3
- 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 +97 -7
- 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 +962 -197
- 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/install.mjs +95 -15
- package/src/runtime/tidy/languages.mjs +17 -15
- package/src/runtime/tidy/process.mjs +9 -5
- package/src/runtime/tidy/resolve.mjs +19 -16
- package/src/runtime/tidy/runners/biome.mjs +3 -3
- package/src/runtime/tidy/tool.mjs +1 -1
- package/src/runtime/tidy/worktree.mjs +10 -6
- package/src/runtime/visualize-bridge/client.mjs +4 -1
- package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
- package/src/runtime/web-search/index.mjs +4 -23
- 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/agent-task-sessions.mjs +410 -353
- 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 +71 -25
- package/src/session-runtime/bot-status.mjs +103 -103
- 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/connector-merge-migration.mjs +18 -15
- package/src/session-runtime/conversation-import/discovery.mjs +245 -47
- package/src/session-runtime/conversation-import/service.mjs +12 -5
- package/src/session-runtime/goal-facade-api.mjs +49 -3
- package/src/session-runtime/handoff-attachments.mjs +1 -1
- package/src/session-runtime/held-requests.mjs +3 -1
- 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 +5 -11
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +161 -120
- 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 +10 -5
- package/src/session-runtime/lifecycle/teardown.mjs +1 -1
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/server-catalog.mjs +27 -10
- package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
- package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
- package/src/session-runtime/mixy-heartbeat.mjs +1 -1
- 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/login.mjs +2 -2
- 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-api.mjs +98 -35
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +49 -32
- package/src/session-runtime/resource-mcp-secrets.mjs +27 -10
- package/src/session-runtime/resource-mcp-servers.mjs +5 -4
- 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 +120 -8
- 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-prep.mjs +8 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +28 -7
- package/src/session-runtime/services/agent-tool.mjs +51 -1
- package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
- package/src/session-runtime/services/channel-admin.mjs +18 -0
- package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
- package/src/session-runtime/services/daemon-candidate.mjs +4 -1
- package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
- package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
- package/src/session-runtime/services/plugin-admin.mjs +14 -6
- package/src/session-runtime/services/provider-admin.mjs +281 -10
- 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/session-turn-api.mjs +2 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +5 -10
- package/src/session-runtime/settings-system-api.mjs +1 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
- package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
- package/src/session-runtime/setup-tool/executor.mjs +14 -3
- 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 +28 -2
- 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 +33 -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 +46 -11
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +2 -0
- 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/activity-guards.mjs +176 -0
- package/src/session-runtime/workspace/project-branches.mjs +1 -1
- package/src/session-runtime/workspace/session-view.mjs +149 -0
- package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
- package/src/session-runtime/workspace/transition-runner.mjs +188 -0
- package/src/session-runtime/workspace/transitions.mjs +128 -1070
- package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
- package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
- package/src/session-runtime/workspace/worktree-maintenance.mjs +200 -0
- package/src/session-runtime/workspace/worktree-setup.mjs +97 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +70 -54
- package/src/standalone/daemon-agent-control.mjs +25 -8
- package/src/standalone/daemon-desktop-runtime.mjs +8 -2
- package/src/standalone/daemon-lag-profiler.mjs +7 -7
- package/src/standalone/daemon-session-control.mjs +151 -136
- package/src/standalone/daemon.mjs +61 -2
- package/src/standalone/desktop-service-registry.mjs +9 -0
- package/src/standalone/local-session-runtime.mjs +21 -1
- package/src/standalone/session-client/daemon-unavailable.mjs +4 -1
- package/src/standalone/session-client.mjs +5 -1
- package/src/standalone/session-frame-stream.mjs +83 -11
- package/src/standalone/session-protocol.mjs +15 -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/agent-tree.mjs +45 -9
- package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
- 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/session-views.mjs +160 -104
- package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
- package/src/standalone/session-service/session-calls.mjs +2 -1
- package/src/standalone/session-service/stored-reader.mjs +127 -40
- package/src/tui/App.jsx +162 -164
- package/src/tui/app/app-view/floating-panel.jsx +3 -0
- package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
- package/src/tui/app/clipboard.mjs +22 -11
- 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/prompt-handlers/use-prompt-history-nav.mjs +1 -1
- package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
- package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
- package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
- package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
- package/src/tui/app/provider-setup-picker.mjs +20 -13
- package/src/tui/app/settings-picker.mjs +53 -8
- package/src/tui/app/shell-layout/row-budgets.mjs +14 -12
- package/src/tui/app/slash-commands.mjs +2 -1
- package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
- package/src/tui/app/slash-dispatch/session-commands.mjs +47 -1
- package/src/tui/app/slash-dispatch.mjs +1 -1
- package/src/tui/app/use-btw-panel.mjs +29 -0
- package/src/tui/app/use-context-panel-refresh.mjs +31 -0
- package/src/tui/app/use-model-catalog-cache.mjs +13 -10
- package/src/tui/app/use-mouse-input.mjs +11 -0
- package/src/tui/app/use-onboarding-start.mjs +8 -3
- package/src/tui/app/use-panel-transition.mjs +10 -1
- package/src/tui/app/use-pasted-buffers.mjs +28 -20
- package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
- package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
- package/src/tui/app/use-prompt-queue-history.mjs +5 -4
- package/src/tui/app/use-selection-focus.mjs +11 -2
- package/src/tui/app/use-selection-geometry.mjs +18 -9
- package/src/tui/app/use-selection-paint.mjs +4 -4
- package/src/tui/app/use-selection-stitch.mjs +3 -3
- package/src/tui/app/use-slash-palette.mjs +62 -0
- package/src/tui/app/use-terminal-chrome.mjs +2 -2
- package/src/tui/app/use-transcript-activity.mjs +48 -33
- package/src/tui/app/use-transcript-follow.mjs +12 -4
- package/src/tui/app/use-transcript-scroll.mjs +46 -17
- package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
- package/src/tui/app/use-transcript-window/geometry.mjs +20 -6
- package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
- package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
- package/src/tui/app/use-transcript-window.mjs +21 -11
- package/src/tui/app/use-tui-ready.mjs +18 -0
- package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
- package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
- package/src/tui/components/Picker.jsx +27 -3
- package/src/tui/components/SignInUrl.jsx +68 -0
- package/src/tui/components/TextEntryPanel.jsx +76 -46
- 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/sign-in-url-layout.mjs +24 -0
- 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 +2205 -1371
- 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/goal-turn-state.mjs +6 -2
- package/src/tui/session/quota-resume.mjs +1 -1
- package/src/tui/session/session-api/controls.mjs +4 -0
- package/src/tui/session/session-api/extensions.mjs +8 -0
- package/src/tui/session/session-api/intake/abort.mjs +2 -1
- package/src/tui/session/session-api/intake.mjs +2 -0
- package/src/tui/session/session-api/integrations.mjs +2 -2
- 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 +6 -0
- package/src/tui/session/session-api/settings.mjs +2 -2
- 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/transcript-spill/spill-writer.mjs +15 -0
- package/src/tui/session/transcript-spill.mjs +92 -4
- package/src/tui/session/transcript-store.mjs +2 -0
- 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/defaults/skills/skill-creator/references/source-review.md +0 -94
- package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
- package/src/session-runtime/goal-tasks.mjs +0 -1
|
@@ -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
|
}
|
|
@@ -18,7 +18,14 @@ import {
|
|
|
18
18
|
withDefaultPresets,
|
|
19
19
|
} from '../runtime/agent/orchestrator/config-presets.mjs';
|
|
20
20
|
import { syncSessionCompaction } from './session-compaction-sync.mjs';
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
configChangeDomains,
|
|
23
|
+
configChangeIsEmpty,
|
|
24
|
+
configChangeSnapshot,
|
|
25
|
+
diffConfigSnapshots,
|
|
26
|
+
withConfigDomainPending,
|
|
27
|
+
} from './config-change-effects.mjs';
|
|
28
|
+
import { configWithOutputStyle, createConfigWriters } from './config-lifecycle/config-writers.mjs';
|
|
22
29
|
import { createLeadRouteSync } from './config-lifecycle/lead-route-sync.mjs';
|
|
23
30
|
import { createOutputStyleStatusCache } from './config-lifecycle/output-style-cache.mjs';
|
|
24
31
|
|
|
@@ -45,9 +52,19 @@ function seedChanges(config, changes) {
|
|
|
45
52
|
.map((key) => ({ path: [key], value: structuredClone(config[key]), ifAbsent: true }));
|
|
46
53
|
}
|
|
47
54
|
|
|
55
|
+
// The agent config load carries no root `outputStyle`; the stored root value
|
|
56
|
+
// is laid on it (absent: the default style applies).
|
|
57
|
+
function withStoredOutputStyle(config, storedOutputStyle) {
|
|
58
|
+
return typeof storedOutputStyle === 'string' && storedOutputStyle.trim()
|
|
59
|
+
? { ...config, outputStyle: storedOutputStyle.trim() }
|
|
60
|
+
: config;
|
|
61
|
+
}
|
|
62
|
+
|
|
48
63
|
// The config just read from disk with this runtime's still-pending edits laid
|
|
49
64
|
// back on it (the config and skills writers hold the only copy of them).
|
|
50
|
-
|
|
65
|
+
// The agent config load carries no root `outputStyle`: the stored root value
|
|
66
|
+
// (`storedOutputStyle`) is laid on it, and this runtime's pending pick wins.
|
|
67
|
+
function withPendingEdits(loaded, writers, storedOutputStyle) {
|
|
51
68
|
let next = loaded;
|
|
52
69
|
if (writers.hasPendingConfigChanges()) {
|
|
53
70
|
// Preserve only our pending edits. Peer changes and fresh secret overlays
|
|
@@ -67,6 +84,9 @@ function withPendingEdits(loaded, writers) {
|
|
|
67
84
|
if (pendingSkills !== null) {
|
|
68
85
|
next = { ...next, skills: { ...(next.skills || {}), disabled: pendingSkills } };
|
|
69
86
|
}
|
|
87
|
+
const pendingOutputStyle = writers.pendingOutputStyle();
|
|
88
|
+
if (pendingOutputStyle !== null) next = configWithOutputStyle(next, pendingOutputStyle);
|
|
89
|
+
else next = withStoredOutputStyle(next, storedOutputStyle);
|
|
70
90
|
return next;
|
|
71
91
|
}
|
|
72
92
|
|
|
@@ -85,6 +105,7 @@ function withPendingEdits(loaded, writers) {
|
|
|
85
105
|
export function resolveInitialConfigState({
|
|
86
106
|
initialConfig,
|
|
87
107
|
loadConfig,
|
|
108
|
+
readStoredOutputStyle = null,
|
|
88
109
|
resolveRoute,
|
|
89
110
|
provider,
|
|
90
111
|
model,
|
|
@@ -97,8 +118,12 @@ export function resolveInitialConfigState({
|
|
|
97
118
|
selectedContextWindow,
|
|
98
119
|
agentOwned = false,
|
|
99
120
|
}) {
|
|
121
|
+
// An injected config is complete as given; a loaded one takes the stored
|
|
122
|
+
// root output style (`readStoredOutputStyle`) as every reload does.
|
|
100
123
|
const config = withGrandfatheredBuiltins(
|
|
101
|
-
initialConfig && typeof initialConfig === 'object'
|
|
124
|
+
initialConfig && typeof initialConfig === 'object'
|
|
125
|
+
? initialConfig
|
|
126
|
+
: withStoredOutputStyle(loadConfig(), readStoredOutputStyle?.())
|
|
102
127
|
);
|
|
103
128
|
// A requested percent replaces a saved token window; requested tokens
|
|
104
129
|
// replace both (resolveRouteContextState lets tokens win).
|
|
@@ -135,10 +160,12 @@ export function createConfigLifecycle({
|
|
|
135
160
|
getConfigHasSecrets,
|
|
136
161
|
setConfigHasSecrets,
|
|
137
162
|
getRoute,
|
|
138
|
-
// The live session follows the reloaded global compaction settings
|
|
139
|
-
// the runtime runs on an injected (headless) config.
|
|
163
|
+
// The live session follows the reloaded global compaction settings.
|
|
140
164
|
getSession,
|
|
141
|
-
|
|
165
|
+
// A headless caller injects a complete, deliberately isolated config: it
|
|
166
|
+
// never reloads from disk (no change subscription either), and its sessions
|
|
167
|
+
// keep the compaction they were created with.
|
|
168
|
+
injectedConfig = false,
|
|
142
169
|
// Main route sync on reload (both optional: a lifecycle without them never syncs)
|
|
143
170
|
setRouteState,
|
|
144
171
|
resolveRoute,
|
|
@@ -153,9 +180,14 @@ export function createConfigLifecycle({
|
|
|
153
180
|
clean,
|
|
154
181
|
resolve,
|
|
155
182
|
performanceNow = () => performance.now(),
|
|
156
|
-
|
|
183
|
+
// The runtime's change-driven effects (config-change-effects.mjs), given the
|
|
184
|
+
// diff against the snapshot this runtime last applied.
|
|
185
|
+
onConfigChanged,
|
|
186
|
+
// The backoff of a failed effect's retries; the last delay repeats.
|
|
187
|
+
effectRetryDelaysMs = [1000, 4000, 15000, 60000],
|
|
157
188
|
STANDALONE_DATA_DIR,
|
|
158
189
|
}) {
|
|
190
|
+
let disposed = false;
|
|
159
191
|
const outputStyleCache = createOutputStyleStatusCache({
|
|
160
192
|
cfgMod,
|
|
161
193
|
STANDALONE_DATA_DIR,
|
|
@@ -217,25 +249,125 @@ export function createConfigLifecycle({
|
|
|
217
249
|
}
|
|
218
250
|
|
|
219
251
|
// --- reload / ensure --------------------------------------------------------
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
252
|
+
const changeSnapshot = (config) =>
|
|
253
|
+
configChangeSnapshot({
|
|
254
|
+
config,
|
|
255
|
+
root: sharedCfgMod?.readConfig?.(),
|
|
256
|
+
secretTokens: sharedCfgMod?.secretChangeTokens?.(),
|
|
257
|
+
});
|
|
258
|
+
// What this runtime's effects last ran against, starting from the boot
|
|
259
|
+
// config (the snapshot does not depend on whether a load read secrets).
|
|
260
|
+
let appliedSnapshot = changeSnapshot(getConfig());
|
|
261
|
+
// The stored settings the current config object was taken from (never
|
|
262
|
+
// marked pending): the object is replaced only when they changed, so a
|
|
263
|
+
// retry of a failed effect alone keeps it.
|
|
264
|
+
let loadedSnapshot = appliedSnapshot;
|
|
265
|
+
|
|
266
|
+
// A pending debounced write holds the only copy of the latest change.
|
|
267
|
+
// Flush it before re-reading from disk so loadConfig() observes (and the
|
|
268
|
+
// subsequent adopt preserves) that change instead of reverting to a stale
|
|
269
|
+
// on-disk snapshot.
|
|
270
|
+
function loadFullConfig() {
|
|
225
271
|
writers.flushConfigSave();
|
|
226
|
-
|
|
272
|
+
if (injectedConfig) return null;
|
|
273
|
+
return withPendingEdits(cfgMod.loadConfig(), writers, sharedCfgMod?.readConfig?.()?.outputStyle);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function reloadFullConfig() {
|
|
277
|
+
return adoptFullConfig(loadFullConfig());
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function adoptFullConfig(next) {
|
|
281
|
+
if (!next) return getConfig();
|
|
227
282
|
const adopted = adoptConfig(next, { hasSecrets: true });
|
|
228
283
|
configSaveBaseline = structuredClone(adopted);
|
|
229
284
|
leadRoute.syncEmptyMainRoute(adopted);
|
|
230
|
-
|
|
285
|
+
syncSessionCompaction(getSession?.(), adopted);
|
|
231
286
|
return adopted;
|
|
232
287
|
}
|
|
233
288
|
|
|
234
289
|
function ensureFullConfig() {
|
|
235
|
-
if (getConfigHasSecrets()) return getConfig();
|
|
290
|
+
if (injectedConfig || getConfigHasSecrets()) return getConfig();
|
|
236
291
|
return reloadFullConfig();
|
|
237
292
|
}
|
|
238
293
|
|
|
294
|
+
/** The change step: reload, then run the effects keyed by what differs from
|
|
295
|
+
* the last applied snapshot. A writer that runs it right after its own write
|
|
296
|
+
* has applied the change, so the notification that follows finds nothing.
|
|
297
|
+
* The config object is replaced only when the stored settings changed (a
|
|
298
|
+
* retry of a failed effect alone keeps it): consumers key turn-start
|
|
299
|
+
* reconciles on its identity. */
|
|
300
|
+
function applyConfigChange() {
|
|
301
|
+
// A load that throws changes nothing: pending domains stay pending.
|
|
302
|
+
const loaded = loadFullConfig();
|
|
303
|
+
// Every pending domain is in this step's diff, so it runs again here (and
|
|
304
|
+
// a scheduled retry is this step).
|
|
305
|
+
pendingDomains = new Set();
|
|
306
|
+
clearTimeout(retryTimer);
|
|
307
|
+
retryTimer = null;
|
|
308
|
+
outputStyleCache.invalidateOutputStyleStatusCache();
|
|
309
|
+
const next = changeSnapshot(loaded ?? getConfig());
|
|
310
|
+
const change = diffConfigSnapshots(appliedSnapshot, next);
|
|
311
|
+
appliedSnapshot = next;
|
|
312
|
+
const settingsChanged = !configChangeIsEmpty(diffConfigSnapshots(loadedSnapshot, next));
|
|
313
|
+
loadedSnapshot = next;
|
|
314
|
+
const config = settingsChanged ? adoptFullConfig(loaded) : getConfig();
|
|
315
|
+
let outcome;
|
|
316
|
+
try {
|
|
317
|
+
outcome = onConfigChanged?.(change, config);
|
|
318
|
+
} catch {
|
|
319
|
+
outcome = configChangeDomains(change);
|
|
320
|
+
}
|
|
321
|
+
void Promise.resolve(outcome).then(
|
|
322
|
+
(failedDomains) => settleConfigEffects(failedDomains),
|
|
323
|
+
() => settleConfigEffects(configChangeDomains(change))
|
|
324
|
+
);
|
|
325
|
+
return change;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// A domain whose effect failed is marked not applied, so the next change
|
|
329
|
+
// step (any notification, a writer's own step, or the retry below) runs it
|
|
330
|
+
// again; the applied snapshot otherwise advances as the step runs, which
|
|
331
|
+
// keeps a step overlapping an in-flight effect from repeating it. The retry
|
|
332
|
+
// backs off to the last delay and keeps going until the domain succeeds or
|
|
333
|
+
// the sync is disposed.
|
|
334
|
+
let pendingDomains = new Set();
|
|
335
|
+
let retryTimer = null;
|
|
336
|
+
let retryAttempt = 0;
|
|
337
|
+
function settleConfigEffects(failedDomains) {
|
|
338
|
+
for (const domain of Array.isArray(failedDomains) ? failedDomains : []) {
|
|
339
|
+
appliedSnapshot = withConfigDomainPending(appliedSnapshot, domain);
|
|
340
|
+
pendingDomains.add(domain);
|
|
341
|
+
}
|
|
342
|
+
if (!pendingDomains.size) {
|
|
343
|
+
retryAttempt = 0;
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
if (retryTimer || disposed) return;
|
|
347
|
+
const delay = effectRetryDelaysMs[Math.min(retryAttempt, effectRetryDelaysMs.length - 1)];
|
|
348
|
+
retryTimer = setTimeout(() => {
|
|
349
|
+
retryTimer = null;
|
|
350
|
+
retryAttempt += 1;
|
|
351
|
+
try {
|
|
352
|
+
applyConfigChange();
|
|
353
|
+
} catch {
|
|
354
|
+
// The reload failed (e.g. a config mid-write): still pending, retry later.
|
|
355
|
+
settleConfigEffects([]);
|
|
356
|
+
}
|
|
357
|
+
}, delay);
|
|
358
|
+
retryTimer.unref?.();
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// The output style this runtime selected but has not yet persisted wins over
|
|
362
|
+
// a status read from disk, so a concurrent write never shows the old style.
|
|
363
|
+
function getOutputStyleStatusCached(options) {
|
|
364
|
+
const status = outputStyleCache.getOutputStyleStatusCached(options);
|
|
365
|
+
const pending = writers.pendingOutputStyle();
|
|
366
|
+
if (pending === null || status?.configured === pending) return status;
|
|
367
|
+
const current = (status?.styles || []).find((style) => style.id === pending) || status?.current;
|
|
368
|
+
return { ...status, configured: pending, current };
|
|
369
|
+
}
|
|
370
|
+
|
|
239
371
|
function ensureConfigForRouteProvider() {
|
|
240
372
|
const config = getConfig();
|
|
241
373
|
const providerId = clean(getRoute().provider);
|
|
@@ -246,19 +378,22 @@ export function createConfigLifecycle({
|
|
|
246
378
|
return ensureFullConfig();
|
|
247
379
|
}
|
|
248
380
|
|
|
249
|
-
// Settings persisted by any other runtime (or process)
|
|
250
|
-
//
|
|
251
|
-
// shared layer coalesces bursts into one pass per
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
outputStyleCache.invalidateOutputStyleStatusCache();
|
|
255
|
-
onConfigReloaded?.();
|
|
256
|
-
});
|
|
381
|
+
// Settings and secrets persisted by this or any other runtime (or process)
|
|
382
|
+
// reach this runtime's config and effects. reloadFullConfig keeps our own
|
|
383
|
+
// pending edits, and the shared layer coalesces bursts into one pass per
|
|
384
|
+
// subscriber. An injected config never follows the disk.
|
|
385
|
+
const unsubscribeConfigChange = injectedConfig ? null : sharedCfgMod?.subscribeConfigChange?.(applyConfigChange);
|
|
257
386
|
|
|
258
387
|
return {
|
|
259
|
-
disposeConfigSync: () =>
|
|
388
|
+
disposeConfigSync: () => {
|
|
389
|
+
disposed = true;
|
|
390
|
+
clearTimeout(retryTimer);
|
|
391
|
+
retryTimer = null;
|
|
392
|
+
unsubscribeConfigChange?.();
|
|
393
|
+
},
|
|
260
394
|
// output-style cache
|
|
261
395
|
...outputStyleCache,
|
|
396
|
+
getOutputStyleStatusCached,
|
|
262
397
|
// adopt / save
|
|
263
398
|
adoptConfig,
|
|
264
399
|
saveConfigAndAdopt,
|
|
@@ -270,6 +405,7 @@ export function createConfigLifecycle({
|
|
|
270
405
|
flushAllConfigSavesAsync: writers.flushAllConfigSavesAsync,
|
|
271
406
|
// reload / ensure
|
|
272
407
|
reloadFullConfig,
|
|
408
|
+
applyConfigChange,
|
|
273
409
|
ensureFullConfig,
|
|
274
410
|
displayConfig: () => getConfig(),
|
|
275
411
|
ensureConfigForRouteProvider,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// After the
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// After the connector merge (connector-catalog.mjs mergeConnectorAccountServers)
|
|
2
|
+
// `gmail-2`, `notion-2`, `postgres-2`… are accounts of their connector's one
|
|
3
|
+
// server, no longer servers. Every store of ours that keys a setting by
|
|
4
4
|
// MCP server name must name the surviving server instead:
|
|
5
5
|
// agents/<id>/agent.json, bots/<id>/agent.json connectors.off / connectors.tools
|
|
6
6
|
// (a legacy allow list too)
|
|
@@ -11,14 +11,15 @@
|
|
|
11
11
|
// name models, not servers.) Project and plugin hook files are the user's or
|
|
12
12
|
// the plugin's own and are never rewritten here.
|
|
13
13
|
//
|
|
14
|
-
// Rule:
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
14
|
+
// Rule: differences are ignored and the topmost server decides. The merged
|
|
15
|
+
// connector is on or off for an agent/project as the surviving server was
|
|
16
|
+
// there when the setting names it, else as the lowest-numbered merged server
|
|
17
|
+
// it names (so a switched-off `-N` server never becomes reachable through the
|
|
18
|
+
// merge). Per-tool permissions move to the surviving name; where merged
|
|
19
|
+
// servers disagree on a tool the surviving server's own entry wins, else the
|
|
20
|
+
// first merged server's. Entries of a server that was off are dormant and
|
|
21
|
+
// dropped when the connector stays on. A setting that names no merged-away
|
|
22
|
+
// server is never touched, so every run after the first is a no-op.
|
|
22
23
|
//
|
|
23
24
|
// The merge is saved to the config once, so the rename mapping outlives it:
|
|
24
25
|
// `<data>/connector-merge-pending.json` ({ merged: [{ name, from }] }) is
|
|
@@ -35,7 +36,6 @@ import { readdirSync, readFileSync, rmSync } from 'node:fs';
|
|
|
35
36
|
import { join } from 'node:path';
|
|
36
37
|
import { normalizeRules, standardConfigReport } from './services/hook-bus/config.mjs';
|
|
37
38
|
import {
|
|
38
|
-
PERMISSION_RANK,
|
|
39
39
|
PROJECT_CONNECTORS_FILE,
|
|
40
40
|
connectorEnabled,
|
|
41
41
|
parseConnectorPolicy,
|
|
@@ -56,7 +56,8 @@ function mapMergedConnectorPolicy(policy, merged) {
|
|
|
56
56
|
current.off.includes(server) || current.allow?.includes(server) || Object.hasOwn(current.tools, server);
|
|
57
57
|
if (!gone.some(named)) continue;
|
|
58
58
|
const live = from.filter((server) => connectorEnabled(current, server));
|
|
59
|
-
|
|
59
|
+
// `from` lists the surviving server first, then the others lowest-numbered first.
|
|
60
|
+
const on = connectorEnabled(current, from.find(named));
|
|
60
61
|
const off = current.off.filter((server) => !from.includes(server));
|
|
61
62
|
const allow = current.allow?.filter((server) => !from.includes(server));
|
|
62
63
|
if (allow && on) allow.push(name);
|
|
@@ -64,9 +65,11 @@ function mapMergedConnectorPolicy(policy, merged) {
|
|
|
64
65
|
const tools = { ...current.tools };
|
|
65
66
|
for (const server of from) delete tools[server];
|
|
66
67
|
const moved = {};
|
|
67
|
-
|
|
68
|
+
const sources = on ? live : from;
|
|
69
|
+
for (const server of [name, ...sources.filter((id) => id !== name)]) {
|
|
70
|
+
if (!sources.includes(server)) continue;
|
|
68
71
|
for (const [tool, permission] of Object.entries(current.tools[server] || {})) {
|
|
69
|
-
if (!(tool in moved)
|
|
72
|
+
if (!(tool in moved)) moved[tool] = permission;
|
|
70
73
|
}
|
|
71
74
|
}
|
|
72
75
|
if (Object.keys(moved).length) tools[name] = moved;
|