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,7 +14,10 @@
|
|
|
14
14
|
* (outbound actions are allowed within the bot's permissions; payments and
|
|
15
15
|
* permanent deletes are refused, human-gate/run-policy.mjs). Resolves with the
|
|
16
16
|
* reply once the turn ends; rejects when the turn fails, is cancelled, or the
|
|
17
|
-
* caller's `signal` aborts (which also aborts the turn once it runs).
|
|
17
|
+
* caller's `signal` aborts (which also aborts the turn once it runs). With an
|
|
18
|
+
* `executorAgentId` the fire is first carried out by that sub-agent
|
|
19
|
+
* (routine-executor.mjs) and the turn holds only its final report, which the
|
|
20
|
+
* bot relays; the quiet marker as the report wakes nobody and resolves it. A
|
|
18
21
|
* heartbeat turn past its wall-clock cap is aborted and resolves with no reply
|
|
19
22
|
* (`timedOut`).
|
|
20
23
|
*/
|
|
@@ -25,12 +28,16 @@ import { automationPromptContent } from '../runtime/shared/automation-attachment
|
|
|
25
28
|
import { ROUTINE_LIMITS } from '../runtime/shared/routine-limits.mjs';
|
|
26
29
|
import {
|
|
27
30
|
HEARTBEAT_TURN_LIMITS,
|
|
31
|
+
ROUTINE_QUIET,
|
|
28
32
|
isHeartbeatSession,
|
|
33
|
+
isRoutineQuietReply,
|
|
29
34
|
normalizeRoutineTrigger,
|
|
35
|
+
routineRelayHeader,
|
|
30
36
|
routineTriggerHeader,
|
|
31
37
|
} from '../runtime/shared/routine-trigger.mjs';
|
|
32
38
|
import { agentHomeLiveSurface, scheduleOwnerAgentId } from './agent-home-delivery.mjs';
|
|
33
39
|
import { markUnattendedRun, unattendedRunOf } from './held-requests.mjs';
|
|
40
|
+
import { runRoutineExecutor } from './routine-executor.mjs';
|
|
34
41
|
|
|
35
42
|
// Routine turns waiting or running per home thread.
|
|
36
43
|
const waiting = new Map();
|
|
@@ -72,6 +79,9 @@ export async function runRoutineTurn(
|
|
|
72
79
|
// thread and the routine trigger header.
|
|
73
80
|
sessionId = null,
|
|
74
81
|
header = null,
|
|
82
|
+
// A workflow sub-agent that carries the fire out first (routine-executor.mjs):
|
|
83
|
+
// the bot's turn then holds only its final report, for the bot to relay.
|
|
84
|
+
executorAgentId = null,
|
|
75
85
|
},
|
|
76
86
|
{
|
|
77
87
|
surface = agentHomeLiveSurface(),
|
|
@@ -79,9 +89,10 @@ export async function runRoutineTurn(
|
|
|
79
89
|
limit = ROUTINE_LIMITS.homeQueueLimit,
|
|
80
90
|
log = (line) => process.stderr.write(`mixdog routines: ${line}\n`),
|
|
81
91
|
timers = globalThis,
|
|
92
|
+
executor = runRoutineExecutor,
|
|
82
93
|
} = {}
|
|
83
94
|
) {
|
|
84
|
-
|
|
95
|
+
let body = String(prompt || '').trim();
|
|
85
96
|
if (!body) throw new Error(`${kind} "${name}" has no instructions`);
|
|
86
97
|
if (signal?.aborted) throw abortError(signal);
|
|
87
98
|
if (typeof surface?.submit !== 'function') throw new Error('routine run: the session service is not running');
|
|
@@ -91,12 +102,42 @@ export async function runRoutineTurn(
|
|
|
91
102
|
if (!home || home.closed === true) {
|
|
92
103
|
throw new Error(`the bot "${agentId}" has no chat yet: open it once in the app`);
|
|
93
104
|
}
|
|
105
|
+
let opening = header || routineTriggerHeader({ kind, name, project: cwd ? String(cwd) : '' });
|
|
106
|
+
let selection = String(skillSelection ?? body);
|
|
107
|
+
let turnAttachments = attachments;
|
|
108
|
+
if (executorAgentId) {
|
|
109
|
+
const report = String(
|
|
110
|
+
(await executor(
|
|
111
|
+
{
|
|
112
|
+
agentId: executorAgentId,
|
|
113
|
+
kind,
|
|
114
|
+
name,
|
|
115
|
+
ownerAgentId: agentId,
|
|
116
|
+
prompt: body,
|
|
117
|
+
skillSelection: selection,
|
|
118
|
+
attachments,
|
|
119
|
+
cwd,
|
|
120
|
+
signal,
|
|
121
|
+
},
|
|
122
|
+
{ surface }
|
|
123
|
+
)) ?? ''
|
|
124
|
+
).trim();
|
|
125
|
+
if (signal?.aborted) throw abortError(signal);
|
|
126
|
+
if (!report) throw new Error(`${kind} "${name}": executor agent "${executorAgentId}" returned no report`);
|
|
127
|
+
// Nothing to tell: the bot is not woken.
|
|
128
|
+
if (isRoutineQuietReply(report)) return { sessionId: homeId, result: ROUTINE_QUIET };
|
|
129
|
+
// The bot only relays the report: it is derived from whatever the executor
|
|
130
|
+
// read (a webhook's payload included), so it selects no skill.
|
|
131
|
+
body = report;
|
|
132
|
+
opening = routineRelayHeader({ kind, name, executor: executorAgentId, project: cwd ? String(cwd) : '' });
|
|
133
|
+
selection = '';
|
|
134
|
+
turnAttachments = null;
|
|
135
|
+
}
|
|
94
136
|
const queued = waiting.get(homeId) || 0;
|
|
95
137
|
if (queued >= limit) throw new Error(`${limit} routine runs already wait in this bot's chat`);
|
|
96
138
|
waiting.set(homeId, queued + 1);
|
|
97
139
|
const trigger = normalizeRoutineTrigger({ kind, name, event });
|
|
98
|
-
const
|
|
99
|
-
const content = automationPromptContent(`${opening}\n\n${body}`, attachments);
|
|
140
|
+
const content = automationPromptContent(`${opening}\n\n${body}`, turnAttachments);
|
|
100
141
|
return new Promise((resolve, reject) => {
|
|
101
142
|
let started = false;
|
|
102
143
|
let aborted = false;
|
|
@@ -150,7 +191,7 @@ export async function runRoutineTurn(
|
|
|
150
191
|
restorable: false,
|
|
151
192
|
// Esc ends this fire; it is never put back in the queue.
|
|
152
193
|
abortDiscardOnAbort: true,
|
|
153
|
-
skillSelection:
|
|
194
|
+
skillSelection: selection,
|
|
154
195
|
transcriptMeta: { routineTrigger: trigger },
|
|
155
196
|
onCommitted: () => {
|
|
156
197
|
if (started) return;
|
|
@@ -24,6 +24,7 @@ export function createRuntimeFacade({
|
|
|
24
24
|
getOrchestrationMode,
|
|
25
25
|
getOutputStyle,
|
|
26
26
|
getContextStatus,
|
|
27
|
+
getContextStatusSettled = async (options) => getContextStatus(options),
|
|
27
28
|
getContextStatusForSession,
|
|
28
29
|
renameSessionTitle,
|
|
29
30
|
}) {
|
|
@@ -144,6 +145,10 @@ export function createRuntimeFacade({
|
|
|
144
145
|
contextStatus(options) {
|
|
145
146
|
return getContextStatus(options);
|
|
146
147
|
},
|
|
148
|
+
/** The context status once an empty session took moved settings (async callers). */
|
|
149
|
+
contextStatusSettled(options) {
|
|
150
|
+
return getContextStatusSettled(options);
|
|
151
|
+
},
|
|
147
152
|
contextStatusForSession(session) {
|
|
148
153
|
return getContextStatusForSession(session);
|
|
149
154
|
},
|
|
@@ -6,13 +6,10 @@
|
|
|
6
6
|
// deps, so the runtime can hand them straight through.
|
|
7
7
|
import {
|
|
8
8
|
builtinFeatureActive,
|
|
9
|
-
featureDisallowedToolsFor,
|
|
10
9
|
localGitToolsActive,
|
|
11
10
|
} from '../runtime/agent/orchestrator/runtime-core/builtin-features.mjs';
|
|
12
11
|
import { recapEnabled } from '../runtime/agent/orchestrator/runtime-core/config-helpers.mjs';
|
|
13
|
-
import {
|
|
14
|
-
import { computerBridgeAvailableSync } from '../runtime/computer-bridge/client.mjs';
|
|
15
|
-
import { terminalBridgeAvailableSync } from '../runtime/terminal-bridge/client.mjs';
|
|
12
|
+
import { liveFeatureDisallowedTools } from '../runtime/agent/orchestrator/runtime-core/tool-availability.mjs';
|
|
16
13
|
|
|
17
14
|
export function createRuntimeFeatureGates({ getConfig, getToolProfile }) {
|
|
18
15
|
return {
|
|
@@ -29,12 +26,6 @@ export function createRuntimeFeatureGates({ getConfig, getToolProfile }) {
|
|
|
29
26
|
tidyToolEnabledFn: () => builtinFeatureActive(getConfig(), 'tidy'),
|
|
30
27
|
// Browser/Computer activate on live desktop-bridge presence, so the probe
|
|
31
28
|
// runs per call instead of being captured at boot.
|
|
32
|
-
featureDisallowedTools: () =>
|
|
33
|
-
featureDisallowedToolsFor(getConfig(), {
|
|
34
|
-
browserAvailable: browserBridgeAvailableSync(),
|
|
35
|
-
computerAvailable: computerBridgeAvailableSync(),
|
|
36
|
-
terminalAvailable: terminalBridgeAvailableSync(),
|
|
37
|
-
toolProfile: getToolProfile(),
|
|
38
|
-
}),
|
|
29
|
+
featureDisallowedTools: () => liveFeatureDisallowedTools(getConfig(), { toolProfile: getToolProfile() }),
|
|
39
30
|
};
|
|
40
31
|
}
|
|
@@ -26,6 +26,7 @@ export async function runScheduleSession(
|
|
|
26
26
|
kind: 'schedule',
|
|
27
27
|
name: schedule.name,
|
|
28
28
|
ownerAgentId: schedule.ownerAgentId,
|
|
29
|
+
executorAgentId: schedule.executorAgentId || null,
|
|
29
30
|
prompt: body,
|
|
30
31
|
attachments: schedule.attachments,
|
|
31
32
|
cwd: schedule.cwd || null,
|
|
@@ -84,11 +84,16 @@ export function reconcileJobCancelled(job, value) {
|
|
|
84
84
|
} catch {}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
/** A turn that threw. `identity` is the owner-facing result shape: a failure
|
|
88
|
+
* after answers the turn went on past (error.carriedReport, turn-report.mjs)
|
|
89
|
+
* reports them with the failure. */
|
|
90
|
+
export function reconcileJobStreamStalled(job, error, identity = {}) {
|
|
88
91
|
if (!job?.taskId || job._terminalResultValue !== undefined) return;
|
|
92
|
+
const report = typeof error?.carriedReport === 'string' ? error.carriedReport : '';
|
|
89
93
|
try {
|
|
90
94
|
reconcileBackgroundTask(job.taskId, {
|
|
91
95
|
status: 'failed',
|
|
96
|
+
...(report ? { result: { ...identity, content: report } } : {}),
|
|
92
97
|
error,
|
|
93
98
|
terminalReason: 'agent-stream-stalled',
|
|
94
99
|
});
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
import { resolveAgentWatchdogPolicy } from '../../../../runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs';
|
|
5
5
|
import { buildAgentTaskProgressFields } from '../../agent-task-status.mjs';
|
|
6
6
|
import { getProgressWatchdogState } from '../../agent-watchdog-registry.mjs';
|
|
7
|
+
import { _liveSessions } from '../../../../runtime/agent/orchestrator/session/store/live-state.mjs';
|
|
8
|
+
import { todoProgress } from '../../../../runtime/agent/orchestrator/runtime-core/todo-list.mjs';
|
|
7
9
|
|
|
8
10
|
// Job statuses that can never progress again (mirrors TERMINAL_STATUSES in
|
|
9
11
|
// runtime/shared/background-tasks.mjs; 'canceled' accepted defensively).
|
|
@@ -46,6 +48,11 @@ export function terminalJobFrozenFields(status, now = Date.now()) {
|
|
|
46
48
|
* the diagnostics through renderJob/list directly. */
|
|
47
49
|
export function liveAgentStatusRow(row) {
|
|
48
50
|
if (!row || typeof row !== 'object') return row;
|
|
51
|
+
// The agent's own todo progress, from its live session only (an evicted
|
|
52
|
+
// idle worker is not re-read on every pulse).
|
|
53
|
+
const live = row.sessionId ? _liveSessions.get(row.sessionId) : null;
|
|
54
|
+
const todo = live ? todoProgress(live) : null;
|
|
55
|
+
if (todo) row = { ...row, todo };
|
|
49
56
|
const {
|
|
50
57
|
silent_for: _silentFor,
|
|
51
58
|
staleSeconds: _staleSeconds,
|
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isAgentProgressWatchdogAbortError,
|
|
3
|
+
noteStoppedShellJobsOnError,
|
|
3
4
|
resolveAgentWatchdogPolicy,
|
|
4
5
|
resolveHandoffMessageStartIndex,
|
|
5
6
|
turnPartialHandoff,
|
|
6
7
|
watchdogPartialHandoffFromError,
|
|
7
8
|
watchdogStoppedHandoff,
|
|
8
9
|
} from '../../../runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs';
|
|
9
|
-
import {
|
|
10
|
+
import { reconcileAgentSession } from '../../../runtime/agent/orchestrator/agent-runtime/session-builder.mjs';
|
|
11
|
+
import {
|
|
12
|
+
agentPresetName,
|
|
13
|
+
clean,
|
|
14
|
+
normalizeAgentName,
|
|
15
|
+
presetKey,
|
|
16
|
+
readAgentFrontmatterPermission,
|
|
17
|
+
resolvePrompt,
|
|
18
|
+
} from './helpers.mjs';
|
|
19
|
+
import { normalizeAgentPermission } from '../../../runtime/shared/markdown-frontmatter.mjs';
|
|
20
|
+
import { resolveAgentSessionPermission } from '../../../runtime/agent/orchestrator/internal-agents.mjs';
|
|
21
|
+
import { resolveAgentSpawnPreset } from './spawn-preset.mjs';
|
|
22
|
+
import { flushPendingSessionConfigWrites } from '../../config-lifecycle/config-writers.mjs';
|
|
23
|
+
import { AGENT_ROUTE_KEYS } from '../../agent-profile-changes.mjs';
|
|
10
24
|
import { abnormalEmptyFinishError, renderResult } from './render.mjs';
|
|
11
25
|
import {
|
|
12
26
|
reconcileJobCancelled,
|
|
@@ -20,15 +34,39 @@ import { handoffContent } from '../../handoff-attachments.mjs';
|
|
|
20
34
|
import { rebindDelegation } from '../../../runtime/agent/orchestrator/session/human-gate/delegation.mjs';
|
|
21
35
|
import { settledWorkerStatus } from './worker-index/row-liveness.mjs';
|
|
22
36
|
import { whileTurnDispatched } from '../../../runtime/agent/orchestrator/session/manager/runtime-state.mjs';
|
|
37
|
+
import { takeStoppedShellJobs } from '../../../runtime/agent/orchestrator/session/manager/turn-reap.mjs';
|
|
38
|
+
import { turnReportText } from '../../../runtime/agent/orchestrator/session/loop/turn-report.mjs';
|
|
23
39
|
|
|
24
40
|
function workerResultIdentity({ session, tag, sessionId }) {
|
|
25
41
|
return { tag, sessionId, agent: session.agent || null, provider: session.provider, model: session.model };
|
|
26
42
|
}
|
|
27
43
|
|
|
44
|
+
/** A reused worker runs with the permission its agent's definition grants
|
|
45
|
+
* now, resolved as a spawn resolves it (spawn-plan.mjs). */
|
|
46
|
+
export function followAgentPermission(session, { dataDir, sourceRoot }) {
|
|
47
|
+
const agent = normalizeAgentName(session?.agent);
|
|
48
|
+
if (!agent || !dataDir) return;
|
|
49
|
+
const defined = normalizeAgentPermission(readAgentFrontmatterPermission(agent, dataDir, sourceRoot));
|
|
50
|
+
const permission = resolveAgentSessionPermission(agent, defined || null);
|
|
51
|
+
if (permission) session.permission = permission;
|
|
52
|
+
else delete session.permission;
|
|
53
|
+
}
|
|
54
|
+
|
|
28
55
|
// `send` to an existing worker: resolve the live session, run one follow-up
|
|
29
56
|
// turn under the progress watchdog, and reconcile the job/worker row. Busy
|
|
30
57
|
// sessions queue the prompt instead.
|
|
31
|
-
export function createSendFlow({
|
|
58
|
+
export function createSendFlow({
|
|
59
|
+
mgr,
|
|
60
|
+
cfgMod = null,
|
|
61
|
+
dataDir = null,
|
|
62
|
+
STANDALONE_SOURCE_ROOT = null,
|
|
63
|
+
defaultCwd,
|
|
64
|
+
sessionSurface,
|
|
65
|
+
canUseSessionSurface,
|
|
66
|
+
registry,
|
|
67
|
+
views,
|
|
68
|
+
spawnFlow,
|
|
69
|
+
}) {
|
|
32
70
|
async function prepareSend(args, context = {}) {
|
|
33
71
|
registry.refreshTagsFromSessions({ scanSessions: registry.wantsSessionScan(args), context });
|
|
34
72
|
const target = clean(args.tag || args.sessionId);
|
|
@@ -49,7 +87,7 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
|
|
|
49
87
|
const abnormalError = abnormalEmptyFinishError(result, session.agent || sendAgent);
|
|
50
88
|
return {
|
|
51
89
|
...workerResultIdentity({ session, tag, sessionId }),
|
|
52
|
-
content: result
|
|
90
|
+
content: turnReportText(result),
|
|
53
91
|
...(sessionSurface?.canonical === true ? { handoffOnly: true } : {}),
|
|
54
92
|
...(abnormalError ? { error: abnormalError } : {}),
|
|
55
93
|
};
|
|
@@ -80,6 +118,13 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
|
|
|
80
118
|
if (canUseSessionSurface(session)) {
|
|
81
119
|
return sessionSurface.runTurn({ session, prompt, context: args.context || null, cwd, ...turnHooks });
|
|
82
120
|
}
|
|
121
|
+
// An in-process session has no turn start of its own to reconcile it
|
|
122
|
+
// (a canonical child's runtime does, reconcileTurnSettings): bring its
|
|
123
|
+
// settings-gated tools, connectors, compaction, prompt settings and its
|
|
124
|
+
// agent's permission (as its definition stands: a narrowed one applies)
|
|
125
|
+
// to the settings now.
|
|
126
|
+
reconcileAgentSession(session);
|
|
127
|
+
followAgentPermission(session, { dataDir, sourceRoot: STANDALONE_SOURCE_ROOT });
|
|
83
128
|
return mgr.askSession(sessionId, prompt, args.context || null, null, cwd, null, turnHooks);
|
|
84
129
|
});
|
|
85
130
|
}
|
|
@@ -92,7 +137,12 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
|
|
|
92
137
|
// the watchdog sweep re-stamps turnStartedAt at each turn boundary.
|
|
93
138
|
const watchdogPolicy = resolveAgentWatchdogPolicy(
|
|
94
139
|
sendAgent,
|
|
95
|
-
spawnFlow.agentWatchdogOverrides({
|
|
140
|
+
spawnFlow.agentWatchdogOverrides({
|
|
141
|
+
agent: sendAgent,
|
|
142
|
+
provider: session.provider,
|
|
143
|
+
model: session.model,
|
|
144
|
+
...(session.modelParameters ? { modelParameters: session.modelParameters } : {}),
|
|
145
|
+
})
|
|
96
146
|
);
|
|
97
147
|
const watchdog = spawnFlow.startProgressIdleWatchdog(sessionId, watchdogPolicy, sendAgent, {
|
|
98
148
|
onTurnStart: spawnFlow.turnStartStamper(session, tag),
|
|
@@ -122,7 +172,7 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
|
|
|
122
172
|
handoffMsgStart = resolveHandoffMessageStartIndex(mgr.getSession(sessionId));
|
|
123
173
|
const turnHooks = buildTurnHooks({ sessionId, notifyContext, job, turnReview, completionValue });
|
|
124
174
|
const result = await runTurn(prepared, turnHooks);
|
|
125
|
-
//
|
|
175
|
+
// The early preview does not suppress the canonical body notification;
|
|
126
176
|
// notifyTaskCompletion fires once with output via resolve/reconcile.
|
|
127
177
|
const finalValue = completionValue(result);
|
|
128
178
|
if (job?.status === 'cancelled') {
|
|
@@ -146,7 +196,7 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
|
|
|
146
196
|
finalStatus = 'idle';
|
|
147
197
|
const value = {
|
|
148
198
|
...workerResultIdentity({ session, tag, sessionId }),
|
|
149
|
-
content: watchdogStoppedHandoff(error, partial),
|
|
199
|
+
content: watchdogStoppedHandoff(error, partial, await takeStoppedShellJobs(sessionId)),
|
|
150
200
|
stallAbort: true,
|
|
151
201
|
};
|
|
152
202
|
if (job) job._terminalResultValue = value;
|
|
@@ -154,7 +204,8 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
|
|
|
154
204
|
return value;
|
|
155
205
|
}
|
|
156
206
|
finalStatus = 'error';
|
|
157
|
-
|
|
207
|
+
noteStoppedShellJobsOnError(error, await takeStoppedShellJobs(sessionId));
|
|
208
|
+
reconcileJobStreamStalled(job, error, workerResultIdentity({ session, tag, sessionId }));
|
|
158
209
|
throw error;
|
|
159
210
|
} finally {
|
|
160
211
|
turnReview.complete();
|
|
@@ -196,8 +247,69 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
|
|
|
196
247
|
// `send` branch AND by the `spawn` branch when an explicit tag maps to a
|
|
197
248
|
// live session (reuse path). Busy sessions queue the prompt; idle ones run a
|
|
198
249
|
// background send job that continues the existing session (context kept).
|
|
250
|
+
// A worker that runs on its agent's configured route follows that route, as
|
|
251
|
+
// a bot's home chat does (agent-route-follow.mjs): a model picked for the
|
|
252
|
+
// agent since the spawn applies from this send. A worker started on an
|
|
253
|
+
// explicit model or preset keeps it.
|
|
254
|
+
async function agentRouteToFollow({ session }) {
|
|
255
|
+
const agent = normalizeAgentName(session?.agent);
|
|
256
|
+
if (!agent || !cfgMod?.loadConfig) return null;
|
|
257
|
+
await flushPendingSessionConfigWrites();
|
|
258
|
+
let current;
|
|
259
|
+
try {
|
|
260
|
+
current = resolveAgentSpawnPreset(cfgMod.loadConfig(), { agent });
|
|
261
|
+
} catch {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
const spawnedOn = clean(session.presetName || session.preset);
|
|
265
|
+
const own = new Set([`agent-${agent}`, agentPresetName(agent), presetKey(current.preset), current.presetName]);
|
|
266
|
+
if (!spawnedOn || !own.has(spawnedOn)) return null;
|
|
267
|
+
const preset = current.preset;
|
|
268
|
+
if (!preset.provider || !preset.model) return null;
|
|
269
|
+
// Every route key the agent's route sets (an effort or Fast change alone
|
|
270
|
+
// included); a key it leaves unset is the route default either way.
|
|
271
|
+
const value = (key, source) => {
|
|
272
|
+
if (key === 'fast') return source?.fast === true;
|
|
273
|
+
if (key === 'autoEffort') return source?.autoEffort !== false;
|
|
274
|
+
return source?.[key] == null ? null : JSON.stringify(source[key]);
|
|
275
|
+
};
|
|
276
|
+
const set = AGENT_ROUTE_KEYS.filter(
|
|
277
|
+
(key) => key === 'fast' || key === 'autoEffort' || (preset[key] !== undefined && preset[key] !== null)
|
|
278
|
+
);
|
|
279
|
+
const matches = (target) => set.every((key) => value(key, preset) === value(key, target));
|
|
280
|
+
// Against the route the session's next turn runs on: one held for it
|
|
281
|
+
// (heldRoute, an in-process worker that was busy), else its own.
|
|
282
|
+
if (matches(session)) {
|
|
283
|
+
// Saved back to the running route: an earlier hold is obsolete.
|
|
284
|
+
if (session.heldRoute) mgr.holdSessionRoute?.(session.id, null);
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
if (session.heldRoute && matches({ ...session, ...session.heldRoute })) return null;
|
|
288
|
+
const route = {};
|
|
289
|
+
for (const key of set) {
|
|
290
|
+
if (key === 'fast') route.fast = preset.fast === true;
|
|
291
|
+
else if (key === 'autoEffort') {
|
|
292
|
+
if (preset.autoEffort === false) route.autoEffort = false;
|
|
293
|
+
} else route[key] = preset[key];
|
|
294
|
+
}
|
|
295
|
+
return route;
|
|
296
|
+
}
|
|
297
|
+
|
|
199
298
|
async function dispatchToExistingSession(requested, notifyContext, extras = {}) {
|
|
200
|
-
|
|
299
|
+
let followed = requested.route ? null : await agentRouteToFollow(requested);
|
|
300
|
+
if (followed && !canUseSessionSurface(requested.session)) {
|
|
301
|
+
// An in-process session takes the followed route in place, between
|
|
302
|
+
// turns; a running one finishes on the route it started on and holds
|
|
303
|
+
// the new one for its next turn, which runs the queued work.
|
|
304
|
+
if (!views.isSessionBusy(requested.sessionId)) {
|
|
305
|
+
const { session } = requested;
|
|
306
|
+
const crossProvider = followed.provider !== session.provider || followed.model !== session.model;
|
|
307
|
+
mgr.updateSessionRoute?.(requested.sessionId, followed, { session, crossProvider });
|
|
308
|
+
} else mgr.holdSessionRoute?.(requested.sessionId, followed);
|
|
309
|
+
followed = null;
|
|
310
|
+
}
|
|
311
|
+
const routed = followed ? { ...requested, route: followed } : requested;
|
|
312
|
+
const prepared = routed.route ? await applyRequestedRoute(routed) : routed;
|
|
201
313
|
const { session, sessionId, prompt } = prepared;
|
|
202
314
|
const tag = registry.tagForSession(sessionId);
|
|
203
315
|
if (canUseSessionSurface(session) && views.isSessionBusy(sessionId)) {
|
|
@@ -10,6 +10,7 @@ import { clean, terminalPidForContext } from '../helpers.mjs';
|
|
|
10
10
|
import { renderResult } from '../render.mjs';
|
|
11
11
|
import { closeManagedSession } from '../../../lifecycle/shared.mjs';
|
|
12
12
|
import { hopOf } from '../../../../runtime/shared/bot-hops.mjs';
|
|
13
|
+
import { notDoneReport } from '../../../../runtime/agent/orchestrator/runtime-core/todo-list.mjs';
|
|
13
14
|
|
|
14
15
|
/** The completion callback that hands a worker's result back to its caller session; null without a handoff. */
|
|
15
16
|
function handoffNotifier(handoffSessionId, notifySessionCompletion) {
|
|
@@ -86,6 +87,17 @@ export function createJobStarter({ mgr, notifyStatusChange, notifySessionComplet
|
|
|
86
87
|
}
|
|
87
88
|
},
|
|
88
89
|
});
|
|
90
|
+
// Success, failure or cancellation: the report names what the agent's own
|
|
91
|
+
// todo list leaves undone. The Lead never receives the list otherwise.
|
|
92
|
+
task.reportAppendix = () => {
|
|
93
|
+
const sessionId = task.meta?.sessionId || jobMeta?.sessionId;
|
|
94
|
+
if (!sessionId) return '';
|
|
95
|
+
try {
|
|
96
|
+
return notDoneReport(mgr.getSession(sessionId));
|
|
97
|
+
} catch {
|
|
98
|
+
return '';
|
|
99
|
+
}
|
|
100
|
+
};
|
|
89
101
|
// The model's tool call that started this job owns it (its result message
|
|
90
102
|
// carries the id: agent-task-starts.mjs).
|
|
91
103
|
recordAgentTaskStart(notifyContext?.toolCallId, task.taskId);
|
|
@@ -22,6 +22,7 @@ import { workspaceCwdLock } from '../../../workspace/admission-gate.mjs';
|
|
|
22
22
|
import { isContactAgentId } from '../../../../runtime/agent/orchestrator/runtime-core/workflow-ids.mjs';
|
|
23
23
|
import { assertBotChainTarget } from '../../../../runtime/shared/bot-hops.mjs';
|
|
24
24
|
import { actingAgentOf, delegationChainOf } from '../../../bot-chain.mjs';
|
|
25
|
+
import { flushPendingSessionConfigWrites } from '../../../config-lifecycle/config-writers.mjs';
|
|
25
26
|
|
|
26
27
|
export function createSpawnPlanner({
|
|
27
28
|
mgr = null,
|
|
@@ -36,6 +37,10 @@ export function createSpawnPlanner({
|
|
|
36
37
|
}) {
|
|
37
38
|
/** Shared spawn-prep validations (agent/preset/tag/cwd/prompt). */
|
|
38
39
|
async function resolveSpawnPlan(args, callerCwd, context, prepState) {
|
|
40
|
+
// A setting a runtime of this process adopted (an agent's model picked a
|
|
41
|
+
// moment ago) is written behind a debounce: drain it so the read below
|
|
42
|
+
// sees what the runtimes hold in memory.
|
|
43
|
+
await flushPendingSessionConfigWrites();
|
|
39
44
|
const config = cfgMod.loadConfig();
|
|
40
45
|
const agent = normalizeAgentName(args.agent);
|
|
41
46
|
if (!agent) throw new Error('agent spawn: agent is required');
|
|
@@ -77,8 +77,8 @@ export function createSpawnPreparer({
|
|
|
77
77
|
* first-response deadline and the provider's first-response budget for the
|
|
78
78
|
* routed model (headers, and first output), handed to
|
|
79
79
|
* resolveAgentWatchdogPolicy. A provider on the shared window names none. */
|
|
80
|
-
function agentWatchdogOverrides({ agent, provider, model }) {
|
|
81
|
-
const budget = getProvider(provider)?.firstResponseBudget?.(model);
|
|
80
|
+
function agentWatchdogOverrides({ agent, provider, model, modelParameters }) {
|
|
81
|
+
const budget = getProvider(provider)?.firstResponseBudget?.(model, { modelParameters });
|
|
82
82
|
return {
|
|
83
83
|
firstResponseTimeoutMs: readAgentFirstResponseTimeoutMs(agent, dataDir, STANDALONE_SOURCE_ROOT) ?? undefined,
|
|
84
84
|
providerFirstByteTimeoutMs: budget?.transportMs,
|
|
@@ -145,7 +145,12 @@ export function createSpawnPreparer({
|
|
|
145
145
|
prompt: plan.prompt,
|
|
146
146
|
watchdogPolicy: resolveAgentWatchdogPolicy(
|
|
147
147
|
plan.agent,
|
|
148
|
-
agentWatchdogOverrides({
|
|
148
|
+
agentWatchdogOverrides({
|
|
149
|
+
agent: plan.agent,
|
|
150
|
+
provider: plan.preset.provider,
|
|
151
|
+
model: plan.preset.model,
|
|
152
|
+
modelParameters: plan.preset.modelParameters,
|
|
153
|
+
})
|
|
149
154
|
),
|
|
150
155
|
};
|
|
151
156
|
}
|
|
@@ -16,6 +16,7 @@ import { abnormalEmptyFinishError } from '../render.mjs';
|
|
|
16
16
|
import { createProgressWatchdogRegistry } from '../../agent-watchdog-registry.mjs';
|
|
17
17
|
import {
|
|
18
18
|
isAgentProgressWatchdogAbortError,
|
|
19
|
+
noteStoppedShellJobsOnError,
|
|
19
20
|
resolveHandoffMessageStartIndex,
|
|
20
21
|
turnPartialHandoff,
|
|
21
22
|
watchdogPartialHandoffFromError,
|
|
@@ -27,6 +28,8 @@ import { presetDescriptor } from './spawn-prep.mjs';
|
|
|
27
28
|
import { workerStageForStatus } from '../worker-rows.mjs';
|
|
28
29
|
import { handoffContent } from '../../../handoff-attachments.mjs';
|
|
29
30
|
import { whileTurnDispatched } from '../../../../runtime/agent/orchestrator/session/manager/runtime-state.mjs';
|
|
31
|
+
import { takeStoppedShellJobs } from '../../../../runtime/agent/orchestrator/session/manager/turn-reap.mjs';
|
|
32
|
+
import { turnReportText } from '../../../../runtime/agent/orchestrator/session/loop/turn-report.mjs';
|
|
30
33
|
|
|
31
34
|
// Mid-turn worker persistence cadence. The watchdog sweep runs every second;
|
|
32
35
|
// a transcript save is far more expensive than a bookkeeping stamp, so the
|
|
@@ -112,7 +115,7 @@ export function createSpawnRunner({
|
|
|
112
115
|
tag,
|
|
113
116
|
sessionId: session.id,
|
|
114
117
|
...presetDescriptor(agent, preset, presetName),
|
|
115
|
-
content: result
|
|
118
|
+
content: turnReportText(result),
|
|
116
119
|
...(sessionSurface?.canonical === true ? { handoffOnly: true } : {}),
|
|
117
120
|
...(abnormalError ? { error: abnormalError } : {}),
|
|
118
121
|
};
|
|
@@ -122,11 +125,24 @@ export function createSpawnRunner({
|
|
|
122
125
|
const { args, session, workerCwd } = prepared;
|
|
123
126
|
// The caller's forwarded files ride along as attachment parts.
|
|
124
127
|
const prompt = handoffContent(prepared.prompt, args.attachmentParts);
|
|
128
|
+
// Host-set only (a routine executor, routine-executor.mjs): the trusted
|
|
129
|
+
// text skills are selected from, so nothing else in the prompt selects one.
|
|
130
|
+
const selection = typeof args.skillSelection === 'string' ? { skillSelection: args.skillSelection } : {};
|
|
125
131
|
return whileTurnDispatched(session.id, () => {
|
|
126
132
|
if (typeof sessionSurface?.runTurn === 'function' && sessionSurface.canRun?.(session) !== false) {
|
|
127
|
-
return sessionSurface.runTurn({
|
|
133
|
+
return sessionSurface.runTurn({
|
|
134
|
+
session,
|
|
135
|
+
prompt,
|
|
136
|
+
context: args.context || null,
|
|
137
|
+
cwd: workerCwd,
|
|
138
|
+
...selection,
|
|
139
|
+
...turnHooks,
|
|
140
|
+
});
|
|
128
141
|
}
|
|
129
|
-
return mgr.askSession(session.id, prompt, args.context || null, null, workerCwd, null,
|
|
142
|
+
return mgr.askSession(session.id, prompt, args.context || null, null, workerCwd, null, {
|
|
143
|
+
...turnHooks,
|
|
144
|
+
...selection,
|
|
145
|
+
});
|
|
130
146
|
});
|
|
131
147
|
}
|
|
132
148
|
|
|
@@ -178,8 +194,8 @@ export function createSpawnRunner({
|
|
|
178
194
|
: {}),
|
|
179
195
|
};
|
|
180
196
|
const result = await runTurn(prepared, turnHooks);
|
|
181
|
-
// The early preview
|
|
182
|
-
// notifyTaskCompletion
|
|
197
|
+
// The early preview does not promise body suppression, so the canonical
|
|
198
|
+
// notifyTaskCompletion fires exactly once with output via the
|
|
183
199
|
// resolve/reconcile/finally path.
|
|
184
200
|
const finalValue = completionValue(result);
|
|
185
201
|
if (job?.status === 'cancelled') {
|
|
@@ -209,7 +225,7 @@ export function createSpawnRunner({
|
|
|
209
225
|
tag,
|
|
210
226
|
sessionId: session.id,
|
|
211
227
|
...presetDescriptor(agent, preset, presetName),
|
|
212
|
-
content: watchdogStoppedHandoff(error, partial),
|
|
228
|
+
content: watchdogStoppedHandoff(error, partial, await takeStoppedShellJobs(session.id)),
|
|
213
229
|
stallAbort: true,
|
|
214
230
|
};
|
|
215
231
|
if (job) job._terminalResultValue = value;
|
|
@@ -217,7 +233,12 @@ export function createSpawnRunner({
|
|
|
217
233
|
return value;
|
|
218
234
|
}
|
|
219
235
|
finalStatus = 'error';
|
|
220
|
-
|
|
236
|
+
noteStoppedShellJobsOnError(error, await takeStoppedShellJobs(session.id));
|
|
237
|
+
reconcileJobStreamStalled(job, error, {
|
|
238
|
+
tag,
|
|
239
|
+
sessionId: session.id,
|
|
240
|
+
...presetDescriptor(agent, preset, presetName),
|
|
241
|
+
});
|
|
221
242
|
throw error;
|
|
222
243
|
} finally {
|
|
223
244
|
turnReview.complete();
|
|
@@ -2,7 +2,15 @@ import { dirname, resolve } from 'node:path';
|
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
import { ensureProcessListenerHeadroom } from '../../runtime/shared/process-listener-headroom.mjs';
|
|
4
4
|
import { AGENT_TOOL } from './agent-tool/tool-def.mjs';
|
|
5
|
-
import {
|
|
5
|
+
import { cancelBackgroundTask } from '../../runtime/shared/background-tasks.mjs';
|
|
6
|
+
import { closeManagedSession } from '../lifecycle/shared.mjs';
|
|
7
|
+
import {
|
|
8
|
+
agentScope,
|
|
9
|
+
clean,
|
|
10
|
+
envTimeoutMs,
|
|
11
|
+
callerSessionForContext,
|
|
12
|
+
terminalPidForContext,
|
|
13
|
+
} from './agent-tool/helpers.mjs';
|
|
6
14
|
import { createTagRegistry } from './agent-tool/tag-registry.mjs';
|
|
7
15
|
import { createJobViews } from './agent-tool/job-views.mjs';
|
|
8
16
|
import { liveAgentStatusRow } from './agent-tool/job-views/session-progress.mjs';
|
|
@@ -106,6 +114,9 @@ export function createStandaloneAgent({
|
|
|
106
114
|
});
|
|
107
115
|
const sendFlow = createSendFlow({
|
|
108
116
|
mgr,
|
|
117
|
+
cfgMod,
|
|
118
|
+
dataDir,
|
|
119
|
+
STANDALONE_SOURCE_ROOT,
|
|
109
120
|
defaultCwd,
|
|
110
121
|
sessionSurface,
|
|
111
122
|
canUseSessionSurface,
|
|
@@ -129,6 +140,44 @@ export function createStandaloneAgent({
|
|
|
129
140
|
listProviderModels,
|
|
130
141
|
});
|
|
131
142
|
|
|
143
|
+
/**
|
|
144
|
+
* Run one workflow agent (`args.agent`, `args.prompt`, optional `cwd` and
|
|
145
|
+
* `attachmentParts`) to completion and resolve `{ sessionId, content }` —
|
|
146
|
+
* for a caller that has no session to hand the result to (a routine's
|
|
147
|
+
* executor, routine-executor.mjs). `context.callerSessionId` is the id the
|
|
148
|
+
* agent is created under: its run stamp and unattended policy come from it.
|
|
149
|
+
* Rejects when the agent fails or is cancelled, or `signal` aborts (which
|
|
150
|
+
* cancels it). The agent's session is closed afterwards.
|
|
151
|
+
*/
|
|
152
|
+
async function runToCompletion(args = {}, context = {}, { signal = null } = {}) {
|
|
153
|
+
await awaitKeychainPrewarm();
|
|
154
|
+
const abortError = () =>
|
|
155
|
+
signal?.reason instanceof Error ? signal.reason : new Error(String(signal?.reason || 'agent run aborted'));
|
|
156
|
+
if (signal?.aborted) throw abortError();
|
|
157
|
+
const job = spawnFlow.startDeferredSpawnJob({ ...args, type: 'spawn' }, clean(context.callerCwd), context, context);
|
|
158
|
+
const onAbort = () => cancelBackgroundTask(job.taskId, 'agent run aborted', { notify: false });
|
|
159
|
+
signal?.addEventListener?.('abort', onAbort, { once: true });
|
|
160
|
+
let value = null;
|
|
161
|
+
try {
|
|
162
|
+
value = await job.promise;
|
|
163
|
+
} finally {
|
|
164
|
+
signal?.removeEventListener?.('abort', onAbort);
|
|
165
|
+
}
|
|
166
|
+
const sessionId = clean(job.meta?.sessionId) || clean(value?.sessionId);
|
|
167
|
+
if (sessionId) {
|
|
168
|
+
try {
|
|
169
|
+
await closeManagedSession(mgr, sessionId, 'routine-executor-finished');
|
|
170
|
+
} catch {
|
|
171
|
+
/* the run's result stands; a close that fails is swept with idle agents */
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (signal?.aborted) throw abortError();
|
|
175
|
+
if (job.status === 'cancelled') throw new Error('the agent run was cancelled');
|
|
176
|
+
if (job.status !== 'completed') throw new Error(job.error || 'the agent run failed');
|
|
177
|
+
const result = value ?? job.result;
|
|
178
|
+
return { sessionId: sessionId || null, content: String(result?.content ?? '') };
|
|
179
|
+
}
|
|
180
|
+
|
|
132
181
|
function getStatus(context = {}) {
|
|
133
182
|
if (!isKeychainPrewarmReady()) {
|
|
134
183
|
void awaitKeychainPrewarm();
|
|
@@ -162,6 +211,7 @@ export function createStandaloneAgent({
|
|
|
162
211
|
return {
|
|
163
212
|
tools: [AGENT_TOOL],
|
|
164
213
|
execute,
|
|
214
|
+
runToCompletion,
|
|
165
215
|
onStatusChange: (listener) => {
|
|
166
216
|
if (typeof listener !== 'function') return () => {};
|
|
167
217
|
statusListeners.add(listener);
|