@adhdev/daemon-core 0.9.82-rc.48 → 0.9.82-rc.481
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/dist/boot/daemon-lifecycle.d.ts +9 -0
- package/dist/boot/process-hardening.d.ts +50 -0
- package/dist/build-info.d.ts +37 -0
- package/dist/chat/source-machine.d.ts +166 -0
- package/dist/chat/source-resolver.d.ts +104 -0
- package/dist/chat/subscription-updates.d.ts +1 -0
- package/dist/cli-adapter-types.d.ts +68 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +220 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +126 -64
- package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
- package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
- package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
- package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
- package/dist/cli-adapters/resolve-executable.d.ts +69 -0
- package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
- package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
- package/dist/cli-adapters/terminal-screen.d.ts +4 -11
- package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
- package/dist/commands/chat-commands-read.d.ts +23 -0
- package/dist/commands/chat-commands-scope.d.ts +39 -0
- package/dist/commands/chat-commands-shared.d.ts +33 -0
- package/dist/commands/chat-commands-write.d.ts +14 -0
- package/dist/commands/chat-commands.d.ts +10 -23
- package/dist/commands/cli-manager.d.ts +51 -1
- package/dist/commands/handler.d.ts +125 -0
- package/dist/commands/high-family/index.d.ts +3 -0
- package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
- package/dist/commands/high-family/mesh-events.d.ts +2 -0
- package/dist/commands/high-family/mesh-status.d.ts +2 -0
- package/dist/commands/high-family/types.d.ts +64 -0
- package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
- package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
- package/dist/commands/low-family/diagnostics.d.ts +2 -0
- package/dist/commands/low-family/index.d.ts +3 -0
- package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
- package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
- package/dist/commands/low-family/notification.d.ts +2 -0
- package/dist/commands/low-family/refine-config.d.ts +2 -0
- package/dist/commands/low-family/session-host.d.ts +2 -0
- package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
- package/dist/commands/low-family/status-meta.d.ts +2 -0
- package/dist/commands/low-family/types.d.ts +33 -0
- package/dist/commands/med-family/cli-agent.d.ts +2 -0
- package/dist/commands/med-family/fast-forward.d.ts +2 -0
- package/dist/commands/med-family/ide.d.ts +10 -0
- package/dist/commands/med-family/index.d.ts +3 -0
- package/dist/commands/med-family/mesh-crud.d.ts +48 -0
- package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
- package/dist/commands/med-family/mesh-queue.d.ts +2 -0
- package/dist/commands/med-family/mesh-restart.d.ts +2 -0
- package/dist/commands/med-family/types.d.ts +152 -0
- package/dist/commands/mesh-coordinator.d.ts +85 -1
- package/dist/commands/router-aggregate-status.d.ts +24 -0
- package/dist/commands/router-mesh-session-owner.d.ts +59 -0
- package/dist/commands/router-refine.d.ts +137 -0
- package/dist/commands/router-worktree-cleanup.d.ts +133 -0
- package/dist/commands/router.d.ts +204 -15
- package/dist/commands/upgrade-helper.d.ts +41 -1
- package/dist/config/chat-history.d.ts +11 -0
- package/dist/config/config.d.ts +19 -0
- package/dist/config/mesh-config.d.ts +136 -1
- package/dist/config/mesh-json-config.d.ts +199 -0
- package/dist/config/registry-resolver.d.ts +54 -0
- package/dist/config/repo-settings.d.ts +77 -0
- package/dist/config/state-store.d.ts +30 -0
- package/dist/daemon/dev-server.d.ts +0 -2
- package/dist/detection/cli-detector.d.ts +17 -0
- package/dist/detection/ide-detector.d.ts +13 -0
- package/dist/detection/win32-ide-version.d.ts +37 -0
- package/dist/git/change-impact-config.d.ts +159 -0
- package/dist/git/git-commands.d.ts +26 -2
- package/dist/git/git-diff.d.ts +6 -0
- package/dist/git/git-executor.d.ts +11 -0
- package/dist/git/git-status.d.ts +57 -0
- package/dist/git/git-types.d.ts +2 -50
- package/dist/git/git-worktree.d.ts +71 -1
- package/dist/git/index.d.ts +3 -1
- package/dist/index.d.ts +73 -17
- package/dist/index.js +52979 -18657
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +59496 -25355
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +1 -4
- package/dist/ipc/local-ipc-server.d.ts +91 -0
- package/dist/launch.d.ts +1 -1
- package/dist/logging/async-batch-writer.d.ts +10 -0
- package/dist/logging/debug-config.d.ts +16 -0
- package/dist/logging/log-redactor.d.ts +24 -0
- package/dist/logging/log-tail-reader.d.ts +81 -0
- package/dist/logging/logger.d.ts +1 -1
- package/dist/mesh/contracts.d.ts +230 -0
- package/dist/mesh/coordinator-prompt.d.ts +76 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +203 -0
- package/dist/mesh/mesh-clone-grace.d.ts +8 -0
- package/dist/mesh/mesh-completion-synthesis.d.ts +4 -0
- package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
- package/dist/mesh/mesh-delivery-policy.d.ts +104 -0
- package/dist/mesh/mesh-event-classify.d.ts +7 -0
- package/dist/mesh/mesh-event-forwarding.d.ts +49 -0
- package/dist/mesh/mesh-event-trace.d.ts +21 -0
- package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
- package/dist/mesh/mesh-events-pending.d.ts +246 -0
- package/dist/mesh/mesh-events-stale.d.ts +61 -0
- package/dist/mesh/mesh-events-utils.d.ts +75 -0
- package/dist/mesh/mesh-events.d.ts +6 -49
- package/dist/mesh/mesh-fast-forward.d.ts +81 -0
- package/dist/mesh/mesh-host-ownership.d.ts +29 -0
- package/dist/mesh/mesh-init.d.ts +128 -0
- package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
- package/dist/mesh/mesh-ledger.d.ts +139 -1
- package/dist/mesh/mesh-magi-status.d.ts +63 -0
- package/dist/mesh/mesh-missions.d.ts +281 -0
- package/dist/mesh/mesh-node-identity.d.ts +310 -0
- package/dist/mesh/mesh-queue-assignment.d.ts +158 -0
- package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
- package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
- package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
- package/dist/mesh/mesh-reconcile-loop.d.ts +80 -0
- package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
- package/dist/mesh/mesh-refine-batch.d.ts +68 -0
- package/dist/mesh/mesh-refine-gates.d.ts +428 -0
- package/dist/mesh/mesh-refine-status.d.ts +62 -0
- package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
- package/dist/mesh/mesh-review-inbox.d.ts +90 -0
- package/dist/mesh/mesh-routing.d.ts +70 -0
- package/dist/mesh/mesh-runtime-store.d.ts +508 -0
- package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
- package/dist/mesh/mesh-task-inflight.d.ts +46 -0
- package/dist/mesh/mesh-task-stats.d.ts +49 -0
- package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
- package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
- package/dist/mesh/mesh-work-queue.d.ts +363 -5
- package/dist/mesh/preview-freshness.d.ts +28 -0
- package/dist/mesh/refine-config.d.ts +216 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
- package/dist/providers/acp-provider-instance.d.ts +5 -0
- package/dist/providers/approval-utils.d.ts +46 -0
- package/dist/providers/chat-message-normalization.d.ts +58 -1
- package/dist/providers/cli-provider-effect-format.d.ts +30 -0
- package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
- package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
- package/dist/providers/cli-provider-instance-types.d.ts +45 -0
- package/dist/providers/cli-provider-instance.d.ts +406 -30
- package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
- package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
- package/dist/providers/contracts.d.ts +149 -6
- package/dist/providers/external-sources.d.ts +71 -0
- package/dist/providers/manual-attendance.d.ts +79 -0
- package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
- package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
- package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
- package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
- package/dist/providers/native-history/constants.d.ts +12 -0
- package/dist/providers/native-history/dispatcher.d.ts +44 -0
- package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
- package/dist/providers/native-history/index.d.ts +13 -0
- package/dist/providers/provider-instance-manager.d.ts +29 -0
- package/dist/providers/provider-instance.d.ts +30 -1
- package/dist/providers/provider-loader.d.ts +42 -5
- package/dist/providers/provider-trust.d.ts +31 -0
- package/dist/providers/read-chat-contract.d.ts +29 -0
- package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
- package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
- package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
- package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
- package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
- package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
- package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
- package/dist/providers/sdk/v1/index.d.ts +30 -0
- package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
- package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
- package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
- package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
- package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
- package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
- package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
- package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
- package/dist/providers/spec/adapter.d.ts +98 -0
- package/dist/providers/spec/cli-adapter.d.ts +223 -0
- package/dist/providers/spec/evaluator.d.ts +45 -0
- package/dist/providers/spec/fsm-driver.d.ts +449 -0
- package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
- package/dist/providers/spec/fsm-loader.d.ts +14 -0
- package/dist/providers/spec/fsm-types.d.ts +202 -0
- package/dist/providers/spec/native-history-executor.d.ts +41 -0
- package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
- package/dist/providers/spec/route.d.ts +4 -0
- package/dist/providers/spec/types.d.ts +244 -0
- package/dist/providers/status-monitor.d.ts +7 -7
- package/dist/providers/transcript-v2.d.ts +176 -0
- package/dist/providers/types/interactive-prompt.d.ts +84 -0
- package/dist/providers/working-dir.d.ts +17 -0
- package/dist/repo-mesh-types.d.ts +629 -12
- package/dist/runtime-defaults.d.ts +2 -0
- package/dist/session-host/managed-host.d.ts +64 -0
- package/dist/session-host/runtime-surface.d.ts +10 -16
- package/dist/sessions/registry.d.ts +26 -0
- package/dist/shared-types-extra.d.ts +2 -4
- package/dist/shared-types.d.ts +98 -55
- package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
- package/dist/status/normalize.d.ts +1 -1
- package/dist/status/normalize.js +1 -0
- package/dist/status/normalize.js.map +1 -1
- package/dist/status/normalize.mjs +1 -0
- package/dist/status/normalize.mjs.map +1 -1
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +26 -0
- package/dist/system/hash.d.ts +8 -0
- package/dist/system/load-better-sqlite3.d.ts +21 -0
- package/dist/types.d.ts +5 -0
- package/package.json +11 -4
- package/src/agent-stream/poller.ts +2 -3
- package/src/agent-stream/provider-adapter.ts +1 -1
- package/src/boot/daemon-lifecycle.ts +80 -14
- package/src/boot/process-hardening.ts +89 -0
- package/src/build-info.ts +73 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +20 -1
- package/src/cli-adapter-types.d.ts +3 -1
- package/src/cli-adapter-types.ts +68 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1282 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +954 -1144
- package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
- package/src/cli-adapters/provider-cli-parse.ts +19 -0
- package/src/cli-adapters/provider-cli-runtime.ts +56 -7
- package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
- package/src/cli-adapters/provider-cli-shared.ts +121 -11
- package/src/cli-adapters/pty-transport.ts +2 -1
- package/src/cli-adapters/pty-write-chunking.ts +106 -0
- package/src/cli-adapters/raw-terminal-io.ts +252 -0
- package/src/cli-adapters/resolve-executable.ts +204 -0
- package/src/cli-adapters/session-host-transport.ts +2 -1
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
- package/src/cli-adapters/terminal-backends/types.ts +10 -3
- package/src/cli-adapters/terminal-screen.ts +16 -81
- package/src/commands/chat-commands-debug-bundle.ts +398 -0
- package/src/commands/chat-commands-read.ts +2767 -0
- package/src/commands/chat-commands-scope.ts +54 -0
- package/src/commands/chat-commands-shared.ts +114 -0
- package/src/commands/chat-commands-write.ts +891 -0
- package/src/commands/chat-commands.ts +19 -1841
- package/src/commands/cli-manager.d.ts +2 -0
- package/src/commands/cli-manager.ts +659 -27
- package/src/commands/handler.ts +845 -2
- package/src/commands/high-family/index.ts +28 -0
- package/src/commands/high-family/mesh-coordinator-launch.ts +680 -0
- package/src/commands/high-family/mesh-events.ts +102 -0
- package/src/commands/high-family/mesh-status.ts +849 -0
- package/src/commands/high-family/types.ts +80 -0
- package/src/commands/low-family/coordinator-prompt.ts +72 -0
- package/src/commands/low-family/daemon-lifecycle.ts +120 -0
- package/src/commands/low-family/diagnostics.ts +57 -0
- package/src/commands/low-family/index.ts +37 -0
- package/src/commands/low-family/mesh-ledger.ts +62 -0
- package/src/commands/low-family/mesh-node-logs.ts +87 -0
- package/src/commands/low-family/notification.ts +116 -0
- package/src/commands/low-family/refine-config.ts +106 -0
- package/src/commands/low-family/session-host.ts +282 -0
- package/src/commands/low-family/spec-providerdev.ts +217 -0
- package/src/commands/low-family/status-meta.ts +112 -0
- package/src/commands/low-family/types.ts +39 -0
- package/src/commands/med-family/cli-agent.ts +241 -0
- package/src/commands/med-family/fast-forward.ts +230 -0
- package/src/commands/med-family/ide.ts +163 -0
- package/src/commands/med-family/index.ts +37 -0
- package/src/commands/med-family/mesh-crud.ts +1287 -0
- package/src/commands/med-family/mesh-host-pairing.ts +234 -0
- package/src/commands/med-family/mesh-queue.ts +167 -0
- package/src/commands/med-family/mesh-restart.ts +92 -0
- package/src/commands/med-family/types.ts +153 -0
- package/src/commands/mesh-coordinator.ts +334 -124
- package/src/commands/router-aggregate-status.ts +209 -0
- package/src/commands/router-mesh-session-owner.ts +114 -0
- package/src/commands/router-refine.ts +1711 -0
- package/src/commands/router-worktree-cleanup.ts +870 -0
- package/src/commands/router.ts +795 -4143
- package/src/commands/stream-commands.ts +8 -0
- package/src/commands/upgrade-helper.ts +310 -45
- package/src/config/chat-history.ts +517 -24
- package/src/config/config.ts +30 -0
- package/src/config/mesh-config.ts +632 -23
- package/src/config/mesh-json-config.ts +376 -0
- package/src/config/recent-activity.ts +8 -2
- package/src/config/registry-resolver.ts +100 -0
- package/src/config/repo-settings.ts +111 -0
- package/src/config/state-store.ts +55 -0
- package/src/daemon/dev-auto-implement.ts +3 -2
- package/src/daemon/dev-cli-debug.ts +10 -1
- package/src/daemon/dev-server.ts +0 -541
- package/src/detection/cli-detector.ts +94 -9
- package/src/detection/ide-detector.ts +55 -16
- package/src/detection/win32-ide-version.ts +106 -0
- package/src/git/change-impact-config.ts +354 -0
- package/src/git/git-commands.ts +112 -16
- package/src/git/git-diff.ts +81 -11
- package/src/git/git-executor.ts +12 -0
- package/src/git/git-status.ts +767 -48
- package/src/git/git-types.ts +14 -62
- package/src/git/git-worktree.ts +261 -4
- package/src/git/index.ts +17 -0
- package/src/index.ts +213 -13
- package/src/installer.d.ts +1 -1
- package/src/installer.ts +8 -6
- package/src/ipc/local-ipc-server.ts +278 -0
- package/src/launch.d.ts +1 -1
- package/src/launch.ts +37 -28
- package/src/logging/async-batch-writer.ts +55 -0
- package/src/logging/command-log.ts +7 -5
- package/src/logging/debug-config.ts +25 -0
- package/src/logging/debug-trace.ts +7 -2
- package/src/logging/log-redactor.ts +100 -0
- package/src/logging/log-tail-reader.ts +341 -0
- package/src/logging/logger.ts +14 -7
- package/src/mesh/contracts.ts +469 -0
- package/src/mesh/coordinator-prompt.ts +572 -34
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +706 -0
- package/src/mesh/mesh-clone-grace.ts +68 -0
- package/src/mesh/mesh-completion-synthesis.ts +416 -0
- package/src/mesh/mesh-coordinator-config.ts +97 -0
- package/src/mesh/mesh-delivery-policy.ts +284 -0
- package/src/mesh/mesh-event-classify.ts +78 -0
- package/src/mesh/mesh-event-forwarding.ts +2002 -0
- package/src/mesh/mesh-event-trace.ts +67 -0
- package/src/mesh/mesh-events-coordinator.ts +32 -0
- package/src/mesh/mesh-events-pending.ts +1494 -0
- package/src/mesh/mesh-events-stale.ts +452 -0
- package/src/mesh/mesh-events-utils.ts +443 -0
- package/src/mesh/mesh-events.ts +43 -1035
- package/src/mesh/mesh-fast-forward.ts +856 -0
- package/src/mesh/mesh-host-ownership.ts +111 -0
- package/src/mesh/mesh-init.ts +350 -0
- package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
- package/src/mesh/mesh-ledger.ts +898 -102
- package/src/mesh/mesh-magi-status.ts +223 -0
- package/src/mesh/mesh-missions.ts +695 -0
- package/src/mesh/mesh-node-identity.ts +2065 -0
- package/src/mesh/mesh-queue-assignment.ts +2263 -0
- package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
- package/src/mesh/mesh-reconcile-config.ts +66 -0
- package/src/mesh/mesh-reconcile-identity.ts +103 -0
- package/src/mesh/mesh-reconcile-loop.ts +1473 -0
- package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
- package/src/mesh/mesh-refine-batch.ts +205 -0
- package/src/mesh/mesh-refine-gates.ts +1686 -0
- package/src/mesh/mesh-refine-status.ts +231 -0
- package/src/mesh/mesh-remote-event-pull.ts +279 -0
- package/src/mesh/mesh-review-inbox.ts +308 -0
- package/src/mesh/mesh-routing.ts +291 -0
- package/src/mesh/mesh-runtime-store.ts +2150 -0
- package/src/mesh/mesh-scheduling-runtime.ts +198 -0
- package/src/mesh/mesh-task-inflight.ts +70 -0
- package/src/mesh/mesh-task-stats.ts +161 -0
- package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
- package/src/mesh/mesh-warmup-deadline.ts +152 -0
- package/src/mesh/mesh-work-queue.ts +1437 -147
- package/src/mesh/preview-freshness.ts +163 -0
- package/src/mesh/refine-config.ts +423 -0
- package/src/mesh/worktree-bootstrap-config.ts +599 -0
- package/src/providers/acp-provider-instance.ts +43 -10
- package/src/providers/approval-utils.d.ts +5 -0
- package/src/providers/approval-utils.ts +100 -6
- package/src/providers/chat-message-normalization.ts +126 -4
- package/src/providers/cli-provider-effect-format.ts +53 -0
- package/src/providers/cli-provider-history-dedup.ts +75 -0
- package/src/providers/cli-provider-input-prompt.ts +133 -0
- package/src/providers/cli-provider-instance-types.ts +131 -0
- package/src/providers/cli-provider-instance.ts +2709 -499
- package/src/providers/cli-provider-status-helpers.ts +123 -0
- package/src/providers/cli-provider-transcript-merge.ts +114 -0
- package/src/providers/contracts.d.ts +55 -0
- package/src/providers/contracts.ts +160 -6
- package/src/providers/extension-provider-instance.ts +12 -7
- package/src/providers/external-sources.ts +218 -0
- package/src/providers/ide-provider-instance.ts +35 -12
- package/src/providers/manual-attendance.ts +105 -0
- package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
- package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
- package/src/providers/native-history/claude-cli-transcript.ts +396 -0
- package/src/providers/native-history/codex-cli-transcript.ts +479 -0
- package/src/providers/native-history/constants.ts +19 -0
- package/src/providers/native-history/dispatcher.ts +617 -0
- package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
- package/src/providers/native-history/index.ts +30 -0
- package/src/providers/provider-instance-manager.ts +71 -0
- package/src/providers/provider-instance.ts +24 -1
- package/src/providers/provider-loader.ts +700 -55
- package/src/providers/provider-schema.ts +87 -14
- package/src/providers/provider-trust.ts +114 -0
- package/src/providers/read-chat-contract.ts +76 -16
- package/src/providers/sdk/README.md +49 -0
- package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
- package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
- package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
- package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
- package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
- package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
- package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
- package/src/providers/sdk/v1/index.ts +152 -0
- package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
- package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
- package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
- package/src/providers/sdk/v1/schemas/cli/provider.schema.json +509 -0
- package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
- package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
- package/src/providers/sdk/v1/types/cli/index.ts +365 -0
- package/src/providers/sdk/v1/types/common/index.ts +229 -0
- package/src/providers/sdk/v1/validators/index.ts +19 -0
- package/src/providers/sdk/v1/validators/manifest.ts +110 -0
- package/src/providers/sdk/v1/validators/taint.ts +309 -0
- package/src/providers/spec/adapter.ts +246 -0
- package/src/providers/spec/cli-adapter.ts +1064 -0
- package/src/providers/spec/evaluator.ts +407 -0
- package/src/providers/spec/fsm-driver.ts +1528 -0
- package/src/providers/spec/fsm-evaluator.ts +290 -0
- package/src/providers/spec/fsm-loader.ts +128 -0
- package/src/providers/spec/fsm-types.ts +301 -0
- package/src/providers/spec/native-history-executor.ts +1241 -0
- package/src/providers/spec/pre-launch-trust.ts +104 -0
- package/src/providers/spec/route.ts +51 -0
- package/src/providers/spec/types.ts +284 -0
- package/src/providers/status-monitor.d.ts +7 -7
- package/src/providers/status-monitor.ts +37 -22
- package/src/providers/transcript-v2.ts +567 -0
- package/src/providers/types/interactive-prompt.ts +536 -0
- package/src/providers/version-archive.ts +64 -24
- package/src/providers/working-dir.ts +23 -0
- package/src/repo-mesh-types.ts +868 -13
- package/src/runtime-defaults.ts +39 -0
- package/src/session-host/managed-host.ts +218 -0
- package/src/session-host/runtime-surface.ts +20 -80
- package/src/sessions/registry.ts +44 -0
- package/src/shared-types-extra.ts +2 -4
- package/src/shared-types.d.ts +8 -0
- package/src/shared-types.ts +136 -55
- package/src/status/builders.ts +26 -6
- package/src/status/chat-tail-hot-sessions.ts +117 -2
- package/src/status/normalize.ts +2 -0
- package/src/status/reporter.ts +19 -1
- package/src/status/snapshot.ts +95 -26
- package/src/system/hash.ts +23 -0
- package/src/system/host-memory.ts +29 -12
- package/src/system/load-better-sqlite3.ts +68 -0
- package/src/types.ts +5 -0
- package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
- package/dist/mesh/mesh-sync.d.ts +0 -53
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
- package/src/mesh/mesh-sync.ts +0 -111
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
import type { MeshTaskStatus, MeshWorkQueueEntry } from './mesh-work-queue.js';
|
|
2
|
+
export interface MeshInflightHoldRow {
|
|
3
|
+
taskId: string;
|
|
4
|
+
meshId: string | null;
|
|
5
|
+
holdReason: string | null;
|
|
6
|
+
heldAt: number | null;
|
|
7
|
+
firstIdleSinceAck: number | null;
|
|
8
|
+
readFailureCount: number | null;
|
|
9
|
+
updatedAt: number | null;
|
|
10
|
+
}
|
|
11
|
+
export declare class MeshRuntimeStore {
|
|
12
|
+
private static instance;
|
|
13
|
+
private readonly db;
|
|
14
|
+
private readonly dbPath;
|
|
15
|
+
private readonly migratedMeshIds;
|
|
16
|
+
private fingerprintSweepCounter;
|
|
17
|
+
private walWriteCounter;
|
|
18
|
+
private toolCallLogCounter;
|
|
19
|
+
private static readonly WAL_CHECK_INTERVAL;
|
|
20
|
+
private static readonly WAL_MAX_BYTES;
|
|
21
|
+
private constructor();
|
|
22
|
+
private static loggedGetInstanceFailure;
|
|
23
|
+
static getInstance(): MeshRuntimeStore;
|
|
24
|
+
static resetForTests(): void;
|
|
25
|
+
close(): void;
|
|
26
|
+
transaction<T>(fn: () => T): T;
|
|
27
|
+
private migrate;
|
|
28
|
+
private tableColumns;
|
|
29
|
+
/**
|
|
30
|
+
* MESH-ISOLATION-LEAK migration. Two tables historically lacked a `mesh_id` column,
|
|
31
|
+
* letting one machine that belongs to multiple meshes (multiple repos) leak rows
|
|
32
|
+
* across meshes. Both migrations are idempotent and run on every boot — the column
|
|
33
|
+
* check short-circuits once the new schema is in place.
|
|
34
|
+
*/
|
|
35
|
+
private migrateMeshIsolationColumns;
|
|
36
|
+
hasCompletionFingerprint(meshId: string, fingerprint: string): boolean;
|
|
37
|
+
recordCompletionFingerprint(meshId: string, fingerprint: string, ttlMs: number): void;
|
|
38
|
+
sweepExpiredFingerprints(): void;
|
|
39
|
+
private maybeCheckpointWal;
|
|
40
|
+
private ensureLegacyQueueMigrated;
|
|
41
|
+
getQueueEntries(meshId: string, statuses?: MeshTaskStatus[]): MeshWorkQueueEntry[];
|
|
42
|
+
getQueueRevision(meshId: string): string;
|
|
43
|
+
replaceQueue(meshId: string, queue: MeshWorkQueueEntry[]): void;
|
|
44
|
+
deleteQueue(meshId: string): void;
|
|
45
|
+
insertQueueEntry(entry: MeshWorkQueueEntry): void;
|
|
46
|
+
updateQueueEntry(entry: MeshWorkQueueEntry): void;
|
|
47
|
+
findQueueEntryById(meshId: string, id: string): MeshWorkQueueEntry | null;
|
|
48
|
+
hasActiveAssignment(meshId: string, sessionId: string, nodeId: string): boolean;
|
|
49
|
+
/** A session may only execute one task at a time, regardless of task mode. */
|
|
50
|
+
private hasActiveSessionAssignment;
|
|
51
|
+
/** A node may only execute one write task at a time (worktree isolation). */
|
|
52
|
+
private hasActiveNodeAssignment;
|
|
53
|
+
/**
|
|
54
|
+
* Count active (status='assigned') tasks on a node, regardless of provider or
|
|
55
|
+
* task mode. This is the load metric for least-loaded / round-robin ranking:
|
|
56
|
+
* the scheduler prefers the node with the fewest active assignments so
|
|
57
|
+
* untargeted work spreads instead of piling onto whichever node asks first.
|
|
58
|
+
*/
|
|
59
|
+
nodeActiveAssignmentCount(meshId: string, nodeId: string): number;
|
|
60
|
+
/**
|
|
61
|
+
* O(1) count of queue tasks in 'pending' status for a mesh. A COUNT(*) over the
|
|
62
|
+
* indexed status column, so it avoids JSON.parse-ing every queue row — used as a
|
|
63
|
+
* cheap guard before the reconcile loop runs a full triggerMeshQueue scan.
|
|
64
|
+
*/
|
|
65
|
+
pendingQueueTaskCount(meshId: string): number;
|
|
66
|
+
/**
|
|
67
|
+
* Read the current per-mesh round-robin cursor (0 when unset). Used to rotate
|
|
68
|
+
* the tie-break winner among nodes tied at the least load.
|
|
69
|
+
*/
|
|
70
|
+
getSchedulerCursor(meshId: string): number;
|
|
71
|
+
/**
|
|
72
|
+
* Atomically advance the per-mesh round-robin cursor by one and return the
|
|
73
|
+
* value that was current BEFORE the bump (the value the caller should rotate
|
|
74
|
+
* by for this pass). UPSERT keeps it lock-free across concurrent passes.
|
|
75
|
+
*/
|
|
76
|
+
bumpSchedulerCursor(meshId: string): number;
|
|
77
|
+
private mapInflightHoldRow;
|
|
78
|
+
upsertInflightHold(entry: {
|
|
79
|
+
taskId: string;
|
|
80
|
+
meshId?: string | null;
|
|
81
|
+
holdReason?: string | null;
|
|
82
|
+
heldAt?: number | null;
|
|
83
|
+
firstIdleSinceAck?: number | null;
|
|
84
|
+
readFailureCount?: number | null;
|
|
85
|
+
}): void;
|
|
86
|
+
getInflightHold(taskId: string): MeshInflightHoldRow | null;
|
|
87
|
+
listInflightHoldsByMesh(meshId: string): MeshInflightHoldRow[];
|
|
88
|
+
deleteInflightHold(taskId: string): void;
|
|
89
|
+
/**
|
|
90
|
+
* Count active (status='assigned') tasks on a (node, provider) combination,
|
|
91
|
+
* matched by the assignedProviderType stamped on the payload at claim time.
|
|
92
|
+
* Drives the per-(node, provider) maxParallel cap (RepoMeshNodePolicy
|
|
93
|
+
* providerRoles). The active-assignment set for a single node is tiny, so
|
|
94
|
+
* parsing payloads here is cheap and avoids a schema migration. Pre-cap legacy
|
|
95
|
+
* rows (no provider stamp) and other providers on the same node do not consume
|
|
96
|
+
* this provider's budget, so the cap is fully backward compatible.
|
|
97
|
+
*/
|
|
98
|
+
private activeProviderAssignmentCount;
|
|
99
|
+
claimNextQueueTask(meshId: string, nodeId: string, sessionId: string, capabilityTags?: string[], opts?: {
|
|
100
|
+
providerType?: string;
|
|
101
|
+
providerMaxParallel?: number;
|
|
102
|
+
nodeIsWorktree?: boolean;
|
|
103
|
+
}): MeshWorkQueueEntry | null;
|
|
104
|
+
getQueueStatsByStatus(meshId: string): {
|
|
105
|
+
status: string;
|
|
106
|
+
count: number;
|
|
107
|
+
}[];
|
|
108
|
+
getActiveAssignmentDetails(meshId: string): Array<{
|
|
109
|
+
id: string;
|
|
110
|
+
nodeId?: string;
|
|
111
|
+
sessionId?: string;
|
|
112
|
+
message: string;
|
|
113
|
+
}>;
|
|
114
|
+
/**
|
|
115
|
+
* Resolve the `assigned` queue row a completion event belongs to.
|
|
116
|
+
*
|
|
117
|
+
* Clock-skew safety (C2): a completion event's `occurredAtIso` carries the
|
|
118
|
+
* REMOTE WORKER's clock, while `updated_at` carries the COORDINATOR's clock
|
|
119
|
+
* (set at assignment and re-bumped on every mutation). For a remote node,
|
|
120
|
+
* coordinator-clock > worker-clock skew used to make an `updated_at <= occurredAt`
|
|
121
|
+
* filter return nothing, stranding the finished task as `assigned` forever.
|
|
122
|
+
*
|
|
123
|
+
* We therefore NEVER filter completion-matching on the mutable `updated_at`:
|
|
124
|
+
* 1. If `taskId` is given, match the exact `assigned` row by id (no time filter).
|
|
125
|
+
* 2. Otherwise a session holds at most one `assigned` task — match it without a
|
|
126
|
+
* time filter. If several exist (shouldn't normally), disambiguate by the
|
|
127
|
+
* IMMUTABLE `dispatchTimestamp`: latest `dispatchTimestamp <= occurredAt`,
|
|
128
|
+
* and if skew makes ALL of them later than `occurredAt`, fall back to the
|
|
129
|
+
* most-recent `dispatchTimestamp` rather than returning null.
|
|
130
|
+
*/
|
|
131
|
+
findAssignedBySession(meshId: string, sessionId: string, occurredAtIso?: string, taskId?: string): MeshWorkQueueEntry | null;
|
|
132
|
+
private toRow;
|
|
133
|
+
insertDirectDispatch(entry: {
|
|
134
|
+
taskId: string;
|
|
135
|
+
meshId: string;
|
|
136
|
+
nodeId?: string;
|
|
137
|
+
sessionId?: string;
|
|
138
|
+
providerType?: string;
|
|
139
|
+
message: string;
|
|
140
|
+
taskMode?: string;
|
|
141
|
+
via: string;
|
|
142
|
+
dispatchedToIdleSession?: boolean;
|
|
143
|
+
dispatchedAt: string;
|
|
144
|
+
}): void;
|
|
145
|
+
getActiveDirectDispatches(meshId: string): Array<{
|
|
146
|
+
taskId: string;
|
|
147
|
+
meshId: string;
|
|
148
|
+
nodeId: string | null;
|
|
149
|
+
sessionId: string | null;
|
|
150
|
+
providerType: string | null;
|
|
151
|
+
message: string;
|
|
152
|
+
taskMode: string | null;
|
|
153
|
+
via: string;
|
|
154
|
+
status: string;
|
|
155
|
+
dispatchedToIdleSession: boolean;
|
|
156
|
+
dispatchedAt: string;
|
|
157
|
+
updatedAt: string;
|
|
158
|
+
}>;
|
|
159
|
+
updateDirectDispatchStatus(meshId: string, sessionId: string, status: 'acked' | 'completed' | 'failed' | 'stale', taskId?: string): void;
|
|
160
|
+
/**
|
|
161
|
+
* MESH-DISPATCH-MISROUTE (fix 3, consumer residual): resolve the task_id of the SINGLE
|
|
162
|
+
* non-terminal direct dispatch a session owns. Returns the task_id only when the session
|
|
163
|
+
* holds exactly ONE active ('dispatched'/'acked') row — the case where a taskId-less
|
|
164
|
+
* lifecycle event (a legacy/relayed worker whose producer never stamped meshActiveTaskId)
|
|
165
|
+
* unambiguously belongs to that one dispatch. With zero rows there is nothing to ack; with
|
|
166
|
+
* two or more (a re-dispatch/nudge sibling) the firing event's owner is ambiguous, so we
|
|
167
|
+
* return null and the caller MUST NOT fall back to the session_id sweep that would flip a
|
|
168
|
+
* sibling row ("may flip a sibling dispatch row"). This narrows the legacy fallback to the
|
|
169
|
+
* only safe case instead of removing the producer-side TASKIDLESS stamp's safety net.
|
|
170
|
+
*/
|
|
171
|
+
getSoleActiveDirectDispatchTaskId(meshId: string, sessionId: string): string | null;
|
|
172
|
+
cleanupTerminalDirectDispatches(olderThanMs: number): void;
|
|
173
|
+
deleteDirectDispatches(meshId: string): void;
|
|
174
|
+
/**
|
|
175
|
+
* Delete specific direct dispatch rows by taskId for a mesh. Used by the staleDirect prune
|
|
176
|
+
* path to remove orphaned/terminal dispatch records whose node/session is no longer in the
|
|
177
|
+
* live mesh. Returns the number of rows actually deleted. No-op for an empty taskId list.
|
|
178
|
+
*/
|
|
179
|
+
deleteDirectDispatchesByTaskId(meshId: string, taskIds: string[]): number;
|
|
180
|
+
markStaleDirectDispatches(meshId: string, olderThanMs: number): void;
|
|
181
|
+
setRemoteIdleSession(meshId: string, nodeId: string, sessionId: string, providerType: string, expiresAt: number, metadata?: any): void;
|
|
182
|
+
getRemoteIdleSessions(meshId: string): Array<{
|
|
183
|
+
nodeId: string;
|
|
184
|
+
sessionId: string;
|
|
185
|
+
providerType: string;
|
|
186
|
+
expiresAt: number;
|
|
187
|
+
metadata?: any;
|
|
188
|
+
}>;
|
|
189
|
+
deleteRemoteIdleSession(meshId: string, nodeId: string, sessionId: string): void;
|
|
190
|
+
pruneExpiredRemoteIdleSessions(): void;
|
|
191
|
+
insertSessionDelivery(entry: {
|
|
192
|
+
id: string;
|
|
193
|
+
meshId: string;
|
|
194
|
+
nodeId?: string;
|
|
195
|
+
sessionId?: string;
|
|
196
|
+
providerType?: string;
|
|
197
|
+
taskId?: string;
|
|
198
|
+
kind: string;
|
|
199
|
+
priority?: number;
|
|
200
|
+
message: string;
|
|
201
|
+
status: string;
|
|
202
|
+
deliverAfter?: string;
|
|
203
|
+
expiresAt?: string;
|
|
204
|
+
sourceCoordinatorSessionId?: string;
|
|
205
|
+
sourceCoordinatorDaemonId?: string;
|
|
206
|
+
createdAt: string;
|
|
207
|
+
updatedAt: string;
|
|
208
|
+
}): void;
|
|
209
|
+
updateSessionDeliveryStatus(id: string, status: string, opts?: {
|
|
210
|
+
lastError?: string;
|
|
211
|
+
incrementAttempt?: boolean;
|
|
212
|
+
}): void;
|
|
213
|
+
getActiveSessionDeliveries(meshId: string, sessionId?: string): Array<{
|
|
214
|
+
id: string;
|
|
215
|
+
meshId: string;
|
|
216
|
+
nodeId: string | null;
|
|
217
|
+
sessionId: string | null;
|
|
218
|
+
providerType: string | null;
|
|
219
|
+
taskId: string | null;
|
|
220
|
+
kind: string;
|
|
221
|
+
priority: number;
|
|
222
|
+
message: string;
|
|
223
|
+
status: string;
|
|
224
|
+
deliverAfter: string | null;
|
|
225
|
+
expiresAt: string | null;
|
|
226
|
+
attemptCount: number;
|
|
227
|
+
sourceCoordinatorSessionId: string | null;
|
|
228
|
+
sourceCoordinatorDaemonId: string | null;
|
|
229
|
+
lastError: string | null;
|
|
230
|
+
createdAt: string;
|
|
231
|
+
updatedAt: string;
|
|
232
|
+
}>;
|
|
233
|
+
/**
|
|
234
|
+
* Bug B watchdog support: true when at least one delivery record for the task has
|
|
235
|
+
* reached a confirmed-handed-off status (delivered / acked / completed). The
|
|
236
|
+
* assigned-stranded watchdog uses this to distinguish a dispatch that was never
|
|
237
|
+
* confirmed (reclaimable) from one that WAS handed to the worker (a genuinely
|
|
238
|
+
* in-flight or completion-lost task, which is PHASE 4's responsibility, not this
|
|
239
|
+
* watchdog's). Indexed by (mesh_id, task_id).
|
|
240
|
+
*/
|
|
241
|
+
taskHasConfirmedDelivery(meshId: string, taskId: string): boolean;
|
|
242
|
+
expireStaleSessionDeliveries(meshId: string): void;
|
|
243
|
+
deleteSessionDeliveries(meshId: string): void;
|
|
244
|
+
/**
|
|
245
|
+
* Record a mesh tool call and check whether this mesh+tool combination is
|
|
246
|
+
* being called too rapidly (sliding window rate guard).
|
|
247
|
+
*
|
|
248
|
+
* Returns a rate-limit advisory string when the call rate is too high, null otherwise.
|
|
249
|
+
* windowMs: sliding window size in ms (default 10s)
|
|
250
|
+
* maxCalls: max allowed calls within the window (default 5)
|
|
251
|
+
*/
|
|
252
|
+
recordMeshToolCall(opts: {
|
|
253
|
+
meshId: string;
|
|
254
|
+
tool: string;
|
|
255
|
+
sessionId?: string | null;
|
|
256
|
+
windowMs?: number;
|
|
257
|
+
maxCalls?: number;
|
|
258
|
+
}): {
|
|
259
|
+
rateLimitExceeded: boolean;
|
|
260
|
+
callsInWindow: number;
|
|
261
|
+
advisory: string | null;
|
|
262
|
+
};
|
|
263
|
+
/**
|
|
264
|
+
* Prune tool call log entries older than the given age in ms.
|
|
265
|
+
* Exposed for testing.
|
|
266
|
+
*/
|
|
267
|
+
pruneToolCallLog(olderThanMs: number): void;
|
|
268
|
+
appendLedgerEntry(entry: {
|
|
269
|
+
id: string;
|
|
270
|
+
meshId: string;
|
|
271
|
+
timestamp: string;
|
|
272
|
+
kind: string;
|
|
273
|
+
nodeId?: string | null;
|
|
274
|
+
sessionId?: string | null;
|
|
275
|
+
providerType?: string | null;
|
|
276
|
+
payload?: unknown;
|
|
277
|
+
}): void;
|
|
278
|
+
readLedgerEntries(meshId: string, opts?: {
|
|
279
|
+
tail?: number;
|
|
280
|
+
since?: string;
|
|
281
|
+
kind?: string;
|
|
282
|
+
limit?: number;
|
|
283
|
+
}): Array<{
|
|
284
|
+
id: string;
|
|
285
|
+
meshId: string;
|
|
286
|
+
timestamp: string;
|
|
287
|
+
kind: string;
|
|
288
|
+
nodeId: string | null;
|
|
289
|
+
sessionId: string | null;
|
|
290
|
+
providerType: string | null;
|
|
291
|
+
payload: unknown;
|
|
292
|
+
}>;
|
|
293
|
+
/**
|
|
294
|
+
* G2 read cutover: read ledger entries in append order (oldest first),
|
|
295
|
+
* matching legacy JSONL file-order semantics. Ties on the same timestamp
|
|
296
|
+
* are broken by rowid (insertion order), preserving the positional
|
|
297
|
+
* guarantee that mesh-events relies on for same-millisecond entries.
|
|
298
|
+
*/
|
|
299
|
+
readLedgerEntriesOrdered(meshId: string, opts?: {
|
|
300
|
+
since?: string;
|
|
301
|
+
kinds?: string[];
|
|
302
|
+
tail?: number;
|
|
303
|
+
}): Array<{
|
|
304
|
+
id: string;
|
|
305
|
+
meshId: string;
|
|
306
|
+
timestamp: string;
|
|
307
|
+
kind: string;
|
|
308
|
+
nodeId: string | null;
|
|
309
|
+
sessionId: string | null;
|
|
310
|
+
providerType: string | null;
|
|
311
|
+
payload: unknown;
|
|
312
|
+
}>;
|
|
313
|
+
/** Remove all ledger entries for a mesh (mesh deletion / test cleanup). */
|
|
314
|
+
clearLedgerForMesh(meshId: string): number;
|
|
315
|
+
/** G2: remove entries moved to the JSONL archive so the SQLite runtime set mirrors the active ledger. */
|
|
316
|
+
deleteLedgerEntries(meshId: string, ids: string[]): number;
|
|
317
|
+
hasLedgerEntry(meshId: string, id: string): boolean;
|
|
318
|
+
ledgerEntryCount(meshId: string): number;
|
|
319
|
+
importLedgerEntries(entries: Array<{
|
|
320
|
+
id: string;
|
|
321
|
+
meshId: string;
|
|
322
|
+
timestamp: string;
|
|
323
|
+
kind: string;
|
|
324
|
+
nodeId?: string | null;
|
|
325
|
+
sessionId?: string | null;
|
|
326
|
+
providerType?: string | null;
|
|
327
|
+
payload?: unknown;
|
|
328
|
+
}>): number;
|
|
329
|
+
/**
|
|
330
|
+
* G4: Read a bounded, cursor-addressable ledger slice directly from the SQLite
|
|
331
|
+
* mesh_event_ledger table. This is the P2P reconcile read path; JSONL files are
|
|
332
|
+
* retained as export/import/debug/legacy artifacts only.
|
|
333
|
+
*
|
|
334
|
+
* The return shape is structurally compatible with MeshLedgerSlice so callers
|
|
335
|
+
* in mesh-tools.ts can pass it directly to buildMeshLedgerReplicaEvidence.
|
|
336
|
+
*/
|
|
337
|
+
readLedgerSlice(meshId: string, opts?: {
|
|
338
|
+
afterId?: string;
|
|
339
|
+
since?: string;
|
|
340
|
+
kind?: string;
|
|
341
|
+
limit?: number;
|
|
342
|
+
}): {
|
|
343
|
+
protocol: 'adhdev.mesh.ledger.slice.v1';
|
|
344
|
+
meshId: string;
|
|
345
|
+
entries: Array<{
|
|
346
|
+
id: string;
|
|
347
|
+
meshId: string;
|
|
348
|
+
timestamp: string;
|
|
349
|
+
kind: string;
|
|
350
|
+
nodeId: string | null;
|
|
351
|
+
sessionId: string | null;
|
|
352
|
+
providerType: string | null;
|
|
353
|
+
payload: unknown;
|
|
354
|
+
}>;
|
|
355
|
+
cursor: {
|
|
356
|
+
afterId: string | null;
|
|
357
|
+
nextAfterId: string | null;
|
|
358
|
+
limit: number;
|
|
359
|
+
hasMore: boolean;
|
|
360
|
+
};
|
|
361
|
+
sourceOfTruth: {
|
|
362
|
+
kind: 'local_sqlite';
|
|
363
|
+
table: 'mesh_event_ledger';
|
|
364
|
+
bounded: true;
|
|
365
|
+
maxLimit: number;
|
|
366
|
+
};
|
|
367
|
+
};
|
|
368
|
+
insertPendingEvent(event: {
|
|
369
|
+
id: string;
|
|
370
|
+
meshId: string;
|
|
371
|
+
coordinatorDaemonId?: string | null;
|
|
372
|
+
event: string;
|
|
373
|
+
payload?: unknown;
|
|
374
|
+
fingerprint?: string | null;
|
|
375
|
+
queuedAt: number;
|
|
376
|
+
protocolVersion?: string | null;
|
|
377
|
+
eventId?: string | null;
|
|
378
|
+
scope?: string | null;
|
|
379
|
+
dispatchedBy?: string | null;
|
|
380
|
+
intendedFor?: string | null;
|
|
381
|
+
}): boolean;
|
|
382
|
+
/**
|
|
383
|
+
* Drain undrained pending events for a mesh, atomically marking them drained.
|
|
384
|
+
* When `opts.onlyEvents` is supplied, ONLY rows whose `event` is in that set are
|
|
385
|
+
* drained — the rest stay queued (drained=0) for a later drain. This is how the
|
|
386
|
+
* reconcile loop force-drains terminal/force-inject events into a *generating*
|
|
387
|
+
* coordinator while leaving non-force progress events for the coordinator's next
|
|
388
|
+
* idle transition. Filtering happens inside the same transaction as the
|
|
389
|
+
* drained=1 marking, so force-drain + a concurrent full drain can never both
|
|
390
|
+
* consume the same row.
|
|
391
|
+
*/
|
|
392
|
+
drainPendingEvents(meshId: string, coordinatorDaemonId?: string | null | ReadonlyArray<string>, opts?: {
|
|
393
|
+
onlyEvents?: ReadonlySet<string>;
|
|
394
|
+
}): Array<{
|
|
395
|
+
id: string;
|
|
396
|
+
event: string;
|
|
397
|
+
payload: unknown;
|
|
398
|
+
}>;
|
|
399
|
+
/** Non-destructive peek — returns undrained events without marking them drained. */
|
|
400
|
+
peekPendingEvents(meshId: string, coordinatorDaemonId?: string | null | ReadonlyArray<string>): Array<{
|
|
401
|
+
id: string;
|
|
402
|
+
event: string;
|
|
403
|
+
payload: unknown;
|
|
404
|
+
}>;
|
|
405
|
+
hasPendingEventFingerprint(meshId: string, fingerprint: string): boolean;
|
|
406
|
+
/**
|
|
407
|
+
* B3a — v2 eventId idempotency. Returns true when a row with this event_id has
|
|
408
|
+
* ALREADY been drained (drained = 1) for the mesh. Drained rows are retained
|
|
409
|
+
* (soft-marked, not deleted until mesh deletion), so this is a durable, restart-
|
|
410
|
+
* surviving dedup: a v2 event whose eventId was already consumed is skipped on
|
|
411
|
+
* re-delivery even when its content fingerprint differs. Scoped by mesh_id +
|
|
412
|
+
* the partial event_id index (idx_mesh_pending_events_event_id).
|
|
413
|
+
*/
|
|
414
|
+
hasDrainedEventId(meshId: string, eventId: string): boolean;
|
|
415
|
+
/**
|
|
416
|
+
* B3a — snapshot of the v2 event_ids ALREADY drained (drained = 1) for the mesh.
|
|
417
|
+
* Taken BEFORE a drain call marks the current batch drained=1, so the resulting
|
|
418
|
+
* set names only PRIOR drains — the re-delivery dedup baseline. (Reading it after
|
|
419
|
+
* the drain would self-match the batch's own freshly-drained rows.) Non-v2 rows
|
|
420
|
+
* have a NULL event_id and are excluded by the index/WHERE.
|
|
421
|
+
*/
|
|
422
|
+
drainedEventIdsForMesh(meshId: string): Set<string>;
|
|
423
|
+
upsertMission(mission: {
|
|
424
|
+
id: string;
|
|
425
|
+
meshId: string;
|
|
426
|
+
title: string;
|
|
427
|
+
goal?: string;
|
|
428
|
+
status?: string;
|
|
429
|
+
source?: string;
|
|
430
|
+
}): void;
|
|
431
|
+
getMission(meshId: string, missionId: string): {
|
|
432
|
+
id: string;
|
|
433
|
+
meshId: string;
|
|
434
|
+
title: string;
|
|
435
|
+
goal: string;
|
|
436
|
+
status: string;
|
|
437
|
+
source?: string;
|
|
438
|
+
closeCandidateEmittedAt?: string;
|
|
439
|
+
createdAt: string;
|
|
440
|
+
updatedAt: string;
|
|
441
|
+
} | null;
|
|
442
|
+
getMissions(meshId: string, statuses?: string[]): Array<{
|
|
443
|
+
id: string;
|
|
444
|
+
meshId: string;
|
|
445
|
+
title: string;
|
|
446
|
+
goal: string;
|
|
447
|
+
status: string;
|
|
448
|
+
source?: string;
|
|
449
|
+
closeCandidateEmittedAt?: string;
|
|
450
|
+
createdAt: string;
|
|
451
|
+
updatedAt: string;
|
|
452
|
+
}>;
|
|
453
|
+
/**
|
|
454
|
+
* G3: set/clear the mission_close_candidate idempotency marker. Passing an ISO
|
|
455
|
+
* timestamp records that the all-terminal nudge has been emitted for this mission;
|
|
456
|
+
* passing null clears it (mission returned to a non-terminal state, so a future
|
|
457
|
+
* re-completion may nudge again). Touches ONLY this column — never the mission's
|
|
458
|
+
* updated_at — so the marker write is invisible to updatedAt-ordered surfaces and
|
|
459
|
+
* does not masquerade as mission activity. Returns rows changed (0 if no such mission).
|
|
460
|
+
*/
|
|
461
|
+
setMissionCloseCandidateEmittedAt(meshId: string, missionId: string, emittedAt: string | null): number;
|
|
462
|
+
/** Remove all missions for a mesh — mesh deletion / test cleanup. */
|
|
463
|
+
clearMissionsForMesh(meshId: string): number;
|
|
464
|
+
/** Remove all pending-event rows (drained included) for a mesh — mesh deletion / test cleanup. */
|
|
465
|
+
clearPendingEventsForMesh(meshId: string): number;
|
|
466
|
+
pendingEventCount(meshId: string): number;
|
|
467
|
+
/**
|
|
468
|
+
* Mark specific pending-event rows drained by id (ack). Used by the
|
|
469
|
+
* unresolved-delegate durable-forward outbox: an event is peeked (not drained)
|
|
470
|
+
* while its push to the coordinator is unconfirmed, then marked drained ONLY
|
|
471
|
+
* after the push is acked. A failed push leaves the row undrained so the next
|
|
472
|
+
* reconcile tick retries it. Returns the number of rows newly marked drained.
|
|
473
|
+
*/
|
|
474
|
+
markPendingEventsDrainedById(ids: ReadonlyArray<string>): number;
|
|
475
|
+
/**
|
|
476
|
+
* Hard-delete pending-event rows by id (including the dedup fingerprint history).
|
|
477
|
+
* Used to expire an unresolved-delegate outbox entry that has exhausted its retry
|
|
478
|
+
* budget — fully removing it frees the fingerprint so a genuinely new completion
|
|
479
|
+
* for the same task could be re-queued later. Returns the number of rows deleted.
|
|
480
|
+
*/
|
|
481
|
+
deletePendingEventsById(ids: ReadonlyArray<string>): number;
|
|
482
|
+
/**
|
|
483
|
+
* Retention prune for mesh_pending_events. This table has no lifecycle GC of its
|
|
484
|
+
* own: a drained row is soft-marked (drained=1) and RETAINED — deliberately, so
|
|
485
|
+
* drainedEventIdsForMesh() has a durable v2-eventId dedup baseline — and an
|
|
486
|
+
* undrained row queued for a coordinator that never returned (a dead/evicted
|
|
487
|
+
* coordinator identity) stays drained=0 forever. Both accumulate without bound
|
|
488
|
+
* (observed: tens of thousands of rows, mostly stale). This is the missing
|
|
489
|
+
* retention step. Two independent windows:
|
|
490
|
+
*
|
|
491
|
+
* - drained rows older than `drainedOlderThanMs`: the coordinator consumed them
|
|
492
|
+
* long ago; the only thing they still back is the eventId re-delivery guard,
|
|
493
|
+
* which is only meaningful for the recent past (a re-delivery of a week-old
|
|
494
|
+
* event cannot occur — its producer session is long gone). Safe to delete.
|
|
495
|
+
* - UNDRAINED rows older than `undrainedOlderThanMs` (a much wider window):
|
|
496
|
+
* these are orphaned events for a coordinator identity that never drained
|
|
497
|
+
* them. Kept wide so a genuinely-offline-but-returning coordinator still
|
|
498
|
+
* receives its backlog; only genuinely unrecoverable orphans are swept.
|
|
499
|
+
*
|
|
500
|
+
* Both windows key off `queued_at` (always present) — `drained_at` can be NULL on
|
|
501
|
+
* legacy rows. Returns the number of rows deleted. Best-effort / idempotent:
|
|
502
|
+
* running it repeatedly with nothing to prune is a cheap no-op.
|
|
503
|
+
*/
|
|
504
|
+
prunePendingEvents(opts: {
|
|
505
|
+
drainedOlderThanMs: number;
|
|
506
|
+
undrainedOlderThanMs: number;
|
|
507
|
+
}): number;
|
|
508
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { RepoMeshNodePolicy, RepoMeshSchedulingStrategy } from '../repo-mesh-types.js';
|
|
2
|
+
import type { MeshWorkQueueEntry } from './mesh-work-queue.js';
|
|
3
|
+
/** Per-(node, provider) cap and its current consumption. */
|
|
4
|
+
export interface MeshNodeProviderSchedulingRuntime {
|
|
5
|
+
providerType: string;
|
|
6
|
+
/** Declared maxParallel cap for this (node, provider). Omitted when uncapped. */
|
|
7
|
+
maxParallel?: number;
|
|
8
|
+
/** Active (status='assigned') tasks on this node claimed by this provider. */
|
|
9
|
+
activeAssigned: number;
|
|
10
|
+
/** True when activeAssigned has reached maxParallel (a further claim is refused). */
|
|
11
|
+
capReached: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** Per-node scheduling-runtime projection. */
|
|
14
|
+
export interface MeshNodeSchedulingRuntime {
|
|
15
|
+
nodeId: string;
|
|
16
|
+
/** Active (status='assigned') task count on this node — the least-loaded rank key. */
|
|
17
|
+
load: number;
|
|
18
|
+
/** Soft scheduling priority (PRIORITY rank key; higher = preferred). */
|
|
19
|
+
schedulingPriority: number;
|
|
20
|
+
/** Per-node concurrent-session cap, when configured. */
|
|
21
|
+
maxConcurrentSessions?: number;
|
|
22
|
+
/** Per-(node, provider) caps + consumption, when providerRoles declares any. */
|
|
23
|
+
providerRoles?: MeshNodeProviderSchedulingRuntime[];
|
|
24
|
+
/**
|
|
25
|
+
* True when the node currently cannot claim a NEW write (non-readonly) task —
|
|
26
|
+
* either the global write cap is exhausted or a node-local gate (active write
|
|
27
|
+
* assignment / a fully-consumed provider cap / session cap) blocks it.
|
|
28
|
+
*/
|
|
29
|
+
capReached: boolean;
|
|
30
|
+
/** Structured reasons backing capReached (empty when the node can take work). */
|
|
31
|
+
capReasons: string[];
|
|
32
|
+
}
|
|
33
|
+
/** Mesh-level scheduling-runtime projection. */
|
|
34
|
+
export interface MeshSchedulingRuntime {
|
|
35
|
+
/** Resolved tie-break strategy (defaults to 'first_eligible'). */
|
|
36
|
+
strategy: RepoMeshSchedulingStrategy;
|
|
37
|
+
/** Effective global write-task parallel cap (clamped). */
|
|
38
|
+
maxParallelTasks: number;
|
|
39
|
+
/** Derived read-only diagnosis cap (max(2, 2× write cap)) — mirrors the claim path. */
|
|
40
|
+
maxReadonlyParallelTasks: number;
|
|
41
|
+
/** Current global write (non-readonly) assigned-task load. */
|
|
42
|
+
activeWriteAssigned: number;
|
|
43
|
+
/** Current global read-only assigned-task load. */
|
|
44
|
+
activeReadonlyAssigned: number;
|
|
45
|
+
/** True when the global write cap is exhausted (no new write task can launch). */
|
|
46
|
+
globalWriteCapReached: boolean;
|
|
47
|
+
/** True when the read-only diagnosis cap is exhausted. */
|
|
48
|
+
globalReadonlyCapReached: boolean;
|
|
49
|
+
/** Per-node projections, in mesh config order. */
|
|
50
|
+
nodes: MeshNodeSchedulingRuntime[];
|
|
51
|
+
}
|
|
52
|
+
interface MeshLike {
|
|
53
|
+
policy?: {
|
|
54
|
+
schedulingStrategy?: unknown;
|
|
55
|
+
maxParallelTasks?: unknown;
|
|
56
|
+
} | null;
|
|
57
|
+
nodes?: Array<{
|
|
58
|
+
id?: string;
|
|
59
|
+
nodeId?: string;
|
|
60
|
+
node_id?: string;
|
|
61
|
+
policy?: RepoMeshNodePolicy | null;
|
|
62
|
+
isLocalWorktree?: boolean;
|
|
63
|
+
}> | null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build the scheduling-runtime projection for a mesh from its config + a snapshot of
|
|
67
|
+
* its work queue. Pure and side-effect free — safe to call on any read path.
|
|
68
|
+
*
|
|
69
|
+
* The derivation deliberately mirrors maybeAutoLaunchOneQueueSession's gates so the
|
|
70
|
+
* exposed "capReached/capReasons" match why a real claim would be refused:
|
|
71
|
+
* • global write cap → activeWriteAssigned >= maxParallelTasks
|
|
72
|
+
* • node write conflict→ a node already holding an assigned write task (worktree isolation)
|
|
73
|
+
* • provider cap → a (node, provider) at its declared maxParallel
|
|
74
|
+
* It does NOT re-evaluate eligibility/required-tags (those are task-specific); it only
|
|
75
|
+
* reports the capacity picture, which is what an operator needs to read load balance.
|
|
76
|
+
*/
|
|
77
|
+
export declare function buildMeshSchedulingRuntime(mesh: MeshLike | null | undefined, queue: MeshWorkQueueEntry[]): MeshSchedulingRuntime;
|
|
78
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CANON-IDENTITY single-flight dispatch guard.
|
|
3
|
+
*
|
|
4
|
+
* A queue task is double-dispatched into two worker sessions when a SECOND dispatch
|
|
5
|
+
* path opens after the first has already claimed + dispatched the task. The two
|
|
6
|
+
* observed paths:
|
|
7
|
+
* - the idle-claim drain / auto-launch both funnel through tryAssignQueueTask,
|
|
8
|
+
* which is serialized by the atomic claim transaction (claimNextQueueTask) — so
|
|
9
|
+
* two concurrent claims can never both win; and
|
|
10
|
+
* - the operator requeue tool (mesh_queue_requeue → requeueTask), which flips an
|
|
11
|
+
* already-`assigned` row back to `pending` REGARDLESS of whether the worker
|
|
12
|
+
* holding it is still generating. A requeue issued while the worker is mid-turn
|
|
13
|
+
* re-opens the task for a SECOND session to claim — the live `ade8586d` race.
|
|
14
|
+
*
|
|
15
|
+
* The atomic claim already discriminates pending-vs-assigned, but it cannot tell a
|
|
16
|
+
* GENUINELY-in-flight assigned row (dispatched, worker generating) from a STALE
|
|
17
|
+
* assigned row (dead session, dispatch never confirmed) — and the requeue contract
|
|
18
|
+
* must still reopen the stale case. This module is that discriminator: a task id is
|
|
19
|
+
* registered here ONLY by the dispatch path at the moment it hands the claimed task
|
|
20
|
+
* to a transport, and cleared the moment the task leaves the `assigned` state
|
|
21
|
+
* (terminal completion/failure, dispatch-failure requeue, cancel, reclaim, or a
|
|
22
|
+
* forced requeue). requeueTask consults it and refuses (no-op) to reopen a task that
|
|
23
|
+
* is still in-flight unless the caller passes `force`.
|
|
24
|
+
*
|
|
25
|
+
* Dependency-free leaf (no imports) so both mesh-queue-assignment (begin) and
|
|
26
|
+
* mesh-work-queue (clear + the requeue guard) can import it without a cycle. The key
|
|
27
|
+
* is `${meshId}::${taskId}`; a task id is a single-form UUID, so no daemon-id
|
|
28
|
+
* normalization is needed on the key itself.
|
|
29
|
+
*/
|
|
30
|
+
/**
|
|
31
|
+
* Mark a task as actively dispatched/generating (in-flight). Called by the dispatch
|
|
32
|
+
* path right after a successful claim, before/as the task is handed to a transport.
|
|
33
|
+
* Returns true when this call transitioned the task into the in-flight set, false
|
|
34
|
+
* when it was already in-flight (a redundant begin — the caller may treat that as a
|
|
35
|
+
* signal that a dispatch is already live for this task).
|
|
36
|
+
*/
|
|
37
|
+
export declare function beginTaskDispatchInFlight(meshId: string, taskId: string): boolean;
|
|
38
|
+
/** True while a task is actively dispatched/generating (registered by the dispatch
|
|
39
|
+
* path and not yet cleared by a terminal/requeue/cancel transition). */
|
|
40
|
+
export declare function isTaskDispatchInFlight(meshId: string, taskId: string): boolean;
|
|
41
|
+
/** Clear a task's in-flight mark. Called whenever the task leaves the `assigned`
|
|
42
|
+
* state (terminal completion/failure, dispatch-failure requeue, cancel, reclaim, or
|
|
43
|
+
* a forced requeue). Idempotent / safe to call when the task was never in-flight. */
|
|
44
|
+
export declare function endTaskDispatchInFlight(meshId: string, taskId: string): void;
|
|
45
|
+
/** Test-only: drop all in-flight marks so a fresh test starts from a clean guard. */
|
|
46
|
+
export declare function __resetTaskDispatchInFlightForTests(): void;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M7: Operational stats (time/attempts) derived from existing truth.
|
|
3
|
+
*
|
|
4
|
+
* No cost/token accounting — ADHDev observes PTY/CDP and cannot see API
|
|
5
|
+
* tokens (explicit non-goal). Everything here is derived at query time from
|
|
6
|
+
* the SQLite ledger and queue rows; there is no separate aggregate table.
|
|
7
|
+
* Tasks with missing ledger evidence report incompleteEvidence instead of
|
|
8
|
+
* estimated numbers.
|
|
9
|
+
*/
|
|
10
|
+
export interface MeshTaskStats {
|
|
11
|
+
taskId: string;
|
|
12
|
+
status: string;
|
|
13
|
+
dispatchedAt: string | null;
|
|
14
|
+
terminalAt: string | null;
|
|
15
|
+
terminalKind: 'task_completed' | 'task_failed' | null;
|
|
16
|
+
/** dispatched → terminal wall clock; null when evidence is incomplete. */
|
|
17
|
+
durationMs: number | null;
|
|
18
|
+
/** Number of task_dispatched ledger entries observed for this task. */
|
|
19
|
+
dispatchCount: number;
|
|
20
|
+
/** Queue requeueCount (0 when the row is gone or never requeued). */
|
|
21
|
+
requeueCount: number;
|
|
22
|
+
/** True when dispatch or terminal ledger evidence is missing — numbers are withheld, never estimated. */
|
|
23
|
+
incompleteEvidence?: true;
|
|
24
|
+
}
|
|
25
|
+
export interface MeshMissionStats {
|
|
26
|
+
missionId: string;
|
|
27
|
+
taskCount: number;
|
|
28
|
+
completed: number;
|
|
29
|
+
failed: number;
|
|
30
|
+
/** Sum of per-task durations with complete evidence. */
|
|
31
|
+
totalDurationMs: number;
|
|
32
|
+
/** First dispatch → last terminal across the mission's tasks; null without complete endpoints. */
|
|
33
|
+
wallClockMs: number | null;
|
|
34
|
+
/** Total requeue attempts across the mission's tasks. */
|
|
35
|
+
retries: number;
|
|
36
|
+
/** Task ids whose ledger evidence was incomplete (excluded from sums). */
|
|
37
|
+
incompleteTaskIds: string[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Compute per-task stats from ledger entries. Scans a bounded tail window —
|
|
41
|
+
* stats are an operational view of recent work, not a full historical report.
|
|
42
|
+
*/
|
|
43
|
+
export declare function computeMeshTaskStats(meshId: string, opts?: {
|
|
44
|
+
taskIds?: string[];
|
|
45
|
+
missionId?: string;
|
|
46
|
+
tail?: number;
|
|
47
|
+
}): MeshTaskStats[];
|
|
48
|
+
/** Mission rollup — derived from per-task stats, no stored aggregates. */
|
|
49
|
+
export declare function computeMeshMissionStats(meshId: string, missionId: string): MeshMissionStats;
|