@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
@@ -5,14 +5,41 @@
5
5
  */
6
6
 
7
7
  import type { ChatMessage } from './types.js';
8
+ import type { InteractivePrompt, InteractivePromptResponse } from './providers/types/interactive-prompt.js';
8
9
 
9
10
  export interface CliAdapterStatus {
10
11
  status?: string;
12
+ parsedStatus?: string;
11
13
  messages?: ChatMessage[];
12
14
  activeModal?: {
13
15
  message: string;
14
16
  buttons: string[];
17
+ /**
18
+ * Semantic modal class, when the adapter knows it (spec/FSM path):
19
+ * 'approval' = tool/command/trust consent (auto-approve may fire);
20
+ * 'picker' = a selection menu the user opened (/model, /mode — must NOT
21
+ * be auto-answered); 'confirm' = a yes/no left to the user. Absent/null
22
+ * for adapters that don't classify modals — the auto-approve gate then
23
+ * falls back to its structural heuristic.
24
+ */
25
+ kind?: 'approval' | 'picker' | 'confirm' | null;
15
26
  } | null;
27
+ activeInteractivePrompt?: InteractivePrompt | null;
28
+ providerSessionId?: string;
29
+ errorMessage?: string;
30
+ errorReason?: string;
31
+ /**
32
+ * FSM-spec adapters only: true once the driver has observed its first
33
+ * non-initial idle state (the prompt is genuinely drawn — see
34
+ * FsmDriver.maybeMarkReady / readySeenOnce). Used by CliProviderInstance to
35
+ * re-arm the queue-claim `agent:ready` event on the first genuine ready,
36
+ * independent of the boot-time starting→idle one-shot. That one-shot is
37
+ * consumed too early for providers whose INITIAL FSM state already reports
38
+ * status 'idle' (e.g. antigravity-cli), so without this re-arm the worker
39
+ * never claims its queued task and the coordinator relaunch-loops. Absent
40
+ * (undefined) for non-FSM adapters — they keep the boot one-shot behavior.
41
+ */
42
+ fsmReadySeen?: boolean;
16
43
  }
17
44
 
18
45
  export interface AcpAdapterHandle {
@@ -32,14 +59,38 @@ export interface AcpAdapterHandle {
32
59
  resolvePermission?(approved: boolean): Promise<void>;
33
60
  }
34
61
 
62
+ /**
63
+ * Launch metadata for a CLI session, surfaced by the dashboard Session info panel.
64
+ * Derived from the live adapter's spawn plan — the resolved binary, the full
65
+ * argument vector (provider base args + per-launch extra args), the cwd, and the
66
+ * set of per-launch extra-env KEYS (values are intentionally omitted so secrets in
67
+ * extraEnv are never sent to the dashboard). providerSessionId is the upstream
68
+ * agent's own session id once the CLI reports it.
69
+ */
70
+ export interface CliLaunchInfo {
71
+ /** Resolved executable path the PTY actually spawns. */
72
+ command?: string;
73
+ /** Full argument vector (provider spawn.args + extraArgs, {{workingDir}} expanded). */
74
+ args: string[];
75
+ /** Per-launch extra args only (subset of args), for attribution. */
76
+ extraArgs: string[];
77
+ /** Working directory the session was spawned in. */
78
+ cwd: string;
79
+ /** KEYS of per-launch extra env (values omitted — may contain secrets). */
80
+ extraEnvKeys: string[];
81
+ /** Upstream agent session id, once the CLI reports one. */
82
+ providerSessionId?: string;
83
+ }
84
+
35
85
  export interface CliAdapter {
36
86
  cliType: string;
37
87
  cliName: string;
38
88
  workingDir: string;
39
89
  _acpInstance?: AcpAdapterHandle;
40
90
  spawn(): Promise<void>;
41
- sendMessage(text: string): Promise<void>;
42
- getStatus(): CliAdapterStatus;
91
+ sendMessage(text: string, options?: { force?: boolean; meshTaskId?: string }): Promise<void>;
92
+ forceSendMessage?(text: string, meshTaskId?: string): Promise<void>;
93
+ getStatus(options?: { allowParse?: boolean }): CliAdapterStatus;
43
94
  getScriptParsedStatus?(): unknown;
44
95
  getDebugSnapshot?(): unknown;
45
96
  invokeScript?(scriptName: string, args?: Record<string, unknown>): Promise<unknown>;
@@ -56,9 +107,24 @@ export interface CliAdapter {
56
107
  setServerConn?(serverConn: unknown): void;
57
108
  clearHistory?(): void;
58
109
  resolveAction?(data: unknown): Promise<void>;
110
+ setInteractivePromptResponse?(response: InteractivePromptResponse): Promise<void>;
59
111
  resolveModal?(buttonIndex: number): void;
112
+ isApprovalRecentlyResolved?(): boolean;
60
113
  // Raw PTY I/O (for terminal view)
61
114
  setOnPtyData?(callback: (data: string) => void): void;
62
115
  writeRaw?(data: string): void;
63
116
  resize?(cols: number, rows: number): void;
117
+ // ── Launch metadata for the dashboard Session info panel (args/cwd/env keys) ──
118
+ getLaunchInfo?(): CliLaunchInfo;
119
+ // ── Runtime metadata used by CliProviderInstance for session tracking ──
120
+ getRuntimeMetadata?(): unknown;
121
+ updateRuntimeMeta?(meta: Record<string, unknown>): void;
122
+ refreshProviderDefinition?(provider: unknown): void;
123
+ // ── Optional auxiliary fields some daemon paths read off the status ──
124
+ }
125
+
126
+ export interface CliAdapterStatusOptional {
127
+ providerSessionId?: string;
128
+ errorMessage?: string;
129
+ errorReason?: string;
64
130
  }
@@ -0,0 +1,421 @@
1
+ /**
2
+ * CliScriptRunner — isolated execution of provider CLI scripts
3
+ *
4
+ * Responsible solely for invoking provider-supplied JavaScript functions
5
+ * (detectStatus, parseApproval, parseSession, etc.) and managing the
6
+ * per-session script state created by createState().
7
+ *
8
+ * The runner is stateless with respect to PTY / buffer content — all
9
+ * input data is passed explicitly by the caller so that the adapter can
10
+ * remain a pure transport layer without embedding parsing logic.
11
+ */
12
+
13
+ import { LOG } from '../logging/logger.js';
14
+ import {
15
+ listCliScriptNames,
16
+ type CliApprovalInput,
17
+ type CliScripts,
18
+ type CliScriptInput,
19
+ type CliScreenSnapshot,
20
+ type CliStatusInput,
21
+ type ParsedSession,
22
+ } from './provider-cli-shared.js';
23
+ import { buildDetectStatusFromTui } from '../providers/sdk/v1/builders/cli/detect-status.js';
24
+ import { buildParseApprovalFromTui } from '../providers/sdk/v1/builders/cli/parse-approval.js';
25
+ import { buildParseSessionFromTui, normalizeMessageIdentity } from '../providers/sdk/v1/builders/cli/parse-session.js';
26
+
27
+ /**
28
+ * Capability bag injected into provider scripts as the third argument.
29
+ *
30
+ * v1 manifests declare line-shape recognition in their `tui` block — for
31
+ * those providers, the daemon builds the canonical (input → verdict)
32
+ * functions from the manifest and hands them to the script via `sdk`. The
33
+ * script's job is then only to wrap that verdict with stateful logic
34
+ * (idle-hold timers, frame counting, etc.) that can't be expressed
35
+ * declaratively.
36
+ *
37
+ * Without these, the extended-tier overrides bail with `return 'idle'`
38
+ * and the session sticks in generating forever. That's the regression
39
+ * we hit on codex-cli during the registry-install path.
40
+ */
41
+ interface CliScriptSdk {
42
+ declarativeDetectStatus?: (input: CliStatusInput) => string | null;
43
+ declarativeParseApproval?: (input: CliApprovalInput) => { message: string; buttons: string[] } | null;
44
+ }
45
+
46
+ /**
47
+ * One entry per script invocation, kept in a ring buffer so debug
48
+ * tooling can answer "what did the script see, and what did it return?"
49
+ * without having to re-run the daemon with custom logs. This is the
50
+ * trace that would have answered the codex-cli #102 regression in one
51
+ * pass instead of a dozen guesses.
52
+ *
53
+ * Body fields are bounded: input is reduced to a small summary (sizes
54
+ * + a salted hash + the first few normalized chars of screenText), and
55
+ * result is JSON-serialized then capped. Full PTY frames are NOT
56
+ * captured here — they live in CliBufferSnapshot and are exposed by
57
+ * the chat debug bundle separately.
58
+ */
59
+ export interface CliScriptInvocationTrace {
60
+ at: number; // Date.now()
61
+ scriptName: string;
62
+ arity: number;
63
+ inputSummary: {
64
+ screenTextLen: number;
65
+ rawBufferLen: number;
66
+ tailLen: number;
67
+ isWaitingForResponse?: boolean;
68
+ screenTextHead?: string; // first 200 chars of screenText (post-strip)
69
+ };
70
+ ok: boolean;
71
+ elapsedUs: number;
72
+ resultSummary?: string; // JSON.stringify(result).slice(0, 400)
73
+ error?: string;
74
+ /**
75
+ * True when the invocation's elapsed time exceeded the runner's
76
+ * `scriptCallBudgetMs`. The script is NOT aborted (Node CJS can't
77
+ * interrupt sync code without a worker thread) — this flag plus the
78
+ * trace ring lets an operator identify which provider is hanging the
79
+ * settle loop. A throttled WARN is emitted alongside.
80
+ */
81
+ timedOut?: boolean;
82
+ }
83
+
84
+ const TRACE_RING_CAPACITY = 64;
85
+
86
+ /** Default per-invocation wall-clock budget (ms) when the manifest omits one. */
87
+ const DEFAULT_SCRIPT_CALL_BUDGET_MS = 50;
88
+
89
+ /** Minimum interval between repeated budget-violation WARNs per script. */
90
+ const BUDGET_WARN_THROTTLE_MS = 30_000;
91
+
92
+ function summarizeInput(input: any): CliScriptInvocationTrace['inputSummary'] {
93
+ const screenText = typeof input?.screenText === 'string' ? input.screenText : '';
94
+ const rawBuffer = typeof input?.rawBuffer === 'string' ? input.rawBuffer : '';
95
+ const tail = typeof input?.tail === 'string' ? input.tail : '';
96
+ return {
97
+ screenTextLen: screenText.length,
98
+ rawBufferLen: rawBuffer.length,
99
+ tailLen: tail.length,
100
+ isWaitingForResponse: typeof input?.isWaitingForResponse === 'boolean' ? input.isWaitingForResponse : undefined,
101
+ screenTextHead: screenText ? screenText.slice(0, 200) : undefined,
102
+ };
103
+ }
104
+
105
+ function summarizeResult(result: unknown): string {
106
+ try {
107
+ const json = JSON.stringify(result);
108
+ return json && json.length > 400 ? `${json.slice(0, 400)}…[truncated ${json.length - 400}]` : (json ?? 'undefined');
109
+ } catch (e: any) {
110
+ return `<unserializable: ${e?.message || e}>`;
111
+ }
112
+ }
113
+
114
+ export class CliScriptRunner {
115
+ private scripts: CliScripts = {};
116
+ private scriptState: unknown = null;
117
+ private _parseErrorMessage: string | null = null;
118
+ private readonly cliType: string;
119
+ private sdk: CliScriptSdk = {};
120
+ private invocationTrace: CliScriptInvocationTrace[] = [];
121
+ /** Per-invocation wall-clock budget (ms). Configurable via setScriptCallBudget. */
122
+ private scriptCallBudgetMs = DEFAULT_SCRIPT_CALL_BUDGET_MS;
123
+ /** Last WARN emit time per scriptName, used to throttle repeated budget violations. */
124
+ private lastBudgetWarnAt = new Map<string, number>();
125
+
126
+ constructor(cliType: string) {
127
+ this.cliType = cliType;
128
+ }
129
+
130
+ /** Returns the most-recent script invocation traces (oldest → newest). */
131
+ getInvocationTrace(): CliScriptInvocationTrace[] {
132
+ return this.invocationTrace.slice();
133
+ }
134
+
135
+ /** Clear the trace ring — used by tests and after PTY reset. */
136
+ clearInvocationTrace(): void {
137
+ this.invocationTrace = [];
138
+ }
139
+
140
+ /**
141
+ * Configure the wall-clock budget (ms) applied to every script invocation.
142
+ *
143
+ * Out-of-range or non-finite values are clamped to [1, 5000] and the
144
+ * default (50ms) is used as a fallback. The budget is enforced per-call,
145
+ * not aggregated — it does not abort a runaway script (Node CJS cannot
146
+ * interrupt synchronous code without a worker thread). Instead, an
147
+ * exceeded budget flags the trace entry with `timedOut: true` and emits
148
+ * a throttled WARN naming the script and elapsed time so an operator
149
+ * can identify which provider is hanging the settle loop.
150
+ */
151
+ setScriptCallBudget(ms: number): void {
152
+ if (typeof ms !== 'number' || !Number.isFinite(ms)) {
153
+ this.scriptCallBudgetMs = DEFAULT_SCRIPT_CALL_BUDGET_MS;
154
+ return;
155
+ }
156
+ const clamped = Math.max(1, Math.min(5000, Math.floor(ms)));
157
+ this.scriptCallBudgetMs = clamped;
158
+ }
159
+
160
+ /** Test/debug accessor — current effective budget in ms. */
161
+ getScriptCallBudgetMs(): number {
162
+ return this.scriptCallBudgetMs;
163
+ }
164
+
165
+ private recordTrace(entry: CliScriptInvocationTrace): void {
166
+ this.invocationTrace.push(entry);
167
+ if (this.invocationTrace.length > TRACE_RING_CAPACITY) {
168
+ this.invocationTrace.splice(0, this.invocationTrace.length - TRACE_RING_CAPACITY);
169
+ }
170
+ }
171
+
172
+ // ─── Script lifecycle ─────────────────────────────
173
+
174
+ setScripts(scripts: CliScripts, providerTui?: Record<string, unknown> | undefined): void {
175
+ // SDK is built first so the synth functions below have access to it.
176
+ this.sdk = this.buildSdk(providerTui);
177
+
178
+ // Fill missing scripts from the SDK synth. This is the heart of the
179
+ // declarative model: a v1 manifest with a complete tui block (spinner
180
+ // + modal + settledPrompt + transcriptPty) gets working detectStatus
181
+ // / parseApproval / parseSession functions for free, no provider .js
182
+ // required. Providers that supply their own override always win
183
+ // because we don't overwrite when scripts[name] is already a function.
184
+ const tui = providerTui as Record<string, unknown> | undefined;
185
+ const enriched: CliScripts = { ...scripts };
186
+
187
+ if (typeof enriched.detectStatus !== 'function' && this.sdk.declarativeDetectStatus) {
188
+ enriched.detectStatus = this.sdk.declarativeDetectStatus as any;
189
+ }
190
+ if (typeof enriched.parseApproval !== 'function' && this.sdk.declarativeParseApproval) {
191
+ enriched.parseApproval = this.sdk.declarativeParseApproval as any;
192
+ }
193
+ if (typeof enriched.parseSession !== 'function' && tui?.transcriptPty) {
194
+ try {
195
+ const synth = buildParseSessionFromTui({
196
+ spinner: tui.spinner,
197
+ settledPrompt: tui.settledPrompt,
198
+ modal: tui.modal as any,
199
+ dispatchOrder: tui.dispatchOrder,
200
+ transcriptPty: tui.transcriptPty as any,
201
+ });
202
+ // Wrap to apply identity stamps the daemon downstream expects.
203
+ enriched.parseSession = ((input: any) => {
204
+ const out = synth(input);
205
+ return {
206
+ ...out,
207
+ messages: normalizeMessageIdentity(out.messages, out.status ?? 'idle'),
208
+ };
209
+ }) as any;
210
+ } catch (e: any) {
211
+ LOG.warn('CLI', `[${this.cliType}] buildParseSessionFromTui failed: ${e?.message || e}`);
212
+ }
213
+ }
214
+
215
+ this.scripts = enriched;
216
+ this._parseErrorMessage = null;
217
+ this.scriptState = typeof enriched.createState === 'function'
218
+ ? (enriched.createState() ?? null)
219
+ : null;
220
+ }
221
+
222
+ private buildSdk(providerTui: Record<string, unknown> | undefined): CliScriptSdk {
223
+ const tui = providerTui as Record<string, unknown> | undefined;
224
+ if (!tui) return {};
225
+ const sdk: CliScriptSdk = {};
226
+ // Build declarativeDetectStatus from the manifest tui block. The
227
+ // builder requires at least spinner OR settledPrompt OR modal; if
228
+ // none are present we skip silently so a non-tui manifest doesn't
229
+ // throw at boot time.
230
+ if (tui.spinner || tui.settledPrompt || tui.modal || tui.dispatchOrder) {
231
+ try {
232
+ sdk.declarativeDetectStatus = buildDetectStatusFromTui({
233
+ spinner: tui.spinner as any,
234
+ settledPrompt: tui.settledPrompt as any,
235
+ modal: tui.modal as any,
236
+ dispatchOrder: tui.dispatchOrder as any,
237
+ }) as unknown as (input: CliStatusInput) => string | null;
238
+ } catch (e: any) {
239
+ LOG.warn('CLI', `[${this.cliType}] buildDetectStatusFromTui failed: ${e?.message || e}`);
240
+ }
241
+ }
242
+ if (tui.modal) {
243
+ try {
244
+ sdk.declarativeParseApproval = buildParseApprovalFromTui(tui.modal as any) as unknown as (input: CliApprovalInput) => { message: string; buttons: string[] } | null;
245
+ } catch (e: any) {
246
+ LOG.warn('CLI', `[${this.cliType}] buildParseApprovalFromTui failed: ${e?.message || e}`);
247
+ }
248
+ }
249
+ return sdk;
250
+ }
251
+
252
+ /** Reset per-session state — called when the PTY process exits. */
253
+ resetSessionState(): void {
254
+ this.scriptState = null;
255
+ this.invocationTrace = [];
256
+ this.lastBudgetWarnAt.clear();
257
+ }
258
+
259
+ // ─── Script access (for reflection and test patching) ────────────────────
260
+
261
+ /** Returns the live scripts object. Direct property assignment on this object
262
+ * patches individual scripts without replacing others (used in tests). */
263
+ get cliScripts(): CliScripts { return this.scripts; }
264
+
265
+ // ─── Capability checks ────────────────────────────
266
+
267
+ hasDetectStatus(): boolean {
268
+ return typeof this.scripts.detectStatus === 'function';
269
+ }
270
+
271
+ hasParseSession(): boolean {
272
+ return typeof this.scripts.parseSession === 'function';
273
+ }
274
+
275
+ getScriptNames(): string[] {
276
+ return listCliScriptNames(this.scripts);
277
+ }
278
+
279
+ // ─── Error state ──────────────────────────────────
280
+
281
+ get parseErrorMessage(): string | null {
282
+ return this._parseErrorMessage;
283
+ }
284
+
285
+ clearParseError(): void {
286
+ this._parseErrorMessage = null;
287
+ }
288
+
289
+ // ─── Script invocation ────────────────────────────
290
+
291
+ detectStatus(input: CliStatusInput): string | null {
292
+ if (!this.scripts.detectStatus) return null;
293
+ try {
294
+ return this.invoke<string | null>('detectStatus', this.scripts.detectStatus, input);
295
+ } catch (e: any) {
296
+ LOG.warn('CLI', `[${this.cliType}] detectStatus error: ${e?.message || e}`);
297
+ return null;
298
+ }
299
+ }
300
+
301
+ parseApproval(
302
+ input: CliApprovalInput,
303
+ ): { message: string; buttons: string[] } | null {
304
+ if (!this.scripts.parseApproval) return null;
305
+ try {
306
+ return this.invoke<{ message: string; buttons: string[] } | null>(
307
+ 'parseApproval',
308
+ this.scripts.parseApproval,
309
+ input,
310
+ );
311
+ } catch (e: any) {
312
+ LOG.warn('CLI', `[${this.cliType}] parseApproval error: ${e?.message || e}`);
313
+ return null;
314
+ }
315
+ }
316
+
317
+ parseSession(
318
+ input: CliScriptInput & { tail?: string; tailScreen?: CliScreenSnapshot },
319
+ ): ParsedSession | null {
320
+ if (!this.scripts.parseSession) {
321
+ this._parseErrorMessage = `${this.cliType} parseSession unavailable`;
322
+ return null;
323
+ }
324
+ try {
325
+ const result = this.invoke<ParsedSession | null>('parseSession', this.scripts.parseSession, input);
326
+ this._parseErrorMessage = null;
327
+ return result && typeof result === 'object' ? result : null;
328
+ } catch (e: any) {
329
+ this._parseErrorMessage = e?.message || String(e);
330
+ LOG.warn('CLI', `[${this.cliType}] parseSession error: ${this._parseErrorMessage}`);
331
+ return null;
332
+ }
333
+ }
334
+
335
+ /**
336
+ * Invoke an arbitrary named script (e.g. setModel, openModelPicker).
337
+ * Throws if the script is not available.
338
+ */
339
+ invokeByName(name: string, input: any): any {
340
+ const fn = this.scripts[name];
341
+ if (typeof fn !== 'function') {
342
+ throw new Error(`CLI script '${name}' not available`);
343
+ }
344
+ return this.invoke(name, fn, input);
345
+ }
346
+
347
+ // ─── Internal ─────────────────────────────────────
348
+
349
+ private invoke<T>(scriptName: string, fn: Function, input: any): T {
350
+ // Pick the call shape from fn.length so each script gets exactly the
351
+ // args its signature declares:
352
+ // (input) — v0 single-arg scripts
353
+ // (state, input) — v0 stateful scripts that opt in via createState()
354
+ // (state, input, sdk) — v1 extended-tier overrides that consume the SDK
355
+ const arity = fn.length;
356
+ const startedAt = Date.now();
357
+ const startedHr = typeof process !== 'undefined' && typeof process.hrtime === 'function'
358
+ ? process.hrtime.bigint()
359
+ : null;
360
+ let result: T;
361
+ try {
362
+ if (arity >= 3) {
363
+ result = (fn as (state: unknown, input: any, sdk: CliScriptSdk) => T)(this.scriptState, input, this.sdk);
364
+ } else if (arity === 2) {
365
+ result = (fn as (state: unknown, input: any) => T)(this.scriptState, input);
366
+ } else {
367
+ result = (fn as (input: any) => T)(input);
368
+ }
369
+ const elapsedUs = startedHr ? Number((process.hrtime.bigint() - startedHr) / 1000n) : 0;
370
+ const timedOut = this.checkBudget(scriptName, elapsedUs);
371
+ this.recordTrace({
372
+ at: startedAt,
373
+ scriptName,
374
+ arity,
375
+ inputSummary: summarizeInput(input),
376
+ ok: true,
377
+ elapsedUs,
378
+ resultSummary: summarizeResult(result),
379
+ ...(timedOut ? { timedOut: true } : {}),
380
+ });
381
+ return result;
382
+ } catch (e: any) {
383
+ const elapsedUs = startedHr ? Number((process.hrtime.bigint() - startedHr) / 1000n) : 0;
384
+ const timedOut = this.checkBudget(scriptName, elapsedUs);
385
+ this.recordTrace({
386
+ at: startedAt,
387
+ scriptName,
388
+ arity,
389
+ inputSummary: summarizeInput(input),
390
+ ok: false,
391
+ elapsedUs,
392
+ error: e?.message ? String(e.message).slice(0, 400) : String(e).slice(0, 400),
393
+ ...(timedOut ? { timedOut: true } : {}),
394
+ });
395
+ throw e;
396
+ }
397
+ }
398
+
399
+ /**
400
+ * Returns true when `elapsedUs` exceeded the configured budget. On the
401
+ * first violation per script (or after the throttle window expires) we
402
+ * emit a single WARN so the operator learns which provider is slow.
403
+ *
404
+ * We deliberately throttle per-scriptName so a chronically-slow
405
+ * detectStatus doesn't spam the log on every PTY frame settle.
406
+ */
407
+ private checkBudget(scriptName: string, elapsedUs: number): boolean {
408
+ const budgetUs = this.scriptCallBudgetMs * 1000;
409
+ if (elapsedUs <= budgetUs) return false;
410
+ const now = Date.now();
411
+ const last = this.lastBudgetWarnAt.get(scriptName) ?? 0;
412
+ if (now - last >= BUDGET_WARN_THROTTLE_MS) {
413
+ this.lastBudgetWarnAt.set(scriptName, now);
414
+ LOG.warn(
415
+ 'CLI',
416
+ `[${this.cliType}] script ${scriptName} took ${elapsedUs}us, budget ${budgetUs}us`,
417
+ );
418
+ }
419
+ return true;
420
+ }
421
+ }