@adhdev/daemon-core 0.9.82-rc.49 → 0.9.82-rc.490
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 +137 -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 +71 -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 +151 -0
- package/dist/commands/router-worktree-cleanup.d.ts +133 -0
- package/dist/commands/router.d.ts +203 -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 +65 -0
- 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 +80 -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 +70 -17
- package/dist/index.js +53532 -19073
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +53283 -18989
- 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 +256 -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 +58 -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 +258 -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 +21 -1
- 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 +162 -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 +84 -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 +457 -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 +567 -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 +34 -0
- package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
- package/dist/mesh/mesh-work-queue.d.ts +392 -1
- package/dist/mesh/preview-freshness.d.ts +28 -0
- package/dist/mesh/refine-config.d.ts +97 -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 +426 -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 +196 -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 +30 -0
- package/dist/providers/provider-instance.d.ts +31 -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 +616 -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 +110 -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 +27 -0
- package/dist/system/hash.d.ts +8 -0
- package/dist/system/load-better-sqlite3.d.ts +21 -0
- package/dist/types.d.ts +20 -6
- 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 +1048 -1143
- 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 +2788 -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 +724 -27
- package/src/commands/handler.ts +865 -2
- package/src/commands/high-family/index.ts +28 -0
- package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
- package/src/commands/high-family/mesh-events.ts +102 -0
- package/src/commands/high-family/mesh-status.ts +857 -0
- package/src/commands/high-family/types.ts +80 -0
- package/src/commands/low-family/coordinator-prompt.ts +125 -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 +270 -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 +1268 -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 +1794 -0
- package/src/commands/router-worktree-cleanup.ts +870 -0
- package/src/commands/router.ts +567 -4149
- 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 +300 -24
- 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 +822 -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 +190 -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 +510 -0
- package/src/mesh/coordinator-prompt.ts +627 -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 +2030 -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 +1548 -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 +41 -3
- package/src/mesh/mesh-init.ts +350 -0
- package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
- package/src/mesh/mesh-ledger.ts +897 -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 +2498 -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 +1696 -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 +1792 -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 +2292 -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 +215 -0
- package/src/mesh/mesh-warmup-deadline.ts +152 -0
- package/src/mesh/mesh-work-queue.ts +1489 -145
- package/src/mesh/preview-freshness.ts +163 -0
- package/src/mesh/refine-config.ts +129 -12
- 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 +2771 -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 +207 -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 +93 -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 +538 -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 +861 -14
- 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 +148 -55
- package/src/status/builders.ts +69 -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 +100 -27
- 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 +26 -6
- 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,452 @@
|
|
|
1
|
+
import { appendLedgerEntry, buildTaskCompletionEvidence, readLedgerEntries } from './mesh-ledger.js';
|
|
2
|
+
import type { MeshLedgerKind } from './mesh-ledger.js';
|
|
3
|
+
import { updateDirectDispatchStatus, cleanupTerminalDirectDispatches } from './mesh-work-queue.js';
|
|
4
|
+
import { markSessionDeliveriesTerminal } from './mesh-delivery-policy.js';
|
|
5
|
+
import { queuePendingMeshCoordinatorEvent } from './mesh-events-pending.js';
|
|
6
|
+
import { readNonEmptyString, readRecord, resolveEventSessionId, readWorkerResultMetadata, isWeakCompletionEvidence, buildMeshSystemMessage } from './mesh-events-utils.js';
|
|
7
|
+
import { recordDebugTrace } from '../logging/debug-trace.js';
|
|
8
|
+
import { meshNodeIdMatches, sessionIdsEquivalent, type MeshNodeIdentified } from '@adhdev/mesh-shared';
|
|
9
|
+
|
|
10
|
+
// EARLYNOTIFY-GATEBYPASS (d): every completed-emit producer that bypasses the CLI-provider
|
|
11
|
+
// completion gate (transcript-reconcile synth here, no-progress reconcile below, the fast-collapse
|
|
12
|
+
// synth in cli-provider-instance) records a completion-gate trace so a synthesized "completed and
|
|
13
|
+
// idle" emit can never again be silent. Content-free by construction — keyed by taskId + source
|
|
14
|
+
// only, never worker/screen text. completion-gate is an ALWAYS_ON_TRACE_CATEGORY, so recordDebugTrace
|
|
15
|
+
// self-gates and lands in the ring even on a production daemon.
|
|
16
|
+
function recordSynthCompletionGateTrace(stage: string, payload: Record<string, unknown>): void {
|
|
17
|
+
recordDebugTrace({ category: 'completion-gate', stage, level: 'debug', payload });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Stale direct-dispatch detection & transcript reconciliation
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
// NOTIF-MISS grace gate. A direct dispatch (mesh_send_task) to an ALREADY-IDLE,
|
|
25
|
+
// previously-used session reuses a transcript that still holds the PRIOR turn's final
|
|
26
|
+
// assistant message. The session momentarily reads `idle` in the first second after
|
|
27
|
+
// dispatch (the worker hasn't started generating yet), so the transcript reconcile here
|
|
28
|
+
// would otherwise synthesize a "completion" ~1s after dispatch from that stale tail —
|
|
29
|
+
// writing a synthesized task_completed + queuing a completion event. When the REAL
|
|
30
|
+
// completion fires minutes later, checkSuppressMeshEvent drops it as a duplicate of the
|
|
31
|
+
// synthesized one (same providerSessionId/finalSummary), so the coordinator never learns
|
|
32
|
+
// the task actually finished. The grace period refuses to synthesize until enough time has
|
|
33
|
+
// passed since dispatch that a genuine same-task completion is plausible, closing the race
|
|
34
|
+
// window. The stale-summary timestamp guard (transcript predates dispatch) and FIX 2 in
|
|
35
|
+
// mesh-event-forwarding (a synthesized completion never suppresses the authoritative real
|
|
36
|
+
// one) are the correctness backstops; this grace just stops the synthesis from firing in
|
|
37
|
+
// the first place for the common case. An idle-session dispatch (dispatchedToIdleSession)
|
|
38
|
+
// is the exact race above, so it gets a LONGER grace than a dispatch to a session that was
|
|
39
|
+
// already generating (where a transcript reconcile is far less likely to be premature).
|
|
40
|
+
const DIRECT_DISPATCH_RECONCILE_GRACE_MS = 60_000;
|
|
41
|
+
const DIRECT_DISPATCH_IDLE_SESSION_RECONCILE_GRACE_MS = 120_000;
|
|
42
|
+
|
|
43
|
+
export function findRecentTerminalLedgerEvidence(args: {
|
|
44
|
+
meshId: string;
|
|
45
|
+
sessionId?: string;
|
|
46
|
+
nodeId?: string;
|
|
47
|
+
}): { id: string; kind: MeshLedgerKind; payload: Record<string, unknown>; timestamp: string } | null {
|
|
48
|
+
if (!args.sessionId && !args.nodeId) return null;
|
|
49
|
+
// Tail-limit: 200 entries gives a wide enough window to catch terminal events for active
|
|
50
|
+
// sessions while avoiding a full O(n) scan. If a terminal is older than 200 entries,
|
|
51
|
+
// the MeshRuntimeStore fingerprint dedup will still block duplicate processing downstream.
|
|
52
|
+
const entries = readLedgerEntries(args.meshId, { tail: 200 });
|
|
53
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
54
|
+
const entry = entries[i];
|
|
55
|
+
if (entry.kind !== 'task_completed' && entry.kind !== 'task_failed' && entry.kind !== 'task_stalled') continue;
|
|
56
|
+
if (args.sessionId && sessionIdsEquivalent(entry.sessionId, args.sessionId)) {
|
|
57
|
+
return { id: entry.id, kind: entry.kind, payload: entry.payload || {}, timestamp: entry.timestamp };
|
|
58
|
+
}
|
|
59
|
+
// Normalized node-id match (P4): a ledger entry may store its node id as `nodeId`
|
|
60
|
+
// (runtime form) or `node_id` (DB column form leaked onto the object). A raw `===`
|
|
61
|
+
// against args.nodeId drops the entry when the entry's stored form differs from the
|
|
62
|
+
// form the caller passes, so a valid terminal completion goes unfound. meshNodeIdMatches
|
|
63
|
+
// normalizes the entry across all 3 forms before comparing. (The entry's typed shape
|
|
64
|
+
// omits the open index signature MeshNodeIdentified declares, hence the cast.)
|
|
65
|
+
if (!args.sessionId && args.nodeId && meshNodeIdMatches(entry as unknown as MeshNodeIdentified, args.nodeId)) {
|
|
66
|
+
return { id: entry.id, kind: entry.kind, payload: entry.payload || {}, timestamp: entry.timestamp };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Returns true when a task_dispatched entry for the given session appears AFTER the terminal
|
|
73
|
+
// entry (identified by terminalId) in ledger order. Positional (append) order is used rather
|
|
74
|
+
// than timestamp comparison because both entries may share the same millisecond.
|
|
75
|
+
export function hasDispatchAfterTerminal(meshId: string, sessionId: string, terminalId: string): boolean {
|
|
76
|
+
// 200-entry window matches findRecentTerminalLedgerEvidence for consistency.
|
|
77
|
+
const entries = readLedgerEntries(meshId, { tail: 200 });
|
|
78
|
+
let pastTerminal = false;
|
|
79
|
+
for (const entry of entries) {
|
|
80
|
+
if (!pastTerminal) {
|
|
81
|
+
if (entry.id === terminalId) pastTerminal = true;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (entry.kind === 'task_dispatched' && sessionIdsEquivalent(entry.sessionId, sessionId)) return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function hasUnterminalDirectDispatchLedgerEntry(meshId: string, sessionId: string): boolean {
|
|
90
|
+
// Some dispatch paths can persist task_dispatched before the direct-dispatch DB row is
|
|
91
|
+
// available. Recover routing from ledger order so coordinator self-targets still emit
|
|
92
|
+
// task_completed and pendingCoordinatorEvents.
|
|
93
|
+
const entries = readLedgerEntries(meshId, { tail: 200 });
|
|
94
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
95
|
+
const entry = entries[i];
|
|
96
|
+
if (!sessionIdsEquivalent(entry.sessionId, sessionId)) continue;
|
|
97
|
+
if (entry.kind === 'task_completed' || entry.kind === 'task_failed' || entry.kind === 'task_stalled') {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
if (entry.kind === 'task_dispatched' && entry.payload?.source === 'direct') {
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function findTerminalLedgerEvidenceForTask(args: {
|
|
108
|
+
meshId: string;
|
|
109
|
+
taskId?: string;
|
|
110
|
+
sessionId?: string;
|
|
111
|
+
nodeId?: string;
|
|
112
|
+
tail?: number;
|
|
113
|
+
}): { id: string; kind: Extract<MeshLedgerKind, 'task_completed' | 'task_failed' | 'task_stalled'>; payload: Record<string, unknown>; timestamp: string } | null {
|
|
114
|
+
const taskId = readNonEmptyString(args.taskId);
|
|
115
|
+
if (!taskId) return null;
|
|
116
|
+
const entries = readLedgerEntries(args.meshId, { tail: args.tail ?? 500 });
|
|
117
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
118
|
+
const entry = entries[i];
|
|
119
|
+
if (entry.kind !== 'task_completed' && entry.kind !== 'task_failed' && entry.kind !== 'task_stalled') continue;
|
|
120
|
+
const terminalTaskId = readNonEmptyString(entry.payload?.taskId);
|
|
121
|
+
if (terminalTaskId !== taskId) continue;
|
|
122
|
+
if (entry.kind === 'task_completed' && isWeakCompletionEvidence(entry.payload)) continue;
|
|
123
|
+
if (args.sessionId && entry.sessionId && !sessionIdsEquivalent(entry.sessionId, args.sessionId)) continue;
|
|
124
|
+
if (!args.sessionId && args.nodeId && entry.nodeId && !meshNodeIdMatches(entry as unknown as MeshNodeIdentified, args.nodeId)) continue;
|
|
125
|
+
return { id: entry.id, kind: entry.kind, payload: entry.payload || {}, timestamp: entry.timestamp };
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function findDirectDispatchLedgerEntry(args: {
|
|
131
|
+
meshId: string;
|
|
132
|
+
taskId: string;
|
|
133
|
+
sessionId?: string;
|
|
134
|
+
}): { id: string; timestamp: string; nodeId?: string; sessionId?: string; providerType?: string; payload: Record<string, unknown> } | null {
|
|
135
|
+
const entries = readLedgerEntries(args.meshId, { tail: 500 });
|
|
136
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
137
|
+
const entry = entries[i];
|
|
138
|
+
if (entry.kind !== 'task_dispatched') continue;
|
|
139
|
+
const payloadTaskId = readNonEmptyString(entry.payload?.taskId);
|
|
140
|
+
if (payloadTaskId !== args.taskId) continue;
|
|
141
|
+
if (args.sessionId && entry.sessionId && !sessionIdsEquivalent(entry.sessionId, args.sessionId)) continue;
|
|
142
|
+
return {
|
|
143
|
+
id: entry.id,
|
|
144
|
+
timestamp: entry.timestamp,
|
|
145
|
+
nodeId: entry.nodeId,
|
|
146
|
+
sessionId: entry.sessionId,
|
|
147
|
+
providerType: entry.providerType,
|
|
148
|
+
payload: entry.payload || {},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function hasTerminalLedgerAfterDispatch(args: {
|
|
155
|
+
meshId: string;
|
|
156
|
+
taskId: string;
|
|
157
|
+
sessionId?: string;
|
|
158
|
+
dispatchEntryId?: string;
|
|
159
|
+
dispatchTimestamp?: string;
|
|
160
|
+
}): boolean {
|
|
161
|
+
const entries = readLedgerEntries(args.meshId, { tail: 500 });
|
|
162
|
+
let afterDispatch = !args.dispatchEntryId && !args.dispatchTimestamp;
|
|
163
|
+
const dispatchTime = args.dispatchTimestamp ? new Date(args.dispatchTimestamp).getTime() : Number.NaN;
|
|
164
|
+
for (const entry of entries) {
|
|
165
|
+
if (!afterDispatch) {
|
|
166
|
+
if (args.dispatchEntryId && entry.id === args.dispatchEntryId) {
|
|
167
|
+
afterDispatch = true;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (!args.dispatchEntryId && Number.isFinite(dispatchTime)) {
|
|
171
|
+
const entryTime = new Date(entry.timestamp).getTime();
|
|
172
|
+
if (Number.isFinite(entryTime) && entryTime >= dispatchTime) afterDispatch = true;
|
|
173
|
+
}
|
|
174
|
+
if (!afterDispatch) continue;
|
|
175
|
+
}
|
|
176
|
+
if (entry.kind !== 'task_completed' && entry.kind !== 'task_failed' && entry.kind !== 'task_stalled') continue;
|
|
177
|
+
// Fix C (reconcile fallback expansion): a task_completed recorded from a FALSE idle
|
|
178
|
+
// (weak evidence / no confirmed final assistant) is NOT authoritative terminal
|
|
179
|
+
// evidence. Skip it so the transcript reconcile can still synthesize the GENUINE
|
|
180
|
+
// completion for a re-dispatched / prematurely-terminated direct task instead of
|
|
181
|
+
// bailing with alreadyTerminal.
|
|
182
|
+
if (entry.kind === 'task_completed' && isWeakCompletionEvidence(entry.payload)) continue;
|
|
183
|
+
const terminalTaskId = readNonEmptyString(entry.payload?.taskId);
|
|
184
|
+
if (terminalTaskId && terminalTaskId === args.taskId) return true;
|
|
185
|
+
if (terminalTaskId && terminalTaskId !== args.taskId) continue;
|
|
186
|
+
if (args.sessionId && sessionIdsEquivalent(entry.sessionId, args.sessionId)) return true;
|
|
187
|
+
}
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function reconcileDirectDispatchCompletionFromTranscript(args: {
|
|
192
|
+
meshId: string;
|
|
193
|
+
nodeId?: string;
|
|
194
|
+
sessionId: string;
|
|
195
|
+
providerType?: string;
|
|
196
|
+
providerSessionId?: string;
|
|
197
|
+
taskId: string;
|
|
198
|
+
finalSummary: string;
|
|
199
|
+
transcriptMessageAt?: string;
|
|
200
|
+
completedAt?: string;
|
|
201
|
+
targetCoordinatorDaemonId?: string;
|
|
202
|
+
/**
|
|
203
|
+
* NOTIF-DROP-SYNTH-NO-MESSAGE: the originating coordinator SESSION that dispatched this
|
|
204
|
+
* task (the `coordinatorSessionId` stamped onto the task_dispatched ledger payload at
|
|
205
|
+
* dispatch). Stamped onto the synthesized completion's targetCoordinatorSessionId so PHASE 2
|
|
206
|
+
* STRICT routing matches the exact coordinator session — instead of relying on the
|
|
207
|
+
* daemon-keyed fallback. When the caller does not pass it, it is recovered from the dispatch
|
|
208
|
+
* ledger entry below; absent on legacy rows → daemon-level routing (unchanged).
|
|
209
|
+
*/
|
|
210
|
+
targetCoordinatorSessionId?: string;
|
|
211
|
+
source?: string;
|
|
212
|
+
}): { reconciled: boolean; kind?: MeshLedgerKind; alreadyTerminal?: boolean; workerResult?: unknown; ledgerEntryId?: string; reason?: string } {
|
|
213
|
+
const finalSummary = readNonEmptyString(args.finalSummary);
|
|
214
|
+
if (!args.meshId || !args.taskId || !args.sessionId || !finalSummary) {
|
|
215
|
+
return { reconciled: false, reason: 'missing_required_completion_evidence' };
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const dispatch = findDirectDispatchLedgerEntry({
|
|
219
|
+
meshId: args.meshId,
|
|
220
|
+
taskId: args.taskId,
|
|
221
|
+
sessionId: args.sessionId,
|
|
222
|
+
});
|
|
223
|
+
if (hasTerminalLedgerAfterDispatch({
|
|
224
|
+
meshId: args.meshId,
|
|
225
|
+
taskId: args.taskId,
|
|
226
|
+
sessionId: args.sessionId,
|
|
227
|
+
dispatchEntryId: dispatch?.id,
|
|
228
|
+
dispatchTimestamp: dispatch?.timestamp,
|
|
229
|
+
})) {
|
|
230
|
+
return { reconciled: false, alreadyTerminal: true, reason: 'terminal_ledger_entry_exists' };
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const nodeId = readNonEmptyString(args.nodeId) || dispatch?.nodeId;
|
|
234
|
+
const providerType = readNonEmptyString(args.providerType) || dispatch?.providerType || readNonEmptyString(dispatch?.payload.providerType);
|
|
235
|
+
const completedAt = args.completedAt || new Date().toISOString();
|
|
236
|
+
const evidence = buildTaskCompletionEvidence({
|
|
237
|
+
event: 'agent:generating_completed',
|
|
238
|
+
nodeId: nodeId || 'unknown',
|
|
239
|
+
sessionId: args.sessionId,
|
|
240
|
+
providerType,
|
|
241
|
+
providerSessionId: readNonEmptyString(args.providerSessionId),
|
|
242
|
+
finalSummary,
|
|
243
|
+
completedAt,
|
|
244
|
+
});
|
|
245
|
+
const workerResult = evidence.workerResult;
|
|
246
|
+
// EARLYNOTIFY-GATEBYPASS (c): a transcript-reconcile synth is TENTATIVE unless the worker's
|
|
247
|
+
// summary self-attributes to this turn — i.e. it parsed a worker-result-shaped JSON
|
|
248
|
+
// (`final_summary_json`), the same self-attribution the grace gate below exempts. A plain-text
|
|
249
|
+
// transcript tail proves neither turn-finality nor that this reconcile beat the real completion,
|
|
250
|
+
// so it is marked WEAK: buildPendingEventFingerprint then keys it `…::weak`, leaving the
|
|
251
|
+
// `…::genuine` slot free for the worker's own later agent:generating_completed to surface (the
|
|
252
|
+
// CANON-B weak→genuine supersession) instead of being dropped as a duplicate.
|
|
253
|
+
const selfAttributing = workerResult.source === 'final_summary_json';
|
|
254
|
+
const dispatchTime = dispatch?.timestamp ? new Date(dispatch.timestamp).getTime() : Number.NaN;
|
|
255
|
+
const transcriptTime = args.transcriptMessageAt ? new Date(args.transcriptMessageAt).getTime() : Number.NaN;
|
|
256
|
+
const transcriptAfterDispatch = Number.isFinite(dispatchTime) && Number.isFinite(transcriptTime) && transcriptTime >= dispatchTime;
|
|
257
|
+
if (workerResult.source !== 'final_summary_json' && !transcriptAfterDispatch) {
|
|
258
|
+
return { reconciled: false, reason: 'transcript_not_proven_after_dispatch' };
|
|
259
|
+
}
|
|
260
|
+
// NOTIF-MISS grace gate (FIX 1): refuse to synthesize a completion for a direct dispatch
|
|
261
|
+
// until a grace period has elapsed since its dispatch. A direct dispatch to an ALREADY-IDLE,
|
|
262
|
+
// previously-used session reuses a transcript that still holds the PRIOR turn's final
|
|
263
|
+
// assistant message; the session momentarily reads `idle` in the first second after dispatch
|
|
264
|
+
// (the worker hasn't started generating yet), so without this gate the reconcile would
|
|
265
|
+
// synthesize a "completion" ~1s after dispatch from that stale tail. When the REAL completion
|
|
266
|
+
// fires minutes later, checkSuppressMeshEvent drops it as a duplicate of the synthesized one
|
|
267
|
+
// (same providerSessionId/finalSummary) — the coordinator never learns the task finished.
|
|
268
|
+
// The grace refuses synthesis until a genuine same-task completion is plausible. An idle-
|
|
269
|
+
// session dispatch (dispatchedToIdleSession) is the exact race, so it gets a LONGER grace.
|
|
270
|
+
// A structured final_summary_json is self-attributing (the provider emitted it for THIS turn),
|
|
271
|
+
// so it is exempt; the grace only guards the ambiguous plain-text-tail case. When the dispatch
|
|
272
|
+
// entry is missing we cannot date it and do NOT block (the stale-summary timestamp guard +
|
|
273
|
+
// FIX 2 supersession remain the correctness backstops).
|
|
274
|
+
if (Number.isFinite(dispatchTime) && workerResult.source !== 'final_summary_json') {
|
|
275
|
+
const dispatchedToIdleSession = dispatch?.payload?.dispatchedToIdleSession === true;
|
|
276
|
+
const graceMs = dispatchedToIdleSession
|
|
277
|
+
? DIRECT_DISPATCH_IDLE_SESSION_RECONCILE_GRACE_MS
|
|
278
|
+
: DIRECT_DISPATCH_RECONCILE_GRACE_MS;
|
|
279
|
+
if (Date.now() - dispatchTime < graceMs) {
|
|
280
|
+
return { reconciled: false, reason: 'direct_dispatch_grace_period' };
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const workerFailed = workerResult.status === 'failed' || (workerResult.status !== 'completed' && workerResult.errors.length > 0);
|
|
284
|
+
const kind: MeshLedgerKind = workerFailed ? 'task_failed' : 'task_completed';
|
|
285
|
+
|
|
286
|
+
const entry = appendLedgerEntry(args.meshId, {
|
|
287
|
+
kind,
|
|
288
|
+
nodeId: nodeId || undefined,
|
|
289
|
+
sessionId: args.sessionId,
|
|
290
|
+
providerType: providerType || undefined,
|
|
291
|
+
payload: {
|
|
292
|
+
event: 'agent:generating_completed',
|
|
293
|
+
source: args.source || 'direct_task_transcript_reconciliation',
|
|
294
|
+
taskId: args.taskId,
|
|
295
|
+
providerSessionId: readNonEmptyString(args.providerSessionId),
|
|
296
|
+
finalSummary,
|
|
297
|
+
workerResult,
|
|
298
|
+
completionDiagnostic: {
|
|
299
|
+
reason: 'direct_task_transcript_reconciliation',
|
|
300
|
+
dispatchEntryId: dispatch?.id,
|
|
301
|
+
dispatchTimestamp: dispatch?.timestamp,
|
|
302
|
+
transcriptMessageAt: readNonEmptyString(args.transcriptMessageAt),
|
|
303
|
+
// Honestly reflect self-attribution: a plain-text tail did NOT prove a turn-final
|
|
304
|
+
// assistant message (only a self-attributing final_summary_json did).
|
|
305
|
+
transcriptFinalAssistantPresent: selfAttributing,
|
|
306
|
+
},
|
|
307
|
+
evidence,
|
|
308
|
+
},
|
|
309
|
+
});
|
|
310
|
+
// CANON-B: this reconcile path always knows the exact taskId — flip that dispatch row, not
|
|
311
|
+
// whichever sibling the session_id happens to match.
|
|
312
|
+
updateDirectDispatchStatus(args.meshId, args.sessionId, kind === 'task_completed' ? 'completed' : 'failed', args.taskId);
|
|
313
|
+
markSessionDeliveriesTerminal(args.meshId, args.sessionId, kind === 'task_completed' ? 'completed' : 'failed');
|
|
314
|
+
setImmediate(() => cleanupTerminalDirectDispatches());
|
|
315
|
+
// NOTIF-DROP-SYNTH-NO-MESSAGE: the queued synth completion MUST carry a coordinatorMessage,
|
|
316
|
+
// or injectPendingIntoCoordinator early-returns (`!pending.coordinatorMessage`) and the row is
|
|
317
|
+
// drained-without-inject → no [System] surface. The ~8s-later native completion then collides
|
|
318
|
+
// on the taskId-anchored fingerprint and is blocked at INSERT, so the notification is lost
|
|
319
|
+
// forever. Build the SAME [System] message the native path builds (buildMeshSystemMessage) so
|
|
320
|
+
// the synth is itself a complete, deliverable completion. Routing is made STRICT too: stamp the
|
|
321
|
+
// originating coordinator session so PHASE 2 strict-match delivers to the exact coordinator
|
|
322
|
+
// session that dispatched the task instead of falling back to a daemon-level broadcast.
|
|
323
|
+
const eventName = kind === 'task_completed' ? 'agent:generating_completed' : 'agent:stopped';
|
|
324
|
+
const nodeLabel = nodeId ? `Node '${nodeId}'` : 'Remote agent';
|
|
325
|
+
const metadataEvent = {
|
|
326
|
+
targetSessionId: args.sessionId,
|
|
327
|
+
providerType: providerType || undefined,
|
|
328
|
+
providerSessionId: readNonEmptyString(args.providerSessionId),
|
|
329
|
+
finalSummary,
|
|
330
|
+
taskId: args.taskId,
|
|
331
|
+
workerResult,
|
|
332
|
+
// EARLYNOTIFY-GATEBYPASS (c): mark a non-self-attributing synth WEAK so its pending
|
|
333
|
+
// fingerprint is `…::weak` (isWeakCompletionMetadata reads evidenceLevel), never claiming
|
|
334
|
+
// the genuine dedup slot. evidenceLevel:'weak' is deliberately NOT a false-idle marker
|
|
335
|
+
// (the transcript tail existed) — it keeps the completion superseable, not suppressed.
|
|
336
|
+
...(selfAttributing ? {} : { evidenceLevel: 'weak' as const }),
|
|
337
|
+
completionDiagnostic: {
|
|
338
|
+
reason: 'direct_task_transcript_reconciliation',
|
|
339
|
+
terminalLedgerKind: kind,
|
|
340
|
+
terminalLedgerId: entry.id,
|
|
341
|
+
},
|
|
342
|
+
};
|
|
343
|
+
// Originating coordinator session: prefer the explicit arg; otherwise recover it from the
|
|
344
|
+
// task_dispatched ledger payload (the MCP dispatch path stamps `coordinatorSessionId` there).
|
|
345
|
+
// Absent on legacy rows → undefined → daemon-level routing (unchanged, no regression).
|
|
346
|
+
const targetCoordinatorSessionId = readNonEmptyString(args.targetCoordinatorSessionId)
|
|
347
|
+
|| readNonEmptyString(dispatch?.payload?.coordinatorSessionId);
|
|
348
|
+
// COORD-EVENT-MISROUTE (anchor preservation): the DISPATCHING coordinator's daemon anchor.
|
|
349
|
+
// Prefer the DISPATCH LEDGER's `coordinatorDaemonId` (the daemon that ISSUED the task) over the
|
|
350
|
+
// caller-supplied arg — the synth caller (mesh-completion-synthesis) resolves the arg from its
|
|
351
|
+
// OWN selfIds, which on a remote worker's reconcile is the WORKER daemon, not the coordinator.
|
|
352
|
+
// Using the worker's self-daemon as the anchor makes coordinatorIdentityFromEmitFields treat
|
|
353
|
+
// the completion as addressed to the worker daemon; when the coordinator lives on a DIFFERENT
|
|
354
|
+
// machine that anchor never matches, selfFallback fires and stampPendingEventV2 broadcasts the
|
|
355
|
+
// completion to ANY coordinator (contracts.ts shouldDeliverPendingEventToCoordinator → true for
|
|
356
|
+
// broadcast), the cross-machine misroute. The ledger value is the authoritative issuing-daemon
|
|
357
|
+
// anchor. Absent on legacy rows → fall back to the arg → daemon-level routing (no regression).
|
|
358
|
+
const targetCoordinatorDaemonId = readNonEmptyString(dispatch?.payload?.coordinatorDaemonId)
|
|
359
|
+
|| readNonEmptyString(args.targetCoordinatorDaemonId);
|
|
360
|
+
queuePendingMeshCoordinatorEvent({
|
|
361
|
+
event: eventName,
|
|
362
|
+
meshId: args.meshId,
|
|
363
|
+
nodeLabel,
|
|
364
|
+
nodeId: nodeId || undefined,
|
|
365
|
+
metadataEvent,
|
|
366
|
+
coordinatorMessage: buildMeshSystemMessage({ event: eventName, nodeLabel, metadataEvent }),
|
|
367
|
+
queuedAt: Date.now(),
|
|
368
|
+
...(targetCoordinatorDaemonId ? { targetCoordinatorDaemonId } : {}),
|
|
369
|
+
...(targetCoordinatorSessionId ? { targetCoordinatorSessionId } : {}),
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
// (d) The synth fired — record it so this gate-bypassing emit is observable.
|
|
373
|
+
recordSynthCompletionGateTrace('synth-fire', {
|
|
374
|
+
producer: 'transcript_reconcile',
|
|
375
|
+
source: args.source || 'direct_task_transcript_reconciliation',
|
|
376
|
+
taskId: args.taskId,
|
|
377
|
+
kind,
|
|
378
|
+
selfAttributing,
|
|
379
|
+
evidenceLevel: selfAttributing ? 'sufficient' : 'weak',
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
return { reconciled: true, kind, workerResult, ledgerEntryId: entry.id };
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
export function buildNoProgressCompletionReconciliation(args: {
|
|
386
|
+
meshId: string;
|
|
387
|
+
nodeId?: string;
|
|
388
|
+
nodeLabel: string;
|
|
389
|
+
metadataEvent: Record<string, unknown>;
|
|
390
|
+
sourceInstanceId?: string;
|
|
391
|
+
}): Record<string, unknown> | null {
|
|
392
|
+
const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
|
|
393
|
+
const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
|
|
394
|
+
const providerType = readNonEmptyString(args.metadataEvent.providerType);
|
|
395
|
+
const providerSessionId = readNonEmptyString(args.metadataEvent.providerSessionId);
|
|
396
|
+
const workerResult = readWorkerResultMetadata(args.metadataEvent);
|
|
397
|
+
const completionDiagnostic = readRecord(args.metadataEvent.completionDiagnostic);
|
|
398
|
+
const finalSummary = readNonEmptyString(args.metadataEvent.finalSummary);
|
|
399
|
+
const status = readNonEmptyString(args.metadataEvent.status).toLowerCase();
|
|
400
|
+
// EARLYNOTIFY-GATEBYPASS (c): a bare status flag (idle/ready/completed) with NO worker text is
|
|
401
|
+
// the weakest possible "done" evidence — it is exactly the false-idle the no-progress monitor
|
|
402
|
+
// fires on. Only a real assistant summary / worker result / confirmed final-assistant makes this
|
|
403
|
+
// reconcile self-attributing. When it is not, mark the synthesized completion WEAK so a later
|
|
404
|
+
// genuine completion can still supersede it (and buildMeshSystemMessage appends a verify hint).
|
|
405
|
+
const noProgressSelfAttributing = Boolean(
|
|
406
|
+
finalSummary || workerResult || completionDiagnostic?.finalAssistantPresent === true,
|
|
407
|
+
);
|
|
408
|
+
const explicitCompletionEvidence = Boolean(
|
|
409
|
+
noProgressSelfAttributing
|
|
410
|
+
|| status === 'idle'
|
|
411
|
+
|| status === 'ready'
|
|
412
|
+
|| status === 'completed',
|
|
413
|
+
);
|
|
414
|
+
if (explicitCompletionEvidence) {
|
|
415
|
+
// (d) A no-progress→completion synth bypasses the CLI provider gate — trace it.
|
|
416
|
+
recordSynthCompletionGateTrace('synth-fire', {
|
|
417
|
+
producer: 'no_progress_reconcile',
|
|
418
|
+
source: 'no_progress_reconciliation',
|
|
419
|
+
taskId: readNonEmptyString(args.metadataEvent.taskId),
|
|
420
|
+
selfAttributing: noProgressSelfAttributing,
|
|
421
|
+
evidenceLevel: noProgressSelfAttributing ? 'sufficient' : 'weak',
|
|
422
|
+
});
|
|
423
|
+
return {
|
|
424
|
+
...args.metadataEvent,
|
|
425
|
+
targetSessionId: sessionId,
|
|
426
|
+
providerType,
|
|
427
|
+
providerSessionId,
|
|
428
|
+
finalSummary,
|
|
429
|
+
source: 'no_progress_reconciliation',
|
|
430
|
+
reconciledFromEvent: 'monitor:no_progress',
|
|
431
|
+
timestamp: args.metadataEvent.timestamp ?? Date.now(),
|
|
432
|
+
...(noProgressSelfAttributing ? {} : { evidenceLevel: 'weak' as const }),
|
|
433
|
+
completionDiagnostic: {
|
|
434
|
+
...(completionDiagnostic || {}),
|
|
435
|
+
reconciliationReason: 'provider_completion_evidence',
|
|
436
|
+
},
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const terminal = findRecentTerminalLedgerEvidence({
|
|
441
|
+
meshId: args.meshId,
|
|
442
|
+
sessionId: sessionId || undefined,
|
|
443
|
+
nodeId: nodeId || undefined,
|
|
444
|
+
});
|
|
445
|
+
if (!terminal) return null;
|
|
446
|
+
return {
|
|
447
|
+
...args.metadataEvent,
|
|
448
|
+
source: 'no_progress_terminal_ledger_suppression',
|
|
449
|
+
terminalLedgerKind: terminal.kind,
|
|
450
|
+
terminalLedgerAt: terminal.timestamp,
|
|
451
|
+
};
|
|
452
|
+
}
|