@adhdev/daemon-core 0.9.82-rc.5 → 0.9.82-rc.500

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 (479) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +11 -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 +85 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +246 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +139 -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 +212 -11
  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 +132 -1
  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 +27 -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 +85 -0
  77. package/dist/git/git-types.d.ts +5 -43
  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 +74 -17
  81. package/dist/index.js +61082 -24164
  82. package/dist/index.js.map +1 -1
  83. package/dist/index.mjs +57034 -20299
  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 -37
  109. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  110. package/dist/mesh/mesh-host-ownership.d.ts +29 -0
  111. package/dist/mesh/mesh-idle-reminder.d.ts +68 -0
  112. package/dist/mesh/mesh-init.d.ts +128 -0
  113. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  114. package/dist/mesh/mesh-ledger.d.ts +139 -1
  115. package/dist/mesh/mesh-magi-status.d.ts +63 -0
  116. package/dist/mesh/mesh-missions.d.ts +281 -0
  117. package/dist/mesh/mesh-node-identity.d.ts +310 -0
  118. package/dist/mesh/mesh-queue-assignment.d.ts +162 -0
  119. package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
  120. package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
  121. package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
  122. package/dist/mesh/mesh-reconcile-loop.d.ts +84 -0
  123. package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
  124. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  125. package/dist/mesh/mesh-refine-gates.d.ts +457 -0
  126. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  127. package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
  128. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  129. package/dist/mesh/mesh-routing.d.ts +70 -0
  130. package/dist/mesh/mesh-runtime-store.d.ts +584 -0
  131. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  132. package/dist/mesh/mesh-task-inflight.d.ts +46 -0
  133. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  134. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +34 -0
  135. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  136. package/dist/mesh/mesh-work-queue.d.ts +403 -6
  137. package/dist/mesh/preview-freshness.d.ts +28 -0
  138. package/dist/mesh/refine-config.d.ts +216 -0
  139. package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
  140. package/dist/providers/acp-provider-instance.d.ts +5 -0
  141. package/dist/providers/approval-utils.d.ts +46 -0
  142. package/dist/providers/chat-message-normalization.d.ts +58 -0
  143. package/dist/providers/cli-provider-effect-format.d.ts +30 -0
  144. package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
  145. package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
  146. package/dist/providers/cli-provider-instance-types.d.ts +47 -0
  147. package/dist/providers/cli-provider-instance.d.ts +461 -30
  148. package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
  149. package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
  150. package/dist/providers/contracts.d.ts +196 -6
  151. package/dist/providers/external-sources.d.ts +71 -0
  152. package/dist/providers/manual-attendance.d.ts +79 -0
  153. package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
  154. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
  155. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  156. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  157. package/dist/providers/native-history/constants.d.ts +12 -0
  158. package/dist/providers/native-history/dispatcher.d.ts +44 -0
  159. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  160. package/dist/providers/native-history/index.d.ts +13 -0
  161. package/dist/providers/provider-instance-manager.d.ts +30 -0
  162. package/dist/providers/provider-instance.d.ts +31 -1
  163. package/dist/providers/provider-loader.d.ts +42 -5
  164. package/dist/providers/provider-trust.d.ts +31 -0
  165. package/dist/providers/read-chat-contract.d.ts +29 -0
  166. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  167. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  168. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  169. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  170. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  171. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  172. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  173. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  174. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  175. package/dist/providers/sdk/v1/index.d.ts +30 -0
  176. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  177. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  178. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  179. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  180. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  181. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  182. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  183. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  184. package/dist/providers/spec/adapter.d.ts +98 -0
  185. package/dist/providers/spec/background-task-detector.d.ts +29 -0
  186. package/dist/providers/spec/cli-adapter.d.ts +224 -0
  187. package/dist/providers/spec/evaluator.d.ts +45 -0
  188. package/dist/providers/spec/fsm-driver.d.ts +449 -0
  189. package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
  190. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  191. package/dist/providers/spec/fsm-types.d.ts +202 -0
  192. package/dist/providers/spec/native-history-executor.d.ts +50 -0
  193. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  194. package/dist/providers/spec/route.d.ts +4 -0
  195. package/dist/providers/spec/types.d.ts +244 -0
  196. package/dist/providers/status-monitor.d.ts +7 -7
  197. package/dist/providers/transcript-v2.d.ts +176 -0
  198. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  199. package/dist/providers/working-dir.d.ts +17 -0
  200. package/dist/repo-mesh-types.d.ts +778 -3
  201. package/dist/runtime-defaults.d.ts +2 -0
  202. package/dist/session-host/managed-host.d.ts +64 -0
  203. package/dist/session-host/runtime-surface.d.ts +10 -16
  204. package/dist/sessions/registry.d.ts +26 -0
  205. package/dist/shared-types-extra.d.ts +2 -4
  206. package/dist/shared-types.d.ts +110 -55
  207. package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
  208. package/dist/status/normalize.d.ts +1 -1
  209. package/dist/status/normalize.js +1 -0
  210. package/dist/status/normalize.js.map +1 -1
  211. package/dist/status/normalize.mjs +1 -0
  212. package/dist/status/normalize.mjs.map +1 -1
  213. package/dist/status/reporter.d.ts +2 -0
  214. package/dist/status/snapshot.d.ts +27 -0
  215. package/dist/system/hash.d.ts +8 -0
  216. package/dist/system/load-better-sqlite3.d.ts +21 -0
  217. package/dist/types.d.ts +20 -6
  218. package/package.json +11 -4
  219. package/src/agent-stream/poller.ts +2 -3
  220. package/src/agent-stream/provider-adapter.ts +1 -1
  221. package/src/boot/daemon-lifecycle.ts +83 -14
  222. package/src/boot/process-hardening.ts +89 -0
  223. package/src/build-info.ts +73 -0
  224. package/src/chat/source-machine.ts +534 -0
  225. package/src/chat/source-resolver.ts +0 -0
  226. package/src/chat/subscription-updates.ts +20 -1
  227. package/src/cli-adapter-types.d.ts +3 -1
  228. package/src/cli-adapter-types.ts +85 -2
  229. package/src/cli-adapters/cli-script-runner.ts +421 -0
  230. package/src/cli-adapters/cli-state-engine.ts +1379 -0
  231. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  232. package/src/cli-adapters/provider-cli-adapter.ts +1059 -1143
  233. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  234. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  235. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  236. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  237. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  238. package/src/cli-adapters/pty-transport.ts +2 -1
  239. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  240. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  241. package/src/cli-adapters/resolve-executable.ts +204 -0
  242. package/src/cli-adapters/session-host-transport.ts +2 -1
  243. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  244. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  245. package/src/cli-adapters/terminal-screen.ts +16 -81
  246. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  247. package/src/commands/chat-commands-read.ts +2788 -0
  248. package/src/commands/chat-commands-scope.ts +54 -0
  249. package/src/commands/chat-commands-shared.ts +114 -0
  250. package/src/commands/chat-commands-write.ts +891 -0
  251. package/src/commands/chat-commands.ts +19 -1841
  252. package/src/commands/cli-manager.d.ts +2 -0
  253. package/src/commands/cli-manager.ts +724 -27
  254. package/src/commands/handler.ts +865 -2
  255. package/src/commands/high-family/index.ts +28 -0
  256. package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
  257. package/src/commands/high-family/mesh-events.ts +102 -0
  258. package/src/commands/high-family/mesh-status.ts +857 -0
  259. package/src/commands/high-family/types.ts +80 -0
  260. package/src/commands/low-family/coordinator-prompt.ts +125 -0
  261. package/src/commands/low-family/daemon-lifecycle.ts +120 -0
  262. package/src/commands/low-family/diagnostics.ts +57 -0
  263. package/src/commands/low-family/index.ts +37 -0
  264. package/src/commands/low-family/mesh-ledger.ts +62 -0
  265. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  266. package/src/commands/low-family/notification.ts +116 -0
  267. package/src/commands/low-family/refine-config.ts +106 -0
  268. package/src/commands/low-family/session-host.ts +282 -0
  269. package/src/commands/low-family/spec-providerdev.ts +217 -0
  270. package/src/commands/low-family/status-meta.ts +112 -0
  271. package/src/commands/low-family/types.ts +39 -0
  272. package/src/commands/med-family/cli-agent.ts +270 -0
  273. package/src/commands/med-family/fast-forward.ts +230 -0
  274. package/src/commands/med-family/ide.ts +163 -0
  275. package/src/commands/med-family/index.ts +37 -0
  276. package/src/commands/med-family/mesh-crud.ts +1309 -0
  277. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  278. package/src/commands/med-family/mesh-queue.ts +167 -0
  279. package/src/commands/med-family/mesh-restart.ts +92 -0
  280. package/src/commands/med-family/types.ts +153 -0
  281. package/src/commands/mesh-coordinator.ts +334 -124
  282. package/src/commands/router-aggregate-status.ts +209 -0
  283. package/src/commands/router-mesh-session-owner.ts +114 -0
  284. package/src/commands/router-refine.ts +1794 -0
  285. package/src/commands/router-worktree-cleanup.ts +870 -0
  286. package/src/commands/router.ts +657 -2704
  287. package/src/commands/stream-commands.ts +8 -0
  288. package/src/commands/upgrade-helper.ts +310 -45
  289. package/src/config/chat-history.ts +517 -24
  290. package/src/config/config.ts +30 -0
  291. package/src/config/mesh-config.ts +542 -23
  292. package/src/config/mesh-json-config.ts +376 -0
  293. package/src/config/recent-activity.ts +8 -2
  294. package/src/config/registry-resolver.ts +100 -0
  295. package/src/config/repo-settings.ts +111 -0
  296. package/src/config/state-store.ts +55 -0
  297. package/src/daemon/dev-auto-implement.ts +3 -2
  298. package/src/daemon/dev-cli-debug.ts +10 -1
  299. package/src/daemon/dev-server.ts +0 -541
  300. package/src/detection/cli-detector.ts +94 -9
  301. package/src/detection/ide-detector.ts +55 -16
  302. package/src/detection/win32-ide-version.ts +106 -0
  303. package/src/git/change-impact-config.ts +354 -0
  304. package/src/git/git-commands.ts +113 -17
  305. package/src/git/git-diff.ts +81 -11
  306. package/src/git/git-executor.ts +12 -0
  307. package/src/git/git-status.ts +916 -51
  308. package/src/git/git-summary.ts +3 -0
  309. package/src/git/git-types.ts +17 -54
  310. package/src/git/git-worktree.ts +261 -4
  311. package/src/git/index.ts +17 -0
  312. package/src/index.ts +221 -13
  313. package/src/installer.d.ts +1 -1
  314. package/src/installer.ts +8 -6
  315. package/src/ipc/local-ipc-server.ts +278 -0
  316. package/src/launch.d.ts +1 -1
  317. package/src/launch.ts +37 -28
  318. package/src/logging/async-batch-writer.ts +55 -0
  319. package/src/logging/command-log.ts +7 -5
  320. package/src/logging/debug-config.ts +25 -0
  321. package/src/logging/debug-trace.ts +7 -2
  322. package/src/logging/log-redactor.ts +100 -0
  323. package/src/logging/log-tail-reader.ts +341 -0
  324. package/src/logging/logger.ts +14 -7
  325. package/src/mesh/contracts.ts +510 -0
  326. package/src/mesh/coordinator-prompt.ts +626 -34
  327. package/src/mesh/coordinator-registry.ts +121 -0
  328. package/src/mesh/mesh-active-work.ts +706 -0
  329. package/src/mesh/mesh-clone-grace.ts +68 -0
  330. package/src/mesh/mesh-completion-synthesis.ts +416 -0
  331. package/src/mesh/mesh-coordinator-config.ts +97 -0
  332. package/src/mesh/mesh-delivery-policy.ts +284 -0
  333. package/src/mesh/mesh-event-classify.ts +78 -0
  334. package/src/mesh/mesh-event-forwarding.ts +2042 -0
  335. package/src/mesh/mesh-event-trace.ts +67 -0
  336. package/src/mesh/mesh-events-coordinator.ts +32 -0
  337. package/src/mesh/mesh-events-pending.ts +1548 -0
  338. package/src/mesh/mesh-events-stale.ts +452 -0
  339. package/src/mesh/mesh-events-utils.ts +443 -0
  340. package/src/mesh/mesh-events.ts +43 -897
  341. package/src/mesh/mesh-fast-forward.ts +856 -0
  342. package/src/mesh/mesh-host-ownership.ts +111 -0
  343. package/src/mesh/mesh-idle-reminder.ts +153 -0
  344. package/src/mesh/mesh-init.ts +350 -0
  345. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  346. package/src/mesh/mesh-ledger.ts +898 -102
  347. package/src/mesh/mesh-magi-status.ts +223 -0
  348. package/src/mesh/mesh-missions.ts +695 -0
  349. package/src/mesh/mesh-node-identity.ts +2065 -0
  350. package/src/mesh/mesh-queue-assignment.ts +2498 -0
  351. package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
  352. package/src/mesh/mesh-reconcile-config.ts +66 -0
  353. package/src/mesh/mesh-reconcile-identity.ts +103 -0
  354. package/src/mesh/mesh-reconcile-loop.ts +1709 -0
  355. package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
  356. package/src/mesh/mesh-refine-batch.ts +205 -0
  357. package/src/mesh/mesh-refine-gates.ts +1792 -0
  358. package/src/mesh/mesh-refine-status.ts +231 -0
  359. package/src/mesh/mesh-remote-event-pull.ts +286 -0
  360. package/src/mesh/mesh-review-inbox.ts +308 -0
  361. package/src/mesh/mesh-routing.ts +291 -0
  362. package/src/mesh/mesh-runtime-store.ts +2318 -0
  363. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  364. package/src/mesh/mesh-task-inflight.ts +70 -0
  365. package/src/mesh/mesh-task-stats.ts +161 -0
  366. package/src/mesh/mesh-unresolved-forward-outbox.ts +215 -0
  367. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  368. package/src/mesh/mesh-work-queue.ts +1532 -161
  369. package/src/mesh/p2p-relay-failure.ts +2 -2
  370. package/src/mesh/preview-freshness.ts +163 -0
  371. package/src/mesh/refine-config.ts +423 -0
  372. package/src/mesh/worktree-bootstrap-config.ts +599 -0
  373. package/src/providers/acp-provider-instance.ts +43 -10
  374. package/src/providers/approval-utils.d.ts +5 -0
  375. package/src/providers/approval-utils.ts +100 -6
  376. package/src/providers/chat-message-normalization.ts +128 -4
  377. package/src/providers/cli-provider-effect-format.ts +53 -0
  378. package/src/providers/cli-provider-history-dedup.ts +75 -0
  379. package/src/providers/cli-provider-input-prompt.ts +133 -0
  380. package/src/providers/cli-provider-instance-types.ts +150 -0
  381. package/src/providers/cli-provider-instance.ts +2914 -498
  382. package/src/providers/cli-provider-status-helpers.ts +123 -0
  383. package/src/providers/cli-provider-transcript-merge.ts +114 -0
  384. package/src/providers/contracts.d.ts +55 -0
  385. package/src/providers/contracts.ts +207 -6
  386. package/src/providers/extension-provider-instance.ts +12 -7
  387. package/src/providers/external-sources.ts +218 -0
  388. package/src/providers/ide-provider-instance.ts +35 -12
  389. package/src/providers/manual-attendance.ts +105 -0
  390. package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
  391. package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
  392. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  393. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  394. package/src/providers/native-history/constants.ts +19 -0
  395. package/src/providers/native-history/dispatcher.ts +617 -0
  396. package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
  397. package/src/providers/native-history/index.ts +30 -0
  398. package/src/providers/provider-instance-manager.ts +71 -0
  399. package/src/providers/provider-instance.ts +24 -1
  400. package/src/providers/provider-loader.ts +700 -55
  401. package/src/providers/provider-schema.ts +93 -14
  402. package/src/providers/provider-trust.ts +114 -0
  403. package/src/providers/read-chat-contract.ts +76 -16
  404. package/src/providers/sdk/README.md +49 -0
  405. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  406. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  407. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  408. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
  409. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  410. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  411. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  412. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  413. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  414. package/src/providers/sdk/v1/index.ts +152 -0
  415. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  416. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  417. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  418. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +538 -0
  419. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  420. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  421. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  422. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  423. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  424. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  425. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  426. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  427. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  428. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  429. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  430. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  431. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  432. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  433. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  434. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  435. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  436. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  437. package/src/providers/sdk/v1/validators/index.ts +19 -0
  438. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  439. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  440. package/src/providers/spec/adapter.ts +246 -0
  441. package/src/providers/spec/background-task-detector.ts +178 -0
  442. package/src/providers/spec/cli-adapter.ts +1090 -0
  443. package/src/providers/spec/evaluator.ts +407 -0
  444. package/src/providers/spec/fsm-driver.ts +1528 -0
  445. package/src/providers/spec/fsm-evaluator.ts +290 -0
  446. package/src/providers/spec/fsm-loader.ts +128 -0
  447. package/src/providers/spec/fsm-types.ts +301 -0
  448. package/src/providers/spec/native-history-executor.ts +1256 -0
  449. package/src/providers/spec/pre-launch-trust.ts +104 -0
  450. package/src/providers/spec/route.ts +51 -0
  451. package/src/providers/spec/types.ts +284 -0
  452. package/src/providers/status-monitor.d.ts +7 -7
  453. package/src/providers/status-monitor.ts +37 -22
  454. package/src/providers/transcript-v2.ts +567 -0
  455. package/src/providers/types/interactive-prompt.ts +536 -0
  456. package/src/providers/version-archive.ts +64 -24
  457. package/src/providers/working-dir.ts +23 -0
  458. package/src/repo-mesh-types.ts +1040 -5
  459. package/src/runtime-defaults.ts +39 -0
  460. package/src/session-host/managed-host.ts +218 -0
  461. package/src/session-host/runtime-surface.ts +20 -80
  462. package/src/sessions/registry.ts +44 -0
  463. package/src/shared-types-extra.ts +2 -4
  464. package/src/shared-types.d.ts +8 -0
  465. package/src/shared-types.ts +148 -55
  466. package/src/status/builders.ts +69 -6
  467. package/src/status/chat-tail-hot-sessions.ts +117 -2
  468. package/src/status/normalize.ts +2 -0
  469. package/src/status/reporter.ts +19 -1
  470. package/src/status/snapshot.ts +100 -27
  471. package/src/system/hash.ts +23 -0
  472. package/src/system/host-memory.ts +29 -12
  473. package/src/system/load-better-sqlite3.ts +68 -0
  474. package/src/types.ts +26 -6
  475. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  476. package/dist/mesh/mesh-sync.d.ts +0 -53
  477. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  478. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  479. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,407 @@
1
+ /**
2
+ * Section + condition evaluator — pure functions shared by the v4 FSM engine.
3
+ *
4
+ * Provides: section resolution, condition evaluation (regex/changed/all/any),
5
+ * title/button extraction. The v4 FSM driver and evaluator import these
6
+ * directly; there is no v3 SpecDriver anymore.
7
+ */
8
+ 'use strict';
9
+
10
+ import type {
11
+ SectionDef, AnchorContext, Condition, RegexCondition,
12
+ ChangedCondition, AllCondition, AnyCondition,
13
+ ExtractTitle, ExtractButtons,
14
+ } from './types.js';
15
+
16
+ export interface ResolvedSection {
17
+ id: string;
18
+ fromLine: number; // inclusive
19
+ toLine: number; // exclusive
20
+ text: string;
21
+ }
22
+
23
+ export interface TraceEntry {
24
+ kind: 'section' | 'state_match' | 'state_skip' | 'modal' | 'control' | 'notification' | 'delegate';
25
+ text: string;
26
+ }
27
+
28
+ // ────────────────────────────────────────────────────────────────────────────
29
+ // Layout — sections{} object
30
+ // ────────────────────────────────────────────────────────────────────────────
31
+
32
+ function resolveSize(size: number | string | undefined, total: number): number {
33
+ if (size === undefined) return 0;
34
+ if (typeof size === 'number') return Math.max(0, Math.min(total, size));
35
+ const m = /^(\d+(?:\.\d+)?)%$/.exec(size);
36
+ if (!m) return 0;
37
+ const pct = Number(m[1]);
38
+ return Math.max(0, Math.min(total, Math.round((total * pct) / 100)));
39
+ }
40
+
41
+ export function resolveSections(
42
+ sectionsObj: Record<string, SectionDef>,
43
+ lines: string[],
44
+ ): ResolvedSection[] {
45
+ const total = lines.length;
46
+ const anchored = new Map<string, { fromLine: number; toLine: number }>();
47
+ const sectionEntries = Object.entries(sectionsObj);
48
+
49
+ for (const [id, sec] of sectionEntries) {
50
+ let from = 0;
51
+ let to = total;
52
+
53
+ if (sec.anchor !== undefined) {
54
+ try {
55
+ // Normalize anchor + context into parallel candidate lists. A
56
+ // scalar anchor becomes a single-entry array; a single context
57
+ // object applies to every entry; an array context is positional.
58
+ // Each candidate resolves its own anchor line independently
59
+ // (anchor_last → that candidate's LAST matching line, else its
60
+ // FIRST). Across candidates we then pick the TOPMOST resolved
61
+ // line, because a section's anchor marks the TOP of the block:
62
+ // among several recognized landmark shapes, the highest one
63
+ // bounds the whole block. This keeps a scalar anchor identical
64
+ // (one candidate), preserves a genuine box-top divider (it sits
65
+ // ABOVE the question line, so it still wins), and — crucially —
66
+ // stops a stray lower landmark from clipping the block: e.g. a
67
+ // claude approval whose numbered choices sit ABOVE the input-box
68
+ // `────` rule. anchor_last on the bare-divider pattern alone
69
+ // would latch that LOWER chrome rule and strand the buttons
70
+ // above it (deriveModal sees < min_count → auto-approve never
71
+ // fires); preferring the topmost landmark (here the question
72
+ // line just above the choices, matched by the fallback context)
73
+ // captures the whole modal. The fallback still only contributes
74
+ // when its own pattern matches, so non-modal screens are
75
+ // unaffected.
76
+ const anchorPatterns = Array.isArray(sec.anchor) ? sec.anchor : [sec.anchor];
77
+ const sharedCtx: AnchorContext | null = Array.isArray(sec.anchor_context)
78
+ ? null
79
+ : (sec.anchor_context ?? null);
80
+ const ctxList: (AnchorContext | null)[] = Array.isArray(sec.anchor_context)
81
+ ? sec.anchor_context
82
+ : anchorPatterns.map(() => sharedCtx);
83
+ const candidates = anchorPatterns.map((pattern, k) => {
84
+ const ctx = ctxList[k] ?? null;
85
+ return {
86
+ re: new RegExp(pattern, sec.anchor_flags ?? ''),
87
+ prevRe: ctx?.prev !== undefined
88
+ ? new RegExp(ctx.prev, ctx.prev_flags ?? '') : null,
89
+ nextRe: ctx?.next !== undefined
90
+ ? new RegExp(ctx.next, ctx.next_flags ?? '') : null,
91
+ };
92
+ });
93
+ const matchesCandidate = (c: typeof candidates[number], i: number) =>
94
+ c.re.test(lines[i])
95
+ && (c.prevRe === null || (i > 0 && c.prevRe.test(lines[i - 1])))
96
+ && (c.nextRe === null || (i < total - 1 && c.nextRe.test(lines[i + 1])));
97
+ let idx = -1;
98
+ for (const c of candidates) {
99
+ let candIdx = -1;
100
+ if (sec.anchor_last) {
101
+ for (let i = total - 1; i >= 0; i--) { if (matchesCandidate(c, i)) { candIdx = i; break; } }
102
+ } else {
103
+ for (let i = 0; i < total; i++) { if (matchesCandidate(c, i)) { candIdx = i; break; } }
104
+ }
105
+ // Topmost resolved anchor across candidates wins (see note
106
+ // above): keep the smallest matching line index.
107
+ if (candIdx !== -1 && (idx === -1 || candIdx < idx)) idx = candIdx;
108
+ }
109
+ if (idx !== -1) {
110
+ from = idx;
111
+ to = total;
112
+ if (sec.until_regex !== undefined) {
113
+ try {
114
+ const ure = new RegExp(sec.until_regex, sec.until_regex_flags ?? '');
115
+ const end = lines.findIndex((l, i) => i > idx && ure.test(l));
116
+ if (end !== -1) to = end;
117
+ } catch { /* bad until_regex */ }
118
+ } else if (sec.lines !== undefined) {
119
+ to = Math.min(total, from + sec.lines);
120
+ }
121
+ }
122
+ } catch { /* bad anchor regex */ }
123
+ } else if (sec.from_top !== undefined) {
124
+ from = resolveSize(sec.from_top, total);
125
+ to = total;
126
+ } else if (sec.from_bottom !== undefined) {
127
+ const sz = resolveSize(sec.from_bottom, total);
128
+ from = total - sz;
129
+ to = total;
130
+ }
131
+
132
+ anchored.set(id, { fromLine: from, toLine: to });
133
+ }
134
+
135
+ // Second pass: apply `until` references or `until` regex strings.
136
+ const resolved: ResolvedSection[] = [];
137
+ for (const [id, sec] of sectionEntries) {
138
+ let { fromLine, toLine } = anchored.get(id)!;
139
+
140
+ if (sec.until !== undefined) {
141
+ if (sec.until.startsWith('^')) {
142
+ try {
143
+ const ure = new RegExp(sec.until);
144
+ const end = lines.findIndex((l, i) => i > fromLine && ure.test(l));
145
+ if (end !== -1) toLine = end;
146
+ } catch { /* bad until regex */ }
147
+ } else {
148
+ const target = anchored.get(sec.until);
149
+ if (target) toLine = target.fromLine;
150
+ }
151
+ }
152
+
153
+ if (toLine < fromLine) toLine = fromLine;
154
+ const text = lines.slice(fromLine, toLine).join('\n');
155
+ resolved.push({ id, fromLine, toLine, text });
156
+ }
157
+
158
+ return resolved;
159
+ }
160
+
161
+ export function sectionText(sections: ResolvedSection[], sectionId: string | undefined, fullScreen: string): string {
162
+ if (!sectionId) return fullScreen;
163
+ const found = sections.find(s => s.id === sectionId);
164
+ return found ? found.text : '';
165
+ }
166
+
167
+ // ────────────────────────────────────────────────────────────────────────────
168
+ // Condition evaluation
169
+ // ────────────────────────────────────────────────────────────────────────────
170
+
171
+ function isRegexCondition(c: Condition): c is RegexCondition {
172
+ return 'matches' in c;
173
+ }
174
+
175
+ function isChangedCondition(c: Condition): c is ChangedCondition {
176
+ return 'cursor_above' in c && 'changed' in c;
177
+ }
178
+
179
+ function isAllCondition(c: Condition): c is AllCondition {
180
+ return 'all' in c;
181
+ }
182
+
183
+ function isAnyCondition(c: Condition): c is AnyCondition {
184
+ return 'any' in c;
185
+ }
186
+
187
+ export function evaluateCondition(
188
+ cond: Condition,
189
+ sections: ResolvedSection[],
190
+ fullScreen: string,
191
+ cursor: { row: number; col: number } | undefined,
192
+ prevLines: string[] | undefined,
193
+ trace: TraceEntry[],
194
+ stateId: string,
195
+ ): boolean {
196
+ if (isAllCondition(cond)) {
197
+ for (const child of cond.all) {
198
+ if (!evaluateCondition(child, sections, fullScreen, cursor, prevLines, trace, stateId)) {
199
+ return false;
200
+ }
201
+ }
202
+ return true;
203
+ }
204
+
205
+ if (isAnyCondition(cond)) {
206
+ for (const child of cond.any) {
207
+ if (evaluateCondition(child, sections, fullScreen, cursor, prevLines, trace, stateId)) {
208
+ return true;
209
+ }
210
+ }
211
+ return false;
212
+ }
213
+
214
+ if (isChangedCondition(cond)) {
215
+ if (!cursor || !prevLines || prevLines.length === 0) return false;
216
+ const curLines = fullScreen.split('\n');
217
+ const startRow = Math.max(0, cursor.row - cond.cursor_above);
218
+ const endRow = cursor.row;
219
+ const currentSlice = curLines.slice(startRow, endRow).join('\n');
220
+ const prevSlice = prevLines.slice(startRow, endRow).join('\n');
221
+ const didChange = currentSlice !== prevSlice;
222
+ const result = cond.changed ? didChange : !didChange;
223
+ const stableSuffix = cond.stable_ms != null ? ` stable_ms=${cond.stable_ms}` : '';
224
+ trace.push({
225
+ kind: result ? 'state_match' : 'state_skip',
226
+ text: `state[${stateId}] changed cond cursor_above=${cond.cursor_above} rows[${startRow},${endRow}) changed=${didChange} expected=${cond.changed}${stableSuffix} result=${result}`,
227
+ });
228
+ return result;
229
+ }
230
+
231
+ if (isRegexCondition(cond)) {
232
+ const haystack = sectionText(sections, cond.section, fullScreen);
233
+ let matched = false;
234
+ try {
235
+ const re = new RegExp(cond.matches, cond.flags ?? 'i');
236
+ matched = re.test(haystack);
237
+ } catch { matched = false; }
238
+
239
+ if (!matched) {
240
+ trace.push({ kind: 'state_skip', text: `state[${stateId}] regex cond ${cond.section ?? '*'}~/${cond.matches}/ no match` });
241
+ return false;
242
+ }
243
+
244
+ if (cursor !== undefined) {
245
+ if (cond.cursor_row_min !== undefined && cursor.row < cond.cursor_row_min) {
246
+ trace.push({ kind: 'state_skip', text: `state[${stateId}] cursor row ${cursor.row} < cursor_row_min ${cond.cursor_row_min}` });
247
+ return false;
248
+ }
249
+ if (cond.cursor_row_max !== undefined && cursor.row > cond.cursor_row_max) {
250
+ trace.push({ kind: 'state_skip', text: `state[${stateId}] cursor row ${cursor.row} > cursor_row_max ${cond.cursor_row_max}` });
251
+ return false;
252
+ }
253
+ if (cond.cursor_col_min !== undefined && cursor.col < cond.cursor_col_min) {
254
+ trace.push({ kind: 'state_skip', text: `state[${stateId}] cursor col ${cursor.col} < cursor_col_min ${cond.cursor_col_min}` });
255
+ return false;
256
+ }
257
+ if (cond.cursor_col_max !== undefined && cursor.col > cond.cursor_col_max) {
258
+ trace.push({ kind: 'state_skip', text: `state[${stateId}] cursor col ${cursor.col} > cursor_col_max ${cond.cursor_col_max}` });
259
+ return false;
260
+ }
261
+ }
262
+
263
+ trace.push({ kind: 'state_match', text: `state[${stateId}] regex cond ${cond.section ?? '*'}~/${cond.matches}/ matched${cursor !== undefined ? ` cursor=(${cursor.row},${cursor.col})` : ''}` });
264
+ return true;
265
+ }
266
+
267
+ return false;
268
+ }
269
+
270
+ // ────────────────────────────────────────────────────────────────────────────
271
+ // Extraction helpers (used by FsmDriver for modal/title)
272
+ // ────────────────────────────────────────────────────────────────────────────
273
+
274
+ export function extractTitle(
275
+ rule: ExtractTitle,
276
+ sections: ResolvedSection[],
277
+ fullScreen: string,
278
+ ): string | null {
279
+ const hay = sectionText(sections, rule.section, fullScreen);
280
+ if (!hay) return null;
281
+
282
+ if (rule.first_line) {
283
+ const lines = hay.split('\n');
284
+ for (const line of lines) {
285
+ const stripped = line.trim();
286
+ if (stripped && !/^[─╌═─\s]+$/.test(stripped)) {
287
+ return stripped;
288
+ }
289
+ }
290
+ return null;
291
+ }
292
+
293
+ if (rule.regex) {
294
+ try {
295
+ const re = new RegExp(rule.regex, rule.flags ?? 'i');
296
+ const m = re.exec(hay);
297
+ if (m) return (m[1] ?? m[0]).trim();
298
+ } catch { /* bad regex */ }
299
+ }
300
+
301
+ return null;
302
+ }
303
+
304
+ function compilePattern(ref: { pattern: string; flags?: string }): RegExp {
305
+ const flags = ref.flags ?? 'gm';
306
+ return new RegExp(ref.pattern, flags.includes('g') ? flags : flags + 'g');
307
+ }
308
+
309
+ function compileLinePattern(ref: { pattern: string; flags?: string }): RegExp {
310
+ const flags = (ref.flags ?? 'm').replace(/g/g, '');
311
+ return new RegExp(ref.pattern, flags);
312
+ }
313
+
314
+ export function extractButtonsFromRule(
315
+ rule: ExtractButtons,
316
+ hay: string,
317
+ ): { index: number; label: string; key: string; current: boolean }[] {
318
+ const keyTemplate = rule.key_for_index;
319
+ const continuationLines = rule.continuation_lines ?? false;
320
+ const buttons: { index: number; label: string; key: string; current: boolean }[] = [];
321
+
322
+ if (continuationLines) {
323
+ const re = compileLinePattern(rule);
324
+ const lines = hay.split('\n');
325
+ for (let i = 0; i < lines.length; i += 1) {
326
+ const m = re.exec(lines[i]);
327
+ if (!m) continue;
328
+ const idx = Number(m[1]);
329
+ let label = String(m[2] ?? '').trim();
330
+ if (!Number.isFinite(idx) || idx <= 0 || !label) continue;
331
+ const current = hasCursorMarker(lines[i]);
332
+ let j = i + 1;
333
+ while (j < lines.length) {
334
+ const next = lines[j];
335
+ if (!next.trim()) break;
336
+ if (re.test(next)) break;
337
+ if (!/^\s+/.test(next)) break;
338
+ label += ' ' + next.trim();
339
+ j += 1;
340
+ }
341
+ // No top-down de-dup here: a stray body "1." above the modal would
342
+ // otherwise claim the index and shadow the real choice. Collect
343
+ // every match in screen order and let lastContiguousNumberedBlock
344
+ // pick the bottom-most option block below.
345
+ const key = keyTemplate.replace(/\{index\}/g, String(idx));
346
+ buttons.push({ index: idx, label, key, current });
347
+ i = j - 1;
348
+ }
349
+ } else {
350
+ const re = compilePattern(rule);
351
+ let m: RegExpExecArray | null;
352
+ while ((m = re.exec(hay)) !== null) {
353
+ const idx = Number(m[1]);
354
+ const label = String(m[2] ?? '').trim();
355
+ if (!Number.isFinite(idx) || idx <= 0 || !label) continue;
356
+ const key = keyTemplate.replace(/\{index\}/g, String(idx));
357
+ // The matched text begins at the cursor marker (the pattern's
358
+ // optional `[❯›>]` prefix); flag this row as the cursor's current
359
+ // position so `select_mode: 'arrow_keys'` can step from it.
360
+ // Like the continuation path, no top-down de-dup — body numbered
361
+ // lines are filtered out by the bottom-block selection below.
362
+ buttons.push({ index: idx, label, key, current: hasCursorMarker(m[0]) });
363
+ }
364
+ }
365
+
366
+ // Buttons were collected in screen (top→bottom) order. The real choices are
367
+ // the bottom-most contiguous numbered block (the modal/picker always renders
368
+ // them last); reduce to that block so conversation-history numbered lists
369
+ // pulled into the modal section can never be mistaken for options.
370
+ const block = lastContiguousNumberedBlock(buttons);
371
+ block.sort((a, b) => a.index - b.index);
372
+ return block;
373
+ }
374
+
375
+ /**
376
+ * Reduce a top→bottom-ordered list of parsed numbered entries to only the
377
+ * bottom-most contiguous block — the run whose indices descend by exactly 1
378
+ * scanning upward from the last entry.
379
+ *
380
+ * Picker and approval choices always render as the LAST contiguous numbered
381
+ * block at the bottom of the modal section. The conversation history above can
382
+ * carry its own stray "1./2./3." numbered lists (and blockquote `>` lines), and
383
+ * because section anchoring can pull body lines into the modal section, a naive
384
+ * top-down scan would bind the low option indices to those body lines and drop
385
+ * the real choices (the dashboard would show, and an arrow-key picker would
386
+ * commit, the wrong row). Selecting the bottom block makes the on-screen picker
387
+ * win regardless of body content. Since pickers number their options 1..N
388
+ * contiguously and bodies use indices ≥ 1, the upward chain always breaks the
389
+ * moment it would need a "0." above the picker's "1." — so the picker block is
390
+ * isolated cleanly. Entries are assumed already in screen order; the returned
391
+ * slice keeps that order.
392
+ */
393
+ export function lastContiguousNumberedBlock<T extends { index: number }>(entries: T[]): T[] {
394
+ if (entries.length <= 1) return entries.slice();
395
+ let start = entries.length - 1;
396
+ for (let i = entries.length - 1; i > 0; i -= 1) {
397
+ if (entries[i - 1].index === entries[i].index - 1) start = i - 1;
398
+ else break;
399
+ }
400
+ return entries.slice(start);
401
+ }
402
+
403
+ /** True when a button line carries a TUI cursor marker (`❯`, `›`, `>`) before
404
+ * its number — i.e. the cursor currently sits on that row. */
405
+ function hasCursorMarker(text: string): boolean {
406
+ return /^\s*[❯›>]/.test(text);
407
+ }