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
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// Deferred-tool catalog: measured-usage ordering, kind/bucket classification,
|
|
2
2
|
// tool_search ranking + auto-selection, and the session tool-surface
|
|
3
3
|
// application/selection logic. Pure module (session objects passed in).
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
4
5
|
import { clean } from './session-text.mjs';
|
|
5
|
-
import { mergePendingDeferredToolDelta } from './deferred-tool-delta.mjs';
|
|
6
|
+
import { dropPendingDeferredToolAdds, mergePendingDeferredToolDelta } from './deferred-tool-delta.mjs';
|
|
7
|
+
import { isAgentOwner } from '../agent-owner.mjs';
|
|
6
8
|
import { applyInitialDeferredToolManifestToBp2 } from '../context/collect.mjs';
|
|
7
9
|
import {
|
|
8
10
|
listedDeferredToolNames,
|
|
@@ -12,7 +14,11 @@ import {
|
|
|
12
14
|
import { parseMcpToolName } from '../../../shared/tool-primitives.mjs';
|
|
13
15
|
import { getMcpServerInstructionsMap, getMcpTools, getMcpToolGeneration } from '../mcp/client.mjs';
|
|
14
16
|
import { filterMcpToolsForSession } from './extension-scopes.mjs';
|
|
15
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
isDeferredToolAvailable,
|
|
19
|
+
isToolPermittedBySessionPolicy,
|
|
20
|
+
sessionFeatureDenies,
|
|
21
|
+
} from './deferred-tool-availability.mjs';
|
|
16
22
|
import { routeToolExclusionReason } from '../session/loop/provider-tool-exclusions.mjs';
|
|
17
23
|
import { isResponsesFreeformTool, toResponsesCustomTool } from '../providers/custom-tool-wire.mjs';
|
|
18
24
|
import {
|
|
@@ -46,21 +52,8 @@ import {
|
|
|
46
52
|
toolExposureModeForProvider,
|
|
47
53
|
} from './tool-exposure.mjs';
|
|
48
54
|
import { TOOL_BRIDGE_TOOLS } from './tool-defs.mjs';
|
|
49
|
-
export {
|
|
50
|
-
toolKind,
|
|
51
|
-
toolSchemaBucket,
|
|
52
|
-
estimateToolSchemaBreakdown,
|
|
53
|
-
measuredToolUsage,
|
|
54
|
-
parseToolSelection,
|
|
55
|
-
sortedCatalogByMeasuredUsage,
|
|
56
|
-
} from './tool-catalog-schema.mjs';
|
|
55
|
+
export { estimateToolSchemaBreakdown } from './tool-catalog-schema.mjs';
|
|
57
56
|
export { snapshotProviderRequestTools } from './provider-request-snapshot.mjs';
|
|
58
|
-
export {
|
|
59
|
-
DEFERRED_DEFAULT_FULL_TOOLS,
|
|
60
|
-
DEFERRED_DEFAULT_LEAD_TOOLS,
|
|
61
|
-
DEFERRED_DEFAULT_READONLY_TOOLS,
|
|
62
|
-
MEASURED_TOOL_USAGE,
|
|
63
|
-
} from './tool-catalog-data.mjs';
|
|
64
57
|
|
|
65
58
|
// Provider modes without native tool search. Their bridge-v1 sessions
|
|
66
59
|
// (tool-exposure.mjs) get the native roster and late delta notices; only a
|
|
@@ -548,24 +541,30 @@ export function rebuildDeferredToolSurfaceForProvider(session, provider) {
|
|
|
548
541
|
// <available-deferred-tools> manifest IN PLACE and pre-mark names announced;
|
|
549
542
|
// bridge-v1 sessions do the same (roster + bridge guidance). Only a fixed
|
|
550
543
|
// surface not yet on the bridge updates its scoped catalog alone. Fully sync
|
|
551
|
-
// and idempotent: no
|
|
544
|
+
// and idempotent: no MCP name added or gone => no-op / no mutation.
|
|
552
545
|
export function refreshInitialDeferredMcpSurface(session, liveMcpTools) {
|
|
553
546
|
if (!session || !Array.isArray(session.messages)) return false;
|
|
554
547
|
if (session.deferredProviderMode === 'full') return false;
|
|
555
548
|
const live = filterDisallowedTools(Array.isArray(liveMcpTools) ? liveMcpTools : [], session.disallowedTools);
|
|
549
|
+
const liveNames = new Set(live.map((tool) => clean(tool?.name)).filter(isMcpToolName));
|
|
556
550
|
const byName = new Map();
|
|
551
|
+
// Nothing was sent yet: a server gone since create leaves the initial surface.
|
|
552
|
+
let changed = false;
|
|
557
553
|
for (const tool of Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : []) {
|
|
558
554
|
const name = clean(tool?.name);
|
|
555
|
+
if (isMcpToolName(name) && !liveNames.has(name)) {
|
|
556
|
+
changed = true;
|
|
557
|
+
continue;
|
|
558
|
+
}
|
|
559
559
|
if (name && !byName.has(name)) byName.set(name, tool);
|
|
560
560
|
}
|
|
561
|
-
let added = false;
|
|
562
561
|
for (const tool of live) {
|
|
563
562
|
const name = clean(tool?.name);
|
|
564
563
|
if (!name || !isMcpToolName(name) || byName.has(name)) continue;
|
|
565
564
|
byName.set(name, activeToolForSurface(tool));
|
|
566
|
-
|
|
565
|
+
changed = true;
|
|
567
566
|
}
|
|
568
|
-
if (!
|
|
567
|
+
if (!changed) return false;
|
|
569
568
|
session.deferredToolCatalog = sortedCatalogByMeasuredUsage([...byName.values()]);
|
|
570
569
|
if (fixedSurfaceSession(session)) {
|
|
571
570
|
session.updatedAt = Date.now();
|
|
@@ -720,10 +719,12 @@ function reconcileDeferredMcpToolCatalogUncached(session, liveMcpTools) {
|
|
|
720
719
|
// connected OR the tool is already loaded, including native history-only
|
|
721
720
|
// discoveries. Availability is determined by deferredMcpToolNames, not this pool.
|
|
722
721
|
const nextByName = new Map();
|
|
722
|
+
// A built-in a settings gate opened (tool-availability.mjs) is no MCP tool:
|
|
723
|
+
// its availability is the session's deny set, so it stays.
|
|
723
724
|
for (const tool of lateCatalog) {
|
|
724
725
|
const name = clean(tool?.name);
|
|
725
726
|
if (!name || nextByName.has(name)) continue;
|
|
726
|
-
if (!liveMcpByName.has(name) && !active.has(name)) continue;
|
|
727
|
+
if (isMcpToolName(name) && !liveMcpByName.has(name) && !active.has(name)) continue;
|
|
727
728
|
nextByName.set(name, tool);
|
|
728
729
|
}
|
|
729
730
|
for (const [name, tool] of liveMcpByName) nextByName.set(name, tool);
|
|
@@ -773,28 +774,84 @@ function reconcileDeferredMcpToolCatalogUncached(session, liveMcpTools) {
|
|
|
773
774
|
* connected tool the boot manifest never listed and the session has not loaded
|
|
774
775
|
* or discovered rides the next real prompt as one more delta, acknowledged
|
|
775
776
|
* only once the provider accepts that turn.
|
|
777
|
+
* Only a session whose prompt is never rebuilt at a cold point (a delegated
|
|
778
|
+
* worker, or a prompt without a recorded identity) is re-armed, by name; any
|
|
779
|
+
* other session folds its late tools into the rebuilt manifest instead
|
|
780
|
+
* (foldLateDeferredTools).
|
|
776
781
|
* Returns the re-armed names, or null when there are none.
|
|
777
782
|
*/
|
|
778
783
|
export function rearmLateDeferredTools(session) {
|
|
779
784
|
// The compaction also drops the load results that carried a server's
|
|
780
|
-
// instruction text
|
|
781
|
-
|
|
785
|
+
// instruction text (the account and configuration guidance, which no prompt
|
|
786
|
+
// manifest carries), so the next load of its tools delivers it again. It
|
|
787
|
+
// rides a tool result, never the cached prefix, and ordinary turns still
|
|
788
|
+
// send it once.
|
|
789
|
+
if (session) {
|
|
790
|
+
delete session.mcpInstructionsAnnounced;
|
|
791
|
+
delete session.mcpInstructionHashes;
|
|
792
|
+
}
|
|
782
793
|
if (!session || !Array.isArray(session.tools) || fixedSurfaceSession(session)) return null;
|
|
783
|
-
if (
|
|
794
|
+
if (session.promptIdentity && !isAgentOwner(session)) return null;
|
|
795
|
+
if (!Array.isArray(session.deferredAnnouncedTools)) return null;
|
|
784
796
|
// Listed in the boot manifest, or already loaded/discovered: still visible.
|
|
785
797
|
const listed = new Set([...session.deferredAnnouncedTools, ...persistentToolSurfaceNames(session)]);
|
|
786
|
-
const connected = new Set(session.deferredMcpToolNames);
|
|
798
|
+
const connected = new Set(Array.isArray(session.deferredMcpToolNames) ? session.deferredMcpToolNames : []);
|
|
787
799
|
const added = [];
|
|
788
800
|
for (const tool of Array.isArray(session.deferredLateToolCatalog) ? session.deferredLateToolCatalog : []) {
|
|
789
801
|
const name = clean(tool?.name);
|
|
790
|
-
if (!name ||
|
|
791
|
-
|
|
802
|
+
if (!name || listed.has(name) || !rosterPermits(session, tool)) continue;
|
|
803
|
+
// MCP tools while connected; a built-in a settings gate opened while permitted.
|
|
804
|
+
if (isMcpToolName(name) ? !connected.has(name) : !isToolPermittedBySessionPolicy(session, name)) continue;
|
|
805
|
+
// Names only: the model was told the description before.
|
|
806
|
+
added.push({ name, description: '' });
|
|
792
807
|
}
|
|
793
808
|
if (!added.length) return null;
|
|
794
809
|
mergePendingDeferredToolDelta(session, { added });
|
|
795
810
|
return added.map((entry) => entry.name);
|
|
796
811
|
}
|
|
797
812
|
|
|
813
|
+
/**
|
|
814
|
+
* A cold point (a compaction, a rebuilt prompt): the late tools join the boot
|
|
815
|
+
* catalog and the rebuilt BP2 manifest lists them, so nothing about them rides
|
|
816
|
+
* a notice. Pending
|
|
817
|
+
* announcements the manifest now carries are dropped. Returns the folded names.
|
|
818
|
+
*/
|
|
819
|
+
export function foldLateDeferredTools(session) {
|
|
820
|
+
if (!session || !Array.isArray(session.tools) || fixedSurfaceSession(session)) return [];
|
|
821
|
+
const late = Array.isArray(session.deferredLateToolCatalog) ? session.deferredLateToolCatalog : [];
|
|
822
|
+
const connected = new Set(Array.isArray(session.deferredMcpToolNames) ? session.deferredMcpToolNames : []);
|
|
823
|
+
const byName = new Map();
|
|
824
|
+
for (const tool of Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : []) {
|
|
825
|
+
const name = clean(tool?.name);
|
|
826
|
+
if (name && !byName.has(name)) byName.set(name, tool);
|
|
827
|
+
}
|
|
828
|
+
const folded = [];
|
|
829
|
+
for (const tool of late) {
|
|
830
|
+
const name = clean(tool?.name);
|
|
831
|
+
if (!name || byName.has(name) || !rosterPermits(session, tool)) continue;
|
|
832
|
+
if (isMcpToolName(name) ? !connected.has(name) : !isToolPermittedBySessionPolicy(session, name)) continue;
|
|
833
|
+
byName.set(name, activeToolForSurface(tool));
|
|
834
|
+
folded.push(name);
|
|
835
|
+
}
|
|
836
|
+
session.deferredToolCatalog = sortedCatalogByMeasuredUsage([...byName.values()]);
|
|
837
|
+
// Whatever the boot catalog holds now (folded here, or by the rebuilt surface) leaves the late pool.
|
|
838
|
+
session.deferredLateToolCatalog = late.filter((tool) => !byName.has(clean(tool?.name)));
|
|
839
|
+
session.mcpServerInstructions = getMcpServerInstructionsMap(session.mcpScopeId);
|
|
840
|
+
if (Array.isArray(session.messages) && session.messages.some((m) => m?.role === 'system')) {
|
|
841
|
+
applyInitialDeferredToolManifestToBp2(session, deferredPoolToolNames(session), { rebuild: true });
|
|
842
|
+
session.deferredAnnouncedTools = listedDeferredToolNames(
|
|
843
|
+
session,
|
|
844
|
+
deferredPoolToolNames(session),
|
|
845
|
+
renderedDeferredManifest(session)
|
|
846
|
+
);
|
|
847
|
+
}
|
|
848
|
+
// The manifest lists only short triggers, never a server's instruction text:
|
|
849
|
+
// what a load has told stays as recorded (a compaction clears it).
|
|
850
|
+
const listed = new Set(Array.isArray(session.deferredAnnouncedTools) ? session.deferredAnnouncedTools : []);
|
|
851
|
+
dropPendingDeferredToolAdds(session, listed);
|
|
852
|
+
return folded;
|
|
853
|
+
}
|
|
854
|
+
|
|
798
855
|
export function scopedMcpToolsFor(session, config = null) {
|
|
799
856
|
return filterMcpToolsForSession(getMcpTools(session?.mcpScopeId), session?.cwd || null, config);
|
|
800
857
|
}
|
|
@@ -916,24 +973,41 @@ function resolvableCatalog(session) {
|
|
|
916
973
|
return filterSessionToolPolicy(tools, session);
|
|
917
974
|
}
|
|
918
975
|
|
|
976
|
+
const instructionHash = (text) =>
|
|
977
|
+
createHash('sha256')
|
|
978
|
+
.update(String(text || ''))
|
|
979
|
+
.digest('hex')
|
|
980
|
+
.slice(0, 16);
|
|
981
|
+
|
|
919
982
|
// A server's instruction text rides the first load_tool naming any of its
|
|
920
|
-
// tools (loaded now, already active, or described on the bridge), once
|
|
921
|
-
//
|
|
922
|
-
//
|
|
923
|
-
//
|
|
983
|
+
// tools (loaded now, already active, or described on the bridge), once per
|
|
984
|
+
// text (`mcpInstructionsAnnounced`, `mcpInstructionHashes`: a connector whose
|
|
985
|
+
// accounts changed sends its new text again; a compaction clears the record,
|
|
986
|
+
// rearmLateDeferredTools): `## <server>` + body,
|
|
987
|
+
// sanitized and capped (sanitizeMcpInstructionText, well under 4 KB). No
|
|
988
|
+
// text, nothing sent or recorded.
|
|
924
989
|
function pendingMcpInstructions(session, catalog, names) {
|
|
925
990
|
const map = session?.mcpServerInstructions;
|
|
926
991
|
if (!map || typeof map !== 'object' || !names.length) return [];
|
|
927
992
|
const byName = new Map(catalog.map((tool) => [clean(tool?.name), tool]));
|
|
928
993
|
const announced = new Set(Array.isArray(session.mcpInstructionsAnnounced) ? session.mcpInstructionsAnnounced : []);
|
|
994
|
+
const hashes =
|
|
995
|
+
session.mcpInstructionHashes && typeof session.mcpInstructionHashes === 'object'
|
|
996
|
+
? session.mcpInstructionHashes
|
|
997
|
+
: {};
|
|
998
|
+
const seen = new Set();
|
|
929
999
|
const pending = [];
|
|
930
1000
|
for (const name of names) {
|
|
931
1001
|
const server = parseMcpToolName(byName.get(name) || name)?.server;
|
|
932
|
-
if (!server ||
|
|
1002
|
+
if (!server || seen.has(server) || !mcpServerManifestLabel(server)) continue;
|
|
933
1003
|
const text = sanitizeMcpInstructionText(map[server]);
|
|
934
1004
|
if (!text) continue;
|
|
935
|
-
|
|
936
|
-
|
|
1005
|
+
const hash = instructionHash(text);
|
|
1006
|
+
// Told already, and the text is the one told. A record from before hashes
|
|
1007
|
+
// were kept cannot tell which text it carried: sent once more, and hashed.
|
|
1008
|
+
if (announced.has(server) && hashes[server] === hash) continue;
|
|
1009
|
+
seen.add(server);
|
|
1010
|
+
pending.push({ server, hash, block: `## ${server}\n${text}` });
|
|
937
1011
|
}
|
|
938
1012
|
return pending;
|
|
939
1013
|
}
|
|
@@ -943,6 +1017,10 @@ function announceMcpServers(session, pending) {
|
|
|
943
1017
|
session.mcpInstructionsAnnounced = [
|
|
944
1018
|
...new Set([...(session.mcpInstructionsAnnounced || []), ...pending.map((entry) => entry.server)]),
|
|
945
1019
|
];
|
|
1020
|
+
session.mcpInstructionHashes = {
|
|
1021
|
+
...(session.mcpInstructionHashes || {}),
|
|
1022
|
+
...Object.fromEntries(pending.map((entry) => [entry.server, entry.hash])),
|
|
1023
|
+
};
|
|
946
1024
|
}
|
|
947
1025
|
|
|
948
1026
|
function claimMcpServerInstructions(session, catalog, names) {
|
|
@@ -1016,7 +1094,9 @@ export function renderToolSearch(args = {}, session, mode = 'full', options = {}
|
|
|
1016
1094
|
]);
|
|
1017
1095
|
const loaded = toolSelection.added || [];
|
|
1018
1096
|
const alreadyActive = toolSelection.already || [];
|
|
1019
|
-
|
|
1097
|
+
// A tool a settings gate closed is named as such, not as unknown.
|
|
1098
|
+
const disabledInSettings = (toolSelection.missing || []).filter((name) => sessionFeatureDenies(session, name));
|
|
1099
|
+
const missing = (toolSelection.missing || []).filter((name) => !disabledInSettings.includes(name));
|
|
1020
1100
|
const blocked = toolSelection.blocked || [];
|
|
1021
1101
|
// Native discovery is history-driven: an explicit re-selection must emit
|
|
1022
1102
|
// the tool reference/spec again even when the callable registry already has
|
|
@@ -1040,6 +1120,9 @@ export function renderToolSearch(args = {}, session, mode = 'full', options = {}
|
|
|
1040
1120
|
? { ...nativeToolSearchBase, summary: nativeSummary || nativeToolSearchBase.summary }
|
|
1041
1121
|
: null;
|
|
1042
1122
|
const notes = [];
|
|
1123
|
+
if (disabledInSettings.length) {
|
|
1124
|
+
notes.push(`Disabled in settings: ${disabledInSettings.join(', ')}. Do not retry unless the user turns it on.`);
|
|
1125
|
+
}
|
|
1043
1126
|
if (missing.length && pendingMcpServers.length) {
|
|
1044
1127
|
notes.push('Some requested names may belong to an MCP server still connecting — retry next turn.');
|
|
1045
1128
|
}
|
|
@@ -1059,6 +1142,7 @@ export function renderToolSearch(args = {}, session, mode = 'full', options = {}
|
|
|
1059
1142
|
alreadyActive,
|
|
1060
1143
|
...(alreadyActiveSchemas.length ? { alreadyActiveSchemas } : {}),
|
|
1061
1144
|
missing,
|
|
1145
|
+
...(disabledInSettings.length ? { disabledInSettings } : {}),
|
|
1062
1146
|
...(blocked.length ? { blocked } : {}),
|
|
1063
1147
|
...mcpFields,
|
|
1064
1148
|
activeTools: sortedNamesByMeasuredUsage(
|
|
@@ -101,7 +101,7 @@ export const SESSION_TOOL = {
|
|
|
101
101
|
'suggest',
|
|
102
102
|
],
|
|
103
103
|
description:
|
|
104
|
-
'status defaults to current; list pages sessions, without sub-agent or archived ones unless include_agents/include_archived; bots shows each bot’s activity, work, approvals, routines and attention flags, or with session_id (a bot id or its chat) its routines and recent sessions; read returns latest items; send queues prompt (reportsBack: the turn result reports back here); cancel stops the turn; delete removes the session. create (bot conversations) starts a visible agent task session from brief (started, not done yet); unknown Project: list-projects first, still ambiguous: ask the user. compact runs after this turn; fork copies it without switching. suggest (Mixy’s chat only) records a proposal made to the user under key; value false records that the user declined it.',
|
|
104
|
+
'status defaults to current; list pages sessions, without sub-agent or archived ones unless include_agents/include_archived; bots shows each bot’s activity, work, approvals, routines and attention flags, or with session_id (a bot id or its chat) its routines and recent sessions; read returns latest items; send queues prompt (reportsBack: the turn result reports back here); cancel stops the turn; delete removes the session. create (bot conversations; only for a big multi-step plan, smaller work goes to agent) starts a visible agent task session from brief (started, not done yet); unknown Project: list-projects first, still ambiguous: ask the user. compact runs after this turn; fork copies it without switching. suggest (Mixy’s chat only) records a proposal made to the user under key; value false records that the user declined it.',
|
|
105
105
|
},
|
|
106
106
|
title: {
|
|
107
107
|
type: 'string',
|
|
@@ -240,6 +240,7 @@ const OFFICE_RUNTIME_TOOLS = ['office'];
|
|
|
240
240
|
const MEDIA_RUNTIME_TOOLS = ['media'];
|
|
241
241
|
const TIDY_RUNTIME_TOOLS = ['tidy'];
|
|
242
242
|
const VISUALIZE_RUNTIME_TOOLS = ['visualize'];
|
|
243
|
+
const EXPLORE_RUNTIME_TOOLS = ['explore'];
|
|
243
244
|
|
|
244
245
|
const admitted = (tools, names) => (tools || []).filter((tool) => names.includes(tool?.name));
|
|
245
246
|
|
|
@@ -262,6 +263,7 @@ export function collectStandaloneToolDefs({
|
|
|
262
263
|
mediaToolDefs = [],
|
|
263
264
|
tidyToolDefs = [],
|
|
264
265
|
visualizeToolDefs = [],
|
|
266
|
+
exploreToolDefs = [],
|
|
265
267
|
setupToolDefs = [],
|
|
266
268
|
askUserToolDefs = [],
|
|
267
269
|
handoffUserToolDefs = [],
|
|
@@ -285,6 +287,7 @@ export function collectStandaloneToolDefs({
|
|
|
285
287
|
...admitted(mediaToolDefs, MEDIA_RUNTIME_TOOLS),
|
|
286
288
|
...admitted(tidyToolDefs, TIDY_RUNTIME_TOOLS),
|
|
287
289
|
...admitted(visualizeToolDefs, VISUALIZE_RUNTIME_TOOLS),
|
|
290
|
+
...admitted(exploreToolDefs, EXPLORE_RUNTIME_TOOLS),
|
|
288
291
|
...setupToolDefs,
|
|
289
292
|
...askUserToolDefs,
|
|
290
293
|
...handoffUserToolDefs,
|
|
@@ -4,6 +4,8 @@ import { clean } from '../session-text.mjs';
|
|
|
4
4
|
import { configuredOrchestrationMode } from '../../../../shared/orchestration.mjs';
|
|
5
5
|
import { AGENT_MODE_DELEGATION, MIXY_CONTACTS_INTRO, orchestrationInstructions } from '../orchestration.mjs';
|
|
6
6
|
import { DEFAULT_WORKFLOW_ID, isContactAgentId, normalizeWorkflowId } from '../workflow-ids.mjs';
|
|
7
|
+
import { MIXY_AGENT_ID } from '../../session/agent-home.mjs';
|
|
8
|
+
import { mixyDisplayName } from '../../session/mixy-name.mjs';
|
|
7
9
|
|
|
8
10
|
export function createWorkflowContext({ packs, agents }) {
|
|
9
11
|
function workflowSummary(pack, { hasAgents = true } = {}) {
|
|
@@ -30,7 +32,7 @@ export function createWorkflowContext({ packs, agents }) {
|
|
|
30
32
|
function workflowContextBlockFromPack(pack) {
|
|
31
33
|
if (!pack) return '';
|
|
32
34
|
// The pack body opens with its own `# <name>` title, so header + description
|
|
33
|
-
// + body
|
|
35
|
+
// + body would repeat the workflow name three times in the prompt. Emit one
|
|
34
36
|
// header line and drop the body's duplicate title (only when it matches).
|
|
35
37
|
const rawBody = String(pack.body || '');
|
|
36
38
|
const firstBreak = rawBody.indexOf('\n');
|
|
@@ -59,7 +61,9 @@ export function createWorkflowContext({ packs, agents }) {
|
|
|
59
61
|
// - coding: the orchestration mode block and the full agent catalog;
|
|
60
62
|
// - agent mode: the fixed delegation block (no per-agent setting) and the
|
|
61
63
|
// sub-agent catalog — identical for every agent, so their prompts share
|
|
62
|
-
// it — plus the contact-agent catalog: every bot but `agentId` itself
|
|
64
|
+
// it — plus the contact-agent catalog: every bot but `agentId` itself,
|
|
65
|
+
// and for any bot but Mixy, Mixy first under her display name, so a bot
|
|
66
|
+
// asked to hand work to her by that name finds her (session send lead).
|
|
63
67
|
function leadPromptParts(config, dir, { agentMode = false, agentId = '' } = {}) {
|
|
64
68
|
const mode = configuredOrchestrationMode(config);
|
|
65
69
|
const ids = agents.delegatableAgentIds(config, dir);
|
|
@@ -79,10 +83,15 @@ export function createWorkflowContext({ packs, agents }) {
|
|
|
79
83
|
dir,
|
|
80
84
|
ids.filter((id) => !isContact(id))
|
|
81
85
|
);
|
|
82
|
-
const contacts =
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
+
const contacts = [
|
|
87
|
+
agentId === MIXY_AGENT_ID ? '' : `- ${mixyDisplayName()} (${MIXY_AGENT_ID}): the user's representative bot`,
|
|
88
|
+
agentCatalog(
|
|
89
|
+
dir,
|
|
90
|
+
ids.filter((id) => isContact(id) && id !== agentId)
|
|
91
|
+
),
|
|
92
|
+
]
|
|
93
|
+
.filter(Boolean)
|
|
94
|
+
.join('\n');
|
|
86
95
|
return {
|
|
87
96
|
// An agent-mode Lead without agents has no one to delegate to at all.
|
|
88
97
|
orchestrationContext: subAgents || contacts ? AGENT_MODE_DELEGATION : '',
|
|
@@ -7,6 +7,7 @@ export const AGENT_DELETED_MARKER = '.deleted';
|
|
|
7
7
|
export const FIXED_AGENT_SLOTS = Object.freeze([
|
|
8
8
|
// Short one-liners on purpose: these render inside the 260px sidebar rail.
|
|
9
9
|
{ id: 'maintainer', label: 'Maintainer', description: 'Memory and upkeep', workflowSlot: 'memory' },
|
|
10
|
+
{ id: 'explore', label: 'Explore', description: 'Codebase exploration', workflowSlot: 'explore' },
|
|
10
11
|
]);
|
|
11
12
|
export const AGENT_ROLE_IDS = new Set(FIXED_AGENT_SLOTS.map((agent) => agent.id));
|
|
12
13
|
// Slot-backed built-ins run through dedicated maintenance channels, so they are never
|
|
@@ -14,6 +14,7 @@ import { clearReactionTargets } from '../runtime-core/reaction-tool-defs.mjs';
|
|
|
14
14
|
import { applyRetryAction, beginIteration, sendProviderRequest, settleSendResult } from './loop/send-phase.mjs';
|
|
15
15
|
import { runToolPhase } from './loop/tool-phase.mjs';
|
|
16
16
|
import { endedWithoutReply } from './loop/turn-limits.mjs';
|
|
17
|
+
import { carryReportOnError } from './loop/turn-report.mjs';
|
|
17
18
|
|
|
18
19
|
// Facade re-exports: these symbols live in ./loop/ modules and are part of
|
|
19
20
|
// loop.mjs's public surface (imported by scripts/tests and other runtime
|
|
@@ -62,29 +63,34 @@ async function runAgentLoop(provider, messages, model, tools, onToolCall, cwd, s
|
|
|
62
63
|
resetAccountProbePacing();
|
|
63
64
|
const state = createLoopState({ provider, messages, model, tools, cwd, sendOpts });
|
|
64
65
|
// Completion, cancellation, and terminal failures end execution.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
66
|
+
try {
|
|
67
|
+
while (true) {
|
|
68
|
+
const round = await beginIteration(state);
|
|
69
|
+
const sent = await sendProviderRequest(state, round);
|
|
70
|
+
if (applyRetryAction(state, sent.result)) continue;
|
|
71
|
+
settleSendResult(state, round, sent);
|
|
72
|
+
// A turn without client tool calls is not automatically the final answer:
|
|
73
|
+
// the provider may have hit its output ceiling, been cut by a safety
|
|
74
|
+
// classifier, declared the turn unfinished, or returned nothing. Each case
|
|
75
|
+
// owns a bounded recovery ladder in ./loop/no-tool-turn.mjs, which either
|
|
76
|
+
// appended a recovery turn ('continue') or produced the terminal response.
|
|
77
|
+
if (!state.response.toolCalls?.length) {
|
|
78
|
+
const outcome = await state.noToolTurn.resolve(state.response, state.iterations);
|
|
79
|
+
state.response = outcome.response;
|
|
80
|
+
if (outcome.action === 'continue') continue;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
await runToolPhase(state, round, sent, onToolCall);
|
|
84
|
+
// A capped turn that kept calling tools after it was told to reply ends
|
|
85
|
+
// here with no reply (./loop/turn-limits.mjs), keeping the answers it
|
|
86
|
+
// went past.
|
|
87
|
+
if (state.turnLimitEnded) {
|
|
88
|
+
state.response = state.noToolTurn.finalize(endedWithoutReply(state.response));
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
87
91
|
}
|
|
92
|
+
} catch (error) {
|
|
93
|
+
throw carryReportOnError(error, state.noToolTurn.endedReport());
|
|
88
94
|
}
|
|
89
95
|
return finishLoop(state);
|
|
90
96
|
}
|
|
@@ -4,6 +4,36 @@
|
|
|
4
4
|
// only — nothing here reads or changes the watchdog's abort policy.
|
|
5
5
|
import { displayProgressStage, lastProgressAt } from '../../../shared/quiet-progress.mjs';
|
|
6
6
|
import { resolveAgentStallThresholds } from '../stall-policy.mjs';
|
|
7
|
+
import { todoProgress } from '../runtime-core/todo-list.mjs';
|
|
8
|
+
import { sessionUsageTotals } from '../../../shared/session-usage-totals.mjs';
|
|
9
|
+
|
|
10
|
+
/** `rows` with each agent's todo progress taken from its live session when
|
|
11
|
+
* this process holds one: the list changes before the session is saved, and
|
|
12
|
+
* the stored copy lags. A live session is authoritative, so one without a
|
|
13
|
+
* list (cleared) drops the row's stored `todo`; rows with no live session
|
|
14
|
+
* keep the stored one. */
|
|
15
|
+
export function withLiveTodo(rows, liveSession) {
|
|
16
|
+
return rows.map((row) => {
|
|
17
|
+
const live = row?.sessionId ? liveSession(row.sessionId) : null;
|
|
18
|
+
if (!live) return row;
|
|
19
|
+
const { todo: _stored, ...rest } = row;
|
|
20
|
+
const todo = todoProgress(live);
|
|
21
|
+
return todo ? { ...rest, todo } : rest;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** `rows` with each agent's running token and tool-call totals taken from its
|
|
26
|
+
* live session when this process holds one: the counters advance with every
|
|
27
|
+
* model response, while the stored copy follows a throttled save. A total the
|
|
28
|
+
* live session does not know keeps the stored one. */
|
|
29
|
+
export function withLiveUsage(rows, liveSession) {
|
|
30
|
+
return rows.map((row) => {
|
|
31
|
+
const live = row?.sessionId ? liveSession(row.sessionId) : null;
|
|
32
|
+
if (!live) return row;
|
|
33
|
+
const { usage, toolCalls } = sessionUsageTotals(live);
|
|
34
|
+
return { ...row, ...(usage ? { usage } : {}), ...(toolCalls === null ? {} : { toolCalls }) };
|
|
35
|
+
});
|
|
36
|
+
}
|
|
7
37
|
|
|
8
38
|
/** `rows` with progress fields on every row `runtimeEntry(sessionId)` reports
|
|
9
39
|
* in flight. `awaitingTask` marks a row whose agent waits on its background
|
|
@@ -9,12 +9,19 @@ export interface RoomRow {
|
|
|
9
9
|
to?: string[] | string;
|
|
10
10
|
toName?: string[] | string;
|
|
11
11
|
failed?: boolean;
|
|
12
|
+
/** A failed pass row: every member it stands for (a run of failures collapses
|
|
13
|
+
* into one row), and why they failed. */
|
|
14
|
+
names?: string[];
|
|
15
|
+
/** Stored as one string; a host may hand the distinct reasons as a list. */
|
|
16
|
+
reason?: string | string[];
|
|
17
|
+
/** A usage-limit stop (`limit: 'usage'` on a cap row): what ran out, on which model. */
|
|
18
|
+
usage?: RoomUsageLimit;
|
|
12
19
|
/** A user-kind row another session sent: its session, the sending bot
|
|
13
20
|
* (none for the user's Lead) and the name it is shown under. */
|
|
14
21
|
fromSession?: string;
|
|
15
22
|
fromAgent?: string;
|
|
16
23
|
fromName?: string;
|
|
17
|
-
limit?: 'rounds' | 'messages';
|
|
24
|
+
limit?: 'rounds' | 'messages' | 'usage';
|
|
18
25
|
rounds?: number;
|
|
19
26
|
messages?: number;
|
|
20
27
|
tools?: Array<{ name: string; summary: string }>;
|
|
@@ -66,11 +73,27 @@ export interface RoomMemberLabel {
|
|
|
66
73
|
name: string;
|
|
67
74
|
}
|
|
68
75
|
export type RoomTurnResult = 'speech' | 'pass' | 'stopped' | 'superseded';
|
|
69
|
-
/**
|
|
70
|
-
export
|
|
76
|
+
/** What stopped a turn on the provider's usage limit (roomUsageLimit). */
|
|
77
|
+
export interface RoomUsageLimit {
|
|
78
|
+
kind: 'quota_exhausted' | 'entitlement' | 'billing';
|
|
79
|
+
provider: string;
|
|
80
|
+
model: string;
|
|
81
|
+
/** Epoch ms the limit resets; null when unknown. */
|
|
82
|
+
resetAt: number | null;
|
|
83
|
+
}
|
|
84
|
+
/** The usage-limit stop a failed `turndone` item records, or null. */
|
|
85
|
+
export function roomUsageLimit(done: unknown, route?: { provider?: string; model?: string }): RoomUsageLimit | null;
|
|
86
|
+
/** A turn's answer; a speech may name the one peer it addressed, a failed
|
|
87
|
+
* pass says so (`failed`) and, on a usage limit, why (`usage`). */
|
|
88
|
+
export type RoomTurnAnswer =
|
|
89
|
+
| RoomTurnResult
|
|
90
|
+
| 'unavailable'
|
|
91
|
+
| { result: RoomTurnResult | 'unavailable'; mention?: string; failed?: boolean; usage?: RoomUsageLimit | null };
|
|
71
92
|
export interface RoomExchangeResult {
|
|
72
|
-
outcome: 'done' | 'capped' | 'stopped' | 'superseded';
|
|
93
|
+
outcome: 'done' | 'capped' | 'stopped' | 'superseded' | 'limited' | 'failed';
|
|
73
94
|
limit?: 'rounds' | 'messages';
|
|
95
|
+
/** A 'limited' end: the usage limit the turn met. */
|
|
96
|
+
usage?: RoomUsageLimit;
|
|
74
97
|
rounds: number;
|
|
75
98
|
/** Supervisor steps taken. */
|
|
76
99
|
steps: number;
|
|
@@ -118,7 +141,7 @@ export type RoomScene = 'casual' | 'work';
|
|
|
118
141
|
/** What one supervisor step is told. */
|
|
119
142
|
export interface RoomStep {
|
|
120
143
|
mustPick: boolean;
|
|
121
|
-
turns: Array<{ id: string; result: RoomTurnResult }>;
|
|
144
|
+
turns: Array<{ id: string; result: RoomTurnResult; failed?: boolean }>;
|
|
122
145
|
last: string;
|
|
123
146
|
mention: string;
|
|
124
147
|
remaining: { messages: number; steps: number };
|
|
@@ -144,6 +167,8 @@ export function runRoomExchange(options: {
|
|
|
144
167
|
waiting?: boolean;
|
|
145
168
|
/** The called members (`to`) answer and nobody else follows. */
|
|
146
169
|
only?: boolean;
|
|
170
|
+
/** The sender stated that the request also addressed the whole room; unset, only an empty `to` does. */
|
|
171
|
+
wholeRoom?: boolean;
|
|
147
172
|
}): Promise<RoomExchangeResult>;
|
|
148
173
|
export function roomDataLabel(value: unknown): string;
|
|
149
174
|
export function roomDataLines(text: unknown): string[];
|