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
|
@@ -14,9 +14,11 @@ import { migrateMergedConnectorServers } from './connector-merge-migration.mjs';
|
|
|
14
14
|
import {
|
|
15
15
|
connectorAccountServers,
|
|
16
16
|
connectorAccountsOf,
|
|
17
|
+
connectorAppPasswordOnly,
|
|
17
18
|
connectorById,
|
|
18
|
-
|
|
19
|
+
connectorServerInput,
|
|
19
20
|
gmailAppPasswordAccount,
|
|
21
|
+
gmailAppPasswordServerInput,
|
|
20
22
|
mergeConnectorAccountServers,
|
|
21
23
|
} from '../runtime/shared/connector-catalog.mjs';
|
|
22
24
|
import { saveMcpOAuthClientSecret } from '../runtime/agent/orchestrator/mcp/oauth-client.mjs';
|
|
@@ -75,14 +77,24 @@ export function createMcpResourceApi({ deps, sync, decorate }) {
|
|
|
75
77
|
resolveMcpCatalog,
|
|
76
78
|
pluginMcpServer,
|
|
77
79
|
});
|
|
78
|
-
const {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
const {
|
|
81
|
+
storeOAuthClientSecret,
|
|
82
|
+
storeGmailAppPassword,
|
|
83
|
+
releaseOAuth,
|
|
84
|
+
forgetUnusedGmailAppPassword,
|
|
85
|
+
forgetStoredSecrets,
|
|
86
|
+
releaseAccount,
|
|
87
|
+
} = createMcpServerSecrets({
|
|
88
|
+
gmailAppPassword,
|
|
89
|
+
saveOAuthClientSecret,
|
|
90
|
+
clearMcpServerOAuth,
|
|
91
|
+
resolveConfiguredMcpCatalog,
|
|
92
|
+
});
|
|
93
|
+
const {
|
|
94
|
+
addConnectorAccount: joinConnectorAccount,
|
|
95
|
+
saveConnectorAccount,
|
|
96
|
+
setConnectorAccountEnabled,
|
|
97
|
+
} = createConnectorAccountEdits({
|
|
86
98
|
normalizeMcpServerInput,
|
|
87
99
|
pluginMcpServer,
|
|
88
100
|
sync,
|
|
@@ -91,16 +103,65 @@ export function createMcpResourceApi({ deps, sync, decorate }) {
|
|
|
91
103
|
storeOAuthClientSecret,
|
|
92
104
|
storeGmailAppPassword,
|
|
93
105
|
forgetUnusedGmailAppPassword,
|
|
106
|
+
forgetStoredSecrets,
|
|
94
107
|
releaseOAuth,
|
|
95
108
|
});
|
|
96
109
|
// Peers reload config from disk on receipt: land the write before publishing.
|
|
97
110
|
const persisted = async () => {
|
|
98
111
|
await flushSkillsSave?.();
|
|
99
112
|
};
|
|
113
|
+
// One account addition of a connector at a time, each reading the servers
|
|
114
|
+
// the one before it saved: two at once never take the same name, nor does
|
|
115
|
+
// one's save drop the other's account.
|
|
116
|
+
const connectorAdds = new Map();
|
|
117
|
+
const oneAddAtATime = (connector, run) => {
|
|
118
|
+
const next = (connectorAdds.get(connector) || Promise.resolve()).then(run, run);
|
|
119
|
+
const settled = next.then(
|
|
120
|
+
() => {},
|
|
121
|
+
() => {}
|
|
122
|
+
);
|
|
123
|
+
connectorAdds.set(connector, settled);
|
|
124
|
+
void settled.then(() => {
|
|
125
|
+
if (connectorAdds.get(connector) === settled) connectorAdds.delete(connector);
|
|
126
|
+
});
|
|
127
|
+
return next;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
async function addMcpServer(input = {}) {
|
|
131
|
+
// A catalog connector's account (as its own server config) joins that
|
|
132
|
+
// connector's one server.
|
|
133
|
+
const connector = clean(input.connector);
|
|
134
|
+
if (connector && !Array.isArray(input.accounts)) return oneAddAtATime(connector, () => addServerNow(input));
|
|
135
|
+
return addServerNow(input);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async function addServerNow(input) {
|
|
139
|
+
const { name, config: serverConfig } = normalizeMcpServerInput(input);
|
|
140
|
+
// A catalog connector's server keeps its catalog id (connector-catalog.mjs).
|
|
141
|
+
const connector = clean(input.connector);
|
|
142
|
+
if (connector) {
|
|
143
|
+
if (!connectorById(connector)) throw new Error(`Unknown connector: ${connector}`);
|
|
144
|
+
serverConfig.connector = connector;
|
|
145
|
+
}
|
|
146
|
+
const servers = userServers();
|
|
147
|
+
if (connector && !Array.isArray(input.accounts)) {
|
|
148
|
+
return joinConnectorAccount(servers, connector, name, serverConfig, input);
|
|
149
|
+
}
|
|
150
|
+
if (Object.hasOwn(servers, name) || accountTarget(servers, name)) {
|
|
151
|
+
throw nameTakenError(servers, name);
|
|
152
|
+
}
|
|
153
|
+
const owned = pluginMcpServer(name);
|
|
154
|
+
if (owned) throw new Error(`MCP server already exists: ${name} (provided by plugin "${owned.owner.id}")`);
|
|
155
|
+
await storeOAuthClientSecret(input, serverConfig);
|
|
156
|
+
await storeGmailAppPassword(input, serverConfig, true);
|
|
157
|
+
saveServers({ ...servers, [name]: serverConfig });
|
|
158
|
+
const status = await sync.reconnectMcpAndAnnounce({ only: name, enabled: serverConfig.enabled !== false });
|
|
159
|
+
return { name, status };
|
|
160
|
+
}
|
|
100
161
|
|
|
101
162
|
return {
|
|
102
|
-
/** One-time, idempotent: merge the one-account servers of a
|
|
103
|
-
* connector (`
|
|
163
|
+
/** One-time, idempotent: merge the one-account servers of a catalog
|
|
164
|
+
* connector (`notion`, `notion-2`…) into one server holding the accounts
|
|
104
165
|
* (connector-catalog.mjs mergeConnectorAccountServers). Every account
|
|
105
166
|
* keeps its address, so its stored sign-in and app password stay as
|
|
106
167
|
* they are. Settings keyed by a merged-away server name go with it:
|
|
@@ -155,30 +216,32 @@ export function createMcpResourceApi({ deps, sync, decorate }) {
|
|
|
155
216
|
},
|
|
156
217
|
// Sign-in / sign-out (resource-mcp-oauth-api.mjs), in this key position.
|
|
157
218
|
...oauthApi,
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
219
|
+
addMcpServer,
|
|
220
|
+
/** One more account of catalog connector `input.connector`, connected as
|
|
221
|
+
* its catalog entry says: `key` for an API-key service (Hugging Face,
|
|
222
|
+
* Stripe; Postgres takes its connection string), `email` and
|
|
223
|
+
* `appPassword` for Gmail, nothing more for a sign-in service (the
|
|
224
|
+
* account then signs in with beginMcpOAuthLogin(account)); the user's own
|
|
225
|
+
* OAuth client rides on `oauthClientId` / `oauthClientSecret`. The account
|
|
226
|
+
* gets a free name (`notion`, `notion-2`…) and joins the connector's one
|
|
227
|
+
* server, which is made when there is none. Resolves `{ name, account,
|
|
228
|
+
* status }`: the server's name and the new account's (for a Gmail
|
|
229
|
+
* address already connected, that account, which took the new password). */
|
|
230
|
+
async addConnectorAccount(input = {}) {
|
|
231
|
+
const entry = connectorById(clean(input.connector));
|
|
232
|
+
if (!entry) throw new Error(`Unknown connector: ${clean(input.connector)}`);
|
|
233
|
+
// Its name is picked from the servers the additions before it saved.
|
|
234
|
+
return oneAddAtATime(entry.id, () => {
|
|
235
|
+
const name = freeName(userServers(), entry.id);
|
|
236
|
+
const account = connectorAppPasswordOnly(entry)
|
|
237
|
+
? gmailAppPasswordServerInput(name, input.email, input.appPassword)
|
|
238
|
+
: connectorServerInput(entry, name, input.key);
|
|
239
|
+
const ownClient = clean(input.oauthClientId);
|
|
240
|
+
return addServerNow({
|
|
241
|
+
...account,
|
|
242
|
+
...(ownClient ? { oauthClientId: ownClient, oauthClientSecret: input.oauthClientSecret } : {}),
|
|
243
|
+
});
|
|
244
|
+
});
|
|
182
245
|
},
|
|
183
246
|
async saveMcpServer(input = {}) {
|
|
184
247
|
const servers = userServers();
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
// The accounts of a
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// The accounts of a connector server as the MCP server API edits them: adding
|
|
2
|
+
// one more account (into its server, or a new server holding it) and editing
|
|
3
|
+
// one account's transport, app password or client.
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
4
5
|
import { clean } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
|
|
5
6
|
import {
|
|
6
7
|
mergeMcpServerConfig,
|
|
@@ -13,15 +14,16 @@ import {
|
|
|
13
14
|
connectorAccountServers,
|
|
14
15
|
connectorAccountsOf,
|
|
15
16
|
connectorAccountsUrl,
|
|
16
|
-
connectorById,
|
|
17
17
|
connectorOfServer,
|
|
18
|
+
connectorServerSettings,
|
|
18
19
|
gmailAppPasswordAccount,
|
|
19
20
|
withConnectorAccountEnabled,
|
|
20
21
|
} from '../runtime/shared/connector-catalog.mjs';
|
|
21
22
|
import { forgetConnectorAccountHealth } from '../runtime/connectors/connector-accounts-mcp.mjs';
|
|
22
|
-
import {
|
|
23
|
+
import { hasConfiguredMcpAuth } from '../runtime/agent/orchestrator/mcp/client-transport.mjs';
|
|
24
|
+
import { accountTarget, mergedServerInput, nameTakenError, oauthCredentialOf } from './resource-mcp-servers.mjs';
|
|
23
25
|
|
|
24
|
-
/** The server of
|
|
26
|
+
/** The server of connector `connector` in `servers`, or ''. */
|
|
25
27
|
function connectorServerName(servers, connector) {
|
|
26
28
|
return (
|
|
27
29
|
Object.keys(servers).find(
|
|
@@ -36,7 +38,7 @@ function connectorServerName(servers, connector) {
|
|
|
36
38
|
export const editsServerItself = (target, input) => {
|
|
37
39
|
if (target.serverName !== target.account.name || !clean(input.url)) return false;
|
|
38
40
|
try {
|
|
39
|
-
return
|
|
41
|
+
return oauthCredentialOf({ type: input.type || 'http', url: input.url }) === oauthCredentialOf(target.cfg);
|
|
40
42
|
} catch {
|
|
41
43
|
return false;
|
|
42
44
|
}
|
|
@@ -51,12 +53,14 @@ export function createConnectorAccountEdits({
|
|
|
51
53
|
storeOAuthClientSecret,
|
|
52
54
|
storeGmailAppPassword,
|
|
53
55
|
forgetUnusedGmailAppPassword,
|
|
56
|
+
forgetStoredSecrets,
|
|
54
57
|
releaseOAuth,
|
|
55
58
|
}) {
|
|
56
|
-
/** One more account of
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
59
|
+
/** One more account of connector `connector` (one-account config
|
|
60
|
+
* `accountCfg` as normalized from `input`): into its server, or a new
|
|
61
|
+
* server named `name` holding it. The same Gmail address again takes the
|
|
62
|
+
* new app password. `servers` is read under the caller's per-connector
|
|
63
|
+
* serialization (resource-mcp-api.mjs). Resolves `{ name, account, status }`. */
|
|
60
64
|
async function addConnectorAccount(servers, connector, name, accountCfg, input) {
|
|
61
65
|
const serverName = connectorServerName(servers, connector);
|
|
62
66
|
const address = gmailAppPasswordAccount(accountCfg);
|
|
@@ -76,30 +80,41 @@ export function createConnectorAccountEdits({
|
|
|
76
80
|
throw nameTakenError(servers, name);
|
|
77
81
|
}
|
|
78
82
|
const accountName = serverName ? freeName(servers, name) : name;
|
|
79
|
-
|
|
80
|
-
//
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
) {
|
|
87
|
-
account.
|
|
83
|
+
// A fresh identity: a conversation that used a removed account of this
|
|
84
|
+
// name never takes this one for it (connector-accounts-mcp.mjs).
|
|
85
|
+
const account = { ...connectorAccountEntry(accountName, accountCfg), id: randomUUID() };
|
|
86
|
+
// A sign-in is stored per exact URL: another account signing in at the
|
|
87
|
+
// same URL gets its own key, so the two never share tokens.
|
|
88
|
+
const asServer = connectorAccountServer({ connector }, account);
|
|
89
|
+
const signIn = hasConfiguredMcpAuth(asServer) ? null : oauthCredentialOf(asServer);
|
|
90
|
+
if (signIn && cfg && connectorAccountServers(cfg).some((other) => oauthCredentialOf(other) === signIn)) {
|
|
91
|
+
account.oauthKey = randomUUID();
|
|
88
92
|
}
|
|
89
93
|
const storedCfg = connectorAccountServer({ connector }, account);
|
|
90
|
-
await storeOAuthClientSecret(input, storedCfg);
|
|
91
|
-
await storeGmailAppPassword(input, storedCfg, true);
|
|
92
|
-
forgetConnectorAccountHealth(accountName);
|
|
93
94
|
let target = serverName;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
95
|
+
// Its secrets and its config land together: a failed step takes back the secrets.
|
|
96
|
+
try {
|
|
97
|
+
await storeOAuthClientSecret(input, storedCfg);
|
|
98
|
+
await storeGmailAppPassword(input, storedCfg, true);
|
|
99
|
+
if (cfg) {
|
|
100
|
+
servers[serverName] = { ...cfg, accounts: [...connectorAccountsOf(cfg), account] };
|
|
101
|
+
} else {
|
|
102
|
+
// The server's own settings (timeouts, enabled) ride on the input.
|
|
103
|
+
target = name;
|
|
104
|
+
servers[name] = {
|
|
105
|
+
...connectorServerSettings(accountCfg),
|
|
106
|
+
type: 'http',
|
|
107
|
+
url: connectorAccountsUrl(connector),
|
|
108
|
+
connector,
|
|
109
|
+
accounts: [account],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
saveServers(servers);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
await forgetStoredSecrets(storedCfg);
|
|
115
|
+
throw error;
|
|
101
116
|
}
|
|
102
|
-
|
|
117
|
+
forgetConnectorAccountHealth(accountName);
|
|
103
118
|
const status = await sync.reconnectMcpAndAnnounce({ only: target, enabled: servers[target].enabled !== false });
|
|
104
119
|
return { name: target, account: accountName, status };
|
|
105
120
|
}
|
|
@@ -116,7 +131,7 @@ export function createConnectorAccountEdits({
|
|
|
116
131
|
await storeOAuthClientSecret(input, next, accountCfg);
|
|
117
132
|
await storeGmailAppPassword(input, next, false);
|
|
118
133
|
// Settings that are not the account's transport (timeouts) are the server's.
|
|
119
|
-
const
|
|
134
|
+
const serverFields = connectorServerSettings(config);
|
|
120
135
|
const server = { ...cfg };
|
|
121
136
|
for (const group of MCP_TIMEOUT_FIELD_GROUPS) {
|
|
122
137
|
if (group.some((field) => Object.hasOwn(serverFields, field))) for (const field of group) delete server[field];
|
|
@@ -128,6 +143,8 @@ export function createConnectorAccountEdits({
|
|
|
128
143
|
entry.name === account.name
|
|
129
144
|
? {
|
|
130
145
|
...connectorAccountEntry(account.name, next),
|
|
146
|
+
// An edit keeps the account's identity.
|
|
147
|
+
...(entry.id ? { id: entry.id } : {}),
|
|
131
148
|
...(connectorAccountEnabled(entry) ? {} : { enabled: false }),
|
|
132
149
|
}
|
|
133
150
|
: entry
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
connectorAccountServers,
|
|
8
8
|
} from '../runtime/shared/connector-catalog.mjs';
|
|
9
9
|
import { forgetConnectorAccountHealth } from '../runtime/connectors/connector-accounts-mcp.mjs';
|
|
10
|
-
import {
|
|
10
|
+
import { oauthCredentialOf } from './resource-mcp-servers.mjs';
|
|
11
11
|
|
|
12
12
|
/** Every config `servers` connects with, a multi-account server's accounts
|
|
13
13
|
* as the one-account configs they are. */
|
|
@@ -44,15 +44,16 @@ export function createMcpServerSecrets({
|
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
46
|
// A server's OAuth tokens and client registration go with it, unless another
|
|
47
|
-
// configured server (plugin or disabled ones included, even with
|
|
48
|
-
// disabled for this runtime) still uses them through the same exact URL
|
|
49
|
-
// `signIn` tells the caller what happened to the
|
|
50
|
-
// secrets deleted, `revoked` when the provider
|
|
51
|
-
// too), `shared` (another server still uses it),
|
|
47
|
+
// configured server or account (plugin or disabled ones included, even with
|
|
48
|
+
// MCP disabled for this runtime) still uses them through the same exact URL
|
|
49
|
+
// (or the same account key). `signIn` tells the caller what happened to the
|
|
50
|
+
// sign-in: `removed` (local secrets deleted, `revoked` when the provider
|
|
51
|
+
// confirmed the revocation too), `shared` (another server still uses it),
|
|
52
|
+
// or none (null).
|
|
52
53
|
const releaseOAuth = async (cfg) => {
|
|
53
|
-
const
|
|
54
|
-
if (!
|
|
55
|
-
if (expandedConfigs(resolveConfiguredMcpCatalog().servers).some((other) =>
|
|
54
|
+
const key = oauthCredentialOf(cfg);
|
|
55
|
+
if (!key) return null;
|
|
56
|
+
if (expandedConfigs(resolveConfiguredMcpCatalog().servers).some((other) => oauthCredentialOf(other) === key)) {
|
|
56
57
|
return { signIn: 'shared', revoked: false };
|
|
57
58
|
}
|
|
58
59
|
const { revoked = false } = (await clearMcpServerOAuth(cfg, { revoke: true })) || {};
|
|
@@ -66,6 +67,15 @@ export function createMcpServerSecrets({
|
|
|
66
67
|
await gmailAppPassword.forget(account);
|
|
67
68
|
return true;
|
|
68
69
|
};
|
|
70
|
+
// What storeOAuthClientSecret / storeGmailAppPassword stored for `cfg`, gone
|
|
71
|
+
// again unless a configured server uses it (an add that was not saved).
|
|
72
|
+
const forgetStoredSecrets = async (cfg) => {
|
|
73
|
+
await forgetUnusedGmailAppPassword(gmailAppPasswordAccount(cfg));
|
|
74
|
+
if (!cfg?.url || !cfg.oauthClientId) return;
|
|
75
|
+
const servers = expandedConfigs(resolveConfiguredMcpCatalog().servers);
|
|
76
|
+
if (!servers.some((other) => other.url === cfg.url && other.oauthClientId))
|
|
77
|
+
await saveOAuthClientSecret(cfg.url, '');
|
|
78
|
+
};
|
|
69
79
|
// A removed account keeps no sign-in another configured server or account
|
|
70
80
|
// does not share: `{ signIn, revoked }` as removeMcpServer reports it.
|
|
71
81
|
const releaseAccount = async (accountCfg) => {
|
|
@@ -78,5 +88,12 @@ export function createMcpServerSecrets({
|
|
|
78
88
|
return releaseOAuth(accountCfg);
|
|
79
89
|
};
|
|
80
90
|
|
|
81
|
-
return {
|
|
91
|
+
return {
|
|
92
|
+
storeOAuthClientSecret,
|
|
93
|
+
storeGmailAppPassword,
|
|
94
|
+
releaseOAuth,
|
|
95
|
+
forgetUnusedGmailAppPassword,
|
|
96
|
+
forgetStoredSecrets,
|
|
97
|
+
releaseAccount,
|
|
98
|
+
};
|
|
82
99
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// name refusals and the merge of a partial server edit.
|
|
4
4
|
import { clean } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
|
|
5
5
|
import { MCP_TIMEOUT_FIELD_GROUPS } from '../runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs';
|
|
6
|
-
import {
|
|
6
|
+
import { resolveMcpOAuthCredentialKey } from '../runtime/agent/orchestrator/mcp/client-config.mjs';
|
|
7
7
|
import {
|
|
8
8
|
connectorAccountServer,
|
|
9
9
|
connectorAccountsOf,
|
|
@@ -11,10 +11,11 @@ import {
|
|
|
11
11
|
connectorOfServer,
|
|
12
12
|
} from '../runtime/shared/connector-catalog.mjs';
|
|
13
13
|
|
|
14
|
-
/**
|
|
15
|
-
|
|
14
|
+
/** What a server's OAuth credentials are stored under (its URL, or a
|
|
15
|
+
* connector account's own key), or null. */
|
|
16
|
+
export function oauthCredentialOf(cfg) {
|
|
16
17
|
try {
|
|
17
|
-
return
|
|
18
|
+
return resolveMcpOAuthCredentialKey(cfg);
|
|
18
19
|
} catch {
|
|
19
20
|
// No valid remote URL: such a server never logged in.
|
|
20
21
|
return null;
|
|
@@ -29,6 +29,7 @@ export function createPluginsResourceApi({ deps, sync, decorate }) {
|
|
|
29
29
|
pluginsStatus,
|
|
30
30
|
resolveMcpCatalog = () => ({ adoption: null }),
|
|
31
31
|
flushSkillsSave,
|
|
32
|
+
invalidateSkills,
|
|
32
33
|
} = deps;
|
|
33
34
|
const pluginData = () => cfgMod.getPluginData?.();
|
|
34
35
|
|
|
@@ -59,6 +60,9 @@ export function createPluginsResourceApi({ deps, sync, decorate }) {
|
|
|
59
60
|
return { plugin, status: pluginsStatus() };
|
|
60
61
|
},
|
|
61
62
|
async updatePlugin(plugin = {}) {
|
|
63
|
+
// Windows refuses to rename a directory holding an open recursive
|
|
64
|
+
// skill watch, so drop the watchers before the root is swapped.
|
|
65
|
+
invalidateSkills?.();
|
|
62
66
|
const updated = registryUpdatePlugin(pluginKey(plugin), { dataDir: pluginData() });
|
|
63
67
|
await adoptPluginServerCopies();
|
|
64
68
|
await sync.reconcilePluginsAndAnnounce();
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A routine (schedule or webhook) may name an executor: a workflow sub-agent
|
|
3
|
+
* (Worker, …) on its own configured route. Each fire is then carried out by
|
|
4
|
+
* that sub-agent first, headless and to its end, and only its final report
|
|
5
|
+
* goes to the owner bot's home thread, which relays it (routine-home-turn.mjs).
|
|
6
|
+
* No executor = the bot does the work itself, as before.
|
|
7
|
+
*
|
|
8
|
+
* The executor is a delegatable workflow agent: never a bot (contact agent) or
|
|
9
|
+
* Mixy, never one that is unknown or turned off — refused when the routine is
|
|
10
|
+
* saved (assertRoutineExecutor) and again when it fires (a sub-agent that
|
|
11
|
+
* disappeared or was turned off since fails the fire; nothing falls back).
|
|
12
|
+
*
|
|
13
|
+
* The run is unattended like the bot's own routine turn: it is created under a
|
|
14
|
+
* session id marked as that routine's run (held-requests.mjs markUnattendedRun)
|
|
15
|
+
* so the sub-agent's record carries the run stamp (human-gate/delegation.mjs):
|
|
16
|
+
* it never asks, payments and permanent deletes are refused
|
|
17
|
+
* (human-gate/run-policy.mjs). A sub-agent session has no `agent`, `session`
|
|
18
|
+
* or `ask_user` tool (AGENT_WORKER_DENIED_TOOLS), so it can start no task
|
|
19
|
+
* session and ask nobody.
|
|
20
|
+
*/
|
|
21
|
+
import { randomUUID } from 'node:crypto';
|
|
22
|
+
import { MIXY_AGENT_ID } from '../runtime/agent/orchestrator/session/agent-home.mjs';
|
|
23
|
+
import {
|
|
24
|
+
BUILTIN_SLOT_AGENT_IDS,
|
|
25
|
+
normalizeWorkflowId,
|
|
26
|
+
} from '../runtime/agent/orchestrator/runtime-core/workflow-ids.mjs';
|
|
27
|
+
import { storeInlineDocumentPart, storeInlineImagePart } from '../runtime/attachments/store.mjs';
|
|
28
|
+
import { MIXY_BOT_ID } from '../runtime/shared/agent-store.mjs';
|
|
29
|
+
import { automationPromptContent } from '../runtime/shared/automation-attachments.mjs';
|
|
30
|
+
import { routineExecutorHeader } from '../runtime/shared/routine-trigger.mjs';
|
|
31
|
+
import { scheduleOwnerAgentId } from './agent-home-delivery.mjs';
|
|
32
|
+
import { markUnattendedRun } from './held-requests.mjs';
|
|
33
|
+
|
|
34
|
+
/** `routineExecutorProblem` codes and the error each one raises. */
|
|
35
|
+
export const ROUTINE_EXECUTOR_PROBLEMS = Object.freeze({
|
|
36
|
+
unknown: (id) => `executor agent "${id}" is not an available sub-agent: pick one from the workflow agents`,
|
|
37
|
+
'not-agent': (id) =>
|
|
38
|
+
`executor agent "${id}" is a bot, not a workflow sub-agent: pick a sub-agent such as Worker, or leave it unset`,
|
|
39
|
+
disabled: (id) => `executor agent "${id}" is turned off: turn it on in the workflow agents or pick another`,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
/** The stored form of an executor id: lower-cased with dashes; null for none. */
|
|
43
|
+
export function normalizeExecutorAgentId(value) {
|
|
44
|
+
const text = typeof value === 'string' ? value.trim() : '';
|
|
45
|
+
return text ? normalizeWorkflowId(text, text.toLowerCase()) : null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function defaultProbe(id) {
|
|
49
|
+
const [{ workflowHelpers }, { getPluginData, loadConfig }, { isAgentDisabled, isContactAgentId }] = await Promise.all(
|
|
50
|
+
[
|
|
51
|
+
import('./boot/shared.mjs'),
|
|
52
|
+
import('../runtime/agent/orchestrator/config.mjs'),
|
|
53
|
+
import('../runtime/shared/agent-route-config.mjs'),
|
|
54
|
+
]
|
|
55
|
+
);
|
|
56
|
+
const dataDir = getPluginData();
|
|
57
|
+
// The fresh scan: an agent made a moment ago counts.
|
|
58
|
+
const listed = workflowHelpers.listCustomAgentIds(dataDir).includes(id) && !BUILTIN_SLOT_AGENT_IDS.has(id);
|
|
59
|
+
const definition = listed ? workflowHelpers.loadAgentDefinition(dataDir, id) : null;
|
|
60
|
+
return {
|
|
61
|
+
listed: Boolean(definition),
|
|
62
|
+
contact: Boolean(definition) && isContactAgentId(id, definition.kind),
|
|
63
|
+
disabled: isAgentDisabled(loadConfig({ secrets: false }), id),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Why `id` (normalized) cannot execute a routine: a ROUTINE_EXECUTOR_PROBLEMS
|
|
68
|
+
* code, '' when it can. `probe(id)` → `{ listed, contact, disabled }`. */
|
|
69
|
+
export async function routineExecutorProblem(id, probe = defaultProbe) {
|
|
70
|
+
if (id === MIXY_AGENT_ID || id === MIXY_BOT_ID) return 'not-agent';
|
|
71
|
+
const facts = await probe(id);
|
|
72
|
+
if (!facts.listed) return 'unknown';
|
|
73
|
+
if (facts.contact) return 'not-agent';
|
|
74
|
+
return facts.disabled ? 'disabled' : '';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** The executor id to store for a save's `executorAgentId` (null/empty = none),
|
|
78
|
+
* or the error naming why it cannot be one. */
|
|
79
|
+
export async function assertRoutineExecutor(value, probe = defaultProbe) {
|
|
80
|
+
if (value == null) return null;
|
|
81
|
+
if (typeof value !== 'string') throw new Error('executorAgentId must be a sub-agent id (a string) or null');
|
|
82
|
+
const id = normalizeExecutorAgentId(value);
|
|
83
|
+
if (!id) return null;
|
|
84
|
+
const problem = await routineExecutorProblem(id, probe);
|
|
85
|
+
if (problem) throw new Error(ROUTINE_EXECUTOR_PROBLEMS[problem](id));
|
|
86
|
+
return id;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** An inline image/PDF/Office part as the stored reference part a sub-agent's
|
|
90
|
+
* prompt may carry (handoff-attachments.mjs admits references only). */
|
|
91
|
+
const referencePart = (part) => (part.type === 'image' ? storeInlineImagePart(part) : storeInlineDocumentPart(part));
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Carry out one fire of routine `name` with sub-agent `agentId` and resolve its
|
|
95
|
+
* final report (trimmed text). `prompt` is the routine's instructions (plus a
|
|
96
|
+
* webhook's fenced payload); `ownerAgentId` the bot whose run it is. Rejects
|
|
97
|
+
* when the executor is no longer valid, fails, is cancelled, or `signal` aborts.
|
|
98
|
+
*/
|
|
99
|
+
export async function runRoutineExecutor(
|
|
100
|
+
{
|
|
101
|
+
agentId,
|
|
102
|
+
kind,
|
|
103
|
+
name,
|
|
104
|
+
ownerAgentId = null,
|
|
105
|
+
prompt,
|
|
106
|
+
// The trusted part of `prompt` (the routine's instructions): the only text
|
|
107
|
+
// the executor's skills are selected from, never a webhook payload.
|
|
108
|
+
skillSelection = '',
|
|
109
|
+
attachments = null,
|
|
110
|
+
cwd = null,
|
|
111
|
+
signal = null,
|
|
112
|
+
},
|
|
113
|
+
{ surface, probe = defaultProbe } = {}
|
|
114
|
+
) {
|
|
115
|
+
const problem = await routineExecutorProblem(agentId, probe);
|
|
116
|
+
if (problem) throw new Error(`${kind} "${name}" cannot run: ${ROUTINE_EXECUTOR_PROBLEMS[problem](agentId)}`);
|
|
117
|
+
if (typeof surface?.runAgent !== 'function') throw new Error('routine run: the agent service is not running');
|
|
118
|
+
const header = routineExecutorHeader({ kind, name, project: cwd ? String(cwd) : '' });
|
|
119
|
+
const content = automationPromptContent(`${header}\n\n${prompt}`, attachments);
|
|
120
|
+
const parts = Array.isArray(content) ? content : [{ type: 'text', text: content }];
|
|
121
|
+
const attachmentParts = parts.slice(1).map(referencePart).filter(Boolean);
|
|
122
|
+
// The id the executor is created under: marked as this routine's unattended
|
|
123
|
+
// run for as long as it works (its record keeps the run stamp afterwards).
|
|
124
|
+
const parentSessionId = `routine_exec_${randomUUID()}`;
|
|
125
|
+
const unmark = markUnattendedRun(parentSessionId, {
|
|
126
|
+
kind,
|
|
127
|
+
agentId: scheduleOwnerAgentId({ ownerAgentId }),
|
|
128
|
+
name,
|
|
129
|
+
});
|
|
130
|
+
try {
|
|
131
|
+
const result = await surface.runAgent(
|
|
132
|
+
{
|
|
133
|
+
agent: agentId,
|
|
134
|
+
prompt: parts[0].text,
|
|
135
|
+
skillSelection: String(skillSelection ?? ''),
|
|
136
|
+
...(cwd ? { cwd: String(cwd) } : {}),
|
|
137
|
+
...(attachmentParts.length ? { attachmentParts } : {}),
|
|
138
|
+
},
|
|
139
|
+
{ callerSessionId: parentSessionId },
|
|
140
|
+
{ signal }
|
|
141
|
+
);
|
|
142
|
+
return String(result?.content ?? '').trim();
|
|
143
|
+
} catch (error) {
|
|
144
|
+
// The caller's own cancellation stays as it is.
|
|
145
|
+
if (signal?.aborted) throw error;
|
|
146
|
+
throw new Error(`${kind} "${name}": executor agent "${agentId}" failed: ${error?.message || error}`, {
|
|
147
|
+
cause: error,
|
|
148
|
+
});
|
|
149
|
+
} finally {
|
|
150
|
+
unmark();
|
|
151
|
+
}
|
|
152
|
+
}
|