@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,443 @@
|
|
|
1
|
+
import type { SessionRecoveryContext } from './mesh-ledger.js';
|
|
2
|
+
|
|
3
|
+
export function readNonEmptyString(value: unknown): string {
|
|
4
|
+
return typeof value === 'string' && value.trim() ? value.trim() : '';
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function readRecord(value: unknown): Record<string, unknown> | undefined {
|
|
8
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
9
|
+
? value as Record<string, unknown>
|
|
10
|
+
: undefined;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The relay-safety metadata a worker session must carry so that its completion /
|
|
15
|
+
* generating events route back to the coordinator proactively (without waiting for
|
|
16
|
+
* a mesh_read_chat reconcile). meshCoordinatorDaemonId is the routing anchor the
|
|
17
|
+
* core forwarder (injectMeshSystemMessage) keys on to pick a remote coordinator
|
|
18
|
+
* target; meshNodeFor/meshNodeId identify the worker, and launchedByCoordinator is
|
|
19
|
+
* the delegation proof. See resolveWorkerDelegateRouting().
|
|
20
|
+
*/
|
|
21
|
+
export interface MeshWorkerRelayStamp {
|
|
22
|
+
meshNodeFor?: string;
|
|
23
|
+
meshNodeId?: string;
|
|
24
|
+
meshCoordinatorDaemonId?: string;
|
|
25
|
+
// The ORIGINATING coordinator SESSION (not just its daemon). Carried so a worker's
|
|
26
|
+
// completion event can be routed back to the exact coordinator session that
|
|
27
|
+
// dispatched the work, even when several coordinator sessions share one daemon
|
|
28
|
+
// (the multi-coordinator misroute). Optional + absent on legacy dispatches, in
|
|
29
|
+
// which case routing falls back to the daemon-level anchor (current behaviour).
|
|
30
|
+
meshCoordinatorSessionId?: string;
|
|
31
|
+
launchedByCoordinator?: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Build the relay-safety stamp from a dispatch's meshContext, only including fields
|
|
36
|
+
* the session does not already carry. Returns undefined when there is nothing new to
|
|
37
|
+
* stamp, so callers can skip a no-op updateSettings() write.
|
|
38
|
+
*
|
|
39
|
+
* This closes the remote-session relay gap: a worker session reached by a dispatch
|
|
40
|
+
* that carries coordinatorDaemonId (mesh_send_task / queue assignment over P2P) gets
|
|
41
|
+
* the coordinator anchor persisted onto its settings at dispatch time, even if it was
|
|
42
|
+
* not launched via mesh_launch_session. Without the stamp the forwarder cannot resolve
|
|
43
|
+
* a remote coordinator and the completion event sits in the pending queue until a
|
|
44
|
+
* read_chat-triggered reconcile drains it.
|
|
45
|
+
*/
|
|
46
|
+
export function buildMeshWorkerRelayStamp(
|
|
47
|
+
currentSettings: Record<string, unknown> | undefined,
|
|
48
|
+
meshContext: {
|
|
49
|
+
meshId?: unknown;
|
|
50
|
+
nodeId?: unknown;
|
|
51
|
+
coordinatorDaemonId?: unknown;
|
|
52
|
+
coordinatorSessionId?: unknown;
|
|
53
|
+
} | undefined,
|
|
54
|
+
): MeshWorkerRelayStamp | undefined {
|
|
55
|
+
if (!meshContext) return undefined;
|
|
56
|
+
const settings = currentSettings && typeof currentSettings === 'object' ? currentSettings : {};
|
|
57
|
+
const stamp: MeshWorkerRelayStamp = {};
|
|
58
|
+
|
|
59
|
+
const meshId = readNonEmptyString(meshContext.meshId);
|
|
60
|
+
if (meshId && !readNonEmptyString(settings.meshNodeFor)) stamp.meshNodeFor = meshId;
|
|
61
|
+
|
|
62
|
+
const nodeId = readNonEmptyString(meshContext.nodeId);
|
|
63
|
+
if (nodeId && !readNonEmptyString(settings.meshNodeId)) stamp.meshNodeId = nodeId;
|
|
64
|
+
|
|
65
|
+
const coordinatorDaemonId = readNonEmptyString(meshContext.coordinatorDaemonId);
|
|
66
|
+
if (coordinatorDaemonId && !readNonEmptyString(settings.meshCoordinatorDaemonId)) {
|
|
67
|
+
stamp.meshCoordinatorDaemonId = coordinatorDaemonId;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Session-level anchor (multi-coordinator routing): stamp the originating
|
|
71
|
+
// coordinator session id so the completion event can target the exact session.
|
|
72
|
+
// Carried over P2P to remote workers so a remote worker's echo returns it.
|
|
73
|
+
const coordinatorSessionId = readNonEmptyString(meshContext.coordinatorSessionId);
|
|
74
|
+
if (coordinatorSessionId && !readNonEmptyString(settings.meshCoordinatorSessionId)) {
|
|
75
|
+
stamp.meshCoordinatorSessionId = coordinatorSessionId;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// A dispatch from a coordinator is itself proof of delegation; stamp it when the
|
|
79
|
+
// session is being given any mesh routing context but has no marker yet.
|
|
80
|
+
if ((meshId || nodeId || coordinatorDaemonId || coordinatorSessionId) && settings.launchedByCoordinator !== true) {
|
|
81
|
+
stamp.launchedByCoordinator = true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return Object.keys(stamp).length > 0 ? stamp : undefined;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function resolveEventSessionId(event: Record<string, unknown>, fallback?: unknown): string {
|
|
88
|
+
return readNonEmptyString(event.targetSessionId)
|
|
89
|
+
|| readNonEmptyString(event.sessionId)
|
|
90
|
+
|| readNonEmptyString(event.instanceId)
|
|
91
|
+
|| readNonEmptyString(fallback);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function readRefineJobId(event: { metadataEvent?: Record<string, unknown> } | Record<string, unknown>): string {
|
|
95
|
+
const metadata = readRecord((event as any).metadataEvent) || event as Record<string, unknown>;
|
|
96
|
+
const result = readRecord(metadata.result);
|
|
97
|
+
const refineJob = readRecord(result?.refineJob);
|
|
98
|
+
return readNonEmptyString(metadata.jobId) || readNonEmptyString(refineJob?.jobId);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function readWorkerResultMetadata(event: Record<string, unknown>): Record<string, unknown> | undefined {
|
|
102
|
+
return readRecord(event.workerResult) || readRecord(event.meshWorkerResult) || readRecord(event.structuredResult);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const MESH_SURFACED_PREVIEW_MAX_CHARS = 512;
|
|
106
|
+
|
|
107
|
+
// Cap for the worker final summary surfaced INLINE into the coordinator's chat
|
|
108
|
+
// (buildMeshSystemMessage). Larger than the mirror preview cap because this is the
|
|
109
|
+
// coordinator-facing payload that replaces a "go call mesh_read_chat" instruction —
|
|
110
|
+
// it should carry enough of the worker's result to act on without a second round-trip,
|
|
111
|
+
// while still bounding what is written into the coordinator PTY.
|
|
112
|
+
const MESH_COMPLETION_SURFACE_MAX_CHARS = 16000;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The worker's final assistant text carried on a completion event — read from
|
|
116
|
+
* `finalSummary` (and the `workerResult.summary` / `result.summary` fallbacks some
|
|
117
|
+
* paths use). Returns '' when the event carries no assistant text (lifecycle events
|
|
118
|
+
* without a summary). Shared by the coordinator chat surface (buildMeshSystemMessage)
|
|
119
|
+
* and the held-event ledger audit record so both read the summary the same way.
|
|
120
|
+
*/
|
|
121
|
+
export function readMeshCompletionSummary(metadataEvent: Record<string, unknown>): string {
|
|
122
|
+
const workerResult = readWorkerResultMetadata(metadataEvent);
|
|
123
|
+
const resultRecord = readRecord(metadataEvent.result);
|
|
124
|
+
return readNonEmptyString(metadataEvent.finalSummary)
|
|
125
|
+
|| readNonEmptyString(workerResult?.summary)
|
|
126
|
+
|| readNonEmptyString(workerResult?.finalSummary)
|
|
127
|
+
|| readNonEmptyString(resultRecord?.summary)
|
|
128
|
+
|| readNonEmptyString(resultRecord?.finalSummary);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* A coordinator that surfaces a REMOTE worker's mesh session has no local instance for
|
|
133
|
+
* it, so the status snapshot's getLastDisplayMessage has nothing to read and the only
|
|
134
|
+
* preview the coordinator-mirrored copy could ever carry comes from the worker's
|
|
135
|
+
* completion event. The worker's latest assistant reply rides on that event as
|
|
136
|
+
* `finalSummary` (and as `workerResult.summary` / `result.summary` on some paths).
|
|
137
|
+
*
|
|
138
|
+
* This resolves that assistant text into a preview the coordinator can stamp onto its
|
|
139
|
+
* mirror entry so the mobile inbox shows the worker's latest assistant response instead
|
|
140
|
+
* of being stuck on the first dispatched user task (which is the only message the
|
|
141
|
+
* coordinator-side transcript ever holds). Returns undefined when the event carries no
|
|
142
|
+
* assistant text — non-completion lifecycle events (generating_started / ready without a
|
|
143
|
+
* summary) must NOT clobber a previously surfaced preview.
|
|
144
|
+
*/
|
|
145
|
+
function truncateSurfacedPreview(text: string): string {
|
|
146
|
+
const truncationSuffix = '...[truncated]';
|
|
147
|
+
return text.length > MESH_SURFACED_PREVIEW_MAX_CHARS
|
|
148
|
+
? `${text.slice(0, MESH_SURFACED_PREVIEW_MAX_CHARS - truncationSuffix.length)}${truncationSuffix}`
|
|
149
|
+
: text;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function resolveMeshSurfacedSessionPreview(
|
|
153
|
+
metadataEvent: Record<string, unknown>,
|
|
154
|
+
): { preview: string; role: 'assistant'; receivedAt: number } | undefined {
|
|
155
|
+
// 1) Completion summary — the worker's final assistant text rides a completion event
|
|
156
|
+
// as finalSummary / workerResult.summary / result.summary.
|
|
157
|
+
const summaryText = readMeshCompletionSummary(metadataEvent);
|
|
158
|
+
if (summaryText) {
|
|
159
|
+
return {
|
|
160
|
+
preview: truncateSurfacedPreview(summaryText),
|
|
161
|
+
role: 'assistant',
|
|
162
|
+
receivedAt: readEventTimestampValue(metadataEvent.timestamp),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// 2) Status-snapshot fallback — a completion that carried NO summary (and any later
|
|
166
|
+
// status-sync event) still ships the worker's latest display message on the event as
|
|
167
|
+
// lastMessagePreview/lastMessageRole/lastMessageAt (computed by getLastDisplayMessage
|
|
168
|
+
// on the worker, attached in injectMeshSystemMessage and carried over the relay).
|
|
169
|
+
// Surface it ONLY when it is an assistant reply: a user-role last message means the
|
|
170
|
+
// turn is still mid-flight (the dispatched task is the only message), and surfacing it
|
|
171
|
+
// would both re-introduce the "inbox stuck on the user task" bug and clobber a
|
|
172
|
+
// previously surfaced assistant preview. The web inbox guard renders only an
|
|
173
|
+
// assistant-role preview anyway, so a user-role one would be inert there.
|
|
174
|
+
const lastPreview = readNonEmptyString(metadataEvent.lastMessagePreview);
|
|
175
|
+
const lastRole = readNonEmptyString(metadataEvent.lastMessageRole);
|
|
176
|
+
if (lastPreview && lastRole === 'assistant') {
|
|
177
|
+
return {
|
|
178
|
+
preview: truncateSurfacedPreview(lastPreview),
|
|
179
|
+
role: 'assistant',
|
|
180
|
+
receivedAt: readEventTimestampValue(metadataEvent.lastMessageAt)
|
|
181
|
+
|| readEventTimestampValue(metadataEvent.timestamp),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function readEventTimestampValue(value: unknown): number {
|
|
188
|
+
if (typeof value === 'number' && Number.isFinite(value)) return value;
|
|
189
|
+
if (typeof value === 'string' && value.trim()) {
|
|
190
|
+
const parsed = Number(value);
|
|
191
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
192
|
+
const dateMs = Date.parse(value);
|
|
193
|
+
if (Number.isFinite(dateMs)) return dateMs;
|
|
194
|
+
}
|
|
195
|
+
return 0;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// The completionDiagnostic "false idle" clause, extracted from the five inline copies
|
|
199
|
+
// it used to be duplicated into (the ledger / metadata weak checks and isFalseIdleCompletion).
|
|
200
|
+
// True when the worker FSM dropped to idle WITHOUT a confirmed final assistant message for
|
|
201
|
+
// the turn — a finalization timeout or a "scheduled fallback" idle. cli-provider-instance
|
|
202
|
+
// emits this as completionDiagnostic.blockReason='missing_final_assistant' /
|
|
203
|
+
// finalAssistantPresent=false. The diagnostic lives at the same `completionDiagnostic` field
|
|
204
|
+
// on both a ledger terminal payload and a live metadata event, so one helper serves both.
|
|
205
|
+
export function isMissingFinalAssistantDiagnostic(record: Record<string, unknown> | undefined): boolean {
|
|
206
|
+
const diag = readRecord(record?.completionDiagnostic);
|
|
207
|
+
return diag?.finalAssistantPresent === false || diag?.blockReason === 'missing_final_assistant';
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// A false-idle completion: the provider dropped to idle WITHOUT a confirmed final assistant
|
|
211
|
+
// message (the completionDiagnostic missing-final-assistant signal). This is a strict SUBSET
|
|
212
|
+
// of weak-completion evidence — it DELIBERATELY ignores evidenceLevel/reviewRecommended,
|
|
213
|
+
// because isGenuineCompletionEvidence (coordinator) gates the truncated-terminal supersession
|
|
214
|
+
// on the false-idle distinction alone. Folding evidenceLevel/reviewRecommended in here would
|
|
215
|
+
// change that genuine-completion judgement, so keep this narrow.
|
|
216
|
+
export function isFalseIdleCompletion(record: Record<string, unknown>): boolean {
|
|
217
|
+
return isMissingFinalAssistantDiagnostic(record);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// A completion whose evidence is WEAK: the worker FSM reached idle but the turn's final
|
|
221
|
+
// assistant message was never confirmed (missing_final_assistant / finalAssistantPresent=false),
|
|
222
|
+
// or the event self-declares insufficient/weak evidence, or a review is recommended. The single
|
|
223
|
+
// source of truth that the live metadata path (mesh-events-pending fingerprint, this module's
|
|
224
|
+
// system-message builder) AND the ledger-terminal paths (mesh-events-coordinator supersession,
|
|
225
|
+
// mesh-events-stale reconcile) all share — the same evidenceLevel / reviewRecommended /
|
|
226
|
+
// completionDiagnostic fields appear on a terminal ledger payload and on a live metadata event.
|
|
227
|
+
//
|
|
228
|
+
// cli-provider-instance emits this on the CANON-C decoupled-immediate path and on a forced
|
|
229
|
+
// finalization timeout, and the structural approval-resolution gate (FALSEIDLE-a) can also let
|
|
230
|
+
// an unconfirmed approval→idle through. Such a completion is NOT trustworthy terminal evidence:
|
|
231
|
+
// a later genuine completion (live path) or a transcript reconcile (fallback path) may supersede
|
|
232
|
+
// it, and the coordinator surfaces a verify hint before declaring the task done.
|
|
233
|
+
//
|
|
234
|
+
// NOTE: this intentionally treats evidenceLevel 'weak' as weak — the ledger variants used to
|
|
235
|
+
// omit it, so a producer emitting 'weak' would have had its weak terminal misjudged as
|
|
236
|
+
// authoritative (genuine completion could no longer supersede it). Applying it uniformly here
|
|
237
|
+
// seals that latent divergence.
|
|
238
|
+
export function isWeakCompletionEvidence(record: Record<string, unknown> | undefined): boolean {
|
|
239
|
+
if (!record) return false;
|
|
240
|
+
const evidenceLevel = readNonEmptyString(record.evidenceLevel);
|
|
241
|
+
if (evidenceLevel === 'insufficient' || evidenceLevel === 'weak') return true;
|
|
242
|
+
if (record.reviewRecommended === true) return true;
|
|
243
|
+
return isMissingFinalAssistantDiagnostic(record);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Back-compat alias for the live metadata-event call sites (system-message builder below,
|
|
247
|
+
// pending-event fingerprint). Identical to isWeakCompletionEvidence; kept as a named export so
|
|
248
|
+
// the metadata-flavoured call sites read naturally.
|
|
249
|
+
export function isWeakCompletionMetadata(metadataEvent: Record<string, unknown>): boolean {
|
|
250
|
+
return isWeakCompletionEvidence(metadataEvent);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function formatCompletionMetadata(event: Record<string, unknown>): string {
|
|
254
|
+
const completionDiagnostic = event.completionDiagnostic && typeof event.completionDiagnostic === 'object'
|
|
255
|
+
? event.completionDiagnostic as Record<string, unknown>
|
|
256
|
+
: null;
|
|
257
|
+
const diagnosticReason = completionDiagnostic
|
|
258
|
+
? readNonEmptyString(completionDiagnostic.blockReason) || 'present'
|
|
259
|
+
: '';
|
|
260
|
+
const finalAssistantPresent = typeof completionDiagnostic?.finalAssistantPresent === 'boolean'
|
|
261
|
+
? String(completionDiagnostic.finalAssistantPresent)
|
|
262
|
+
: '';
|
|
263
|
+
const evidenceLevel = readNonEmptyString(event.evidenceLevel);
|
|
264
|
+
const parts = [
|
|
265
|
+
readNonEmptyString(event.targetSessionId) ? `session_id=${readNonEmptyString(event.targetSessionId)}` : '',
|
|
266
|
+
readNonEmptyString(event.providerType) ? `provider=${readNonEmptyString(event.providerType)}` : '',
|
|
267
|
+
readNonEmptyString(event.providerSessionId) ? `provider_session_id=${readNonEmptyString(event.providerSessionId)}` : '',
|
|
268
|
+
diagnosticReason ? `completion_diagnostic=${diagnosticReason}` : '',
|
|
269
|
+
finalAssistantPresent ? `final_assistant=${finalAssistantPresent}` : '',
|
|
270
|
+
evidenceLevel && evidenceLevel !== 'sufficient' ? `evidence_level=${evidenceLevel}` : '',
|
|
271
|
+
].filter(Boolean);
|
|
272
|
+
return parts.length > 0 ? ` (${parts.join('; ')})` : '';
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export function buildMeshSystemMessage(args: {
|
|
276
|
+
event: string;
|
|
277
|
+
nodeLabel: string;
|
|
278
|
+
metadataEvent: Record<string, unknown>;
|
|
279
|
+
recoveryContext?: SessionRecoveryContext | null;
|
|
280
|
+
/**
|
|
281
|
+
* BOOTSTRAP-MSG: true when a queued task targeting this freshly-bootstrapped
|
|
282
|
+
* worktree node is pending/assigned and will be (or has just been) auto-claimed
|
|
283
|
+
* by the post-bootstrap queue re-fire. When set, the worktree_bootstrap_complete
|
|
284
|
+
* message drops the misleading "use mesh_launch_session" advice (which would
|
|
285
|
+
* spawn a DUPLICATE session alongside the auto-claimed one) and tells the
|
|
286
|
+
* coordinator the queue will handle it. Absent/false → no targeted task → keep
|
|
287
|
+
* the manual-launch advice. The caller computes this from the work queue; the
|
|
288
|
+
* builder stays pure so both branches are unit-testable via this flag.
|
|
289
|
+
*/
|
|
290
|
+
worktreeHasQueuedTask?: boolean;
|
|
291
|
+
}): string {
|
|
292
|
+
const metadata = formatCompletionMetadata(args.metadataEvent);
|
|
293
|
+
if (args.event === 'agent:generating_completed') {
|
|
294
|
+
if (args.metadataEvent.source === 'no_progress_reconciliation') {
|
|
295
|
+
return `[System] ${args.nodeLabel} already has completion evidence${metadata}. The no-progress monitor reconciled the terminal handoff and marked the session complete; wait for the queued completion event/status refresh before doing any manual transcript check.`;
|
|
296
|
+
}
|
|
297
|
+
const reviewRecommended = args.metadataEvent.reviewRecommended === true;
|
|
298
|
+
// FALSEIDLE-b: a weak completion (missing final assistant / finalAssistantPresent=false /
|
|
299
|
+
// insufficient evidence) is not trustworthy terminal evidence even when reviewRecommended
|
|
300
|
+
// is not set. Append an explicit verify hint so the coordinator does not declare the task
|
|
301
|
+
// done off a false idle. Only the weak case is affected — a genuine completion (final
|
|
302
|
+
// assistant confirmed, no weak diagnostic) carries no extra note and is unchanged.
|
|
303
|
+
const weakCompletion = isWeakCompletionMetadata(args.metadataEvent);
|
|
304
|
+
const verifyTextNote = ' Completion evidence is weak — verify via mesh_read_chat or git status before declaring the task done; the worker may still be parked on an approval/modal.';
|
|
305
|
+
// Auto-surface the worker's final summary directly into the coordinator chat so it
|
|
306
|
+
// does not have to call mesh_read_chat just to see the result. The summary IS the
|
|
307
|
+
// worker's final assistant message; embedding it here replaces the previous
|
|
308
|
+
// "go call mesh_read_chat" instruction with the answer itself. This rides the
|
|
309
|
+
// existing (non-modal) coordinator delivery channel — it does not write into a
|
|
310
|
+
// parked harness modal. Falls back to the read_chat instruction only when the event
|
|
311
|
+
// genuinely carries no summary (so behaviour is unchanged for summary-less events).
|
|
312
|
+
const completionSummary = readMeshCompletionSummary(args.metadataEvent);
|
|
313
|
+
if (completionSummary) {
|
|
314
|
+
const truncationSuffix = '\n…[truncated — call mesh_read_chat once for the full transcript]';
|
|
315
|
+
const surfaced = completionSummary.length > MESH_COMPLETION_SURFACE_MAX_CHARS
|
|
316
|
+
? `${completionSummary.slice(0, MESH_COMPLETION_SURFACE_MAX_CHARS - truncationSuffix.length)}${truncationSuffix}`
|
|
317
|
+
: completionSummary;
|
|
318
|
+
const verifyNote = reviewRecommended
|
|
319
|
+
? ' Completion evidence is insufficient — verify via git status or provider_session_id before assuming the task is done.'
|
|
320
|
+
: (weakCompletion ? verifyTextNote : '');
|
|
321
|
+
return `[System] ${args.nodeLabel} has completed its task and is now idle${metadata}. Its final summary is included below — read it directly and only call mesh_read_chat if you need the full transcript.${verifyNote}\n\n--- ${args.nodeLabel} final summary ---\n${surfaced}`;
|
|
322
|
+
}
|
|
323
|
+
const reviewNote = reviewRecommended
|
|
324
|
+
? ' Completion evidence is insufficient — verify via git status or provider_session_id before assuming the task is done. Use mesh_read_chat once if needed, but do not poll repeatedly.'
|
|
325
|
+
: (weakCompletion
|
|
326
|
+
? `${verifyTextNote} Use mesh_read_chat once if needed, but do not poll repeatedly.`
|
|
327
|
+
: ' Use mesh_read_chat once to review its final progress, but do not poll repeatedly.');
|
|
328
|
+
return `[System] ${args.nodeLabel} has completed its task and is now idle${metadata}. This completion came from the agent status event path;${reviewNote}`;
|
|
329
|
+
}
|
|
330
|
+
if (args.event === 'agent:waiting_approval') {
|
|
331
|
+
return `[System] ${args.nodeLabel} is waiting for approval to proceed${metadata}. You may use mesh_read_chat and mesh_approve to handle it.`;
|
|
332
|
+
}
|
|
333
|
+
if (args.event === 'agent:stopped') {
|
|
334
|
+
const rc = args.recoveryContext;
|
|
335
|
+
if (rc && rc.consecutiveNodeFailures > 0) {
|
|
336
|
+
const parts = [
|
|
337
|
+
`[System] ${args.nodeLabel} has stopped unexpectedly${metadata}.`,
|
|
338
|
+
`\n\n**Recovery Context:**`,
|
|
339
|
+
`- Consecutive failures on this node: ${rc.consecutiveNodeFailures}`,
|
|
340
|
+
rc.taskAttemptCount > 0 ? `- This task has been attempted ${rc.taskAttemptCount} time(s)` : '',
|
|
341
|
+
`- Recommendation: ${rc.advice}`,
|
|
342
|
+
];
|
|
343
|
+
if (rc.retryRecommended && rc.lastTaskMessage) {
|
|
344
|
+
parts.push(
|
|
345
|
+
`\n\n**Original task to retry:**`,
|
|
346
|
+
`> ${rc.lastTaskMessage.length > 300 ? rc.lastTaskMessage.slice(0, 300) + '...' : rc.lastTaskMessage}`,
|
|
347
|
+
`\nTo retry: call \`mesh_launch_session\` for this node, then \`mesh_send_task\` with the original task.`,
|
|
348
|
+
);
|
|
349
|
+
} else if (!rc.retryRecommended) {
|
|
350
|
+
parts.push(
|
|
351
|
+
`\nDo NOT retry on this node. Consider reassigning to a different node or asking the user for guidance.`,
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
return parts.filter(Boolean).join('\n');
|
|
355
|
+
}
|
|
356
|
+
return `[System] ${args.nodeLabel} has stopped${metadata}. Use mesh_read_chat once if you need to inspect its last output.`;
|
|
357
|
+
}
|
|
358
|
+
if (args.event === 'monitor:no_progress') {
|
|
359
|
+
return `[System] ${args.nodeLabel} is still reported as generating after a long interval${metadata}. Wait for pendingCoordinatorEvents or a completion/status event; if the user explicitly asks for status, make one bounded status check and then wait again.`;
|
|
360
|
+
}
|
|
361
|
+
if (args.event === 'worktree_bootstrap_complete') {
|
|
362
|
+
const worktreePath = readNonEmptyString(args.metadataEvent.worktreePath);
|
|
363
|
+
const durationMs = typeof args.metadataEvent.durationMs === 'number' ? args.metadataEvent.durationMs : undefined;
|
|
364
|
+
const prefix = `[System] ${args.nodeLabel} worktree bootstrap completed${worktreePath ? ` at ${worktreePath}` : ''}${durationMs !== undefined ? ` in ${Math.round(durationMs / 1000)}s` : ''}.`;
|
|
365
|
+
// BOOTSTRAP-MSG: a task already targeting this node is auto-claimed by the
|
|
366
|
+
// post-bootstrap queue re-fire (see mesh-event-forwarding worktree_bootstrap_complete
|
|
367
|
+
// handler). Advising mesh_launch_session here would spawn a duplicate session.
|
|
368
|
+
if (args.worktreeHasQueuedTask) {
|
|
369
|
+
return `${prefix} The worktree is ready; a queued task targeting this node will auto-claim it — no manual \`mesh_launch_session\` needed.`;
|
|
370
|
+
}
|
|
371
|
+
return `${prefix} The worktree is ready — use \`mesh_launch_session\` to start an agent.`;
|
|
372
|
+
}
|
|
373
|
+
if (args.event === 'worktree_bootstrap_failed') {
|
|
374
|
+
const error = readNonEmptyString(args.metadataEvent.error);
|
|
375
|
+
return `[System] ${args.nodeLabel} worktree bootstrap failed${error ? `: ${error}` : '.'}. Use \`mesh_retry_node_bootstrap\` to retry or inspect the node state.`;
|
|
376
|
+
}
|
|
377
|
+
if (args.event === 'refine:accepted') {
|
|
378
|
+
const jobId = readRefineJobId({ metadataEvent: args.metadataEvent });
|
|
379
|
+
return `[System] Refinery accepted async job${jobId ? ` ${jobId}` : ''} for ${args.nodeLabel}. Completion/failure will be delivered as a terminal refine event; do not poll repeatedly.`;
|
|
380
|
+
}
|
|
381
|
+
if (args.event === 'refine:completed') {
|
|
382
|
+
const jobId = readRefineJobId({ metadataEvent: args.metadataEvent });
|
|
383
|
+
const result = readRecord(args.metadataEvent.result);
|
|
384
|
+
const validationSummary = readRecord(result?.validationSummary);
|
|
385
|
+
const patchEquivalence = readRecord(result?.patchEquivalence);
|
|
386
|
+
const finalConvergence = readRecord(result?.finalBranchConvergenceState);
|
|
387
|
+
const validationStatus = readNonEmptyString(validationSummary?.status);
|
|
388
|
+
const patchStatus = readNonEmptyString(patchEquivalence?.status)
|
|
389
|
+
|| (patchEquivalence?.equivalent === true ? 'passed' : '');
|
|
390
|
+
const into = readNonEmptyString(result?.into);
|
|
391
|
+
const branch = readNonEmptyString(result?.branch);
|
|
392
|
+
const mergeStatus = result?.merged === true ? 'merged' : readNonEmptyString(finalConvergence?.status);
|
|
393
|
+
const convergenceStatus = readNonEmptyString(finalConvergence?.status);
|
|
394
|
+
const nextStep = readNonEmptyString(result?.nextStep)
|
|
395
|
+
|| readNonEmptyString(finalConvergence?.nextStep)
|
|
396
|
+
|| 'Continue from the updated mesh state.';
|
|
397
|
+
const details = [
|
|
398
|
+
jobId ? `job_id=${jobId}` : '',
|
|
399
|
+
branch && into ? `${branch}→${into}` : '',
|
|
400
|
+
validationStatus ? `validation=${validationStatus}` : '',
|
|
401
|
+
patchStatus ? `patch_equivalence=${patchStatus}` : '',
|
|
402
|
+
mergeStatus ? `merge=${mergeStatus}` : '',
|
|
403
|
+
convergenceStatus ? `final_convergence=${convergenceStatus}` : '',
|
|
404
|
+
].filter(Boolean).join('; ');
|
|
405
|
+
return `[System] Refinery async job for ${args.nodeLabel} completed successfully${details ? ` (${details})` : ''}.\nNext step: ${nextStep}`;
|
|
406
|
+
}
|
|
407
|
+
if (args.event === 'refine:failed') {
|
|
408
|
+
const jobId = readRefineJobId({ metadataEvent: args.metadataEvent });
|
|
409
|
+
const result = readRecord(args.metadataEvent.result);
|
|
410
|
+
const validationSummary = readRecord(result?.validationSummary);
|
|
411
|
+
const patchEquivalence = readRecord(result?.patchEquivalence);
|
|
412
|
+
const finalConvergence = readRecord(result?.finalBranchConvergenceState);
|
|
413
|
+
const code = readNonEmptyString(result?.code);
|
|
414
|
+
const error = readNonEmptyString(result?.error);
|
|
415
|
+
const validationStatus = readNonEmptyString(validationSummary?.status);
|
|
416
|
+
const patchStatus = readNonEmptyString(patchEquivalence?.status)
|
|
417
|
+
|| (patchEquivalence?.equivalent === true ? 'passed' : '');
|
|
418
|
+
const mergeStatus = result?.merged === true
|
|
419
|
+
? 'merged'
|
|
420
|
+
: finalConvergence?.merged === false
|
|
421
|
+
? 'not_merged'
|
|
422
|
+
: '';
|
|
423
|
+
const convergenceStatus = readNonEmptyString(result?.convergenceStatus)
|
|
424
|
+
|| readNonEmptyString(finalConvergence?.status);
|
|
425
|
+
const blockedReason = readNonEmptyString(result?.blockedReason);
|
|
426
|
+
const nextStep = readNonEmptyString(result?.nextStep) || readNonEmptyString(finalConvergence?.nextStep);
|
|
427
|
+
const details = [
|
|
428
|
+
jobId ? `job_id=${jobId}` : '',
|
|
429
|
+
code ? `code=${code}` : '',
|
|
430
|
+
validationStatus ? `validation=${validationStatus}` : '',
|
|
431
|
+
patchStatus ? `patch_equivalence=${patchStatus}` : '',
|
|
432
|
+
mergeStatus ? `merge=${mergeStatus}` : '',
|
|
433
|
+
convergenceStatus ? `convergence=${convergenceStatus}` : '',
|
|
434
|
+
blockedReason ? `reason=${blockedReason}` : '',
|
|
435
|
+
].filter(Boolean).join('; ');
|
|
436
|
+
const parts = [
|
|
437
|
+
`[System] Refinery async job for ${args.nodeLabel} failed${details ? ` (${details})` : ''}${error ? `: ${error}` : '.'}`,
|
|
438
|
+
nextStep ? `Next step: ${nextStep}` : 'Review the terminal refine event/ledger before retrying.',
|
|
439
|
+
];
|
|
440
|
+
return parts.join('\n');
|
|
441
|
+
}
|
|
442
|
+
return '';
|
|
443
|
+
}
|