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
|
@@ -22,6 +22,13 @@ process.env.MIXDOG_DAEMON_HOST = '1';
|
|
|
22
22
|
await import('../runtime/shared/uv-threadpool-boot.mjs');
|
|
23
23
|
// Before anything can import sharp: Electron on Linux must use its wasm build.
|
|
24
24
|
await import('../runtime/shared/sharp-electron-linux.mjs');
|
|
25
|
+
// Proxy variables (the user's, or the desktop's system proxy): fetch goes
|
|
26
|
+
// through the proxy while local and LAN hosts stay direct. The system proxy
|
|
27
|
+
// (handed over by the CLI or desktop that started this daemon, or read on
|
|
28
|
+
// Windows when started alone) is applied to this process's fetch only; its
|
|
29
|
+
// handoff variable is removed here so no child inherits it.
|
|
30
|
+
(await import('../runtime/shared/llm/system-proxy.mjs')).adoptSystemProxy();
|
|
31
|
+
(await import('../runtime/shared/llm/http-agent.mjs')).adoptEnvProxy();
|
|
25
32
|
|
|
26
33
|
// No V8 compile cache here, on purpose. Measured on this runtime: a cache hit
|
|
27
34
|
// saves nothing (spawn→ready 316-347ms with the cache vs 318-323ms without,
|
|
@@ -834,6 +841,50 @@ async function startChannelFrontDoor({ channelsRuntime, bootPhases }) {
|
|
|
834
841
|
return bootPhases.measure('channel-transport-start', () => transport.start());
|
|
835
842
|
}
|
|
836
843
|
|
|
844
|
+
async function startDaemonMaintenance() {
|
|
845
|
+
const [schedule, liveness, { IN_FLIGHT_STAGES }] = await Promise.all([
|
|
846
|
+
import('../runtime/shared/maintenance-schedule.mjs'),
|
|
847
|
+
import('../runtime/agent/orchestrator/session/manager/runtime-liveness.mjs'),
|
|
848
|
+
import('../runtime/agent/orchestrator/session/manager/runtime-state.mjs'),
|
|
849
|
+
]);
|
|
850
|
+
const entries = () => [...liveness._runtimeEntries()];
|
|
851
|
+
schedule.registerMaintenanceIdleProbe(
|
|
852
|
+
() =>
|
|
853
|
+
!entries().some(
|
|
854
|
+
([, entry]) => (entry?.controller && !entry.controller.signal?.aborted) || IN_FLIGHT_STAGES.has(entry?.stage)
|
|
855
|
+
)
|
|
856
|
+
);
|
|
857
|
+
schedule.registerMaintenanceTask(
|
|
858
|
+
'worktree-cleanup',
|
|
859
|
+
async () => {
|
|
860
|
+
const maintenance = await import('../runtime/shared/worktrees/maintenance.mjs');
|
|
861
|
+
// Every session with an open runtime entry here counts as live, read
|
|
862
|
+
// again right before each removal (one that opened meanwhile keeps its folder).
|
|
863
|
+
const liveSessionIds = () =>
|
|
864
|
+
entries()
|
|
865
|
+
.filter(([, entry]) => entry && entry.closed !== true)
|
|
866
|
+
.map(([id]) => id);
|
|
867
|
+
const report = await maintenance.runWorktreeCleanup({
|
|
868
|
+
liveSessionIds: liveSessionIds(),
|
|
869
|
+
currentLiveSessionIds: liveSessionIds,
|
|
870
|
+
});
|
|
871
|
+
const incomplete = report.kept.filter((item) => item.reason === 'incomplete');
|
|
872
|
+
if (report.removed.length || report.errors.length || incomplete.length) {
|
|
873
|
+
log(
|
|
874
|
+
`worktree cleanup: removed ${report.removed.length}, incomplete ${incomplete.length}` +
|
|
875
|
+
`${incomplete.length ? ` (${incomplete.map((item) => item.id).join(', ')})` : ''}, errors ${report.errors.length}`
|
|
876
|
+
);
|
|
877
|
+
}
|
|
878
|
+
},
|
|
879
|
+
{
|
|
880
|
+
intervalMs: 60 * 60_000,
|
|
881
|
+
initialDelayMs: 3 * 60_000,
|
|
882
|
+
onError: (error) => log(`worktree cleanup failed: ${error?.message || error}`),
|
|
883
|
+
}
|
|
884
|
+
);
|
|
885
|
+
schedule.startMaintenanceSchedule();
|
|
886
|
+
}
|
|
887
|
+
|
|
837
888
|
async function main() {
|
|
838
889
|
const startedAt = performance.now();
|
|
839
890
|
const bootPhases = createBootPhaseProfiler({ log, startedAt });
|
|
@@ -858,14 +909,19 @@ async function main() {
|
|
|
858
909
|
.then((maintenance) => maintenance.reconcileWorktreesAtStartup())
|
|
859
910
|
.then((report) => {
|
|
860
911
|
const changed = report.removed.length + report.recovered.length + report.pruned.length;
|
|
861
|
-
|
|
912
|
+
const incomplete = report.kept.filter((item) => item.reason === 'incomplete').length;
|
|
913
|
+
if (changed || incomplete || report.errors.length) {
|
|
862
914
|
log(
|
|
863
915
|
`worktree reconcile: removed ${report.removed.length}, recovered ${report.recovered.length}, ` +
|
|
864
|
-
`pruned ${report.pruned.length}, errors ${report.errors.length}`
|
|
916
|
+
`pruned ${report.pruned.length}, incomplete ${incomplete}, errors ${report.errors.length}`
|
|
865
917
|
);
|
|
866
918
|
}
|
|
867
919
|
})
|
|
868
920
|
.catch((error) => log(`worktree reconcile failed: ${error?.message || error}`));
|
|
921
|
+
// Idle-time housekeeping (shared/maintenance-schedule.mjs): the worktree
|
|
922
|
+
// cleanup's count/age limits and archive rules once the desktop (favorites)
|
|
923
|
+
// is attached, then hourly while no session is mid-turn.
|
|
924
|
+
void startDaemonMaintenance().catch((error) => log(`maintenance schedule failed: ${error?.message || error}`));
|
|
869
925
|
// The daemon owns prompt attachments; its census runs off the boot path
|
|
870
926
|
// (first attempt after the store's start delay, then per its interval).
|
|
871
927
|
void import('../runtime/attachments/store.mjs').then((store) => store.startAttachmentGc()).catch(() => {});
|
|
@@ -1036,6 +1092,9 @@ async function main() {
|
|
|
1036
1092
|
submit: async (sessionId, prompt, options) =>
|
|
1037
1093
|
(await sessionService.submitSession({ sessionId, prompt, options }))?.accepted === true,
|
|
1038
1094
|
abort: (sessionId) => sessionService.abortSession({ sessionId }),
|
|
1095
|
+
// A routine's executor sub-agent, run to its end before its bot is woken
|
|
1096
|
+
// (routine-executor.mjs); resolves `{ sessionId, content }`.
|
|
1097
|
+
runAgent: (args, context, options) => agentControl.runForeground(args, context, options),
|
|
1039
1098
|
});
|
|
1040
1099
|
// A bot's next turn, whatever starts it, first reads the progress updates
|
|
1041
1100
|
// queued for its thread (they wake nobody on their own).
|
|
@@ -4,6 +4,7 @@ import { sanitizeForWire } from './session-wire-values.mjs';
|
|
|
4
4
|
import { annotateSpan } from '../runtime/shared/slow-span.mjs';
|
|
5
5
|
import { modelProxyClientMode } from '../runtime/shared/model-proxy-mode.mjs';
|
|
6
6
|
import { getModelProxyChannel } from '../runtime/agent/orchestrator/providers/model-proxy-channel.mjs';
|
|
7
|
+
import { SYSTEM_PROXY_REQUEST_EVENT } from '../runtime/shared/llm/system-proxy.mjs';
|
|
7
8
|
|
|
8
9
|
const requireDesktopModule = createRequire(import.meta.url);
|
|
9
10
|
|
|
@@ -40,6 +41,8 @@ function desktopEventKey(desktopId, message) {
|
|
|
40
41
|
let terminalId = '';
|
|
41
42
|
if (name === 'terminal-data') terminalId = String(message?.value?.id || '');
|
|
42
43
|
else if (name === 'session-runtime-released') terminalId = String(message?.value?.sessionId || '');
|
|
44
|
+
// Each lookup waits for its own answer: a backed-up stream must not drop one.
|
|
45
|
+
else if (name === SYSTEM_PROXY_REQUEST_EVENT) terminalId = String(message?.value?.id || '');
|
|
43
46
|
return `desktop-event:${desktopId}:${kind}:${name}${terminalId ? `:${terminalId}` : ''}`;
|
|
44
47
|
}
|
|
45
48
|
return `desktop-event:${desktopId}:${kind}`;
|
|
@@ -236,6 +239,12 @@ export class DesktopServiceRegistry {
|
|
|
236
239
|
}
|
|
237
240
|
callArgs = [callArgs[0], callArgs[1], epoch];
|
|
238
241
|
}
|
|
242
|
+
// The resolver stays attached while this client is: its epoch is released with it.
|
|
243
|
+
if (name === 'invokeDesktopOperation' && callArgs[0] === 'systemProxyAttach') {
|
|
244
|
+
const epoch = token ? service.visibilityEpochs.get(token) : undefined;
|
|
245
|
+
if (epoch === undefined) throw new Error('desktop service client is not initialized');
|
|
246
|
+
callArgs = ['systemProxyAttach', [epoch]];
|
|
247
|
+
}
|
|
239
248
|
// `[slow-op] desktop.invoke` names the call it timed: a desktop operation
|
|
240
249
|
// (Git reads) or a session capability, not only the generic route.
|
|
241
250
|
const target = name === 'invokeDesktopOperation' || name === 'invokeCapability' ? String(args?.[0] || '') : '';
|
|
@@ -17,6 +17,7 @@ import { createToolCardResults } from '../tui/session/tool-card-results.mjs';
|
|
|
17
17
|
import { createAgentJobFeed } from '../tui/session/agent-job-feed.mjs';
|
|
18
18
|
import { createWorktreeSetupNotices } from '../tui/session/worktree-setup-notice.mjs';
|
|
19
19
|
import { createContextState } from '../tui/session/context-state.mjs';
|
|
20
|
+
import { onTodoChange, todoSnapshot } from '../runtime/agent/orchestrator/runtime-core/todo-list.mjs';
|
|
20
21
|
import { createSessionFlow } from '../tui/session/session-flow.mjs';
|
|
21
22
|
import { createRunTurn } from '../tui/session/turn.mjs';
|
|
22
23
|
import { createQuotaResumeLane } from '../tui/session/quota-resume.mjs';
|
|
@@ -39,6 +40,7 @@ import {
|
|
|
39
40
|
tuiDebug,
|
|
40
41
|
nextId,
|
|
41
42
|
createTranscriptSpillBuffer,
|
|
43
|
+
spillWarningToStderr,
|
|
42
44
|
sweepStaleTranscriptSpillDirsOnce,
|
|
43
45
|
} from '../tui/session/transcript-spill.mjs';
|
|
44
46
|
import { importInStages } from './staged-import.mjs';
|
|
@@ -146,6 +148,9 @@ export function createRuntimePulse({
|
|
|
146
148
|
const pulse = () => {
|
|
147
149
|
if (flags.disposed) return;
|
|
148
150
|
if (flags.pendingSessionReset) return;
|
|
151
|
+
// A closed conversation has no session to read: republishing would blank
|
|
152
|
+
// its last todo and Goal for anyone still viewing it.
|
|
153
|
+
if (flags.admission === 'terminal') return;
|
|
149
154
|
syncContextStats({ allowEstimated: true });
|
|
150
155
|
publishChanged({
|
|
151
156
|
...routeState(),
|
|
@@ -278,7 +283,8 @@ export async function createLocalSessionRuntime({
|
|
|
278
283
|
const { getState, getPublishedState, set, flushEmit, flushEmitImmediate } = store;
|
|
279
284
|
|
|
280
285
|
const itemIndexById = new Map();
|
|
281
|
-
|
|
286
|
+
// stderr is daemon.log in the daemon: a pinned spill must not stay silent.
|
|
287
|
+
const transcriptSpill = createTranscriptSpillBuffer({ onWarning: spillWarningToStderr });
|
|
282
288
|
const { markToolCallActive, markToolCallDone, clearActiveToolSummary, resetActiveToolCalls } =
|
|
283
289
|
createActiveToolTracker({ getState, set });
|
|
284
290
|
const {
|
|
@@ -383,6 +389,12 @@ export async function createLocalSessionRuntime({
|
|
|
383
389
|
displayedExecutionNotificationKeys,
|
|
384
390
|
pushNotice,
|
|
385
391
|
itemIndexById,
|
|
392
|
+
// The status line's context gauge after an empty session's settings reconcile.
|
|
393
|
+
refreshContextStats: () => {
|
|
394
|
+
if (flags.disposed || flags.pendingSessionReset) return;
|
|
395
|
+
syncContextStats({ allowEstimated: true });
|
|
396
|
+
set({ stats: { ...getState().stats } });
|
|
397
|
+
},
|
|
386
398
|
});
|
|
387
399
|
lifecycle.unsubscribeRuntimeNotifications = subscribeRuntimeNotifications();
|
|
388
400
|
if (typeof runtime.onWorktreeSetup === 'function') {
|
|
@@ -398,6 +410,12 @@ export async function createLocalSessionRuntime({
|
|
|
398
410
|
});
|
|
399
411
|
}
|
|
400
412
|
|
|
413
|
+
// A todo call republishes the list at once, not on the next 2s pulse.
|
|
414
|
+
lifecycle.unsubscribeTodo = onTodoChange(({ sessionId }) => {
|
|
415
|
+
if (flags.disposed || flags.pendingSessionReset || !sessionId || sessionId !== runtime.id) return;
|
|
416
|
+
set({ todo: todoSnapshot(runtime.session) });
|
|
417
|
+
});
|
|
418
|
+
|
|
401
419
|
const { patchToolCardResult, flushToolResults } = createToolCardResults({
|
|
402
420
|
getState,
|
|
403
421
|
set,
|
|
@@ -457,6 +475,8 @@ export async function createLocalSessionRuntime({
|
|
|
457
475
|
snapshotTranscriptSpill: () => transcriptSpill.snapshot(),
|
|
458
476
|
restoreTranscriptSpill: (snapshot) => transcriptSpill.restoreSnapshot(snapshot),
|
|
459
477
|
releaseTranscriptSpill: (snapshot) => transcriptSpill.releaseSnapshot(snapshot),
|
|
478
|
+
// Paged views read the rows spilled out of memory (transcript-window.mjs).
|
|
479
|
+
readSpilledTranscript: (range) => transcriptSpill.readSpilled(range),
|
|
460
480
|
presentNextToolApproval,
|
|
461
481
|
finishToolApproval,
|
|
462
482
|
denyAllToolApprovals,
|
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
// owner that never published, the newest candidate's exit and first stderr
|
|
5
5
|
// error — so the desktop error card's details name the cause, not only the
|
|
6
6
|
// symptom.
|
|
7
|
-
|
|
7
|
+
const DAEMON_UNAVAILABLE_MESSAGE = 'daemon session endpoint is unavailable';
|
|
8
8
|
|
|
9
9
|
function exitCodeText(code) {
|
|
10
10
|
// Windows reports NTSTATUS crash codes as large unsigned values.
|
|
11
|
+
// 0xE0000008 is Chromium's kOomExceptionCode; 134 is a V8 fatal error (abort).
|
|
12
|
+
if (code === 0xe0000008 || code === -536870904) return `${code === -536870904 ? code : '0xE0000008'} (out of memory)`;
|
|
13
|
+
if (code === 134) return '134 (V8 fatal error (JavaScript heap out of memory))';
|
|
11
14
|
return Number.isSafeInteger(code) && code > 0x7fffffff ? `0x${code.toString(16).toUpperCase()}` : String(code);
|
|
12
15
|
}
|
|
13
16
|
|
|
@@ -18,6 +18,7 @@ import { readSingletonOwner } from '../runtime/shared/singleton-owner.mjs';
|
|
|
18
18
|
import { isPidAlive } from '../runtime/shared/pid-liveness.mjs';
|
|
19
19
|
import { resolveRuntimeRoot } from '../runtime/shared/runtime-root.mjs';
|
|
20
20
|
import { withHeapCap } from '../runtime/shared/heap-cap.mjs';
|
|
21
|
+
import { systemProxyHandoffEnv } from '../runtime/shared/llm/system-proxy.mjs';
|
|
21
22
|
import { daemonCrashCaptureDir, daemonDataDir } from '../session-runtime/services/daemon-crash-capture.mjs';
|
|
22
23
|
import { forkDaemonCandidate } from '../session-runtime/services/daemon-candidate.mjs';
|
|
23
24
|
import { daemonOwnerIsStale, proveDaemonOwnerRecord } from './daemon-owner.mjs';
|
|
@@ -338,7 +339,7 @@ async function replaceLowerDaemon(discovery, initialHealth, { log, onUpgradeWait
|
|
|
338
339
|
// PostgreSQL stop included — so the launcher's quit stops it first.
|
|
339
340
|
const inTreeDaemons = new Map();
|
|
340
341
|
|
|
341
|
-
export function spawnDaemonCandidate({ cwd, log, timeoutMs = 30_000, entry = daemonEntry() }) {
|
|
342
|
+
export async function spawnDaemonCandidate({ cwd, log, timeoutMs = 30_000, entry = daemonEntry() }) {
|
|
342
343
|
const t0 = performance.now();
|
|
343
344
|
const at = () => Math.round(performance.now() - t0);
|
|
344
345
|
const detached = daemonShouldDetach();
|
|
@@ -353,6 +354,9 @@ export function spawnDaemonCandidate({ cwd, log, timeoutMs = 30_000, entry = dae
|
|
|
353
354
|
detached,
|
|
354
355
|
env: {
|
|
355
356
|
...process.env,
|
|
357
|
+
// The fallback system proxy this launcher settled (the CLI), not as
|
|
358
|
+
// standard proxy env; a desktop is asked per origin once attached.
|
|
359
|
+
...systemProxyHandoffEnv(),
|
|
356
360
|
ELECTRON_RUN_AS_NODE: '1',
|
|
357
361
|
MIXDOG_DAEMON_HOST: '1',
|
|
358
362
|
MIXDOG_RUNTIME_ROOT: resolveRuntimeRoot(),
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
// Session snapshots are latest-wins under backpressure;
|
|
2
|
-
//
|
|
1
|
+
// Session snapshots are latest-wins under backpressure; a session patch chains
|
|
2
|
+
// onto the queued frame it builds on, and terminal byte streams concatenate.
|
|
3
|
+
// Keep socket ownership and bounded backlog policy here.
|
|
3
4
|
const TERMINAL_BACKLOG_MAX_CHARS = 256 * 1024;
|
|
5
|
+
const KEEPALIVE_MS = 15_000;
|
|
4
6
|
|
|
5
7
|
function terminalDataFrame(frame) {
|
|
6
8
|
return frame?.type === 'desktop-event' &&
|
|
@@ -26,13 +28,28 @@ function mergePendingFrame(existing, frame, json) {
|
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
function pendingEntry(frame, json, queuedAt) {
|
|
29
|
-
|
|
31
|
+
const sse = `data: ${json}\n\n`;
|
|
32
|
+
return { frame, sse, bytes: Buffer.byteLength(sse), queuedAt };
|
|
30
33
|
}
|
|
31
34
|
|
|
32
35
|
function isResyncMarker(frame) {
|
|
33
36
|
return frame?.resyncRequired === true || frame?.message?.resyncRequired === true;
|
|
34
37
|
}
|
|
35
38
|
|
|
39
|
+
// A patch builds on the frame queued before it for the same key. Replacing
|
|
40
|
+
// that frame hands the receiver a lane it cannot decode, and the resync it
|
|
41
|
+
// asks for re-sends the full snapshot into the same backlog.
|
|
42
|
+
function isPatchFrame(frame) {
|
|
43
|
+
if (isResyncMarker(frame)) return false;
|
|
44
|
+
if (frame?.type === 'session-state') return Boolean(frame.patch) && Number.isSafeInteger(frame.baseRevision);
|
|
45
|
+
const wire = frame?.type === 'desktop-event' && frame.message?.kind === 'session-state' ? frame.message.wire : null;
|
|
46
|
+
return Boolean(wire?.__itemsPatch);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function readTraceIdOf(frame) {
|
|
50
|
+
return frame?.readTraceId ?? frame?.message?.readTraceId;
|
|
51
|
+
}
|
|
52
|
+
|
|
36
53
|
function resyncEntry(frame) {
|
|
37
54
|
if (frame?.type === 'desktop-event' && frame.message?.kind === 'session-state' && frame.message.sessionId) {
|
|
38
55
|
// The desktop decoder cannot apply a patch against base -2, so it resets
|
|
@@ -116,13 +133,39 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
116
133
|
} catch {}
|
|
117
134
|
}
|
|
118
135
|
|
|
136
|
+
function pause(client) {
|
|
137
|
+
if (!client.paused) client.pausedAt = nowMs();
|
|
138
|
+
client.paused = true;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// A stream paused across a keepalive period: bytes still buffered mean the
|
|
142
|
+
// consumer stopped reading; none buffered means a drain that never fired.
|
|
143
|
+
function reportStall(client, res) {
|
|
144
|
+
if (typeof onDiagnostic !== 'function') return;
|
|
145
|
+
const atMs = nowMs();
|
|
146
|
+
if (atMs - client.pausedAt < KEEPALIVE_MS) return;
|
|
147
|
+
try {
|
|
148
|
+
onDiagnostic({
|
|
149
|
+
stage: 'stream-stalled',
|
|
150
|
+
atMs,
|
|
151
|
+
pausedMs: atMs - client.pausedAt,
|
|
152
|
+
bufferedBytes: res.writableLength,
|
|
153
|
+
needDrain: res.writableNeedDrain,
|
|
154
|
+
pendingBytes: client.pendingBytes || 0,
|
|
155
|
+
maxPendingBytes,
|
|
156
|
+
});
|
|
157
|
+
} catch {
|
|
158
|
+
/* A diagnostic failure cannot change backpressure. */
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
119
162
|
function flushPending(client) {
|
|
120
163
|
while (client.sse && !client.paused && client.pending.size > 0) {
|
|
121
164
|
const [key, entry] = client.pending.entries().next().value;
|
|
122
165
|
client.pending.delete(key);
|
|
123
166
|
client.pendingBytes = Math.max(0, client.pendingBytes - (entry.bytes || 0));
|
|
124
167
|
try {
|
|
125
|
-
if (client.sse.write(
|
|
168
|
+
if (client.sse.write(entry.sse) === false) pause(client);
|
|
126
169
|
traceFrame(client, entry.frame, 'stream-write', entry);
|
|
127
170
|
} catch {
|
|
128
171
|
traceFrame(client, entry.frame, 'stream-write-failed', entry, true);
|
|
@@ -144,13 +187,18 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
144
187
|
client.pending.set(key, entry);
|
|
145
188
|
client.pendingBytes += entry.bytes || 0;
|
|
146
189
|
traceFrame(client, entry.frame, 'stream-queued', entry);
|
|
190
|
+
boundPending(client, key);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function boundPending(client, key) {
|
|
147
194
|
// The cap bounds accumulated backlog: older entries collapse to resync
|
|
148
195
|
// markers or drop, oldest first. The newest frame is always admitted, so a
|
|
149
196
|
// snapshot larger than the cap still reaches a client with no backlog, and
|
|
150
197
|
// markers are kept so a receiver always learns what it missed.
|
|
151
198
|
for (const [oldestKey, oldest] of client.pending) {
|
|
152
199
|
if (client.pendingBytes <= maxPendingBytes) break;
|
|
153
|
-
|
|
200
|
+
// Only a single newest frame is exempt: a patch chain is backlog too.
|
|
201
|
+
if ((oldestKey === key && !oldest.chained) || isResyncMarker(oldest.frame)) continue;
|
|
154
202
|
const marker = resyncEntry(oldest.frame);
|
|
155
203
|
if (marker && marker.bytes < oldest.bytes) {
|
|
156
204
|
traceFrame(client, oldest.frame, 'stream-resync-marker', oldest, true);
|
|
@@ -166,7 +214,26 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
166
214
|
}
|
|
167
215
|
|
|
168
216
|
function queueFrame(client, key, frame, json) {
|
|
169
|
-
const
|
|
217
|
+
const existing = client.pending.get(key);
|
|
218
|
+
if (existing && isPatchFrame(frame)) {
|
|
219
|
+
// A queued marker already makes the receiver fetch a fresh full
|
|
220
|
+
// snapshot, which supersedes every patch issued before it.
|
|
221
|
+
if (isResyncMarker(existing.frame)) return;
|
|
222
|
+
const next = pendingEntry(frame, json, nowMs());
|
|
223
|
+
// Map.set on a present key keeps its place: the chain leaves with its base.
|
|
224
|
+
client.pending.set(key, {
|
|
225
|
+
frame: readTraceIdOf(existing.frame) ? existing.frame : frame,
|
|
226
|
+
sse: existing.sse + next.sse,
|
|
227
|
+
bytes: existing.bytes + next.bytes,
|
|
228
|
+
queuedAt: existing.queuedAt,
|
|
229
|
+
chained: true,
|
|
230
|
+
});
|
|
231
|
+
client.pendingBytes += next.bytes;
|
|
232
|
+
traceFrame(client, frame, 'stream-queued', next);
|
|
233
|
+
boundPending(client, key);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const merged = mergePendingFrame(existing, frame, json);
|
|
170
237
|
setPending(client, key, pendingEntry(merged.frame, merged.json, nowMs()));
|
|
171
238
|
}
|
|
172
239
|
|
|
@@ -177,7 +244,7 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
177
244
|
return;
|
|
178
245
|
}
|
|
179
246
|
try {
|
|
180
|
-
if (client.sse.write(`data: ${json}\n\n`) === false) client
|
|
247
|
+
if (client.sse.write(`data: ${json}\n\n`) === false) pause(client);
|
|
181
248
|
traceFrame(client, frame, 'stream-write');
|
|
182
249
|
} catch {
|
|
183
250
|
traceFrame(client, frame, 'stream-write-failed', {}, true);
|
|
@@ -221,7 +288,8 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
221
288
|
const paused = res.write(': attached\n\n') === false;
|
|
222
289
|
const previous = client.sse;
|
|
223
290
|
client.sse = res;
|
|
224
|
-
client.paused =
|
|
291
|
+
client.paused = false;
|
|
292
|
+
if (paused) pause(client);
|
|
225
293
|
client.lastSeen = nowMs();
|
|
226
294
|
// Replacement transfers ownership before closing the old stream, so its
|
|
227
295
|
// close/error callbacks cannot detach the new response.
|
|
@@ -252,13 +320,17 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
252
320
|
res.on('close', cleanup);
|
|
253
321
|
res.on('error', cleanup);
|
|
254
322
|
keepAlive = setInterval(() => {
|
|
255
|
-
if (client.sse !== res
|
|
323
|
+
if (client.sse !== res) return;
|
|
324
|
+
if (client.paused) {
|
|
325
|
+
reportStall(client, res);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
256
328
|
try {
|
|
257
|
-
if (res.write(': ka\n\n') === false) client
|
|
329
|
+
if (res.write(': ka\n\n') === false) pause(client);
|
|
258
330
|
} catch {
|
|
259
331
|
retireStream(res);
|
|
260
332
|
}
|
|
261
|
-
},
|
|
333
|
+
}, KEEPALIVE_MS);
|
|
262
334
|
keepAlive.unref?.();
|
|
263
335
|
flushPending(client);
|
|
264
336
|
return true;
|
|
@@ -12,10 +12,13 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
12
12
|
'agentDefinitionPresence',
|
|
13
13
|
'archivedAgentIdentities',
|
|
14
14
|
'getAgentDefinition',
|
|
15
|
+
'listInstructionFiles',
|
|
16
|
+
'getInstructionFile',
|
|
15
17
|
'getAgentAvatarImage',
|
|
16
18
|
'getAgentConnectors',
|
|
17
19
|
'getProjectConnectors',
|
|
18
20
|
'getAgentAlwaysAllowedTools',
|
|
21
|
+
'getAgentConnectorTools',
|
|
19
22
|
'getAgentPermissions',
|
|
20
23
|
'listConnectors',
|
|
21
24
|
'listConnectorTools',
|
|
@@ -81,6 +84,8 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
81
84
|
'getBranchMenu',
|
|
82
85
|
'getProjectBranchMenu',
|
|
83
86
|
'listWorktrees',
|
|
87
|
+
'previewWorktreeCleanup',
|
|
88
|
+
'getSessionWorktreeWork',
|
|
84
89
|
'hooksStatus',
|
|
85
90
|
'inheritancePreflight',
|
|
86
91
|
'listAgents',
|
|
@@ -94,6 +99,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
94
99
|
'listWebSearchModels',
|
|
95
100
|
'listThemes',
|
|
96
101
|
'listShellJobs',
|
|
102
|
+
'listStoppableShellJobs',
|
|
97
103
|
'listWorkflows',
|
|
98
104
|
'mcpStatus',
|
|
99
105
|
'pluginsStatus',
|
|
@@ -107,6 +113,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
107
113
|
export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
108
114
|
'addHookRule',
|
|
109
115
|
'addMcpServer',
|
|
116
|
+
'addConnectorAccount',
|
|
110
117
|
'addPlugin',
|
|
111
118
|
'addSkill',
|
|
112
119
|
'agentControl',
|
|
@@ -133,6 +140,8 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
133
140
|
'deleteAgentDefinition',
|
|
134
141
|
'restoreAgentDefinition',
|
|
135
142
|
'purgeAgentDefinition',
|
|
143
|
+
'saveInstructionFile',
|
|
144
|
+
'resetInstructionFile',
|
|
136
145
|
'deleteHookRule',
|
|
137
146
|
'deleteMediaAsset',
|
|
138
147
|
'deleteMediaAssets',
|
|
@@ -146,6 +155,9 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
146
155
|
'checkCustomProviderKeyEnv',
|
|
147
156
|
'discoverCustomProviderModels',
|
|
148
157
|
'deleteSession',
|
|
158
|
+
// The desktop's auto-delete: configureSession routes it through the turn
|
|
159
|
+
// gate (session-action.mjs deleteIdleSession), never the generic lane.
|
|
160
|
+
'deleteSessionIfIdle',
|
|
149
161
|
'deleteWebhook',
|
|
150
162
|
'deleteWorkflow',
|
|
151
163
|
'enablePluginMcp',
|
|
@@ -269,6 +281,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
269
281
|
'startConversationImport',
|
|
270
282
|
'startMediaJob',
|
|
271
283
|
'stopShellJob',
|
|
284
|
+
'stopShellJobs',
|
|
272
285
|
'releaseShellJob',
|
|
273
286
|
'switchContext',
|
|
274
287
|
'taskControl',
|
|
@@ -289,6 +302,8 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
289
302
|
'mergeWorkspace',
|
|
290
303
|
'removeWorktree',
|
|
291
304
|
'pruneWorktrees',
|
|
305
|
+
'deleteWorktree',
|
|
306
|
+
'setArchivedSessionWorktrees',
|
|
292
307
|
]);
|
|
293
308
|
|
|
294
309
|
export const SESSION_READ_ACTION_SET = new Set(SESSION_READ_ACTIONS);
|
|
@@ -4,21 +4,13 @@
|
|
|
4
4
|
// on the model it started on). The latest saved route wins. A thread no
|
|
5
5
|
// runtime hosts keeps its model until it is opened (the desktop refreshes it
|
|
6
6
|
// then, agent-home-sessions.ts).
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
AGENT_ROUTE_KEYS as ROUTE_KEYS,
|
|
9
|
+
subscribeAgentRouteChanges,
|
|
10
|
+
} from '../../session-runtime/agent-profile-changes.mjs';
|
|
8
11
|
import { agentHomeSessionId } from '../../runtime/agent/orchestrator/session/agent-home.mjs';
|
|
9
12
|
import { roomMemberOfSession } from '../../runtime/agent/orchestrator/session/agent-room.mjs';
|
|
10
13
|
|
|
11
|
-
const ROUTE_KEYS = [
|
|
12
|
-
'provider',
|
|
13
|
-
'model',
|
|
14
|
-
'effort',
|
|
15
|
-
'fast',
|
|
16
|
-
'autoEffort',
|
|
17
|
-
'modelParameters',
|
|
18
|
-
'contextPercent',
|
|
19
|
-
'contextTokens',
|
|
20
|
-
];
|
|
21
|
-
|
|
22
14
|
/** The pick the session route API takes for a saved route. */
|
|
23
15
|
function sessionRoutePick(route) {
|
|
24
16
|
const pick = { sessionOnly: true };
|
|
@@ -41,29 +33,40 @@ export function createAgentRouteFollow({ sessionsById, sessionOwner, advance, pu
|
|
|
41
33
|
if (step.changed) publishStep(entry, step);
|
|
42
34
|
})
|
|
43
35
|
.catch((error) => {
|
|
44
|
-
// A route the runtime refuses (provider signed out) leaves the chat on
|
|
36
|
+
// A route the runtime refuses (provider signed out) leaves the chat on
|
|
37
|
+
// its model; the publication fails, so a retrying publisher sends it again.
|
|
45
38
|
log(`agent route change not applied to ${sessionId}: ${error?.message || error}`);
|
|
39
|
+
throw error;
|
|
46
40
|
});
|
|
47
41
|
}
|
|
48
42
|
|
|
49
43
|
function enqueue(sessionId, pick) {
|
|
50
44
|
const queued = (tails.get(sessionId) || Promise.resolve()).then(() => apply(sessionId, pick));
|
|
51
|
-
|
|
52
|
-
queued.
|
|
53
|
-
|
|
45
|
+
// A refused update never holds back the chat's later ones.
|
|
46
|
+
const tail = queued.catch(() => {});
|
|
47
|
+
tails.set(sessionId, tail);
|
|
48
|
+
tail.then(() => {
|
|
49
|
+
if (tails.get(sessionId) === tail) tails.delete(sessionId);
|
|
54
50
|
});
|
|
55
51
|
return queued;
|
|
56
52
|
}
|
|
57
53
|
|
|
58
|
-
// Every matching chat is queued before the first await: publications queue
|
|
59
|
-
|
|
54
|
+
// Every matching chat is queued before the first await: publications queue
|
|
55
|
+
// in order. Rejects once every chat settled when any refused the route.
|
|
56
|
+
async function follow(agentId, route) {
|
|
60
57
|
const home = agentHomeSessionId(agentId);
|
|
61
|
-
if (!home || !route?.provider || !route?.model) return
|
|
58
|
+
if (!home || !route?.provider || !route?.model) return;
|
|
62
59
|
const pick = sessionRoutePick(route);
|
|
63
60
|
const queued = [...sessionsById.keys()]
|
|
64
61
|
.filter((sessionId) => sessionId === home || roomMemberOfSession(sessionId)?.agentId === agentId)
|
|
65
62
|
.map((sessionId) => enqueue(sessionId, pick));
|
|
66
|
-
|
|
63
|
+
const failures = (await Promise.allSettled(queued)).filter((one) => one.status === 'rejected');
|
|
64
|
+
if (failures.length) {
|
|
65
|
+
throw new AggregateError(
|
|
66
|
+
failures.map((one) => one.reason),
|
|
67
|
+
`${failures.length} chat(s) of ${agentId} did not take the route`
|
|
68
|
+
);
|
|
69
|
+
}
|
|
67
70
|
}
|
|
68
71
|
return subscribeAgentRouteChanges(follow);
|
|
69
72
|
}
|
|
@@ -6,6 +6,7 @@ import { createAgentChildFactory } from './agent-child.mjs';
|
|
|
6
6
|
import { partialHandoffTextFromSession } from '../../../runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs';
|
|
7
7
|
import { attachmentsForIntake } from '../../../runtime/attachments/store.mjs';
|
|
8
8
|
import { producedFileLines } from '../../../runtime/shared/handoff-artifacts.mjs';
|
|
9
|
+
import { carryReportOnError, turnReportText } from '../../../runtime/agent/orchestrator/session/loop/turn-report.mjs';
|
|
9
10
|
import {
|
|
10
11
|
collectUnreportedWrites,
|
|
11
12
|
handoffContent,
|
|
@@ -79,7 +80,16 @@ export function createAgentTurns({
|
|
|
79
80
|
return error;
|
|
80
81
|
}
|
|
81
82
|
|
|
82
|
-
async function runAgentTurn({
|
|
83
|
+
async function runAgentTurn({
|
|
84
|
+
session,
|
|
85
|
+
prompt,
|
|
86
|
+
context = null,
|
|
87
|
+
onToolResult,
|
|
88
|
+
onTerminalResult,
|
|
89
|
+
// The trusted skill-selection text of the turn (a routine executor's
|
|
90
|
+
// instructions); absent selects from the whole prompt, as any turn does.
|
|
91
|
+
skillSelection,
|
|
92
|
+
} = {}) {
|
|
83
93
|
await rehydrateAgentSessions();
|
|
84
94
|
const sessionId = String(session?.id || session || '').trim();
|
|
85
95
|
const cancelEpoch = registry.assertAdmission(sessionId);
|
|
@@ -116,11 +126,12 @@ export function createAgentTurns({
|
|
|
116
126
|
priority: 'next',
|
|
117
127
|
context,
|
|
118
128
|
transcriptMeta: agentTurnTranscriptMeta(content),
|
|
129
|
+
...(typeof skillSelection === 'string' ? { skillSelection } : {}),
|
|
119
130
|
...(entry.runtime.isWireSafe === true || typeof onToolResult !== 'function' ? {} : { onToolResult }),
|
|
120
131
|
};
|
|
121
132
|
const detail = await target.call(entry.runtime, content, options);
|
|
122
133
|
if (detail?.status === 'failed') {
|
|
123
|
-
throw new Error(String(detail.error || 'agent session turn failed'));
|
|
134
|
+
throw carryReportOnError(new Error(String(detail.error || 'agent session turn failed')), detail.carriedReport);
|
|
124
135
|
}
|
|
125
136
|
if (detail?.status === 'cancelled') {
|
|
126
137
|
const stop = takeWatchdogStop(sessionId) || new Error('agent session turn cancelled');
|
|
@@ -134,11 +145,12 @@ export function createAgentTurns({
|
|
|
134
145
|
const reason = String(detail?.reason || detail?.error || '').trim();
|
|
135
146
|
throw new Error(`agent turn ${status}${reason ? `: ${reason}` : ''}`);
|
|
136
147
|
}
|
|
137
|
-
|
|
138
|
-
// The
|
|
139
|
-
|
|
148
|
+
const { reportContent, ...settled } = detail?.result || { content: '' };
|
|
149
|
+
// The owner gets the turn's whole report (turn-report.mjs), with the
|
|
150
|
+
// files the turn produced.
|
|
151
|
+
const report = turnReportText({ ...settled, reportContent });
|
|
140
152
|
const files = await turnArtifactLines(entry.runtime, messageStart, descriptor, report);
|
|
141
|
-
|
|
153
|
+
const result = { ...settled, content: files.length ? [report, files.join('\n')].join('\n\n') : report };
|
|
142
154
|
descriptor.status = 'idle';
|
|
143
155
|
descriptor.stage = 'idle';
|
|
144
156
|
descriptor.lastHandoff = typeof result?.content === 'string' ? result.content : '';
|