@adhdev/daemon-core 0.9.82-rc.48 → 0.9.82-rc.481

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 +126 -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 +51 -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 +137 -0
  58. package/dist/commands/router-worktree-cleanup.d.ts +133 -0
  59. package/dist/commands/router.d.ts +204 -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 +136 -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 +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 +57 -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 +73 -17
  81. package/dist/index.js +52979 -18657
  82. package/dist/index.js.map +1 -1
  83. package/dist/index.mjs +59496 -25355
  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 +230 -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 +49 -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 +246 -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 +29 -0
  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 +158 -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 +80 -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 +428 -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 +508 -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 +30 -0
  134. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  135. package/dist/mesh/mesh-work-queue.d.ts +363 -5
  136. package/dist/mesh/preview-freshness.d.ts +28 -0
  137. package/dist/mesh/refine-config.d.ts +216 -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 +406 -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 +149 -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 +29 -0
  161. package/dist/providers/provider-instance.d.ts +30 -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 +629 -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 +98 -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 +26 -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 +5 -0
  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 +954 -1144
  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 +2767 -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 +659 -27
  252. package/src/commands/handler.ts +845 -2
  253. package/src/commands/high-family/index.ts +28 -0
  254. package/src/commands/high-family/mesh-coordinator-launch.ts +680 -0
  255. package/src/commands/high-family/mesh-events.ts +102 -0
  256. package/src/commands/high-family/mesh-status.ts +849 -0
  257. package/src/commands/high-family/types.ts +80 -0
  258. package/src/commands/low-family/coordinator-prompt.ts +72 -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 +241 -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 +1287 -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 +1711 -0
  283. package/src/commands/router-worktree-cleanup.ts +870 -0
  284. package/src/commands/router.ts +795 -4143
  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 +632 -23
  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 +767 -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 +213 -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 +469 -0
  323. package/src/mesh/coordinator-prompt.ts +572 -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 +2002 -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 +1494 -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 +111 -0
  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 +898 -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 +2263 -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 +1473 -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 +1686 -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 +2150 -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 +185 -0
  363. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  364. package/src/mesh/mesh-work-queue.ts +1437 -147
  365. package/src/mesh/preview-freshness.ts +163 -0
  366. package/src/mesh/refine-config.ts +423 -0
  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 +2709 -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 +160 -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 +87 -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 +509 -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 +868 -13
  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 +136 -55
  460. package/src/status/builders.ts +26 -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 +95 -26
  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 +5 -0
  469. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  470. package/dist/mesh/mesh-sync.d.ts +0 -53
  471. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  472. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  473. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,218 @@
1
+ /**
2
+ * External provider sources — registry + active-selection state.
3
+ *
4
+ * A user can register one or more 3rd-party git URLs as provider sources.
5
+ * Each source clones into ~/.adhdev/external/<source-name>/, namespaced so
6
+ * that two sources can disk-coexist providing the same provider type.
7
+ *
8
+ * When two sources expose the same type, only one is "active" at a time.
9
+ * The active selection is persisted so a user's choice survives daemon
10
+ * restarts. When only one source provides a type, no explicit selection
11
+ * is needed and the loader falls through to that source.
12
+ */
13
+ 'use strict';
14
+
15
+ import * as fs from 'node:fs';
16
+ import * as os from 'node:os';
17
+ import * as path from 'node:path';
18
+
19
+ export interface ExternalSource {
20
+ /** Unique short identifier, e.g. "@vendor-x". User-supplied or derived from the URL. */
21
+ name: string;
22
+ /** Full git URL (https://, git@, …). */
23
+ url: string;
24
+ /** Branch / tag / commit-ish to track. Defaults to `main`. */
25
+ ref: string;
26
+ /** ISO timestamp when first registered. */
27
+ addedAt: string;
28
+ }
29
+
30
+ export interface ExternalSourcesFile {
31
+ /** Schema version — bump if shape changes. */
32
+ schema: 1;
33
+ sources: ExternalSource[];
34
+ }
35
+
36
+ /**
37
+ * Per-type active source selection. Only types reachable from more than
38
+ * one source need an entry — single-source types have no ambiguity.
39
+ *
40
+ * Shape: { active: { "<type>": "<source-name>" } }
41
+ */
42
+ export interface ProvidersActiveFile {
43
+ schema: 1;
44
+ active: Record<string, string>;
45
+ }
46
+
47
+ const SOURCES_FILENAME = 'providers-sources.json';
48
+ const ACTIVE_FILENAME = 'providers-active.json';
49
+
50
+ function adhdevDir(): string {
51
+ return path.join(os.homedir(), '.adhdev');
52
+ }
53
+
54
+ export function externalRoot(): string {
55
+ return path.join(adhdevDir(), 'external');
56
+ }
57
+
58
+ export function sourcesFilePath(): string {
59
+ return path.join(adhdevDir(), SOURCES_FILENAME);
60
+ }
61
+
62
+ export function activeFilePath(): string {
63
+ return path.join(adhdevDir(), ACTIVE_FILENAME);
64
+ }
65
+
66
+ function ensureAdhdevDir(): void {
67
+ const d = adhdevDir();
68
+ if (!fs.existsSync(d)) fs.mkdirSync(d, { recursive: true });
69
+ }
70
+
71
+ export function loadExternalSources(): ExternalSourcesFile {
72
+ const p = sourcesFilePath();
73
+ if (!fs.existsSync(p)) return { schema: 1, sources: [] };
74
+ try {
75
+ const raw = JSON.parse(fs.readFileSync(p, 'utf-8'));
76
+ if (!raw || typeof raw !== 'object') return { schema: 1, sources: [] };
77
+ const sources = Array.isArray(raw.sources) ? raw.sources.filter(isValidSource) : [];
78
+ return { schema: 1, sources };
79
+ } catch {
80
+ return { schema: 1, sources: [] };
81
+ }
82
+ }
83
+
84
+ export function saveExternalSources(file: ExternalSourcesFile): void {
85
+ ensureAdhdevDir();
86
+ const tmp = sourcesFilePath() + '.tmp';
87
+ fs.writeFileSync(tmp, JSON.stringify(file, null, 2) + '\n', 'utf-8');
88
+ fs.renameSync(tmp, sourcesFilePath());
89
+ }
90
+
91
+ export function loadProvidersActive(): ProvidersActiveFile {
92
+ const p = activeFilePath();
93
+ if (!fs.existsSync(p)) return { schema: 1, active: {} };
94
+ try {
95
+ const raw = JSON.parse(fs.readFileSync(p, 'utf-8'));
96
+ if (!raw || typeof raw !== 'object') return { schema: 1, active: {} };
97
+ const active = raw.active && typeof raw.active === 'object' ? raw.active : {};
98
+ return { schema: 1, active };
99
+ } catch {
100
+ return { schema: 1, active: {} };
101
+ }
102
+ }
103
+
104
+ export function saveProvidersActive(file: ProvidersActiveFile): void {
105
+ ensureAdhdevDir();
106
+ const tmp = activeFilePath() + '.tmp';
107
+ fs.writeFileSync(tmp, JSON.stringify(file, null, 2) + '\n', 'utf-8');
108
+ fs.renameSync(tmp, activeFilePath());
109
+ }
110
+
111
+ function isValidSource(x: unknown): x is ExternalSource {
112
+ if (!x || typeof x !== 'object') return false;
113
+ const s = x as Record<string, unknown>;
114
+ return typeof s.name === 'string' && s.name.length > 0
115
+ && typeof s.url === 'string' && s.url.length > 0
116
+ && typeof s.ref === 'string' && s.ref.length > 0
117
+ && typeof s.addedAt === 'string';
118
+ }
119
+
120
+ /**
121
+ * Derive a short identifier from a git URL when the user didn't supply one.
122
+ * https://github.com/vendor/extra-providers.git → "@vendor-extra-providers"
123
+ * git@github.com:vendor/extra-providers → "@vendor-extra-providers"
124
+ *
125
+ * Idempotent; safe to call before validation since it produces a string
126
+ * regardless of input shape.
127
+ */
128
+ export function deriveSourceName(url: string): string {
129
+ const m = url.match(/[/:]([^/:]+)\/([^/]+?)(?:\.git)?$/);
130
+ if (!m) return '@source';
131
+ const owner = m[1].toLowerCase().replace(/[^a-z0-9_-]/g, '-');
132
+ const repo = m[2].toLowerCase().replace(/[^a-z0-9_-]/g, '-');
133
+ return `@${owner}-${repo}`;
134
+ }
135
+
136
+ /**
137
+ * Return the per-source category/type tree currently on disk under
138
+ * ~/.adhdev/external/<source>/. Used by the conflict detector and by
139
+ * list_provider_sources.
140
+ */
141
+ export interface SourceInventoryEntry {
142
+ sourceName: string;
143
+ /** Map: category → list of provider types. */
144
+ providers: Record<string, string[]>;
145
+ }
146
+
147
+ export function inventoryExternalSources(): SourceInventoryEntry[] {
148
+ const root = externalRoot();
149
+ if (!fs.existsSync(root)) return [];
150
+ const out: SourceInventoryEntry[] = [];
151
+ let entries: fs.Dirent[];
152
+ try { entries = fs.readdirSync(root, { withFileTypes: true }); }
153
+ catch { return []; }
154
+ for (const sourceEntry of entries) {
155
+ if (!sourceEntry.isDirectory()) continue;
156
+ const sourceName = sourceEntry.name;
157
+ const sourceDir = path.join(root, sourceName);
158
+ const providers: Record<string, string[]> = {};
159
+ let categoryEntries: fs.Dirent[];
160
+ try { categoryEntries = fs.readdirSync(sourceDir, { withFileTypes: true }); }
161
+ catch { continue; }
162
+ for (const categoryEntry of categoryEntries) {
163
+ if (!categoryEntry.isDirectory()) continue;
164
+ const category = categoryEntry.name;
165
+ const categoryDir = path.join(sourceDir, category);
166
+ let typeEntries: fs.Dirent[];
167
+ try { typeEntries = fs.readdirSync(categoryDir, { withFileTypes: true }); }
168
+ catch { continue; }
169
+ const types: string[] = [];
170
+ for (const typeEntry of typeEntries) {
171
+ if (!typeEntry.isDirectory()) continue;
172
+ // Only count it as a provider if a manifest file exists
173
+ const typeDir = path.join(categoryDir, typeEntry.name);
174
+ const hasV1 = fs.existsSync(path.join(typeDir, 'provider.v1.json'));
175
+ const hasV0 = fs.existsSync(path.join(typeDir, 'provider.json'));
176
+ if (hasV1 || hasV0) types.push(typeEntry.name);
177
+ }
178
+ if (types.length > 0) providers[category] = types;
179
+ }
180
+ out.push({ sourceName, providers });
181
+ }
182
+ return out;
183
+ }
184
+
185
+ /**
186
+ * For a given category+type, list every source that currently exposes it.
187
+ * Returns source names in disk-walk order; callers can use the first one
188
+ * when no explicit active selection exists.
189
+ */
190
+ export function sourcesProviding(category: string, type: string): string[] {
191
+ const inventory = inventoryExternalSources();
192
+ return inventory
193
+ .filter(s => (s.providers[category] || []).includes(type))
194
+ .map(s => s.sourceName);
195
+ }
196
+
197
+ /**
198
+ * Resolve which source should be active for a given category+type.
199
+ * - If exactly one source provides it → that source.
200
+ * - If multiple sources provide it → the one named in providers-active.json
201
+ * (when present) or null (ambiguous; loader should warn and pick
202
+ * the first deterministically so daemon doesn't refuse to boot).
203
+ * - If none → null.
204
+ */
205
+ export function resolveActiveSource(
206
+ category: string,
207
+ type: string,
208
+ activeFile?: ProvidersActiveFile,
209
+ ): { source: string | null; ambiguous: boolean; candidates: string[] } {
210
+ const candidates = sourcesProviding(category, type);
211
+ if (candidates.length === 0) return { source: null, ambiguous: false, candidates };
212
+ if (candidates.length === 1) return { source: candidates[0], ambiguous: false, candidates };
213
+ const explicit = (activeFile ?? loadProvidersActive()).active[type];
214
+ if (explicit && candidates.includes(explicit)) {
215
+ return { source: explicit, ambiguous: false, candidates };
216
+ }
217
+ return { source: candidates[0], ambiguous: true, candidates };
218
+ }
@@ -20,7 +20,7 @@ import { LOG } from '../logging/logger.js';
20
20
  import { buildPersistedProviderEffectMessage, normalizeProviderEffects } from './control-effects.js';
21
21
  import { validateReadChatResultPayload } from './read-chat-contract.js';
22
22
  import type { ChatMessage } from '../types.js';
23
- import { formatAutoApprovalMessage, pickApprovalButton } from './approval-utils.js';
23
+ import { formatAutoApprovalMessage, pickAutoApprovalButton } from './approval-utils.js';
24
24
  import { mergeProviderPatchState, resolveProviderStateSurface } from './provider-patch-state.js';
25
25
  import { buildChatMessage, buildRuntimeSystemChatMessage, normalizeChatMessages, extractFinalSummaryFromMessages } from './chat-message-normalization.js';
26
26
  import { getProviderSessionCapabilities, IDE_PROVIDER_SESSION_CAPABILITIES_BASE } from './open-panel-support.js';
@@ -43,6 +43,20 @@ type ReadChatPayload = {
43
43
  [key: string]: unknown;
44
44
  };
45
45
 
46
+ async function withTimeout<T>(promise: Promise<T>, timeoutMs: number, label: string): Promise<T> {
47
+ let timer: ReturnType<typeof setTimeout> | null = null;
48
+ try {
49
+ return await Promise.race([
50
+ promise,
51
+ new Promise<never>((_, reject) => {
52
+ timer = setTimeout(() => reject(new Error(`${label} timed out after ${timeoutMs}ms`)), timeoutMs);
53
+ }),
54
+ ]);
55
+ } finally {
56
+ if (timer) clearTimeout(timer);
57
+ }
58
+ }
59
+
46
60
  export class IdeProviderInstance implements ProviderInstance {
47
61
  readonly type: string;
48
62
  readonly category = 'ide' as const;
@@ -91,8 +105,8 @@ export class IdeProviderInstance implements ProviderInstance {
91
105
  // Sync Monitor config
92
106
  this.monitor.updateConfig({
93
107
  approvalAlert: this.settings.approvalAlert !== false,
94
- longGeneratingAlert: this.settings.longGeneratingAlert !== false,
95
- longGeneratingThresholdSec: this.settings.longGeneratingThresholdSec || 180,
108
+ noProgressAlert: (this.settings.noProgressAlert ?? this.settings.longGeneratingAlert) !== false,
109
+ noProgressThresholdSec: this.settings.noProgressThresholdSec ?? this.settings.longGeneratingThresholdSec ?? 180,
96
110
  });
97
111
  }
98
112
 
@@ -245,11 +259,16 @@ export class IdeProviderInstance implements ProviderInstance {
245
259
  }
246
260
 
247
261
  updateSettings(newSettings: Record<string, any>): void {
248
- this.settings = { ...newSettings };
262
+ // Merge (not replace): a key omitted from newSettings preserves its existing
263
+ // value, a key present (even false) overrides. Mirrors cli-provider-instance —
264
+ // a partial mesh relay-stamp must not wipe launch-time settings such as
265
+ // autoApprove, while the dashboard toggle's full settings object still applies
266
+ // an explicit autoApprove:false. See cli-provider-instance.updateSettings.
267
+ this.settings = { ...this.settings, ...newSettings };
249
268
  this.monitor.updateConfig({
250
269
  approvalAlert: this.settings.approvalAlert !== false,
251
- longGeneratingAlert: this.settings.longGeneratingAlert !== false,
252
- longGeneratingThresholdSec: this.settings.longGeneratingThresholdSec || 180,
270
+ noProgressAlert: (this.settings.noProgressAlert ?? this.settings.longGeneratingAlert) !== false,
271
+ noProgressThresholdSec: this.settings.noProgressThresholdSec ?? this.settings.longGeneratingThresholdSec ?? 180,
253
272
  });
254
273
  }
255
274
 
@@ -320,7 +339,7 @@ export class IdeProviderInstance implements ProviderInstance {
320
339
  if (webviewScript) {
321
340
  const matchText = this.provider.webviewMatchText;
322
341
  const matchFn = matchText ? (body: string) => body.includes(matchText) : undefined;
323
- const webviewRaw = await cdp.evaluateInWebviewFrame(webviewScript, matchFn);
342
+ const webviewRaw = await withTimeout(cdp.evaluateInWebviewFrame(webviewScript, matchFn), 30000, 'evaluateInWebviewFrame');
324
343
  if (webviewRaw) {
325
344
  raw = typeof webviewRaw === 'string' ? (() => { try { return JSON.parse(webviewRaw); } catch { return null; } })() : webviewRaw;
326
345
  }
@@ -331,7 +350,7 @@ export class IdeProviderInstance implements ProviderInstance {
331
350
  if (!raw) {
332
351
  const readChatScript = this.getReadChatScript();
333
352
  if (!readChatScript) return;
334
- raw = await cdp.evaluate(readChatScript, 30000);
353
+ raw = await withTimeout(cdp.evaluate(readChatScript, 30000), 30000, 'evaluate.readChatScript');
335
354
  if (typeof raw === 'string') {
336
355
  try { raw = JSON.parse(raw); } catch { return; }
337
356
  }
@@ -398,7 +417,7 @@ export class IdeProviderInstance implements ProviderInstance {
398
417
  const persistedMessages = chat.messages || messages;
399
418
  if (persistedMessages.length > 0) {
400
419
  let toSave = persistedMessages;
401
- if (chat.status === 'generating' || chat.status === 'long_generating') {
420
+ if (chat.status === 'generating' || chat.status === 'no_progress' || chat.status === 'long_generating') {
402
421
  // Find and exclude last assistant message
403
422
  const lastIdx = toSave.length - 1;
404
423
  if (lastIdx >= 0 && toSave[lastIdx].role === 'assistant') {
@@ -489,7 +508,11 @@ export class IdeProviderInstance implements ProviderInstance {
489
508
  }
490
509
 
491
510
  // Monitor check (cooldown based notification)
492
- const monitorEvents = this.monitor.check(agentKey, agentStatus, now, progressFingerprint);
511
+ // Approval pending is detected from the raw status: auto-approve synthesizes
512
+ // `waiting_approval` → 'generating', so the no-progress watchdog must be told
513
+ // to hold its timer during the wait rather than count it as a stall.
514
+ const approvalPending = rawAgentStatus === 'waiting_approval';
515
+ const monitorEvents = this.monitor.check(agentKey, agentStatus, now, progressFingerprint, approvalPending);
493
516
  for (const me of monitorEvents) {
494
517
  this.pushEvent({ event: me.type, agentKey: me.agentKey, message: me.message, elapsedSec: me.elapsedSec, timestamp: me.timestamp });
495
518
  }
@@ -694,7 +717,7 @@ export class IdeProviderInstance implements ProviderInstance {
694
717
 
695
718
  this.autoApproveBusy = true;
696
719
  try {
697
- const { label: targetButton } = pickApprovalButton(_chatData?.activeModal?.buttons, this.provider);
720
+ const { label: targetButton } = pickAutoApprovalButton(_chatData?.activeModal?.buttons);
698
721
 
699
722
  const script = scriptFn({ action: 'approve', button: targetButton, buttonText: targetButton });
700
723
  if (!script) return;
@@ -706,7 +729,7 @@ export class IdeProviderInstance implements ProviderInstance {
706
729
  );
707
730
 
708
731
  LOG.info('IdeInstance', `[IdeInstance:${this.type}] autoApprove: executing resolveAction for "${targetButton}"`);
709
- let rawResult = await cdp.evaluate(script, 10000);
732
+ let rawResult = await withTimeout(cdp.evaluate(script, 10000), 10000, 'evaluate.autoApprove');
710
733
  if (typeof rawResult === 'string') {
711
734
  try { rawResult = JSON.parse(rawResult); } catch { }
712
735
  }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * ManualAttendanceTracker — provider-agnostic "is a human driving this session
3
+ * right now" signal, used to suppress auto-approve while the user is taking
4
+ * manual control of a session from the dashboard.
5
+ *
6
+ * Why this exists
7
+ * ---------------
8
+ * When `autoApprove` is on, an approval modal is auto-dismissed within a few
9
+ * hundred ms of appearing. For a background mesh worker that is exactly the
10
+ * desired delegated behavior. But for a session the user is actively watching
11
+ * and operating (a base-node / foreground session), the auto-fire closes the
12
+ * modal before the human can pick a button — and likewise fights their use of
13
+ * the controlbar. The fix is to give the human a short quiet window: while they
14
+ * are attending the session by hand, auto-approve holds; once they go idle it
15
+ * resumes.
16
+ *
17
+ * The tracker holds only a timestamp. The *signal* — which commands count as
18
+ * "a human attending" — is decided by the caller (the command handler), and is
19
+ * the same set for every provider: foreground tab selection (select_session /
20
+ * open_panel), controlbar use (invoke_provider_script / set_mode / change_model
21
+ * / set_thought_level), manual approval (resolve_action) and manual terminal
22
+ * input (pty_input). Notably NOT send_chat, which is also how a coordinator
23
+ * delegates a task to a worker — counting it would wrongly suppress the
24
+ * worker's delegated auto-approve.
25
+ *
26
+ * Because a background worker never receives any of those attending commands,
27
+ * it is never "attended", so its delegated auto-approve is unaffected. The
28
+ * mechanism is therefore provider-common AND preserves worker auto-approve
29
+ * without any per-provider branching.
30
+ */
31
+
32
+ /**
33
+ * How long after the last manual interaction auto-approve stays suppressed.
34
+ *
35
+ * Trade-off: long enough that after foregrounding a session's tab the user has
36
+ * a realistic chance to act on an incoming approval (the auto-approve settle
37
+ * window is only ~600ms, so a human cannot out-race it), yet short enough that
38
+ * a session left unattended — e.g. a worker tab the user briefly peeked at —
39
+ * resumes auto-approving within about a minute. Re-armed on every attending
40
+ * command, so a user who keeps interacting keeps the window fresh.
41
+ */
42
+ export const AUTO_APPROVE_MANUAL_ATTENDANCE_SUPPRESS_MS = 60_000;
43
+
44
+ export class ManualAttendanceTracker {
45
+ private lastInteractionAt = 0;
46
+
47
+ constructor(private readonly suppressMs: number = AUTO_APPROVE_MANUAL_ATTENDANCE_SUPPRESS_MS) {}
48
+
49
+ /** Record that a human just drove this session by hand. */
50
+ note(now = Date.now()): void {
51
+ this.lastInteractionAt = now;
52
+ }
53
+
54
+ /** True while a manual interaction is recent enough to suppress auto-approve. */
55
+ isAttended(now = Date.now()): boolean {
56
+ return this.lastInteractionAt > 0 && (now - this.lastInteractionAt) < this.suppressMs;
57
+ }
58
+
59
+ /**
60
+ * Milliseconds remaining in the current suppression window, or 0 when not
61
+ * attended. Used to re-arm a re-check timer so auto-approve fires the moment
62
+ * the window lapses even if the PTY/agent has since gone silent.
63
+ */
64
+ remainingMs(now = Date.now()): number {
65
+ if (this.lastInteractionAt <= 0) return 0;
66
+ return Math.max(0, this.suppressMs - (now - this.lastInteractionAt));
67
+ }
68
+ }
69
+
70
+ /**
71
+ * The session-scoped commands that count as "a human is attending this session
72
+ * by hand". Shared so the command handler and any forward path agree on one
73
+ * definition. Deliberately excludes send_chat (coordinator task delegation) and
74
+ * pure read commands (read_chat / list_chats — passive polling, not driving).
75
+ */
76
+ export const MANUAL_ATTENDANCE_COMMANDS: ReadonlySet<string> = new Set([
77
+ 'select_session',
78
+ 'open_panel',
79
+ 'invoke_provider_script',
80
+ 'set_mode',
81
+ 'change_model',
82
+ 'set_thought_level',
83
+ 'resolve_action',
84
+ 'pty_input',
85
+ ]);
86
+
87
+ /**
88
+ * The subset of {@link MANUAL_ATTENDANCE_COMMANDS} that are PASSIVE view-only
89
+ * actions — foregrounding a session's tab / opening its panel. They convey "I am
90
+ * looking at this session", not "I am driving it", and carry no user input.
91
+ *
92
+ * For a foreground (base-node) session these still attend: a user who
93
+ * foregrounds their own session should get the quiet window so an incoming
94
+ * approval stays visible for them to act on. But for a DELEGATED worker session
95
+ * a passive peek must NOT attend — a coordinator merely opening a worker's panel
96
+ * to watch progress would otherwise suppress that worker's delegated
97
+ * auto-approve for the whole window (secondary cause, #137). The per-instance
98
+ * hook decides: it drops a passive stamp only when the session is a delegated
99
+ * worker, so explicit input (controlbar / resolve_action / pty_input) still
100
+ * attends a worker and a foreground session is unaffected.
101
+ */
102
+ export const MANUAL_ATTENDANCE_PASSIVE_VIEW_COMMANDS: ReadonlySet<string> = new Set([
103
+ 'select_session',
104
+ 'open_panel',
105
+ ]);
@@ -0,0 +1,138 @@
1
+ /**
2
+ * antigravity-claim-registry — daemon-local conversation ownership map.
3
+ *
4
+ * Antigravity CLI writes each conversation into its own per-session SQLite db
5
+ * at ~/.gemini/antigravity-cli/conversations/<uuid>.db. But before a daemon
6
+ * session has resolved its provider session id, the discovery resolver used to
7
+ * fall back to "the newest .db on disk by mtime". Two sessions started within a
8
+ * few ms of each other on ONE daemon therefore both grabbed the SAME newest
9
+ * store — so one session's injected prompt and the other's assistant completion
10
+ * cross-routed, and an unrelated turn completed the wrong task (RCA: a
11
+ * coordinator session ended up reading the owner's conversation .db, and the
12
+ * coordinator's own injected instruction was absent from the bound store).
13
+ *
14
+ * This registry records which live daemon session currently owns a given
15
+ * conversation uuid. The discovery resolver (dispatcher.resolveAntigravityPath)
16
+ * consults it to:
17
+ * (1) never hand a conversation already owned by a DIFFERENT live session to
18
+ * an as-yet-unbound one — two sessions can never resolve to the same .db;
19
+ * (2) LOCK a session to the first conversation it binds, so a later, newer
20
+ * .db on disk cannot re-bind an already-bound session on a subsequent
21
+ * mtime-ordered read.
22
+ *
23
+ * Ownership is keyed by a per-session owner token (see antigravityOwnerToken)
24
+ * that BOTH the resolver and the provider instance derive identically from the
25
+ * same inputs (workspace + spawn time, or the instance id), so the instance can
26
+ * release its claims deterministically on shutdown.
27
+ *
28
+ * A claim not refreshed within CLAIM_STALE_MS is treated as abandoned — a
29
+ * safety net for a session that died without an explicit release. Live sessions
30
+ * poll native history far more frequently than this window, so an active owner
31
+ * never lapses; only a crashed/leaked owner's claim ages out.
32
+ *
33
+ * OSS code (AGPL-3.0). Must not import from packages/ (proprietary).
34
+ */
35
+ 'use strict';
36
+
37
+ interface ConversationClaim {
38
+ owner: string;
39
+ /** Last time this owner (re)confirmed the claim. Only consulted by the
40
+ * stale-claim safety net; an active owner refreshes it on every resolve. */
41
+ refreshedAtMs: number;
42
+ }
43
+
44
+ const claimsByUuid = new Map<string, ConversationClaim>();
45
+
46
+ /** A claim older than this with no refresh is reclaimable (owner presumed dead). */
47
+ export const CLAIM_STALE_MS = 10 * 60 * 1000;
48
+
49
+ function normalizeUuid(uuid: string): string {
50
+ return String(uuid || '').trim().toLowerCase();
51
+ }
52
+
53
+ /**
54
+ * Derive the per-session owner token, keyed ONLY on the stable instanceId
55
+ * (== the session registry sessionId == the read path's targetSessionId). Both
56
+ * the dispatcher (read side) and the provider instance (claim/release side) pass
57
+ * this same id, so their tokens always agree and the claim isolation holds.
58
+ *
59
+ * Returns '' when no instanceId is available — the caller then skips claiming
60
+ * (the exclusion checks still run against existing claims). This is the SSOT
61
+ * rule: there is exactly ONE token form. The removed legacy fallback derived a
62
+ * `spawn:<workspace>:<sessionStartedAtMs>` token from the spawn timestamp when
63
+ * the instanceId was missing; because one session's spawn time is sampled
64
+ * independently at three sites (instance startedAt, adapter spawnedAtMs, registry
65
+ * spawnedAtMs) those never matched, so the SAME session's instance-side and
66
+ * read-side tokens silently diverged and the claim mutual-exclusion collapsed
67
+ * (the antigravity conversation crosswire). An empty token (skip-claim) is
68
+ * strictly safer than a token that disagrees with the same session's other
69
+ * token. workspace/sessionStartedAtMs are kept in the signature for call-site
70
+ * compatibility but no longer affect the token.
71
+ */
72
+ export function antigravityOwnerToken(
73
+ workspace: string,
74
+ sessionStartedAtMs: number,
75
+ instanceId?: string,
76
+ ): string {
77
+ void workspace; void sessionStartedAtMs;
78
+ const iid = typeof instanceId === 'string' ? instanceId.trim() : '';
79
+ return iid ? `iid:${iid}` : '';
80
+ }
81
+
82
+ /**
83
+ * Claim `uuid` for `owner`. Succeeds (and refreshes) when the conversation is
84
+ * unclaimed, already owned by this owner, or held by a stale (abandoned) owner.
85
+ * Fails when a DIFFERENT live owner holds it. Returns whether `owner` holds the
86
+ * claim after the call.
87
+ */
88
+ export function claimAntigravityConversation(uuid: string, owner: string, now: number = Date.now()): boolean {
89
+ const key = normalizeUuid(uuid);
90
+ if (!key || !owner) return false;
91
+ const existing = claimsByUuid.get(key);
92
+ if (existing && existing.owner !== owner && (now - existing.refreshedAtMs) < CLAIM_STALE_MS) {
93
+ return false;
94
+ }
95
+ claimsByUuid.set(key, { owner, refreshedAtMs: now });
96
+ return true;
97
+ }
98
+
99
+ /** True when `uuid` is held by a live owner OTHER than `owner`. */
100
+ export function isAntigravityConversationClaimedByOther(uuid: string, owner: string, now: number = Date.now()): boolean {
101
+ const key = normalizeUuid(uuid);
102
+ if (!key) return false;
103
+ const existing = claimsByUuid.get(key);
104
+ if (!existing) return false;
105
+ if (existing.owner === owner) return false;
106
+ return (now - existing.refreshedAtMs) < CLAIM_STALE_MS;
107
+ }
108
+
109
+ /** The live owner of `uuid`, or undefined when unclaimed or stale. */
110
+ export function antigravityConversationOwner(uuid: string, now: number = Date.now()): string | undefined {
111
+ const key = normalizeUuid(uuid);
112
+ if (!key) return undefined;
113
+ const existing = claimsByUuid.get(key);
114
+ if (!existing) return undefined;
115
+ if ((now - existing.refreshedAtMs) >= CLAIM_STALE_MS) return undefined;
116
+ return existing.owner;
117
+ }
118
+
119
+ /** Release a single conversation, only if held by `owner` (or `owner` empty). */
120
+ export function releaseAntigravityConversation(uuid: string, owner?: string): void {
121
+ const key = normalizeUuid(uuid);
122
+ if (!key) return;
123
+ const existing = claimsByUuid.get(key);
124
+ if (existing && (!owner || existing.owner === owner)) claimsByUuid.delete(key);
125
+ }
126
+
127
+ /** Release every conversation held by `owner` (called on session shutdown). */
128
+ export function releaseAntigravityOwner(owner: string): void {
129
+ if (!owner) return;
130
+ for (const [key, claim] of claimsByUuid) {
131
+ if (claim.owner === owner) claimsByUuid.delete(key);
132
+ }
133
+ }
134
+
135
+ /** Test-only: wipe all claims so each test starts from a clean registry. */
136
+ export function __resetAntigravityClaimRegistry(): void {
137
+ claimsByUuid.clear();
138
+ }