harnery 0.40.0 → 0.41.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 (441) hide show
  1. package/README.md +1 -1
  2. package/dist/commander.js +1 -0
  3. package/dist/commands/agents.d.ts.map +1 -1
  4. package/dist/commands/agents.js +25 -19
  5. package/dist/commands/browse-ai.d.ts.map +1 -1
  6. package/dist/commands/browse-ai.js +4 -0
  7. package/dist/commands/browse.d.ts.map +1 -1
  8. package/dist/commands/browse.js +141 -10
  9. package/dist/commands/checkpoint.js +8 -12
  10. package/dist/commands/deinit.d.ts +1 -1
  11. package/dist/commands/deinit.d.ts.map +1 -1
  12. package/dist/commands/deinit.js +8 -4
  13. package/dist/commands/docs.d.ts.map +1 -1
  14. package/dist/commands/docs.js +2 -0
  15. package/dist/commands/doctor.js +10 -2
  16. package/dist/commands/fetch.d.ts.map +1 -1
  17. package/dist/commands/fetch.js +10 -0
  18. package/dist/commands/init.d.ts +19 -3
  19. package/dist/commands/init.d.ts.map +1 -1
  20. package/dist/commands/init.js +232 -104
  21. package/dist/commands/instructions.js +5 -4
  22. package/dist/commands/ledger-v3.d.ts.map +1 -1
  23. package/dist/commands/ledger-v3.js +2 -1
  24. package/dist/commands/webview.d.ts +4 -0
  25. package/dist/commands/webview.d.ts.map +1 -0
  26. package/dist/commands/webview.js +94 -0
  27. package/dist/core/adapter.d.ts +50 -1
  28. package/dist/core/adapter.d.ts.map +1 -1
  29. package/dist/core/adapter.js +59 -1
  30. package/dist/core/adapters/attestation.d.ts.map +1 -1
  31. package/dist/core/adapters/attestation.js +3 -2
  32. package/dist/core/adapters/profiles.d.ts +20 -3
  33. package/dist/core/adapters/profiles.d.ts.map +1 -1
  34. package/dist/core/adapters/profiles.js +32 -1
  35. package/dist/core/adapters/registry.d.ts.map +1 -1
  36. package/dist/core/adapters/registry.js +33 -0
  37. package/dist/core/agents/canonical-emit.d.ts +1 -1
  38. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  39. package/dist/core/agents/canonical-emit.js +2 -7
  40. package/dist/core/agents/cli.js +18 -16
  41. package/dist/core/agents/coord-client.d.ts.map +1 -1
  42. package/dist/core/agents/coord-client.js +7 -2
  43. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  44. package/dist/core/agents/rules/claim-conflict.js +3 -9
  45. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  46. package/dist/core/agents/rules/commit-conflict.js +2 -8
  47. package/dist/core/agents/rules/stop-hook.d.ts +2 -0
  48. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  49. package/dist/core/agents/rules/stop-hook.js +1 -1
  50. package/dist/core/agents/session-events.d.ts +6 -2
  51. package/dist/core/agents/session-events.d.ts.map +1 -1
  52. package/dist/core/agents/session-events.js +105 -26
  53. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -1
  54. package/dist/core/agents/session-finalization-state-v3.js +2 -1
  55. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -1
  56. package/dist/core/agents/session-finalizer-v3.js +5 -4
  57. package/dist/core/agents/session-name-display.d.ts +28 -0
  58. package/dist/core/agents/session-name-display.d.ts.map +1 -1
  59. package/dist/core/agents/session-name-display.js +43 -0
  60. package/dist/core/agents/state/heartbeat-reader.d.ts +7 -0
  61. package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -1
  62. package/dist/core/agents/state/heartbeat-writer.d.ts +10 -0
  63. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  64. package/dist/core/agents/state/heartbeat-writer.js +21 -2
  65. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  66. package/dist/core/agents/state/live-coordination-view.js +1 -0
  67. package/dist/core/agents/state/live-coordination-writer.js +3 -0
  68. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  69. package/dist/core/agents/state/stale-sweep.js +2 -10
  70. package/dist/core/agents/turn-changes.d.ts +17 -0
  71. package/dist/core/agents/turn-changes.d.ts.map +1 -0
  72. package/dist/core/agents/turn-changes.js +76 -0
  73. package/dist/core/artifacts/delivery-card.d.ts.map +1 -1
  74. package/dist/core/artifacts/delivery-card.js +2 -1
  75. package/dist/core/artifacts/index.d.ts.map +1 -1
  76. package/dist/core/artifacts/index.js +4 -3
  77. package/dist/core/config.d.ts +5 -0
  78. package/dist/core/config.d.ts.map +1 -1
  79. package/dist/core/config.js +14 -0
  80. package/dist/core/context/index.d.ts.map +1 -1
  81. package/dist/core/context/index.js +2 -1
  82. package/dist/core/conversations/archive.d.ts.map +1 -1
  83. package/dist/core/conversations/archive.js +4 -3
  84. package/dist/core/diagnostics/bundle.d.ts.map +1 -1
  85. package/dist/core/diagnostics/bundle.js +3 -2
  86. package/dist/core/events/legacy-storage/canary.d.ts.map +1 -1
  87. package/dist/core/events/legacy-storage/canary.js +5 -4
  88. package/dist/core/events/legacy-storage/compression.d.ts.map +1 -1
  89. package/dist/core/events/legacy-storage/compression.js +2 -1
  90. package/dist/core/events/v3/adapter-id.d.ts +10 -2
  91. package/dist/core/events/v3/adapter-id.d.ts.map +1 -1
  92. package/dist/core/events/v3/adapter-id.js +16 -0
  93. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  94. package/dist/core/events/v3/authority-outbox.js +2 -1
  95. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  96. package/dist/core/events/v3/bootstrap.js +5 -4
  97. package/dist/core/events/v3/capabilities.d.ts.map +1 -1
  98. package/dist/core/events/v3/capabilities.js +17 -0
  99. package/dist/core/events/v3/contract.d.ts +5 -0
  100. package/dist/core/events/v3/contract.d.ts.map +1 -1
  101. package/dist/core/events/v3/contract.js +7 -1
  102. package/dist/core/events/v3/control-witness.d.ts.map +1 -1
  103. package/dist/core/events/v3/control-witness.js +3 -2
  104. package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -1
  105. package/dist/core/events/v3/coordination-transaction-recovery.js +4 -3
  106. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -1
  107. package/dist/core/events/v3/fingerprint-keys.js +7 -6
  108. package/dist/core/events/v3/generated.d.ts +1 -1
  109. package/dist/core/events/v3/generated.js +1 -1
  110. package/dist/core/events/v3/live-feed.d.ts.map +1 -1
  111. package/dist/core/events/v3/live-feed.js +5 -4
  112. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
  113. package/dist/core/events/v3/producers/command-recorder.js +8 -7
  114. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  115. package/dist/core/events/v3/producers/coordination-recorder.js +8 -7
  116. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -1
  117. package/dist/core/events/v3/producers/diagnostic-summaries.js +5 -4
  118. package/dist/core/events/v3/producers/hook-base.d.ts +1 -0
  119. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
  120. package/dist/core/events/v3/producers/hook-base.js +10 -4
  121. package/dist/core/events/v3/producers/hook.d.ts +2 -0
  122. package/dist/core/events/v3/producers/hook.d.ts.map +1 -1
  123. package/dist/core/events/v3/producers/hook.js +16 -1
  124. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  125. package/dist/core/events/v3/producers/intake.js +16 -6
  126. package/dist/core/events/v3/producers/recorder.d.ts +2 -4
  127. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  128. package/dist/core/events/v3/producers/recorder.js +109 -101
  129. package/dist/core/events/v3/recovery.d.ts.map +1 -1
  130. package/dist/core/events/v3/recovery.js +4 -3
  131. package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -1
  132. package/dist/core/events/v3/support-storage/inventory.js +2 -1
  133. package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -1
  134. package/dist/core/events/v3/support-storage/maintenance.js +4 -3
  135. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -1
  136. package/dist/core/events/v3/support-storage/pack-reader.js +4 -3
  137. package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -1
  138. package/dist/core/events/v3/support-storage/pack-writer.js +6 -5
  139. package/dist/core/events/v3/tool-line-changes.d.ts +8 -0
  140. package/dist/core/events/v3/tool-line-changes.d.ts.map +1 -0
  141. package/dist/core/events/v3/tool-line-changes.js +135 -0
  142. package/dist/core/events/v3/writer.d.ts.map +1 -1
  143. package/dist/core/events/v3/writer.js +8 -7
  144. package/dist/core/governor/planning.d.ts.map +1 -1
  145. package/dist/core/governor/planning.js +6 -5
  146. package/dist/core/governor/service.d.ts.map +1 -1
  147. package/dist/core/governor/service.js +12 -11
  148. package/dist/core/governor/state.d.ts.map +1 -1
  149. package/dist/core/governor/state.js +7 -6
  150. package/dist/core/guard/evaluator.js +1 -0
  151. package/dist/core/guard/storage.d.ts.map +1 -1
  152. package/dist/core/guard/storage.js +3 -2
  153. package/dist/core/hooks/adapter/behaviors/claude-code.d.ts +4 -0
  154. package/dist/core/hooks/adapter/behaviors/claude-code.d.ts.map +1 -0
  155. package/dist/core/hooks/adapter/behaviors/claude-code.js +31 -0
  156. package/dist/core/hooks/adapter/behaviors/codex.d.ts +15 -0
  157. package/dist/core/hooks/adapter/behaviors/codex.d.ts.map +1 -0
  158. package/dist/core/hooks/adapter/behaviors/codex.js +82 -0
  159. package/dist/core/hooks/adapter/behaviors/cursor.d.ts +7 -0
  160. package/dist/core/hooks/adapter/behaviors/cursor.d.ts.map +1 -0
  161. package/dist/core/hooks/adapter/behaviors/cursor.js +35 -0
  162. package/dist/core/hooks/adapter/behaviors/index.d.ts +11 -0
  163. package/dist/core/hooks/adapter/behaviors/index.d.ts.map +1 -0
  164. package/dist/core/hooks/adapter/behaviors/index.js +20 -0
  165. package/dist/core/hooks/adapter/behaviors/openclaw.d.ts +7 -0
  166. package/dist/core/hooks/adapter/behaviors/openclaw.d.ts.map +1 -0
  167. package/dist/core/hooks/adapter/behaviors/openclaw.js +34 -0
  168. package/dist/core/hooks/adapter/behaviors/opencode.d.ts +7 -0
  169. package/dist/core/hooks/adapter/behaviors/opencode.d.ts.map +1 -0
  170. package/dist/core/hooks/adapter/behaviors/opencode.js +34 -0
  171. package/dist/core/hooks/adapter/behaviors/types.d.ts +89 -0
  172. package/dist/core/hooks/adapter/behaviors/types.d.ts.map +1 -0
  173. package/dist/core/hooks/adapter/behaviors/types.js +1 -0
  174. package/dist/core/hooks/adapter/detect.d.ts +1 -1
  175. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  176. package/dist/core/hooks/adapter/detect.js +2 -3
  177. package/dist/core/hooks/adapter/events.d.ts +29 -1
  178. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  179. package/dist/core/hooks/adapter/events.js +31 -0
  180. package/dist/core/hooks/adapter/opencode-plugin.d.ts +60 -0
  181. package/dist/core/hooks/adapter/opencode-plugin.d.ts.map +1 -0
  182. package/dist/core/hooks/adapter/opencode-plugin.js +129 -0
  183. package/dist/core/hooks/adapter/output.d.ts +7 -0
  184. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  185. package/dist/core/hooks/adapter/output.js +8 -1
  186. package/dist/core/hooks/adapter/wiring.d.ts +15 -1
  187. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  188. package/dist/core/hooks/adapter/wiring.js +74 -11
  189. package/dist/core/hooks/cli.js +635 -529
  190. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  191. package/dist/core/hooks/effects/image-capture.js +2 -1
  192. package/dist/core/hooks/prompt-context/contract.d.ts.map +1 -1
  193. package/dist/core/hooks/prompt-context/contract.js +1 -0
  194. package/dist/core/hooks/resolve/transcript.d.ts +1 -1
  195. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  196. package/dist/core/hooks/resolve/transcript.js +35 -4
  197. package/dist/core/hooks/session-name-presence.d.ts +3 -1
  198. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  199. package/dist/core/hooks/session-name-presence.js +7 -2
  200. package/dist/core/hooks/shell-waiter.d.ts +2 -0
  201. package/dist/core/hooks/shell-waiter.d.ts.map +1 -0
  202. package/dist/core/hooks/shell-waiter.js +173 -0
  203. package/dist/core/resources/service.d.ts.map +1 -1
  204. package/dist/core/resources/service.js +5 -4
  205. package/dist/core/semantic/review.d.ts.map +1 -1
  206. package/dist/core/semantic/review.js +5 -4
  207. package/dist/core/semantic/service.d.ts.map +1 -1
  208. package/dist/core/semantic/service.js +15 -14
  209. package/dist/core/semantic/storage.d.ts.map +1 -1
  210. package/dist/core/semantic/storage.js +5 -4
  211. package/dist/core/storage/atomic-json.d.ts.map +1 -1
  212. package/dist/core/storage/atomic-json.js +7 -3
  213. package/dist/core/storage/durable-history.d.ts.map +1 -1
  214. package/dist/core/storage/durable-history.js +6 -5
  215. package/dist/core/storage/maintenance-providers.d.ts.map +1 -1
  216. package/dist/core/storage/maintenance-providers.js +2 -1
  217. package/dist/core/storage/maintenance.d.ts.map +1 -1
  218. package/dist/core/storage/maintenance.js +7 -6
  219. package/dist/core/storage/metrics.d.ts.map +1 -1
  220. package/dist/core/storage/metrics.js +5 -1
  221. package/dist/core/storage/modes.d.ts +17 -0
  222. package/dist/core/storage/modes.d.ts.map +1 -0
  223. package/dist/core/storage/modes.js +47 -0
  224. package/dist/core/storage/process-log.d.ts.map +1 -1
  225. package/dist/core/storage/process-log.js +3 -2
  226. package/dist/core/storage/receipts.d.ts.map +1 -1
  227. package/dist/core/storage/receipts.js +4 -3
  228. package/dist/core/storage/segments.d.ts.map +1 -1
  229. package/dist/core/storage/segments.js +7 -6
  230. package/dist/core/supervisor/hook-health.d.ts +2 -1
  231. package/dist/core/supervisor/hook-health.d.ts.map +1 -1
  232. package/dist/core/supervisor/hook-health.js +4 -3
  233. package/dist/core/supervisor/service.d.ts.map +1 -1
  234. package/dist/core/supervisor/service.js +7 -6
  235. package/dist/core/work/state.d.ts.map +1 -1
  236. package/dist/core/work/state.js +8 -7
  237. package/dist/core/workflow/adapters.d.ts +7 -0
  238. package/dist/core/workflow/adapters.d.ts.map +1 -1
  239. package/dist/core/workflow/adapters.js +9 -0
  240. package/dist/core/workflow/approvals.d.ts.map +1 -1
  241. package/dist/core/workflow/approvals.js +6 -5
  242. package/dist/core/workflow/billing.d.ts.map +1 -1
  243. package/dist/core/workflow/billing.js +33 -4
  244. package/dist/core/workflow/durable-record.d.ts.map +1 -1
  245. package/dist/core/workflow/durable-record.js +4 -3
  246. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  247. package/dist/core/workflow/live-session-v3.js +2 -3
  248. package/dist/core/workflow/run-state.d.ts.map +1 -1
  249. package/dist/core/workflow/run-state.js +3 -2
  250. package/dist/core/workflow/spawn-opencode.d.ts +36 -0
  251. package/dist/core/workflow/spawn-opencode.d.ts.map +1 -0
  252. package/dist/core/workflow/spawn-opencode.js +132 -0
  253. package/dist/core/workflow/transcript.d.ts.map +1 -1
  254. package/dist/core/workflow/transcript.js +3 -2
  255. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  256. package/dist/core/workflow/workspaces/leases.js +5 -4
  257. package/dist/core/workflow/workspaces/local-git.d.ts.map +1 -1
  258. package/dist/core/workflow/workspaces/local-git.js +3 -2
  259. package/dist/core/workflow/workspaces/paths.d.ts.map +1 -1
  260. package/dist/core/workflow/workspaces/paths.js +2 -1
  261. package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
  262. package/dist/core/workflow/workspaces/state.js +10 -9
  263. package/dist/lazy-commands.js +8 -1
  264. package/dist/lib/agent-browser/client.d.ts +9 -0
  265. package/dist/lib/agent-browser/client.d.ts.map +1 -1
  266. package/dist/lib/agent-browser/client.js +13 -0
  267. package/dist/lib/browser/client.d.ts +35 -1
  268. package/dist/lib/browser/client.d.ts.map +1 -1
  269. package/dist/lib/browser/client.js +117 -8
  270. package/dist/lib/browser/identity.d.ts +25 -0
  271. package/dist/lib/browser/identity.d.ts.map +1 -0
  272. package/dist/lib/browser/identity.js +66 -0
  273. package/dist/lib/browser/index.d.ts +2 -1
  274. package/dist/lib/browser/index.d.ts.map +1 -1
  275. package/dist/lib/browser/index.js +2 -1
  276. package/dist/lib/browser/launch-args.d.ts +26 -0
  277. package/dist/lib/browser/launch-args.d.ts.map +1 -1
  278. package/dist/lib/browser/launch-args.js +41 -1
  279. package/dist/lib/browser/user-agent.d.ts +53 -0
  280. package/dist/lib/browser/user-agent.d.ts.map +1 -0
  281. package/dist/lib/browser/user-agent.js +79 -0
  282. package/dist/lib/docs-metadata-managed.d.ts +1 -0
  283. package/dist/lib/docs-metadata-managed.d.ts.map +1 -1
  284. package/dist/lib/docs-metadata-managed.js +17 -1
  285. package/dist/lib/identities/assume.d.ts.map +1 -1
  286. package/dist/lib/identities/assume.js +4 -9
  287. package/dist/lib/instructions/apply.d.ts.map +1 -1
  288. package/dist/lib/instructions/apply.js +2 -0
  289. package/dist/lib/pace/index.d.ts +2 -0
  290. package/dist/lib/pace/index.d.ts.map +1 -0
  291. package/dist/lib/pace/index.js +1 -0
  292. package/dist/lib/pace/pace.d.ts +95 -0
  293. package/dist/lib/pace/pace.d.ts.map +1 -0
  294. package/dist/lib/pace/pace.js +313 -0
  295. package/dist/lib/tunnel/forward-headers.d.ts +11 -0
  296. package/dist/lib/tunnel/forward-headers.d.ts.map +1 -0
  297. package/dist/lib/tunnel/forward-headers.js +17 -0
  298. package/dist/lib/tunnel/gate.js +15 -10
  299. package/dist/lib/webview/index.d.ts +2 -0
  300. package/dist/lib/webview/index.d.ts.map +1 -0
  301. package/dist/lib/webview/index.js +1 -0
  302. package/dist/lib/webview/webview.d.ts +116 -0
  303. package/dist/lib/webview/webview.d.ts.map +1 -0
  304. package/dist/lib/webview/webview.js +289 -0
  305. package/opencode-plugin/package.json +19 -0
  306. package/opencode-plugin/src/index.ts +791 -0
  307. package/package.json +11 -4
  308. package/schemas/config.schema.json +13 -0
  309. package/schemas/event-v3.schema.json +164 -0
  310. package/src/commander.ts +7 -0
  311. package/src/commands/agents.ts +33 -18
  312. package/src/commands/browse-ai.ts +8 -0
  313. package/src/commands/browse.ts +189 -10
  314. package/src/commands/checkpoint.ts +7 -9
  315. package/src/commands/deinit.ts +9 -4
  316. package/src/commands/docs.ts +2 -0
  317. package/src/commands/doctor.ts +11 -2
  318. package/src/commands/fetch.ts +14 -0
  319. package/src/commands/init.ts +281 -119
  320. package/src/commands/instructions.ts +8 -4
  321. package/src/commands/ledger-v3.ts +2 -1
  322. package/src/commands/webview.ts +159 -0
  323. package/src/core/adapter.ts +102 -1
  324. package/src/core/adapters/attestation.ts +3 -2
  325. package/src/core/adapters/profiles.ts +42 -1
  326. package/src/core/adapters/registry.ts +37 -0
  327. package/src/core/agents/canonical-emit.ts +2 -5
  328. package/src/core/agents/cli.ts +18 -17
  329. package/src/core/agents/coord-client.ts +9 -3
  330. package/src/core/agents/rules/claim-conflict.ts +3 -8
  331. package/src/core/agents/rules/commit-conflict.ts +2 -7
  332. package/src/core/agents/rules/stop-hook.ts +3 -1
  333. package/src/core/agents/session-events.ts +120 -26
  334. package/src/core/agents/session-finalization-state-v3.ts +2 -1
  335. package/src/core/agents/session-finalizer-v3.ts +5 -4
  336. package/src/core/agents/session-name-display.ts +48 -0
  337. package/src/core/agents/state/heartbeat-reader.ts +7 -0
  338. package/src/core/agents/state/heartbeat-writer.ts +24 -2
  339. package/src/core/agents/state/live-coordination-view.ts +1 -0
  340. package/src/core/agents/state/live-coordination-writer.ts +3 -0
  341. package/src/core/agents/state/stale-sweep.ts +2 -9
  342. package/src/core/agents/turn-changes.ts +97 -0
  343. package/src/core/artifacts/delivery-card.ts +2 -1
  344. package/src/core/artifacts/index.ts +4 -3
  345. package/src/core/config.ts +23 -0
  346. package/src/core/context/index.ts +2 -1
  347. package/src/core/conversations/archive.ts +4 -3
  348. package/src/core/diagnostics/bundle.ts +3 -2
  349. package/src/core/events/legacy-storage/canary.ts +5 -4
  350. package/src/core/events/legacy-storage/compression.ts +2 -1
  351. package/src/core/events/v3/adapter-id.ts +29 -1
  352. package/src/core/events/v3/authority-outbox.ts +2 -1
  353. package/src/core/events/v3/bootstrap.ts +5 -4
  354. package/src/core/events/v3/capabilities.ts +17 -0
  355. package/src/core/events/v3/contract.ts +9 -1
  356. package/src/core/events/v3/control-witness.ts +3 -2
  357. package/src/core/events/v3/coordination-transaction-recovery.ts +4 -3
  358. package/src/core/events/v3/fingerprint-keys.ts +7 -6
  359. package/src/core/events/v3/generated.ts +1 -1
  360. package/src/core/events/v3/live-feed.ts +5 -4
  361. package/src/core/events/v3/producers/command-recorder.ts +8 -6
  362. package/src/core/events/v3/producers/coordination-recorder.ts +8 -7
  363. package/src/core/events/v3/producers/diagnostic-summaries.ts +5 -4
  364. package/src/core/events/v3/producers/hook-base.ts +11 -4
  365. package/src/core/events/v3/producers/hook.ts +19 -1
  366. package/src/core/events/v3/producers/intake.ts +18 -6
  367. package/src/core/events/v3/producers/recorder.ts +123 -114
  368. package/src/core/events/v3/recovery.ts +4 -3
  369. package/src/core/events/v3/support-storage/inventory.ts +2 -1
  370. package/src/core/events/v3/support-storage/maintenance.ts +8 -3
  371. package/src/core/events/v3/support-storage/pack-reader.ts +4 -3
  372. package/src/core/events/v3/support-storage/pack-writer.ts +6 -5
  373. package/src/core/events/v3/tool-line-changes.ts +139 -0
  374. package/src/core/events/v3/writer.ts +8 -7
  375. package/src/core/governor/planning.ts +6 -5
  376. package/src/core/governor/service.ts +12 -11
  377. package/src/core/governor/state.ts +7 -6
  378. package/src/core/guard/evaluator.ts +1 -0
  379. package/src/core/guard/storage.ts +3 -2
  380. package/src/core/hooks/adapter/behaviors/claude-code.ts +33 -0
  381. package/src/core/hooks/adapter/behaviors/codex.ts +96 -0
  382. package/src/core/hooks/adapter/behaviors/cursor.ts +37 -0
  383. package/src/core/hooks/adapter/behaviors/index.ts +31 -0
  384. package/src/core/hooks/adapter/behaviors/openclaw.ts +36 -0
  385. package/src/core/hooks/adapter/behaviors/opencode.ts +36 -0
  386. package/src/core/hooks/adapter/behaviors/types.ts +110 -0
  387. package/src/core/hooks/adapter/detect.ts +2 -3
  388. package/src/core/hooks/adapter/events.ts +53 -1
  389. package/src/core/hooks/adapter/opencode-plugin.ts +177 -0
  390. package/src/core/hooks/adapter/output.ts +8 -1
  391. package/src/core/hooks/adapter/wiring.ts +85 -11
  392. package/src/core/hooks/cli.ts +733 -537
  393. package/src/core/hooks/effects/image-capture.ts +2 -1
  394. package/src/core/hooks/prompt-context/contract.ts +1 -0
  395. package/src/core/hooks/resolve/transcript.ts +42 -5
  396. package/src/core/hooks/session-name-presence.ts +10 -3
  397. package/src/core/hooks/shell-waiter.ts +166 -0
  398. package/src/core/resources/service.ts +5 -4
  399. package/src/core/semantic/review.ts +5 -4
  400. package/src/core/semantic/service.ts +15 -14
  401. package/src/core/semantic/storage.ts +5 -4
  402. package/src/core/storage/atomic-json.ts +7 -3
  403. package/src/core/storage/durable-history.ts +6 -5
  404. package/src/core/storage/maintenance-providers.ts +2 -1
  405. package/src/core/storage/maintenance.ts +7 -6
  406. package/src/core/storage/metrics.ts +5 -1
  407. package/src/core/storage/modes.ts +53 -0
  408. package/src/core/storage/process-log.ts +3 -2
  409. package/src/core/storage/receipts.ts +4 -3
  410. package/src/core/storage/segments.ts +7 -6
  411. package/src/core/supervisor/hook-health.ts +4 -4
  412. package/src/core/supervisor/service.ts +7 -6
  413. package/src/core/work/state.ts +8 -7
  414. package/src/core/workflow/adapters.ts +15 -0
  415. package/src/core/workflow/approvals.ts +6 -5
  416. package/src/core/workflow/billing.ts +34 -4
  417. package/src/core/workflow/durable-record.ts +4 -3
  418. package/src/core/workflow/live-session-v3.ts +2 -3
  419. package/src/core/workflow/run-state.ts +3 -2
  420. package/src/core/workflow/spawn-opencode.ts +150 -0
  421. package/src/core/workflow/transcript.ts +3 -2
  422. package/src/core/workflow/workspaces/leases.ts +5 -4
  423. package/src/core/workflow/workspaces/local-git.ts +3 -2
  424. package/src/core/workflow/workspaces/paths.ts +2 -1
  425. package/src/core/workflow/workspaces/state.ts +10 -9
  426. package/src/lazy-commands.ts +11 -1
  427. package/src/lib/agent-browser/client.ts +18 -0
  428. package/src/lib/browser/client.ts +147 -9
  429. package/src/lib/browser/identity.ts +64 -0
  430. package/src/lib/browser/index.ts +15 -1
  431. package/src/lib/browser/launch-args.ts +53 -1
  432. package/src/lib/browser/user-agent.ts +130 -0
  433. package/src/lib/docs-metadata-managed.ts +21 -0
  434. package/src/lib/identities/assume.ts +7 -7
  435. package/src/lib/instructions/apply.ts +2 -0
  436. package/src/lib/pace/index.ts +14 -0
  437. package/src/lib/pace/pace.ts +370 -0
  438. package/src/lib/tunnel/forward-headers.ts +16 -0
  439. package/src/lib/tunnel/gate.ts +18 -10
  440. package/src/lib/webview/index.ts +13 -0
  441. 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
@@ -740,11 +758,11 @@ function processHookSignalLocked(control, input, sessionHash, path) {
740
758
  const turnTelemetry = input.signal === "stop" || input.signal === "stop-failure"
741
759
  ? turnTelemetryForTerminal(input, state, eventClock.observed_at)
742
760
  : undefined;
743
- const cursorToolChannelSupport = input.adapter === "cursor"
761
+ const cursorToolChannelSupport = behavior.tracksExecutionMode
744
762
  ? cursorToolChannelSupportV3(state.cursor_mode ?? "unknown")
745
763
  : undefined;
746
764
  const cursorToolChannelUnattested = (input.signal === "stop" || input.signal === "stop-failure") &&
747
- input.adapter === "cursor" &&
765
+ behavior.tracksExecutionMode &&
748
766
  cursorToolChannelSupport !== "unsupported" &&
749
767
  state.tool_call_count === 0;
750
768
  if (input.signal === "sub-agent-start" && delegation && !delegation.open_event_id) {
@@ -755,13 +773,14 @@ function processHookSignalLocked(control, input, sessionHash, path) {
755
773
  // Before the signal's own event: the tool call or turn that carries the
756
774
  // new effort already ran under it, so it must ride the new attestation.
757
775
  maybeAttestTuningChange(input, state, path, rootId);
758
- const cursorResponseRitual = input.adapter === "cursor" &&
776
+ const ritualArrivesSeparately = behavior.completedResponseEvent !== undefined;
777
+ const cursorResponseRitual = ritualArrivesSeparately &&
759
778
  (input.signal === "stop" || input.signal === "stop-failure") &&
760
779
  state.current_turn_id &&
761
780
  state.cursor_response_ritual?.turn_id === state.current_turn_id
762
781
  ? state.cursor_response_ritual
763
782
  : undefined;
764
- const terminalTurnRitual = input.adapter === "cursor" && (input.signal === "stop" || input.signal === "stop-failure")
783
+ const terminalTurnRitual = ritualArrivesSeparately && (input.signal === "stop" || input.signal === "stop-failure")
765
784
  ? cursorResponseRitual
766
785
  ? {
767
786
  status_box_present: cursorResponseRitual.status_box_present,
@@ -814,6 +833,7 @@ function processHookSignalLocked(control, input, sessionHash, path) {
814
833
  span_id: openingSpan?.span_id ?? closingSpan?.span_id,
815
834
  parent_span_id: openingSpan?.parent_span_id ?? closingSpan?.parent_span_id,
816
835
  terminal_span: terminalSpan,
836
+ tool_line_changes: span?.line_changes,
817
837
  harness_timing: state.turn_harness,
818
838
  turn_telemetry: turnTelemetry,
819
839
  caused_by: [
@@ -1232,8 +1252,8 @@ function commitRecoveredTurnCompleted(input, state, path, rootId, fingerprintCon
1232
1252
  assertEventV3(event);
1233
1253
  commitEventLocked(input, state, path, event);
1234
1254
  }
1235
- /** Open a derived turn for tools that arrive after their native turn closed. */
1236
- function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintContext) {
1255
+ /** Open a derived turn for signals that arrive after their native turn closed. */
1256
+ function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintContext, options) {
1237
1257
  const clock = signalClock(input);
1238
1258
  const span = openSpanStateV3({
1239
1259
  span_id: spanIdV3(),
@@ -1268,6 +1288,7 @@ function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintCon
1268
1288
  observed_at: clock.observed_at,
1269
1289
  monotonic_ns: orderedEventMonotonic(state, input.monotonic_ns),
1270
1290
  clock_id: state.clock_id,
1291
+ ...(options?.stop_remediation ? { stop_remediation: true } : {}),
1271
1292
  });
1272
1293
  if (event?.event_type !== "turn.started") {
1273
1294
  throw new Error("recovered tool turn start could not be normalized");
@@ -1478,7 +1499,8 @@ function maybeCommitActiveRuntimeContextObservation(input, state, path, rootId,
1478
1499
  }
1479
1500
  const nativeSessionId = input.payload.session_id ?? input.payload.conversation_id;
1480
1501
  const nativeTurnId = input.payload.turn_id ?? state.current_native_turn_id;
1481
- if (!nativeSessionId || (!nativeTurnId && input.adapter !== "cursor"))
1502
+ const behavior = adapterBehavior(input.adapter);
1503
+ if (!nativeSessionId || (!nativeTurnId && !behavior.nativeTurnIdOptional))
1482
1504
  return;
1483
1505
  const now = Date.now();
1484
1506
  const configuredInterval = input.runtimeTelemetryOptions?.activeContextProbeIntervalMs;
@@ -1504,21 +1526,20 @@ function maybeCommitActiveRuntimeContextObservation(input, state, path, rootId,
1504
1526
  commitActiveContextObservation(input, state, path, rootId, fingerprintContext, sourceEvent, native, nativeContextProvenance(input, state, native));
1505
1527
  return;
1506
1528
  }
1507
- if (input.adapter === "cursor" && state.cursor_mode === "cloud") {
1508
- publishProducerState(input.coordRoot, path, state);
1509
- return;
1510
- }
1511
- if (input.adapter === "openclaw") {
1529
+ // Runtime readers exist only for workflow adapters; an event-only adapter
1530
+ // has no transcript to read.
1531
+ const runtimeAdapter = normalizeAdapter(input.adapter);
1532
+ if (!runtimeAdapter || !behavior.runtimeContextAvailable(state.cursor_mode)) {
1512
1533
  publishProducerState(input.coordRoot, path, state);
1513
1534
  return;
1514
1535
  }
1515
1536
  const transcriptPath = runtimeTranscriptPath(input, state);
1516
- if (!transcriptPath && input.adapter !== "cursor") {
1537
+ if (!transcriptPath && !behavior.runtimeContextTranscriptOptional) {
1517
1538
  publishProducerState(input.coordRoot, path, state);
1518
1539
  return;
1519
1540
  }
1520
1541
  const runtime = readRuntimeContextTelemetry({
1521
- adapter: input.adapter,
1542
+ adapter: runtimeAdapter,
1522
1543
  session_id: nativeSessionId,
1523
1544
  ...(nativeTurnId ? { turn_id: nativeTurnId } : {}),
1524
1545
  ...(state.current_turn_span?.opened_at
@@ -1629,7 +1650,7 @@ function turnContextTarget(turnTerminal) {
1629
1650
  };
1630
1651
  }
1631
1652
  function queuePendingRuntimeContext(input, state, target, measurement, nativeTurnId) {
1632
- if (input.adapter !== "codex" ||
1653
+ if (!adapterBehavior(input.adapter).runtimeContextRetry ||
1633
1654
  !target ||
1634
1655
  measurement.state !== "expected_but_missing" ||
1635
1656
  !retryableRuntimeContextReason(measurement.reason)) {
@@ -1654,8 +1675,10 @@ function queuePendingRuntimeContext(input, state, target, measurement, nativeTur
1654
1675
  ].slice(-PENDING_RUNTIME_CONTEXT_CAP);
1655
1676
  }
1656
1677
  function reconcilePendingRuntimeContexts(input, state, path, rootId, fingerprintContext, options = {}) {
1657
- if (state.adapter !== "codex" || !state.pending_runtime_contexts?.length)
1678
+ if (!adapterBehavior(state.adapter).runtimeContextRetry ||
1679
+ !state.pending_runtime_contexts?.length) {
1658
1680
  return;
1681
+ }
1659
1682
  for (const pending of [...state.pending_runtime_contexts]) {
1660
1683
  const runtime = readRuntimeContextTelemetry({
1661
1684
  adapter: "codex",
@@ -1703,8 +1726,18 @@ function reconcilePendingRuntimeContexts(input, state, path, rootId, fingerprint
1703
1726
  publishProducerState(input.coordRoot, path, state);
1704
1727
  }
1705
1728
  function reconcilePendingRuntimeContextsBeforeApprovedEnd(input, state, path, rootId, fingerprintContext) {
1706
- if (state.adapter !== "codex" || !state.pending_runtime_contexts?.length)
1729
+ if (!adapterBehavior(state.adapter).runtimeContextRetry ||
1730
+ !state.pending_runtime_contexts?.length) {
1707
1731
  return;
1732
+ }
1733
+ // Context reconciliation continues the hook boot's sequence, even when the
1734
+ // finalizer drives it. Recover that producer identity from its validated
1735
+ // session start instead of attaching the sequence to the finalizer's name.
1736
+ const ledger = readLedgerV3(input.coordRoot, { authority: input.mode });
1737
+ const start = ledger.events.find(({ event }) => event.event_id === state.started_event_id)?.event;
1738
+ if (!ledger.complete || !start || start.producer.boot_id !== state.boot_id) {
1739
+ throw new Error("event_v3_finalizer_context_producer_unavailable");
1740
+ }
1708
1741
  for (const [index, delayMs] of APPROVED_END_RUNTIME_CONTEXT_RETRY_DELAYS_MS.entries()) {
1709
1742
  if (delayMs > 0)
1710
1743
  sleepSync(delayMs);
@@ -1715,7 +1748,7 @@ function reconcilePendingRuntimeContextsBeforeApprovedEnd(input, state, path, ro
1715
1748
  payload: { raw: {} },
1716
1749
  adapter: state.adapter,
1717
1750
  instance_id: state.instance_id,
1718
- producer_id: "prd_agent-finalizer",
1751
+ producer_id: start.producer.producer_id,
1719
1752
  build_id: input.build_id,
1720
1753
  platform: input.platform,
1721
1754
  observed_at: new Date().toISOString(),
@@ -1735,18 +1768,20 @@ function retryableRuntimeContextReason(reason) {
1735
1768
  }
1736
1769
  function turnTelemetryForTerminal(input, state, observedAt) {
1737
1770
  const native = extractTurnTelemetryV3(input.adapter, input.payload.raw, observedAt);
1771
+ const behavior = adapterBehavior(input.adapter);
1738
1772
  if (native.context.state === "observed")
1739
1773
  return native;
1740
- if (input.adapter === "openclaw")
1774
+ const runtimeAdapter = normalizeAdapter(input.adapter);
1775
+ if (!runtimeAdapter || behavior.nativeTelemetryOnly)
1741
1776
  return native;
1742
- if (input.adapter === "cursor" && state.cursor_mode === "cloud") {
1777
+ if (!behavior.runtimeContextAvailable(state.cursor_mode)) {
1743
1778
  return {
1744
1779
  ...native,
1745
1780
  context: { state: "unsupported", capability: "context_usage" },
1746
1781
  };
1747
1782
  }
1748
1783
  const request = {
1749
- adapter: input.adapter,
1784
+ adapter: runtimeAdapter,
1750
1785
  session_id: input.payload.session_id ?? input.payload.conversation_id,
1751
1786
  turn_id: input.payload.turn_id ?? state.current_native_turn_id,
1752
1787
  transcript_path: runtimeTranscriptPath(input, state),
@@ -1756,7 +1791,7 @@ function turnTelemetryForTerminal(input, state, observedAt) {
1756
1791
  let runtime = readRuntimeContextTelemetry(request, input.runtimeTelemetryOptions);
1757
1792
  if (runtime.bytes_read > 0)
1758
1793
  recordRuntimeTelemetryTiming(state, runtime.io_duration_ms);
1759
- if (input.adapter === "codex" &&
1794
+ if (behavior.runtimeContextRetry &&
1760
1795
  runtime.state === "partial" &&
1761
1796
  retryableRuntimeContextReason(runtime.reason)) {
1762
1797
  for (const delayMs of STOP_RUNTIME_CONTEXT_RETRY_DELAYS_MS) {
@@ -1788,26 +1823,27 @@ function turnTelemetryForTerminal(input, state, observedAt) {
1788
1823
  * events receive only numeric telemetry and an opaque source witness.
1789
1824
  */
1790
1825
  function runtimeTranscriptPath(input, state) {
1791
- if (input.adapter !== "codex")
1826
+ const discover = adapterBehavior(input.adapter).discoverTranscript;
1827
+ if (!discover)
1792
1828
  return input.payload.transcript_path;
1793
1829
  const nativeSessionId = input.payload.session_id ?? input.payload.conversation_id;
1794
1830
  if (!nativeSessionId)
1795
1831
  return input.payload.transcript_path;
1796
1832
  const supplied = input.payload.transcript_path;
1797
1833
  if (supplied) {
1798
- const verified = discoverCodexSessionTranscript(nativeSessionId, supplied, input.runtimeTelemetryOptions);
1834
+ const verified = discover(nativeSessionId, supplied, input.runtimeTelemetryOptions);
1799
1835
  if (verified)
1800
1836
  state.runtime_transcript_path = verified;
1801
1837
  // Preserve a supplied mismatch so the typed reader reports it honestly.
1802
1838
  return verified ?? supplied;
1803
1839
  }
1804
1840
  if (state.runtime_transcript_path) {
1805
- const verified = discoverCodexSessionTranscript(nativeSessionId, state.runtime_transcript_path, input.runtimeTelemetryOptions);
1841
+ const verified = discover(nativeSessionId, state.runtime_transcript_path, input.runtimeTelemetryOptions);
1806
1842
  if (verified)
1807
1843
  return verified;
1808
1844
  state.runtime_transcript_path = undefined;
1809
1845
  }
1810
- const discovered = discoverCodexSessionTranscript(nativeSessionId, undefined, input.runtimeTelemetryOptions);
1846
+ const discovered = discover(nativeSessionId, undefined, input.runtimeTelemetryOptions);
1811
1847
  if (discovered)
1812
1848
  state.runtime_transcript_path = discovered;
1813
1849
  return discovered;
@@ -1889,12 +1925,13 @@ function maybeAttestTuningChange(input, state, path, rootId) {
1889
1925
  let candidate;
1890
1926
  let attestationSource = "native";
1891
1927
  let sourceEvent = `${input.adapter}.effort-payload`;
1892
- if (input.adapter === "claude-code" || input.adapter === "cursor") {
1928
+ const behavior = adapterBehavior(input.adapter);
1929
+ if (behavior.effortAttestation === "payload") {
1893
1930
  if (!input.payload.effort)
1894
1931
  return;
1895
1932
  candidate = { effort: input.payload.effort };
1896
1933
  }
1897
- else if (input.adapter === "codex" &&
1934
+ else if (behavior.effortAttestation === "rollout-probe" &&
1898
1935
  (input.signal === "stop" ||
1899
1936
  // Early probe: without it, a Codex card shows no effort until the first
1900
1937
  // turn terminal. One rollout read per turn while effort is unknown.
@@ -1936,9 +1973,9 @@ function maybeAttestTuningChange(input, state, path, rootId) {
1936
1973
  if (baseline.effort === next.effort && (candidate.speed ?? baseline.speed) === baseline.speed) {
1937
1974
  return;
1938
1975
  }
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") {
1976
+ // Payload change detection rides the payload; the paired transcript row
1977
+ // also carries speed and the (possibly swapped) model, so refresh from it.
1978
+ if (behavior.transcriptTuningRefresh) {
1942
1979
  const runtime = readRuntimeTuning({
1943
1980
  adapter: "claude-code",
1944
1981
  transcript_path: input.payload.transcript_path,
@@ -2074,11 +2111,7 @@ function commitRuntimeAttestationChange(input, state, path, rootId, change) {
2074
2111
  commitEventLocked(input, state, path, event);
2075
2112
  }
2076
2113
  function modelProviderFor(adapter) {
2077
- if (adapter === "claude-code")
2078
- return "anthropic";
2079
- if (adapter === "codex")
2080
- return "openai";
2081
- return adapter;
2114
+ return adapterBehavior(adapter).modelProvider;
2082
2115
  }
2083
2116
  function recordRuntimeTelemetryTiming(state, durationMs) {
2084
2117
  const duration = Math.max(0, Math.ceil(durationMs));
@@ -2277,39 +2310,11 @@ function buildMidFlightSessionStart(input, state, rootId, cursorPromptBootstrap
2277
2310
  * so it is a high-confidence session boundary rather than degraded recovery.
2278
2311
  */
2279
2312
  function isCursorPromptBootstrap(input) {
2280
- return (input.adapter === "cursor" &&
2313
+ return (adapterBehavior(input.adapter).promptMayPrecedeSessionStart &&
2281
2314
  input.signal === "user-prompt-submit" &&
2282
2315
  (input.payload.conversation_id !== undefined || input.payload.session_id !== undefined) &&
2283
2316
  input.payload.turn_id !== undefined);
2284
2317
  }
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
2318
  function suppressClosedSpanSignal(input, sessionHash, category) {
2314
2319
  writeProducerDiagnosticV3(input.coordRoot, category, {
2315
2320
  adapter: input.adapter,
@@ -2616,7 +2621,7 @@ export function reanchorArchivedHookProducersV3(input) {
2616
2621
  payload: {
2617
2622
  raw: {},
2618
2623
  ...(previous.current_native_turn_id ? { turn_id: previous.current_native_turn_id } : {}),
2619
- ...(previous.adapter === "cursor" && previous.cursor_mode
2624
+ ...(adapterBehavior(previous.adapter).tracksExecutionMode && previous.cursor_mode
2620
2625
  ? { cursor_mode: previous.cursor_mode }
2621
2626
  : {}),
2622
2627
  },
@@ -2761,7 +2766,8 @@ export function reconcilePendingRuntimeContextV3(input) {
2761
2766
  // holds everything this producer durably recorded.
2762
2767
  return { state: "missing" };
2763
2768
  }
2764
- if (state.adapter !== "codex" || !state.pending_runtime_contexts?.length) {
2769
+ if (!adapterBehavior(state.adapter).runtimeContextRetry ||
2770
+ !state.pending_runtime_contexts?.length) {
2765
2771
  return { state: "not_pending" };
2766
2772
  }
2767
2773
  const context = fingerprintContextV3(input.coordRoot, rootId, state.generation_id, state.privacy_epoch_id);
@@ -2845,7 +2851,9 @@ function newProducerState(input, sessionId, epochId, boundaryEventId, genesisId)
2845
2851
  generation_id: input.delegated_child?.generation_id ?? generationIdV3(),
2846
2852
  attestation_id: attestationIdV3(),
2847
2853
  capability_profile: adapterCapabilityProfileDigestV3(input.adapter),
2848
- cursor_mode: input.adapter === "cursor" ? (input.payload.cursor_mode ?? "unknown") : undefined,
2854
+ cursor_mode: adapterBehavior(input.adapter).tracksExecutionMode
2855
+ ? (input.payload.cursor_mode ?? "unknown")
2856
+ : undefined,
2849
2857
  privacy_epoch_id: epochId,
2850
2858
  epoch_genesis_id: genesisId,
2851
2859
  boot_id: bootId,
@@ -3006,7 +3014,7 @@ function sourceIdForSignal(input, context) {
3006
3014
  : undefined;
3007
3015
  }
3008
3016
  function cursorShellSemanticKey(input, context) {
3009
- if (input.adapter !== "cursor")
3017
+ if (!adapterBehavior(input.adapter).shellOperationDedup)
3010
3018
  return undefined;
3011
3019
  const command = extractBashCommand(input.payload.tool_name, input.payload.tool_input);
3012
3020
  return command
@@ -3134,9 +3142,9 @@ function producerStatePath(coordRoot, adapter, sessionHash) {
3134
3142
  function acquireStateLease(coordRoot, statePath) {
3135
3143
  const directory = join(statePath, "..");
3136
3144
  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);
3145
+ mkdirSync(directory, { recursive: true, mode: stateDirMode() });
3146
+ chmodSync(producerRoot, stateDirMode());
3147
+ chmodSync(directory, stateDirMode());
3140
3148
  const acquiredControl = readEventV3ControlState(coordRoot);
3141
3149
  const acquiredGenesis = acquiredControl.state === "candidate" || acquiredControl.state === "active"
3142
3150
  ? acquiredControl.genesis.event.payload.genesis_id
@@ -3179,13 +3187,13 @@ function publishProducerState(coordRoot, path, state) {
3179
3187
  const temporary = `${path}.tmp-${process.pid}-${randomUUID()}`;
3180
3188
  let fd;
3181
3189
  try {
3182
- fd = openSync(temporary, "wx", 0o600);
3190
+ fd = openSync(temporary, "wx", stateFileMode());
3183
3191
  writeFileSync(fd, `${JSON.stringify(state)}\n`, "utf8");
3184
3192
  fsyncSync(fd);
3185
3193
  closeSync(fd);
3186
3194
  fd = undefined;
3187
3195
  renameSync(temporary, path);
3188
- chmodSync(path, 0o600);
3196
+ chmodSync(path, stateFileMode());
3189
3197
  fsyncParentDirectory(path);
3190
3198
  }
3191
3199
  finally {
@@ -3200,8 +3208,8 @@ function readProducerState(path) {
3200
3208
  if (!metadata.isFile() || metadata.isSymbolicLink()) {
3201
3209
  throw new Error("V3 producer state path is unsafe");
3202
3210
  }
3203
- if ((metadata.mode & 0o077) !== 0)
3204
- throw new Error("V3 producer state is not owner-only");
3211
+ if (stateModeTooOpen(metadata.mode))
3212
+ throw new Error("V3 producer state is open to other users");
3205
3213
  let parsed;
3206
3214
  try {
3207
3215
  parsed = JSON.parse(readFileSync(path, "utf8"));
@@ -3230,7 +3238,7 @@ function readProducerState(path) {
3230
3238
  state.pending_runtime_contexts.length === 0) {
3231
3239
  state.pending_runtime_contexts = undefined;
3232
3240
  }
3233
- if (state.adapter === "cursor")
3241
+ if (adapterBehavior(state.adapter).tracksExecutionMode)
3234
3242
  state.cursor_mode ??= "unknown";
3235
3243
  const allowedKeys = new Set([
3236
3244
  "active_runtime_context_probe",
@@ -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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"}
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
2
2
  import { constants, createReadStream } from "node:fs";
3
3
  import { chmod, lstat, mkdir, open, readdir, readFile, realpath } from "node:fs/promises";
4
4
  import { join, relative, resolve } from "node:path";
5
+ import { stateDirMode, stateFileMode } from "../../../storage/modes.js";
5
6
  import { canonicalJsonV3 } from "../canonical.js";
6
7
  import { digestEventV3LogicalAuthority } from "./logical-authority.js";
7
8
  import { assertEventV3SupportPackAuthority, logicalEntriesDigestV3 } from "./pack-contract.js";
@@ -68,7 +69,7 @@ export async function planEventV3SupportTransaction(input) {
68
69
  };
69
70
  const directory = transactionDirectory(input.transaction_root, transactionId);
70
71
  try {
71
- await mkdir(directory, { recursive: false, mode: 0o700 });
72
+ await mkdir(directory, { recursive: false, mode: stateDirMode() });
72
73
  }
73
74
  catch (error) {
74
75
  if (error.code !== "EEXIST")
@@ -79,7 +80,7 @@ export async function planEventV3SupportTransaction(input) {
79
80
  }
80
81
  return existing;
81
82
  }
82
- await chmod(directory, 0o700);
83
+ await chmod(directory, stateDirMode());
83
84
  await publishState(directory, transaction);
84
85
  return transaction;
85
86
  }
@@ -284,7 +285,7 @@ function validTransition(from, to) {
284
285
  }
285
286
  async function publishState(directory, transaction) {
286
287
  const path = join(directory, `state-${String(transaction.sequence).padStart(6, "0")}.json`);
287
- const handle = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, 0o600);
288
+ const handle = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, stateFileMode());
288
289
  try {
289
290
  await handle.writeFile(`${canonicalJsonV3(transaction)}\n`, "utf8");
290
291
  await handle.sync();
@@ -1 +1 @@
1
- {"version":3,"file":"pack-reader.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/pack-reader.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAI9B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,+BACf,SAAQ,IAAI,CAAC,wBAAwB,EAAE,gBAAgB,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,0BAA0B,CAAC;IACrC,OAAO,EAAE,+BAA+B,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,0BAA0B,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAUD,wBAAsB,8BAA8B,CAClD,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,0BAA0B,CAAC,CAarC;AAED,4FAA4F;AAC5F,wBAAuB,+BAA+B,CACpD,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,cAAc,CAAC,+BAA+B,CAAC,CAGjD;AA2GD,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAWtC;AAED,yFAAyF;AACzF,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,0BAA0B,CAAC,CAarC;AAED,0FAA0F;AAC1F,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BhE"}
1
+ {"version":3,"file":"pack-reader.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/pack-reader.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAI9B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,+BACf,SAAQ,IAAI,CAAC,wBAAwB,EAAE,gBAAgB,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,0BAA0B,CAAC;IACrC,OAAO,EAAE,+BAA+B,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,0BAA0B,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAUD,wBAAsB,8BAA8B,CAClD,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,0BAA0B,CAAC,CAarC;AAED,4FAA4F;AAC5F,wBAAuB,+BAA+B,CACpD,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,cAAc,CAAC,+BAA+B,CAAC,CAGjD;AA2GD,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAWtC;AAED,yFAAyF;AACzF,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,0BAA0B,CAAC,CAarC;AAED,0FAA0F;AAC1F,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BhE"}