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
|
@@ -5,30 +5,14 @@
|
|
|
5
5
|
// top-level id/closed/generation, foreign id) is left EXACTLY as it is — not
|
|
6
6
|
// deleted, not closed, not repaired.
|
|
7
7
|
import { readFileSync } from 'node:fs';
|
|
8
|
-
import {
|
|
9
|
-
import { isAgentOwner } from '../../../agent-owner.mjs';
|
|
8
|
+
import { isHistoricalAutomaticClosure } from '../../historical-session-closure.mjs';
|
|
10
9
|
import { readTopLevelLifecycleRecord, isLifecycleUnreadable } from '../../lifecycle-scan.mjs';
|
|
11
|
-
import {
|
|
12
|
-
import { sessionPath } from '../paths-heartbeat.mjs';
|
|
10
|
+
import { sessionPath } from '../session-paths.mjs';
|
|
13
11
|
import { probePath, PROBE_PRESENT, PROBE_ABSENT } from '../fs-probe.mjs';
|
|
14
12
|
import { _queueSessionSummaryUpsert, _queueSessionSummaryRemoval } from '../summary-cache.mjs';
|
|
15
13
|
import { deleteSession } from '../session-delete.mjs';
|
|
16
14
|
import { markSessionClosed } from '../lifecycle-barriers.mjs';
|
|
17
|
-
import {
|
|
18
|
-
AGENT_TERMINAL_STATUSES,
|
|
19
|
-
BLANK_SCRATCH_MAX_AGE_MS,
|
|
20
|
-
RUNNING_STALL_MS,
|
|
21
|
-
readSweepRecord,
|
|
22
|
-
retainedLinkedAgent,
|
|
23
|
-
} from './sweep-record.mjs';
|
|
24
|
-
|
|
25
|
-
/** The .hb sidecar mtime: 0 when proven absent, null when its liveness cannot
|
|
26
|
-
* be judged (an unreadable sidecar makes the record no sweep candidate). */
|
|
27
|
-
const heartbeatMtimeOf = (dir, id) => {
|
|
28
|
-
const probe = probePath(join(dir, `${id}.hb`));
|
|
29
|
-
if (probe.state === PROBE_PRESENT) return probe.mtimeMs || 0;
|
|
30
|
-
return probe.state === PROBE_ABSENT ? 0 : null;
|
|
31
|
-
};
|
|
15
|
+
import { BLANK_SCRATCH_MAX_AGE_MS, RUNNING_STALL_MS, readSweepRecord } from './sweep-record.mjs';
|
|
32
16
|
|
|
33
17
|
/** The AUTHORITATIVE on-disk fields, falling back to the best-effort (and
|
|
34
18
|
* possibly stale) summary row only where the record lacks them — a stale row
|
|
@@ -56,7 +40,7 @@ function sweepClosedRecord(ctx, row, actual, jsonPath) {
|
|
|
56
40
|
return;
|
|
57
41
|
}
|
|
58
42
|
// Closed sessions are EXEMPT from the freshness gate: a tombstone whose
|
|
59
|
-
// file
|
|
43
|
+
// file mtime keeps getting bumped would otherwise stay perpetually
|
|
60
44
|
// "fresh" and never mature. Maturity is governed ONLY by the ORIGINAL
|
|
61
45
|
// close time (disk updatedAt, not row.updatedAt which a stale row may
|
|
62
46
|
// carry from before the close).
|
|
@@ -64,7 +48,7 @@ function sweepClosedRecord(ctx, row, actual, jsonPath) {
|
|
|
64
48
|
const age = now - closedAt;
|
|
65
49
|
if (plan.sweepTombstones && Number.isFinite(closedAt) && age >= plan.tombstoneMaxAgeMs) {
|
|
66
50
|
try {
|
|
67
|
-
if (deleteSession(row.id, { deferSummaryUpdate: true })) {
|
|
51
|
+
if (deleteSession(row.id, { deferSummaryUpdate: true, legacyOwnerVeto: true })) {
|
|
68
52
|
tally.tombstonesCleaned++;
|
|
69
53
|
tally.tombstoneDetails.push({ id: row.id, ageSeconds: Math.floor(age / 1000) });
|
|
70
54
|
return;
|
|
@@ -96,14 +80,15 @@ function sweepClosedRecord(ctx, row, actual, jsonPath) {
|
|
|
96
80
|
* that permanence is a blank scratch: ZERO user/assistant conversation
|
|
97
81
|
* (engine boot artifact, force-killed window, crashed host) has nothing to
|
|
98
82
|
* preserve, and relaunch storms otherwise pile hundreds of "(blank)" rows
|
|
99
|
-
* that no sweep may touch. Reap once cold; liveness
|
|
100
|
-
* deleteSession still
|
|
101
|
-
|
|
83
|
+
* that no sweep may touch. Reap once cold; the liveness veto inside
|
|
84
|
+
* deleteSession still protects an in-flight boot, local or in a live older
|
|
85
|
+
* process. */
|
|
86
|
+
function sweepUserOwnedRecord(ctx, row, record, eff) {
|
|
102
87
|
const { plan, now, tally } = ctx;
|
|
103
88
|
const conversationCount = Number.isFinite(record.conversationCount)
|
|
104
89
|
? record.conversationCount
|
|
105
90
|
: Number(row.messageCount) || 0;
|
|
106
|
-
const lastActive = Math.max(eff.updatedAt, eff.lastHeartbeatAt, eff.createdAt
|
|
91
|
+
const lastActive = Math.max(eff.updatedAt, eff.lastHeartbeatAt, eff.createdAt);
|
|
107
92
|
if (
|
|
108
93
|
plan.sweepIdle &&
|
|
109
94
|
conversationCount === 0 &&
|
|
@@ -115,8 +100,7 @@ function sweepUserOwnedRecord(ctx, row, record, eff, heartbeatMtime) {
|
|
|
115
100
|
deleteSession(row.id, {
|
|
116
101
|
deferSummaryUpdate: true,
|
|
117
102
|
isSessionLive: plan.isSessionLive,
|
|
118
|
-
|
|
119
|
-
heartbeatFreshMs: BLANK_SCRATCH_MAX_AGE_MS,
|
|
103
|
+
legacyOwnerVeto: true,
|
|
120
104
|
})
|
|
121
105
|
) {
|
|
122
106
|
tally.openPruned++;
|
|
@@ -130,32 +114,17 @@ function sweepUserOwnedRecord(ctx, row, record, eff, heartbeatMtime) {
|
|
|
130
114
|
tally.remaining++;
|
|
131
115
|
}
|
|
132
116
|
|
|
133
|
-
/** Closes an idle session. Close is destructive
|
|
134
|
-
*
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const { plan, dir, now, tally } = ctx;
|
|
117
|
+
/** Closes an idle session. Close is destructive, so the in-memory runtime
|
|
118
|
+
* ownership is re-checked at the commit edge. */
|
|
119
|
+
function closeIdleRecord(ctx, row, eff, { lastActive }) {
|
|
120
|
+
const { plan, now, tally } = ctx;
|
|
138
121
|
if (plan.isSessionLive?.(row.id)) {
|
|
139
122
|
tally.remaining++;
|
|
140
123
|
return;
|
|
141
124
|
}
|
|
142
|
-
const preCloseHeartbeatMtime = heartbeatMtimeOf(dir, row.id);
|
|
143
|
-
if (preCloseHeartbeatMtime === null) {
|
|
144
|
-
// Unknown liveness at the destructive edge: do not close.
|
|
145
|
-
tally.remaining++;
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
if (preCloseHeartbeatMtime > 0 && now - preCloseHeartbeatMtime <= sessionMaxAge) {
|
|
149
|
-
tally.remaining++;
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
125
|
let closeResult = null;
|
|
153
126
|
try {
|
|
154
|
-
closeResult = markSessionClosed(row.id, 'idle-sweep', {
|
|
155
|
-
isSessionLive: plan.isSessionLive,
|
|
156
|
-
heartbeatSnapshotMtime: heartbeatMtime,
|
|
157
|
-
heartbeatFreshMs: sessionMaxAge,
|
|
158
|
-
});
|
|
127
|
+
closeResult = markSessionClosed(row.id, 'idle-sweep', { isSessionLive: plan.isSessionLive, legacyOwnerVeto: true });
|
|
159
128
|
} catch (err) {
|
|
160
129
|
process.stderr.write(`[session-store] idle-sweep close failed for ${row.id}: ${err?.message}\n`);
|
|
161
130
|
return;
|
|
@@ -174,51 +143,29 @@ function closeIdleRecord(ctx, row, eff, { lastActive, sessionMaxAge, heartbeatMt
|
|
|
174
143
|
|
|
175
144
|
/** An open record: the freshness gate, then user permanence, the running
|
|
176
145
|
* backstop, the idle close, or a retention-cap candidacy. */
|
|
177
|
-
function sweepOpenRecord(ctx, row, record, { jsonMtime
|
|
146
|
+
function sweepOpenRecord(ctx, row, record, { jsonMtime }) {
|
|
178
147
|
const { plan, now, tally } = ctx;
|
|
179
148
|
const eff = effectiveFields(record.doc, row);
|
|
180
|
-
const ownerRef = { owner: eff.owner };
|
|
181
149
|
const ownerNamed = typeof eff.owner === 'string' && eff.owner.length > 0;
|
|
182
|
-
// Completed agents use their provider's Advanced terminal duration rather
|
|
183
|
-
// than the general sweep cadence, so it is resolved before the freshness
|
|
184
|
-
// gate: a short provider override must not be hidden behind the default
|
|
185
|
-
// 5-minute gate.
|
|
186
|
-
const isCompletedAgent = isAgentOwner(ownerRef) && AGENT_TERMINAL_STATUSES.has(eff.status);
|
|
187
|
-
const terminalReapMs = isCompletedAgent ? resolveAgentTerminalReapMs(plan.terminalReapConfig, eff.provider) : null;
|
|
188
|
-
if (isCompletedAgent && terminalReapMs == null) {
|
|
189
|
-
tally.remaining++;
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
150
|
// Freshness gate — recently-touched open sessions are skipped cheaply here.
|
|
193
151
|
let freshnessGateMs = 0;
|
|
194
|
-
if (plan.sweepIdle) freshnessGateMs =
|
|
152
|
+
if (plan.sweepIdle) freshnessGateMs = plan.maxAge;
|
|
195
153
|
else if (plan.sweepTombstones) freshnessGateMs = plan.tombstoneMaxAgeMs;
|
|
196
|
-
const newestKnown = Math.max(
|
|
197
|
-
row.updatedAt || 0,
|
|
198
|
-
row.lastHeartbeatAt || 0,
|
|
199
|
-
row.createdAt || 0,
|
|
200
|
-
jsonMtime,
|
|
201
|
-
heartbeatMtime
|
|
202
|
-
);
|
|
154
|
+
const newestKnown = Math.max(row.updatedAt || 0, row.lastHeartbeatAt || 0, row.createdAt || 0, jsonMtime);
|
|
203
155
|
if (freshnessGateMs > 0 && newestKnown > 0 && now - newestKnown <= freshnessGateMs) {
|
|
204
156
|
// Fresh agent/legacy sessions survive idle close but still participate
|
|
205
157
|
// in the resumable-open retention cap. The cap performs its own
|
|
206
158
|
// commit-edge liveness veto before deletion.
|
|
207
|
-
if (plan.retainOpen && plan.sweepIdle &&
|
|
208
|
-
tally.openCandidates.push({
|
|
209
|
-
id: row.id,
|
|
210
|
-
lastActive: newestKnown,
|
|
211
|
-
heartbeatSnapshotMtime: heartbeatMtime,
|
|
212
|
-
heartbeatFreshMs: terminalReapMs ?? plan.maxAge,
|
|
213
|
-
});
|
|
159
|
+
if (plan.retainOpen && plan.sweepIdle && !ownerNamed) {
|
|
160
|
+
tally.openCandidates.push({ id: row.id, lastActive: newestKnown });
|
|
214
161
|
}
|
|
215
162
|
tally.remaining++;
|
|
216
163
|
return;
|
|
217
164
|
}
|
|
218
|
-
//
|
|
219
|
-
//
|
|
220
|
-
if (ownerNamed
|
|
221
|
-
sweepUserOwnedRecord(ctx, row, record, eff
|
|
165
|
+
// Every explicitly owned conversation has the same retention policy.
|
|
166
|
+
// Only ownerless legacy records enter idle closure and the retention cap.
|
|
167
|
+
if (ownerNamed) {
|
|
168
|
+
sweepUserOwnedRecord(ctx, row, record, eff);
|
|
222
169
|
return;
|
|
223
170
|
}
|
|
224
171
|
if (!plan.sweepIdle) {
|
|
@@ -227,17 +174,13 @@ function sweepOpenRecord(ctx, row, record, { jsonMtime, heartbeatMtime }) {
|
|
|
227
174
|
}
|
|
228
175
|
// The manager may sweep while unrelated sessions are active. Protect this
|
|
229
176
|
// specific locally-current/in-flight session regardless of stale on-disk
|
|
230
|
-
// timestamps; its
|
|
231
|
-
//
|
|
177
|
+
// timestamps; its in-memory runtime decides when it is safe to become an
|
|
178
|
+
// idle-sweep candidate.
|
|
232
179
|
if (plan.isSessionLive?.(row.id)) {
|
|
233
180
|
tally.remaining++;
|
|
234
181
|
return;
|
|
235
182
|
}
|
|
236
|
-
|
|
237
|
-
// serialising the full JSON, so it reflects true liveness more accurately
|
|
238
|
-
// than the JSON timestamp fields.
|
|
239
|
-
let lastActive = eff.lastHeartbeatAt || eff.updatedAt || eff.createdAt || 0;
|
|
240
|
-
if (heartbeatMtime) lastActive = Math.max(lastActive, heartbeatMtime);
|
|
183
|
+
const lastActive = eff.lastHeartbeatAt || eff.updatedAt || eff.createdAt || 0;
|
|
241
184
|
// Running sessions are normally reaped by the stream-watchdog within
|
|
242
185
|
// ~120s. Skip them here unless they've been silent past RUNNING_STALL_MS,
|
|
243
186
|
// at which point they are treated as zombies.
|
|
@@ -245,19 +188,11 @@ function sweepOpenRecord(ctx, row, record, { jsonMtime, heartbeatMtime }) {
|
|
|
245
188
|
tally.remaining++;
|
|
246
189
|
return;
|
|
247
190
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
closeIdleRecord(ctx, row, eff, { lastActive, sessionMaxAge, heartbeatMtime });
|
|
191
|
+
if (now - lastActive > plan.maxAge) {
|
|
192
|
+
closeIdleRecord(ctx, row, eff, { lastActive });
|
|
251
193
|
return;
|
|
252
194
|
}
|
|
253
|
-
if (plan.retainOpen) {
|
|
254
|
-
tally.openCandidates.push({
|
|
255
|
-
id: row.id,
|
|
256
|
-
lastActive,
|
|
257
|
-
heartbeatSnapshotMtime: heartbeatMtime,
|
|
258
|
-
heartbeatFreshMs: sessionMaxAge,
|
|
259
|
-
});
|
|
260
|
-
}
|
|
195
|
+
if (plan.retainOpen) tally.openCandidates.push({ id: row.id, lastActive });
|
|
261
196
|
tally.remaining++;
|
|
262
197
|
}
|
|
263
198
|
|
|
@@ -277,11 +212,6 @@ export function sweepRow(ctx, row) {
|
|
|
277
212
|
tally.remaining++;
|
|
278
213
|
return;
|
|
279
214
|
}
|
|
280
|
-
const heartbeatMtime = heartbeatMtimeOf(ctx.dir, row.id);
|
|
281
|
-
if (heartbeatMtime === null) {
|
|
282
|
-
tally.remaining++;
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
215
|
// Truth source: the summary index is a deferred/best-effort sidecar, so a
|
|
286
216
|
// row can still claim status='idle'/open while the session JSON was
|
|
287
217
|
// already tombstoned. Read the real session JSON BEFORE the freshness gate
|
|
@@ -299,10 +229,7 @@ export function sweepRow(ctx, row) {
|
|
|
299
229
|
// One strict parse for the whole record: every decision below reads the
|
|
300
230
|
// SAME authoritative document (owner/status/timestamps/messages).
|
|
301
231
|
const actual = record.doc;
|
|
302
|
-
if (
|
|
303
|
-
// Parent-owned agent transcripts are task history, not ephemeral worker
|
|
304
|
-
// cache. This covers both new open sessions and tombstones created by
|
|
305
|
-
// older Mixdog versions.
|
|
232
|
+
if (isHistoricalAutomaticClosure(actual)) {
|
|
306
233
|
tally.remaining++;
|
|
307
234
|
return;
|
|
308
235
|
}
|
|
@@ -310,5 +237,5 @@ export function sweepRow(ctx, row) {
|
|
|
310
237
|
sweepClosedRecord(ctx, row, actual, jsonPath);
|
|
311
238
|
return;
|
|
312
239
|
}
|
|
313
|
-
sweepOpenRecord(ctx, row, record, { jsonMtime: jsonProbe.mtimeMs || 0
|
|
240
|
+
sweepOpenRecord(ctx, row, record, { jsonMtime: jsonProbe.mtimeMs || 0 });
|
|
314
241
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* that decide whether bytes may be committed — no queueing, no commit, no
|
|
6
6
|
* markers — which is why they stay out of the write pipeline itself.
|
|
7
7
|
*/
|
|
8
|
-
import { sessionPath } from './paths
|
|
8
|
+
import { sessionPath } from './session-paths.mjs';
|
|
9
9
|
import {
|
|
10
10
|
readCanonicalSessionRecord as _readCanonicalRecord,
|
|
11
11
|
CANONICAL_RECORD_UNREADABLE as LIFECYCLE_AMBIGUOUS,
|
|
@@ -5,30 +5,27 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export function listStoredAgentWorkers({
|
|
7
7
|
now,
|
|
8
|
-
|
|
8
|
+
runningSessionIds,
|
|
9
9
|
storedAgentWorkerIndexRows,
|
|
10
10
|
projectChildWorkerRow,
|
|
11
|
-
promoteHeartbeatSidecar,
|
|
12
11
|
storedLeadWorkerRows,
|
|
13
12
|
projectLeadWorkerRow,
|
|
14
13
|
pruneOrphanChildRows,
|
|
15
14
|
}) {
|
|
15
|
+
const context = { now, runningSessionIds };
|
|
16
16
|
const bySessionId = new Map();
|
|
17
17
|
for (const row of storedAgentWorkerIndexRows()) {
|
|
18
|
-
const projected = projectChildWorkerRow(row,
|
|
18
|
+
const projected = projectChildWorkerRow(row, context);
|
|
19
19
|
if (projected) bySessionId.set(projected.sessionId, projected);
|
|
20
20
|
}
|
|
21
|
-
for (const [sessionId, heartbeatAt] of heartbeatMtimes) {
|
|
22
|
-
promoteHeartbeatSidecar(bySessionId, sessionId, heartbeatAt);
|
|
23
|
-
}
|
|
24
21
|
const liveLeadSessionIds = new Set();
|
|
25
22
|
for (const row of storedLeadWorkerRows()) {
|
|
26
|
-
const projected = projectLeadWorkerRow(row,
|
|
23
|
+
const projected = projectLeadWorkerRow(row, context);
|
|
27
24
|
if (!projected) continue;
|
|
28
25
|
liveLeadSessionIds.add(projected.sessionId);
|
|
29
26
|
bySessionId.set(projected.sessionId, projected);
|
|
30
27
|
}
|
|
31
|
-
pruneOrphanChildRows(bySessionId, { liveLeadSessionIds
|
|
28
|
+
pruneOrphanChildRows(bySessionId, { liveLeadSessionIds });
|
|
32
29
|
return [...bySessionId.values()].sort((left, right) => {
|
|
33
30
|
const leftTime = Date.parse(String(left.startedAt || '')) || 0;
|
|
34
31
|
const rightTime = Date.parse(String(right.startedAt || '')) || 0;
|