harnery 0.40.0 → 0.42.0

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 (595) hide show
  1. package/README.md +1 -1
  2. package/dist/commander.js +4 -0
  3. package/dist/commands/agents.d.ts.map +1 -1
  4. package/dist/commands/agents.js +34 -20
  5. package/dist/commands/artifacts.d.ts.map +1 -1
  6. package/dist/commands/artifacts.js +113 -12
  7. package/dist/commands/browse-ai.d.ts.map +1 -1
  8. package/dist/commands/browse-ai.js +4 -0
  9. package/dist/commands/browse.d.ts +164 -0
  10. package/dist/commands/browse.d.ts.map +1 -1
  11. package/dist/commands/browse.js +388 -45
  12. package/dist/commands/checkpoint.js +8 -12
  13. package/dist/commands/claude-desktop.d.ts.map +1 -1
  14. package/dist/commands/claude-desktop.js +52 -0
  15. package/dist/commands/deinit.d.ts +1 -1
  16. package/dist/commands/deinit.d.ts.map +1 -1
  17. package/dist/commands/deinit.js +8 -4
  18. package/dist/commands/disk.d.ts +6 -0
  19. package/dist/commands/disk.d.ts.map +1 -0
  20. package/dist/commands/disk.js +80 -0
  21. package/dist/commands/docs.d.ts.map +1 -1
  22. package/dist/commands/docs.js +2 -0
  23. package/dist/commands/doctor.d.ts +8 -0
  24. package/dist/commands/doctor.d.ts.map +1 -1
  25. package/dist/commands/doctor.js +58 -3
  26. package/dist/commands/fetch.d.ts.map +1 -1
  27. package/dist/commands/fetch.js +10 -0
  28. package/dist/commands/files.d.ts +16 -0
  29. package/dist/commands/files.d.ts.map +1 -1
  30. package/dist/commands/files.js +54 -2
  31. package/dist/commands/init.d.ts +21 -5
  32. package/dist/commands/init.d.ts.map +1 -1
  33. package/dist/commands/init.js +271 -109
  34. package/dist/commands/instructions.js +5 -4
  35. package/dist/commands/ledger-v3.d.ts.map +1 -1
  36. package/dist/commands/ledger-v3.js +2 -1
  37. package/dist/commands/rm.d.ts +4 -0
  38. package/dist/commands/rm.d.ts.map +1 -0
  39. package/dist/commands/rm.js +87 -0
  40. package/dist/commands/servers.d.ts +7 -0
  41. package/dist/commands/servers.d.ts.map +1 -0
  42. package/dist/commands/servers.js +394 -0
  43. package/dist/commands/tunnel.d.ts.map +1 -1
  44. package/dist/commands/tunnel.js +82 -2
  45. package/dist/commands/webview.d.ts +4 -0
  46. package/dist/commands/webview.d.ts.map +1 -0
  47. package/dist/commands/webview.js +94 -0
  48. package/dist/core/adapter.d.ts +50 -1
  49. package/dist/core/adapter.d.ts.map +1 -1
  50. package/dist/core/adapter.js +59 -1
  51. package/dist/core/adapters/attestation.d.ts.map +1 -1
  52. package/dist/core/adapters/attestation.js +3 -2
  53. package/dist/core/adapters/profiles.d.ts +29 -3
  54. package/dist/core/adapters/profiles.d.ts.map +1 -1
  55. package/dist/core/adapters/profiles.js +53 -1
  56. package/dist/core/adapters/registry.d.ts.map +1 -1
  57. package/dist/core/adapters/registry.js +33 -0
  58. package/dist/core/adapters/types.d.ts +9 -0
  59. package/dist/core/adapters/types.d.ts.map +1 -1
  60. package/dist/core/agents/canonical-emit.d.ts +1 -1
  61. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  62. package/dist/core/agents/canonical-emit.js +2 -7
  63. package/dist/core/agents/cli.js +25 -16
  64. package/dist/core/agents/coord-client.d.ts.map +1 -1
  65. package/dist/core/agents/coord-client.js +7 -2
  66. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  67. package/dist/core/agents/render/session-context.js +2 -0
  68. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  69. package/dist/core/agents/rules/claim-conflict.js +3 -9
  70. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  71. package/dist/core/agents/rules/commit-conflict.js +2 -8
  72. package/dist/core/agents/rules/stop-hook.d.ts +2 -0
  73. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  74. package/dist/core/agents/rules/stop-hook.js +1 -1
  75. package/dist/core/agents/session-events.d.ts +6 -2
  76. package/dist/core/agents/session-events.d.ts.map +1 -1
  77. package/dist/core/agents/session-events.js +105 -26
  78. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -1
  79. package/dist/core/agents/session-finalization-state-v3.js +2 -1
  80. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -1
  81. package/dist/core/agents/session-finalizer-v3.js +5 -4
  82. package/dist/core/agents/session-name-display.d.ts +28 -0
  83. package/dist/core/agents/session-name-display.d.ts.map +1 -1
  84. package/dist/core/agents/session-name-display.js +43 -0
  85. package/dist/core/agents/state/heartbeat-reader.d.ts +7 -0
  86. package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -1
  87. package/dist/core/agents/state/heartbeat-writer.d.ts +10 -0
  88. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  89. package/dist/core/agents/state/heartbeat-writer.js +21 -2
  90. package/dist/core/agents/state/live-coordination-view.d.ts +20 -0
  91. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  92. package/dist/core/agents/state/live-coordination-view.js +61 -0
  93. package/dist/core/agents/state/live-coordination-writer.js +3 -0
  94. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  95. package/dist/core/agents/state/stale-sweep.js +2 -10
  96. package/dist/core/agents/turn-changes.d.ts +17 -0
  97. package/dist/core/agents/turn-changes.d.ts.map +1 -0
  98. package/dist/core/agents/turn-changes.js +76 -0
  99. package/dist/core/artifacts/delivery-card.d.ts.map +1 -1
  100. package/dist/core/artifacts/delivery-card.js +11 -3
  101. package/dist/core/artifacts/index.d.ts +140 -4
  102. package/dist/core/artifacts/index.d.ts.map +1 -1
  103. package/dist/core/artifacts/index.js +526 -52
  104. package/dist/core/config.d.ts +73 -11
  105. package/dist/core/config.d.ts.map +1 -1
  106. package/dist/core/config.js +142 -3
  107. package/dist/core/context/index.d.ts.map +1 -1
  108. package/dist/core/context/index.js +2 -1
  109. package/dist/core/conversations/archive.d.ts.map +1 -1
  110. package/dist/core/conversations/archive.js +4 -3
  111. package/dist/core/diagnostics/bundle.d.ts.map +1 -1
  112. package/dist/core/diagnostics/bundle.js +5 -4
  113. package/dist/core/events/legacy-storage/canary.d.ts.map +1 -1
  114. package/dist/core/events/legacy-storage/canary.js +5 -4
  115. package/dist/core/events/legacy-storage/compression.d.ts.map +1 -1
  116. package/dist/core/events/legacy-storage/compression.js +2 -1
  117. package/dist/core/events/v3/adapter-id.d.ts +10 -2
  118. package/dist/core/events/v3/adapter-id.d.ts.map +1 -1
  119. package/dist/core/events/v3/adapter-id.js +16 -0
  120. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  121. package/dist/core/events/v3/authority-outbox.js +2 -1
  122. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  123. package/dist/core/events/v3/bootstrap.js +5 -4
  124. package/dist/core/events/v3/capabilities.d.ts.map +1 -1
  125. package/dist/core/events/v3/capabilities.js +17 -0
  126. package/dist/core/events/v3/contract.d.ts +5 -0
  127. package/dist/core/events/v3/contract.d.ts.map +1 -1
  128. package/dist/core/events/v3/contract.js +7 -1
  129. package/dist/core/events/v3/control-witness.d.ts.map +1 -1
  130. package/dist/core/events/v3/control-witness.js +3 -2
  131. package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -1
  132. package/dist/core/events/v3/coordination-transaction-recovery.js +4 -3
  133. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -1
  134. package/dist/core/events/v3/fingerprint-keys.js +7 -6
  135. package/dist/core/events/v3/generated.d.ts +1 -1
  136. package/dist/core/events/v3/generated.js +1 -1
  137. package/dist/core/events/v3/live-feed.d.ts.map +1 -1
  138. package/dist/core/events/v3/live-feed.js +5 -4
  139. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
  140. package/dist/core/events/v3/producers/command-recorder.js +8 -7
  141. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  142. package/dist/core/events/v3/producers/coordination-recorder.js +8 -7
  143. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -1
  144. package/dist/core/events/v3/producers/diagnostic-summaries.js +5 -4
  145. package/dist/core/events/v3/producers/hook-base.d.ts +1 -0
  146. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
  147. package/dist/core/events/v3/producers/hook-base.js +10 -4
  148. package/dist/core/events/v3/producers/hook.d.ts +2 -0
  149. package/dist/core/events/v3/producers/hook.d.ts.map +1 -1
  150. package/dist/core/events/v3/producers/hook.js +16 -1
  151. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  152. package/dist/core/events/v3/producers/intake.js +16 -6
  153. package/dist/core/events/v3/producers/recorder.d.ts +2 -4
  154. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  155. package/dist/core/events/v3/producers/recorder.js +125 -101
  156. package/dist/core/events/v3/projection.js +9 -1
  157. package/dist/core/events/v3/recovery.d.ts.map +1 -1
  158. package/dist/core/events/v3/recovery.js +4 -3
  159. package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -1
  160. package/dist/core/events/v3/support-storage/inventory.js +2 -1
  161. package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -1
  162. package/dist/core/events/v3/support-storage/maintenance.js +4 -3
  163. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -1
  164. package/dist/core/events/v3/support-storage/pack-reader.js +4 -3
  165. package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -1
  166. package/dist/core/events/v3/support-storage/pack-writer.js +6 -5
  167. package/dist/core/events/v3/tool-line-changes.d.ts +8 -0
  168. package/dist/core/events/v3/tool-line-changes.d.ts.map +1 -0
  169. package/dist/core/events/v3/tool-line-changes.js +135 -0
  170. package/dist/core/events/v3/writer.d.ts.map +1 -1
  171. package/dist/core/events/v3/writer.js +8 -7
  172. package/dist/core/governor/planning.d.ts.map +1 -1
  173. package/dist/core/governor/planning.js +6 -5
  174. package/dist/core/governor/service.d.ts.map +1 -1
  175. package/dist/core/governor/service.js +12 -11
  176. package/dist/core/governor/state.d.ts.map +1 -1
  177. package/dist/core/governor/state.js +7 -6
  178. package/dist/core/guard/evaluator.js +1 -0
  179. package/dist/core/guard/storage.d.ts.map +1 -1
  180. package/dist/core/guard/storage.js +3 -2
  181. package/dist/core/hooks/adapter/behaviors/claude-code.d.ts +4 -0
  182. package/dist/core/hooks/adapter/behaviors/claude-code.d.ts.map +1 -0
  183. package/dist/core/hooks/adapter/behaviors/claude-code.js +31 -0
  184. package/dist/core/hooks/adapter/behaviors/codex.d.ts +15 -0
  185. package/dist/core/hooks/adapter/behaviors/codex.d.ts.map +1 -0
  186. package/dist/core/hooks/adapter/behaviors/codex.js +82 -0
  187. package/dist/core/hooks/adapter/behaviors/cursor.d.ts +7 -0
  188. package/dist/core/hooks/adapter/behaviors/cursor.d.ts.map +1 -0
  189. package/dist/core/hooks/adapter/behaviors/cursor.js +35 -0
  190. package/dist/core/hooks/adapter/behaviors/index.d.ts +11 -0
  191. package/dist/core/hooks/adapter/behaviors/index.d.ts.map +1 -0
  192. package/dist/core/hooks/adapter/behaviors/index.js +20 -0
  193. package/dist/core/hooks/adapter/behaviors/openclaw.d.ts +7 -0
  194. package/dist/core/hooks/adapter/behaviors/openclaw.d.ts.map +1 -0
  195. package/dist/core/hooks/adapter/behaviors/openclaw.js +34 -0
  196. package/dist/core/hooks/adapter/behaviors/opencode.d.ts +7 -0
  197. package/dist/core/hooks/adapter/behaviors/opencode.d.ts.map +1 -0
  198. package/dist/core/hooks/adapter/behaviors/opencode.js +34 -0
  199. package/dist/core/hooks/adapter/behaviors/types.d.ts +89 -0
  200. package/dist/core/hooks/adapter/behaviors/types.d.ts.map +1 -0
  201. package/dist/core/hooks/adapter/behaviors/types.js +1 -0
  202. package/dist/core/hooks/adapter/detect.d.ts +1 -1
  203. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  204. package/dist/core/hooks/adapter/detect.js +2 -3
  205. package/dist/core/hooks/adapter/events.d.ts +46 -1
  206. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  207. package/dist/core/hooks/adapter/events.js +36 -0
  208. package/dist/core/hooks/adapter/opencode-plugin.d.ts +60 -0
  209. package/dist/core/hooks/adapter/opencode-plugin.d.ts.map +1 -0
  210. package/dist/core/hooks/adapter/opencode-plugin.js +129 -0
  211. package/dist/core/hooks/adapter/output.d.ts +7 -0
  212. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  213. package/dist/core/hooks/adapter/output.js +8 -1
  214. package/dist/core/hooks/adapter/runtime-telemetry.js +3 -1
  215. package/dist/core/hooks/adapter/wiring.d.ts +52 -8
  216. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  217. package/dist/core/hooks/adapter/wiring.js +133 -12
  218. package/dist/core/hooks/cli.js +676 -531
  219. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  220. package/dist/core/hooks/effects/image-capture.js +2 -1
  221. package/dist/core/hooks/prompt-context/contract.d.ts.map +1 -1
  222. package/dist/core/hooks/prompt-context/contract.js +1 -0
  223. package/dist/core/hooks/resolve/transcript.d.ts +1 -1
  224. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  225. package/dist/core/hooks/resolve/transcript.js +35 -4
  226. package/dist/core/hooks/run-markers.d.ts +37 -0
  227. package/dist/core/hooks/run-markers.d.ts.map +1 -0
  228. package/dist/core/hooks/run-markers.js +109 -0
  229. package/dist/core/hooks/session-name-presence.d.ts +3 -1
  230. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  231. package/dist/core/hooks/session-name-presence.js +7 -2
  232. package/dist/core/hooks/shell-waiter.d.ts +2 -0
  233. package/dist/core/hooks/shell-waiter.d.ts.map +1 -0
  234. package/dist/core/hooks/shell-waiter.js +173 -0
  235. package/dist/core/resources/service.d.ts.map +1 -1
  236. package/dist/core/resources/service.js +5 -4
  237. package/dist/core/semantic/review.d.ts.map +1 -1
  238. package/dist/core/semantic/review.js +5 -4
  239. package/dist/core/semantic/service.d.ts.map +1 -1
  240. package/dist/core/semantic/service.js +15 -14
  241. package/dist/core/semantic/storage.d.ts.map +1 -1
  242. package/dist/core/semantic/storage.js +5 -4
  243. package/dist/core/servers/index.d.ts +211 -0
  244. package/dist/core/servers/index.d.ts.map +1 -0
  245. package/dist/core/servers/index.js +560 -0
  246. package/dist/core/servers/net.d.ts +58 -0
  247. package/dist/core/servers/net.d.ts.map +1 -0
  248. package/dist/core/servers/net.js +270 -0
  249. package/dist/core/servers/tunnels.d.ts +14 -0
  250. package/dist/core/servers/tunnels.d.ts.map +1 -0
  251. package/dist/core/servers/tunnels.js +33 -0
  252. package/dist/core/storage/atomic-json.d.ts.map +1 -1
  253. package/dist/core/storage/atomic-json.js +7 -3
  254. package/dist/core/storage/builtins.js +1 -0
  255. package/dist/core/storage/durable-history.d.ts.map +1 -1
  256. package/dist/core/storage/durable-history.js +6 -5
  257. package/dist/core/storage/maintenance-providers.d.ts.map +1 -1
  258. package/dist/core/storage/maintenance-providers.js +2 -1
  259. package/dist/core/storage/maintenance.d.ts.map +1 -1
  260. package/dist/core/storage/maintenance.js +7 -6
  261. package/dist/core/storage/metrics.d.ts.map +1 -1
  262. package/dist/core/storage/metrics.js +5 -1
  263. package/dist/core/storage/modes.d.ts +17 -0
  264. package/dist/core/storage/modes.d.ts.map +1 -0
  265. package/dist/core/storage/modes.js +47 -0
  266. package/dist/core/storage/process-log.d.ts.map +1 -1
  267. package/dist/core/storage/process-log.js +3 -2
  268. package/dist/core/storage/receipts.d.ts.map +1 -1
  269. package/dist/core/storage/receipts.js +4 -3
  270. package/dist/core/storage/segments.d.ts.map +1 -1
  271. package/dist/core/storage/segments.js +7 -6
  272. package/dist/core/supervisor/hook-health.d.ts +2 -1
  273. package/dist/core/supervisor/hook-health.d.ts.map +1 -1
  274. package/dist/core/supervisor/hook-health.js +4 -3
  275. package/dist/core/supervisor/service.d.ts.map +1 -1
  276. package/dist/core/supervisor/service.js +7 -6
  277. package/dist/core/work/state.d.ts.map +1 -1
  278. package/dist/core/work/state.js +8 -7
  279. package/dist/core/workflow/adapters.d.ts +7 -0
  280. package/dist/core/workflow/adapters.d.ts.map +1 -1
  281. package/dist/core/workflow/adapters.js +9 -0
  282. package/dist/core/workflow/approvals.d.ts.map +1 -1
  283. package/dist/core/workflow/approvals.js +6 -5
  284. package/dist/core/workflow/billing.d.ts.map +1 -1
  285. package/dist/core/workflow/billing.js +33 -4
  286. package/dist/core/workflow/durable-record.d.ts.map +1 -1
  287. package/dist/core/workflow/durable-record.js +4 -3
  288. package/dist/core/workflow/engine.d.ts.map +1 -1
  289. package/dist/core/workflow/engine.js +30 -1
  290. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  291. package/dist/core/workflow/live-session-v3.js +2 -3
  292. package/dist/core/workflow/run-state.d.ts.map +1 -1
  293. package/dist/core/workflow/run-state.js +3 -2
  294. package/dist/core/workflow/sandbox-projection.d.ts +13 -2
  295. package/dist/core/workflow/sandbox-projection.d.ts.map +1 -1
  296. package/dist/core/workflow/sandbox-projection.js +23 -0
  297. package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
  298. package/dist/core/workflow/spawn-claude.js +6 -1
  299. package/dist/core/workflow/spawn-codex.d.ts +2 -0
  300. package/dist/core/workflow/spawn-codex.d.ts.map +1 -1
  301. package/dist/core/workflow/spawn-codex.js +20 -1
  302. package/dist/core/workflow/spawn-cursor.d.ts.map +1 -1
  303. package/dist/core/workflow/spawn-cursor.js +6 -1
  304. package/dist/core/workflow/spawn-opencode.d.ts +36 -0
  305. package/dist/core/workflow/spawn-opencode.d.ts.map +1 -0
  306. package/dist/core/workflow/spawn-opencode.js +135 -0
  307. package/dist/core/workflow/transcript.d.ts.map +1 -1
  308. package/dist/core/workflow/transcript.js +3 -2
  309. package/dist/core/workflow/types.d.ts +47 -2
  310. package/dist/core/workflow/types.d.ts.map +1 -1
  311. package/dist/core/workflow/worker-access.d.ts +92 -0
  312. package/dist/core/workflow/worker-access.d.ts.map +1 -0
  313. package/dist/core/workflow/worker-access.js +450 -0
  314. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  315. package/dist/core/workflow/workspaces/leases.js +5 -4
  316. package/dist/core/workflow/workspaces/local-git.d.ts.map +1 -1
  317. package/dist/core/workflow/workspaces/local-git.js +3 -2
  318. package/dist/core/workflow/workspaces/paths.d.ts.map +1 -1
  319. package/dist/core/workflow/workspaces/paths.js +2 -1
  320. package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
  321. package/dist/core/workflow/workspaces/state.js +10 -9
  322. package/dist/lazy-commands.js +8 -1
  323. package/dist/lib/agent-browser/client.d.ts +9 -0
  324. package/dist/lib/agent-browser/client.d.ts.map +1 -1
  325. package/dist/lib/agent-browser/client.js +13 -0
  326. package/dist/lib/browser/batch-steps.d.ts +18 -0
  327. package/dist/lib/browser/batch-steps.d.ts.map +1 -0
  328. package/dist/lib/browser/batch-steps.js +82 -0
  329. package/dist/lib/browser/client.d.ts +35 -1
  330. package/dist/lib/browser/client.d.ts.map +1 -1
  331. package/dist/lib/browser/client.js +117 -8
  332. package/dist/lib/browser/collect/collector.d.ts +99 -0
  333. package/dist/lib/browser/collect/collector.d.ts.map +1 -0
  334. package/dist/lib/browser/collect/collector.js +202 -0
  335. package/dist/lib/browser/collect/fields.d.ts +31 -0
  336. package/dist/lib/browser/collect/fields.d.ts.map +1 -0
  337. package/dist/lib/browser/collect/fields.js +75 -0
  338. package/dist/lib/browser/collect/index.d.ts +6 -0
  339. package/dist/lib/browser/collect/index.d.ts.map +1 -0
  340. package/dist/lib/browser/collect/index.js +5 -0
  341. package/dist/lib/browser/collect/page-driver.d.ts +14 -0
  342. package/dist/lib/browser/collect/page-driver.d.ts.map +1 -0
  343. package/dist/lib/browser/collect/page-driver.js +306 -0
  344. package/dist/lib/browser/collect/presets.d.ts +52 -0
  345. package/dist/lib/browser/collect/presets.d.ts.map +1 -0
  346. package/dist/lib/browser/collect/presets.js +176 -0
  347. package/dist/lib/browser/collect/scroll-plan.d.ts +85 -0
  348. package/dist/lib/browser/collect/scroll-plan.d.ts.map +1 -0
  349. package/dist/lib/browser/collect/scroll-plan.js +118 -0
  350. package/dist/lib/browser/identity.d.ts +25 -0
  351. package/dist/lib/browser/identity.d.ts.map +1 -0
  352. package/dist/lib/browser/identity.js +66 -0
  353. package/dist/lib/browser/index.d.ts +3 -2
  354. package/dist/lib/browser/index.d.ts.map +1 -1
  355. package/dist/lib/browser/index.js +2 -1
  356. package/dist/lib/browser/launch-args.d.ts +26 -0
  357. package/dist/lib/browser/launch-args.d.ts.map +1 -1
  358. package/dist/lib/browser/launch-args.js +41 -1
  359. package/dist/lib/browser/page-review-judge.d.ts +2 -0
  360. package/dist/lib/browser/page-review-judge.d.ts.map +1 -1
  361. package/dist/lib/browser/page-review-judge.js +13 -0
  362. package/dist/lib/browser/qa-run-contracts.d.ts +10 -0
  363. package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -1
  364. package/dist/lib/browser/qa-run.d.ts.map +1 -1
  365. package/dist/lib/browser/qa-run.js +1 -0
  366. package/dist/lib/browser/user-agent.d.ts +53 -0
  367. package/dist/lib/browser/user-agent.d.ts.map +1 -0
  368. package/dist/lib/browser/user-agent.js +79 -0
  369. package/dist/lib/browser/windows-chrome.d.ts +59 -0
  370. package/dist/lib/browser/windows-chrome.d.ts.map +1 -0
  371. package/dist/lib/browser/windows-chrome.js +179 -0
  372. package/dist/lib/claude-desktop-share.d.ts +136 -0
  373. package/dist/lib/claude-desktop-share.d.ts.map +1 -0
  374. package/dist/lib/claude-desktop-share.js +394 -0
  375. package/dist/lib/disk-usage.d.ts +50 -0
  376. package/dist/lib/disk-usage.d.ts.map +1 -0
  377. package/dist/lib/disk-usage.js +303 -0
  378. package/dist/lib/docs-lint.d.ts +6 -0
  379. package/dist/lib/docs-lint.d.ts.map +1 -1
  380. package/dist/lib/docs-lint.js +8 -3
  381. package/dist/lib/docs-metadata-managed.d.ts +1 -0
  382. package/dist/lib/docs-metadata-managed.d.ts.map +1 -1
  383. package/dist/lib/docs-metadata-managed.js +17 -1
  384. package/dist/lib/guarded-remove.d.ts +34 -0
  385. package/dist/lib/guarded-remove.d.ts.map +1 -0
  386. package/dist/lib/guarded-remove.js +310 -0
  387. package/dist/lib/identities/assume.d.ts.map +1 -1
  388. package/dist/lib/identities/assume.js +4 -9
  389. package/dist/lib/instructions/apply.d.ts.map +1 -1
  390. package/dist/lib/instructions/apply.js +2 -0
  391. package/dist/lib/instructions/templates.js +8 -8
  392. package/dist/lib/pace/index.d.ts +2 -0
  393. package/dist/lib/pace/index.d.ts.map +1 -0
  394. package/dist/lib/pace/index.js +1 -0
  395. package/dist/lib/pace/pace.d.ts +95 -0
  396. package/dist/lib/pace/pace.d.ts.map +1 -0
  397. package/dist/lib/pace/pace.js +313 -0
  398. package/dist/lib/tunnel/error-page.d.ts +1 -1
  399. package/dist/lib/tunnel/error-page.d.ts.map +1 -1
  400. package/dist/lib/tunnel/error-page.js +19 -8
  401. package/dist/lib/tunnel/forward-headers.d.ts +11 -0
  402. package/dist/lib/tunnel/forward-headers.d.ts.map +1 -0
  403. package/dist/lib/tunnel/forward-headers.js +17 -0
  404. package/dist/lib/tunnel/gate.js +34 -10
  405. package/dist/lib/tunnel/path-scope.d.ts +22 -0
  406. package/dist/lib/tunnel/path-scope.d.ts.map +1 -0
  407. package/dist/lib/tunnel/path-scope.js +62 -0
  408. package/dist/lib/tunnel/state.d.ts +5 -0
  409. package/dist/lib/tunnel/state.d.ts.map +1 -1
  410. package/dist/lib/tunnel/state.js +17 -3
  411. package/dist/lib/webview/index.d.ts +2 -0
  412. package/dist/lib/webview/index.d.ts.map +1 -0
  413. package/dist/lib/webview/index.js +1 -0
  414. package/dist/lib/webview/webview.d.ts +116 -0
  415. package/dist/lib/webview/webview.d.ts.map +1 -0
  416. package/dist/lib/webview/webview.js +289 -0
  417. package/opencode-plugin/package.json +19 -0
  418. package/opencode-plugin/src/index.ts +791 -0
  419. package/package.json +16 -4
  420. package/schemas/config.schema.json +104 -0
  421. package/schemas/event-v3.schema.json +164 -0
  422. package/src/commander.ts +26 -0
  423. package/src/commands/agents.ts +47 -18
  424. package/src/commands/artifacts.ts +171 -19
  425. package/src/commands/browse-ai.ts +8 -0
  426. package/src/commands/browse.ts +570 -48
  427. package/src/commands/checkpoint.ts +7 -9
  428. package/src/commands/claude-desktop.ts +61 -0
  429. package/src/commands/deinit.ts +9 -4
  430. package/src/commands/disk.ts +114 -0
  431. package/src/commands/docs.ts +2 -0
  432. package/src/commands/doctor.ts +63 -3
  433. package/src/commands/fetch.ts +14 -0
  434. package/src/commands/files.ts +93 -2
  435. package/src/commands/init.ts +334 -122
  436. package/src/commands/instructions.ts +8 -4
  437. package/src/commands/ledger-v3.ts +2 -1
  438. package/src/commands/rm.ts +115 -0
  439. package/src/commands/servers.ts +506 -0
  440. package/src/commands/tunnel.ts +102 -2
  441. package/src/commands/webview.ts +159 -0
  442. package/src/core/adapter.ts +102 -1
  443. package/src/core/adapters/attestation.ts +3 -2
  444. package/src/core/adapters/profiles.ts +63 -1
  445. package/src/core/adapters/registry.ts +37 -0
  446. package/src/core/adapters/types.ts +10 -0
  447. package/src/core/agents/canonical-emit.ts +2 -5
  448. package/src/core/agents/cli.ts +26 -17
  449. package/src/core/agents/coord-client.ts +9 -3
  450. package/src/core/agents/render/session-context.ts +1 -0
  451. package/src/core/agents/rules/claim-conflict.ts +3 -8
  452. package/src/core/agents/rules/commit-conflict.ts +2 -7
  453. package/src/core/agents/rules/stop-hook.ts +3 -1
  454. package/src/core/agents/session-events.ts +120 -26
  455. package/src/core/agents/session-finalization-state-v3.ts +2 -1
  456. package/src/core/agents/session-finalizer-v3.ts +5 -4
  457. package/src/core/agents/session-name-display.ts +48 -0
  458. package/src/core/agents/state/heartbeat-reader.ts +7 -0
  459. package/src/core/agents/state/heartbeat-writer.ts +24 -2
  460. package/src/core/agents/state/live-coordination-view.ts +74 -0
  461. package/src/core/agents/state/live-coordination-writer.ts +3 -0
  462. package/src/core/agents/state/stale-sweep.ts +2 -9
  463. package/src/core/agents/turn-changes.ts +97 -0
  464. package/src/core/artifacts/delivery-card.ts +12 -3
  465. package/src/core/artifacts/index.ts +701 -47
  466. package/src/core/config.ts +206 -4
  467. package/src/core/context/index.ts +2 -1
  468. package/src/core/conversations/archive.ts +4 -3
  469. package/src/core/diagnostics/bundle.ts +5 -3
  470. package/src/core/events/legacy-storage/canary.ts +5 -4
  471. package/src/core/events/legacy-storage/compression.ts +2 -1
  472. package/src/core/events/v3/adapter-id.ts +29 -1
  473. package/src/core/events/v3/authority-outbox.ts +2 -1
  474. package/src/core/events/v3/bootstrap.ts +5 -4
  475. package/src/core/events/v3/capabilities.ts +17 -0
  476. package/src/core/events/v3/contract.ts +9 -1
  477. package/src/core/events/v3/control-witness.ts +3 -2
  478. package/src/core/events/v3/coordination-transaction-recovery.ts +4 -3
  479. package/src/core/events/v3/fingerprint-keys.ts +7 -6
  480. package/src/core/events/v3/generated.ts +1 -1
  481. package/src/core/events/v3/live-feed.ts +5 -4
  482. package/src/core/events/v3/producers/command-recorder.ts +8 -6
  483. package/src/core/events/v3/producers/coordination-recorder.ts +8 -7
  484. package/src/core/events/v3/producers/diagnostic-summaries.ts +5 -4
  485. package/src/core/events/v3/producers/hook-base.ts +11 -4
  486. package/src/core/events/v3/producers/hook.ts +19 -1
  487. package/src/core/events/v3/producers/intake.ts +18 -6
  488. package/src/core/events/v3/producers/recorder.ts +139 -114
  489. package/src/core/events/v3/projection.ts +11 -1
  490. package/src/core/events/v3/recovery.ts +4 -3
  491. package/src/core/events/v3/support-storage/inventory.ts +2 -1
  492. package/src/core/events/v3/support-storage/maintenance.ts +8 -3
  493. package/src/core/events/v3/support-storage/pack-reader.ts +4 -3
  494. package/src/core/events/v3/support-storage/pack-writer.ts +6 -5
  495. package/src/core/events/v3/tool-line-changes.ts +139 -0
  496. package/src/core/events/v3/writer.ts +8 -7
  497. package/src/core/governor/planning.ts +6 -5
  498. package/src/core/governor/service.ts +12 -11
  499. package/src/core/governor/state.ts +7 -6
  500. package/src/core/guard/evaluator.ts +1 -0
  501. package/src/core/guard/storage.ts +3 -2
  502. package/src/core/hooks/adapter/behaviors/claude-code.ts +33 -0
  503. package/src/core/hooks/adapter/behaviors/codex.ts +96 -0
  504. package/src/core/hooks/adapter/behaviors/cursor.ts +37 -0
  505. package/src/core/hooks/adapter/behaviors/index.ts +31 -0
  506. package/src/core/hooks/adapter/behaviors/openclaw.ts +36 -0
  507. package/src/core/hooks/adapter/behaviors/opencode.ts +36 -0
  508. package/src/core/hooks/adapter/behaviors/types.ts +110 -0
  509. package/src/core/hooks/adapter/detect.ts +2 -3
  510. package/src/core/hooks/adapter/events.ts +72 -1
  511. package/src/core/hooks/adapter/opencode-plugin.ts +177 -0
  512. package/src/core/hooks/adapter/output.ts +8 -1
  513. package/src/core/hooks/adapter/runtime-telemetry.ts +3 -1
  514. package/src/core/hooks/adapter/wiring.ts +198 -16
  515. package/src/core/hooks/cli.ts +776 -539
  516. package/src/core/hooks/effects/image-capture.ts +2 -1
  517. package/src/core/hooks/prompt-context/contract.ts +1 -0
  518. package/src/core/hooks/resolve/transcript.ts +42 -5
  519. package/src/core/hooks/run-markers.ts +132 -0
  520. package/src/core/hooks/session-name-presence.ts +10 -3
  521. package/src/core/hooks/shell-waiter.ts +166 -0
  522. package/src/core/resources/service.ts +5 -4
  523. package/src/core/semantic/review.ts +5 -4
  524. package/src/core/semantic/service.ts +15 -14
  525. package/src/core/semantic/storage.ts +5 -4
  526. package/src/core/servers/index.ts +712 -0
  527. package/src/core/servers/net.ts +283 -0
  528. package/src/core/servers/tunnels.ts +39 -0
  529. package/src/core/storage/atomic-json.ts +7 -3
  530. package/src/core/storage/builtins.ts +1 -0
  531. package/src/core/storage/durable-history.ts +6 -5
  532. package/src/core/storage/maintenance-providers.ts +2 -1
  533. package/src/core/storage/maintenance.ts +7 -6
  534. package/src/core/storage/metrics.ts +5 -1
  535. package/src/core/storage/modes.ts +53 -0
  536. package/src/core/storage/process-log.ts +3 -2
  537. package/src/core/storage/receipts.ts +4 -3
  538. package/src/core/storage/segments.ts +7 -6
  539. package/src/core/supervisor/hook-health.ts +4 -4
  540. package/src/core/supervisor/service.ts +7 -6
  541. package/src/core/work/state.ts +8 -7
  542. package/src/core/workflow/adapters.ts +15 -0
  543. package/src/core/workflow/approvals.ts +6 -5
  544. package/src/core/workflow/billing.ts +34 -4
  545. package/src/core/workflow/durable-record.ts +4 -3
  546. package/src/core/workflow/engine.ts +38 -1
  547. package/src/core/workflow/live-session-v3.ts +2 -3
  548. package/src/core/workflow/run-state.ts +3 -2
  549. package/src/core/workflow/sandbox-projection.ts +38 -2
  550. package/src/core/workflow/spawn-claude.ts +5 -1
  551. package/src/core/workflow/spawn-codex.ts +18 -1
  552. package/src/core/workflow/spawn-cursor.ts +5 -1
  553. package/src/core/workflow/spawn-opencode.ts +153 -0
  554. package/src/core/workflow/transcript.ts +3 -2
  555. package/src/core/workflow/types.ts +62 -2
  556. package/src/core/workflow/worker-access.ts +525 -0
  557. package/src/core/workflow/workspaces/leases.ts +5 -4
  558. package/src/core/workflow/workspaces/local-git.ts +3 -2
  559. package/src/core/workflow/workspaces/paths.ts +2 -1
  560. package/src/core/workflow/workspaces/state.ts +10 -9
  561. package/src/lazy-commands.ts +11 -1
  562. package/src/lib/agent-browser/client.ts +18 -0
  563. package/src/lib/browser/batch-steps.ts +79 -0
  564. package/src/lib/browser/client.ts +147 -9
  565. package/src/lib/browser/collect/collector.ts +306 -0
  566. package/src/lib/browser/collect/fields.ts +87 -0
  567. package/src/lib/browser/collect/index.ts +47 -0
  568. package/src/lib/browser/collect/page-driver.ts +327 -0
  569. package/src/lib/browser/collect/presets.ts +237 -0
  570. package/src/lib/browser/collect/scroll-plan.ts +179 -0
  571. package/src/lib/browser/identity.ts +64 -0
  572. package/src/lib/browser/index.ts +16 -1
  573. package/src/lib/browser/launch-args.ts +53 -1
  574. package/src/lib/browser/page-review-judge.ts +16 -0
  575. package/src/lib/browser/qa-run-contracts.ts +11 -0
  576. package/src/lib/browser/qa-run.ts +1 -0
  577. package/src/lib/browser/user-agent.ts +130 -0
  578. package/src/lib/browser/windows-chrome.ts +227 -0
  579. package/src/lib/claude-desktop-share.ts +511 -0
  580. package/src/lib/disk-usage.ts +347 -0
  581. package/src/lib/docs-lint.ts +8 -3
  582. package/src/lib/docs-metadata-managed.ts +21 -0
  583. package/src/lib/guarded-remove.ts +376 -0
  584. package/src/lib/identities/assume.ts +7 -7
  585. package/src/lib/instructions/apply.ts +2 -0
  586. package/src/lib/instructions/templates.ts +8 -8
  587. package/src/lib/pace/index.ts +14 -0
  588. package/src/lib/pace/pace.ts +370 -0
  589. package/src/lib/tunnel/error-page.ts +25 -9
  590. package/src/lib/tunnel/forward-headers.ts +16 -0
  591. package/src/lib/tunnel/gate.ts +39 -10
  592. package/src/lib/tunnel/path-scope.ts +73 -0
  593. package/src/lib/tunnel/state.ts +20 -3
  594. package/src/lib/webview/index.ts +13 -0
  595. package/src/lib/webview/webview.ts +457 -0
@@ -2,8 +2,11 @@ import { createHash, randomUUID } from "node:crypto";
2
2
  import { chmodSync, closeSync, existsSync, fsyncSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
3
3
  import { hostname } from "node:os";
4
4
  import { basename, join, resolve } from "node:path";
5
+ import { normalizeAdapter } from "../../../adapter.js";
6
+ import { adapterBehavior } from "../../../hooks/adapter/behaviors/index.js";
5
7
  import { extractBashCommand } from "../../../hooks/adapter/parse.js";
6
- import { discoverCodexSessionTranscript, readRuntimeContextTelemetry, readRuntimeTuning, } from "../../../hooks/adapter/runtime-telemetry.js";
8
+ import { readRuntimeContextTelemetry, readRuntimeTuning, } from "../../../hooks/adapter/runtime-telemetry.js";
9
+ import { stateDirMode, stateFileMode, stateModeTooOpen } from "../../../storage/modes.js";
7
10
  import { fsyncParentDirectory } from "../../../workflow/durable-record.js";
8
11
  import { acquireNoClobberLease } from "../../../workflow/workspaces/leases.js";
9
12
  import { EVENT_ADAPTER_IDS_V3 } from "../adapter-id.js";
@@ -18,6 +21,7 @@ import { attestationIdV3, clockIdV3, delegationIdV3, eventIdV3, generationIdV3,
18
21
  import { readLedgerV3 } from "../reader.js";
19
22
  import { effectiveRuntimeTelemetryCapabilitiesV3, } from "../runtime-telemetry-capabilities.js";
20
23
  import { closeSpanStateV3, openSpanStateV3, recoverSpanUpperBoundV3, } from "../span-state.js";
24
+ import { prepareToolLineChanges } from "../tool-line-changes.js";
21
25
  import { extractTurnTelemetryV3, } from "../turn-telemetry.js";
22
26
  import { assertEventV3, validateEventV3 } from "../validate.js";
23
27
  import { EVENT_V3_LEDGER_RELATIVE_ROOT, writeEventV3, } from "../writer.js";
@@ -38,17 +42,6 @@ const ACTIVE_RUNTIME_CONTEXT_PROBE_INTERVAL_MS = 15_000;
38
42
  const STOP_RUNTIME_CONTEXT_RETRY_DELAYS_MS = [75, 175];
39
43
  /** Finalization is off the interactive hook path; briefly cover Codex's delayed transcript flush. */
40
44
  const APPROVED_END_RUNTIME_CONTEXT_RETRY_DELAYS_MS = [0, 250, 250];
41
- /**
42
- * Adapters whose turn-boundary recovery and mid-flight onboarding are enabled.
43
- * Kept in code, outside the digested capability profiles, so tuning recovery
44
- * never changes an adapter capability digest (ADR 0078).
45
- */
46
- const RECOVERY_ENABLED_ADAPTERS = new Set([
47
- "claude-code",
48
- "codex",
49
- "cursor",
50
- "openclaw",
51
- ]);
52
45
  const STATE_LEASE_RETRY_ATTEMPTS = 8;
53
46
  const STATE_LEASE_RETRY_DELAY_MS = 25;
54
47
  /**
@@ -127,11 +120,11 @@ function sessionHashForSignal(input, context) {
127
120
  if (nativeSession !== undefined) {
128
121
  return normalizeNativeIdV3(context, `${input.adapter}.session`, nativeSession);
129
122
  }
130
- // Cursor carries native session identity only on its start signal. Later
131
- // hooks may still have an exact coordination instance, so reuse its single
132
- // live producer authority instead of hashing the instance into a second
133
- // state path. Ambiguous or absent matches keep the fail-closed fallback.
134
- if (input.adapter === "cursor") {
123
+ // Some adapters carry native session identity only on their start signal.
124
+ // Later hooks may still have an exact coordination instance, so reuse its
125
+ // single live producer authority instead of hashing the instance into a
126
+ // second state path. Ambiguous or absent matches keep the fail-closed fallback.
127
+ if (adapterBehavior(input.adapter).sessionIdentityOnStartOnly) {
135
128
  const matches = listHookProducerStateRecordsV3(input.coordRoot).filter(({ state }) => state.adapter === input.adapter && state.instance_id === input.instance_id);
136
129
  if (matches.length === 1) {
137
130
  const name = basename(matches[0].path);
@@ -298,6 +291,7 @@ function sleepSync(milliseconds) {
298
291
  }
299
292
  /** The pre-spool body of the recorder: requires the session's state lease to be held. */
300
293
  function processHookSignalLocked(control, input, sessionHash, path) {
294
+ const behavior = adapterBehavior(input.adapter);
301
295
  const rootId = control.genesis.event.scope.root_id;
302
296
  const epochId = control.genesis.profile.privacy_key_epoch;
303
297
  const boundaryEventId = control.state === "candidate"
@@ -329,14 +323,15 @@ function processHookSignalLocked(control, input, sessionHash, path) {
329
323
  state.capability_profile !== adapterCapabilityProfileDigestV3(input.adapter))) {
330
324
  throw new Error("V3 producer state authority does not match the active boundary");
331
325
  }
332
- if (state?.adapter === "cursor" &&
326
+ if (state &&
327
+ behavior.tracksExecutionMode &&
333
328
  input.payload.cursor_mode &&
334
329
  input.payload.cursor_mode !== "unknown") {
335
330
  if (!state.cursor_mode || state.cursor_mode === "unknown") {
336
331
  state.cursor_mode = input.payload.cursor_mode;
337
332
  }
338
333
  else if (state.cursor_mode !== input.payload.cursor_mode) {
339
- throw new Error("Cursor execution mode changed within one V3 generation");
334
+ throw new Error("Execution mode changed within one V3 generation");
340
335
  }
341
336
  }
342
337
  let recovered;
@@ -375,7 +370,7 @@ function processHookSignalLocked(control, input, sessionHash, path) {
375
370
  // from the observer instance (that would split the real session).
376
371
  const nativeSessionIdentity = input.payload.session_id ?? input.payload.conversation_id ?? input.payload.agent_id;
377
372
  const onboardable = !state &&
378
- RECOVERY_ENABLED_ADAPTERS.has(input.adapter) &&
373
+ behavior.turnRecovery &&
379
374
  input.signal !== "session-end" &&
380
375
  nativeSessionIdentity !== undefined;
381
376
  if (!onboardable) {
@@ -407,16 +402,16 @@ function processHookSignalLocked(control, input, sessionHash, path) {
407
402
  instance_id: input.instance_id,
408
403
  signal: input.signal,
409
404
  session_hash: sessionHash,
410
- ...(input.adapter === "codex" ? codexMidFlightDiagnosticContext(input.payload) : {}),
405
+ ...(behavior.midFlightDiagnosticContext?.(input.payload) ?? {}),
411
406
  });
412
407
  }
413
408
  }
414
409
  const fingerprintContext = fingerprintContextV3(input.coordRoot, rootId, state.generation_id, state.privacy_epoch_id);
415
- const recoveryEnabled = RECOVERY_ENABLED_ADAPTERS.has(input.adapter);
410
+ const recoveryEnabled = behavior.turnRecovery;
416
411
  const nativeTid = input.payload.turn_id
417
412
  ? normalizeNativeIdV3(fingerprintContext, `${input.adapter}.turn`, input.payload.turn_id).replace(/^hid_/, "tid_")
418
413
  : undefined;
419
- const cursorPromptWithinOpenTurn = input.adapter === "cursor" &&
414
+ const cursorPromptWithinOpenTurn = behavior.promptContinuesOpenTurn &&
420
415
  input.signal === "user-prompt-submit" &&
421
416
  state.current_turn_id !== undefined &&
422
417
  state.current_turn_span !== undefined;
@@ -495,7 +490,29 @@ function processHookSignalLocked(control, input, sessionHash, path) {
495
490
  // their self-contained timing cannot drift by a millisecond.
496
491
  const eventClock = signalClock(input);
497
492
  if (input.signal === "after-agent-response") {
498
- if (input.adapter !== "cursor" ||
493
+ // Cursor Stop followups auto-submit without beforeSubmitPrompt, so they
494
+ // never open a turn. The first stop already closed the human turn.
495
+ // Later completed replies still fire afterAgentResponse; bind them to a
496
+ // derived remediation turn so Stop can consume the new ritual instead of
497
+ // looping on the frozen first terminal.
498
+ const ritualFromResponseEvent = behavior.completedResponseEvent === input.signal;
499
+ if (ritualFromResponseEvent &&
500
+ input.turn_ritual &&
501
+ (!state.current_turn_id || !state.current_turn_span)) {
502
+ commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintContext, {
503
+ stop_remediation: true,
504
+ });
505
+ writeProducerDiagnosticV3(input.coordRoot, "cursor_response_ritual_recovered_turn", {
506
+ adapter: input.adapter,
507
+ instance_id: input.instance_id,
508
+ generation_id: state.generation_id,
509
+ signal: input.signal,
510
+ reason: "no_open_turn",
511
+ turn_id: state.current_turn_id,
512
+ status_box_present_strict: input.turn_ritual.status_box_present_strict,
513
+ });
514
+ }
515
+ if (!ritualFromResponseEvent ||
499
516
  !state.current_turn_id ||
500
517
  !state.current_turn_span ||
501
518
  !input.turn_ritual) {
@@ -588,6 +605,7 @@ function processHookSignalLocked(control, input, sessionHash, path) {
588
605
  };
589
606
  state.spans.push(span);
590
607
  }
608
+ span.line_changes = prepareToolLineChanges(input.payload, input.payload.cwd ?? input.coordRoot);
591
609
  }
592
610
  else if (input.signal === "post-tool-use" || input.signal === "post-tool-use-failure") {
593
611
  span = sourceId
@@ -676,6 +694,22 @@ function processHookSignalLocked(control, input, sessionHash, path) {
676
694
  if (!sourceId)
677
695
  return { state: "ignored" };
678
696
  delegation = state.delegations.find((candidate) => candidate.source_id === sourceId);
697
+ if (delegation?.open_event_id) {
698
+ // SendMessage to a running background agent re-fires SubagentStart.
699
+ // The delegation is already open; a second agent.started is noise.
700
+ writeProducerDiagnosticV3(input.coordRoot, "duplicate_subagent_start_suppressed", {
701
+ adapter: input.adapter,
702
+ signal: input.signal,
703
+ reason: "delegation_already_open",
704
+ instance_id: input.instance_id,
705
+ session_hash: sessionHash,
706
+ generation_id: state.generation_id,
707
+ delegation_id: delegation.delegation_id,
708
+ payload: input.payload,
709
+ });
710
+ publishProducerState(input.coordRoot, path, state);
711
+ return { state: "ignored" };
712
+ }
679
713
  if (!delegation) {
680
714
  const opened = openSpanStateV3({
681
715
  span_id: spanIdV3(),
@@ -740,11 +774,11 @@ function processHookSignalLocked(control, input, sessionHash, path) {
740
774
  const turnTelemetry = input.signal === "stop" || input.signal === "stop-failure"
741
775
  ? turnTelemetryForTerminal(input, state, eventClock.observed_at)
742
776
  : undefined;
743
- const cursorToolChannelSupport = input.adapter === "cursor"
777
+ const cursorToolChannelSupport = behavior.tracksExecutionMode
744
778
  ? cursorToolChannelSupportV3(state.cursor_mode ?? "unknown")
745
779
  : undefined;
746
780
  const cursorToolChannelUnattested = (input.signal === "stop" || input.signal === "stop-failure") &&
747
- input.adapter === "cursor" &&
781
+ behavior.tracksExecutionMode &&
748
782
  cursorToolChannelSupport !== "unsupported" &&
749
783
  state.tool_call_count === 0;
750
784
  if (input.signal === "sub-agent-start" && delegation && !delegation.open_event_id) {
@@ -755,13 +789,14 @@ function processHookSignalLocked(control, input, sessionHash, path) {
755
789
  // Before the signal's own event: the tool call or turn that carries the
756
790
  // new effort already ran under it, so it must ride the new attestation.
757
791
  maybeAttestTuningChange(input, state, path, rootId);
758
- const cursorResponseRitual = input.adapter === "cursor" &&
792
+ const ritualArrivesSeparately = behavior.completedResponseEvent !== undefined;
793
+ const cursorResponseRitual = ritualArrivesSeparately &&
759
794
  (input.signal === "stop" || input.signal === "stop-failure") &&
760
795
  state.current_turn_id &&
761
796
  state.cursor_response_ritual?.turn_id === state.current_turn_id
762
797
  ? state.cursor_response_ritual
763
798
  : undefined;
764
- const terminalTurnRitual = input.adapter === "cursor" && (input.signal === "stop" || input.signal === "stop-failure")
799
+ const terminalTurnRitual = ritualArrivesSeparately && (input.signal === "stop" || input.signal === "stop-failure")
765
800
  ? cursorResponseRitual
766
801
  ? {
767
802
  status_box_present: cursorResponseRitual.status_box_present,
@@ -814,6 +849,7 @@ function processHookSignalLocked(control, input, sessionHash, path) {
814
849
  span_id: openingSpan?.span_id ?? closingSpan?.span_id,
815
850
  parent_span_id: openingSpan?.parent_span_id ?? closingSpan?.parent_span_id,
816
851
  terminal_span: terminalSpan,
852
+ tool_line_changes: span?.line_changes,
817
853
  harness_timing: state.turn_harness,
818
854
  turn_telemetry: turnTelemetry,
819
855
  caused_by: [
@@ -1232,8 +1268,8 @@ function commitRecoveredTurnCompleted(input, state, path, rootId, fingerprintCon
1232
1268
  assertEventV3(event);
1233
1269
  commitEventLocked(input, state, path, event);
1234
1270
  }
1235
- /** Open a derived turn for tools that arrive after their native turn closed. */
1236
- function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintContext) {
1271
+ /** Open a derived turn for signals that arrive after their native turn closed. */
1272
+ function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintContext, options) {
1237
1273
  const clock = signalClock(input);
1238
1274
  const span = openSpanStateV3({
1239
1275
  span_id: spanIdV3(),
@@ -1268,6 +1304,7 @@ function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintCon
1268
1304
  observed_at: clock.observed_at,
1269
1305
  monotonic_ns: orderedEventMonotonic(state, input.monotonic_ns),
1270
1306
  clock_id: state.clock_id,
1307
+ ...(options?.stop_remediation ? { stop_remediation: true } : {}),
1271
1308
  });
1272
1309
  if (event?.event_type !== "turn.started") {
1273
1310
  throw new Error("recovered tool turn start could not be normalized");
@@ -1478,7 +1515,8 @@ function maybeCommitActiveRuntimeContextObservation(input, state, path, rootId,
1478
1515
  }
1479
1516
  const nativeSessionId = input.payload.session_id ?? input.payload.conversation_id;
1480
1517
  const nativeTurnId = input.payload.turn_id ?? state.current_native_turn_id;
1481
- if (!nativeSessionId || (!nativeTurnId && input.adapter !== "cursor"))
1518
+ const behavior = adapterBehavior(input.adapter);
1519
+ if (!nativeSessionId || (!nativeTurnId && !behavior.nativeTurnIdOptional))
1482
1520
  return;
1483
1521
  const now = Date.now();
1484
1522
  const configuredInterval = input.runtimeTelemetryOptions?.activeContextProbeIntervalMs;
@@ -1504,21 +1542,20 @@ function maybeCommitActiveRuntimeContextObservation(input, state, path, rootId,
1504
1542
  commitActiveContextObservation(input, state, path, rootId, fingerprintContext, sourceEvent, native, nativeContextProvenance(input, state, native));
1505
1543
  return;
1506
1544
  }
1507
- if (input.adapter === "cursor" && state.cursor_mode === "cloud") {
1508
- publishProducerState(input.coordRoot, path, state);
1509
- return;
1510
- }
1511
- if (input.adapter === "openclaw") {
1545
+ // Runtime readers exist only for workflow adapters; an event-only adapter
1546
+ // has no transcript to read.
1547
+ const runtimeAdapter = normalizeAdapter(input.adapter);
1548
+ if (!runtimeAdapter || !behavior.runtimeContextAvailable(state.cursor_mode)) {
1512
1549
  publishProducerState(input.coordRoot, path, state);
1513
1550
  return;
1514
1551
  }
1515
1552
  const transcriptPath = runtimeTranscriptPath(input, state);
1516
- if (!transcriptPath && input.adapter !== "cursor") {
1553
+ if (!transcriptPath && !behavior.runtimeContextTranscriptOptional) {
1517
1554
  publishProducerState(input.coordRoot, path, state);
1518
1555
  return;
1519
1556
  }
1520
1557
  const runtime = readRuntimeContextTelemetry({
1521
- adapter: input.adapter,
1558
+ adapter: runtimeAdapter,
1522
1559
  session_id: nativeSessionId,
1523
1560
  ...(nativeTurnId ? { turn_id: nativeTurnId } : {}),
1524
1561
  ...(state.current_turn_span?.opened_at
@@ -1629,7 +1666,7 @@ function turnContextTarget(turnTerminal) {
1629
1666
  };
1630
1667
  }
1631
1668
  function queuePendingRuntimeContext(input, state, target, measurement, nativeTurnId) {
1632
- if (input.adapter !== "codex" ||
1669
+ if (!adapterBehavior(input.adapter).runtimeContextRetry ||
1633
1670
  !target ||
1634
1671
  measurement.state !== "expected_but_missing" ||
1635
1672
  !retryableRuntimeContextReason(measurement.reason)) {
@@ -1654,8 +1691,10 @@ function queuePendingRuntimeContext(input, state, target, measurement, nativeTur
1654
1691
  ].slice(-PENDING_RUNTIME_CONTEXT_CAP);
1655
1692
  }
1656
1693
  function reconcilePendingRuntimeContexts(input, state, path, rootId, fingerprintContext, options = {}) {
1657
- if (state.adapter !== "codex" || !state.pending_runtime_contexts?.length)
1694
+ if (!adapterBehavior(state.adapter).runtimeContextRetry ||
1695
+ !state.pending_runtime_contexts?.length) {
1658
1696
  return;
1697
+ }
1659
1698
  for (const pending of [...state.pending_runtime_contexts]) {
1660
1699
  const runtime = readRuntimeContextTelemetry({
1661
1700
  adapter: "codex",
@@ -1703,8 +1742,18 @@ function reconcilePendingRuntimeContexts(input, state, path, rootId, fingerprint
1703
1742
  publishProducerState(input.coordRoot, path, state);
1704
1743
  }
1705
1744
  function reconcilePendingRuntimeContextsBeforeApprovedEnd(input, state, path, rootId, fingerprintContext) {
1706
- if (state.adapter !== "codex" || !state.pending_runtime_contexts?.length)
1745
+ if (!adapterBehavior(state.adapter).runtimeContextRetry ||
1746
+ !state.pending_runtime_contexts?.length) {
1707
1747
  return;
1748
+ }
1749
+ // Context reconciliation continues the hook boot's sequence, even when the
1750
+ // finalizer drives it. Recover that producer identity from its validated
1751
+ // session start instead of attaching the sequence to the finalizer's name.
1752
+ const ledger = readLedgerV3(input.coordRoot, { authority: input.mode });
1753
+ const start = ledger.events.find(({ event }) => event.event_id === state.started_event_id)?.event;
1754
+ if (!ledger.complete || !start || start.producer.boot_id !== state.boot_id) {
1755
+ throw new Error("event_v3_finalizer_context_producer_unavailable");
1756
+ }
1708
1757
  for (const [index, delayMs] of APPROVED_END_RUNTIME_CONTEXT_RETRY_DELAYS_MS.entries()) {
1709
1758
  if (delayMs > 0)
1710
1759
  sleepSync(delayMs);
@@ -1715,7 +1764,7 @@ function reconcilePendingRuntimeContextsBeforeApprovedEnd(input, state, path, ro
1715
1764
  payload: { raw: {} },
1716
1765
  adapter: state.adapter,
1717
1766
  instance_id: state.instance_id,
1718
- producer_id: "prd_agent-finalizer",
1767
+ producer_id: start.producer.producer_id,
1719
1768
  build_id: input.build_id,
1720
1769
  platform: input.platform,
1721
1770
  observed_at: new Date().toISOString(),
@@ -1735,18 +1784,20 @@ function retryableRuntimeContextReason(reason) {
1735
1784
  }
1736
1785
  function turnTelemetryForTerminal(input, state, observedAt) {
1737
1786
  const native = extractTurnTelemetryV3(input.adapter, input.payload.raw, observedAt);
1787
+ const behavior = adapterBehavior(input.adapter);
1738
1788
  if (native.context.state === "observed")
1739
1789
  return native;
1740
- if (input.adapter === "openclaw")
1790
+ const runtimeAdapter = normalizeAdapter(input.adapter);
1791
+ if (!runtimeAdapter || behavior.nativeTelemetryOnly)
1741
1792
  return native;
1742
- if (input.adapter === "cursor" && state.cursor_mode === "cloud") {
1793
+ if (!behavior.runtimeContextAvailable(state.cursor_mode)) {
1743
1794
  return {
1744
1795
  ...native,
1745
1796
  context: { state: "unsupported", capability: "context_usage" },
1746
1797
  };
1747
1798
  }
1748
1799
  const request = {
1749
- adapter: input.adapter,
1800
+ adapter: runtimeAdapter,
1750
1801
  session_id: input.payload.session_id ?? input.payload.conversation_id,
1751
1802
  turn_id: input.payload.turn_id ?? state.current_native_turn_id,
1752
1803
  transcript_path: runtimeTranscriptPath(input, state),
@@ -1756,7 +1807,7 @@ function turnTelemetryForTerminal(input, state, observedAt) {
1756
1807
  let runtime = readRuntimeContextTelemetry(request, input.runtimeTelemetryOptions);
1757
1808
  if (runtime.bytes_read > 0)
1758
1809
  recordRuntimeTelemetryTiming(state, runtime.io_duration_ms);
1759
- if (input.adapter === "codex" &&
1810
+ if (behavior.runtimeContextRetry &&
1760
1811
  runtime.state === "partial" &&
1761
1812
  retryableRuntimeContextReason(runtime.reason)) {
1762
1813
  for (const delayMs of STOP_RUNTIME_CONTEXT_RETRY_DELAYS_MS) {
@@ -1788,26 +1839,27 @@ function turnTelemetryForTerminal(input, state, observedAt) {
1788
1839
  * events receive only numeric telemetry and an opaque source witness.
1789
1840
  */
1790
1841
  function runtimeTranscriptPath(input, state) {
1791
- if (input.adapter !== "codex")
1842
+ const discover = adapterBehavior(input.adapter).discoverTranscript;
1843
+ if (!discover)
1792
1844
  return input.payload.transcript_path;
1793
1845
  const nativeSessionId = input.payload.session_id ?? input.payload.conversation_id;
1794
1846
  if (!nativeSessionId)
1795
1847
  return input.payload.transcript_path;
1796
1848
  const supplied = input.payload.transcript_path;
1797
1849
  if (supplied) {
1798
- const verified = discoverCodexSessionTranscript(nativeSessionId, supplied, input.runtimeTelemetryOptions);
1850
+ const verified = discover(nativeSessionId, supplied, input.runtimeTelemetryOptions);
1799
1851
  if (verified)
1800
1852
  state.runtime_transcript_path = verified;
1801
1853
  // Preserve a supplied mismatch so the typed reader reports it honestly.
1802
1854
  return verified ?? supplied;
1803
1855
  }
1804
1856
  if (state.runtime_transcript_path) {
1805
- const verified = discoverCodexSessionTranscript(nativeSessionId, state.runtime_transcript_path, input.runtimeTelemetryOptions);
1857
+ const verified = discover(nativeSessionId, state.runtime_transcript_path, input.runtimeTelemetryOptions);
1806
1858
  if (verified)
1807
1859
  return verified;
1808
1860
  state.runtime_transcript_path = undefined;
1809
1861
  }
1810
- const discovered = discoverCodexSessionTranscript(nativeSessionId, undefined, input.runtimeTelemetryOptions);
1862
+ const discovered = discover(nativeSessionId, undefined, input.runtimeTelemetryOptions);
1811
1863
  if (discovered)
1812
1864
  state.runtime_transcript_path = discovered;
1813
1865
  return discovered;
@@ -1889,12 +1941,13 @@ function maybeAttestTuningChange(input, state, path, rootId) {
1889
1941
  let candidate;
1890
1942
  let attestationSource = "native";
1891
1943
  let sourceEvent = `${input.adapter}.effort-payload`;
1892
- if (input.adapter === "claude-code" || input.adapter === "cursor") {
1944
+ const behavior = adapterBehavior(input.adapter);
1945
+ if (behavior.effortAttestation === "payload") {
1893
1946
  if (!input.payload.effort)
1894
1947
  return;
1895
1948
  candidate = { effort: input.payload.effort };
1896
1949
  }
1897
- else if (input.adapter === "codex" &&
1950
+ else if (behavior.effortAttestation === "rollout-probe" &&
1898
1951
  (input.signal === "stop" ||
1899
1952
  // Early probe: without it, a Codex card shows no effort until the first
1900
1953
  // turn terminal. One rollout read per turn while effort is unknown.
@@ -1936,9 +1989,9 @@ function maybeAttestTuningChange(input, state, path, rootId) {
1936
1989
  if (baseline.effort === next.effort && (candidate.speed ?? baseline.speed) === baseline.speed) {
1937
1990
  return;
1938
1991
  }
1939
- // CC change detection rides the payload; the paired transcript row also
1940
- // carries speed and the (possibly swapped) model, so refresh from it.
1941
- if (input.adapter === "claude-code") {
1992
+ // Payload change detection rides the payload; the paired transcript row
1993
+ // also carries speed and the (possibly swapped) model, so refresh from it.
1994
+ if (behavior.transcriptTuningRefresh) {
1942
1995
  const runtime = readRuntimeTuning({
1943
1996
  adapter: "claude-code",
1944
1997
  transcript_path: input.payload.transcript_path,
@@ -2074,11 +2127,7 @@ function commitRuntimeAttestationChange(input, state, path, rootId, change) {
2074
2127
  commitEventLocked(input, state, path, event);
2075
2128
  }
2076
2129
  function modelProviderFor(adapter) {
2077
- if (adapter === "claude-code")
2078
- return "anthropic";
2079
- if (adapter === "codex")
2080
- return "openai";
2081
- return adapter;
2130
+ return adapterBehavior(adapter).modelProvider;
2082
2131
  }
2083
2132
  function recordRuntimeTelemetryTiming(state, durationMs) {
2084
2133
  const duration = Math.max(0, Math.ceil(durationMs));
@@ -2277,39 +2326,11 @@ function buildMidFlightSessionStart(input, state, rootId, cursorPromptBootstrap
2277
2326
  * so it is a high-confidence session boundary rather than degraded recovery.
2278
2327
  */
2279
2328
  function isCursorPromptBootstrap(input) {
2280
- return (input.adapter === "cursor" &&
2329
+ return (adapterBehavior(input.adapter).promptMayPrecedeSessionStart &&
2281
2330
  input.signal === "user-prompt-submit" &&
2282
2331
  (input.payload.conversation_id !== undefined || input.payload.session_id !== undefined) &&
2283
2332
  input.payload.turn_id !== undefined);
2284
2333
  }
2285
- /** Privacy-safe environment and recovery provenance for Codex mid-flight
2286
- * onboarding. WSLENV values are never recorded, only normalized variable
2287
- * names, and the native session identifier itself remains fingerprinted. */
2288
- export function codexMidFlightDiagnosticContext(payload, env = process.env) {
2289
- const wslenv = env.WSLENV?.trim() ?? "";
2290
- const wslenvNames = [
2291
- ...new Set(wslenv
2292
- .split(":")
2293
- .map((entry) => entry.split("/", 1)[0]?.trim() ?? "")
2294
- .filter((name) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(name))),
2295
- ]
2296
- .sort()
2297
- .join(":")
2298
- .slice(0, 512);
2299
- const identityRecoverySource = payload.session_id
2300
- ? "native_session_id"
2301
- : payload.conversation_id
2302
- ? "native_conversation_id"
2303
- : payload.agent_id
2304
- ? "native_agent_id"
2305
- : "unavailable";
2306
- return {
2307
- thread_id_present: Boolean(env.CODEX_THREAD_ID?.trim()),
2308
- wslenv_present: wslenv.length > 0,
2309
- wslenv_names: wslenvNames,
2310
- identity_recovery_source: identityRecoverySource,
2311
- };
2312
- }
2313
2334
  function suppressClosedSpanSignal(input, sessionHash, category) {
2314
2335
  writeProducerDiagnosticV3(input.coordRoot, category, {
2315
2336
  adapter: input.adapter,
@@ -2616,7 +2637,7 @@ export function reanchorArchivedHookProducersV3(input) {
2616
2637
  payload: {
2617
2638
  raw: {},
2618
2639
  ...(previous.current_native_turn_id ? { turn_id: previous.current_native_turn_id } : {}),
2619
- ...(previous.adapter === "cursor" && previous.cursor_mode
2640
+ ...(adapterBehavior(previous.adapter).tracksExecutionMode && previous.cursor_mode
2620
2641
  ? { cursor_mode: previous.cursor_mode }
2621
2642
  : {}),
2622
2643
  },
@@ -2761,7 +2782,8 @@ export function reconcilePendingRuntimeContextV3(input) {
2761
2782
  // holds everything this producer durably recorded.
2762
2783
  return { state: "missing" };
2763
2784
  }
2764
- if (state.adapter !== "codex" || !state.pending_runtime_contexts?.length) {
2785
+ if (!adapterBehavior(state.adapter).runtimeContextRetry ||
2786
+ !state.pending_runtime_contexts?.length) {
2765
2787
  return { state: "not_pending" };
2766
2788
  }
2767
2789
  const context = fingerprintContextV3(input.coordRoot, rootId, state.generation_id, state.privacy_epoch_id);
@@ -2845,7 +2867,9 @@ function newProducerState(input, sessionId, epochId, boundaryEventId, genesisId)
2845
2867
  generation_id: input.delegated_child?.generation_id ?? generationIdV3(),
2846
2868
  attestation_id: attestationIdV3(),
2847
2869
  capability_profile: adapterCapabilityProfileDigestV3(input.adapter),
2848
- cursor_mode: input.adapter === "cursor" ? (input.payload.cursor_mode ?? "unknown") : undefined,
2870
+ cursor_mode: adapterBehavior(input.adapter).tracksExecutionMode
2871
+ ? (input.payload.cursor_mode ?? "unknown")
2872
+ : undefined,
2849
2873
  privacy_epoch_id: epochId,
2850
2874
  epoch_genesis_id: genesisId,
2851
2875
  boot_id: bootId,
@@ -3006,7 +3030,7 @@ function sourceIdForSignal(input, context) {
3006
3030
  : undefined;
3007
3031
  }
3008
3032
  function cursorShellSemanticKey(input, context) {
3009
- if (input.adapter !== "cursor")
3033
+ if (!adapterBehavior(input.adapter).shellOperationDedup)
3010
3034
  return undefined;
3011
3035
  const command = extractBashCommand(input.payload.tool_name, input.payload.tool_input);
3012
3036
  return command
@@ -3134,9 +3158,9 @@ function producerStatePath(coordRoot, adapter, sessionHash) {
3134
3158
  function acquireStateLease(coordRoot, statePath) {
3135
3159
  const directory = join(statePath, "..");
3136
3160
  const producerRoot = join(resolve(coordRoot), EVENT_V3_LEDGER_RELATIVE_ROOT, "private-producers");
3137
- mkdirSync(directory, { recursive: true, mode: 0o700 });
3138
- chmodSync(producerRoot, 0o700);
3139
- chmodSync(directory, 0o700);
3161
+ mkdirSync(directory, { recursive: true, mode: stateDirMode() });
3162
+ chmodSync(producerRoot, stateDirMode());
3163
+ chmodSync(directory, stateDirMode());
3140
3164
  const acquiredControl = readEventV3ControlState(coordRoot);
3141
3165
  const acquiredGenesis = acquiredControl.state === "candidate" || acquiredControl.state === "active"
3142
3166
  ? acquiredControl.genesis.event.payload.genesis_id
@@ -3179,13 +3203,13 @@ function publishProducerState(coordRoot, path, state) {
3179
3203
  const temporary = `${path}.tmp-${process.pid}-${randomUUID()}`;
3180
3204
  let fd;
3181
3205
  try {
3182
- fd = openSync(temporary, "wx", 0o600);
3206
+ fd = openSync(temporary, "wx", stateFileMode());
3183
3207
  writeFileSync(fd, `${JSON.stringify(state)}\n`, "utf8");
3184
3208
  fsyncSync(fd);
3185
3209
  closeSync(fd);
3186
3210
  fd = undefined;
3187
3211
  renameSync(temporary, path);
3188
- chmodSync(path, 0o600);
3212
+ chmodSync(path, stateFileMode());
3189
3213
  fsyncParentDirectory(path);
3190
3214
  }
3191
3215
  finally {
@@ -3200,8 +3224,8 @@ function readProducerState(path) {
3200
3224
  if (!metadata.isFile() || metadata.isSymbolicLink()) {
3201
3225
  throw new Error("V3 producer state path is unsafe");
3202
3226
  }
3203
- if ((metadata.mode & 0o077) !== 0)
3204
- throw new Error("V3 producer state is not owner-only");
3227
+ if (stateModeTooOpen(metadata.mode))
3228
+ throw new Error("V3 producer state is open to other users");
3205
3229
  let parsed;
3206
3230
  try {
3207
3231
  parsed = JSON.parse(readFileSync(path, "utf8"));
@@ -3230,7 +3254,7 @@ function readProducerState(path) {
3230
3254
  state.pending_runtime_contexts.length === 0) {
3231
3255
  state.pending_runtime_contexts = undefined;
3232
3256
  }
3233
- if (state.adapter === "cursor")
3257
+ if (adapterBehavior(state.adapter).tracksExecutionMode)
3234
3258
  state.cursor_mode ??= "unknown";
3235
3259
  const allowedKeys = new Set([
3236
3260
  "active_runtime_context_probe",
@@ -391,7 +391,15 @@ function applySweepObservation(projection, event) {
391
391
  };
392
392
  }
393
393
  function applyAgentStarted(projection, event) {
394
- if (projection.delegations[event.payload.delegation_id]) {
394
+ const existing = projection.delegations[event.payload.delegation_id];
395
+ if (existing) {
396
+ // Claude Code re-fires SubagentStart when SendMessage resumes a background
397
+ // agent. A restart naming the same parent and child is that resume, not a
398
+ // conflicting delegation, and must not strip the parent's authority.
399
+ if (existing.parent_generation_id === generationIdOf(event) &&
400
+ existing.child_generation_id === event.payload.child_generation_id) {
401
+ return;
402
+ }
395
403
  addDiagnostic(projection, {
396
404
  code: "delegation_duplicate_start",
397
405
  event_id: event.event_id,
@@ -1 +1 @@
1
- {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/recovery.ts"],"names":[],"mappings":"AAsBA,OAAO,EAGL,KAAK,sBAAsB,EAO5B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,gCAAgC;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,UAAU,MAAM,EAAE,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;IACzC,OAAO,EAAE,sBAAsB,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,gCAAgC,GACtC,iCAAiC,CAoEnC"}
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/recovery.ts"],"names":[],"mappings":"AAuBA,OAAO,EAGL,KAAK,sBAAsB,EAO5B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,gCAAgC;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,UAAU,MAAM,EAAE,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;IACzC,OAAO,EAAE,sBAAsB,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,gCAAgC,GACtC,iCAAiC,CAoEnC"}
@@ -1,5 +1,6 @@
1
1
  import { chmodSync, closeSync, existsSync, fsyncSync, linkSync, mkdirSync, openSync, readdirSync, unlinkSync, writeFileSync, } from "node:fs";
2
2
  import { basename, join, resolve } from "node:path";
3
+ import { stateDirMode, stateFileMode } from "../../storage/modes.js";
3
4
  import { fsyncParentDirectory } from "../../workflow/durable-record.js";
4
5
  import { initializeEventLedgerV3 } from "./bootstrap.js";
5
6
  import { canonicalJsonV3, sha256V3 } from "./canonical.js";
@@ -90,8 +91,8 @@ function recoveryIdFor(failure) {
90
91
  function publishRecoveryIntent(root, value) {
91
92
  const intent = validateEventV3RecoveryIntent(value);
92
93
  const records = eventV3RecoveryRecordsRoot(root);
93
- mkdirSync(records, { recursive: true, mode: 0o700 });
94
- chmodSync(records, 0o700);
94
+ mkdirSync(records, { recursive: true, mode: stateDirMode() });
95
+ chmodSync(records, stateDirMode());
95
96
  const path = recoveryIntentPath(records, intent.recovery_id);
96
97
  const serialized = `${canonicalJsonV3(intent)}\n`;
97
98
  if (existsSync(path)) {
@@ -209,7 +210,7 @@ function publishExclusive(path, serialized) {
209
210
  const temporary = `${path}.tmp.${process.pid}`;
210
211
  let fd;
211
212
  try {
212
- fd = openSync(temporary, "wx", 0o600);
213
+ fd = openSync(temporary, "wx", stateFileMode());
213
214
  writeFileSync(fd, serialized, "utf8");
214
215
  fsyncSync(fd);
215
216
  closeSync(fd);
@@ -1 +1 @@
1
- {"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/inventory.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,oCAAoC,EACzC,KAAK,yBAAyB,EAC/B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,+BAA+B,CAAC;IAC3C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,yBAAyB,CAAC;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,+BAA+B,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,EACN,IAAI,CAAC,oCAAoC,EAAE,QAAQ,GAAG,iBAAiB,GAAG,KAAK,CAAC,CACjF,CAAC;CACH;AAQD,0FAA0F;AAC1F,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,4BAA4B,EAAE,CAAC,CAqEzC"}
1
+ {"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/inventory.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,oCAAoC,EACzC,KAAK,yBAAyB,EAC/B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,+BAA+B,CAAC;IAC3C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,yBAAyB,CAAC;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,+BAA+B,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,EACN,IAAI,CAAC,oCAAoC,EAAE,QAAQ,GAAG,iBAAiB,GAAG,KAAK,CAAC,CACjF,CAAC;CACH;AAQD,0FAA0F;AAC1F,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,4BAA4B,EAAE,CAAC,CAqEzC"}
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
2
2
  import { createReadStream } from "node:fs";
3
3
  import { lstat, readdir, realpath } from "node:fs/promises";
4
4
  import { basename, join, relative, resolve } from "node:path";
5
+ import { stateModeTooOpen } from "../../../storage/modes.js";
5
6
  import { classifyEventV3Support, } from "./classify.js";
6
7
  const SUPPORT_ROOTS = [
7
8
  { prefix: "diagnostics", family: "diagnostic" },
@@ -58,7 +59,7 @@ export async function inventoryEventV3Support(input) {
58
59
  authority_state: input.authority.state,
59
60
  now: input.now,
60
61
  file_regular: true,
61
- file_owner_only: (fileStat.mode & 0o077) === 0,
62
+ file_owner_only: !stateModeTooOpen(fileStat.mode),
62
63
  });
63
64
  results.push({
64
65
  authority: input.authority,
@@ -1 +1 @@
1
- {"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/maintenance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/maintenance.ts"],"names":[],"mappings":"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"}