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,63 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* goal-tool-exec.mjs — the model-facing `goal` tool:
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* goal-tool-exec.mjs — the model-facing `goal` tool: status, create, and the
|
|
3
|
+
* model's two settlements (complete after its evidence audit, block on an
|
|
4
|
+
* impasse), each replying with the compact or full Goal view.
|
|
5
5
|
*/
|
|
6
6
|
import { validateGoalToolCall } from './goal-tool-defs.mjs';
|
|
7
7
|
import { assertSessionId, parseGoalDuration } from './goal-state.mjs';
|
|
8
|
-
import { goalFinished } from './goal-mutations.mjs';
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
if (goal) ctx.observedGoals.set(id, { id: goal.id, revision: goal.revision });
|
|
12
|
-
else ctx.observedGoals.delete(id);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function toolReply(ctx, id, goal, { full = false, previousIds = null } = {}) {
|
|
16
|
-
observeGoal(ctx, id, goal);
|
|
9
|
+
function toolReply(goal, { full = false } = {}) {
|
|
17
10
|
let goalView = goal;
|
|
18
11
|
if (goal && !full) {
|
|
19
|
-
goalView = {
|
|
20
|
-
id: goal.id,
|
|
21
|
-
revision: goal.revision,
|
|
22
|
-
status: goal.status,
|
|
23
|
-
tasksCompleted: goal.tasksCompleted,
|
|
24
|
-
tasksTotal: goal.tasksTotal,
|
|
25
|
-
taskSlotsUsed: goal.taskSlotsUsed,
|
|
26
|
-
tasksUpdatedAt: goal.tasksUpdatedAt,
|
|
27
|
-
timeUsedMs: goal.timeUsedMs,
|
|
28
|
-
};
|
|
12
|
+
goalView = { id: goal.id, status: goal.status, timeUsedMs: goal.timeUsedMs };
|
|
29
13
|
if (goal.blocker) goalView.blocker = goal.blocker;
|
|
30
|
-
if (goal.needsTaskReview) goalView.needsTaskReview = true;
|
|
31
|
-
}
|
|
32
|
-
const result = { goal: goalView, remaining_ms: goal?.remainingMs ?? null };
|
|
33
|
-
if (!full && previousIds && goal) {
|
|
34
|
-
const added = goal.tasks.filter((task) => !previousIds.has(task.id));
|
|
35
|
-
if (added.length) result.assigned_tasks = added.map(({ id: taskId, text }) => ({ id: taskId, text }));
|
|
36
14
|
}
|
|
37
|
-
return JSON.stringify(
|
|
15
|
+
return JSON.stringify({ goal: goalView, remaining_ms: goal?.remainingMs ?? null });
|
|
38
16
|
}
|
|
39
17
|
|
|
40
|
-
|
|
41
|
-
const current = ctx.requireGoal(id);
|
|
42
|
-
const expectedGoalId = ctx.turnGoalIds.get(id) || current.id;
|
|
43
|
-
const observed = ctx.observedGoals.get(id);
|
|
44
|
-
// Capture BEFORE queueing: two concurrent calls based on one snapshot must
|
|
45
|
-
// not both overwrite it. Old frozen schemas use the last tool result.
|
|
46
|
-
let expectedRevision = current.revision;
|
|
47
|
-
if (args.revision != null && args.revision !== '') expectedRevision = args.revision;
|
|
48
|
-
else if (observed?.id === expectedGoalId) expectedRevision = observed.revision;
|
|
49
|
-
return ctx.withMutation(id, () => {
|
|
50
|
-
const latest = ctx.requireGoal(id);
|
|
51
|
-
if (latest.id !== expectedGoalId) throw new Error('stale Goal update rejected because the active Goal changed');
|
|
52
|
-
if (latest.revision !== expectedRevision)
|
|
53
|
-
throw new Error(
|
|
54
|
-
`stale Goal revision: expected ${expectedRevision}, current ${latest.revision}; read goal status and reconcile before retrying`
|
|
55
|
-
);
|
|
56
|
-
return operation(expectedGoalId);
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** create/resume budget in ms, or undefined when the call carries none. */
|
|
18
|
+
/** create budget in ms, or undefined when the call carries none. */
|
|
61
19
|
function toolTimeLimitMs(args) {
|
|
62
20
|
if (args.time_limit_minutes == null || args.time_limit_minutes === '') return undefined;
|
|
63
21
|
const minutes = Number(args.time_limit_minutes);
|
|
@@ -67,75 +25,51 @@ function toolTimeLimitMs(args) {
|
|
|
67
25
|
return parseGoalDuration(minutes * 60_000);
|
|
68
26
|
}
|
|
69
27
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
28
|
+
// A settlement applies to the Goal this turn worked on: one replaced
|
|
29
|
+
// meanwhile is refused instead of settled by mistake.
|
|
30
|
+
async function settleStatus(ctx, id, args, action) {
|
|
31
|
+
const expectedGoalId = ctx.turnGoalIds.get(id) || ctx.requireGoal(id).id;
|
|
32
|
+
const goal = await ctx.withMutation(id, () => {
|
|
73
33
|
const current = ctx.requireGoal(id);
|
|
74
|
-
|
|
75
|
-
|
|
34
|
+
// The objective was edited after this turn last saw it: the claim was made
|
|
35
|
+
// against old wording. Show the current text once; the next call, made
|
|
36
|
+
// with that text in view, settles normally.
|
|
37
|
+
const seen = ctx.turnObjectiveRevisions.get(id);
|
|
38
|
+
if (current.id === expectedGoalId && seen !== undefined && seen !== current.objectiveRevision) {
|
|
39
|
+
ctx.turnObjectiveRevisions.set(id, current.objectiveRevision);
|
|
40
|
+
throw new Error(
|
|
41
|
+
`The Goal objective changed since this turn began, so ${action} was not recorded. ` +
|
|
42
|
+
`Current objective: ${current.objective}\nCheck the work against it, then call goal ${action} again if it still holds.`
|
|
43
|
+
);
|
|
76
44
|
}
|
|
77
|
-
|
|
78
|
-
// user's pause; waits on the user go through block.
|
|
79
|
-
const change =
|
|
80
|
-
action === 'resume'
|
|
81
|
-
? { updates: args.updates, tasks: args.tasks, duration: timeLimitMs, timeMode: args.time_mode }
|
|
82
|
-
: {};
|
|
83
|
-
return ctx.control(id, { action, expectedGoalId, ...change });
|
|
84
|
-
});
|
|
85
|
-
return toolReply(ctx, id, result.goal, { full: action === 'resume' });
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
async function editTasks(ctx, id, args, action) {
|
|
89
|
-
let previousIds;
|
|
90
|
-
const goal = await mutateObserved(ctx, id, args, (expectedGoalId) => {
|
|
91
|
-
previousIds = new Set(ctx.requireGoal(id).tasks.map((task) => task.id));
|
|
92
|
-
return ctx.setGoalTasks(id, args, { expectedGoalId, partial: action === 'update_tasks' });
|
|
93
|
-
});
|
|
94
|
-
return toolReply(ctx, id, goal, { previousIds });
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
async function settleStatus(ctx, id, args, action) {
|
|
98
|
-
const goal = await mutateObserved(ctx, id, args, (expectedGoalId) =>
|
|
99
|
-
ctx.updateGoal(
|
|
45
|
+
return ctx.updateGoal(
|
|
100
46
|
id,
|
|
101
|
-
{
|
|
102
|
-
status: action === 'block' ? 'blocked' : 'complete',
|
|
103
|
-
...(action === 'block' ? { blocker: args.blocker } : {}),
|
|
104
|
-
},
|
|
47
|
+
{ status: action === 'block' ? 'blocked' : 'complete', ...(action === 'block' ? { blocker: args.blocker } : {}) },
|
|
105
48
|
{ expectedGoalId }
|
|
106
|
-
)
|
|
107
|
-
);
|
|
108
|
-
return toolReply(
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
return toolReply(goal);
|
|
109
52
|
}
|
|
110
53
|
|
|
111
54
|
const GOAL_TOOL_ACTIONS = {
|
|
112
55
|
status(ctx, id) {
|
|
113
56
|
// Same view the user sees. Reading the stored record here showed the
|
|
114
57
|
// model Goals the user had already archived away.
|
|
115
|
-
ctx.readRecord(id); // A real I/O error is an actionable error, not "no Goal".
|
|
116
|
-
|
|
58
|
+
const record = ctx.readRecord(id).goal; // A real I/O error is an actionable error, not "no Goal".
|
|
59
|
+
if (record && ctx.turnGoalIds.get(id) === record.id) ctx.turnObjectiveRevisions.set(id, record.objectiveRevision);
|
|
60
|
+
return toolReply(ctx.visibleSnapshot(id), { full: true });
|
|
117
61
|
},
|
|
118
62
|
async create(ctx, id, args) {
|
|
119
63
|
const timeLimitMs = toolTimeLimitMs(args);
|
|
120
64
|
const goal = await ctx.withMutation(id, () =>
|
|
121
65
|
ctx.createGoal(id, {
|
|
122
66
|
objective: args.objective,
|
|
123
|
-
tasks: args.tasks,
|
|
124
67
|
startInCurrentTurn: true,
|
|
125
68
|
...(timeLimitMs != null ? { timeLimitMs } : {}),
|
|
126
|
-
timeMode: args.time_mode,
|
|
127
69
|
})
|
|
128
70
|
);
|
|
129
|
-
return toolReply(
|
|
130
|
-
},
|
|
131
|
-
async abandon(ctx, id, args) {
|
|
132
|
-
const goal = await mutateObserved(ctx, id, args, (expectedGoalId) => ctx.abandonGoal(id, { expectedGoalId }));
|
|
133
|
-
return toolReply(ctx, id, goal);
|
|
71
|
+
return toolReply(goal, { full: true });
|
|
134
72
|
},
|
|
135
|
-
pause: pauseOrResume,
|
|
136
|
-
resume: pauseOrResume,
|
|
137
|
-
set_tasks: editTasks,
|
|
138
|
-
update_tasks: editTasks,
|
|
139
73
|
block: settleStatus,
|
|
140
74
|
complete: settleStatus,
|
|
141
75
|
};
|
|
@@ -145,6 +79,5 @@ export async function executeGoalTool(ctx, name, args = {}, context = {}) {
|
|
|
145
79
|
const id = assertSessionId(sessionId);
|
|
146
80
|
if (name !== 'goal') throw new Error(`unknown Goal tool: ${name}`);
|
|
147
81
|
const action = validateGoalToolCall(args);
|
|
148
|
-
|
|
149
|
-
return handler(ctx, id, args, action);
|
|
82
|
+
return GOAL_TOOL_ACTIONS[action](ctx, id, args, action);
|
|
150
83
|
}
|
|
@@ -4,38 +4,21 @@
|
|
|
4
4
|
* should continue, and retiring finished work on the next user prompt.
|
|
5
5
|
*/
|
|
6
6
|
import { continuationPrompt } from './goal-text.mjs';
|
|
7
|
-
import { GOAL_TASK_SETTLED } from './goal-tool-defs.mjs';
|
|
8
7
|
import {
|
|
9
8
|
assertSessionId,
|
|
10
9
|
checkpointActiveClock,
|
|
11
10
|
clearTurnFailures,
|
|
12
|
-
publicGoal,
|
|
13
11
|
resumeGoalState,
|
|
14
|
-
runningAgentWork,
|
|
15
12
|
startActiveClock,
|
|
16
13
|
stopActiveClock,
|
|
17
14
|
} from './goal-state.mjs';
|
|
18
15
|
import { goalFinished } from './goal-mutations.mjs';
|
|
19
|
-
import {
|
|
16
|
+
import { awaitingBackgroundWork } from '../../../shared/background-wait.mjs';
|
|
20
17
|
import { clean } from '../../../shared/clean.mjs';
|
|
21
18
|
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
function settledDurationWait(goal) {
|
|
26
|
-
return (
|
|
27
|
-
goal?.status === 'active' &&
|
|
28
|
-
goal.timeMode === 'duration' &&
|
|
29
|
-
goal.remainingMs > 0 &&
|
|
30
|
-
!goal.needsTaskReview &&
|
|
31
|
-
goal.tasks.length > 0 &&
|
|
32
|
-
goal.tasks.every((task) => GOAL_TASK_SETTLED.includes(task.status))
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// The review is spent per Goal, turn, and actionable revision: a resumed,
|
|
37
|
-
// re-scoped, or re-planned Goal earns a fresh one without any extra clearing.
|
|
38
|
-
const idleReviewKey = (goal) => `${goal.id}:${goal.turnCount}:${goal.revision}`;
|
|
19
|
+
// The no-progress wait is spent per Goal and turn: the next user turn (or a
|
|
20
|
+
// resume, which starts a new turn) earns a fresh continuation.
|
|
21
|
+
const idleReviewKey = (goal) => `${goal.id}:${goal.turnCount}`;
|
|
39
22
|
|
|
40
23
|
// An automatic turn that called no tool answered its prompt without progress.
|
|
41
24
|
// Asking again over the same list only repeats that answer every few seconds
|
|
@@ -52,16 +35,8 @@ function automaticTurnWithoutActivity(detail, goal) {
|
|
|
52
35
|
|
|
53
36
|
// Continuation prompts are enqueued as meta user messages, so a delivered rules
|
|
54
37
|
// block stays in the transcript until the context is compacted or rewound. The
|
|
55
|
-
// marker records which Goal's rules are already there: a new session or Goal,
|
|
56
|
-
//
|
|
57
|
-
function needsFullContinuationRules(markedGoalId, goal) {
|
|
58
|
-
return markedGoalId !== goal.id || goal.needsTaskReview === true;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// A durable list drifts out of attention after roughly ten quiet turns — the
|
|
62
|
-
// staleness cadence task-reminder surfaces settle on across the industry — so
|
|
63
|
-
// the state block returns on that count rather than on an arbitrary period.
|
|
64
|
-
const GOAL_STATE_REMINDER_QUIET_TURNS = 10;
|
|
38
|
+
// marker records which Goal's rules are already there: a new session or Goal,
|
|
39
|
+
// or an explicit reset (compaction, objective edit) re-sends them.
|
|
65
40
|
|
|
66
41
|
/** Fold a settled turn's outcome (usage limit, cancel, failure, or a clean
|
|
67
42
|
* finish) into the Goal status and clocks. */
|
|
@@ -103,7 +78,7 @@ function applyTurnOutcome(goal, detail, at) {
|
|
|
103
78
|
if (goal.timeLimitMs > 0 && goal.timeUsedMs >= goal.timeLimitMs) {
|
|
104
79
|
stopActiveClock(goal, at);
|
|
105
80
|
goal.status = 'duration_reached';
|
|
106
|
-
goal.timeUsedMs =
|
|
81
|
+
goal.timeUsedMs = goal.timeLimitMs;
|
|
107
82
|
}
|
|
108
83
|
}
|
|
109
84
|
|
|
@@ -112,6 +87,7 @@ export function createGoalTurnLifecycle(ctx) {
|
|
|
112
87
|
now,
|
|
113
88
|
turnGoalIds,
|
|
114
89
|
turnStartedAt,
|
|
90
|
+
turnObjectiveRevisions,
|
|
115
91
|
idleReviewTurns,
|
|
116
92
|
continuationTiers,
|
|
117
93
|
unsavedStops,
|
|
@@ -129,22 +105,19 @@ export function createGoalTurnLifecycle(ctx) {
|
|
|
129
105
|
if (!goal || goal.archivedAt) {
|
|
130
106
|
turnGoalIds.delete(id);
|
|
131
107
|
turnStartedAt.delete(id);
|
|
108
|
+
turnObjectiveRevisions.delete(id);
|
|
132
109
|
return null;
|
|
133
110
|
}
|
|
134
111
|
const at = now();
|
|
135
112
|
turnGoalIds.set(id, goal.id);
|
|
136
113
|
turnStartedAt.set(id, at);
|
|
137
|
-
|
|
114
|
+
turnObjectiveRevisions.set(id, goal.objectiveRevision);
|
|
138
115
|
if (goal.status !== 'active') return visibleSnapshot(id);
|
|
139
116
|
goal.turnCount = Math.max(0, Math.floor(Number(goal.turnCount) || 0)) + 1;
|
|
140
117
|
startActiveClock(goal, at);
|
|
141
118
|
goal.updatedAt = at;
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
// the next continuation waits instead of asking again unchanged.
|
|
145
|
-
if (settledDurationWait(published)) idleReviewTurns.set(id, idleReviewKey(published));
|
|
146
|
-
else idleReviewTurns.delete(id);
|
|
147
|
-
return published;
|
|
119
|
+
idleReviewTurns.delete(id);
|
|
120
|
+
return commit(id, goal);
|
|
148
121
|
});
|
|
149
122
|
},
|
|
150
123
|
settleTurn(sessionId, detail = {}) {
|
|
@@ -152,6 +125,7 @@ export function createGoalTurnLifecycle(ctx) {
|
|
|
152
125
|
const expectedGoalId = turnGoalIds.get(id) || '';
|
|
153
126
|
turnGoalIds.delete(id);
|
|
154
127
|
turnStartedAt.delete(id);
|
|
128
|
+
turnObjectiveRevisions.delete(id);
|
|
155
129
|
const goal = readRecord(id).goal;
|
|
156
130
|
// commit() returns the record even when it is archived, so a settled
|
|
157
131
|
// turn on retired work would republish the capsule the user's prompt
|
|
@@ -192,50 +166,21 @@ export function createGoalTurnLifecycle(ctx) {
|
|
|
192
166
|
return commit(id, goal, options);
|
|
193
167
|
});
|
|
194
168
|
},
|
|
195
|
-
|
|
169
|
+
// `todo`: the session's open step list, carried in every continuation.
|
|
170
|
+
continuation(sessionId, { agentStatus = null, todo = '' } = {}) {
|
|
196
171
|
const goal = visibleSnapshot(sessionId);
|
|
197
172
|
if (goal?.status !== 'active') return { run: false, reason: goal?.status || 'missing', goal };
|
|
198
|
-
if (runningAgentWork(agentStatus)) return { run: false, reason: 'agent-running', goal };
|
|
199
173
|
const id = assertSessionId(sessionId);
|
|
174
|
+
// The same wait rule as the todo completion check: a running agent or
|
|
175
|
+
// an awaited background shell wakes the session when it ends.
|
|
176
|
+
if (awaitingBackgroundWork({ sessionId: id, agentStatus })) return { run: false, reason: 'awaiting-work', goal };
|
|
200
177
|
if (unsavedStops.get(id) === goal.id) return { run: false, reason: 'unsaved-stop', goal };
|
|
201
|
-
|
|
202
|
-
if (settledDurationWait(goal)) {
|
|
203
|
-
// The model already answered this exact list with no new work, so the
|
|
204
|
-
// deadline timer owns the rest of the wait and delivers closeout;
|
|
205
|
-
// task/scope changes still publish and wake newly actionable work.
|
|
206
|
-
if (answered) return { run: false, reason: 'duration-wait', goal };
|
|
207
|
-
// One turn to spend the remaining duration on new work or to park
|
|
208
|
-
// approval-dependent work: idling it away is not the requested wait.
|
|
209
|
-
// This turn has to decide the rest of the duration, so it carries the
|
|
210
|
-
// full rules that decision is judged against.
|
|
211
|
-
continuationTiers.set(id, { goalId: goal.id, revision: goal.revision, quietTurns: 0 });
|
|
212
|
-
return { run: true, reason: 'idle-review', goal, prompt: continuationPrompt(goal, { idleReview: true }) };
|
|
213
|
-
}
|
|
214
|
-
// The same wait for an unfinished list: a task change, a user turn, or
|
|
178
|
+
// An automatic turn already answered with no tool call: a user turn or
|
|
215
179
|
// the deadline's closeout starts the next Goal turn.
|
|
216
|
-
if (
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
return { run: true, reason: 'idle', goal, prompt: continuationPrompt(goal) };
|
|
221
|
-
}
|
|
222
|
-
// A changed revision means the model mutated tasks last turn and holds
|
|
223
|
-
// the fresh list in its own tool result; repeating it buys nothing. The
|
|
224
|
-
// state block returns only once the list has gone unread long enough to
|
|
225
|
-
// drift out of attention.
|
|
226
|
-
const quietTurns = entry.revision === goal.revision ? entry.quietTurns + 1 : 0;
|
|
227
|
-
const includeState = quietTurns >= GOAL_STATE_REMINDER_QUIET_TURNS;
|
|
228
|
-
continuationTiers.set(id, {
|
|
229
|
-
goalId: goal.id,
|
|
230
|
-
revision: goal.revision,
|
|
231
|
-
quietTurns: includeState ? 0 : quietTurns,
|
|
232
|
-
});
|
|
233
|
-
return {
|
|
234
|
-
run: true,
|
|
235
|
-
reason: 'idle',
|
|
236
|
-
goal,
|
|
237
|
-
prompt: continuationPrompt(goal, { includeRules: false, includeState }),
|
|
238
|
-
};
|
|
180
|
+
if (idleReviewTurns.get(id) === idleReviewKey(goal)) return { run: false, reason: 'no-progress-wait', goal };
|
|
181
|
+
const includeRules = continuationTiers.get(id) !== goal.id;
|
|
182
|
+
continuationTiers.set(id, goal.id);
|
|
183
|
+
return { run: true, reason: 'idle', goal, prompt: continuationPrompt(goal, { includeRules, todo }) };
|
|
239
184
|
},
|
|
240
185
|
resetContinuationRules(sessionId) {
|
|
241
186
|
continuationTiers.delete(assertSessionId(sessionId));
|
|
@@ -1,59 +1,81 @@
|
|
|
1
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
1
3
|
import { normalizeOrchestrationMode } from '../../../shared/orchestration.mjs';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
focused: `Lead executes the main scope directly. Delegate only substantial,
|
|
5
|
-
self-contained supporting work, one agent per role; batch related tasks
|
|
6
|
-
rather than splitting them for parallelism.`,
|
|
7
|
-
balanced: `Delegate independent work by coherent feature or module, one agent per
|
|
8
|
-
scope; a scope is one verifiable deliverable. Batch related tasks within the
|
|
9
|
-
same change scope rather than splitting every file or step.`,
|
|
10
|
-
swarm: `Delegate every independent scope to its own agent; a scope is one
|
|
11
|
-
verifiable deliverable, not a bundle of steps. Treat disjoint file or
|
|
12
|
-
module sets as independent and merge scopes only on a true output
|
|
13
|
-
dependency.`,
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const SOLO = `# Orchestration Mode: Solo
|
|
17
|
-
|
|
18
|
-
Lead executes all work directly and never delegates on its own judgment.
|
|
19
|
-
Only when the user explicitly asks for delegation, load the deferred \`agent\`
|
|
20
|
-
tool and brief each agent as the Lead rules describe.`;
|
|
4
|
+
import { mixdogRoot, resolvePluginData } from '../../../shared/plugin-paths.mjs';
|
|
5
|
+
import { decodeInstructionFile } from '../../../../lib/instruction-text.cjs';
|
|
21
6
|
|
|
22
7
|
/** Agent mode's fixed delegation block, in place of the orchestration mode. */
|
|
23
8
|
export const AGENT_MODE_DELEGATION = `# Delegation
|
|
24
9
|
|
|
25
|
-
Handle conversation yourself.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
10
|
+
Handle conversation yourself. Do quick lookups and small edits yourself. Hand
|
|
11
|
+
self-contained investigation, writing or implementation to sub-agents
|
|
12
|
+
(\`agent\`); their reports return to this chat. Open a new agent task session
|
|
13
|
+
(\`session create\`) only for a big plan, multi-step work across many files or
|
|
14
|
+
stages that needs its own Lead, with a self-contained brief: start it when
|
|
15
|
+
already requested, otherwise suggest it. Then relay the result in your own
|
|
16
|
+
words. Promise a follow-up only when the session result allows it.`;
|
|
29
17
|
|
|
30
18
|
/** An agent-mode Lead's contact catalog intro: the user's other bots. */
|
|
31
19
|
export const MIXY_CONTACTS_INTRO = `The user's other bots. Hand one a request with \`session send\` to its chat and a
|
|
32
20
|
self-contained brief.`;
|
|
33
21
|
|
|
34
|
-
|
|
22
|
+
const modeFileName = (mode) => `${normalizeOrchestrationMode(mode)}.md`;
|
|
23
|
+
|
|
24
|
+
/** The shipped mode file (<root>/orchestration/<mode>.md). */
|
|
25
|
+
export const shippedOrchestrationPath = (mode) => join(mixdogRoot(), 'orchestration', modeFileName(mode));
|
|
26
|
+
/** The user's replacement (<data>/orchestration/<mode>.md). */
|
|
27
|
+
export const userOrchestrationPath = (mode) => join(resolvePluginData(), 'orchestration', modeFileName(mode));
|
|
28
|
+
|
|
29
|
+
// A file's text (CRLF → LF, trailing whitespace trimmed), null when it does not
|
|
30
|
+
// exist, or { problem } when it cannot serve as the prompt (instruction-text.cjs).
|
|
31
|
+
// promptRulesRevision reads every mode on each check, so a read is reused while
|
|
32
|
+
// the file's identity (mtime, ctime, inode, size) is unchanged — but only once
|
|
33
|
+
// the file is older than the timestamp granularity: a file written moments ago
|
|
34
|
+
// can change again within the same tick without any of those moving.
|
|
35
|
+
const SETTLED_MS = 2000;
|
|
36
|
+
const fileCache = new Map();
|
|
37
|
+
export function readInstructionFile(file) {
|
|
38
|
+
let stat;
|
|
39
|
+
try {
|
|
40
|
+
stat = statSync(file);
|
|
41
|
+
} catch (error) {
|
|
42
|
+
return error?.code === 'ENOENT' || error?.code === 'ENOTDIR' ? null : { problem: 'unreadable' };
|
|
43
|
+
}
|
|
44
|
+
const key = `${stat.mtimeMs}:${stat.ctimeMs}:${stat.ino}:${stat.size}`;
|
|
45
|
+
const hit = fileCache.get(file);
|
|
46
|
+
if (hit?.key === key && hit.settled) return hit.value;
|
|
47
|
+
let value;
|
|
48
|
+
try {
|
|
49
|
+
if (!stat.isFile()) value = { problem: 'unreadable' };
|
|
50
|
+
else {
|
|
51
|
+
const decoded = decodeInstructionFile(readFileSync(file));
|
|
52
|
+
value = decoded.problem ? decoded : { text: decoded.text.replace(/\r\n/g, '\n').trimEnd() };
|
|
53
|
+
}
|
|
54
|
+
} catch {
|
|
55
|
+
value = { problem: 'unreadable' };
|
|
56
|
+
}
|
|
57
|
+
fileCache.set(file, { key, value, settled: Date.now() - stat.mtimeMs > SETTLED_MS });
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Where a mode's text comes from: the user's file when it is usable, else the
|
|
63
|
+
* shipped one. `problem` says why a user file that exists was passed over
|
|
64
|
+
* (empty, too-large, not-text, unreadable); `text` is the prompt text.
|
|
65
|
+
*/
|
|
66
|
+
function orchestrationModeSource(value) {
|
|
35
67
|
const mode = normalizeOrchestrationMode(value);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
to spell out the edits themselves — a few localized changes whose sites Lead
|
|
50
|
-
already holds — Lead makes them directly in every mode; the number of files or
|
|
51
|
-
scopes does not change this.
|
|
52
|
-
|
|
53
|
-
Dispatch all ready independent scopes in one turn. Only a scope that requires
|
|
54
|
-
another's output waits.
|
|
55
|
-
A new independent need goes to a new agent. When scopes touch the same file, name one owner for
|
|
56
|
-
that file in each brief.
|
|
57
|
-
Use only available agents; when none fits a role, Lead does that work itself
|
|
58
|
-
and never changes settings to enable one.`;
|
|
68
|
+
const user = readInstructionFile(userOrchestrationPath(mode));
|
|
69
|
+
if (user?.text) return { mode, source: 'user', text: user.text };
|
|
70
|
+
const shipped = readInstructionFile(shippedOrchestrationPath(mode));
|
|
71
|
+
return {
|
|
72
|
+
mode,
|
|
73
|
+
source: 'default',
|
|
74
|
+
text: shipped?.text ?? '',
|
|
75
|
+
...(user?.problem ? { problem: user.problem } : {}),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function orchestrationInstructions(value) {
|
|
80
|
+
return orchestrationModeSource(value).text;
|
|
59
81
|
}
|