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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// store/transcript-durability.mjs
|
|
2
|
+
// What a session's canonical record durably holds, as evidence for the turn
|
|
3
|
+
// checkpoints (manager/turn-checkpoint.mjs) — never inferred from in-memory
|
|
4
|
+
// freshness.
|
|
5
|
+
//
|
|
6
|
+
// transcriptEpoch persisted. Names one append-only lineage of the
|
|
7
|
+
// transcript: a record of epoch E with `length` messages
|
|
8
|
+
// agrees with every other record of E on their common
|
|
9
|
+
// prefix. A history rewrite (compaction, a prefix edit,
|
|
10
|
+
// a recovery splice) mints a new epoch.
|
|
11
|
+
// turnCoverage persisted. The token of the last turn whose finalized
|
|
12
|
+
// transcript this record carries, so a checkpoint the
|
|
13
|
+
// record already covers is deleted, never replayed.
|
|
14
|
+
//
|
|
15
|
+
// A landed save records, per session object, the exact epoch, coverage and
|
|
16
|
+
// message references it serialized (captured when the bytes were built, so a
|
|
17
|
+
// coalesced or later-built write reports what it actually wrote). Only that
|
|
18
|
+
// record proves what is on disk; a settled promise or an idle queue does not.
|
|
19
|
+
import { randomUUID } from 'node:crypto';
|
|
20
|
+
import { basename, dirname } from 'node:path';
|
|
21
|
+
import { sessionPath } from './session-paths.mjs';
|
|
22
|
+
import { _storedSessionFromFile, STORED_SESSION_UNREADABLE } from './serialize.mjs';
|
|
23
|
+
|
|
24
|
+
const _landed = new WeakMap(); // session → { epoch, coverage, refs, saveEpoch }
|
|
25
|
+
const _snapshotHooks = new WeakMap(); // session → () => void
|
|
26
|
+
|
|
27
|
+
export function mintTranscriptEpoch() {
|
|
28
|
+
return randomUUID();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Run `hook` before every serialization of `session` (the turn checkpoint
|
|
32
|
+
* journals a history rewrite, under a new epoch, before any record carries
|
|
33
|
+
* it). Returns the unregister function. */
|
|
34
|
+
export function setTranscriptSnapshotHook(session, hook) {
|
|
35
|
+
_snapshotHooks.set(session, hook);
|
|
36
|
+
return () => {
|
|
37
|
+
if (_snapshotHooks.get(session) === hook) _snapshotHooks.delete(session);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** The transcript identity a save of `session` is about to serialize. */
|
|
42
|
+
export function captureTranscriptSnapshot(session) {
|
|
43
|
+
_snapshotHooks.get(session)?.();
|
|
44
|
+
return {
|
|
45
|
+
epoch: typeof session.transcriptEpoch === 'string' ? session.transcriptEpoch : null,
|
|
46
|
+
coverage: typeof session.turnCoverage === 'string' ? session.turnCoverage : null,
|
|
47
|
+
refs: Array.isArray(session.messages) ? session.messages.slice() : [],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** A save of `snapshot` (issued under `saveEpoch`) landed on disk. */
|
|
52
|
+
export function recordLandedTranscript(session, snapshot, saveEpoch) {
|
|
53
|
+
if (!session || !snapshot) return;
|
|
54
|
+
const current = _landed.get(session);
|
|
55
|
+
const issued = Number.isFinite(saveEpoch) ? saveEpoch : 0;
|
|
56
|
+
if (current && current.saveEpoch > issued) return;
|
|
57
|
+
_landed.set(session, { ...snapshot, saveEpoch: issued });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function landedTranscript(session) {
|
|
61
|
+
return (session && _landed.get(session)) || null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Whether the last landed save of `session` holds exactly its transcript. */
|
|
65
|
+
export function landedTranscriptMatches(session) {
|
|
66
|
+
const landed = landedTranscript(session);
|
|
67
|
+
const messages = Array.isArray(session?.messages) ? session.messages : null;
|
|
68
|
+
if (!landed || !messages || landed.epoch !== session.transcriptEpoch) return false;
|
|
69
|
+
if (landed.refs.length !== messages.length) return false;
|
|
70
|
+
return landed.refs.every((message, index) => message === messages[index]);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** The durable transcript a turn opening now would be taken against
|
|
74
|
+
* (`{ epoch, refs }`), or null when no landed save holds `session`'s
|
|
75
|
+
* current transcript exactly. */
|
|
76
|
+
export function durableTranscriptBase(session) {
|
|
77
|
+
if (!landedTranscriptMatches(session)) return null;
|
|
78
|
+
const landed = landedTranscript(session);
|
|
79
|
+
return { epoch: landed.epoch, refs: landed.refs };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** The canonical record of `id` as it is on disk (never a cached or live
|
|
83
|
+
* copy), or null when it is absent, unreadable or not this session's. */
|
|
84
|
+
export function readDurableSessionRecord(id) {
|
|
85
|
+
const path = sessionPath(id);
|
|
86
|
+
const record = _storedSessionFromFile(dirname(path), basename(path));
|
|
87
|
+
return record && record !== STORED_SESSION_UNREADABLE ? record : null;
|
|
88
|
+
}
|
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
import { dataDir, storedAgentWorkerIndexPath, storedLeadWorkerIndexPath } from './store-summary-locations.mjs';
|
|
43
43
|
import { cleanValue, isStoredSessionId, positiveNumber } from './store-summary-fields.mjs';
|
|
44
44
|
import { sessionUsageTotals } from '../../../shared/session-usage-totals.mjs';
|
|
45
|
+
import { todoProgress } from '../runtime-core/todo-list.mjs';
|
|
45
46
|
|
|
46
47
|
const WORKING_AGENT_STATUS =
|
|
47
48
|
/^(?:connecting|requesting|streaming|tool[-_\s]?running|running|queued|pending|starting|cancelling)$/i;
|
|
@@ -327,6 +328,7 @@ const WORKER_HEADER_FIELDS = [
|
|
|
327
328
|
'totalInputTokens',
|
|
328
329
|
'totalOutputTokens',
|
|
329
330
|
'totalToolCalls',
|
|
331
|
+
'todo',
|
|
330
332
|
...SESSION_CANCEL_FIELDS,
|
|
331
333
|
];
|
|
332
334
|
|
|
@@ -584,6 +586,7 @@ function projectChildWorkerRow(row, context) {
|
|
|
584
586
|
// beside a header that records a cancel-unconfirmed (possibly running)
|
|
585
587
|
// process. A new row may precede its first session save (null header).
|
|
586
588
|
const session = readWorkerSessionHeader(sessionId);
|
|
589
|
+
const todo = todoProgress(session);
|
|
587
590
|
const declaredStatus = cleanValue(row.status) || 'running';
|
|
588
591
|
const declaredStage = cleanValue(row.stage || row.status) || 'running';
|
|
589
592
|
const declaredWorking = WORKING_AGENT_STATUS.test(workerLifecycle(row) || 'running');
|
|
@@ -649,6 +652,8 @@ function projectChildWorkerRow(row, context) {
|
|
|
649
652
|
clientHostPid: positiveNumber(row.clientHostPid || session?.clientHostPid, 0) || null,
|
|
650
653
|
taskId: cleanValue(row.task_id || row.taskId) || null,
|
|
651
654
|
...sessionUsageTotals(session),
|
|
655
|
+
// The agent's own step list as counts only; a closed agent keeps its last.
|
|
656
|
+
...(todo ? { todo } : {}),
|
|
652
657
|
};
|
|
653
658
|
}
|
|
654
659
|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
import { readFileSync, statSync } from 'node:fs';
|
|
20
20
|
import { dirname, join } from 'node:path';
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
const SUMMARY_LOG_FILENAME = 'session-summaries.log';
|
|
23
23
|
|
|
24
24
|
export function summaryLogPath(indexPath) {
|
|
25
25
|
return join(dirname(indexPath), SUMMARY_LOG_FILENAME);
|
|
@@ -24,21 +24,34 @@ import {
|
|
|
24
24
|
stampedDerivation,
|
|
25
25
|
storedSessionCatalogRow,
|
|
26
26
|
} from './store-summary-catalog.mjs';
|
|
27
|
-
import {
|
|
27
|
+
import {
|
|
28
|
+
createStoredTranscriptCache,
|
|
29
|
+
historyStampOf,
|
|
30
|
+
producedSlice,
|
|
31
|
+
projectionStampEpoch,
|
|
32
|
+
transcriptTextHash,
|
|
33
|
+
} from './store-transcript-cache.mjs';
|
|
28
34
|
import {
|
|
29
35
|
forgetStoredTranscriptOffThread,
|
|
30
36
|
OFFLOAD_MIN_CHARS,
|
|
31
37
|
projectStoredTranscriptOffThread,
|
|
32
38
|
storedTranscriptWorkerRunning,
|
|
33
39
|
} from './store-transcript-worker.mjs';
|
|
34
|
-
import {
|
|
40
|
+
import {
|
|
41
|
+
cursorPageRows,
|
|
42
|
+
heldRowsDigester,
|
|
43
|
+
prepareStoredTranscriptBase,
|
|
44
|
+
projectStoredTranscript,
|
|
45
|
+
storedHistorySlice,
|
|
46
|
+
windowStoredTranscript,
|
|
47
|
+
} from './store-transcript-projection.mjs';
|
|
35
48
|
import { dataDir } from './store-summary-locations.mjs';
|
|
36
49
|
import { isStoredSessionId, workspaceSummary } from './store-summary-fields.mjs';
|
|
37
50
|
import { readArchivedAgentResult } from './store-summary-archived-agent.mjs';
|
|
38
51
|
import {
|
|
52
|
+
compactionArchivePageFromText,
|
|
39
53
|
compactionArchivePath,
|
|
40
54
|
compactionArchiveRange,
|
|
41
|
-
readCompactionArchivePage,
|
|
42
55
|
visitCompactionArchive,
|
|
43
56
|
} from './compaction-archive.mjs';
|
|
44
57
|
import { attachmentHistoryRows } from './stored-attachment-history.mjs';
|
|
@@ -76,15 +89,55 @@ const storedTranscriptCache = createStoredTranscriptCache();
|
|
|
76
89
|
// lookup can neither fill nor evict.
|
|
77
90
|
const attachmentHistoryCache = createStoredTranscriptCache();
|
|
78
91
|
|
|
92
|
+
// The display histories of SMALL sessions (record and archive under
|
|
93
|
+
// OFFLOAD_MIN_CHARS, projected on this thread), kept for slicing within a
|
|
94
|
+
// source-character budget; a larger one never stays on this thread (its
|
|
95
|
+
// history lives in the projection worker, or is projected per read as a
|
|
96
|
+
// bounded window).
|
|
97
|
+
const SMALL_HISTORY_MAX_CHARS = 4 * 1024 * 1024;
|
|
98
|
+
const smallHistories = (() => {
|
|
99
|
+
const entries = new Map();
|
|
100
|
+
let chars = 0;
|
|
101
|
+
const drop = (sessionId) => {
|
|
102
|
+
const entry = entries.get(sessionId);
|
|
103
|
+
if (!entry) return;
|
|
104
|
+
entries.delete(sessionId);
|
|
105
|
+
chars -= entry.chars;
|
|
106
|
+
};
|
|
107
|
+
return {
|
|
108
|
+
get(sessionId, identity) {
|
|
109
|
+
const entry = entries.get(sessionId);
|
|
110
|
+
if (!entry || entry.identity !== identity) return null;
|
|
111
|
+
entries.delete(sessionId);
|
|
112
|
+
entries.set(sessionId, entry);
|
|
113
|
+
return entry.history;
|
|
114
|
+
},
|
|
115
|
+
retain(sessionId, identity, sourceChars, history) {
|
|
116
|
+
drop(sessionId);
|
|
117
|
+
if (sourceChars > SMALL_HISTORY_MAX_CHARS) return;
|
|
118
|
+
entries.set(sessionId, { identity, chars: sourceChars, history });
|
|
119
|
+
chars += sourceChars;
|
|
120
|
+
while (chars > SMALL_HISTORY_MAX_CHARS && entries.size > 1) drop(entries.keys().next().value);
|
|
121
|
+
},
|
|
122
|
+
forget: drop,
|
|
123
|
+
clear() {
|
|
124
|
+
entries.clear();
|
|
125
|
+
chars = 0;
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
})();
|
|
129
|
+
|
|
79
130
|
/** Test seam: forget every cached projection. */
|
|
80
131
|
export function clearStoredTranscriptCache() {
|
|
81
132
|
storedTranscriptCache.clear();
|
|
133
|
+
smallHistories.clear();
|
|
82
134
|
}
|
|
83
135
|
|
|
84
136
|
/** Drop one session's cold projections: it went live, or its last view left. */
|
|
85
137
|
export function forgetStoredSessionTranscript(sessionId) {
|
|
86
138
|
const id = String(sessionId || '').trim();
|
|
87
139
|
storedTranscriptCache.forget(`${id}|`);
|
|
140
|
+
smallHistories.forget(id);
|
|
88
141
|
if (id) forgetStoredTranscriptOffThread(id);
|
|
89
142
|
}
|
|
90
143
|
|
|
@@ -386,10 +439,16 @@ export function storedSessionTranscriptStamp(id) {
|
|
|
386
439
|
* itself). The answer is the cache's `project` contract; a worker failure
|
|
387
440
|
* rejects and the cache runs the in-process pipeline instead. */
|
|
388
441
|
async function projectStoredTranscriptElsewhere(known, context) {
|
|
389
|
-
const { sessionId, recordPath,
|
|
442
|
+
const { sessionId, recordPath, timing, fingerprint, slice } = context;
|
|
390
443
|
timing.worker = storedTranscriptWorkerRunning(sessionId) ? 'warm' : 'cold';
|
|
391
444
|
const workerStartedAt = performance.now();
|
|
392
|
-
const answer = await projectStoredTranscriptOffThread({
|
|
445
|
+
const answer = await projectStoredTranscriptOffThread({
|
|
446
|
+
sessionId,
|
|
447
|
+
recordPath,
|
|
448
|
+
known,
|
|
449
|
+
fingerprint,
|
|
450
|
+
slice: { ...slice, epoch: projectionStampEpoch() },
|
|
451
|
+
});
|
|
393
452
|
timing.workerMs = performance.now() - workerStartedAt;
|
|
394
453
|
Object.assign(timing, answer.timing);
|
|
395
454
|
context.readState = answer.state;
|
|
@@ -397,15 +456,66 @@ async function projectStoredTranscriptElsewhere(known, context) {
|
|
|
397
456
|
if (answer.same) return answer;
|
|
398
457
|
if (answer.unreadable) return { ...answer, value: null };
|
|
399
458
|
if (answer.stamp) readCanonicalLifecycle.rememberStrictVerdict(recordPath, answer.stamp, answer.lifecycle);
|
|
400
|
-
|
|
401
|
-
answer.value.projectionStamp = nextProjectionStamp();
|
|
459
|
+
if (answer.historyBuilt === false) timing.history = 'retained';
|
|
402
460
|
return answer;
|
|
403
461
|
}
|
|
404
462
|
|
|
463
|
+
/** A projector (projectStoredTranscript's signature) for a historical-position
|
|
464
|
+
* read on this thread (a checkpoint sidecar, or the worker unavailable): the
|
|
465
|
+
* base once, then tail windows doubling from twice the page until one holds
|
|
466
|
+
* the cursor's row with the page beside it, or history ends. Never the whole
|
|
467
|
+
* display history: only as deep as the row itself. */
|
|
468
|
+
const CURSOR_WINDOW_MAX_ITEMS = 8_192;
|
|
469
|
+
|
|
470
|
+
function cursorWindowProjector(cursor, timing) {
|
|
471
|
+
return async (sessionId, doc, options) => {
|
|
472
|
+
const base = await prepareStoredTranscriptBase(sessionId, doc, options);
|
|
473
|
+
const id = cursor.before ?? cursor.after;
|
|
474
|
+
for (
|
|
475
|
+
let itemLimit = Math.max(64, cursor.maxRows * 2);
|
|
476
|
+
;
|
|
477
|
+
itemLimit = Math.min(itemLimit * 2, CURSOR_WINDOW_MAX_ITEMS)
|
|
478
|
+
) {
|
|
479
|
+
timing.cursorWindowItems = itemLimit;
|
|
480
|
+
const window = await windowStoredTranscript(sessionId, base, { itemLimit, includeMessages: false });
|
|
481
|
+
const at = window.items.findIndex((item) => item?.id === id);
|
|
482
|
+
if ((at >= 0 && (cursor.before == null || at >= cursor.maxRows)) || !window.transcriptHasOlder) return window;
|
|
483
|
+
// Never deeper on this thread: a row past the bound answers `reset`
|
|
484
|
+
// (the slice finds no such row), one at its edge a shorter page.
|
|
485
|
+
if (itemLimit >= CURSOR_WINDOW_MAX_ITEMS) return at >= 0 ? window : { ...window, items: [] };
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/** The slice `request` names of `history` (the display history, or a window
|
|
491
|
+
* of it), stamped `<history stamp>/<slice>`. */
|
|
492
|
+
async function sliceOf(history, request, historyStamp) {
|
|
493
|
+
const proven = Boolean(request.held) && request.baseHistory === historyStamp;
|
|
494
|
+
const value = storedHistorySlice(
|
|
495
|
+
history,
|
|
496
|
+
{ ...request, proven },
|
|
497
|
+
{ digestOf: request.held && !proven ? await heldRowsDigester() : null }
|
|
498
|
+
);
|
|
499
|
+
const { windowStamp } = value;
|
|
500
|
+
delete value.windowStamp;
|
|
501
|
+
value.projectionStamp = `${historyStamp}/${windowStamp}`;
|
|
502
|
+
return value;
|
|
503
|
+
}
|
|
504
|
+
|
|
405
505
|
/** Projects the strictly parsed record `text` (read at full stamp `stamp`, or
|
|
406
506
|
* null when not provably stable) into the cached transcript value. */
|
|
407
507
|
async function produceStoredTranscript(text, stamp, context) {
|
|
408
|
-
const { sessionId, recordPath, itemLimit, includeMessages, mode, checkpointAbsent, timing } =
|
|
508
|
+
const { sessionId, recordPath, itemLimit, slice, fingerprint, includeMessages, mode, checkpointAbsent, timing } =
|
|
509
|
+
context;
|
|
510
|
+
const historyStamp =
|
|
511
|
+
mode === 'items' ? historyStampOf(sessionId, transcriptTextHash(text), text.length, fingerprint) : null;
|
|
512
|
+
// A small session's retained history answers every other slice of it.
|
|
513
|
+
const keepHistory = mode === 'items' && checkpointAbsent && context.sourceChars < OFFLOAD_MIN_CHARS;
|
|
514
|
+
const retained = keepHistory ? smallHistories.get(sessionId, historyStamp) : null;
|
|
515
|
+
if (retained) {
|
|
516
|
+
timing.history = 'retained';
|
|
517
|
+
return producedSlice(await sliceOf(retained, slice, historyStamp), { historyBuilt: false });
|
|
518
|
+
}
|
|
409
519
|
const parseStartedAt = performance.now();
|
|
410
520
|
const record = readTopLevelLifecycleRecord(text);
|
|
411
521
|
timing.parseMs = performance.now() - parseStartedAt;
|
|
@@ -431,22 +541,29 @@ async function produceStoredTranscript(text, stamp, context) {
|
|
|
431
541
|
// load the hand-off serves, and projects the load cache's session
|
|
432
542
|
// exactly as before; only that projection is detached.
|
|
433
543
|
const projectStartedAt = performance.now();
|
|
434
|
-
const
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
544
|
+
const project = keepHistory || !slice.cursor ? projectStoredTranscript : cursorWindowProjector(slice.cursor, timing);
|
|
545
|
+
const projected = await project(sessionId, handedOver && checkpointAbsent ? JSON.parse(text) : record.doc, {
|
|
546
|
+
itemLimit,
|
|
547
|
+
// Only a small session's whole display history is built (and kept) on
|
|
548
|
+
// this thread; any other item read projects just its bounded window
|
|
549
|
+
// (a tail of that history) and slices it; a historical-position read
|
|
550
|
+
// projects the tail window reaching its row (cursorWindowProjector).
|
|
551
|
+
history: keepHistory,
|
|
552
|
+
includeMessages,
|
|
553
|
+
checkpointAbsent,
|
|
554
|
+
});
|
|
443
555
|
timing.projectMs = performance.now() - projectStartedAt;
|
|
444
|
-
if (
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
556
|
+
if (mode !== 'items' || !projected) return projected;
|
|
557
|
+
if (keepHistory) smallHistories.retain(sessionId, historyStamp, context.sourceChars, projected);
|
|
558
|
+
let value = await sliceOf(projected, slice, historyStamp);
|
|
559
|
+
if (handedOver && !checkpointAbsent) {
|
|
560
|
+
try {
|
|
561
|
+
value = structuredClone(value);
|
|
562
|
+
} catch {
|
|
563
|
+
// Served as projected.
|
|
564
|
+
}
|
|
449
565
|
}
|
|
566
|
+
return producedSlice(value);
|
|
450
567
|
}
|
|
451
568
|
|
|
452
569
|
/** The rows of one session's whole stored conversation that name attachments
|
|
@@ -492,6 +609,37 @@ async function readStoredAttachmentHistory(sessionId, recordPath, archivePath) {
|
|
|
492
609
|
return value ?? null;
|
|
493
610
|
}
|
|
494
611
|
|
|
612
|
+
/** One page of a session's compaction archive (`{ after, before, skip,
|
|
613
|
+
* limit }`, as readCompactionArchivePage pages it), cut from its visible rows
|
|
614
|
+
* built once per archive content in the transcript cache: paging a live
|
|
615
|
+
* session through a large segment slices instead of re-parsing it; `paging`
|
|
616
|
+
* keeps it cached under pressure (the cache's `pin`). */
|
|
617
|
+
async function readCachedCompactionArchivePage(sessionId, archivePath, range, paging) {
|
|
618
|
+
const after = Math.max(0, Math.floor(Number(range.after) || 0));
|
|
619
|
+
const before = Number(range.before);
|
|
620
|
+
const visible = { after, before: Number.isFinite(before) ? before : Number.POSITIVE_INFINITY };
|
|
621
|
+
const archive = probePath(archivePath);
|
|
622
|
+
if (archive.state !== PROBE_PRESENT) return { items: [], hasOlder: false };
|
|
623
|
+
const { value } = await storedTranscriptCache.read({
|
|
624
|
+
key: `${sessionId}|archive|${visible.after}:${visible.before}`,
|
|
625
|
+
group: `${sessionId}|archive`,
|
|
626
|
+
fingerprint: '',
|
|
627
|
+
fileStat: archive,
|
|
628
|
+
pin: paging,
|
|
629
|
+
loadText: () => {
|
|
630
|
+
const body = readTextFile(archivePath);
|
|
631
|
+
return body.state === PROBE_PRESENT ? body.text : null;
|
|
632
|
+
},
|
|
633
|
+
produce: async (text) => ({
|
|
634
|
+
items: (await compactionArchivePageFromText(text, { ...visible, limit: Number.POSITIVE_INFINITY })).items,
|
|
635
|
+
}),
|
|
636
|
+
});
|
|
637
|
+
const items = Array.isArray(value?.items) ? value.items : [];
|
|
638
|
+
const end = Math.max(0, items.length - Math.max(0, Math.floor(Number(range.skip) || 0)));
|
|
639
|
+
const start = Math.max(0, end - Math.max(0, Math.floor(Number(range.limit) || 0)));
|
|
640
|
+
return { items: items.slice(start, end), hasOlder: start > 0 };
|
|
641
|
+
}
|
|
642
|
+
|
|
495
643
|
/** Read exactly one persisted session for a visible desktop pane. This never
|
|
496
644
|
* enumerates siblings. Normal reads stay independent of runtime ownership;
|
|
497
645
|
* interrupted turns conditionally use the same durable reconnect recovery as
|
|
@@ -508,7 +656,7 @@ export async function readStoredSessionTranscript(id, options = {}) {
|
|
|
508
656
|
// One page of the display-only compaction archive (the live head loader
|
|
509
657
|
// pages it once a runtime's in-memory rows are exhausted).
|
|
510
658
|
if (options.compactionArchive && typeof options.compactionArchive === 'object') {
|
|
511
|
-
return
|
|
659
|
+
return readCachedCompactionArchivePage(sessionId, archivePath, options.compactionArchive, options.paging === true);
|
|
512
660
|
}
|
|
513
661
|
// The checkpoint sidecar shapes the projection as much as the record does,
|
|
514
662
|
// so its identity joins the cache fingerprint. Only a PROVABLY absent
|
|
@@ -524,6 +672,51 @@ export async function readStoredSessionTranscript(id, options = {}) {
|
|
|
524
672
|
const archive = probePath(archivePath);
|
|
525
673
|
const requestedLimit = Number(options.transcriptItemLimit);
|
|
526
674
|
const itemLimit = Number.isFinite(requestedLimit) && requestedLimit > 0 ? requestedLimit : Number.POSITIVE_INFINITY;
|
|
675
|
+
// `transcriptSkip`: the window's newest rows to leave out (a range read
|
|
676
|
+
// slices only the rows above them, with `skippedFirstId`).
|
|
677
|
+
const requestedSkip = Number(options.transcriptSkip);
|
|
678
|
+
const skip =
|
|
679
|
+
Number.isFinite(itemLimit) && Number.isSafeInteger(requestedSkip) && requestedSkip > 0
|
|
680
|
+
? Math.min(requestedSkip, itemLimit)
|
|
681
|
+
: 0;
|
|
682
|
+
// `transcriptHeld` (`{ firstId, count, digest }`): the newest rows a paged
|
|
683
|
+
// caller holds, proven by `transcriptBaseHistory` (the history stamp they
|
|
684
|
+
// were served under) or their digest, where the history is: only the page
|
|
685
|
+
// above them (`transcriptPage`: `{ maxRows, byteBudget }`) is sliced,
|
|
686
|
+
// whatever their count. Unproven, a tail of at most `maxRows` rows.
|
|
687
|
+
const heldOption = options.transcriptHeld;
|
|
688
|
+
const held =
|
|
689
|
+
Number.isFinite(itemLimit) && heldOption && Number.isSafeInteger(heldOption.count) && heldOption.count > 0
|
|
690
|
+
? { firstId: heldOption.firstId, count: heldOption.count, digest: String(heldOption.digest ?? '') }
|
|
691
|
+
: null;
|
|
692
|
+
const page = options.transcriptPage || {};
|
|
693
|
+
// `transcriptCursor` (`{ before | after, maxRows, byteBudget }`): a
|
|
694
|
+
// historical-position read — the rows next to one row, by its id.
|
|
695
|
+
const cursorOption = options.transcriptCursor;
|
|
696
|
+
const cursor =
|
|
697
|
+
cursorOption && (cursorOption.before != null || cursorOption.after != null)
|
|
698
|
+
? {
|
|
699
|
+
...(cursorOption.before != null ? { before: cursorOption.before } : { after: cursorOption.after }),
|
|
700
|
+
maxRows: cursorPageRows(cursorOption.maxRows),
|
|
701
|
+
byteBudget: Number(cursorOption.byteBudget) > 0 ? Number(cursorOption.byteBudget) : null,
|
|
702
|
+
}
|
|
703
|
+
: null;
|
|
704
|
+
const slice = cursor
|
|
705
|
+
? { cursor }
|
|
706
|
+
: held
|
|
707
|
+
? {
|
|
708
|
+
limit: itemLimit,
|
|
709
|
+
held,
|
|
710
|
+
baseHistory: typeof options.transcriptBaseHistory === 'string' ? options.transcriptBaseHistory : null,
|
|
711
|
+
maxRows: Math.max(1, Math.floor(Number(page.maxRows) || itemLimit)),
|
|
712
|
+
byteBudget: Number(page.byteBudget) > 0 ? Number(page.byteBudget) : null,
|
|
713
|
+
}
|
|
714
|
+
: { limit: itemLimit, skip };
|
|
715
|
+
const sliceKey = cursor
|
|
716
|
+
? `cursor:${cursor.before ?? ''}:${cursor.after ?? ''}:${cursor.maxRows}:${cursor.byteBudget}`
|
|
717
|
+
: held
|
|
718
|
+
? `held:${held.count}:${held.firstId}:${held.digest}:${slice.baseHistory}:${slice.maxRows}:${slice.byteBudget}`
|
|
719
|
+
: skip;
|
|
527
720
|
// Full stamp the loaded text provably came from (unchanged around the
|
|
528
721
|
// read), or null. Only such a parse may serve other readers.
|
|
529
722
|
let readStamp = null;
|
|
@@ -533,11 +726,27 @@ export async function readStoredSessionTranscript(id, options = {}) {
|
|
|
533
726
|
const mode = includeMessages ? 'messages' : 'items';
|
|
534
727
|
const checkpointAbsent = checkpoint.state === PROBE_ABSENT;
|
|
535
728
|
// Large, checkpoint-free item projections run off the daemon event loop.
|
|
536
|
-
|
|
729
|
+
// A large compaction archive counts: the display history holds its rows.
|
|
730
|
+
const sourceChars = recordStat.size + (archive.state === PROBE_PRESENT ? Number(archive.size) || 0 : 0);
|
|
731
|
+
const offloadable = !includeMessages && checkpointAbsent && sourceChars >= OFFLOAD_MIN_CHARS;
|
|
732
|
+
const fingerprint = [
|
|
733
|
+
checkpoint.state,
|
|
734
|
+
checkpoint.mtimeMs,
|
|
735
|
+
checkpoint.ctimeMs,
|
|
736
|
+
checkpoint.size,
|
|
737
|
+
checkpoint.ino,
|
|
738
|
+
checkpoint.dev,
|
|
739
|
+
archive.state,
|
|
740
|
+
archive.mtimeMs,
|
|
741
|
+
archive.size,
|
|
742
|
+
].join(':');
|
|
537
743
|
const produceContext = {
|
|
538
744
|
sessionId,
|
|
539
745
|
recordPath,
|
|
540
746
|
itemLimit,
|
|
747
|
+
slice,
|
|
748
|
+
sourceChars,
|
|
749
|
+
fingerprint,
|
|
541
750
|
includeMessages,
|
|
542
751
|
mode,
|
|
543
752
|
checkpointAbsent,
|
|
@@ -545,21 +754,16 @@ export async function readStoredSessionTranscript(id, options = {}) {
|
|
|
545
754
|
// How the record read went (the worker's read or loadText below).
|
|
546
755
|
readState: PROBE_PRESENT,
|
|
547
756
|
};
|
|
548
|
-
const { value, hit, read } = await storedTranscriptCache.read({
|
|
549
|
-
|
|
757
|
+
const { value, hit, read, built } = await storedTranscriptCache.read({
|
|
758
|
+
// One slice (window or page) per request; the group keeps one per
|
|
759
|
+
// session: the display history it is cut from stays with the thread
|
|
760
|
+
// that built it.
|
|
761
|
+
key: `${sessionId}|${itemLimit}|${sliceKey}|${mode}`,
|
|
550
762
|
// Growing history windows of one session replace each other.
|
|
551
763
|
group: `${sessionId}|${mode}`,
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
checkpoint.ctimeMs,
|
|
556
|
-
checkpoint.size,
|
|
557
|
-
checkpoint.ino,
|
|
558
|
-
checkpoint.dev,
|
|
559
|
-
archive.state,
|
|
560
|
-
archive.mtimeMs,
|
|
561
|
-
archive.size,
|
|
562
|
-
].join(':'),
|
|
764
|
+
// A page read keeps its slice cached under pressure.
|
|
765
|
+
pin: options.paging === true,
|
|
766
|
+
fingerprint,
|
|
563
767
|
fileStat: recordStat,
|
|
564
768
|
project: offloadable ? (known) => projectStoredTranscriptElsewhere(known, produceContext) : null,
|
|
565
769
|
loadText: async () => {
|
|
@@ -589,7 +793,8 @@ export async function readStoredSessionTranscript(id, options = {}) {
|
|
|
589
793
|
if (typeof options.trace === 'function') {
|
|
590
794
|
options.trace({
|
|
591
795
|
sessionId,
|
|
592
|
-
hit
|
|
796
|
+
// A slice of a history already built counts as a hit: nothing was projected.
|
|
797
|
+
hit: hit || built === false,
|
|
593
798
|
read,
|
|
594
799
|
ms: performance.now() - startedAt,
|
|
595
800
|
chars: recordStat.size,
|