@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,534 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat source state machine.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the ad-hoc anchor + freshness + 6-trigger ladder that
|
|
5
|
+
* chat-commands.ts:1500-1800 grew over time. The machine has four states and
|
|
6
|
+
* three events; every other signal collapses to one of those three.
|
|
7
|
+
*
|
|
8
|
+
* States Meaning
|
|
9
|
+
* ─────────────────────────────────────────────────────────────────
|
|
10
|
+
* Booting No native attempt evaluated yet. PTY is the source
|
|
11
|
+
* because we have nothing else; this is not a
|
|
12
|
+
* "fallback", just the starting condition.
|
|
13
|
+
* NativeLocked Native transcript is the source. The lock holds even
|
|
14
|
+
* when PTY receives newer bytes — only NativeRegressed
|
|
15
|
+
* or NativeUnavailable can break it.
|
|
16
|
+
* PtyOnly Native is genuinely not usable (unavailable /
|
|
17
|
+
* regressed / never observed). PTY is the source.
|
|
18
|
+
* Recovering We were NativeLocked, native disappeared, but we
|
|
19
|
+
* have not yet seen enough PTY-only turns to commit
|
|
20
|
+
* to PtyOnly. Behaves like PtyOnly for the current
|
|
21
|
+
* read but a single NativeProgressed re-locks.
|
|
22
|
+
*
|
|
23
|
+
* Events Meaning
|
|
24
|
+
* ─────────────────────────────────────────────────────────────────
|
|
25
|
+
* NativeProgressed Native transcript has fresh, safely-mapped messages
|
|
26
|
+
* whose newest sequence is >= the last observed peak.
|
|
27
|
+
* NativeRegressed Native messages dropped, mapping became unsafe, or
|
|
28
|
+
* the transcript shrank. Strong unlock signal.
|
|
29
|
+
* NativeUnavailable Native transcript could not be fetched at all
|
|
30
|
+
* (read error, provider not supported, schema invalid).
|
|
31
|
+
* Soft unlock — Recovering tolerates a transient miss.
|
|
32
|
+
*
|
|
33
|
+
* Why this replaces the v1 design:
|
|
34
|
+
* - The v1 freshness check (`isNativeHistoryFreshEnough`) compared native's
|
|
35
|
+
* newest receivedAt to the PTY buffer's. PTY arrived every turn, so
|
|
36
|
+
* native looked stale by default and only the 30-minute anchor TTL kept
|
|
37
|
+
* things stable. When the anchor expired the source flipped, which is
|
|
38
|
+
* the "plipping" the user reported. The new machine does not compare
|
|
39
|
+
* PTY freshness against native at all; the only thing that unlocks a
|
|
40
|
+
* NativeLocked state is evidence that native itself moved backwards or
|
|
41
|
+
* vanished.
|
|
42
|
+
* - The 6 trigger strings (`native_history_partial`, `native_history_stale`,
|
|
43
|
+
* `native_history_not_safely_mapped`, `native_history_empty`,
|
|
44
|
+
* `native_history_error:*`, `native_history_unavailable:*`) collapse to
|
|
45
|
+
* three events. Each transition records the original trigger as `cause`
|
|
46
|
+
* for observability, so we lose nothing diagnostic.
|
|
47
|
+
* - There is no anchor store. The "lock" is a state, not a piece of
|
|
48
|
+
* mutable data living on the adapter. Callers pass the previous state in
|
|
49
|
+
* and get the next state out.
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
import type {
|
|
53
|
+
ChatContractVersion,
|
|
54
|
+
} from '../providers/transcript-v2.js';
|
|
55
|
+
import {
|
|
56
|
+
CHAT_CONTRACT_VERSION_V1,
|
|
57
|
+
CHAT_CONTRACT_VERSION_V2,
|
|
58
|
+
} from '../providers/transcript-v2.js';
|
|
59
|
+
|
|
60
|
+
// ─── States and events ──────────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
export type ChatSourceStateName =
|
|
63
|
+
| 'Booting'
|
|
64
|
+
| 'NativeLocked'
|
|
65
|
+
| 'PtyOnly'
|
|
66
|
+
| 'Recovering';
|
|
67
|
+
|
|
68
|
+
export type ChatSourceSelected = 'native-history' | 'pty-parser';
|
|
69
|
+
|
|
70
|
+
export type ChatSourceEventKind =
|
|
71
|
+
| 'NativeProgressed'
|
|
72
|
+
| 'NativeRegressed'
|
|
73
|
+
| 'NativeUnavailable';
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Cause codes mirror the legacy 6-trigger vocabulary so existing log
|
|
77
|
+
* pipelines and dashboards can group transitions the same way they do
|
|
78
|
+
* today. They are diagnostic, not control-flow.
|
|
79
|
+
*/
|
|
80
|
+
export type ChatSourceTransitionCause =
|
|
81
|
+
| 'initial'
|
|
82
|
+
| 'native_progressed'
|
|
83
|
+
| 'native_regressed_shrunk'
|
|
84
|
+
| 'native_regressed_unsafe_mapping'
|
|
85
|
+
| 'native_regressed_coverage_partial'
|
|
86
|
+
| 'native_regressed_coverage_unavailable'
|
|
87
|
+
| 'native_unavailable_read_error'
|
|
88
|
+
| 'native_unavailable_provider_unsupported'
|
|
89
|
+
| 'native_unavailable_empty'
|
|
90
|
+
| 'native_unavailable_not_native_source';
|
|
91
|
+
|
|
92
|
+
export interface ChatSourceState {
|
|
93
|
+
readonly name: ChatSourceStateName;
|
|
94
|
+
/**
|
|
95
|
+
* Highest sequence number ever observed from native. Used as the watermark
|
|
96
|
+
* NativeProgressed has to reach (or exceed) before re-locking from
|
|
97
|
+
* Recovering. Undefined while we have never seen native.
|
|
98
|
+
*/
|
|
99
|
+
readonly nativeSequencePeak: number | undefined;
|
|
100
|
+
/**
|
|
101
|
+
* Highest providerUnitKey set we have committed to. Future progressed events
|
|
102
|
+
* must be a superset (no removals) for the lock to hold; if any prior
|
|
103
|
+
* unit key vanishes we issue NativeRegressed instead. Empty when we have
|
|
104
|
+
* never locked.
|
|
105
|
+
*/
|
|
106
|
+
readonly committedUnitKeys: ReadonlySet<string>;
|
|
107
|
+
/**
|
|
108
|
+
* Number of consecutive non-progressed observations while in Recovering.
|
|
109
|
+
* Threshold-based promotion to PtyOnly so transient misses do not commit
|
|
110
|
+
* us to PtyOnly prematurely. Always 0 outside Recovering.
|
|
111
|
+
*/
|
|
112
|
+
readonly recoveringMisses: number;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export const INITIAL_CHAT_SOURCE_STATE: ChatSourceState = Object.freeze({
|
|
116
|
+
name: 'Booting',
|
|
117
|
+
nativeSequencePeak: undefined,
|
|
118
|
+
committedUnitKeys: Object.freeze(new Set<string>()),
|
|
119
|
+
recoveringMisses: 0,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Promote from Recovering to PtyOnly after this many consecutive misses.
|
|
124
|
+
* One transient miss should not flip the source for a user who was just
|
|
125
|
+
* reading from native; three in a row signals native is genuinely gone.
|
|
126
|
+
*/
|
|
127
|
+
export const RECOVERING_MISS_PROMOTION_THRESHOLD = 3;
|
|
128
|
+
|
|
129
|
+
// ─── Inputs ─────────────────────────────────────────────────────────────
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Per-message identity slice the machine needs. Producers normalise their
|
|
133
|
+
* native transcript output into this shape (v2 producers already do so via
|
|
134
|
+
* transcript-v2.ts; v1 producers go through a thin adapter — see
|
|
135
|
+
* source-resolver.ts).
|
|
136
|
+
*/
|
|
137
|
+
export interface ResolverNativeMessageIdentity {
|
|
138
|
+
providerUnitKey: string;
|
|
139
|
+
sequence: number;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Observation the resolver hands to the machine for a single readChat call.
|
|
144
|
+
* Three mutually exclusive shapes — represented as a discriminated union so
|
|
145
|
+
* the type system enforces honesty about what happened.
|
|
146
|
+
*/
|
|
147
|
+
export type ChatSourceObservation =
|
|
148
|
+
| {
|
|
149
|
+
kind: 'native_present';
|
|
150
|
+
contractVersion: ChatContractVersion;
|
|
151
|
+
messages: ReadonlyArray<ResolverNativeMessageIdentity>;
|
|
152
|
+
/** Producer-declared coverage. Drives Progressed vs Regressed when the
|
|
153
|
+
* transcript is non-empty but only partial. */
|
|
154
|
+
coverage: 'full' | 'tail' | 'current-turn' | 'partial';
|
|
155
|
+
/** True when the daemon can prove these native messages belong to the
|
|
156
|
+
* intended workspace+session. False is treated as regression. */
|
|
157
|
+
safeMapping: boolean;
|
|
158
|
+
}
|
|
159
|
+
| {
|
|
160
|
+
kind: 'native_unavailable';
|
|
161
|
+
reason:
|
|
162
|
+
| 'provider_not_supported'
|
|
163
|
+
| 'read_error'
|
|
164
|
+
| 'empty'
|
|
165
|
+
| 'not_native_source'
|
|
166
|
+
| 'coverage_unavailable';
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
// ─── Decision output ────────────────────────────────────────────────────
|
|
170
|
+
|
|
171
|
+
export interface ChatSourceTransition {
|
|
172
|
+
readonly fromState: ChatSourceStateName;
|
|
173
|
+
readonly toState: ChatSourceStateName;
|
|
174
|
+
readonly event: ChatSourceEventKind | 'NoOp';
|
|
175
|
+
readonly cause: ChatSourceTransitionCause;
|
|
176
|
+
/** Wall-clock ms at the moment of resolution. Producer time, not ordering. */
|
|
177
|
+
readonly at: number;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export interface ChatSourceLockState {
|
|
181
|
+
readonly locked: boolean;
|
|
182
|
+
/**
|
|
183
|
+
* ms since epoch when the current lock began. Undefined when not locked or
|
|
184
|
+
* not yet observed. Producers may use this for "anchored Xs ago" UI but
|
|
185
|
+
* the machine itself never expires a lock based on it — only events do.
|
|
186
|
+
*/
|
|
187
|
+
readonly lockedSince?: number;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export interface ChatSourceDecision {
|
|
191
|
+
readonly selected: ChatSourceSelected;
|
|
192
|
+
readonly nextState: ChatSourceState;
|
|
193
|
+
readonly transition: ChatSourceTransition;
|
|
194
|
+
readonly lockState: ChatSourceLockState;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// ─── Pure transition function ───────────────────────────────────────────
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Pure transition function. Given a previous state and a single observation,
|
|
201
|
+
* returns the next state, the resulting transition record, and the selected
|
|
202
|
+
* source. No side effects. No mutation of `prev`.
|
|
203
|
+
*
|
|
204
|
+
* Lock semantics:
|
|
205
|
+
* - Booting + native_present(safeMapping, not partial-only) → NativeLocked
|
|
206
|
+
* - NativeLocked + native_present(superset of committed keys, safe) → stays NativeLocked
|
|
207
|
+
* - NativeLocked + native_present(missing committed keys OR unsafe OR partial-shrunk) → PtyOnly
|
|
208
|
+
* - NativeLocked + native_unavailable → Recovering (lock holds for the source decision but watermark survives)
|
|
209
|
+
* - Recovering + native_present(progressed past peak) → NativeLocked
|
|
210
|
+
* - Recovering + native_unavailable (RECOVERING_MISS_PROMOTION_THRESHOLD times) → PtyOnly
|
|
211
|
+
* - PtyOnly is sticky: only an explicit progressed observation that meets
|
|
212
|
+
* the original superset rule moves us back to NativeLocked. This is the
|
|
213
|
+
* intended behaviour — once we have concluded native is dead, we do not
|
|
214
|
+
* re-lock on a single transient revival.
|
|
215
|
+
*/
|
|
216
|
+
export function transitionChatSourceState(
|
|
217
|
+
prev: ChatSourceState,
|
|
218
|
+
observation: ChatSourceObservation,
|
|
219
|
+
at: number,
|
|
220
|
+
lockedSince: number | undefined,
|
|
221
|
+
): {
|
|
222
|
+
next: ChatSourceState;
|
|
223
|
+
transition: ChatSourceTransition;
|
|
224
|
+
selected: ChatSourceSelected;
|
|
225
|
+
lockState: ChatSourceLockState;
|
|
226
|
+
} {
|
|
227
|
+
const fromState = prev.name;
|
|
228
|
+
|
|
229
|
+
if (observation.kind === 'native_unavailable') {
|
|
230
|
+
return handleNativeUnavailable(prev, observation.reason, at, lockedSince);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return handleNativePresent(prev, observation, at, lockedSince, fromState);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function handleNativeUnavailable(
|
|
237
|
+
prev: ChatSourceState,
|
|
238
|
+
reason: Extract<ChatSourceObservation, { kind: 'native_unavailable' }>['reason'],
|
|
239
|
+
at: number,
|
|
240
|
+
lockedSince: number | undefined,
|
|
241
|
+
): ReturnType<typeof transitionChatSourceState> {
|
|
242
|
+
const cause = reasonToUnavailableCause(reason);
|
|
243
|
+
const fromState = prev.name;
|
|
244
|
+
|
|
245
|
+
// Booting never had native; go straight to PtyOnly.
|
|
246
|
+
if (prev.name === 'Booting') {
|
|
247
|
+
const next: ChatSourceState = {
|
|
248
|
+
name: 'PtyOnly',
|
|
249
|
+
nativeSequencePeak: undefined,
|
|
250
|
+
committedUnitKeys: prev.committedUnitKeys,
|
|
251
|
+
recoveringMisses: 0,
|
|
252
|
+
};
|
|
253
|
+
return {
|
|
254
|
+
next,
|
|
255
|
+
selected: 'pty-parser',
|
|
256
|
+
transition: { fromState, toState: 'PtyOnly', event: 'NativeUnavailable', cause, at },
|
|
257
|
+
lockState: { locked: false },
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// PtyOnly stays PtyOnly.
|
|
262
|
+
if (prev.name === 'PtyOnly') {
|
|
263
|
+
return {
|
|
264
|
+
next: prev,
|
|
265
|
+
selected: 'pty-parser',
|
|
266
|
+
transition: { fromState, toState: 'PtyOnly', event: 'NoOp', cause, at },
|
|
267
|
+
lockState: { locked: false },
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// NativeLocked → Recovering on first miss. Source decision still favours
|
|
272
|
+
// PTY for the current read because we have no native data to show, but
|
|
273
|
+
// the watermark survives so the next progressed observation can re-lock
|
|
274
|
+
// without resetting peak history.
|
|
275
|
+
if (prev.name === 'NativeLocked') {
|
|
276
|
+
const next: ChatSourceState = {
|
|
277
|
+
name: 'Recovering',
|
|
278
|
+
nativeSequencePeak: prev.nativeSequencePeak,
|
|
279
|
+
committedUnitKeys: prev.committedUnitKeys,
|
|
280
|
+
recoveringMisses: 1,
|
|
281
|
+
};
|
|
282
|
+
return {
|
|
283
|
+
next,
|
|
284
|
+
selected: 'pty-parser',
|
|
285
|
+
transition: { fromState, toState: 'Recovering', event: 'NativeUnavailable', cause, at },
|
|
286
|
+
lockState: { locked: false },
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Recovering: count the miss; promote to PtyOnly at threshold.
|
|
291
|
+
const misses = prev.recoveringMisses + 1;
|
|
292
|
+
if (misses >= RECOVERING_MISS_PROMOTION_THRESHOLD) {
|
|
293
|
+
const next: ChatSourceState = {
|
|
294
|
+
name: 'PtyOnly',
|
|
295
|
+
nativeSequencePeak: prev.nativeSequencePeak,
|
|
296
|
+
committedUnitKeys: prev.committedUnitKeys,
|
|
297
|
+
recoveringMisses: 0,
|
|
298
|
+
};
|
|
299
|
+
return {
|
|
300
|
+
next,
|
|
301
|
+
selected: 'pty-parser',
|
|
302
|
+
transition: { fromState, toState: 'PtyOnly', event: 'NativeUnavailable', cause, at },
|
|
303
|
+
lockState: { locked: false },
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
const next: ChatSourceState = {
|
|
307
|
+
name: 'Recovering',
|
|
308
|
+
nativeSequencePeak: prev.nativeSequencePeak,
|
|
309
|
+
committedUnitKeys: prev.committedUnitKeys,
|
|
310
|
+
recoveringMisses: misses,
|
|
311
|
+
};
|
|
312
|
+
return {
|
|
313
|
+
next,
|
|
314
|
+
selected: 'pty-parser',
|
|
315
|
+
transition: { fromState, toState: 'Recovering', event: 'NoOp', cause, at },
|
|
316
|
+
lockState: { locked: false },
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function handleNativePresent(
|
|
321
|
+
prev: ChatSourceState,
|
|
322
|
+
observation: Extract<ChatSourceObservation, { kind: 'native_present' }>,
|
|
323
|
+
at: number,
|
|
324
|
+
lockedSince: number | undefined,
|
|
325
|
+
fromState: ChatSourceStateName,
|
|
326
|
+
): ReturnType<typeof transitionChatSourceState> {
|
|
327
|
+
// Unsafe mapping is always a regression — we cannot trust the messages.
|
|
328
|
+
if (!observation.safeMapping) {
|
|
329
|
+
return regressTo(prev, fromState, 'native_regressed_unsafe_mapping', at);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Partial coverage is regression only if we previously had something better.
|
|
333
|
+
// Booting with partial-only is still progress (some data > no data) but we
|
|
334
|
+
// do not lock — Recovering captures that "we have something but cannot
|
|
335
|
+
// commit to it yet".
|
|
336
|
+
if (observation.coverage === 'partial' && observation.messages.length === 0) {
|
|
337
|
+
return regressTo(prev, fromState, 'native_regressed_coverage_partial', at);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
if (observation.messages.length === 0) {
|
|
341
|
+
return handleNativeUnavailable(prev, 'empty', at, lockedSince);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
const incomingUnitKeys = collectUnitKeys(observation.messages);
|
|
345
|
+
const incomingPeak = maxSequence(observation.messages);
|
|
346
|
+
|
|
347
|
+
// From Booting: lock if we have full or tail coverage; otherwise go to
|
|
348
|
+
// Recovering so the next observation can either confirm or release.
|
|
349
|
+
if (prev.name === 'Booting') {
|
|
350
|
+
if (observation.coverage === 'partial') {
|
|
351
|
+
const next: ChatSourceState = {
|
|
352
|
+
name: 'Recovering',
|
|
353
|
+
nativeSequencePeak: incomingPeak,
|
|
354
|
+
committedUnitKeys: incomingUnitKeys,
|
|
355
|
+
recoveringMisses: 0,
|
|
356
|
+
};
|
|
357
|
+
return {
|
|
358
|
+
next,
|
|
359
|
+
selected: 'pty-parser',
|
|
360
|
+
transition: { fromState, toState: 'Recovering', event: 'NativeProgressed', cause: 'native_progressed', at },
|
|
361
|
+
lockState: { locked: false },
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
const next: ChatSourceState = {
|
|
365
|
+
name: 'NativeLocked',
|
|
366
|
+
nativeSequencePeak: incomingPeak,
|
|
367
|
+
committedUnitKeys: incomingUnitKeys,
|
|
368
|
+
recoveringMisses: 0,
|
|
369
|
+
};
|
|
370
|
+
return {
|
|
371
|
+
next,
|
|
372
|
+
selected: 'native-history',
|
|
373
|
+
transition: { fromState, toState: 'NativeLocked', event: 'NativeProgressed', cause: 'native_progressed', at },
|
|
374
|
+
lockState: { locked: true, lockedSince: at },
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// From NativeLocked: hold the lock as long as the new key set is a
|
|
379
|
+
// superset of the committed one (no removals, additions OK) and the
|
|
380
|
+
// peak did not move backward. Anything else is regression.
|
|
381
|
+
if (prev.name === 'NativeLocked') {
|
|
382
|
+
if (!isSupersetOf(incomingUnitKeys, prev.committedUnitKeys)) {
|
|
383
|
+
return regressTo(prev, fromState, 'native_regressed_shrunk', at);
|
|
384
|
+
}
|
|
385
|
+
if (prev.nativeSequencePeak !== undefined && incomingPeak < prev.nativeSequencePeak) {
|
|
386
|
+
return regressTo(prev, fromState, 'native_regressed_shrunk', at);
|
|
387
|
+
}
|
|
388
|
+
const next: ChatSourceState = {
|
|
389
|
+
name: 'NativeLocked',
|
|
390
|
+
nativeSequencePeak: Math.max(prev.nativeSequencePeak ?? incomingPeak, incomingPeak),
|
|
391
|
+
committedUnitKeys: incomingUnitKeys,
|
|
392
|
+
recoveringMisses: 0,
|
|
393
|
+
};
|
|
394
|
+
return {
|
|
395
|
+
next,
|
|
396
|
+
selected: 'native-history',
|
|
397
|
+
transition: { fromState, toState: 'NativeLocked', event: 'NoOp', cause: 'native_progressed', at },
|
|
398
|
+
lockState: { locked: true, lockedSince: lockedSince ?? at },
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// From Recovering: progressed past peak (or matching peak with superset)
|
|
403
|
+
// re-locks. Anything weaker stays Recovering and counts as a miss.
|
|
404
|
+
if (prev.name === 'Recovering') {
|
|
405
|
+
const meetsWatermark = prev.nativeSequencePeak === undefined
|
|
406
|
+
|| incomingPeak >= prev.nativeSequencePeak;
|
|
407
|
+
if (meetsWatermark && isSupersetOf(incomingUnitKeys, prev.committedUnitKeys)
|
|
408
|
+
&& observation.coverage !== 'partial') {
|
|
409
|
+
const next: ChatSourceState = {
|
|
410
|
+
name: 'NativeLocked',
|
|
411
|
+
nativeSequencePeak: Math.max(prev.nativeSequencePeak ?? incomingPeak, incomingPeak),
|
|
412
|
+
committedUnitKeys: incomingUnitKeys,
|
|
413
|
+
recoveringMisses: 0,
|
|
414
|
+
};
|
|
415
|
+
return {
|
|
416
|
+
next,
|
|
417
|
+
selected: 'native-history',
|
|
418
|
+
transition: { fromState, toState: 'NativeLocked', event: 'NativeProgressed', cause: 'native_progressed', at },
|
|
419
|
+
lockState: { locked: true, lockedSince: at },
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
return handleNativeUnavailable(prev, 'empty', at, lockedSince);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// From PtyOnly: sticky for transient native blips. A re-lock requires
|
|
426
|
+
// either (a) meeting the historical watermark with a superset of the
|
|
427
|
+
// previously committed unit keys (strict path, kept for compatibility),
|
|
428
|
+
// OR (b) the incoming peak being meaningfully ahead of the historical
|
|
429
|
+
// watermark even with a different (tail-limited) message slice. The
|
|
430
|
+
// second case handles the common reality where consumers ask for
|
|
431
|
+
// different tail lengths across reads — the resulting unit-key sets are
|
|
432
|
+
// *subsets* of each other, not supersets, so the strict path traps the
|
|
433
|
+
// machine in PtyOnly even though native is clearly healthy and ahead.
|
|
434
|
+
if (prev.nativeSequencePeak === undefined || incomingPeak > prev.nativeSequencePeak) {
|
|
435
|
+
// Strictly ahead of the previous peak with non-partial coverage and a
|
|
436
|
+
// non-empty key set: native has clearly progressed; trust it.
|
|
437
|
+
if (observation.coverage !== 'partial' && incomingUnitKeys.size > 0) {
|
|
438
|
+
const next: ChatSourceState = {
|
|
439
|
+
name: 'NativeLocked',
|
|
440
|
+
nativeSequencePeak: Math.max(prev.nativeSequencePeak ?? incomingPeak, incomingPeak),
|
|
441
|
+
committedUnitKeys: incomingUnitKeys,
|
|
442
|
+
recoveringMisses: 0,
|
|
443
|
+
};
|
|
444
|
+
return {
|
|
445
|
+
next,
|
|
446
|
+
selected: 'native-history',
|
|
447
|
+
transition: { fromState, toState: 'NativeLocked', event: 'NativeProgressed', cause: 'native_progressed', at },
|
|
448
|
+
lockState: { locked: true, lockedSince: at },
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
} else if (incomingPeak >= prev.nativeSequencePeak) {
|
|
452
|
+
// Equal-peak observation only re-locks when the superset rule holds
|
|
453
|
+
// (the original strict behaviour).
|
|
454
|
+
if (isSupersetOf(incomingUnitKeys, prev.committedUnitKeys)
|
|
455
|
+
&& observation.coverage !== 'partial') {
|
|
456
|
+
const next: ChatSourceState = {
|
|
457
|
+
name: 'NativeLocked',
|
|
458
|
+
nativeSequencePeak: Math.max(prev.nativeSequencePeak ?? incomingPeak, incomingPeak),
|
|
459
|
+
committedUnitKeys: incomingUnitKeys,
|
|
460
|
+
recoveringMisses: 0,
|
|
461
|
+
};
|
|
462
|
+
return {
|
|
463
|
+
next,
|
|
464
|
+
selected: 'native-history',
|
|
465
|
+
transition: { fromState, toState: 'NativeLocked', event: 'NativeProgressed', cause: 'native_progressed', at },
|
|
466
|
+
lockState: { locked: true, lockedSince: at },
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
return {
|
|
471
|
+
next: prev,
|
|
472
|
+
selected: 'pty-parser',
|
|
473
|
+
transition: { fromState, toState: 'PtyOnly', event: 'NoOp', cause: 'native_progressed', at },
|
|
474
|
+
lockState: { locked: false },
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
function regressTo(
|
|
479
|
+
prev: ChatSourceState,
|
|
480
|
+
fromState: ChatSourceStateName,
|
|
481
|
+
cause: ChatSourceTransitionCause,
|
|
482
|
+
at: number,
|
|
483
|
+
): ReturnType<typeof transitionChatSourceState> {
|
|
484
|
+
const next: ChatSourceState = {
|
|
485
|
+
name: 'PtyOnly',
|
|
486
|
+
nativeSequencePeak: prev.nativeSequencePeak,
|
|
487
|
+
committedUnitKeys: prev.committedUnitKeys,
|
|
488
|
+
recoveringMisses: 0,
|
|
489
|
+
};
|
|
490
|
+
return {
|
|
491
|
+
next,
|
|
492
|
+
selected: 'pty-parser',
|
|
493
|
+
transition: { fromState, toState: 'PtyOnly', event: 'NativeRegressed', cause, at },
|
|
494
|
+
lockState: { locked: false },
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
function reasonToUnavailableCause(
|
|
499
|
+
reason: Extract<ChatSourceObservation, { kind: 'native_unavailable' }>['reason'],
|
|
500
|
+
): ChatSourceTransitionCause {
|
|
501
|
+
switch (reason) {
|
|
502
|
+
case 'provider_not_supported': return 'native_unavailable_provider_unsupported';
|
|
503
|
+
case 'read_error': return 'native_unavailable_read_error';
|
|
504
|
+
case 'empty': return 'native_unavailable_empty';
|
|
505
|
+
case 'not_native_source': return 'native_unavailable_not_native_source';
|
|
506
|
+
case 'coverage_unavailable': return 'native_regressed_coverage_unavailable';
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
function collectUnitKeys(messages: ReadonlyArray<ResolverNativeMessageIdentity>): Set<string> {
|
|
511
|
+
const set = new Set<string>();
|
|
512
|
+
for (const m of messages) set.add(m.providerUnitKey);
|
|
513
|
+
return set;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
function maxSequence(messages: ReadonlyArray<ResolverNativeMessageIdentity>): number {
|
|
517
|
+
let max = -Infinity;
|
|
518
|
+
for (const m of messages) {
|
|
519
|
+
if (m.sequence > max) max = m.sequence;
|
|
520
|
+
}
|
|
521
|
+
return max === -Infinity ? 0 : max;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
function isSupersetOf(candidate: ReadonlySet<string>, required: ReadonlySet<string>): boolean {
|
|
525
|
+
if (required.size === 0) return true;
|
|
526
|
+
for (const key of required) {
|
|
527
|
+
if (!candidate.has(key)) return false;
|
|
528
|
+
}
|
|
529
|
+
return true;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// ─── Convenience re-exports for callers that need version constants ────
|
|
533
|
+
|
|
534
|
+
export { CHAT_CONTRACT_VERSION_V1, CHAT_CONTRACT_VERSION_V2 };
|
|
Binary file
|
|
@@ -17,6 +17,7 @@ export interface ChatTailSubscriptionCursor {
|
|
|
17
17
|
export type SessionChatTailCommandResult = Partial<Omit<ReadChatSyncResult, 'activeModal'>> & {
|
|
18
18
|
success?: boolean
|
|
19
19
|
activeModal?: unknown
|
|
20
|
+
messagesTail?: unknown
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
export interface PrepareSessionChatTailUpdateInput {
|
|
@@ -102,11 +103,26 @@ export function prepareSessionChatTailUpdate(
|
|
|
102
103
|
}
|
|
103
104
|
}
|
|
104
105
|
|
|
105
|
-
const
|
|
106
|
+
const rawMessages = Array.isArray(result.messages)
|
|
107
|
+
? result.messages as any[]
|
|
108
|
+
: (Array.isArray(result.messagesTail) ? result.messagesTail as any[] : [])
|
|
109
|
+
const fullMessages = normalizeChatMessages(rawMessages)
|
|
106
110
|
const messages = fullMessages
|
|
107
111
|
const title = typeof result.title === 'string' ? result.title : undefined
|
|
108
112
|
const activeModal = normalizeChatTailActiveModal(result.activeModal)
|
|
113
|
+
const activeInteractivePrompt = (result as { activeInteractivePrompt?: unknown }).activeInteractivePrompt
|
|
114
|
+
const promptForUpdate = activeInteractivePrompt && typeof activeInteractivePrompt === 'object'
|
|
115
|
+
? activeInteractivePrompt as Record<string, unknown>
|
|
116
|
+
: null
|
|
109
117
|
const status = typeof result.status === 'string' ? result.status : 'idle'
|
|
118
|
+
// (A3) messageSource passthrough. v1 deliberately dropped this on the
|
|
119
|
+
// subscription wire so the frontend had to infer source from message
|
|
120
|
+
// count heuristics. The frontend now consumes ChatSourceMachine's
|
|
121
|
+
// decision (selected, lockState, fallbackReason, etc.) directly to
|
|
122
|
+
// render the source debug badge and SourceTimeline.
|
|
123
|
+
const messageSource = result.messageSource && typeof result.messageSource === 'object'
|
|
124
|
+
? result.messageSource as Record<string, unknown>
|
|
125
|
+
: undefined
|
|
110
126
|
const deliverySignature = buildChatTailDeliverySignature({
|
|
111
127
|
sessionId: input.sessionId,
|
|
112
128
|
...(input.historySessionId ? { historySessionId: input.historySessionId } : {}),
|
|
@@ -114,6 +130,7 @@ export function prepareSessionChatTailUpdate(
|
|
|
114
130
|
status,
|
|
115
131
|
...(title ? { title } : {}),
|
|
116
132
|
...(activeModal ? { activeModal } : {}),
|
|
133
|
+
...(promptForUpdate ? { activeInteractivePrompt: promptForUpdate } : {}),
|
|
117
134
|
})
|
|
118
135
|
const seq = input.seq + 1
|
|
119
136
|
|
|
@@ -142,6 +159,8 @@ export function prepareSessionChatTailUpdate(
|
|
|
142
159
|
status,
|
|
143
160
|
...(title ? { title } : {}),
|
|
144
161
|
...(activeModal ? { activeModal } : {}),
|
|
162
|
+
...(promptForUpdate ? { activeInteractivePrompt: promptForUpdate as any } : {}),
|
|
163
|
+
...(messageSource ? { messageSource } : {}),
|
|
145
164
|
},
|
|
146
165
|
}
|
|
147
166
|
}
|
|
@@ -36,7 +36,8 @@ export interface CliAdapter {
|
|
|
36
36
|
workingDir: string;
|
|
37
37
|
_acpInstance?: AcpAdapterHandle;
|
|
38
38
|
spawn(): Promise<void>;
|
|
39
|
-
sendMessage(text: string): Promise<void>;
|
|
39
|
+
sendMessage(text: string, options?: { force?: boolean; meshTaskId?: string }): Promise<void>;
|
|
40
|
+
forceSendMessage?(text: string, meshTaskId?: string): Promise<void>;
|
|
40
41
|
getStatus(): CliAdapterStatus;
|
|
41
42
|
getScriptParsedStatus?(): unknown;
|
|
42
43
|
invokeScript?(scriptName: string, args?: Record<string, unknown>): Promise<unknown>;
|
|
@@ -53,6 +54,7 @@ export interface CliAdapter {
|
|
|
53
54
|
clearHistory?(): void;
|
|
54
55
|
resolveAction?(data: unknown): Promise<void>;
|
|
55
56
|
resolveModal?(buttonIndex: number): void;
|
|
57
|
+
isApprovalRecentlyResolved?(): boolean;
|
|
56
58
|
setOnPtyData?(callback: (data: string) => void): void;
|
|
57
59
|
writeRaw?(data: string): void;
|
|
58
60
|
resize?(cols: number, rows: number): void;
|