harnery 0.32.0 → 0.34.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 (665) hide show
  1. package/README.md +2 -0
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +7 -1
  4. package/dist/commands/adapter.js +2 -2
  5. package/dist/commands/agents.d.ts +144 -1
  6. package/dist/commands/agents.d.ts.map +1 -1
  7. package/dist/commands/agents.js +1408 -565
  8. package/dist/commands/artifacts.d.ts.map +1 -1
  9. package/dist/commands/artifacts.js +7 -6
  10. package/dist/commands/backup.d.ts +1 -1
  11. package/dist/commands/backup.d.ts.map +1 -1
  12. package/dist/commands/backup.js +29 -16
  13. package/dist/commands/browse.d.ts.map +1 -1
  14. package/dist/commands/browse.js +234 -12
  15. package/dist/commands/checkpoint.d.ts.map +1 -1
  16. package/dist/commands/checkpoint.js +3 -2
  17. package/dist/commands/claude-desktop.d.ts +2 -2
  18. package/dist/commands/claude-desktop.d.ts.map +1 -1
  19. package/dist/commands/claude-desktop.js +2 -2
  20. package/dist/commands/context.js +1 -6
  21. package/dist/commands/decision.d.ts.map +1 -1
  22. package/dist/commands/decision.js +22 -38
  23. package/dist/commands/docs.d.ts.map +1 -1
  24. package/dist/commands/docs.js +91 -28
  25. package/dist/commands/doctor.d.ts +4 -2
  26. package/dist/commands/doctor.d.ts.map +1 -1
  27. package/dist/commands/doctor.js +55 -7
  28. package/dist/commands/events.d.ts +5 -0
  29. package/dist/commands/events.d.ts.map +1 -0
  30. package/dist/commands/events.js +189 -0
  31. package/dist/commands/governor.d.ts.map +1 -1
  32. package/dist/commands/governor.js +13 -4
  33. package/dist/commands/init.d.ts +10 -2
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +233 -51
  36. package/dist/commands/instructions.d.ts +4 -0
  37. package/dist/commands/instructions.d.ts.map +1 -0
  38. package/dist/commands/instructions.js +100 -0
  39. package/dist/commands/journal.d.ts.map +1 -1
  40. package/dist/commands/journal.js +4 -13
  41. package/dist/commands/ledger-v3.d.ts +5 -0
  42. package/dist/commands/ledger-v3.d.ts.map +1 -0
  43. package/dist/commands/ledger-v3.js +91 -0
  44. package/dist/commands/presence.d.ts.map +1 -1
  45. package/dist/commands/presence.js +15 -6
  46. package/dist/commands/sync.d.ts +1 -1
  47. package/dist/commands/sync.js +1 -1
  48. package/dist/commands/web.d.ts +6 -0
  49. package/dist/commands/web.d.ts.map +1 -1
  50. package/dist/commands/web.js +67 -7
  51. package/dist/commands/work.d.ts.map +1 -1
  52. package/dist/commands/work.js +22 -5
  53. package/dist/core/adapter.d.ts +5 -0
  54. package/dist/core/adapter.d.ts.map +1 -0
  55. package/dist/core/adapter.js +1 -0
  56. package/dist/core/adapters/attest.d.ts +5 -2
  57. package/dist/core/adapters/attest.d.ts.map +1 -1
  58. package/dist/core/adapters/attest.js +8 -3
  59. package/dist/core/adapters/profiles.d.ts +6 -6
  60. package/dist/core/adapters/profiles.d.ts.map +1 -1
  61. package/dist/core/adapters/profiles.js +4 -4
  62. package/dist/core/agents/canonical-emit.d.ts +17 -15
  63. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  64. package/dist/core/agents/canonical-emit.js +27 -25
  65. package/dist/core/agents/cli.js +212 -235
  66. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  67. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  68. package/dist/core/agents/codex-archive-v3.js +110 -0
  69. package/dist/core/agents/coord-client.d.ts +19 -70
  70. package/dist/core/agents/coord-client.d.ts.map +1 -1
  71. package/dist/core/agents/coord-client.js +65 -155
  72. package/dist/core/agents/finalization.d.ts +4 -1
  73. package/dist/core/agents/finalization.d.ts.map +1 -1
  74. package/dist/core/agents/finalization.js +89 -32
  75. package/dist/core/agents/index.d.ts +5 -5
  76. package/dist/core/agents/index.d.ts.map +1 -1
  77. package/dist/core/agents/index.js +5 -5
  78. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  79. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-authority-v3.js +233 -0
  81. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  82. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  83. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  84. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  85. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  86. package/dist/core/agents/live-observation-v3.js +157 -0
  87. package/dist/core/agents/render/prompt-context.d.ts +10 -4
  88. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  89. package/dist/core/agents/render/prompt-context.js +61 -55
  90. package/dist/core/agents/render/session-context.d.ts +1 -1
  91. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  92. package/dist/core/agents/render/session-context.js +15 -33
  93. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  94. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  95. package/dist/core/agents/rules/claim-conflict.js +79 -127
  96. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  97. package/dist/core/agents/rules/commit-conflict.js +3 -18
  98. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  99. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  100. package/dist/core/agents/rules/stop-hook.js +193 -236
  101. package/dist/core/agents/session-events.d.ts +5 -7
  102. package/dist/core/agents/session-events.d.ts.map +1 -1
  103. package/dist/core/agents/session-events.js +127 -95
  104. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  105. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  106. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  107. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  108. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  109. package/dist/core/agents/session-finalizer-v3.js +734 -0
  110. package/dist/core/agents/session-name-display.d.ts +40 -0
  111. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  112. package/dist/core/agents/session-name-display.js +119 -0
  113. package/dist/core/agents/state/activity-log.d.ts +3 -3
  114. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  115. package/dist/core/agents/state/activity-log.js +7 -16
  116. package/dist/core/agents/state/heartbeat-writer.d.ts +29 -46
  117. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  118. package/dist/core/agents/state/heartbeat-writer.js +59 -199
  119. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  120. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  121. package/dist/core/agents/state/live-coordination-view.js +209 -0
  122. package/dist/core/agents/state/session-state.d.ts +45 -0
  123. package/dist/core/agents/state/session-state.d.ts.map +1 -0
  124. package/dist/core/agents/state/session-state.js +90 -0
  125. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  126. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  127. package/dist/core/agents/state/stale-sweep.js +26 -15
  128. package/dist/core/artifacts/index.d.ts.map +1 -1
  129. package/dist/core/artifacts/index.js +5 -7
  130. package/dist/core/config.d.ts +33 -2
  131. package/dist/core/config.d.ts.map +1 -1
  132. package/dist/core/config.js +98 -2
  133. package/dist/core/context/index.d.ts +1 -4
  134. package/dist/core/context/index.d.ts.map +1 -1
  135. package/dist/core/context/index.js +9 -9
  136. package/dist/core/events/span-parent.d.ts +15 -0
  137. package/dist/core/events/span-parent.d.ts.map +1 -0
  138. package/dist/core/events/span-parent.js +34 -0
  139. package/dist/core/events/v3/advance.d.ts +14 -0
  140. package/dist/core/events/v3/advance.d.ts.map +1 -0
  141. package/dist/core/events/v3/advance.js +134 -0
  142. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  143. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  144. package/dist/core/events/v3/authority-outbox.js +399 -0
  145. package/dist/core/events/v3/base-builder.d.ts +20 -0
  146. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  147. package/dist/core/events/v3/base-builder.js +29 -0
  148. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  149. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  150. package/dist/core/events/v3/base-contract.js +647 -0
  151. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  152. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  153. package/dist/core/events/v3/bootstrap.js +175 -0
  154. package/dist/core/events/v3/builder.d.ts +20 -0
  155. package/dist/core/events/v3/builder.d.ts.map +1 -0
  156. package/dist/core/events/v3/builder.js +28 -0
  157. package/dist/core/events/v3/canonical.d.ts +31 -0
  158. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  159. package/dist/core/events/v3/canonical.js +100 -0
  160. package/dist/core/events/v3/capabilities.d.ts +31 -0
  161. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  162. package/dist/core/events/v3/capabilities.js +107 -0
  163. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  164. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  165. package/dist/core/events/v3/capability-drift.js +134 -0
  166. package/dist/core/events/v3/catalog.d.ts +38 -0
  167. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  168. package/dist/core/events/v3/catalog.js +135 -0
  169. package/dist/core/events/v3/clock-order.d.ts +34 -0
  170. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  171. package/dist/core/events/v3/clock-order.js +35 -0
  172. package/dist/core/events/v3/contract.d.ts +171 -0
  173. package/dist/core/events/v3/contract.d.ts.map +1 -0
  174. package/dist/core/events/v3/contract.js +180 -0
  175. package/dist/core/events/v3/control.d.ts +111 -0
  176. package/dist/core/events/v3/control.d.ts.map +1 -0
  177. package/dist/core/events/v3/control.js +419 -0
  178. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  179. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/coordination-view.js +119 -0
  181. package/dist/core/events/v3/economics.d.ts +77 -0
  182. package/dist/core/events/v3/economics.d.ts.map +1 -0
  183. package/dist/core/events/v3/economics.js +274 -0
  184. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  185. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  186. package/dist/core/events/v3/finalization-view.js +37 -0
  187. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  188. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  189. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  190. package/dist/core/events/v3/generated.d.ts +4 -0
  191. package/dist/core/events/v3/generated.d.ts.map +1 -0
  192. package/dist/core/events/v3/generated.js +47 -0
  193. package/dist/core/events/v3/ids.d.ts +9 -0
  194. package/dist/core/events/v3/ids.d.ts.map +1 -0
  195. package/dist/core/events/v3/ids.js +25 -0
  196. package/dist/core/events/v3/index.d.ts +35 -0
  197. package/dist/core/events/v3/index.d.ts.map +1 -0
  198. package/dist/core/events/v3/index.js +33 -0
  199. package/dist/core/events/v3/latency.d.ts +63 -0
  200. package/dist/core/events/v3/latency.d.ts.map +1 -0
  201. package/dist/core/events/v3/latency.js +412 -0
  202. package/dist/core/events/v3/live-feed.d.ts +45 -0
  203. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-feed.js +246 -0
  205. package/dist/core/events/v3/live-observation.d.ts +35 -0
  206. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  207. package/dist/core/events/v3/live-observation.js +1 -0
  208. package/dist/core/events/v3/live-routing.d.ts +57 -0
  209. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  210. package/dist/core/events/v3/live-routing.js +107 -0
  211. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  212. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  214. package/dist/core/events/v3/producers/command.d.ts +50 -0
  215. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/command.js +135 -0
  217. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  218. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  220. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  221. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/coordination.js +229 -0
  223. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  224. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/hook-base.js +424 -0
  226. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  227. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/hook.js +71 -0
  229. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  230. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  231. package/dist/core/events/v3/producers/intake.js +244 -0
  232. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  233. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  234. package/dist/core/events/v3/producers/recorder.js +2176 -0
  235. package/dist/core/events/v3/projection.d.ts +101 -0
  236. package/dist/core/events/v3/projection.d.ts.map +1 -0
  237. package/dist/core/events/v3/projection.js +479 -0
  238. package/dist/core/events/v3/reader.d.ts +75 -0
  239. package/dist/core/events/v3/reader.d.ts.map +1 -0
  240. package/dist/core/events/v3/reader.js +778 -0
  241. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  242. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  243. package/dist/core/events/v3/recovery-record.js +167 -0
  244. package/dist/core/events/v3/recovery.d.ts +22 -0
  245. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  246. package/dist/core/events/v3/recovery.js +227 -0
  247. package/dist/core/events/v3/span-state.d.ts +52 -0
  248. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  249. package/dist/core/events/v3/span-state.js +142 -0
  250. package/dist/core/events/v3/targets.d.ts +23 -0
  251. package/dist/core/events/v3/targets.d.ts.map +1 -0
  252. package/dist/core/events/v3/targets.js +134 -0
  253. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  254. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  255. package/dist/core/events/v3/turn-telemetry.js +168 -0
  256. package/dist/core/events/v3/validate.d.ts +9 -0
  257. package/dist/core/events/v3/validate.d.ts.map +1 -0
  258. package/dist/core/events/v3/validate.js +281 -0
  259. package/dist/core/events/v3/writer.d.ts +56 -0
  260. package/dist/core/events/v3/writer.d.ts.map +1 -0
  261. package/dist/core/events/v3/writer.js +335 -0
  262. package/dist/core/governor/index.d.ts +1 -1
  263. package/dist/core/governor/index.d.ts.map +1 -1
  264. package/dist/core/governor/index.js +1 -1
  265. package/dist/core/governor/plan-api.d.ts +2 -1
  266. package/dist/core/governor/plan-api.d.ts.map +1 -1
  267. package/dist/core/governor/plan-api.js +6 -3
  268. package/dist/core/governor/read.d.ts +1 -1
  269. package/dist/core/governor/read.d.ts.map +1 -1
  270. package/dist/core/governor/read.js +1 -1
  271. package/dist/core/governor/state.d.ts +9 -0
  272. package/dist/core/governor/state.d.ts.map +1 -1
  273. package/dist/core/governor/state.js +40 -3
  274. package/dist/core/guard/config.d.ts +5 -0
  275. package/dist/core/guard/config.d.ts.map +1 -0
  276. package/dist/core/guard/config.js +157 -0
  277. package/dist/core/guard/coordinator.d.ts +14 -0
  278. package/dist/core/guard/coordinator.d.ts.map +1 -0
  279. package/dist/core/guard/coordinator.js +173 -0
  280. package/dist/core/guard/evaluator.d.ts +4 -0
  281. package/dist/core/guard/evaluator.d.ts.map +1 -0
  282. package/dist/core/guard/evaluator.js +242 -0
  283. package/dist/core/guard/evidence-v3.d.ts +15 -0
  284. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  285. package/dist/core/guard/evidence-v3.js +171 -0
  286. package/dist/core/guard/index.d.ts +10 -0
  287. package/dist/core/guard/index.d.ts.map +1 -0
  288. package/dist/core/guard/index.js +6 -0
  289. package/dist/core/guard/live-source-v3.d.ts +40 -0
  290. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  291. package/dist/core/guard/live-source-v3.js +128 -0
  292. package/dist/core/guard/storage.d.ts +27 -0
  293. package/dist/core/guard/storage.d.ts.map +1 -0
  294. package/dist/core/guard/storage.js +140 -0
  295. package/dist/core/guard/types.d.ts +119 -0
  296. package/dist/core/guard/types.d.ts.map +1 -0
  297. package/dist/core/guard/types.js +1 -0
  298. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  299. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/detect.js +29 -0
  301. package/dist/core/hooks/adapter/events.d.ts +7 -4
  302. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  303. package/dist/core/hooks/adapter/events.js +13 -4
  304. package/dist/core/hooks/adapter/output.d.ts +2 -2
  305. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  306. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  307. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  308. package/dist/core/hooks/adapter/parse.js +64 -24
  309. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  310. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  311. package/dist/core/hooks/adapter/wiring.js +89 -11
  312. package/dist/core/hooks/cli.d.ts +1 -1
  313. package/dist/core/hooks/cli.js +345 -400
  314. package/dist/core/hooks/codex-authorization.d.ts +30 -0
  315. package/dist/core/hooks/codex-authorization.d.ts.map +1 -0
  316. package/dist/core/hooks/codex-authorization.js +199 -0
  317. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  318. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  319. package/dist/core/hooks/effects/image-capture.js +212 -221
  320. package/dist/core/hooks/effects/index.d.ts +1 -9
  321. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  322. package/dist/core/hooks/effects/index.js +1 -24
  323. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  324. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  325. package/dist/core/hooks/events/input-hash.js +43 -0
  326. package/dist/core/hooks/index.d.ts +4 -3
  327. package/dist/core/hooks/index.d.ts.map +1 -1
  328. package/dist/core/hooks/index.js +2 -3
  329. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  330. package/dist/core/hooks/resolve/coord-root.js +1 -1
  331. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  332. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  333. package/dist/core/hooks/resolve/owner.js +51 -42
  334. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  335. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  336. package/dist/core/hooks/resolve/transcript.js +155 -14
  337. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  338. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  339. package/dist/core/hooks/session-name-presence.js +15 -15
  340. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  341. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  342. package/dist/core/journal/index.d.ts +2 -2
  343. package/dist/core/journal/index.d.ts.map +1 -1
  344. package/dist/core/journal/index.js +9 -22
  345. package/dist/core/presence/blob.d.ts +8 -3
  346. package/dist/core/presence/blob.d.ts.map +1 -1
  347. package/dist/core/presence/blob.js +54 -41
  348. package/dist/core/presence/codec-digest.d.ts +29 -0
  349. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  350. package/dist/core/presence/codec-digest.js +170 -0
  351. package/dist/core/presence/index.js +15 -1
  352. package/dist/core/presence/relay-client.d.ts +1 -1
  353. package/dist/core/presence/relay-client.d.ts.map +1 -1
  354. package/dist/core/presence/relay-client.js +5 -5
  355. package/dist/core/work/index.d.ts +1 -1
  356. package/dist/core/work/index.d.ts.map +1 -1
  357. package/dist/core/work/index.js +1 -1
  358. package/dist/core/work/read.d.ts +1 -1
  359. package/dist/core/work/read.d.ts.map +1 -1
  360. package/dist/core/work/read.js +1 -1
  361. package/dist/core/work/runner.d.ts.map +1 -1
  362. package/dist/core/work/runner.js +6 -0
  363. package/dist/core/work/state.d.ts +9 -0
  364. package/dist/core/work/state.d.ts.map +1 -1
  365. package/dist/core/work/state.js +17 -3
  366. package/dist/core/workflow/engine.js +24 -25
  367. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  368. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  369. package/dist/core/workflow/live-session-v3.js +86 -0
  370. package/dist/core/workflow/scope-id.d.ts +3 -0
  371. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  372. package/dist/core/workflow/scope-id.js +5 -0
  373. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  374. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  375. package/dist/core/workflow/workspaces/leases.js +53 -19
  376. package/dist/index.d.ts +1 -1
  377. package/dist/index.js +1 -1
  378. package/dist/lib/browser/client.d.ts +41 -0
  379. package/dist/lib/browser/client.d.ts.map +1 -1
  380. package/dist/lib/browser/client.js +203 -0
  381. package/dist/lib/browser/critique.d.ts +28 -2
  382. package/dist/lib/browser/critique.d.ts.map +1 -1
  383. package/dist/lib/browser/critique.js +74 -18
  384. package/dist/lib/browser/geometry.d.ts +1 -1
  385. package/dist/lib/browser/geometry.d.ts.map +1 -1
  386. package/dist/lib/browser/geometry.js +130 -6
  387. package/dist/lib/browser/index.d.ts +3 -0
  388. package/dist/lib/browser/index.d.ts.map +1 -1
  389. package/dist/lib/browser/index.js +3 -0
  390. package/dist/lib/browser/qa-plan.d.ts +174 -0
  391. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  392. package/dist/lib/browser/qa-plan.js +321 -0
  393. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  394. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  395. package/dist/lib/browser/qa-reuse.js +222 -0
  396. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  397. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  398. package/dist/lib/browser/qa-snapshot.js +171 -0
  399. package/dist/lib/browser/runts.d.ts.map +1 -1
  400. package/dist/lib/browser/runts.js +22 -1
  401. package/dist/lib/browser/tiling.d.ts +71 -0
  402. package/dist/lib/browser/tiling.d.ts.map +1 -0
  403. package/dist/lib/browser/tiling.js +118 -0
  404. package/dist/lib/context/index.d.ts +0 -3
  405. package/dist/lib/context/index.d.ts.map +1 -1
  406. package/dist/lib/context/index.js +20 -42
  407. package/dist/lib/council/index.d.ts +2 -2
  408. package/dist/lib/council/index.d.ts.map +1 -1
  409. package/dist/lib/council/index.js +9 -20
  410. package/dist/lib/docs-frontmatter.d.ts +1 -6
  411. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  412. package/dist/lib/docs-frontmatter.js +12 -78
  413. package/dist/lib/docs-index.d.ts +9 -0
  414. package/dist/lib/docs-index.d.ts.map +1 -1
  415. package/dist/lib/docs-index.js +32 -3
  416. package/dist/lib/docs-lint.d.ts.map +1 -1
  417. package/dist/lib/docs-lint.js +14 -30
  418. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  419. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  420. package/dist/lib/docs-metadata-audit.js +132 -0
  421. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  422. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  423. package/dist/lib/docs-metadata-managed.js +78 -0
  424. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  425. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  426. package/dist/lib/docs-metadata-sync.js +222 -0
  427. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  428. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  429. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  430. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  431. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  432. package/dist/lib/docs-metadata-v2.js +424 -0
  433. package/dist/lib/docs-new.d.ts +11 -0
  434. package/dist/lib/docs-new.d.ts.map +1 -0
  435. package/dist/lib/docs-new.js +52 -0
  436. package/dist/lib/docs-sweep.d.ts.map +1 -1
  437. package/dist/lib/docs-sweep.js +45 -29
  438. package/dist/lib/headless/index.d.ts +98 -0
  439. package/dist/lib/headless/index.d.ts.map +1 -0
  440. package/dist/lib/headless/index.js +211 -0
  441. package/dist/lib/identities/assume.d.ts +4 -4
  442. package/dist/lib/identities/assume.d.ts.map +1 -1
  443. package/dist/lib/identities/assume.js +52 -68
  444. package/dist/lib/instructions/apply.d.ts +5 -4
  445. package/dist/lib/instructions/apply.d.ts.map +1 -1
  446. package/dist/lib/instructions/apply.js +32 -20
  447. package/dist/lib/instructions/bundle.d.ts +33 -0
  448. package/dist/lib/instructions/bundle.d.ts.map +1 -0
  449. package/dist/lib/instructions/bundle.js +149 -0
  450. package/dist/lib/instructions/splice.d.ts +0 -1
  451. package/dist/lib/instructions/splice.d.ts.map +1 -1
  452. package/dist/lib/instructions/splice.js +22 -6
  453. package/dist/lib/instructions/templates.d.ts +7 -5
  454. package/dist/lib/instructions/templates.d.ts.map +1 -1
  455. package/dist/lib/instructions/templates.js +79 -9
  456. package/package.json +27 -6
  457. package/schemas/config.schema.json +120 -2
  458. package/schemas/docs-metadata-v2.schema.json +441 -0
  459. package/schemas/event-v3.schema.json +24472 -0
  460. package/src/commander.ts +7 -1
  461. package/src/commands/adapter.ts +2 -2
  462. package/src/commands/agents.ts +1737 -570
  463. package/src/commands/artifacts.ts +7 -6
  464. package/src/commands/backup.ts +29 -21
  465. package/src/commands/browse.ts +349 -8
  466. package/src/commands/checkpoint.ts +4 -3
  467. package/src/commands/claude-desktop.ts +7 -5
  468. package/src/commands/context.ts +1 -6
  469. package/src/commands/decision.ts +27 -44
  470. package/src/commands/docs.ts +100 -33
  471. package/src/commands/doctor.ts +73 -8
  472. package/src/commands/events.ts +256 -0
  473. package/src/commands/governor.ts +18 -4
  474. package/src/commands/init.ts +264 -57
  475. package/src/commands/instructions.ts +129 -0
  476. package/src/commands/journal.ts +4 -13
  477. package/src/commands/ledger-v3.ts +111 -0
  478. package/src/commands/presence.ts +18 -11
  479. package/src/commands/sync.ts +1 -1
  480. package/src/commands/web.ts +67 -8
  481. package/src/commands/work.ts +28 -5
  482. package/src/core/adapter.ts +5 -0
  483. package/src/core/adapters/attest.ts +8 -3
  484. package/src/core/adapters/profiles.ts +4 -6
  485. package/src/core/agents/canonical-emit.ts +39 -28
  486. package/src/core/agents/cli.ts +242 -263
  487. package/src/core/agents/codex-archive-v3.ts +138 -0
  488. package/src/core/agents/coord-client.ts +75 -177
  489. package/src/core/agents/finalization.ts +120 -38
  490. package/src/core/agents/index.ts +5 -5
  491. package/src/core/agents/live-authority-v3.ts +375 -0
  492. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  493. package/src/core/agents/live-observation-v3.ts +216 -0
  494. package/src/core/agents/render/prompt-context.ts +89 -55
  495. package/src/core/agents/render/session-context.ts +23 -32
  496. package/src/core/agents/rules/claim-conflict.ts +85 -126
  497. package/src/core/agents/rules/commit-conflict.ts +3 -14
  498. package/src/core/agents/rules/stop-hook.ts +239 -293
  499. package/src/core/agents/session-events.ts +137 -104
  500. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  501. package/src/core/agents/session-finalizer-v3.ts +953 -0
  502. package/src/core/agents/session-name-display.ts +149 -0
  503. package/src/core/agents/state/activity-log.ts +6 -14
  504. package/src/core/agents/state/heartbeat-writer.ts +98 -242
  505. package/src/core/agents/state/live-coordination-view.ts +290 -0
  506. package/src/core/agents/state/session-state.ts +143 -0
  507. package/src/core/agents/state/stale-sweep.ts +40 -17
  508. package/src/core/artifacts/index.ts +4 -5
  509. package/src/core/config.ts +148 -3
  510. package/src/core/context/index.ts +9 -17
  511. package/src/core/events/span-parent.ts +46 -0
  512. package/src/core/events/v3/advance.ts +168 -0
  513. package/src/core/events/v3/authority-outbox.ts +548 -0
  514. package/src/core/events/v3/base-builder.ts +60 -0
  515. package/src/core/events/v3/base-contract.ts +882 -0
  516. package/src/core/events/v3/bootstrap.ts +226 -0
  517. package/src/core/events/v3/builder.ts +59 -0
  518. package/src/core/events/v3/canonical.ts +153 -0
  519. package/src/core/events/v3/capabilities.ts +171 -0
  520. package/src/core/events/v3/capability-drift.ts +177 -0
  521. package/src/core/events/v3/catalog.ts +202 -0
  522. package/src/core/events/v3/clock-order.ts +41 -0
  523. package/src/core/events/v3/contract.ts +365 -0
  524. package/src/core/events/v3/control.ts +576 -0
  525. package/src/core/events/v3/coordination-view.ts +193 -0
  526. package/src/core/events/v3/economics.ts +384 -0
  527. package/src/core/events/v3/finalization-view.ts +67 -0
  528. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  529. package/src/core/events/v3/generated.ts +48 -0
  530. package/src/core/events/v3/ids.ts +33 -0
  531. package/src/core/events/v3/index.ts +322 -0
  532. package/src/core/events/v3/latency.ts +551 -0
  533. package/src/core/events/v3/live-feed.ts +319 -0
  534. package/src/core/events/v3/live-observation.ts +39 -0
  535. package/src/core/events/v3/live-routing.ts +135 -0
  536. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  537. package/src/core/events/v3/producers/command.ts +201 -0
  538. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  539. package/src/core/events/v3/producers/coordination.ts +355 -0
  540. package/src/core/events/v3/producers/hook-base.ts +578 -0
  541. package/src/core/events/v3/producers/hook.ts +119 -0
  542. package/src/core/events/v3/producers/intake.ts +319 -0
  543. package/src/core/events/v3/producers/recorder.ts +2805 -0
  544. package/src/core/events/v3/projection.ts +653 -0
  545. package/src/core/events/v3/reader.ts +1127 -0
  546. package/src/core/events/v3/recovery-record.ts +244 -0
  547. package/src/core/events/v3/recovery.ts +271 -0
  548. package/src/core/events/v3/span-state.ts +187 -0
  549. package/src/core/events/v3/targets.ts +182 -0
  550. package/src/core/events/v3/turn-telemetry.ts +259 -0
  551. package/src/core/events/v3/validate.ts +361 -0
  552. package/src/core/events/v3/writer.ts +419 -0
  553. package/src/core/governor/index.ts +3 -0
  554. package/src/core/governor/plan-api.ts +10 -2
  555. package/src/core/governor/read.ts +3 -0
  556. package/src/core/governor/state.ts +52 -5
  557. package/src/core/guard/config.ts +206 -0
  558. package/src/core/guard/coordinator.ts +227 -0
  559. package/src/core/guard/evaluator.ts +343 -0
  560. package/src/core/guard/evidence-v3.ts +227 -0
  561. package/src/core/guard/index.ts +35 -0
  562. package/src/core/guard/live-source-v3.ts +204 -0
  563. package/src/core/guard/storage.ts +188 -0
  564. package/src/core/guard/types.ts +152 -0
  565. package/src/core/hooks/adapter/detect.ts +28 -1
  566. package/src/core/hooks/adapter/events.ts +15 -6
  567. package/src/core/hooks/adapter/output.ts +7 -2
  568. package/src/core/hooks/adapter/parse.ts +81 -36
  569. package/src/core/hooks/adapter/wiring.ts +119 -13
  570. package/src/core/hooks/cli.ts +398 -422
  571. package/src/core/hooks/codex-authorization.ts +253 -0
  572. package/src/core/hooks/effects/image-capture.ts +228 -238
  573. package/src/core/hooks/effects/index.ts +1 -36
  574. package/src/core/hooks/events/input-hash.ts +47 -0
  575. package/src/core/hooks/index.ts +4 -11
  576. package/src/core/hooks/resolve/coord-root.ts +1 -1
  577. package/src/core/hooks/resolve/owner.ts +52 -45
  578. package/src/core/hooks/resolve/transcript.ts +165 -14
  579. package/src/core/hooks/session-name-presence.ts +14 -15
  580. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  581. package/src/core/journal/index.ts +15 -22
  582. package/src/core/presence/blob.ts +63 -38
  583. package/src/core/presence/codec-digest.ts +215 -0
  584. package/src/core/presence/index.ts +18 -1
  585. package/src/core/presence/relay-client.ts +5 -5
  586. package/src/core/work/index.ts +3 -0
  587. package/src/core/work/read.ts +3 -0
  588. package/src/core/work/runner.ts +6 -0
  589. package/src/core/work/state.ts +27 -3
  590. package/src/core/workflow/engine.ts +24 -24
  591. package/src/core/workflow/live-session-v3.ts +126 -0
  592. package/src/core/workflow/scope-id.ts +6 -0
  593. package/src/core/workflow/workspaces/leases.ts +56 -19
  594. package/src/index.ts +1 -1
  595. package/src/lib/browser/client.ts +230 -0
  596. package/src/lib/browser/critique.ts +104 -27
  597. package/src/lib/browser/geometry.ts +143 -14
  598. package/src/lib/browser/index.ts +34 -0
  599. package/src/lib/browser/qa-plan.ts +501 -0
  600. package/src/lib/browser/qa-reuse.ts +306 -0
  601. package/src/lib/browser/qa-snapshot.ts +223 -0
  602. package/src/lib/browser/runts.ts +27 -2
  603. package/src/lib/browser/tiling.ts +164 -0
  604. package/src/lib/context/index.ts +22 -46
  605. package/src/lib/council/index.ts +9 -21
  606. package/src/lib/docs-frontmatter.ts +8 -79
  607. package/src/lib/docs-index.ts +33 -3
  608. package/src/lib/docs-lint.ts +15 -29
  609. package/src/lib/docs-metadata-audit.ts +166 -0
  610. package/src/lib/docs-metadata-managed.ts +83 -0
  611. package/src/lib/docs-metadata-sync.ts +262 -0
  612. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  613. package/src/lib/docs-metadata-v2.ts +646 -0
  614. package/src/lib/docs-new.ts +63 -0
  615. package/src/lib/docs-sweep.ts +42 -28
  616. package/src/lib/headless/index.ts +287 -0
  617. package/src/lib/identities/assume.ts +67 -86
  618. package/src/lib/instructions/apply.ts +33 -20
  619. package/src/lib/instructions/bundle.ts +199 -0
  620. package/src/lib/instructions/splice.ts +21 -7
  621. package/src/lib/instructions/templates.ts +85 -13
  622. package/dist/core/agents/cli-emit.d.ts +0 -27
  623. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  624. package/dist/core/agents/cli-emit.js +0 -57
  625. package/dist/core/agents/codex-replay.d.ts +0 -29
  626. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  627. package/dist/core/agents/codex-replay.js +0 -138
  628. package/dist/core/agents/events/consume.d.ts +0 -82
  629. package/dist/core/agents/events/consume.d.ts.map +0 -1
  630. package/dist/core/agents/events/consume.js +0 -195
  631. package/dist/core/agents/events/emit.d.ts +0 -42
  632. package/dist/core/agents/events/emit.d.ts.map +0 -1
  633. package/dist/core/agents/events/emit.js +0 -75
  634. package/dist/core/agents/events/ulid.d.ts +0 -11
  635. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  636. package/dist/core/agents/events/ulid.js +0 -47
  637. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -65
  638. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  639. package/dist/core/agents/state/heartbeat-projector.js +0 -527
  640. package/dist/core/hooks/events/emit.d.ts +0 -31
  641. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  642. package/dist/core/hooks/events/emit.js +0 -93
  643. package/dist/core/hooks/events/rotate.d.ts +0 -43
  644. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  645. package/dist/core/hooks/events/rotate.js +0 -142
  646. package/dist/core/hooks/events/schema.d.ts +0 -312
  647. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  648. package/dist/core/hooks/events/schema.js +0 -12
  649. package/dist/core/hooks/events/ulid.d.ts +0 -10
  650. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  651. package/dist/core/hooks/events/ulid.js +0 -47
  652. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  653. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  654. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  655. package/src/core/agents/cli-emit.ts +0 -64
  656. package/src/core/agents/codex-replay.ts +0 -163
  657. package/src/core/agents/events/consume.ts +0 -254
  658. package/src/core/agents/events/emit.ts +0 -115
  659. package/src/core/agents/events/ulid.ts +0 -51
  660. package/src/core/agents/state/heartbeat-projector.ts +0 -582
  661. package/src/core/hooks/events/emit.ts +0 -125
  662. package/src/core/hooks/events/rotate.ts +0 -151
  663. package/src/core/hooks/events/schema.ts +0 -538
  664. package/src/core/hooks/events/ulid.ts +0 -51
  665. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -0,0 +1,134 @@
1
+ import { canonicalJsonV3 } from "./canonical.js";
2
+ /**
3
+ * Mechanical half of ADR 0080's in-place advance gate. It proves that every
4
+ * value accepted by the prior JSON Schema remains accepted by the next schema.
5
+ * Semantic reinterpretations remain breaking even when this structural check
6
+ * passes and require genesis review.
7
+ */
8
+ export function validateAdditiveSchemaAdvanceV3(prior, next) {
9
+ const issues = [];
10
+ const result = isSuperset(prior, next, "$", issues);
11
+ return {
12
+ eligible: result.compatible && result.strict,
13
+ strict: result.strict,
14
+ issues: [...new Set(issues)].sort(),
15
+ };
16
+ }
17
+ function isSuperset(prior, next, path, issues) {
18
+ const priorAnyOf = schemaArray(prior.anyOf);
19
+ const nextAnyOf = schemaArray(next.anyOf);
20
+ if (priorAnyOf || nextAnyOf) {
21
+ if (!priorAnyOf || !nextAnyOf)
22
+ return incompatible(path, "union_shape_changed", issues);
23
+ const used = new Set();
24
+ let strict = nextAnyOf.length > priorAnyOf.length;
25
+ for (const [priorIndex, priorBranch] of priorAnyOf.entries()) {
26
+ let match;
27
+ for (const [nextIndex, nextBranch] of nextAnyOf.entries()) {
28
+ if (used.has(nextIndex))
29
+ continue;
30
+ const branchIssues = [];
31
+ const result = isSuperset(priorBranch, nextBranch, `${path}/anyOf/${priorIndex}`, branchIssues);
32
+ if (result.compatible) {
33
+ match = { index: nextIndex, result };
34
+ break;
35
+ }
36
+ }
37
+ if (!match)
38
+ return incompatible(`${path}/anyOf/${priorIndex}`, "branch_removed_or_narrowed", issues);
39
+ used.add(match.index);
40
+ strict ||= match.result.strict;
41
+ }
42
+ return { compatible: true, strict };
43
+ }
44
+ if (prior.type === "object" || next.type === "object") {
45
+ if (prior.type !== "object" || next.type !== "object") {
46
+ return incompatible(path, "type_changed", issues);
47
+ }
48
+ if (prior.additionalProperties !== next.additionalProperties) {
49
+ return incompatible(path, "additional_properties_changed", issues);
50
+ }
51
+ const priorProperties = schemaMap(prior.properties);
52
+ const nextProperties = schemaMap(next.properties);
53
+ const priorRequired = stringSet(prior.required);
54
+ const nextRequired = stringSet(next.required);
55
+ let strict = false;
56
+ for (const name of priorRequired) {
57
+ if (!nextRequired.has(name))
58
+ strict = true;
59
+ }
60
+ for (const name of nextRequired) {
61
+ if (!priorRequired.has(name)) {
62
+ return incompatible(`${path}/properties/${name}`, "optional_became_required", issues);
63
+ }
64
+ }
65
+ for (const [name, priorProperty] of Object.entries(priorProperties)) {
66
+ const nextProperty = nextProperties[name];
67
+ if (!nextProperty)
68
+ return incompatible(`${path}/properties/${name}`, "property_removed", issues);
69
+ const result = isSuperset(priorProperty, nextProperty, `${path}/properties/${name}`, issues);
70
+ if (!result.compatible)
71
+ return result;
72
+ strict ||= result.strict;
73
+ }
74
+ for (const name of Object.keys(nextProperties)) {
75
+ if (!(name in priorProperties)) {
76
+ if (nextRequired.has(name)) {
77
+ return incompatible(`${path}/properties/${name}`, "new_property_is_required", issues);
78
+ }
79
+ strict = true;
80
+ }
81
+ }
82
+ return { compatible: true, strict };
83
+ }
84
+ if (prior.type === "array" || next.type === "array") {
85
+ if (prior.type !== "array" || next.type !== "array")
86
+ return incompatible(path, "type_changed", issues);
87
+ if (number(next.minItems, 0) < number(prior.minItems, 0)) {
88
+ // A lower minimum broadens acceptance.
89
+ }
90
+ else if (number(next.minItems, 0) > number(prior.minItems, 0)) {
91
+ return incompatible(path, "array_minimum_narrowed", issues);
92
+ }
93
+ const priorMax = number(prior.maxItems, Number.POSITIVE_INFINITY);
94
+ const nextMax = number(next.maxItems, Number.POSITIVE_INFINITY);
95
+ if (nextMax < priorMax)
96
+ return incompatible(path, "array_maximum_narrowed", issues);
97
+ const priorItems = prior.items;
98
+ const nextItems = next.items;
99
+ if (!!priorItems !== !!nextItems)
100
+ return incompatible(path, "array_items_changed", issues);
101
+ const itemResult = priorItems && nextItems
102
+ ? isSuperset(priorItems, nextItems, `${path}/items`, issues)
103
+ : { compatible: true, strict: false };
104
+ return {
105
+ compatible: itemResult.compatible,
106
+ strict: itemResult.strict ||
107
+ number(next.minItems, 0) < number(prior.minItems, 0) ||
108
+ nextMax > priorMax,
109
+ };
110
+ }
111
+ const ignored = new Set(["$id", "title", "description"]);
112
+ const priorComparable = Object.fromEntries(Object.entries(prior).filter(([key]) => !ignored.has(key)));
113
+ const nextComparable = Object.fromEntries(Object.entries(next).filter(([key]) => !ignored.has(key)));
114
+ if (canonicalJsonV3(priorComparable) !== canonicalJsonV3(nextComparable)) {
115
+ return incompatible(path, "constraint_changed", issues);
116
+ }
117
+ return { compatible: true, strict: false };
118
+ }
119
+ function incompatible(path, reason, issues) {
120
+ issues.push(`${path}:${reason}`);
121
+ return { compatible: false, strict: false };
122
+ }
123
+ function schemaArray(value) {
124
+ return Array.isArray(value) ? value : undefined;
125
+ }
126
+ function schemaMap(value) {
127
+ return value && typeof value === "object" ? value : {};
128
+ }
129
+ function stringSet(value) {
130
+ return new Set(Array.isArray(value) ? value.filter((item) => typeof item === "string") : []);
131
+ }
132
+ function number(value, fallback) {
133
+ return typeof value === "number" ? value : fallback;
134
+ }
@@ -0,0 +1,78 @@
1
+ import type { EventV3 } from "./contract.js";
2
+ export type AuthorityMutationV3 = {
3
+ kind: "task.transition";
4
+ state: "set" | "cleared";
5
+ task_fingerprint?: `sha256:${string}`;
6
+ } | {
7
+ kind: "lifecycle.transition";
8
+ state: "active" | "blocked" | "done";
9
+ reason_code?: string;
10
+ } | {
11
+ kind: "claim.transition";
12
+ operation: "acquired" | "released";
13
+ target_fingerprint: `sha256:${string}`;
14
+ access: "read" | "write";
15
+ } | {
16
+ kind: "identity.assume";
17
+ identity_id: string;
18
+ } | {
19
+ kind: "decision.resolve";
20
+ decision_id: string;
21
+ outcome: "approved" | "denied" | "deferred";
22
+ } | {
23
+ kind: "wait.start";
24
+ wait_id: string;
25
+ wait_kind: "permission" | "approval" | "decision" | "operator_input" | "dependency" | "scheduled";
26
+ } | {
27
+ kind: "wait.end";
28
+ wait_id: string;
29
+ outcome: "succeeded" | "failed" | "cancelled" | "timed_out" | "denied" | "interrupted" | "unknown";
30
+ };
31
+ export interface PrepareAuthorityTransactionV3Input {
32
+ transaction_id?: `txn_${string}`;
33
+ expected_prior_state_digest: `sha256:${string}`;
34
+ desired_state_digest: `sha256:${string}`;
35
+ actor_instance_id: string;
36
+ subject_instance_id: string;
37
+ mutation: AuthorityMutationV3;
38
+ event: EventV3;
39
+ }
40
+ export interface AuthorityTransactionV3 {
41
+ format: "harnery-event-v3-authority-transaction";
42
+ format_version: 1;
43
+ transaction_id: `txn_${string}`;
44
+ expected_prior_state_digest: `sha256:${string}`;
45
+ desired_state_digest: `sha256:${string}`;
46
+ actor_instance_id: string;
47
+ subject_instance_id: string;
48
+ mutation: AuthorityMutationV3;
49
+ event_id: string;
50
+ event_row: string;
51
+ }
52
+ export interface AuthorityReceiptV3 {
53
+ format: "harnery-event-v3-authority-receipt";
54
+ format_version: 1;
55
+ transaction_id: `txn_${string}`;
56
+ transaction_digest: `sha256:${string}`;
57
+ desired_state_digest: `sha256:${string}`;
58
+ event_id: string;
59
+ event_row_digest: `sha256:${string}`;
60
+ committed_at: string;
61
+ }
62
+ export interface AuthorityReconcilerV3 {
63
+ readStateDigest: () => `sha256:${string}`;
64
+ apply: (mutation: AuthorityMutationV3, transactionId: string) => void;
65
+ now?: () => Date;
66
+ }
67
+ /** Durably publish the full transaction before any authority-bearing state mutation. */
68
+ export declare function prepareAuthorityTransactionV3(coordRoot: string, input: PrepareAuthorityTransactionV3Input): AuthorityTransactionV3;
69
+ /** Build and validate an authority transaction without touching durable state. */
70
+ export declare function buildAuthorityTransactionV3(input: PrepareAuthorityTransactionV3Input): AuthorityTransactionV3;
71
+ /** Publish an already-built transaction exactly, preserving its pre-minted event. */
72
+ export declare function publishAuthorityTransactionV3(coordRoot: string, transaction: AuthorityTransactionV3): AuthorityTransactionV3;
73
+ /** Apply or recognize the desired state, durably submit its event, then leave a hash-only receipt. */
74
+ export declare function reconcileAuthorityTransactionV3(coordRoot: string, transactionId: string, reconciler: AuthorityReconcilerV3): AuthorityReceiptV3;
75
+ export declare function listPendingAuthorityTransactionsV3(coordRoot: string): AuthorityTransactionV3[];
76
+ export declare function readAuthorityTransactionV3(path: string): AuthorityTransactionV3;
77
+ export declare function readAuthorityReceiptV3(path: string): AuthorityReceiptV3;
78
+ //# sourceMappingURL=authority-outbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authority-outbox.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/authority-outbox.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAU7C,MAAM,MAAM,mBAAmB,GAC3B;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,gBAAgB,CAAC,EAAE,UAAU,MAAM,EAAE,CAAC;CACvC,GACD;IACE,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACnC,kBAAkB,EAAE,UAAU,MAAM,EAAE,CAAC;IACvC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,GACD;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;CAC7C,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EACL,YAAY,GACZ,UAAU,GACV,UAAU,GACV,gBAAgB,GAChB,YAAY,GACZ,WAAW,CAAC;CACjB,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EACH,WAAW,GACX,QAAQ,GACR,WAAW,GACX,WAAW,GACX,QAAQ,GACR,aAAa,GACb,SAAS,CAAC;CACf,CAAC;AAEN,MAAM,WAAW,kCAAkC;IACjD,cAAc,CAAC,EAAE,OAAO,MAAM,EAAE,CAAC;IACjC,2BAA2B,EAAE,UAAU,MAAM,EAAE,CAAC;IAChD,oBAAoB,EAAE,UAAU,MAAM,EAAE,CAAC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,wCAAwC,CAAC;IACjD,cAAc,EAAE,CAAC,CAAC;IAClB,cAAc,EAAE,OAAO,MAAM,EAAE,CAAC;IAChC,2BAA2B,EAAE,UAAU,MAAM,EAAE,CAAC;IAChD,oBAAoB,EAAE,UAAU,MAAM,EAAE,CAAC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,oCAAoC,CAAC;IAC7C,cAAc,EAAE,CAAC,CAAC;IAClB,cAAc,EAAE,OAAO,MAAM,EAAE,CAAC;IAChC,kBAAkB,EAAE,UAAU,MAAM,EAAE,CAAC;IACvC,oBAAoB,EAAE,UAAU,MAAM,EAAE,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,UAAU,MAAM,EAAE,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,UAAU,MAAM,EAAE,CAAC;IAC1C,KAAK,EAAE,CAAC,QAAQ,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IACtE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wFAAwF;AACxF,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,kCAAkC,GACxC,sBAAsB,CAExB;AAED,kFAAkF;AAClF,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,kCAAkC,GACxC,sBAAsB,CAgBxB;AAED,qFAAqF;AACrF,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,sBAAsB,GAClC,sBAAsB,CAoBxB;AAED,sGAAsG;AACtG,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,qBAAqB,GAChC,kBAAkB,CAsCpB;AAED,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAO9F;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,CAa/E;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAavE"}
@@ -0,0 +1,399 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { closeSync, existsSync, fsyncSync, linkSync, openSync, readdirSync, readFileSync, unlinkSync, writeFileSync, } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { fsyncParentDirectory } from "../../workflow/durable-record.js";
5
+ import { canonicalJsonV3, sha256V3 } from "./canonical.js";
6
+ import { assertEventV3 } from "./validate.js";
7
+ import { ensureEventV3Layout, eventV3Paths, writeEventV3 } from "./writer.js";
8
+ const SHA256_PATTERN = /^sha256:[a-f0-9]{64}$/;
9
+ const INSTANCE_PATTERN = /^inst_[a-zA-Z0-9._-]{1,128}$/;
10
+ const TX_PATTERN = /^txn_[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
11
+ const SAFE_ID_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,127}$/;
12
+ const REASON_PATTERN = /^[a-z0-9][a-z0-9._-]{0,79}$/;
13
+ /** Durably publish the full transaction before any authority-bearing state mutation. */
14
+ export function prepareAuthorityTransactionV3(coordRoot, input) {
15
+ return publishAuthorityTransactionV3(coordRoot, buildAuthorityTransactionV3(input));
16
+ }
17
+ /** Build and validate an authority transaction without touching durable state. */
18
+ export function buildAuthorityTransactionV3(input) {
19
+ assertEventV3(input.event);
20
+ const transaction = {
21
+ format: "harnery-event-v3-authority-transaction",
22
+ format_version: 1,
23
+ transaction_id: input.transaction_id ?? `txn_${randomUUID()}`,
24
+ expected_prior_state_digest: input.expected_prior_state_digest,
25
+ desired_state_digest: input.desired_state_digest,
26
+ actor_instance_id: input.actor_instance_id,
27
+ subject_instance_id: input.subject_instance_id,
28
+ mutation: input.mutation,
29
+ event_id: input.event.event_id,
30
+ event_row: `${canonicalJsonV3(input.event)}\n`,
31
+ };
32
+ validateTransaction(transaction);
33
+ return transaction;
34
+ }
35
+ /** Publish an already-built transaction exactly, preserving its pre-minted event. */
36
+ export function publishAuthorityTransactionV3(coordRoot, transaction) {
37
+ validateTransaction(transaction);
38
+ const paths = ensureEventV3Layout(coordRoot);
39
+ const readyPath = authorityReadyPath(paths.authorityOutbox, transaction.transaction_id);
40
+ const serialized = `${canonicalJsonV3(transaction)}\n`;
41
+ if (existsSync(readyPath)) {
42
+ if (readFileSync(readyPath, "utf8") !== serialized) {
43
+ throw new Error("authority transaction ID conflicts with another ready transaction");
44
+ }
45
+ return transaction;
46
+ }
47
+ try {
48
+ publishExclusive(readyPath, serialized);
49
+ }
50
+ catch (error) {
51
+ if (error.code !== "EEXIST")
52
+ throw error;
53
+ if (readFileSync(readyPath, "utf8") !== serialized) {
54
+ throw new Error("authority transaction ID conflicts with another ready transaction");
55
+ }
56
+ }
57
+ return transaction;
58
+ }
59
+ /** Apply or recognize the desired state, durably submit its event, then leave a hash-only receipt. */
60
+ export function reconcileAuthorityTransactionV3(coordRoot, transactionId, reconciler) {
61
+ assertTransactionId(transactionId);
62
+ const paths = ensureEventV3Layout(coordRoot);
63
+ const committedPath = authorityCommittedPath(paths.authorityOutbox, transactionId);
64
+ if (existsSync(committedPath))
65
+ return readAuthorityReceiptV3(committedPath);
66
+ const readyPath = authorityReadyPath(paths.authorityOutbox, transactionId);
67
+ const transaction = readAuthorityTransactionV3(readyPath);
68
+ const current = reconciler.readStateDigest();
69
+ if (current === transaction.expected_prior_state_digest) {
70
+ reconciler.apply(transaction.mutation, transaction.transaction_id);
71
+ }
72
+ else if (current !== transaction.desired_state_digest) {
73
+ throw new Error("authority transaction prior state conflicts with current state");
74
+ }
75
+ if (reconciler.readStateDigest() !== transaction.desired_state_digest) {
76
+ throw new Error("authority transaction did not reach its declared desired state");
77
+ }
78
+ const event = JSON.parse(transaction.event_row);
79
+ assertEventV3(event);
80
+ writeEventV3(coordRoot, event);
81
+ const receipt = {
82
+ format: "harnery-event-v3-authority-receipt",
83
+ format_version: 1,
84
+ transaction_id: transaction.transaction_id,
85
+ transaction_digest: sha256V3(`${canonicalJsonV3(transaction)}\n`),
86
+ desired_state_digest: transaction.desired_state_digest,
87
+ event_id: transaction.event_id,
88
+ event_row_digest: sha256V3(transaction.event_row),
89
+ committed_at: (reconciler.now ?? (() => new Date()))().toISOString(),
90
+ };
91
+ try {
92
+ publishExclusive(committedPath, `${canonicalJsonV3(receipt)}\n`);
93
+ }
94
+ catch (error) {
95
+ if (error.code !== "EEXIST")
96
+ throw error;
97
+ return readAuthorityReceiptV3(committedPath);
98
+ }
99
+ unlinkSync(readyPath);
100
+ fsyncParentDirectory(readyPath);
101
+ return receipt;
102
+ }
103
+ export function listPendingAuthorityTransactionsV3(coordRoot) {
104
+ const outbox = eventV3Paths(coordRoot).authorityOutbox;
105
+ if (!existsSync(outbox))
106
+ return [];
107
+ return readdirSync(outbox)
108
+ .filter((name) => name.endsWith(".ready.json"))
109
+ .sort()
110
+ .map((name) => readAuthorityTransactionV3(join(outbox, name)));
111
+ }
112
+ export function readAuthorityTransactionV3(path) {
113
+ const serialized = readFileSync(path, "utf8");
114
+ let parsed;
115
+ try {
116
+ parsed = JSON.parse(serialized);
117
+ }
118
+ catch {
119
+ throw new Error("authority transaction is malformed");
120
+ }
121
+ const transaction = validateTransaction(parsed);
122
+ if (`${canonicalJsonV3(transaction)}\n` !== serialized) {
123
+ throw new Error("authority transaction is not canonical");
124
+ }
125
+ return transaction;
126
+ }
127
+ export function readAuthorityReceiptV3(path) {
128
+ const serialized = readFileSync(path, "utf8");
129
+ let parsed;
130
+ try {
131
+ parsed = JSON.parse(serialized);
132
+ }
133
+ catch {
134
+ throw new Error("authority receipt is malformed");
135
+ }
136
+ const receipt = validateReceipt(parsed);
137
+ if (`${canonicalJsonV3(receipt)}\n` !== serialized) {
138
+ throw new Error("authority receipt is not canonical");
139
+ }
140
+ return receipt;
141
+ }
142
+ function validateTransaction(value) {
143
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
144
+ throw new Error("authority transaction envelope is invalid");
145
+ }
146
+ const record = value;
147
+ if (Object.keys(record).sort().join("\0") !==
148
+ "actor_instance_id\0desired_state_digest\0event_id\0event_row\0expected_prior_state_digest\0format\0format_version\0mutation\0subject_instance_id\0transaction_id") {
149
+ throw new Error("authority transaction has unsupported fields");
150
+ }
151
+ if (record.format !== "harnery-event-v3-authority-transaction" ||
152
+ record.format_version !== 1 ||
153
+ typeof record.transaction_id !== "string" ||
154
+ typeof record.expected_prior_state_digest !== "string" ||
155
+ typeof record.desired_state_digest !== "string" ||
156
+ typeof record.actor_instance_id !== "string" ||
157
+ typeof record.subject_instance_id !== "string" ||
158
+ typeof record.event_id !== "string" ||
159
+ typeof record.event_row !== "string") {
160
+ throw new Error("authority transaction values are invalid");
161
+ }
162
+ assertTransactionId(record.transaction_id);
163
+ if (!SHA256_PATTERN.test(record.expected_prior_state_digest) ||
164
+ !SHA256_PATTERN.test(record.desired_state_digest) ||
165
+ !INSTANCE_PATTERN.test(record.actor_instance_id) ||
166
+ !INSTANCE_PATTERN.test(record.subject_instance_id)) {
167
+ throw new Error("authority transaction authority fields are invalid");
168
+ }
169
+ const mutation = validateMutation(record.mutation);
170
+ let event;
171
+ try {
172
+ event = JSON.parse(record.event_row);
173
+ }
174
+ catch {
175
+ throw new Error("authority transaction event row is malformed");
176
+ }
177
+ assertEventV3(event);
178
+ if (record.event_id !== event.event_id || `${canonicalJsonV3(event)}\n` !== record.event_row) {
179
+ throw new Error("authority transaction event row is not canonical or mismatched");
180
+ }
181
+ const transaction = { ...record, mutation };
182
+ validateTransactionBinding(transaction, event);
183
+ return transaction;
184
+ }
185
+ function validateMutation(value) {
186
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
187
+ throw new Error("authority mutation is invalid");
188
+ }
189
+ const mutation = value;
190
+ if (mutation.kind === "task.transition") {
191
+ const allowed = mutation.task_fingerprint === undefined ? "kind\0state" : "kind\0state\0task_fingerprint";
192
+ if (Object.keys(mutation).sort().join("\0") !== allowed ||
193
+ !["set", "cleared"].includes(String(mutation.state)) ||
194
+ (mutation.state === "set" &&
195
+ (typeof mutation.task_fingerprint !== "string" ||
196
+ !SHA256_PATTERN.test(mutation.task_fingerprint))) ||
197
+ (mutation.state === "cleared" && mutation.task_fingerprint !== undefined)) {
198
+ throw new Error("authority task mutation is invalid");
199
+ }
200
+ }
201
+ else if (mutation.kind === "lifecycle.transition") {
202
+ const allowed = mutation.reason_code === undefined ? "kind\0state" : "kind\0reason_code\0state";
203
+ if (Object.keys(mutation).sort().join("\0") !== allowed ||
204
+ !["active", "blocked", "done"].includes(String(mutation.state)) ||
205
+ (mutation.reason_code !== undefined &&
206
+ (typeof mutation.reason_code !== "string" || !REASON_PATTERN.test(mutation.reason_code)))) {
207
+ throw new Error("authority lifecycle mutation is invalid");
208
+ }
209
+ }
210
+ else if (mutation.kind === "claim.transition") {
211
+ if (Object.keys(mutation).sort().join("\0") !== "access\0kind\0operation\0target_fingerprint" ||
212
+ !["read", "write"].includes(String(mutation.access)) ||
213
+ !["acquired", "released"].includes(String(mutation.operation)) ||
214
+ typeof mutation.target_fingerprint !== "string" ||
215
+ !SHA256_PATTERN.test(mutation.target_fingerprint)) {
216
+ throw new Error("authority claim mutation is invalid");
217
+ }
218
+ }
219
+ else if (mutation.kind === "identity.assume") {
220
+ if (Object.keys(mutation).sort().join("\0") !== "identity_id\0kind" ||
221
+ typeof mutation.identity_id !== "string" ||
222
+ !SAFE_ID_PATTERN.test(mutation.identity_id)) {
223
+ throw new Error("authority identity mutation is invalid");
224
+ }
225
+ }
226
+ else if (mutation.kind === "decision.resolve") {
227
+ if (Object.keys(mutation).sort().join("\0") !== "decision_id\0kind\0outcome" ||
228
+ typeof mutation.decision_id !== "string" ||
229
+ !SAFE_ID_PATTERN.test(mutation.decision_id) ||
230
+ !["approved", "denied", "deferred"].includes(String(mutation.outcome))) {
231
+ throw new Error("authority decision mutation is invalid");
232
+ }
233
+ }
234
+ else if (mutation.kind === "wait.start") {
235
+ if (Object.keys(mutation).sort().join("\0") !== "kind\0wait_id\0wait_kind" ||
236
+ typeof mutation.wait_id !== "string" ||
237
+ !SAFE_ID_PATTERN.test(mutation.wait_id) ||
238
+ !["permission", "approval", "decision", "operator_input", "dependency", "scheduled"].includes(String(mutation.wait_kind))) {
239
+ throw new Error("authority wait-start mutation is invalid");
240
+ }
241
+ }
242
+ else if (mutation.kind === "wait.end") {
243
+ if (Object.keys(mutation).sort().join("\0") !== "kind\0outcome\0wait_id" ||
244
+ typeof mutation.wait_id !== "string" ||
245
+ !SAFE_ID_PATTERN.test(mutation.wait_id) ||
246
+ ![
247
+ "succeeded",
248
+ "failed",
249
+ "cancelled",
250
+ "timed_out",
251
+ "denied",
252
+ "interrupted",
253
+ "unknown",
254
+ ].includes(String(mutation.outcome))) {
255
+ throw new Error("authority wait-end mutation is invalid");
256
+ }
257
+ }
258
+ else {
259
+ throw new Error("authority mutation kind is unsupported");
260
+ }
261
+ return mutation;
262
+ }
263
+ function validateTransactionBinding(transaction, event) {
264
+ if (event.scope.instance_id !== transaction.actor_instance_id ||
265
+ event.provenance.attribution.state !== "verified" ||
266
+ event.provenance.attribution.observer_instance_id !== transaction.actor_instance_id ||
267
+ event.provenance.attribution.subject_instance_id !== transaction.subject_instance_id) {
268
+ throw new Error("authority transaction attribution does not match its event");
269
+ }
270
+ const mutation = transaction.mutation;
271
+ if (mutation.kind === "task.transition") {
272
+ if (event.event_type !== "coord.task_changed" ||
273
+ event.payload.actor_instance_id !== transaction.actor_instance_id ||
274
+ event.payload.subject_instance_id !== transaction.subject_instance_id ||
275
+ event.payload.authority.transaction_id !== transaction.transaction_id ||
276
+ event.payload.new_state !== mutation.state ||
277
+ event.payload.reason_fingerprint?.digest !== mutation.task_fingerprint) {
278
+ throw new Error("authority task transaction does not match its event");
279
+ }
280
+ return;
281
+ }
282
+ if (mutation.kind === "lifecycle.transition") {
283
+ if (event.event_type !== "coord.lifecycle_changed" ||
284
+ event.payload.actor_instance_id !== transaction.actor_instance_id ||
285
+ event.payload.subject_instance_id !== transaction.subject_instance_id ||
286
+ event.payload.authority.transaction_id !== transaction.transaction_id ||
287
+ event.payload.new_state !== mutation.state ||
288
+ event.payload.reason !== (mutation.reason_code ?? "lifecycle_transition")) {
289
+ throw new Error("authority lifecycle transaction does not match its event");
290
+ }
291
+ return;
292
+ }
293
+ if (mutation.kind === "claim.transition") {
294
+ const operation = mutation.operation;
295
+ if (event.event_type !== "coord.claim_changed" ||
296
+ event.payload.actor_instance_id !== transaction.actor_instance_id ||
297
+ event.payload.subject_instance_id !== transaction.subject_instance_id ||
298
+ event.payload.authority.transaction_id !== transaction.transaction_id ||
299
+ event.payload.operation !== operation ||
300
+ event.payload.target.fingerprint.digest !== mutation.target_fingerprint ||
301
+ event.payload.access !== mutation.access) {
302
+ throw new Error("authority claim transaction does not match its event");
303
+ }
304
+ return;
305
+ }
306
+ if (mutation.kind === "identity.assume") {
307
+ if (event.event_type !== "coord.identity_attested" ||
308
+ event.payload.actor_instance_id !== transaction.actor_instance_id ||
309
+ event.payload.subject_instance_id !== transaction.subject_instance_id ||
310
+ event.payload.authority.transaction_id !== transaction.transaction_id ||
311
+ event.payload.identity_id !== mutation.identity_id) {
312
+ throw new Error("authority identity transaction does not match its event");
313
+ }
314
+ return;
315
+ }
316
+ if (mutation.kind === "decision.resolve") {
317
+ if (event.event_type !== "decision.state_changed" ||
318
+ event.payload.authority.transaction_id !== transaction.transaction_id ||
319
+ event.payload.decision_id !== mutation.decision_id ||
320
+ event.payload.new_state !== mutation.outcome) {
321
+ throw new Error("authority decision transaction does not match its event");
322
+ }
323
+ return;
324
+ }
325
+ if (mutation.kind === "wait.start") {
326
+ if (event.event_type !== "wait.started" ||
327
+ event.payload.authority_reference !== transaction.transaction_id ||
328
+ event.payload.wait_id !== mutation.wait_id ||
329
+ event.payload.kind !== mutation.wait_kind) {
330
+ throw new Error("authority wait-start transaction does not match its event");
331
+ }
332
+ return;
333
+ }
334
+ if (mutation.kind !== "wait.end") {
335
+ throw new Error("authority transaction mutation binding is unsupported");
336
+ }
337
+ if (event.event_type !== "wait.ended" ||
338
+ event.payload.resolution_reference !== transaction.transaction_id ||
339
+ event.payload.wait_id !== mutation.wait_id ||
340
+ event.payload.outcome !== mutation.outcome) {
341
+ throw new Error("authority wait-end transaction does not match its event");
342
+ }
343
+ }
344
+ function validateReceipt(value) {
345
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
346
+ throw new Error("authority receipt is invalid");
347
+ }
348
+ const receipt = value;
349
+ if (Object.keys(receipt).sort().join("\0") !==
350
+ "committed_at\0desired_state_digest\0event_id\0event_row_digest\0format\0format_version\0transaction_digest\0transaction_id" ||
351
+ receipt.format !== "harnery-event-v3-authority-receipt" ||
352
+ receipt.format_version !== 1 ||
353
+ typeof receipt.transaction_id !== "string" ||
354
+ typeof receipt.transaction_digest !== "string" ||
355
+ typeof receipt.desired_state_digest !== "string" ||
356
+ typeof receipt.event_id !== "string" ||
357
+ typeof receipt.event_row_digest !== "string" ||
358
+ typeof receipt.committed_at !== "string" ||
359
+ !SHA256_PATTERN.test(receipt.transaction_digest) ||
360
+ !SHA256_PATTERN.test(receipt.desired_state_digest) ||
361
+ !SHA256_PATTERN.test(receipt.event_row_digest) ||
362
+ Number.isNaN(Date.parse(receipt.committed_at))) {
363
+ throw new Error("authority receipt values are invalid");
364
+ }
365
+ assertTransactionId(receipt.transaction_id);
366
+ return receipt;
367
+ }
368
+ function publishExclusive(path, serialized) {
369
+ const temporary = `${path}.tmp-${process.pid}-${randomUUID()}`;
370
+ let fd;
371
+ try {
372
+ fd = openSync(temporary, "wx", 0o600);
373
+ writeFileSync(fd, serialized, "utf8");
374
+ fsyncSync(fd);
375
+ closeSync(fd);
376
+ fd = undefined;
377
+ linkSync(temporary, path);
378
+ fsyncParentDirectory(path);
379
+ unlinkSync(temporary);
380
+ }
381
+ finally {
382
+ if (fd !== undefined)
383
+ closeSync(fd);
384
+ if (existsSync(temporary))
385
+ unlinkSync(temporary);
386
+ }
387
+ }
388
+ function authorityReadyPath(outbox, transactionId) {
389
+ assertTransactionId(transactionId);
390
+ return join(outbox, `${transactionId}.ready.json`);
391
+ }
392
+ function authorityCommittedPath(outbox, transactionId) {
393
+ assertTransactionId(transactionId);
394
+ return join(outbox, `${transactionId}.committed.json`);
395
+ }
396
+ function assertTransactionId(value) {
397
+ if (!TX_PATTERN.test(value))
398
+ throw new Error("authority transaction ID is invalid");
399
+ }
@@ -0,0 +1,20 @@
1
+ import type { EventOfTypeV3Base, EventPayloadV3Base, EventTypeV3Base } from "./base-contract.js";
2
+ type EventWithoutDiscriminator<T extends EventTypeV3Base> = Omit<EventOfTypeV3Base<T>, "attestation_id" | "contract" | "event_id" | "event_type" | "payload" | "time">;
3
+ type RootEventTypeV3Base = "ledger.genesis" | "ledger.activated" | "ledger.schema_advanced" | "ledger.comparability_advanced";
4
+ type AttestationInputV3Base<T extends EventTypeV3Base> = T extends RootEventTypeV3Base ? {
5
+ attestation_id?: never;
6
+ } : {
7
+ attestation_id: `att_${string}`;
8
+ };
9
+ export type BuildEventV3BaseInput<T extends EventTypeV3Base> = EventWithoutDiscriminator<T> & AttestationInputV3Base<T> & {
10
+ payload: EventPayloadV3Base<T>;
11
+ event_id?: `evt_${string}`;
12
+ observed_at?: string;
13
+ recorded_at?: string;
14
+ monotonic_ns?: string;
15
+ clock_id?: `clk_${string}`;
16
+ skew?: "normal" | "regressed" | "unknown";
17
+ };
18
+ export declare function buildEventV3Base<T extends EventTypeV3Base>(eventType: T, input: BuildEventV3BaseInput<T>): EventOfTypeV3Base<T>;
19
+ export {};
20
+ //# sourceMappingURL=base-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-builder.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/base-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKjG,KAAK,yBAAyB,CAAC,CAAC,SAAS,eAAe,IAAI,IAAI,CAC9D,iBAAiB,CAAC,CAAC,CAAC,EACpB,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,MAAM,CAC/E,CAAC;AAEF,KAAK,mBAAmB,GACpB,gBAAgB,GAChB,kBAAkB,GAClB,wBAAwB,GACxB,+BAA+B,CAAC;AAEpC,KAAK,sBAAsB,CAAC,CAAC,SAAS,eAAe,IAAI,CAAC,SAAS,mBAAmB,GAClF;IAAE,cAAc,CAAC,EAAE,KAAK,CAAA;CAAE,GAC1B;IAAE,cAAc,EAAE,OAAO,MAAM,EAAE,CAAA;CAAE,CAAC;AAExC,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,eAAe,IAAI,yBAAyB,CAAC,CAAC,CAAC,GACzF,sBAAsB,CAAC,CAAC,CAAC,GAAG;IAC1B,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,MAAM,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEJ,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,eAAe,EACxD,SAAS,EAAE,CAAC,EACZ,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAC9B,iBAAiB,CAAC,CAAC,CAAC,CAyBtB"}
@@ -0,0 +1,29 @@
1
+ import { EVENT_V3_BASE_CONTRACT_MAJOR, EVENT_V3_BASE_CONTRACT_NAME } from "./base-contract.js";
2
+ import { EVENT_V3_SCHEMA_DIGEST } from "./generated.js";
3
+ import { clockIdV3, eventIdV3 } from "./ids.js";
4
+ export function buildEventV3Base(eventType, input) {
5
+ const now = input.recorded_at ?? new Date().toISOString();
6
+ const event = {
7
+ contract: {
8
+ name: EVENT_V3_BASE_CONTRACT_NAME,
9
+ major: EVENT_V3_BASE_CONTRACT_MAJOR,
10
+ schema_digest: EVENT_V3_SCHEMA_DIGEST,
11
+ },
12
+ event_id: input.event_id ?? eventIdV3(),
13
+ event_type: eventType,
14
+ time: {
15
+ observed_at: input.observed_at ?? now,
16
+ recorded_at: now,
17
+ ...(input.monotonic_ns ? { monotonic_ns: input.monotonic_ns } : {}),
18
+ clock_id: input.clock_id ?? clockIdV3(),
19
+ skew: input.skew ?? "unknown",
20
+ },
21
+ producer: input.producer,
22
+ scope: input.scope,
23
+ ...(input.attestation_id ? { attestation_id: input.attestation_id } : {}),
24
+ links: input.links,
25
+ provenance: input.provenance,
26
+ payload: input.payload,
27
+ };
28
+ return event;
29
+ }