@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.
Files changed (473) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +9 -0
  2. package/dist/boot/process-hardening.d.ts +50 -0
  3. package/dist/build-info.d.ts +37 -0
  4. package/dist/chat/source-machine.d.ts +166 -0
  5. package/dist/chat/source-resolver.d.ts +104 -0
  6. package/dist/chat/subscription-updates.d.ts +1 -0
  7. package/dist/cli-adapter-types.d.ts +68 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +220 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +137 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
  14. package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
  15. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  16. package/dist/cli-adapters/resolve-executable.d.ts +69 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  19. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  20. package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
  21. package/dist/commands/chat-commands-read.d.ts +23 -0
  22. package/dist/commands/chat-commands-scope.d.ts +39 -0
  23. package/dist/commands/chat-commands-shared.d.ts +33 -0
  24. package/dist/commands/chat-commands-write.d.ts +14 -0
  25. package/dist/commands/chat-commands.d.ts +10 -23
  26. package/dist/commands/cli-manager.d.ts +71 -1
  27. package/dist/commands/handler.d.ts +125 -0
  28. package/dist/commands/high-family/index.d.ts +3 -0
  29. package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
  30. package/dist/commands/high-family/mesh-events.d.ts +2 -0
  31. package/dist/commands/high-family/mesh-status.d.ts +2 -0
  32. package/dist/commands/high-family/types.d.ts +64 -0
  33. package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
  34. package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
  35. package/dist/commands/low-family/diagnostics.d.ts +2 -0
  36. package/dist/commands/low-family/index.d.ts +3 -0
  37. package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
  38. package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
  39. package/dist/commands/low-family/notification.d.ts +2 -0
  40. package/dist/commands/low-family/refine-config.d.ts +2 -0
  41. package/dist/commands/low-family/session-host.d.ts +2 -0
  42. package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
  43. package/dist/commands/low-family/status-meta.d.ts +2 -0
  44. package/dist/commands/low-family/types.d.ts +33 -0
  45. package/dist/commands/med-family/cli-agent.d.ts +2 -0
  46. package/dist/commands/med-family/fast-forward.d.ts +2 -0
  47. package/dist/commands/med-family/ide.d.ts +10 -0
  48. package/dist/commands/med-family/index.d.ts +3 -0
  49. package/dist/commands/med-family/mesh-crud.d.ts +48 -0
  50. package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
  51. package/dist/commands/med-family/mesh-queue.d.ts +2 -0
  52. package/dist/commands/med-family/mesh-restart.d.ts +2 -0
  53. package/dist/commands/med-family/types.d.ts +152 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router-aggregate-status.d.ts +24 -0
  56. package/dist/commands/router-mesh-session-owner.d.ts +59 -0
  57. package/dist/commands/router-refine.d.ts +151 -0
  58. package/dist/commands/router-worktree-cleanup.d.ts +133 -0
  59. package/dist/commands/router.d.ts +203 -15
  60. package/dist/commands/upgrade-helper.d.ts +41 -1
  61. package/dist/config/chat-history.d.ts +11 -0
  62. package/dist/config/config.d.ts +19 -0
  63. package/dist/config/mesh-config.d.ts +65 -0
  64. package/dist/config/mesh-json-config.d.ts +199 -0
  65. package/dist/config/registry-resolver.d.ts +54 -0
  66. package/dist/config/repo-settings.d.ts +77 -0
  67. package/dist/config/state-store.d.ts +30 -0
  68. package/dist/daemon/dev-server.d.ts +0 -2
  69. package/dist/detection/cli-detector.d.ts +17 -0
  70. package/dist/detection/ide-detector.d.ts +13 -0
  71. package/dist/detection/win32-ide-version.d.ts +37 -0
  72. package/dist/git/change-impact-config.d.ts +159 -0
  73. package/dist/git/git-commands.d.ts +26 -2
  74. package/dist/git/git-diff.d.ts +6 -0
  75. package/dist/git/git-executor.d.ts +11 -0
  76. package/dist/git/git-status.d.ts +80 -0
  77. package/dist/git/git-types.d.ts +2 -50
  78. package/dist/git/git-worktree.d.ts +71 -1
  79. package/dist/git/index.d.ts +3 -1
  80. package/dist/index.d.ts +70 -17
  81. package/dist/index.js +53532 -19073
  82. package/dist/index.js.map +1 -1
  83. package/dist/index.mjs +53283 -18989
  84. package/dist/index.mjs.map +1 -1
  85. package/dist/installer.d.ts +1 -4
  86. package/dist/ipc/local-ipc-server.d.ts +91 -0
  87. package/dist/launch.d.ts +1 -1
  88. package/dist/logging/async-batch-writer.d.ts +10 -0
  89. package/dist/logging/debug-config.d.ts +16 -0
  90. package/dist/logging/log-redactor.d.ts +24 -0
  91. package/dist/logging/log-tail-reader.d.ts +81 -0
  92. package/dist/logging/logger.d.ts +1 -1
  93. package/dist/mesh/contracts.d.ts +256 -0
  94. package/dist/mesh/coordinator-prompt.d.ts +76 -0
  95. package/dist/mesh/coordinator-registry.d.ts +59 -0
  96. package/dist/mesh/mesh-active-work.d.ts +203 -0
  97. package/dist/mesh/mesh-clone-grace.d.ts +8 -0
  98. package/dist/mesh/mesh-completion-synthesis.d.ts +4 -0
  99. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  100. package/dist/mesh/mesh-delivery-policy.d.ts +104 -0
  101. package/dist/mesh/mesh-event-classify.d.ts +7 -0
  102. package/dist/mesh/mesh-event-forwarding.d.ts +58 -0
  103. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  104. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  105. package/dist/mesh/mesh-events-pending.d.ts +258 -0
  106. package/dist/mesh/mesh-events-stale.d.ts +61 -0
  107. package/dist/mesh/mesh-events-utils.d.ts +75 -0
  108. package/dist/mesh/mesh-events.d.ts +6 -49
  109. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  110. package/dist/mesh/mesh-host-ownership.d.ts +21 -1
  111. package/dist/mesh/mesh-init.d.ts +128 -0
  112. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  113. package/dist/mesh/mesh-ledger.d.ts +139 -1
  114. package/dist/mesh/mesh-magi-status.d.ts +63 -0
  115. package/dist/mesh/mesh-missions.d.ts +281 -0
  116. package/dist/mesh/mesh-node-identity.d.ts +310 -0
  117. package/dist/mesh/mesh-queue-assignment.d.ts +162 -0
  118. package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
  119. package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
  120. package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
  121. package/dist/mesh/mesh-reconcile-loop.d.ts +84 -0
  122. package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
  123. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  124. package/dist/mesh/mesh-refine-gates.d.ts +457 -0
  125. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  126. package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
  127. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  128. package/dist/mesh/mesh-routing.d.ts +70 -0
  129. package/dist/mesh/mesh-runtime-store.d.ts +567 -0
  130. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  131. package/dist/mesh/mesh-task-inflight.d.ts +46 -0
  132. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  133. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +34 -0
  134. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  135. package/dist/mesh/mesh-work-queue.d.ts +392 -1
  136. package/dist/mesh/preview-freshness.d.ts +28 -0
  137. package/dist/mesh/refine-config.d.ts +97 -0
  138. package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
  139. package/dist/providers/acp-provider-instance.d.ts +5 -0
  140. package/dist/providers/approval-utils.d.ts +46 -0
  141. package/dist/providers/chat-message-normalization.d.ts +58 -1
  142. package/dist/providers/cli-provider-effect-format.d.ts +30 -0
  143. package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
  144. package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
  145. package/dist/providers/cli-provider-instance-types.d.ts +45 -0
  146. package/dist/providers/cli-provider-instance.d.ts +426 -30
  147. package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
  148. package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
  149. package/dist/providers/contracts.d.ts +196 -6
  150. package/dist/providers/external-sources.d.ts +71 -0
  151. package/dist/providers/manual-attendance.d.ts +79 -0
  152. package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
  153. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
  154. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  155. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  156. package/dist/providers/native-history/constants.d.ts +12 -0
  157. package/dist/providers/native-history/dispatcher.d.ts +44 -0
  158. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  159. package/dist/providers/native-history/index.d.ts +13 -0
  160. package/dist/providers/provider-instance-manager.d.ts +30 -0
  161. package/dist/providers/provider-instance.d.ts +31 -1
  162. package/dist/providers/provider-loader.d.ts +42 -5
  163. package/dist/providers/provider-trust.d.ts +31 -0
  164. package/dist/providers/read-chat-contract.d.ts +29 -0
  165. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  166. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  167. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  168. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  169. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  170. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  171. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  172. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  173. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  174. package/dist/providers/sdk/v1/index.d.ts +30 -0
  175. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  176. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  177. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  178. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  179. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  180. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  181. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  182. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  183. package/dist/providers/spec/adapter.d.ts +98 -0
  184. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  185. package/dist/providers/spec/evaluator.d.ts +45 -0
  186. package/dist/providers/spec/fsm-driver.d.ts +449 -0
  187. package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
  188. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  189. package/dist/providers/spec/fsm-types.d.ts +202 -0
  190. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  191. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  192. package/dist/providers/spec/route.d.ts +4 -0
  193. package/dist/providers/spec/types.d.ts +244 -0
  194. package/dist/providers/status-monitor.d.ts +7 -7
  195. package/dist/providers/transcript-v2.d.ts +176 -0
  196. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  197. package/dist/providers/working-dir.d.ts +17 -0
  198. package/dist/repo-mesh-types.d.ts +616 -12
  199. package/dist/runtime-defaults.d.ts +2 -0
  200. package/dist/session-host/managed-host.d.ts +64 -0
  201. package/dist/session-host/runtime-surface.d.ts +10 -16
  202. package/dist/sessions/registry.d.ts +26 -0
  203. package/dist/shared-types-extra.d.ts +2 -4
  204. package/dist/shared-types.d.ts +110 -55
  205. package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
  206. package/dist/status/normalize.d.ts +1 -1
  207. package/dist/status/normalize.js +1 -0
  208. package/dist/status/normalize.js.map +1 -1
  209. package/dist/status/normalize.mjs +1 -0
  210. package/dist/status/normalize.mjs.map +1 -1
  211. package/dist/status/reporter.d.ts +2 -0
  212. package/dist/status/snapshot.d.ts +27 -0
  213. package/dist/system/hash.d.ts +8 -0
  214. package/dist/system/load-better-sqlite3.d.ts +21 -0
  215. package/dist/types.d.ts +20 -6
  216. package/package.json +11 -4
  217. package/src/agent-stream/poller.ts +2 -3
  218. package/src/agent-stream/provider-adapter.ts +1 -1
  219. package/src/boot/daemon-lifecycle.ts +80 -14
  220. package/src/boot/process-hardening.ts +89 -0
  221. package/src/build-info.ts +73 -0
  222. package/src/chat/source-machine.ts +534 -0
  223. package/src/chat/source-resolver.ts +0 -0
  224. package/src/chat/subscription-updates.ts +20 -1
  225. package/src/cli-adapter-types.d.ts +3 -1
  226. package/src/cli-adapter-types.ts +68 -2
  227. package/src/cli-adapters/cli-script-runner.ts +421 -0
  228. package/src/cli-adapters/cli-state-engine.ts +1282 -0
  229. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  230. package/src/cli-adapters/provider-cli-adapter.ts +1048 -1143
  231. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  232. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  233. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  234. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  235. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  236. package/src/cli-adapters/pty-transport.ts +2 -1
  237. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  238. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  239. package/src/cli-adapters/resolve-executable.ts +204 -0
  240. package/src/cli-adapters/session-host-transport.ts +2 -1
  241. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  242. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  243. package/src/cli-adapters/terminal-screen.ts +16 -81
  244. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  245. package/src/commands/chat-commands-read.ts +2788 -0
  246. package/src/commands/chat-commands-scope.ts +54 -0
  247. package/src/commands/chat-commands-shared.ts +114 -0
  248. package/src/commands/chat-commands-write.ts +891 -0
  249. package/src/commands/chat-commands.ts +19 -1841
  250. package/src/commands/cli-manager.d.ts +2 -0
  251. package/src/commands/cli-manager.ts +724 -27
  252. package/src/commands/handler.ts +865 -2
  253. package/src/commands/high-family/index.ts +28 -0
  254. package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
  255. package/src/commands/high-family/mesh-events.ts +102 -0
  256. package/src/commands/high-family/mesh-status.ts +857 -0
  257. package/src/commands/high-family/types.ts +80 -0
  258. package/src/commands/low-family/coordinator-prompt.ts +125 -0
  259. package/src/commands/low-family/daemon-lifecycle.ts +120 -0
  260. package/src/commands/low-family/diagnostics.ts +57 -0
  261. package/src/commands/low-family/index.ts +37 -0
  262. package/src/commands/low-family/mesh-ledger.ts +62 -0
  263. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  264. package/src/commands/low-family/notification.ts +116 -0
  265. package/src/commands/low-family/refine-config.ts +106 -0
  266. package/src/commands/low-family/session-host.ts +282 -0
  267. package/src/commands/low-family/spec-providerdev.ts +217 -0
  268. package/src/commands/low-family/status-meta.ts +112 -0
  269. package/src/commands/low-family/types.ts +39 -0
  270. package/src/commands/med-family/cli-agent.ts +270 -0
  271. package/src/commands/med-family/fast-forward.ts +230 -0
  272. package/src/commands/med-family/ide.ts +163 -0
  273. package/src/commands/med-family/index.ts +37 -0
  274. package/src/commands/med-family/mesh-crud.ts +1268 -0
  275. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  276. package/src/commands/med-family/mesh-queue.ts +167 -0
  277. package/src/commands/med-family/mesh-restart.ts +92 -0
  278. package/src/commands/med-family/types.ts +153 -0
  279. package/src/commands/mesh-coordinator.ts +334 -124
  280. package/src/commands/router-aggregate-status.ts +209 -0
  281. package/src/commands/router-mesh-session-owner.ts +114 -0
  282. package/src/commands/router-refine.ts +1794 -0
  283. package/src/commands/router-worktree-cleanup.ts +870 -0
  284. package/src/commands/router.ts +567 -4149
  285. package/src/commands/stream-commands.ts +8 -0
  286. package/src/commands/upgrade-helper.ts +310 -45
  287. package/src/config/chat-history.ts +517 -24
  288. package/src/config/config.ts +30 -0
  289. package/src/config/mesh-config.ts +300 -24
  290. package/src/config/mesh-json-config.ts +376 -0
  291. package/src/config/recent-activity.ts +8 -2
  292. package/src/config/registry-resolver.ts +100 -0
  293. package/src/config/repo-settings.ts +111 -0
  294. package/src/config/state-store.ts +55 -0
  295. package/src/daemon/dev-auto-implement.ts +3 -2
  296. package/src/daemon/dev-cli-debug.ts +10 -1
  297. package/src/daemon/dev-server.ts +0 -541
  298. package/src/detection/cli-detector.ts +94 -9
  299. package/src/detection/ide-detector.ts +55 -16
  300. package/src/detection/win32-ide-version.ts +106 -0
  301. package/src/git/change-impact-config.ts +354 -0
  302. package/src/git/git-commands.ts +112 -16
  303. package/src/git/git-diff.ts +81 -11
  304. package/src/git/git-executor.ts +12 -0
  305. package/src/git/git-status.ts +822 -48
  306. package/src/git/git-types.ts +14 -62
  307. package/src/git/git-worktree.ts +261 -4
  308. package/src/git/index.ts +17 -0
  309. package/src/index.ts +190 -13
  310. package/src/installer.d.ts +1 -1
  311. package/src/installer.ts +8 -6
  312. package/src/ipc/local-ipc-server.ts +278 -0
  313. package/src/launch.d.ts +1 -1
  314. package/src/launch.ts +37 -28
  315. package/src/logging/async-batch-writer.ts +55 -0
  316. package/src/logging/command-log.ts +7 -5
  317. package/src/logging/debug-config.ts +25 -0
  318. package/src/logging/debug-trace.ts +7 -2
  319. package/src/logging/log-redactor.ts +100 -0
  320. package/src/logging/log-tail-reader.ts +341 -0
  321. package/src/logging/logger.ts +14 -7
  322. package/src/mesh/contracts.ts +510 -0
  323. package/src/mesh/coordinator-prompt.ts +627 -34
  324. package/src/mesh/coordinator-registry.ts +121 -0
  325. package/src/mesh/mesh-active-work.ts +706 -0
  326. package/src/mesh/mesh-clone-grace.ts +68 -0
  327. package/src/mesh/mesh-completion-synthesis.ts +416 -0
  328. package/src/mesh/mesh-coordinator-config.ts +97 -0
  329. package/src/mesh/mesh-delivery-policy.ts +284 -0
  330. package/src/mesh/mesh-event-classify.ts +78 -0
  331. package/src/mesh/mesh-event-forwarding.ts +2030 -0
  332. package/src/mesh/mesh-event-trace.ts +67 -0
  333. package/src/mesh/mesh-events-coordinator.ts +32 -0
  334. package/src/mesh/mesh-events-pending.ts +1548 -0
  335. package/src/mesh/mesh-events-stale.ts +452 -0
  336. package/src/mesh/mesh-events-utils.ts +443 -0
  337. package/src/mesh/mesh-events.ts +43 -1035
  338. package/src/mesh/mesh-fast-forward.ts +856 -0
  339. package/src/mesh/mesh-host-ownership.ts +41 -3
  340. package/src/mesh/mesh-init.ts +350 -0
  341. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  342. package/src/mesh/mesh-ledger.ts +897 -102
  343. package/src/mesh/mesh-magi-status.ts +223 -0
  344. package/src/mesh/mesh-missions.ts +695 -0
  345. package/src/mesh/mesh-node-identity.ts +2065 -0
  346. package/src/mesh/mesh-queue-assignment.ts +2498 -0
  347. package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
  348. package/src/mesh/mesh-reconcile-config.ts +66 -0
  349. package/src/mesh/mesh-reconcile-identity.ts +103 -0
  350. package/src/mesh/mesh-reconcile-loop.ts +1696 -0
  351. package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
  352. package/src/mesh/mesh-refine-batch.ts +205 -0
  353. package/src/mesh/mesh-refine-gates.ts +1792 -0
  354. package/src/mesh/mesh-refine-status.ts +231 -0
  355. package/src/mesh/mesh-remote-event-pull.ts +279 -0
  356. package/src/mesh/mesh-review-inbox.ts +308 -0
  357. package/src/mesh/mesh-routing.ts +291 -0
  358. package/src/mesh/mesh-runtime-store.ts +2292 -0
  359. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  360. package/src/mesh/mesh-task-inflight.ts +70 -0
  361. package/src/mesh/mesh-task-stats.ts +161 -0
  362. package/src/mesh/mesh-unresolved-forward-outbox.ts +215 -0
  363. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  364. package/src/mesh/mesh-work-queue.ts +1489 -145
  365. package/src/mesh/preview-freshness.ts +163 -0
  366. package/src/mesh/refine-config.ts +129 -12
  367. package/src/mesh/worktree-bootstrap-config.ts +599 -0
  368. package/src/providers/acp-provider-instance.ts +43 -10
  369. package/src/providers/approval-utils.d.ts +5 -0
  370. package/src/providers/approval-utils.ts +100 -6
  371. package/src/providers/chat-message-normalization.ts +126 -4
  372. package/src/providers/cli-provider-effect-format.ts +53 -0
  373. package/src/providers/cli-provider-history-dedup.ts +75 -0
  374. package/src/providers/cli-provider-input-prompt.ts +133 -0
  375. package/src/providers/cli-provider-instance-types.ts +131 -0
  376. package/src/providers/cli-provider-instance.ts +2771 -499
  377. package/src/providers/cli-provider-status-helpers.ts +123 -0
  378. package/src/providers/cli-provider-transcript-merge.ts +114 -0
  379. package/src/providers/contracts.d.ts +55 -0
  380. package/src/providers/contracts.ts +207 -6
  381. package/src/providers/extension-provider-instance.ts +12 -7
  382. package/src/providers/external-sources.ts +218 -0
  383. package/src/providers/ide-provider-instance.ts +35 -12
  384. package/src/providers/manual-attendance.ts +105 -0
  385. package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
  386. package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
  387. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  388. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  389. package/src/providers/native-history/constants.ts +19 -0
  390. package/src/providers/native-history/dispatcher.ts +617 -0
  391. package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
  392. package/src/providers/native-history/index.ts +30 -0
  393. package/src/providers/provider-instance-manager.ts +71 -0
  394. package/src/providers/provider-instance.ts +24 -1
  395. package/src/providers/provider-loader.ts +700 -55
  396. package/src/providers/provider-schema.ts +93 -14
  397. package/src/providers/provider-trust.ts +114 -0
  398. package/src/providers/read-chat-contract.ts +76 -16
  399. package/src/providers/sdk/README.md +49 -0
  400. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  401. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  402. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  403. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
  404. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  405. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  406. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  407. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  408. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  409. package/src/providers/sdk/v1/index.ts +152 -0
  410. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  411. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  412. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  413. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +538 -0
  414. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  415. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  416. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  417. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  418. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  419. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  420. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  421. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  422. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  423. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  424. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  425. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  426. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  427. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  428. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  429. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  430. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  431. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  432. package/src/providers/sdk/v1/validators/index.ts +19 -0
  433. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  434. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  435. package/src/providers/spec/adapter.ts +246 -0
  436. package/src/providers/spec/cli-adapter.ts +1064 -0
  437. package/src/providers/spec/evaluator.ts +407 -0
  438. package/src/providers/spec/fsm-driver.ts +1528 -0
  439. package/src/providers/spec/fsm-evaluator.ts +290 -0
  440. package/src/providers/spec/fsm-loader.ts +128 -0
  441. package/src/providers/spec/fsm-types.ts +301 -0
  442. package/src/providers/spec/native-history-executor.ts +1241 -0
  443. package/src/providers/spec/pre-launch-trust.ts +104 -0
  444. package/src/providers/spec/route.ts +51 -0
  445. package/src/providers/spec/types.ts +284 -0
  446. package/src/providers/status-monitor.d.ts +7 -7
  447. package/src/providers/status-monitor.ts +37 -22
  448. package/src/providers/transcript-v2.ts +567 -0
  449. package/src/providers/types/interactive-prompt.ts +536 -0
  450. package/src/providers/version-archive.ts +64 -24
  451. package/src/providers/working-dir.ts +23 -0
  452. package/src/repo-mesh-types.ts +861 -14
  453. package/src/runtime-defaults.ts +39 -0
  454. package/src/session-host/managed-host.ts +218 -0
  455. package/src/session-host/runtime-surface.ts +20 -80
  456. package/src/sessions/registry.ts +44 -0
  457. package/src/shared-types-extra.ts +2 -4
  458. package/src/shared-types.d.ts +8 -0
  459. package/src/shared-types.ts +148 -55
  460. package/src/status/builders.ts +69 -6
  461. package/src/status/chat-tail-hot-sessions.ts +117 -2
  462. package/src/status/normalize.ts +2 -0
  463. package/src/status/reporter.ts +19 -1
  464. package/src/status/snapshot.ts +100 -27
  465. package/src/system/hash.ts +23 -0
  466. package/src/system/host-memory.ts +29 -12
  467. package/src/system/load-better-sqlite3.ts +68 -0
  468. package/src/types.ts +26 -6
  469. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  470. package/dist/mesh/mesh-sync.d.ts +0 -53
  471. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  472. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  473. 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 fullMessages = normalizeChatMessages(Array.isArray(result.messages) ? result.messages as any[] : [])
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;