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
|
@@ -15,10 +15,12 @@ import { drainPendingMessages, hydratePendingMessages } from './pending-messages
|
|
|
15
15
|
import { _unlinkParentAbortListener, _getRuntimeEntry, _evictTerminalSessionRuntime } from './runtime-liveness.mjs';
|
|
16
16
|
import { acquireSessionLock } from './session-lock.mjs';
|
|
17
17
|
import { createAskPromptQueue } from './ask-queue.mjs';
|
|
18
|
-
import { armTurnDurability, claimTurnRuntime } from './ask-turn-open.mjs';
|
|
18
|
+
import { armTurnDurability, claimTurnRuntime, settleTurnBase } from './ask-turn-open.mjs';
|
|
19
19
|
import { prepareAskTurn, runAskAgentLoop } from './ask-turn-execute.mjs';
|
|
20
20
|
import { commitAskTurn, publishAskTurn } from './ask-turn-settle.mjs';
|
|
21
|
+
import { carryReportOnError, turnReportText, withEarlierReport } from '../loop/turn-report.mjs';
|
|
21
22
|
import { finalizeAskTurnFailure } from './ask-turn-failure.mjs';
|
|
23
|
+
import { armTurnTimeoutOnProviderError, reapTurnShellJobs } from './turn-reap.mjs';
|
|
22
24
|
import { cacheWarmTurnKind, endCacheWarmTurn, failedTurnProvenance, noteCacheWarmTurn } from '../cache-warm.mjs';
|
|
23
25
|
|
|
24
26
|
export { _api_call_with_interrupt } from './ask-call-interrupt.mjs';
|
|
@@ -77,7 +79,17 @@ export function createAskTranscriptMeta(rawTranscriptMeta) {
|
|
|
77
79
|
/** One opened turn from provider call to terminal publish; a failure unwinds
|
|
78
80
|
* the turn state and rethrows. Returns the terminal result preview and the
|
|
79
81
|
* follow-ups drained right after the provider accepted the turn. */
|
|
80
|
-
async function runAskTurn({
|
|
82
|
+
async function runAskTurn({
|
|
83
|
+
sessionId,
|
|
84
|
+
opened,
|
|
85
|
+
input,
|
|
86
|
+
askOpts,
|
|
87
|
+
onToolCall,
|
|
88
|
+
cwdOverride,
|
|
89
|
+
transcript,
|
|
90
|
+
askStartedAt,
|
|
91
|
+
earlierReport,
|
|
92
|
+
}) {
|
|
81
93
|
let releaseWorkspace;
|
|
82
94
|
try {
|
|
83
95
|
releaseWorkspace = await admitWorkspaceActivity(
|
|
@@ -97,6 +109,8 @@ async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOv
|
|
|
97
109
|
// them with what the model was told. Asked again for every user turn
|
|
98
110
|
// the ask runs, queued and background follow-ups included.
|
|
99
111
|
currentAgents: askOpts?.agentsNow?.(),
|
|
112
|
+
// The session runtime's in-memory settings (the file trails them).
|
|
113
|
+
agentConfig: askOpts?.agentConfig?.() || null,
|
|
100
114
|
});
|
|
101
115
|
const result = await runAskAgentLoop({
|
|
102
116
|
sessionId,
|
|
@@ -107,14 +121,19 @@ async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOv
|
|
|
107
121
|
onToolCall,
|
|
108
122
|
takeAssistantTranscriptMetadata: transcript.takeAssistant,
|
|
109
123
|
});
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
124
|
+
// The earlier turns of this ask relayed nothing (publishAskTurn relays
|
|
125
|
+
// only a turn no queued input follows): their reports lead this one's.
|
|
126
|
+
const terminalResultPreview = withEarlierReport(
|
|
127
|
+
await commitAskTurn({
|
|
128
|
+
sessionId,
|
|
129
|
+
opened,
|
|
130
|
+
prepared,
|
|
131
|
+
result,
|
|
132
|
+
rawTranscriptMeta: transcript.raw,
|
|
133
|
+
askStartedAt,
|
|
134
|
+
}),
|
|
135
|
+
earlierReport
|
|
136
|
+
);
|
|
118
137
|
const drained = publishAskTurn({
|
|
119
138
|
sessionId,
|
|
120
139
|
opened,
|
|
@@ -125,6 +144,9 @@ async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOv
|
|
|
125
144
|
});
|
|
126
145
|
return { result: terminalResultPreview, drained };
|
|
127
146
|
} catch (err) {
|
|
147
|
+
// The turn's terminal error: a provider timeout/stall that ended it (a
|
|
148
|
+
// retry the turn recovered from never reaches here) stops its shell work.
|
|
149
|
+
armTurnTimeoutOnProviderError(sessionId, opened.runtime, opened.turnSignal, err);
|
|
128
150
|
await finalizeAskTurnFailure({
|
|
129
151
|
sessionId,
|
|
130
152
|
err,
|
|
@@ -138,12 +160,50 @@ async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOv
|
|
|
138
160
|
transcriptMeta: transcript.raw,
|
|
139
161
|
askStartedAt,
|
|
140
162
|
});
|
|
141
|
-
|
|
163
|
+
reapTurnShellJobs(sessionId, opened.runtime);
|
|
164
|
+
// Queued work that fails still hands on the reports of the turns before it.
|
|
165
|
+
throw carryReportOnError(err, earlierReport);
|
|
142
166
|
} finally {
|
|
143
|
-
|
|
167
|
+
// The result is already published; this only holds the session lock until
|
|
168
|
+
// the reader lease is removed, so the next turn's admission follows it. A
|
|
169
|
+
// failed release (the admission thread stopped) never replaces the turn's
|
|
170
|
+
// own outcome.
|
|
171
|
+
try {
|
|
172
|
+
await releaseWorkspace?.();
|
|
173
|
+
} catch {
|
|
174
|
+
// Intentionally ignored: see the comment above.
|
|
175
|
+
}
|
|
144
176
|
}
|
|
145
177
|
}
|
|
146
178
|
|
|
179
|
+
/** The prompt-cache warmer learns idle gaps from real turns only; a retry is
|
|
180
|
+
* classified by the failed turn's stored provenance. The rebuilt retry
|
|
181
|
+
* message keeps that provenance (ask-turn-execute.mjs). Returns the warmer's
|
|
182
|
+
* turn handle. */
|
|
183
|
+
function noteTurnForCacheWarm(sessionId, claimed, input) {
|
|
184
|
+
const retryProvenance = failedTurnProvenance(claimed.preSession?.messages, input);
|
|
185
|
+
if (retryProvenance) input.retryProvenance = retryProvenance;
|
|
186
|
+
return noteCacheWarmTurn(sessionId, cacheWarmTurnKind(input, claimed.preSession?.messages));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Clear the controller only if it's still ours (closeSession may have
|
|
190
|
+
* swapped it). The rest of the runtime entry stays intact so agent type=list
|
|
191
|
+
* can still surface the final stage (done/error/cancelling). */
|
|
192
|
+
function detachAskRuntime(sessionId, askGeneration) {
|
|
193
|
+
const entry = _getRuntimeEntry(sessionId);
|
|
194
|
+
if (entry && entry.generation === askGeneration) {
|
|
195
|
+
_unlinkParentAbortListener(entry);
|
|
196
|
+
entry.controller = null;
|
|
197
|
+
// Detach the live session reference; ask is over.
|
|
198
|
+
entry.session = null;
|
|
199
|
+
}
|
|
200
|
+
// Final-stage runtime diagnostics are useful only while the turn is
|
|
201
|
+
// unwinding. Once its controller is detached, retaining the full entry
|
|
202
|
+
// (and any accidental references hanging from it) for the host lifetime
|
|
203
|
+
// turns one-shot agent traffic into an unbounded manager Map.
|
|
204
|
+
_evictTerminalSessionRuntime(sessionId);
|
|
205
|
+
}
|
|
206
|
+
|
|
147
207
|
export async function askSession(sessionId, prompt, context, onToolCall, cwdOverride, explicitPrefetch, askOpts = {}) {
|
|
148
208
|
const askStartedAt = Date.now();
|
|
149
209
|
const transcript = createAskTranscriptMeta(askOpts?.transcriptMeta);
|
|
@@ -180,8 +240,9 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
180
240
|
// Hoisted so the outer finally (which runs once after the whole turn loop)
|
|
181
241
|
// can compare against the last turn's generation.
|
|
182
242
|
let askGeneration = 0;
|
|
183
|
-
|
|
184
|
-
|
|
243
|
+
// Crash-checkpoint recovery and the session-start event belong to the first
|
|
244
|
+
// turn of this ask only.
|
|
245
|
+
let firstTurn = true;
|
|
185
246
|
// A failed-turn retry rewinds only the turn it retries, never a drained
|
|
186
247
|
// follow-up turn.
|
|
187
248
|
let retryFailedTurn = askOpts.retryFailedTurn === true;
|
|
@@ -213,27 +274,32 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
213
274
|
input.retryAttemptId = askOpts.retryAttemptId;
|
|
214
275
|
retryTurnId = null;
|
|
215
276
|
}
|
|
216
|
-
//
|
|
217
|
-
//
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
277
|
+
// The earlier turns of this ask relayed nothing (publishAskTurn relays
|
|
278
|
+
// only a turn no queued input follows): this turn failing before it
|
|
279
|
+
// runs (runAskTurn carries the report once it has) still hands them on.
|
|
280
|
+
const earlierReport = result ? turnReportText(result) : '';
|
|
281
|
+
let opened;
|
|
282
|
+
try {
|
|
283
|
+
// The previous turn's save has landed and this turn's base is on disk
|
|
284
|
+
// before the turn touches the session (one unsettled turn per session).
|
|
285
|
+
await settleTurnBase(sessionId, { recoverCheckpoint: firstTurn });
|
|
286
|
+
// Synchronous pre-await setup (must happen before any await so
|
|
287
|
+
// closeSession() can't interleave between load and registration).
|
|
288
|
+
const claimed = claimTurnRuntime({
|
|
289
|
+
sessionId,
|
|
290
|
+
askOpts,
|
|
291
|
+
emitStart: firstTurn,
|
|
292
|
+
});
|
|
293
|
+
warmTurn = noteTurnForCacheWarm(sessionId, claimed, input);
|
|
294
|
+
firstTurn = false;
|
|
295
|
+
askGeneration = claimed.askGeneration;
|
|
296
|
+
opened = {
|
|
297
|
+
...claimed,
|
|
298
|
+
...armTurnDurability({ sessionId, ...claimed, pendingEntries: input.pendingEntries }),
|
|
299
|
+
};
|
|
300
|
+
} catch (error) {
|
|
301
|
+
throw carryReportOnError(error, earlierReport);
|
|
302
|
+
}
|
|
237
303
|
// From here the turn's own unwind (ask-turn-failure) acks or releases
|
|
238
304
|
// its entries; the queue keeps owning only the not-yet-started ones.
|
|
239
305
|
queue.markStarted();
|
|
@@ -246,6 +312,7 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
246
312
|
cwdOverride,
|
|
247
313
|
transcript,
|
|
248
314
|
askStartedAt,
|
|
315
|
+
earlierReport,
|
|
249
316
|
});
|
|
250
317
|
result = turn.result;
|
|
251
318
|
endCacheWarmTurn(sessionId, warmTurn);
|
|
@@ -287,21 +354,7 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
287
354
|
queue.releaseUnstarted();
|
|
288
355
|
// A thrown setup/provider path must never leave a delayed checkpoint
|
|
289
356
|
// writer alive after the turn lock is released.
|
|
290
|
-
|
|
291
|
-
// swapped it). Leave the rest of the runtime entry intact so agent type=list
|
|
292
|
-
// can still surface the final stage (done/error/cancelling).
|
|
293
|
-
const entry = _getRuntimeEntry(sessionId);
|
|
294
|
-
if (entry && entry.generation === askGeneration) {
|
|
295
|
-
_unlinkParentAbortListener(entry);
|
|
296
|
-
entry.controller = null;
|
|
297
|
-
// Detach the live session reference; ask is over.
|
|
298
|
-
entry.session = null;
|
|
299
|
-
}
|
|
300
|
-
// Final-stage runtime diagnostics are useful only while the turn is
|
|
301
|
-
// unwinding. Once its controller is detached, retaining the full entry
|
|
302
|
-
// (and any accidental references hanging from it) for the host lifetime
|
|
303
|
-
// turns one-shot agent traffic into an unbounded manager Map.
|
|
304
|
-
_evictTerminalSessionRuntime(sessionId);
|
|
357
|
+
detachAskRuntime(sessionId, askGeneration);
|
|
305
358
|
unlock();
|
|
306
359
|
}
|
|
307
360
|
}
|
|
@@ -50,19 +50,21 @@ export function turnStepAutoEffort(autoEffort, effortConfiguration) {
|
|
|
50
50
|
: null;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
// `config`: a session runtime's in-memory agent config (its file copy trails
|
|
54
|
+
// it by a debounce); other callers read the file.
|
|
55
|
+
export function autoEffortMode(config = null) {
|
|
54
56
|
if (process.env.MIXDOG_AUTO_EFFORT) return normalizeAutoEffortMode(process.env.MIXDOG_AUTO_EFFORT);
|
|
55
57
|
try {
|
|
56
|
-
return builtinFeatureActive(readSection('agent'), 'autoEffort') ? 'on' : 'off';
|
|
58
|
+
return builtinFeatureActive(config || readSection('agent'), 'autoEffort') ? 'on' : 'off';
|
|
57
59
|
} catch {
|
|
58
60
|
return 'off';
|
|
59
61
|
}
|
|
60
62
|
}
|
|
61
63
|
|
|
62
64
|
/** The global "Auto reasoning base" setting; absent or unreadable is medium. */
|
|
63
|
-
export function autoEffortBaseSetting() {
|
|
65
|
+
export function autoEffortBaseSetting(config = null) {
|
|
64
66
|
try {
|
|
65
|
-
return autoEffortBase(readSection('agent')?.autoEffortBase);
|
|
67
|
+
return autoEffortBase((config || readSection('agent'))?.autoEffortBase);
|
|
66
68
|
} catch {
|
|
67
69
|
return autoEffortBase(undefined);
|
|
68
70
|
}
|
|
@@ -99,8 +101,8 @@ function lastText(messages, role) {
|
|
|
99
101
|
* briefly (its first-use load is the longest wait): a missing, still-loading,
|
|
100
102
|
* or slow model yields null and the default effort.
|
|
101
103
|
*/
|
|
102
|
-
export async function resolveTurnAutoEffort({ sessionId, session, provider, input }) {
|
|
103
|
-
const mode = autoEffortMode();
|
|
104
|
+
export async function resolveTurnAutoEffort({ sessionId, session, provider, input, config = null }) {
|
|
105
|
+
const mode = autoEffortMode(config);
|
|
104
106
|
// promptSource marks runtime-injected turns (completion notices, queued work).
|
|
105
107
|
// Agent sessions are judged like any other: their spawn brief and later Lead
|
|
106
108
|
// `send` messages arrive as plain prompts.
|
|
@@ -113,7 +115,7 @@ export async function resolveTurnAutoEffort({ sessionId, session, provider, inpu
|
|
|
113
115
|
if (!turnEffortConfigurationMode(session, provider)) return null;
|
|
114
116
|
const chosen = String(session.effort || '').toLowerCase();
|
|
115
117
|
const options = effortOptionsFor(session.provider, autoEffortModel(session.provider, provider, session.model));
|
|
116
|
-
const setting = autoEffortBaseSetting();
|
|
118
|
+
const setting = autoEffortBaseSetting(config);
|
|
117
119
|
const base = clampAutoEffortBase({ base: setting, options }) ?? autoEffortBase(setting);
|
|
118
120
|
const record = {
|
|
119
121
|
at: new Date().toISOString(),
|
|
@@ -59,7 +59,13 @@ function retainedUserTurn(session, retained, transcriptMeta, currentAgents) {
|
|
|
59
59
|
},
|
|
60
60
|
currentAgents
|
|
61
61
|
);
|
|
62
|
-
|
|
62
|
+
const noticeRevision = retained.message.meta?.promptSettingsNoticeRevision;
|
|
63
|
+
return {
|
|
64
|
+
historyMessages,
|
|
65
|
+
userTurnMessage,
|
|
66
|
+
outgoing: [...historyMessages, userTurnMessage],
|
|
67
|
+
promptSettingsNotice: noticeRevision ? { revision: noticeRevision } : null,
|
|
68
|
+
};
|
|
63
69
|
}
|
|
64
70
|
|
|
65
71
|
// The turn's user message: the retained one of a retried failed turn, or a
|
|
@@ -147,7 +153,15 @@ function persistTurnPreflight(session, { turnToken, startedAt, checkpoint, askGe
|
|
|
147
153
|
|
|
148
154
|
/** Resolves the provider, builds the user turn and pre-commits it; returns
|
|
149
155
|
* what the loop and the commit need from this preparation. */
|
|
150
|
-
export async function prepareAskTurn({
|
|
156
|
+
export async function prepareAskTurn({
|
|
157
|
+
sessionId,
|
|
158
|
+
opened,
|
|
159
|
+
input,
|
|
160
|
+
cwdOverride,
|
|
161
|
+
transcriptMeta,
|
|
162
|
+
currentAgents,
|
|
163
|
+
agentConfig = null,
|
|
164
|
+
}) {
|
|
151
165
|
const { turn, runtime, turnSignal, askGeneration, checkpoint, turnToken, startedAt, codexTurnId } = opened;
|
|
152
166
|
const session = turn.session;
|
|
153
167
|
// Where the turn sits in a bot-to-bot chain (session-runtime/bot-hops.mjs).
|
|
@@ -167,7 +181,7 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
|
|
|
167
181
|
// reads the session as the turn found it (synchronously, on this call).
|
|
168
182
|
// The first request still carries its decision: it is awaited below,
|
|
169
183
|
// together with the user turn, before the effort configuration is stamped.
|
|
170
|
-
const autoEffortPending = resolveTurnAutoEffort({ sessionId, session, provider, input });
|
|
184
|
+
const autoEffortPending = resolveTurnAutoEffort({ sessionId, session, provider, input, config: agentConfig });
|
|
171
185
|
autoEffortPending.catch(() => {});
|
|
172
186
|
applyTurnContextMeta(session, provider);
|
|
173
187
|
const effectiveCwd = cwdOverride || session.cwd;
|
|
@@ -206,6 +220,9 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
|
|
|
206
220
|
if (effortConfiguration) stampTurnEffort(userTurn.userTurnMessage, effortConfiguration);
|
|
207
221
|
const { historyMessages, outgoing } = userTurn;
|
|
208
222
|
turn.userTurnContent = userTurn.userTurnMessage.content;
|
|
223
|
+
// The turn opens right after the history it was built on: its checkpoint
|
|
224
|
+
// boundary, never looked up again by the prompt's text.
|
|
225
|
+
turn.boundary = historyMessages.length;
|
|
209
226
|
turn.outgoing = outgoing;
|
|
210
227
|
precommitUserTurn(session, outgoing, historyMessages, input);
|
|
211
228
|
persistTurnPreflight(session, { turnToken, startedAt, checkpoint, askGeneration });
|
|
@@ -236,6 +253,7 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
|
|
|
236
253
|
deferredToolDelta: userTurn.deferredToolDelta,
|
|
237
254
|
goalReminder: userTurn.goalReminder,
|
|
238
255
|
workflowNotice: userTurn.workflowNotice,
|
|
256
|
+
promptSettingsNotice: userTurn.promptSettingsNotice,
|
|
239
257
|
orchestrationModeNotice: userTurn.orchestrationModeNotice,
|
|
240
258
|
workspaceNotice: userTurn.workspaceNotice,
|
|
241
259
|
setupNotice: userTurn.setupNotice,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
} from './pending-messages.mjs';
|
|
17
17
|
import { _getRuntimeEntry, markSessionCancelled, markSessionError } from './runtime-liveness.mjs';
|
|
18
18
|
import { SessionClosedError } from './session-errors.mjs';
|
|
19
|
-
import {
|
|
19
|
+
import { holdTurnUntilDurable, turnCoveredOnDisk } from './turn-durability.mjs';
|
|
20
20
|
import { attachFailedTurnCompletion } from './ask-turn-settle.mjs';
|
|
21
21
|
import { turnFailureRecord } from '../turn-failure.mjs';
|
|
22
22
|
import { transcriptRouteMetadataFields } from '../../../../shared/transcript-metadata.mjs';
|
|
@@ -97,6 +97,17 @@ async function persistFinalizedSession({ session, sessionId, generation, pending
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
/** Keep the failed turn's checkpoint until a landed save covers its
|
|
101
|
+
* finalized transcript (turn-durability.mjs); returns the save issued for
|
|
102
|
+
* it, or null when an earlier one already landed it. */
|
|
103
|
+
function holdFinalizedTurn({ sessionId, session, turnToken, generation }) {
|
|
104
|
+
const save = turnCoveredOnDisk(session, turnToken)
|
|
105
|
+
? null
|
|
106
|
+
: saveSessionAsync(session, { expectedGeneration: generation });
|
|
107
|
+
holdTurnUntilDurable({ sessionId, session, turnToken, generation, save });
|
|
108
|
+
return save;
|
|
109
|
+
}
|
|
110
|
+
|
|
100
111
|
/** A SessionClosedError unwind: keeps the interruption snapshot unless the
|
|
101
112
|
* runtime already closed, in which case the consumed queue entries are
|
|
102
113
|
* released untouched. */
|
|
@@ -119,14 +130,14 @@ async function finalizeCancelledTurn({
|
|
|
119
130
|
if (currentRuntime?.prepareCloseSnapshot === prepareCloseSnapshot) {
|
|
120
131
|
currentRuntime.prepareCloseSnapshot = null;
|
|
121
132
|
}
|
|
122
|
-
|
|
133
|
+
await persistFinalizedSession({
|
|
123
134
|
session,
|
|
124
135
|
sessionId,
|
|
125
136
|
generation,
|
|
126
137
|
pendingEntries: turn.pendingEntries,
|
|
127
138
|
promptSurvived: finalized.responsePreserved,
|
|
128
139
|
});
|
|
129
|
-
|
|
140
|
+
holdFinalizedTurn({ sessionId, session, turnToken: turnCheckpointToken, generation });
|
|
130
141
|
if (currentRuntime) currentRuntime.session = session;
|
|
131
142
|
markSessionCancelled(sessionId);
|
|
132
143
|
}
|
|
@@ -169,6 +180,9 @@ export async function finalizeAskTurnFailure({
|
|
|
169
180
|
if (session) {
|
|
170
181
|
session.liveTurnMessages = null;
|
|
171
182
|
delete session.activeTurnCheckpoint;
|
|
183
|
+
// Every record saved from here on carries this turn as finalized: a
|
|
184
|
+
// crash after one lands deletes the checkpoint instead of replaying it.
|
|
185
|
+
session.turnCoverage = turnCheckpointToken;
|
|
172
186
|
// The provider prefix snapshot commits per successful send INSIDE the
|
|
173
187
|
// turn, while the transcript unwinds to its pre-turn/finalized shape
|
|
174
188
|
// below. A surviving mid-turn snapshot flags every retry as
|
|
@@ -206,7 +220,8 @@ export async function finalizeAskTurnFailure({
|
|
|
206
220
|
// contract answers "did the provider produce output we must commit?" for
|
|
207
221
|
// every transport. Anthropic's stall/truncation errors carry neither
|
|
208
222
|
// liveTextEmitted nor unsafeToRetry — only partialContent/partialToolCalls
|
|
209
|
-
// —
|
|
223
|
+
// — so consulting the flags would drop the streamed summary from history on
|
|
224
|
+
// that provider.
|
|
210
225
|
const providerOutcome = readStreamOutcome(err);
|
|
211
226
|
const preserveProviderPartial =
|
|
212
227
|
restoredResetText ||
|
|
@@ -252,15 +267,16 @@ export async function finalizeAskTurnFailure({
|
|
|
252
267
|
releasePendingMessages(sessionId, turn.pendingEntries);
|
|
253
268
|
}
|
|
254
269
|
}
|
|
255
|
-
if (
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
270
|
+
if (session) {
|
|
271
|
+
const save = holdFinalizedTurn({ sessionId, session, turnToken: turnCheckpointToken, generation });
|
|
272
|
+
if (save && !errorStateDurable) {
|
|
273
|
+
try {
|
|
274
|
+
await settleAskCleanup(save);
|
|
275
|
+
} catch {
|
|
276
|
+
/* the checkpoint stays until a save covering the turn lands */
|
|
277
|
+
}
|
|
261
278
|
}
|
|
262
279
|
}
|
|
263
|
-
if (errorStateDurable) clearTurnCheckpoint(sessionId, turnCheckpointToken);
|
|
264
280
|
logAskError(sessionId, err, providerOutcome);
|
|
265
281
|
markSessionError(sessionId, err?.message ? err.message : String(err));
|
|
266
282
|
}
|
|
@@ -1,25 +1,50 @@
|
|
|
1
1
|
// manager/ask-turn-open.mjs
|
|
2
|
-
// Opening one turn:
|
|
2
|
+
// Opening one turn: settle the previous turn's durability and the durable
|
|
3
|
+
// base this turn opens on (settleTurnBase, awaited before anything below),
|
|
4
|
+
// load and reconcile the stored session and claim the
|
|
3
5
|
// runtime entry with a fresh abort controller (claimTurnRuntime), then arm
|
|
4
6
|
// the turn's durability — the crash-checkpoint scheduler and the close
|
|
5
7
|
// snapshot hook (armTurnDurability). Both are synchronous so closeSession()
|
|
6
8
|
// cannot interleave between load and registration.
|
|
7
9
|
import { randomUUID } from 'node:crypto';
|
|
8
|
-
import { loadSession
|
|
10
|
+
import { loadSession } from '../store.mjs';
|
|
11
|
+
import { durableTranscriptBase } from '../store/transcript-durability.mjs';
|
|
9
12
|
import { createAbortController } from '../../../../shared/abort-controller.mjs';
|
|
10
13
|
import { normalizeStaleCompactingStage } from './compaction-runner.mjs';
|
|
11
14
|
import { linkParentSignalToSession, markSessionAskStart, _touchRuntime } from './runtime-liveness.mjs';
|
|
12
15
|
import { SessionClosedError } from './session-errors.mjs';
|
|
13
16
|
import { ensureCodexWireSessionId, mintUuidV7 } from './session-id.mjs';
|
|
14
17
|
import { createTurnInterruptionTracker } from './turn-interruption.mjs';
|
|
15
|
-
import {
|
|
18
|
+
import { _recoverTurnCheckpointDurably, setAsideUnrecoveredCheckpoint } from './turn-checkpoint-recovery.mjs';
|
|
19
|
+
import { adoptDiskGeneration, awaitPreviousTurnDurable, ensureDurableTranscript } from './turn-durability.mjs';
|
|
16
20
|
import { emitAskSessionStart } from './ask-support.mjs';
|
|
21
|
+
import { applyHeldSessionRoute } from './session-lifecycle.mjs';
|
|
17
22
|
import { createAskTurnState, createCloseSnapshot, createTurnCheckpointScheduler } from './ask-turn-state.mjs';
|
|
18
23
|
|
|
24
|
+
/** Before a turn claims the session: the previous turn's finalized
|
|
25
|
+
* transcript is durably saved (its checkpoint deleted only then), a crashed
|
|
26
|
+
* turn's checkpoint is recovered (`recoverCheckpoint`, once per ask), and
|
|
27
|
+
* the transcript the turn opens on is the one a landed save holds — so the
|
|
28
|
+
* new checkpoint names a base that is on disk. Throws TurnPersistenceError
|
|
29
|
+
* when a save does not land; other sessions never wait on this one. */
|
|
30
|
+
export async function settleTurnBase(sessionId, { recoverCheckpoint }) {
|
|
31
|
+
await awaitPreviousTurnDurable(sessionId);
|
|
32
|
+
const session = loadSession(sessionId);
|
|
33
|
+
// claimTurnRuntime reports a missing or closed session.
|
|
34
|
+
if (!session || session.closed === true) return;
|
|
35
|
+
adoptDiskGeneration(session, sessionId);
|
|
36
|
+
if (recoverCheckpoint) _recoverTurnCheckpointDurably(session, sessionId);
|
|
37
|
+
await ensureDurableTranscript(session);
|
|
38
|
+
// This turn's checkpoint replaces the session's checkpoint file. Whatever
|
|
39
|
+
// is still there (a conflict, an unreadable header, a crashed turn this
|
|
40
|
+
// ask did not recover) is set aside first, never overwritten.
|
|
41
|
+
setAsideUnrecoveredCheckpoint(session, sessionId);
|
|
42
|
+
}
|
|
43
|
+
|
|
19
44
|
/** Loads the session for a new turn and reconciles its on-disk lifecycle:
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
function loadTurnSession(sessionId
|
|
45
|
+
* a stale compacting stage and split-brain re-adoption of a disk generation
|
|
46
|
+
* another surface bumped. */
|
|
47
|
+
function loadTurnSession(sessionId) {
|
|
23
48
|
const session = loadSession(sessionId);
|
|
24
49
|
if (!session) {
|
|
25
50
|
throw new Error(`Session "${sessionId}" not found`);
|
|
@@ -28,44 +53,21 @@ function loadTurnSession(sessionId, { recoverCheckpoint }) {
|
|
|
28
53
|
throw new SessionClosedError(sessionId, 'session already closed');
|
|
29
54
|
}
|
|
30
55
|
const codexWireSessionId = ensureCodexWireSessionId(session);
|
|
31
|
-
if (recoverCheckpoint) {
|
|
32
|
-
const recovery = recoverTurnCheckpoint(session);
|
|
33
|
-
if (recovery.changed) {
|
|
34
|
-
saveSession(session, {
|
|
35
|
-
sync: true,
|
|
36
|
-
expectedGeneration: session.generation,
|
|
37
|
-
});
|
|
38
|
-
if (recovery.turnToken) clearTurnCheckpoint(sessionId, recovery.turnToken);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
56
|
// A prior crash/partial-save during compaction may have pinned
|
|
42
57
|
// compaction.lastStage='compacting'. This ask is starting fresh, so
|
|
43
58
|
// recover the stale transient stage before the loop's pre-send compact
|
|
44
59
|
// path runs (it will overwrite lastStage with real telemetry).
|
|
45
60
|
normalizeStaleCompactingStage(session);
|
|
46
|
-
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
// while the conversation kept going here. Every save from this process
|
|
50
|
-
// would then be silently dropped by _shouldDrop's ownership rule and
|
|
51
|
-
// the on-disk transcript would freeze at the last landed save. A new
|
|
52
|
-
// ask on a NON-closed session is an explicit ownership claim: adopt
|
|
53
|
-
// the disk generation so this turn's commits land and heal the file.
|
|
54
|
-
const diskLifecycle = readSessionLifecycleFromDisk(sessionId);
|
|
55
|
-
if (
|
|
56
|
-
diskLifecycle &&
|
|
57
|
-
diskLifecycle.closed !== true &&
|
|
58
|
-
diskLifecycle.generation > (typeof session.generation === 'number' ? session.generation : 0)
|
|
59
|
-
) {
|
|
60
|
-
session.generation = diskLifecycle.generation;
|
|
61
|
-
}
|
|
61
|
+
adoptDiskGeneration(session, sessionId);
|
|
62
|
+
// A route saved while the previous turn ran applies from this turn.
|
|
63
|
+
applyHeldSessionRoute(session);
|
|
62
64
|
return { session, codexWireSessionId };
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
/** Loads the session and installs this turn's controller on the runtime
|
|
66
68
|
* entry, re-cascading any parent abort link and marking the ask started. */
|
|
67
|
-
export function claimTurnRuntime({ sessionId, askOpts,
|
|
68
|
-
const { session: preSession, codexWireSessionId } = loadTurnSession(sessionId
|
|
69
|
+
export function claimTurnRuntime({ sessionId, askOpts, emitStart }) {
|
|
70
|
+
const { session: preSession, codexWireSessionId } = loadTurnSession(sessionId);
|
|
69
71
|
const askGeneration = typeof preSession.generation === 'number' ? preSession.generation : 0;
|
|
70
72
|
const runtime = _touchRuntime(sessionId);
|
|
71
73
|
// Preserve any parent-abort link agent-dispatch established BEFORE we
|
|
@@ -121,6 +123,7 @@ export function armTurnDurability({
|
|
|
121
123
|
startedAt,
|
|
122
124
|
turn,
|
|
123
125
|
interruption,
|
|
126
|
+
base: durableTranscriptBase(preSession),
|
|
124
127
|
});
|
|
125
128
|
const prepareCloseSnapshot = createCloseSnapshot({ turn, interruption, checkpoint, runtime });
|
|
126
129
|
// closeSession is synchronous and generation-first by design. Expose a
|
|
@@ -9,6 +9,7 @@ import { positiveInt } from '../../../../shared/numbers.mjs';
|
|
|
9
9
|
import { appendAgentTrace } from '../../agent-trace.mjs';
|
|
10
10
|
import { snapshotPendingDeferredToolDelta } from '../../runtime-core/deferred-tool-delta.mjs';
|
|
11
11
|
import { snapshotPendingGoalReminder } from '../../runtime-core/goal-reminder.mjs';
|
|
12
|
+
import { beginTodoTurn, todoStartReminder } from '../loop/no-tool-turn/todo-check.mjs';
|
|
12
13
|
import { resolveSessionContextMeta } from './context-meta.mjs';
|
|
13
14
|
import {
|
|
14
15
|
promptContentText,
|
|
@@ -20,6 +21,7 @@ import {
|
|
|
20
21
|
snapshotPendingSetupNotice,
|
|
21
22
|
} from './prompt-utils.mjs';
|
|
22
23
|
import { snapshotPendingWorkflowNotice } from './workflow-switch-notice.mjs';
|
|
24
|
+
import { snapshotPendingPromptSettingsNotice } from './prompt-settings.mjs';
|
|
23
25
|
import { snapshotPendingOrchestrationModeNotice } from './orchestration-mode-switch-notice.mjs';
|
|
24
26
|
import { buildAgentListingNotice } from './agent-listing-notice.mjs';
|
|
25
27
|
import { codexWireSendOpts } from './session-id.mjs';
|
|
@@ -175,6 +177,12 @@ export async function buildUserTurn({
|
|
|
175
177
|
}
|
|
176
178
|
const currentTimeBlock = buildCurrentTimeBlock(prompt);
|
|
177
179
|
const deferredToolDelta = snapshotPendingDeferredToolDelta(session);
|
|
180
|
+
// A real prompt (no runtime source: not a Goal turn or task notification)
|
|
181
|
+
// opens a new todo reminder cycle; every turn clears the last turn's waits.
|
|
182
|
+
const genuinePrompt = !turnPromptSource?.source;
|
|
183
|
+
beginTodoTurn(session, { genuine: genuinePrompt });
|
|
184
|
+
// An agent's new brief or follow-up with no open list asks for one, once.
|
|
185
|
+
const todoStart = genuinePrompt ? todoStartReminder(session) : null;
|
|
178
186
|
// Read paused state after hydration and queue selection, not at
|
|
179
187
|
// input intake: either can precede the previous turn's pause.
|
|
180
188
|
// This supplies context only; it never resumes the Goal.
|
|
@@ -192,8 +200,11 @@ export async function buildUserTurn({
|
|
|
192
200
|
const orchestrationModeNotice = snapshotPendingOrchestrationModeNotice(session);
|
|
193
201
|
// Agents enabled or switched off since the conversation was last told.
|
|
194
202
|
const agentListingNotice = buildAgentListingNotice(session, currentAgents);
|
|
203
|
+
// Prompt-shaping settings changed since the prompt was built (told once).
|
|
204
|
+
const promptSettingsNotice = snapshotPendingPromptSettingsNotice(session);
|
|
195
205
|
const reminderBlock = [
|
|
196
206
|
workflowNotice?.content || '',
|
|
207
|
+
promptSettingsNotice?.content || '',
|
|
197
208
|
orchestrationModeNotice?.content || '',
|
|
198
209
|
agentListingNotice?.content || '',
|
|
199
210
|
workspaceNotice?.content || '',
|
|
@@ -201,6 +212,7 @@ export async function buildUserTurn({
|
|
|
201
212
|
currentTimeBlock ? `<system-reminder>\n# Current Time\n${currentTimeBlock}\n</system-reminder>` : '',
|
|
202
213
|
deferredToolDelta?.content || '',
|
|
203
214
|
goalReminder?.content || '',
|
|
215
|
+
todoStart || '',
|
|
204
216
|
]
|
|
205
217
|
.filter(Boolean)
|
|
206
218
|
.join('\n\n');
|
|
@@ -212,6 +224,8 @@ export async function buildUserTurn({
|
|
|
212
224
|
...(effortConfiguration ? { effortConfiguration } : {}),
|
|
213
225
|
// What its reminder told, read back by later turns (agent-listing-notice.mjs).
|
|
214
226
|
...(agentListingNotice ? { agentListing: agentListingNotice.meta } : {}),
|
|
227
|
+
// A retry resubmits this message as is: it acknowledges the same notice.
|
|
228
|
+
...(promptSettingsNotice ? { promptSettingsNoticeRevision: promptSettingsNotice.revision } : {}),
|
|
215
229
|
};
|
|
216
230
|
const userTurnMessage = withRuntimeUserContext(
|
|
217
231
|
{
|
|
@@ -228,6 +242,7 @@ export async function buildUserTurn({
|
|
|
228
242
|
goalReminder,
|
|
229
243
|
workflowNotice,
|
|
230
244
|
orchestrationModeNotice,
|
|
245
|
+
promptSettingsNotice,
|
|
231
246
|
agentListingNotice,
|
|
232
247
|
workspaceNotice,
|
|
233
248
|
setupNotice,
|