mixdog 1.2.3 → 1.2.4
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 +1 -1
- package/scripts/gate-local.mjs +6 -4
- package/scripts/lib/gate-scheduler.mjs +29 -11
- package/scripts/probe-provider-catalog.mjs +31 -0
- package/scripts/provider-pingpong-live.mjs +128 -38
- package/scripts/session-sweep.mjs +5 -25
- package/src/agents/maintainer/AGENT.md +1 -1
- package/src/agents/maintainer/agent.json +1 -1
- package/src/agents/reviewer/AGENT.md +2 -4
- package/src/agents/security/AGENT.md +1 -2
- package/src/agents/writer/AGENT.md +2 -3
- package/src/defaults/shipped-history.json +6 -1
- package/src/defaults/skills/image/SKILL.md +21 -23
- package/src/lib/keychain-cjs.cjs +13 -11
- package/src/rules/agent/AGENT.md +7 -5
- package/src/rules/lead/LEAD.md +7 -9
- package/src/rules/shared/45-destructive.md +4 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2 -5
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +81 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +109 -5
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +107 -37
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
- package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +41 -11
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +67 -5
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +14 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +14 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +9 -6
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +7 -2
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +26 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +12 -6
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +14 -6
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +6 -1
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +22 -10
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +33 -7
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +11 -2
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +9 -5
- package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
- package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +60 -16
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +11 -13
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +30 -19
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +42 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +13 -9
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +1 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +18 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +36 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +11 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +1 -4
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +0 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +7 -6
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +5 -4
- package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +14 -4
- package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +15 -3
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +6 -2
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +10 -10
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +46 -8
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
- package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -11
- package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +28 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +2 -4
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +0 -27
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +1 -4
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +8 -9
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +1 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +3 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +21 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +38 -13
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +19 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
- package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
- package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +29 -8
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
- package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +32 -14
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +17 -33
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/side-question.mjs +12 -7
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +5 -12
- package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
- package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +5 -11
- package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -32
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +136 -196
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +50 -116
- package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
- package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +7 -8
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
- package/src/runtime/agent/orchestrator/session/store.mjs +3 -16
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +11 -12
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +37 -13
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
- package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
- package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +204 -10
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
- package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
- package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +200 -17
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
- package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
- package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
- package/src/runtime/attachments/store.d.mts +9 -0
- package/src/runtime/attachments/store.mjs +80 -9
- package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
- package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
- package/src/runtime/computer-bridge/action-schema.mjs +178 -178
- package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
- package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
- package/src/runtime/effort-judge/judge-client.mjs +21 -4
- package/src/runtime/effort-judge/judge-worker.mjs +4 -1
- package/src/runtime/github/tool.mjs +118 -17
- package/src/runtime/media/adapters/codex-image.mjs +140 -21
- package/src/runtime/media/catalog.mjs +4 -4
- package/src/runtime/media/chatgpt-usage.mjs +55 -0
- package/src/runtime/media/defaults.mjs +37 -0
- package/src/runtime/media/jobs.mjs +12 -2
- package/src/runtime/media/lanes.mjs +12 -0
- package/src/runtime/media/tool-defs.mjs +15 -4
- package/src/runtime/media/tool.mjs +41 -12
- package/src/runtime/media/upstream-error.mjs +72 -6
- package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
- package/src/runtime/memory/lib/pg/process.mjs +5 -7
- package/src/runtime/memory/lib/pg/supervisor.mjs +4 -1
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/html-browser.mjs +18 -8
- package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-html-measure.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
- package/src/runtime/office/core/office-write-ledger.mjs +1 -5
- package/src/runtime/office/index.mjs +2 -3
- package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
- package/src/runtime/session-search/session-search-ingest.mjs +1 -1
- package/src/runtime/shared/agent-reap-state.mjs +13 -0
- package/src/runtime/shared/atomic-file.d.mts +1 -1
- package/src/runtime/shared/background-tasks.mjs +6 -1
- package/src/runtime/shared/bounded-line-diff.mjs +11 -2
- package/src/runtime/shared/browser-launch.mjs +15 -0
- package/src/runtime/shared/err-text.mjs +42 -4
- package/src/runtime/shared/file-lock.mjs +6 -5
- package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
- package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
- package/src/runtime/shared/model-route-chain.d.mts +8 -0
- package/src/runtime/shared/model-route-chain.mjs +48 -0
- package/src/runtime/shared/model-route-fallback.mjs +22 -0
- package/src/runtime/shared/pid-liveness.mjs +12 -0
- package/src/runtime/shared/provider-api-key.mjs +6 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
- package/src/runtime/shared/quiet-progress.d.mts +35 -0
- package/src/runtime/shared/quiet-progress.mjs +101 -0
- package/src/runtime/shared/quota-resume-store.mjs +32 -1
- package/src/runtime/shared/read-row-numbers.mjs +44 -0
- package/src/runtime/shared/remote-intent.mjs +2 -42
- package/src/runtime/shared/slow-span.mjs +8 -1
- package/src/runtime/shared/statusline/statusline-segments.mjs +24 -2
- package/src/runtime/shared/tool-card-model/card-header.mjs +2 -1
- package/src/runtime/shared/tool-output-budget.mjs +2 -0
- package/src/runtime/shared/tool-result-summary.mjs +16 -2
- package/src/runtime/shared/tool-status.mjs +3 -2
- package/src/runtime/shared/tool-surface.mjs +2 -3
- package/src/runtime/shared/tool-work-units.mjs +22 -15
- package/src/runtime/shared/transcript-metadata.mjs +49 -1
- package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
- package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
- package/src/runtime/shared/transcript-writer.mjs +14 -4
- package/src/runtime/shared/turn-changes.mjs +2 -1
- package/src/runtime/shared/turn-snapshot.mjs +11 -3
- package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
- package/src/runtime/shared/worktrees/carry.mjs +6 -4
- package/src/runtime/shared/worktrees/contract.mjs +27 -1
- package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
- package/src/runtime/shared/worktrees/file-recovery.mjs +29 -13
- package/src/runtime/shared/worktrees/git-head.mjs +22 -13
- package/src/runtime/shared/worktrees/include.mjs +125 -7
- package/src/runtime/shared/worktrees/lock.mjs +1 -1
- package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
- package/src/runtime/shared/worktrees/manager.mjs +378 -32
- package/src/runtime/shared/worktrees/owner.mjs +2 -1
- package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
- package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
- package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
- package/src/runtime/terminal-bridge/client.mjs +14 -10
- package/src/session-runtime/boot/apis.mjs +7 -1
- package/src/session-runtime/boot/config.mjs +2 -0
- package/src/session-runtime/boot/facade.mjs +3 -0
- package/src/session-runtime/boot/session.mjs +3 -2
- package/src/session-runtime/boot/tools.mjs +3 -0
- package/src/session-runtime/conversation-import/service.mjs +1 -1
- package/src/session-runtime/goal-facade-api.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +44 -18
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +22 -8
- package/src/session-runtime/internal-tool-executor.mjs +2 -0
- package/src/session-runtime/lifecycle/cold-heir.mjs +0 -1
- package/src/session-runtime/lifecycle/session-catalog.mjs +14 -16
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +18 -53
- package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
- package/src/session-runtime/lifecycle/shared.mjs +5 -6
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
- package/src/session-runtime/lifecycle/teardown.mjs +7 -16
- package/src/session-runtime/media-api.mjs +8 -0
- package/src/session-runtime/model-route/route-ownership.mjs +60 -0
- package/src/session-runtime/model-route/route-persist.mjs +3 -2
- package/src/session-runtime/model-route/set-route.mjs +114 -34
- package/src/session-runtime/model-route/web-search-route.mjs +7 -2
- package/src/session-runtime/model-route-api.mjs +4 -2
- package/src/session-runtime/native-web-search/routes.mjs +37 -24
- package/src/session-runtime/native-web-search.mjs +9 -8
- package/src/session-runtime/provider-auth/setup.mjs +4 -0
- package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
- package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
- package/src/session-runtime/provider-models.mjs +1 -0
- package/src/session-runtime/provider-usage.mjs +4 -0
- package/src/session-runtime/route-resolution.mjs +3 -1
- package/src/session-runtime/runtime-core.mjs +4 -0
- package/src/session-runtime/runtime-facade.mjs +6 -0
- package/src/session-runtime/services/agent-task-status.mjs +2 -0
- package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
- package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
- package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
- package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
- package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
- package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
- package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
- package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +9 -6
- package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
- package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
- package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -9
- package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
- package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
- package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
- package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
- package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
- package/src/session-runtime/services/agent-tool/worker-index.mjs +28 -8
- package/src/session-runtime/services/agent-tool.mjs +4 -0
- package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
- package/src/session-runtime/services/provider-admin.mjs +77 -0
- package/src/session-runtime/session-create/session-options.mjs +7 -5
- package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
- package/src/session-runtime/session-transcript.mjs +4 -5
- package/src/session-runtime/session-turn-api.mjs +3 -9
- package/src/session-runtime/settings-builtin-tools-api.mjs +9 -6
- package/src/session-runtime/setup-tool/executor.mjs +23 -5
- package/src/session-runtime/setup-tool/extended-actions.mjs +6 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +7 -2
- package/src/session-runtime/setup-tool/tool-defs.mjs +13 -1
- package/src/session-runtime/tool-policy-refresh.mjs +83 -32
- package/src/session-runtime/turn/agent-ops.mjs +49 -2
- package/src/session-runtime/turn/side-question-ops.mjs +1 -4
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +2 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +4 -0
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +8 -2
- package/src/session-runtime/turn/turn-run.mjs +1 -36
- package/src/session-runtime/usage-stats-api.mjs +4 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
- package/src/session-runtime/workspace/admission-gate.mjs +44 -15
- package/src/session-runtime/workspace/project-branches.mjs +28 -36
- package/src/session-runtime/workspace/transition-steps.mjs +96 -95
- package/src/session-runtime/workspace/transitions.mjs +248 -68
- package/src/standalone/channel-transport.mjs +3 -4
- package/src/standalone/daemon-desktop-runtime.mjs +32 -1
- package/src/standalone/daemon-pg-stop.mjs +1 -3
- package/src/standalone/daemon-session-control.mjs +88 -0
- package/src/standalone/daemon-stored-session-views.mjs +23 -3
- package/src/standalone/daemon.mjs +2 -0
- package/src/standalone/local-session-runtime.mjs +11 -12
- package/src/standalone/session-protocol.mjs +7 -0
- package/src/standalone/session-runtime-inline-host.mjs +2 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
- package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
- package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
- package/src/standalone/session-service/agent-tree.mjs +28 -2
- package/src/standalone/session-service/entries/session-loads.mjs +16 -5
- package/src/standalone/session-service/entries.mjs +1 -0
- package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
- package/src/standalone/session-service/quota-resume.mjs +28 -13
- package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
- package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
- package/src/standalone/session-tool-output.mjs +82 -0
- package/src/tui/app/app-view.jsx +2 -1
- package/src/tui/app/provider-setup/provider-items.mjs +8 -0
- package/src/tui/app/provider-setup-picker.mjs +15 -3
- package/src/tui/app/slash-commands.mjs +6 -0
- package/src/tui/app/slash-dispatch/session-commands.mjs +49 -0
- package/src/tui/components/Spinner.jsx +4 -0
- package/src/tui/components/SpinnerByline.jsx +21 -2
- package/src/tui/components/status-line/local-line.mjs +10 -2
- package/src/tui/dist/index.mjs +478 -251
- package/src/tui/session/active-tool-summary.mjs +1 -1
- package/src/tui/session/context-state.mjs +0 -3
- package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
- package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
- package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
- package/src/tui/session/quota-resume.mjs +140 -61
- package/src/tui/session/session-api/commands.mjs +4 -10
- package/src/tui/session/session-api/controls.mjs +12 -0
- package/src/tui/session/session-api/lifecycle/dispose.mjs +2 -9
- package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
- package/src/tui/session/session-api/lifecycle.mjs +13 -11
- package/src/tui/session/session-api/media.mjs +2 -0
- package/src/tui/session/session-api/routes.mjs +81 -57
- package/src/tui/session/session-api/settings.mjs +3 -3
- package/src/tui/session/session-api/worktree.mjs +3 -2
- package/src/tui/session/session-flow/auto-clear.mjs +1 -3
- package/src/tui/session/session-flow/drain.mjs +6 -4
- package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
- package/src/tui/session/session-flow/queue.mjs +1 -1
- package/src/tui/session/tool-approval.mjs +17 -8
- package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
- package/src/tui/session/tui-steering-persist.mjs +3 -5
- package/src/tui/session/turn-quiet.mjs +53 -0
- package/src/tui/session/turn-stream.mjs +5 -1
- package/src/tui/session/turn.mjs +38 -31
- package/src/tui/session/worktree-setup-notice.mjs +38 -0
- package/src/tui/spinner-meta.mjs +10 -0
- package/src/tui/spinner-verbs.mjs +3 -0
- package/src/ui/statusline.mjs +13 -3
- package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
- package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
- package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
- package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -302
- package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
- package/src/session-runtime/turn/share-ops.mjs +0 -77
- package/src/tui/session/cross-surface-share.mjs +0 -406
- package/src/tui/session/live-share/delta.mjs +0 -153
- package/src/tui/session/live-share/mirror.mjs +0 -106
- package/src/tui/session/live-share/owner.mjs +0 -254
- package/src/tui/session/live-share/retry.mjs +0 -54
- package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
- package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
- package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
- package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
- package/src/tui/session/live-share/viewer.mjs +0 -99
- package/src/tui/session/live-share/wire.mjs +0 -44
- package/src/tui/session/live-share.mjs +0 -154
- package/src/tui/session/shared-dir-watch.mjs +0 -69
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The ordinary session catalog engine: summary index (base + delta log),
|
|
3
|
-
* session-file reconcile
|
|
3
|
+
* session-file reconcile and the background verification. Turn liveness is
|
|
4
|
+
* not part of it: the daemon overlays its in-memory runtime state on the rows
|
|
5
|
+
* it serves.
|
|
4
6
|
*
|
|
5
7
|
* Leaf by design (no store.mjs, no config, no workers): the cold reader
|
|
6
8
|
* (store-summary-reader.mjs) runs one instance on its own thread for the JSON
|
|
@@ -87,18 +89,18 @@ export function stampedDerivation(kind, path, derive) {
|
|
|
87
89
|
|
|
88
90
|
const SESSION_SUMMARY_INDEX_VERSION = 2;
|
|
89
91
|
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
// such a row dead-ends in "Session is not available." (user report).
|
|
92
|
+
// Catalog visibility: Agent sessions are listed like any other session (the
|
|
93
|
+
// desktop sidebar filters to Leads itself), while internal dispatches the
|
|
94
|
+
// engine cannot open (memory ingest chunks, judges, exec runs) stay out — a
|
|
95
|
+
// click on such a row dead-ends in "Session is not available." (user report).
|
|
94
96
|
const LEAD_OWNERS = new Set(['cli', 'user', 'mixdog']);
|
|
95
97
|
|
|
96
98
|
export function isLeadVisibleRow(row) {
|
|
97
99
|
const owner = String(row.owner || 'user')
|
|
98
100
|
.trim()
|
|
99
101
|
.toLowerCase();
|
|
100
|
-
|
|
101
|
-
if (!isRootLeadSession(row) && owner && !LEAD_OWNERS.has(owner)) return false;
|
|
102
|
+
const agentSession = isAgentOnlySession(row) || owner === 'agent';
|
|
103
|
+
if (!agentSession && !isRootLeadSession(row) && owner && !LEAD_OWNERS.has(owner)) return false;
|
|
102
104
|
// Mirror listLeadSessions: a previewless zero-message row is an unusable
|
|
103
105
|
// scratch (desktop boot leftovers, crashed first turns) — resuming it
|
|
104
106
|
// shows an empty conversation, so the catalog hides it.
|
|
@@ -115,6 +117,7 @@ export function isLeadVisibleRow(row) {
|
|
|
115
117
|
.trim()
|
|
116
118
|
.toLowerCase();
|
|
117
119
|
return (
|
|
120
|
+
agentSession ||
|
|
118
121
|
agent === 'lead' ||
|
|
119
122
|
sourceType === 'lead' ||
|
|
120
123
|
sourceType === 'cli' ||
|
|
@@ -149,7 +152,7 @@ function messageText(content) {
|
|
|
149
152
|
.join(' ');
|
|
150
153
|
}
|
|
151
154
|
|
|
152
|
-
export function normalizedRow(row
|
|
155
|
+
export function normalizedRow(row) {
|
|
153
156
|
if (!row || typeof row.id !== 'string' || !isStoredSessionId(row.id)) return null;
|
|
154
157
|
return {
|
|
155
158
|
id: row.id,
|
|
@@ -160,10 +163,6 @@ export function normalizedRow(row, heartbeatAt = 0) {
|
|
|
160
163
|
lastUsedAt: positiveNumber(row.lastUsedAt, 0),
|
|
161
164
|
createdAt: positiveNumber(row.createdAt, 0),
|
|
162
165
|
lastHeartbeatAt: positiveNumber(row.lastHeartbeatAt, 0),
|
|
163
|
-
// Liveness comes from the .hb sidecar mtime alone: stored row fields
|
|
164
|
-
// (summary index / final session save) survive completion and must not
|
|
165
|
-
// keep the desktop working indicator on after the sidecar is deleted.
|
|
166
|
-
heartbeatAt: positiveNumber(heartbeatAt, 0),
|
|
167
166
|
closed: row.closed === true,
|
|
168
167
|
status: String(row.status || (row.closed === true ? 'closed' : 'idle')),
|
|
169
168
|
owner: row.owner || 'user',
|
|
@@ -196,35 +195,11 @@ export function normalizedRow(row, heartbeatAt = 0) {
|
|
|
196
195
|
};
|
|
197
196
|
}
|
|
198
197
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
const agentHeartbeatByOwner = new Map();
|
|
202
|
-
for (const row of rows) {
|
|
203
|
-
const heartbeatAt = positiveNumber(row?.heartbeatAt, 0);
|
|
204
|
-
const ownerSessionId = String(row?.ownerSessionId || '').trim();
|
|
205
|
-
const owner = String(row?.owner || '')
|
|
206
|
-
.trim()
|
|
207
|
-
.toLowerCase();
|
|
208
|
-
const agent = String(row?.agent || '')
|
|
209
|
-
.trim()
|
|
210
|
-
.toLowerCase();
|
|
211
|
-
if (!heartbeatAt || !ownerSessionId || (owner !== 'agent' && (!agent || agent === 'lead'))) continue;
|
|
212
|
-
agentHeartbeatByOwner.set(ownerSessionId, Math.max(agentHeartbeatByOwner.get(ownerSessionId) || 0, heartbeatAt));
|
|
213
|
-
}
|
|
214
|
-
return agentHeartbeatByOwner;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
function leadRowsWithAgentHeartbeat(rows) {
|
|
218
|
-
const agentHeartbeatByOwner = agentHeartbeatsByOwner(rows);
|
|
219
|
-
return rows
|
|
220
|
-
.filter((row) => row && isLeadVisibleRow(row))
|
|
221
|
-
.map((row) => {
|
|
222
|
-
const agentHeartbeatAt = agentHeartbeatByOwner.get(row.id) || 0;
|
|
223
|
-
return agentHeartbeatAt > 0 ? { ...row, agentHeartbeatAt } : row;
|
|
224
|
-
});
|
|
198
|
+
function leadRows(rows) {
|
|
199
|
+
return rows.filter((row) => row && isLeadVisibleRow(row));
|
|
225
200
|
}
|
|
226
201
|
|
|
227
|
-
function rowFromSession(session
|
|
202
|
+
function rowFromSession(session) {
|
|
228
203
|
const messages = Array.isArray(session?.messages) ? session.messages : [];
|
|
229
204
|
const preview =
|
|
230
205
|
messages
|
|
@@ -239,15 +214,12 @@ function rowFromSession(session, heartbeatAt = 0) {
|
|
|
239
214
|
)
|
|
240
215
|
.map((message) => cleanText(messageText(message.content)))
|
|
241
216
|
.find(Boolean) || '';
|
|
242
|
-
return normalizedRow(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
},
|
|
249
|
-
heartbeatAt
|
|
250
|
-
);
|
|
217
|
+
return normalizedRow({
|
|
218
|
+
...session,
|
|
219
|
+
messageCount: messages.filter((message) => message?.role === 'user' || message?.role === 'assistant').length,
|
|
220
|
+
realTurnCount: messages.filter(isRealTurnMessage).length,
|
|
221
|
+
preview,
|
|
222
|
+
});
|
|
251
223
|
}
|
|
252
224
|
|
|
253
225
|
// ── Session file reconcile ──────────────────────────────────────────────────
|
|
@@ -293,7 +265,7 @@ function reconcileSessionFile(directory, storageId, retained, forceRead) {
|
|
|
293
265
|
// record or a foreign identity is not this file's session.
|
|
294
266
|
const record = readTopLevelLifecycleRecord(text);
|
|
295
267
|
if (isLifecycleUnreadable(record) || record.id !== storageId) return null;
|
|
296
|
-
return rowFromSession(record.doc
|
|
268
|
+
return rowFromSession(record.doc);
|
|
297
269
|
});
|
|
298
270
|
if (read.state === PROBE_ABSENT) return null;
|
|
299
271
|
// Exists and could not be read (EACCES/EIO): retain the last known row
|
|
@@ -321,53 +293,46 @@ function deepFreeze(value) {
|
|
|
321
293
|
return value;
|
|
322
294
|
}
|
|
323
295
|
|
|
324
|
-
/** The session ids (`<id>.json`)
|
|
325
|
-
*
|
|
326
|
-
function
|
|
296
|
+
/** The session ids (`<id>.json`) of `directory`, or null when it cannot be
|
|
297
|
+
* enumerated. */
|
|
298
|
+
function listSessionIds(directory) {
|
|
327
299
|
let names;
|
|
328
300
|
try {
|
|
329
301
|
names = readdirSync(directory);
|
|
330
302
|
} catch {
|
|
331
303
|
return null;
|
|
332
304
|
}
|
|
333
|
-
|
|
334
|
-
const heartbeatIds = [];
|
|
335
|
-
for (const filename of names) {
|
|
336
|
-
if (filename.endsWith('.json')) sessionIds.push(filename.slice(0, -5));
|
|
337
|
-
else if (filename.endsWith('.hb') && isStoredSessionId(filename.slice(0, -3))) {
|
|
338
|
-
heartbeatIds.push(filename.slice(0, -3));
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
return { sessionIds, heartbeatIds };
|
|
305
|
+
return names.filter((filename) => filename.endsWith('.json')).map((filename) => filename.slice(0, -5));
|
|
342
306
|
}
|
|
343
307
|
|
|
344
|
-
/** Every `.json` entry
|
|
345
|
-
*
|
|
308
|
+
/** Every `.json` entry of an enumerable `directory`, or null when it cannot
|
|
309
|
+
* be enumerated. */
|
|
346
310
|
function scanSessionEntries(directory, indexRowsById, forceRead) {
|
|
347
|
-
const
|
|
348
|
-
if (!
|
|
311
|
+
const sessionIds = listSessionIds(directory);
|
|
312
|
+
if (!sessionIds) return null;
|
|
349
313
|
const entries = new Map();
|
|
350
|
-
for (const storageId of
|
|
314
|
+
for (const storageId of sessionIds) {
|
|
351
315
|
const entry = reconcileSessionFile(directory, storageId, indexRowsById.get(storageId), forceRead);
|
|
352
316
|
if (entry) entries.set(storageId, entry);
|
|
353
317
|
}
|
|
354
|
-
return { entries
|
|
318
|
+
return { entries };
|
|
355
319
|
}
|
|
356
320
|
|
|
357
|
-
/** The row an entry contributes
|
|
321
|
+
/** The row an entry contributes, or null. */
|
|
358
322
|
function entryRow(entry, id, indexRowsById) {
|
|
359
323
|
if (!entry || entry.kind === 'none') return null;
|
|
360
324
|
return (entry.kind === 'row' ? entry.row : indexRowsById.get(id)) || null;
|
|
361
325
|
}
|
|
362
326
|
|
|
363
327
|
/** Catalog rows of reconciled `entries`, in catalog order. */
|
|
364
|
-
function assembleCatalog(entries, indexRowsById
|
|
328
|
+
function assembleCatalog(entries, indexRowsById) {
|
|
365
329
|
const rows = [];
|
|
366
330
|
for (const [id, entry] of entries) {
|
|
367
331
|
const row = entryRow(entry, id, indexRowsById);
|
|
368
|
-
|
|
332
|
+
// A copy: the cached entry rows are frozen and shared.
|
|
333
|
+
if (row) rows.push({ ...row });
|
|
369
334
|
}
|
|
370
|
-
return
|
|
335
|
+
return leadRows(rows).sort(byCatalogOrder);
|
|
371
336
|
}
|
|
372
337
|
|
|
373
338
|
/**
|
|
@@ -379,23 +344,18 @@ function assembleCatalog(entries, indexRowsById, heartbeatMtimes) {
|
|
|
379
344
|
* durable summary and a single UNREADABLE file retains its last known row
|
|
380
345
|
* instead of vanishing.
|
|
381
346
|
*/
|
|
382
|
-
export function scanSessionFiles(
|
|
347
|
+
export function scanSessionFiles(indexRowsById, forceRead) {
|
|
383
348
|
const directory = join(dataDir(), 'sessions');
|
|
384
349
|
const dirProbe = probePath(directory);
|
|
385
350
|
if (dirProbe.state === PROBE_ABSENT) return [];
|
|
386
351
|
if (dirProbe.state !== PROBE_PRESENT) return null;
|
|
387
352
|
const scan = scanSessionEntries(directory, indexRowsById, forceRead);
|
|
388
|
-
return scan && assembleCatalog(scan.entries, indexRowsById
|
|
353
|
+
return scan && assembleCatalog(scan.entries, indexRowsById);
|
|
389
354
|
}
|
|
390
355
|
|
|
391
356
|
/** Listing from the index rows alone, or null without a valid index. */
|
|
392
|
-
export function indexListing(index
|
|
393
|
-
return (
|
|
394
|
-
index.rows &&
|
|
395
|
-
leadRowsWithAgentHeartbeat(
|
|
396
|
-
index.rows.map((row) => ({ ...row, heartbeatAt: positiveNumber(heartbeatMtimes.get(row.id), 0) }))
|
|
397
|
-
).sort(byCatalogOrder)
|
|
398
|
-
);
|
|
357
|
+
export function indexListing(index) {
|
|
358
|
+
return index.rows && leadRows(index.rows.map((row) => ({ ...row }))).sort(byCatalogOrder);
|
|
399
359
|
}
|
|
400
360
|
|
|
401
361
|
// ── Summary index ───────────────────────────────────────────────────────────
|
|
@@ -479,7 +439,7 @@ function readSummaryIndex(cached) {
|
|
|
479
439
|
}
|
|
480
440
|
// Same semantics as applySummaryLogText: last writer wins per id.
|
|
481
441
|
if (op?.u && typeof op.u.id === 'string') {
|
|
482
|
-
const row = normalizedRow(op.u
|
|
442
|
+
const row = normalizedRow(op.u);
|
|
483
443
|
if (row) rowsById.set(row.id, deepFreeze(row));
|
|
484
444
|
else rowsById.delete(op.u.id);
|
|
485
445
|
touched.add(op.u.id);
|
|
@@ -513,7 +473,7 @@ function readSummaryIndex(cached) {
|
|
|
513
473
|
}
|
|
514
474
|
}
|
|
515
475
|
const rows = applySummaryLogText({ rows: baseRows ?? [] }, index.logBytes.toString('utf8'))
|
|
516
|
-
.rows.map((row) => normalizedRow(row
|
|
476
|
+
.rows.map((row) => normalizedRow(row))
|
|
517
477
|
.filter(Boolean)
|
|
518
478
|
.map(deepFreeze);
|
|
519
479
|
for (const row of rows) index.signatures.set(row.id, JSON.stringify(row));
|
|
@@ -539,16 +499,10 @@ function changedIndexIds(previous, next) {
|
|
|
539
499
|
return ids;
|
|
540
500
|
}
|
|
541
501
|
|
|
542
|
-
function sameMtimes(left, right) {
|
|
543
|
-
if (!right || left.size !== right.size) return false;
|
|
544
|
-
for (const [id, mtimeMs] of left) if (right.get(id) !== mtimeMs) return false;
|
|
545
|
-
return true;
|
|
546
|
-
}
|
|
547
|
-
|
|
548
502
|
// ── Ordinary catalog ────────────────────────────────────────────────────────
|
|
549
503
|
// The ordinary listing keeps its last reconcile and answers an unchanged call
|
|
550
|
-
// from cheap stamps alone: the index pair (above)
|
|
551
|
-
//
|
|
504
|
+
// from cheap stamps alone: the index pair (above) and the sessions DIRECTORY —
|
|
505
|
+
// no per-session-file filesystem work.
|
|
552
506
|
//
|
|
553
507
|
// The directory stamp changes on every create, delete and rename in it
|
|
554
508
|
// (including a temp-file + rename replace), and NOT on an in-place write
|
|
@@ -581,8 +535,6 @@ function newSessionCatalog(directory, dirStamp, index, scan) {
|
|
|
581
535
|
dirSettled: isSettledSessionStamp(dirStamp),
|
|
582
536
|
index,
|
|
583
537
|
entries: scan.entries,
|
|
584
|
-
heartbeatIds: scan.heartbeatIds,
|
|
585
|
-
heartbeatMtimes: null,
|
|
586
538
|
rows: null,
|
|
587
539
|
dirty: new Set(),
|
|
588
540
|
verifiedAt: Date.now(),
|
|
@@ -610,17 +562,16 @@ function reconcileKnownCatalog(catalog, directory, dirStamp, index, hinted) {
|
|
|
610
562
|
changed = true;
|
|
611
563
|
}
|
|
612
564
|
if (!catalog.dirSettled || !sameSessionStamp(catalog.dirStamp, dirStamp)) {
|
|
613
|
-
const
|
|
614
|
-
if (!
|
|
615
|
-
const present = new Set(
|
|
565
|
+
const sessionIds = listSessionIds(directory);
|
|
566
|
+
if (!sessionIds) return null;
|
|
567
|
+
const present = new Set(sessionIds);
|
|
616
568
|
for (const id of catalog.entries.keys()) {
|
|
617
569
|
if (present.has(id)) continue;
|
|
618
570
|
catalog.entries.delete(id);
|
|
619
571
|
changedIds.add(id);
|
|
620
572
|
changed = true;
|
|
621
573
|
}
|
|
622
|
-
for (const id of
|
|
623
|
-
catalog.heartbeatIds = names.heartbeatIds;
|
|
574
|
+
for (const id of sessionIds) if (!catalog.entries.has(id)) ids.add(id);
|
|
624
575
|
catalog.dirStamp = dirStamp;
|
|
625
576
|
catalog.dirSettled = isSettledSessionStamp(dirStamp);
|
|
626
577
|
}
|
|
@@ -634,20 +585,6 @@ function reconcileKnownCatalog(catalog, directory, dirStamp, index, hinted) {
|
|
|
634
585
|
return { changed, changedIds };
|
|
635
586
|
}
|
|
636
587
|
|
|
637
|
-
/** Liveness: `.hb` sidecars are rewritten in place, so their mtimes are
|
|
638
|
-
* probed every call (absent or unreadable contributes nothing). True when
|
|
639
|
-
* they differ from the previous probe. */
|
|
640
|
-
function refreshHeartbeatMtimes(catalog, directory) {
|
|
641
|
-
const heartbeatMtimes = new Map();
|
|
642
|
-
for (const id of catalog.heartbeatIds) {
|
|
643
|
-
const probe = probePath(join(directory, `${id}.hb`));
|
|
644
|
-
if (probe.state === PROBE_PRESENT && probe.mtimeMs > 0) heartbeatMtimes.set(id, probe.mtimeMs);
|
|
645
|
-
}
|
|
646
|
-
const differs = !sameMtimes(heartbeatMtimes, catalog.heartbeatMtimes);
|
|
647
|
-
catalog.heartbeatMtimes = heartbeatMtimes;
|
|
648
|
-
return differs;
|
|
649
|
-
}
|
|
650
|
-
|
|
651
588
|
/** Marks every entry of `snapshot` whose file no longer has the full stamp it
|
|
652
589
|
* was judged at dirty (a replacement brings a new inode and change time even
|
|
653
590
|
* when its size and mtime match). Stops early once `isCurrent()` is false. */
|
|
@@ -729,7 +666,6 @@ export function createOrdinaryCatalog() {
|
|
|
729
666
|
}
|
|
730
667
|
({ changed, changedIds } = reconciled);
|
|
731
668
|
}
|
|
732
|
-
if (refreshHeartbeatMtimes(catalog, directory)) changed = true;
|
|
733
669
|
if (changed) catalog.rows = null;
|
|
734
670
|
if (assemble) rowsOf(catalog);
|
|
735
671
|
armCatalogVerify(catalog);
|
|
@@ -739,9 +675,7 @@ export function createOrdinaryCatalog() {
|
|
|
739
675
|
|
|
740
676
|
/** The (frozen) listing of a reconciled catalog, assembled on demand. */
|
|
741
677
|
function rowsOf(catalog) {
|
|
742
|
-
catalog.rows ||= assembleCatalog(catalog.entries, catalog.index.rowsById
|
|
743
|
-
Object.freeze
|
|
744
|
-
);
|
|
678
|
+
catalog.rows ||= assembleCatalog(catalog.entries, catalog.index.rowsById).map(Object.freeze);
|
|
745
679
|
return catalog.rows;
|
|
746
680
|
}
|
|
747
681
|
|
|
@@ -795,7 +729,7 @@ export function createOrdinaryCatalog() {
|
|
|
795
729
|
loadIndex,
|
|
796
730
|
refresh,
|
|
797
731
|
rowsOf,
|
|
798
|
-
/** The row `id` contributes to the current catalog
|
|
732
|
+
/** The row `id` contributes to the current catalog. */
|
|
799
733
|
entryRow: (catalog, id) => entryRow(catalog.entries.get(id), id, catalog.index.rowsById),
|
|
800
734
|
current: () => sessionCatalog,
|
|
801
735
|
/** `listener()` runs when a background pass finds a session file that
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Where the cold read-only catalog reads from
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* they cannot drift apart.
|
|
2
|
+
* Where the cold read-only catalog reads from. Leaf module by design: no
|
|
3
|
+
* store.mjs, no config, no workers — every consumer of the cold path resolves
|
|
4
|
+
* paths through here so they cannot drift apart.
|
|
6
5
|
*/
|
|
7
|
-
import { readdirSync } from 'node:fs';
|
|
8
6
|
import { homedir } from 'node:os';
|
|
9
7
|
import { join } from 'node:path';
|
|
10
|
-
import { probePath, PROBE_PRESENT } from './store/fs-probe.mjs';
|
|
11
|
-
import { isStoredSessionId } from './store-summary-fields.mjs';
|
|
12
8
|
|
|
13
9
|
export function dataDir() {
|
|
14
10
|
if (process.env.MIXDOG_DATA_DIR) return process.env.MIXDOG_DATA_DIR;
|
|
@@ -23,25 +19,3 @@ export function storedAgentWorkerIndexPath() {
|
|
|
23
19
|
export function storedLeadWorkerIndexPath() {
|
|
24
20
|
return join(dataDir(), 'lead-workers.json');
|
|
25
21
|
}
|
|
26
|
-
|
|
27
|
-
export function sessionHeartbeatMtimes() {
|
|
28
|
-
const directory = join(dataDir(), 'sessions');
|
|
29
|
-
const result = new Map();
|
|
30
|
-
if (probePath(directory).state !== PROBE_PRESENT) return result;
|
|
31
|
-
let entries = [];
|
|
32
|
-
try {
|
|
33
|
-
entries = readdirSync(directory);
|
|
34
|
-
} catch {
|
|
35
|
-
return result;
|
|
36
|
-
}
|
|
37
|
-
for (const filename of entries) {
|
|
38
|
-
if (!filename.endsWith('.hb')) continue;
|
|
39
|
-
const id = filename.slice(0, -3);
|
|
40
|
-
if (!isStoredSessionId(id)) continue;
|
|
41
|
-
// Liveness is additive: a sidecar that is absent OR unreadable simply
|
|
42
|
-
// contributes nothing, and can never remove a row.
|
|
43
|
-
const probe = probePath(join(directory, filename));
|
|
44
|
-
if (probe.state === PROBE_PRESENT && probe.mtimeMs > 0) result.set(id, probe.mtimeMs);
|
|
45
|
-
}
|
|
46
|
-
return result;
|
|
47
|
-
}
|
|
@@ -28,7 +28,7 @@ test.after(() => {
|
|
|
28
28
|
});
|
|
29
29
|
|
|
30
30
|
/** Point the reader at a fresh data dir with an empty sessions directory. */
|
|
31
|
-
export function
|
|
31
|
+
export function isolateDataDir(prefix) {
|
|
32
32
|
root = mkdtempSync(join(tmpdir(), prefix));
|
|
33
33
|
roots.push(root);
|
|
34
34
|
mkdirSync(join(root, 'sessions'));
|
|
@@ -29,7 +29,7 @@ import {
|
|
|
29
29
|
storedTranscriptWorkerRunning,
|
|
30
30
|
} from './store-transcript-worker.mjs';
|
|
31
31
|
import { projectStoredTranscript } from './store-transcript-projection.mjs';
|
|
32
|
-
import { dataDir
|
|
32
|
+
import { dataDir } from './store-summary-locations.mjs';
|
|
33
33
|
import { isStoredSessionId, workspaceSummary } from './store-summary-fields.mjs';
|
|
34
34
|
import { readArchivedAgentResult } from './store-summary-archived-agent.mjs';
|
|
35
35
|
import { compactionArchivePath, readCompactionArchivePage } from './compaction-archive.mjs';
|
|
@@ -42,9 +42,9 @@ import {
|
|
|
42
42
|
sameSessionStamp,
|
|
43
43
|
isSettledSessionStamp,
|
|
44
44
|
} from './store/canonical-reader.mjs';
|
|
45
|
-
// Worker-pool row projection (child + Lead indexes,
|
|
46
|
-
//
|
|
47
|
-
//
|
|
45
|
+
// Worker-pool row projection (child + Lead indexes, live-work evidence) lives
|
|
46
|
+
// in store-agent-worker-rows.mjs; re-exported so prior importers of this
|
|
47
|
+
// module stay unchanged.
|
|
48
48
|
export { listStoredAgentWorkerLinks, listStoredAgentWorkers } from './store-agent-worker-rows.mjs';
|
|
49
49
|
export { storedAgentWorkerIndexPath } from './store-summary-locations.mjs';
|
|
50
50
|
|
|
@@ -123,13 +123,12 @@ export function listStoredSessionSummaries(options = {}) {
|
|
|
123
123
|
// nor empty: the scan still runs, and when IT cannot enumerate either, the
|
|
124
124
|
// catalog reports nothing rather than inventing an empty truth.
|
|
125
125
|
if (options.refreshFromStorage === true) {
|
|
126
|
-
|
|
127
|
-
return scanSessionFiles(heartbeatMtimes, index.rowsById, true) ?? indexListing(index, heartbeatMtimes) ?? [];
|
|
126
|
+
return scanSessionFiles(index.rowsById, true) ?? indexListing(index) ?? [];
|
|
128
127
|
}
|
|
129
|
-
if (options.rebuildIfMissing === false) return indexListing(index
|
|
128
|
+
if (options.rebuildIfMissing === false) return indexListing(index) ?? [];
|
|
130
129
|
// A missing/malformed index leaves every file to be parsed (once per
|
|
131
130
|
// stamp); a present one lets unchanged files reuse their durable summary.
|
|
132
|
-
return ordinaryCatalog.refresh(index).rows ?? indexListing(index
|
|
131
|
+
return ordinaryCatalog.refresh(index).rows ?? indexListing(index) ?? [];
|
|
133
132
|
}
|
|
134
133
|
|
|
135
134
|
/** The catalog DB's answer to an ordinary listing (`{ rows, more }`), or
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The parse/recovery/projection body of one stored transcript read: durable
|
|
3
3
|
* turn-checkpoint recovery for interrupted turns, the read-only checkpoint
|
|
4
|
-
* projection for a live
|
|
4
|
+
* projection for a live turn, the cold context projection and the
|
|
5
5
|
* pane-facing transcript shape.
|
|
6
6
|
*
|
|
7
7
|
* Kept apart from the cache/fingerprint policy in store-summary-reader.mjs
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
import { sessionContextMeasurement, contextMeasurementStats } from '../../../shared/context-measurement.mjs';
|
|
13
13
|
import { nextProjectionStamp } from './store-transcript-cache.mjs';
|
|
14
14
|
import { join } from 'node:path';
|
|
15
|
-
import {
|
|
15
|
+
import { desktopSession, positiveNumber } from './store-summary-fields.mjs';
|
|
16
16
|
import { compactionArchiveRange, readCompactionArchivePage } from './compaction-archive.mjs';
|
|
17
17
|
import { dataDir } from './store-summary-locations.mjs';
|
|
18
18
|
|
|
@@ -20,27 +20,20 @@ import { dataDir } from './store-summary-locations.mjs';
|
|
|
20
20
|
* per distinct content; its result is shared read-only through the cache. */
|
|
21
21
|
export async function projectStoredTranscript(sessionId, doc, options) {
|
|
22
22
|
let session = doc;
|
|
23
|
-
const owner = cleanValue(session.owner).toLowerCase();
|
|
24
|
-
const agent = cleanValue(session.agent).toLowerCase();
|
|
25
|
-
const liveDetachedAgent =
|
|
26
|
-
session.closed === true &&
|
|
27
|
-
(owner === 'agent' || (agent && agent !== 'lead')) &&
|
|
28
|
-
Boolean(cleanValue(session.ownerSessionId || session.parentSessionId));
|
|
29
23
|
if (!options.checkpointAbsent) {
|
|
30
24
|
const { projectTurnCheckpointMessages, readTurnCheckpoint } = await import('./manager/turn-checkpoint.mjs');
|
|
31
25
|
const projectCheckpoint = () => {
|
|
32
26
|
const checkpoint = readTurnCheckpoint(sessionId);
|
|
33
27
|
if (checkpoint) session = { ...session, messages: projectTurnCheckpointMessages(session, checkpoint) };
|
|
34
28
|
};
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
29
|
+
const { isSessionTurnLive, recoverSessionAfterProcessRestart } = await import(
|
|
30
|
+
'./manager/turn-checkpoint-recovery.mjs'
|
|
31
|
+
);
|
|
32
|
+
// A running turn is never recovered: project its checkpoint read-only.
|
|
33
|
+
if (isSessionTurnLive(sessionId)) projectCheckpoint();
|
|
34
|
+
else {
|
|
39
35
|
session = recoverSessionAfterProcessRestart(sessionId) || session;
|
|
40
|
-
// A
|
|
41
|
-
// Project its durable working checkpoint read-only so the cold pane
|
|
42
|
-
// never repaints the stale pre-compaction session.messages while it
|
|
43
|
-
// waits for the owner's live-share frame.
|
|
36
|
+
// A closed session keeps its marker unrecovered.
|
|
44
37
|
if (session?.activeTurnCheckpoint) projectCheckpoint();
|
|
45
38
|
}
|
|
46
39
|
}
|
|
@@ -134,9 +127,5 @@ export async function projectStoredTranscript(sessionId, doc, options) {
|
|
|
134
127
|
displayContextWindow: displayContextWindow || null,
|
|
135
128
|
autoCompactTokenLimit: autoCompactTokenLimit || null,
|
|
136
129
|
}),
|
|
137
|
-
// Desktop must not ask its unrelated active engine to recover/peek an
|
|
138
|
-
// externally owned child: that runtime can only return the detached
|
|
139
|
-
// Task row and masks this checkpoint projection.
|
|
140
|
-
readOnlyDetachedAgent: liveDetachedAgent,
|
|
141
130
|
};
|
|
142
131
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { closeSync, fsyncSync, openSync, writeFileSync } from 'node:fs';
|
|
7
7
|
import * as fsp from 'node:fs/promises';
|
|
8
8
|
import { randomBytes } from 'node:crypto';
|
|
9
|
-
import { sessionPath } from './store/paths
|
|
9
|
+
import { sessionPath } from './store/session-paths.mjs';
|
|
10
10
|
import {
|
|
11
11
|
guardedSaveOptions as _guardedSaveOptions,
|
|
12
12
|
cancelSessionWrites as _cancelSessionWrites,
|
|
@@ -30,17 +30,6 @@ export {
|
|
|
30
30
|
_upsertSessionSummary,
|
|
31
31
|
_removeSessionSummary,
|
|
32
32
|
} from './store-summary-index.mjs';
|
|
33
|
-
export {
|
|
34
|
-
publishHeartbeat,
|
|
35
|
-
deleteHeartbeat,
|
|
36
|
-
publishSessionPresence,
|
|
37
|
-
deleteSessionPresence,
|
|
38
|
-
readSessionPresenceMtime,
|
|
39
|
-
isSessionPresenceOwnerDead,
|
|
40
|
-
readSessionHeartbeatOwnerPid,
|
|
41
|
-
isSessionHeartbeatOwnerDead,
|
|
42
|
-
isProcessAlive,
|
|
43
|
-
} from './store/paths-heartbeat.mjs';
|
|
44
33
|
import { _sessionForDisk, _ensureLifecycleFields } from './store/serialize.mjs';
|
|
45
34
|
import {
|
|
46
35
|
_cacheSessionSummary,
|
|
@@ -55,11 +44,9 @@ import {
|
|
|
55
44
|
withdrawPendingOwnCommit as _withdrawPendingOwnCommit,
|
|
56
45
|
recordOwnSessionCommit as _recordOwnSessionCommit,
|
|
57
46
|
} from './store/canonical-reader.mjs';
|
|
58
|
-
// Durable lifecycle reads
|
|
59
|
-
//
|
|
60
|
-
// stay unchanged.
|
|
47
|
+
// Durable lifecycle reads and live-cache reclamation are owned by dedicated
|
|
48
|
+
// modules; re-exported so prior importers of store.mjs stay unchanged.
|
|
61
49
|
export { readSessionLifecycleFromDisk, readSessionLifecycleStateFromDisk } from './store/lifecycle-read.mjs';
|
|
62
|
-
export { readSessionHeartbeatMtime } from './store/liveness-veto.mjs';
|
|
63
50
|
export { evictLiveSession, evictIdleLiveSessions } from './store/live-cache-eviction.mjs';
|
|
64
51
|
import {
|
|
65
52
|
setLiveSession,
|
|
@@ -78,7 +78,12 @@ export async function executeBatchCall(batch, call, callIndex) {
|
|
|
78
78
|
// Read entries are stat-validated; scoped entries retain dependency
|
|
79
79
|
// invalidation and their bounded TTL. A miss proceeds to execution.
|
|
80
80
|
function lookupCaches(batch, call, exec) {
|
|
81
|
-
const cached = lookupToolResultReuse({
|
|
81
|
+
const cached = lookupToolResultReuse({
|
|
82
|
+
sessionId: batch.sessionId,
|
|
83
|
+
call,
|
|
84
|
+
cwd: batch.cwd,
|
|
85
|
+
sessionRef: batch.sessionRef,
|
|
86
|
+
});
|
|
82
87
|
if (cached?.kind === 'read') exec.readCacheHit = cached.entry;
|
|
83
88
|
else if (cached?.kind === 'scoped') exec.scopedCacheHit = cached.entry;
|
|
84
89
|
}
|
|
@@ -115,9 +120,7 @@ async function executeLive(batch, call, callIndex, exec) {
|
|
|
115
120
|
// this session never received the discarded body.
|
|
116
121
|
let discardedRead = false;
|
|
117
122
|
if (eager !== undefined && eager.mutationEpoch < epoch.mutation && isEagerDispatchable(call.name, tools)) {
|
|
118
|
-
const stale = _isReadTool(call.name)
|
|
119
|
-
? mutationAffectsRead(epoch, eager.mutationEpoch, call, batch.cwd)
|
|
120
|
-
: true;
|
|
123
|
+
const stale = _isReadTool(call.name) ? mutationAffectsRead(epoch, eager.mutationEpoch, call, batch.cwd) : true;
|
|
121
124
|
if (stale) {
|
|
122
125
|
discardedRead = _isReadTool(call.name);
|
|
123
126
|
pending.delete(call.id);
|
|
@@ -176,14 +179,10 @@ async function executeSerially(batch, call, exec, suppressReadUnchangedStub = fa
|
|
|
176
179
|
exec.executionStartedAt = Date.now();
|
|
177
180
|
exec.serialExecutionStartedAt = exec.executionStartedAt;
|
|
178
181
|
exec.localSearchTelemetry = {};
|
|
179
|
-
exec.result = await executeToolFn(
|
|
180
|
-
call
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
sessionId,
|
|
184
|
-
sessionRef,
|
|
185
|
-
{ ...invocationOptions(batch, call, exec), ...(suppressReadUnchangedStub ? { suppressReadUnchangedStub: true } : {}) }
|
|
186
|
-
);
|
|
182
|
+
exec.result = await executeToolFn(call.name, call.arguments, cwd, sessionId, sessionRef, {
|
|
183
|
+
...invocationOptions(batch, call, exec),
|
|
184
|
+
...(suppressReadUnchangedStub ? { suppressReadUnchangedStub: true } : {}),
|
|
185
|
+
});
|
|
187
186
|
exec.toolEndedAt = Date.now();
|
|
188
187
|
classifyExecuted(call, exec);
|
|
189
188
|
}
|