harnery 0.35.0 → 0.36.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 (616) hide show
  1. package/dist/commander.d.ts +30 -5
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +124 -96
  4. package/dist/commands/agents.d.ts +23 -3
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +379 -198
  7. package/dist/commands/backup.d.ts.map +1 -1
  8. package/dist/commands/backup.js +10 -10
  9. package/dist/commands/browse-session.d.ts.map +1 -1
  10. package/dist/commands/browse-session.js +12 -0
  11. package/dist/commands/browse.d.ts +1 -1
  12. package/dist/commands/browse.d.ts.map +1 -1
  13. package/dist/commands/browse.js +5 -4
  14. package/dist/commands/conversations.d.ts +10 -0
  15. package/dist/commands/conversations.d.ts.map +1 -0
  16. package/dist/commands/conversations.js +201 -0
  17. package/dist/commands/deinit.d.ts.map +1 -1
  18. package/dist/commands/deinit.js +5 -0
  19. package/dist/commands/docs.d.ts.map +1 -1
  20. package/dist/commands/docs.js +13 -2
  21. package/dist/commands/doctor.d.ts +5 -0
  22. package/dist/commands/doctor.d.ts.map +1 -1
  23. package/dist/commands/doctor.js +51 -7
  24. package/dist/commands/fetch.js +6 -5
  25. package/dist/commands/files.d.ts +22 -0
  26. package/dist/commands/files.d.ts.map +1 -0
  27. package/dist/commands/files.js +113 -0
  28. package/dist/commands/governor.js +14 -12
  29. package/dist/commands/inbox.d.ts +5 -0
  30. package/dist/commands/inbox.d.ts.map +1 -0
  31. package/dist/commands/inbox.js +57 -0
  32. package/dist/commands/init.d.ts +4 -5
  33. package/dist/commands/init.d.ts.map +1 -1
  34. package/dist/commands/init.js +63 -13
  35. package/dist/commands/ledger-v3.d.ts.map +1 -1
  36. package/dist/commands/ledger-v3.js +347 -1
  37. package/dist/commands/logs.d.ts +4 -0
  38. package/dist/commands/logs.d.ts.map +1 -0
  39. package/dist/commands/logs.js +169 -0
  40. package/dist/commands/messages.d.ts +5 -0
  41. package/dist/commands/messages.d.ts.map +1 -0
  42. package/dist/commands/messages.js +45 -0
  43. package/dist/commands/outline.d.ts +1 -1
  44. package/dist/commands/outline.d.ts.map +1 -1
  45. package/dist/commands/outline.js +2 -2
  46. package/dist/commands/read.d.ts +1 -1
  47. package/dist/commands/read.d.ts.map +1 -1
  48. package/dist/commands/read.js +2 -2
  49. package/dist/commands/semantic.d.ts.map +1 -1
  50. package/dist/commands/semantic.js +54 -2
  51. package/dist/commands/storage.d.ts +4 -0
  52. package/dist/commands/storage.d.ts.map +1 -0
  53. package/dist/commands/storage.js +238 -0
  54. package/dist/commands/tunnel.d.ts +5 -1
  55. package/dist/commands/tunnel.d.ts.map +1 -1
  56. package/dist/commands/tunnel.js +44 -31
  57. package/dist/commands/web.d.ts +3 -0
  58. package/dist/commands/web.d.ts.map +1 -1
  59. package/dist/commands/web.js +67 -7
  60. package/dist/commands/work.js +3 -3
  61. package/dist/commands/workflow.js +13 -13
  62. package/dist/core/adapters/profiles.d.ts +1 -1
  63. package/dist/core/agents/cli.js +209 -39
  64. package/dist/core/agents/live-authority-v3.d.ts +47 -1
  65. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  66. package/dist/core/agents/live-authority-v3.js +244 -10
  67. package/dist/core/agents/live-lifecycle-v3.js +6 -1
  68. package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
  69. package/dist/core/agents/live-observation-v3.js +6 -1
  70. package/dist/core/agents/render/prompt-context.d.ts +9 -3
  71. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  72. package/dist/core/agents/render/prompt-context.js +24 -7
  73. package/dist/core/agents/rules/stop-hook.d.ts +2 -0
  74. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  75. package/dist/core/agents/rules/stop-hook.js +94 -13
  76. package/dist/core/agents/rules/verdict.d.ts +1 -0
  77. package/dist/core/agents/rules/verdict.d.ts.map +1 -1
  78. package/dist/core/agents/session-events.d.ts.map +1 -1
  79. package/dist/core/agents/session-events.js +4 -0
  80. package/dist/core/agents/session-finalization-state-v3.js +1 -1
  81. package/dist/core/agents/session-finalizer-v3.js +5 -1
  82. package/dist/core/agents/state/activity-log.d.ts +3 -0
  83. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  84. package/dist/core/agents/state/activity-log.js +6 -3
  85. package/dist/core/agents/state/heartbeat-writer.d.ts +6 -0
  86. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  87. package/dist/core/agents/state/heartbeat-writer.js +18 -0
  88. package/dist/core/agents/state/live-coordination-view.d.ts +5 -7
  89. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  90. package/dist/core/agents/state/live-coordination-view.js +15 -90
  91. package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
  92. package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
  93. package/dist/core/agents/state/live-coordination-writer.js +92 -0
  94. package/dist/core/artifacts/index.d.ts +21 -0
  95. package/dist/core/artifacts/index.d.ts.map +1 -1
  96. package/dist/core/artifacts/index.js +46 -1
  97. package/dist/core/config.d.ts +62 -4
  98. package/dist/core/config.d.ts.map +1 -1
  99. package/dist/core/config.js +98 -4
  100. package/dist/core/conversations/archive.d.ts +49 -0
  101. package/dist/core/conversations/archive.d.ts.map +1 -0
  102. package/dist/core/conversations/archive.js +136 -0
  103. package/dist/core/conversations/catalog.d.ts +10 -0
  104. package/dist/core/conversations/catalog.d.ts.map +1 -0
  105. package/dist/core/conversations/catalog.js +72 -0
  106. package/dist/core/conversations/context-pack.d.ts +6 -0
  107. package/dist/core/conversations/context-pack.d.ts.map +1 -0
  108. package/dist/core/conversations/context-pack.js +60 -0
  109. package/dist/core/conversations/contract.d.ts +155 -0
  110. package/dist/core/conversations/contract.d.ts.map +1 -0
  111. package/dist/core/conversations/contract.js +1 -0
  112. package/dist/core/conversations/evaluation.d.ts +16 -0
  113. package/dist/core/conversations/evaluation.d.ts.map +1 -0
  114. package/dist/core/conversations/evaluation.js +9 -0
  115. package/dist/core/conversations/index.d.ts +10 -0
  116. package/dist/core/conversations/index.d.ts.map +1 -0
  117. package/dist/core/conversations/index.js +9 -0
  118. package/dist/core/conversations/lifecycle.d.ts +28 -0
  119. package/dist/core/conversations/lifecycle.d.ts.map +1 -0
  120. package/dist/core/conversations/lifecycle.js +29 -0
  121. package/dist/core/conversations/normalize.d.ts +14 -0
  122. package/dist/core/conversations/normalize.d.ts.map +1 -0
  123. package/dist/core/conversations/normalize.js +82 -0
  124. package/dist/core/conversations/query.d.ts +8 -0
  125. package/dist/core/conversations/query.d.ts.map +1 -0
  126. package/dist/core/conversations/query.js +280 -0
  127. package/dist/core/conversations/search-index.d.ts +9 -0
  128. package/dist/core/conversations/search-index.d.ts.map +1 -0
  129. package/dist/core/conversations/search-index.js +29 -0
  130. package/dist/core/events/legacy-storage/canary.d.ts +18 -0
  131. package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
  132. package/dist/core/events/legacy-storage/canary.js +150 -0
  133. package/dist/core/events/legacy-storage/fence.d.ts +15 -0
  134. package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
  135. package/dist/core/events/legacy-storage/fence.js +115 -0
  136. package/dist/core/events/legacy-storage/index.d.ts +6 -0
  137. package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
  138. package/dist/core/events/legacy-storage/index.js +5 -0
  139. package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
  140. package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
  141. package/dist/core/events/legacy-storage/inventory.js +40 -0
  142. package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
  143. package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
  144. package/dist/core/events/legacy-storage/manifest.js +108 -0
  145. package/dist/core/events/legacy-storage/reader.d.ts +15 -0
  146. package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
  147. package/dist/core/events/legacy-storage/reader.js +154 -0
  148. package/dist/core/events/v3/authority-outbox.d.ts +7 -2
  149. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  150. package/dist/core/events/v3/authority-outbox.js +16 -3
  151. package/dist/core/events/v3/base-contract.d.ts +81 -41
  152. package/dist/core/events/v3/base-contract.d.ts.map +1 -1
  153. package/dist/core/events/v3/base-contract.js +17 -7
  154. package/dist/core/events/v3/bootstrap.d.ts +39 -0
  155. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  156. package/dist/core/events/v3/bootstrap.js +167 -3
  157. package/dist/core/events/v3/capabilities.js +3 -3
  158. package/dist/core/events/v3/control-witness.d.ts +44 -0
  159. package/dist/core/events/v3/control-witness.d.ts.map +1 -0
  160. package/dist/core/events/v3/control-witness.js +233 -0
  161. package/dist/core/events/v3/control-writer.d.ts +4 -0
  162. package/dist/core/events/v3/control-writer.d.ts.map +1 -0
  163. package/dist/core/events/v3/control-writer.js +16 -0
  164. package/dist/core/events/v3/control.d.ts +8 -2
  165. package/dist/core/events/v3/control.d.ts.map +1 -1
  166. package/dist/core/events/v3/control.js +46 -18
  167. package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
  168. package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
  169. package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
  170. package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
  171. package/dist/core/events/v3/coordination-view.js +16 -1
  172. package/dist/core/events/v3/generated.d.ts +1 -1
  173. package/dist/core/events/v3/generated.js +1 -1
  174. package/dist/core/events/v3/index.d.ts +4 -2
  175. package/dist/core/events/v3/index.d.ts.map +1 -1
  176. package/dist/core/events/v3/index.js +3 -1
  177. package/dist/core/events/v3/live-route-observer.d.ts +31 -0
  178. package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
  179. package/dist/core/events/v3/live-route-observer.js +58 -0
  180. package/dist/core/events/v3/live-routing.d.ts +13 -21
  181. package/dist/core/events/v3/live-routing.d.ts.map +1 -1
  182. package/dist/core/events/v3/live-routing.js +45 -41
  183. package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
  184. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  185. package/dist/core/events/v3/producers/coordination-recorder.js +76 -10
  186. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
  187. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
  188. package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
  189. package/dist/core/events/v3/producers/hook-base.js +1 -1
  190. package/dist/core/events/v3/producers/intake.d.ts +7 -0
  191. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  192. package/dist/core/events/v3/producers/intake.js +25 -2
  193. package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
  194. package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
  195. package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
  196. package/dist/core/events/v3/producers/recorder.d.ts +55 -1
  197. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  198. package/dist/core/events/v3/producers/recorder.js +353 -24
  199. package/dist/core/events/v3/reader.d.ts +51 -0
  200. package/dist/core/events/v3/reader.d.ts.map +1 -1
  201. package/dist/core/events/v3/reader.js +181 -1
  202. package/dist/core/events/v3/rotation-config.d.ts +9 -0
  203. package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
  204. package/dist/core/events/v3/rotation-config.js +91 -0
  205. package/dist/core/events/v3/runtime-build.d.ts +11 -0
  206. package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
  207. package/dist/core/events/v3/runtime-build.js +39 -0
  208. package/dist/core/events/v3/runtime-identity.d.ts +5 -0
  209. package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
  210. package/dist/core/events/v3/runtime-identity.js +18 -0
  211. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +6 -5
  212. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -1
  213. package/dist/core/events/v3/runtime-telemetry-capabilities.js +1 -1
  214. package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
  215. package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
  216. package/dist/core/events/v3/support-storage/classify.js +149 -0
  217. package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
  218. package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
  219. package/dist/core/events/v3/support-storage/eligibility.js +35 -0
  220. package/dist/core/events/v3/support-storage/index.d.ts +10 -0
  221. package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
  222. package/dist/core/events/v3/support-storage/index.js +9 -0
  223. package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
  224. package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
  225. package/dist/core/events/v3/support-storage/inventory.js +94 -0
  226. package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
  227. package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
  228. package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
  229. package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
  230. package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
  231. package/dist/core/events/v3/support-storage/maintenance.js +352 -0
  232. package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
  233. package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
  234. package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
  235. package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
  236. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
  237. package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
  238. package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
  239. package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
  240. package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
  241. package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
  242. package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
  243. package/dist/core/events/v3/support-storage/recovery.js +22 -0
  244. package/dist/core/events/v3/turn-telemetry.d.ts +14 -8
  245. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
  246. package/dist/core/events/v3/turn-telemetry.js +32 -2
  247. package/dist/core/events/v3/writer.d.ts +13 -1
  248. package/dist/core/events/v3/writer.d.ts.map +1 -1
  249. package/dist/core/events/v3/writer.js +126 -12
  250. package/dist/core/governor/plan-read.d.ts.map +1 -1
  251. package/dist/core/governor/plan-read.js +5 -21
  252. package/dist/core/governor/planning.js +6 -8
  253. package/dist/core/governor/service-read.d.ts +12 -0
  254. package/dist/core/governor/service-read.d.ts.map +1 -1
  255. package/dist/core/governor/service-read.js +266 -2
  256. package/dist/core/governor/service.d.ts +1 -0
  257. package/dist/core/governor/service.d.ts.map +1 -1
  258. package/dist/core/governor/service.js +53 -18
  259. package/dist/core/guard/evidence-v3.d.ts.map +1 -1
  260. package/dist/core/guard/evidence-v3.js +2 -0
  261. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  262. package/dist/core/hooks/adapter/events.js +1 -0
  263. package/dist/core/hooks/adapter/output.d.ts +4 -2
  264. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  265. package/dist/core/hooks/adapter/output.js +13 -5
  266. package/dist/core/hooks/adapter/runtime-telemetry.d.ts +27 -4
  267. package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -1
  268. package/dist/core/hooks/adapter/runtime-telemetry.js +307 -6
  269. package/dist/core/hooks/cli.js +212 -30
  270. package/dist/core/hooks/effects/image-capture.d.ts +1 -1
  271. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  272. package/dist/core/hooks/effects/image-capture.js +4 -2
  273. package/dist/core/hooks/remediation-cap.d.ts +8 -3
  274. package/dist/core/hooks/remediation-cap.d.ts.map +1 -1
  275. package/dist/core/hooks/remediation-cap.js +3 -11
  276. package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
  277. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
  278. package/dist/core/hooks/resolve/coord-root.js +92 -11
  279. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  280. package/dist/core/hooks/resolve/owner.js +5 -0
  281. package/dist/core/hooks/resolve/transcript.d.ts +8 -0
  282. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  283. package/dist/core/hooks/resolve/transcript.js +11 -0
  284. package/dist/core/inbox/contract.d.ts +64 -0
  285. package/dist/core/inbox/contract.d.ts.map +1 -0
  286. package/dist/core/inbox/contract.js +13 -0
  287. package/dist/core/inbox/index.d.ts +5 -0
  288. package/dist/core/inbox/index.d.ts.map +1 -0
  289. package/dist/core/inbox/index.js +4 -0
  290. package/dist/core/inbox/lifecycle.d.ts +22 -0
  291. package/dist/core/inbox/lifecycle.d.ts.map +1 -0
  292. package/dist/core/inbox/lifecycle.js +41 -0
  293. package/dist/core/inbox/service.d.ts +36 -0
  294. package/dist/core/inbox/service.d.ts.map +1 -0
  295. package/dist/core/inbox/service.js +210 -0
  296. package/dist/core/inbox/watcher.d.ts +7 -0
  297. package/dist/core/inbox/watcher.d.ts.map +1 -0
  298. package/dist/core/inbox/watcher.js +26 -0
  299. package/dist/core/presence/codec-digest.d.ts.map +1 -1
  300. package/dist/core/presence/codec-digest.js +14 -3
  301. package/dist/core/presence/relay-client.d.ts +1 -0
  302. package/dist/core/presence/relay-client.d.ts.map +1 -1
  303. package/dist/core/presence/relay-client.js +52 -8
  304. package/dist/core/semantic/adapters.d.ts +11 -8
  305. package/dist/core/semantic/adapters.d.ts.map +1 -1
  306. package/dist/core/semantic/adapters.js +169 -31
  307. package/dist/core/semantic/contract.d.ts +532 -48
  308. package/dist/core/semantic/contract.d.ts.map +1 -1
  309. package/dist/core/semantic/contract.js +104 -3
  310. package/dist/core/semantic/index.d.ts +7 -3
  311. package/dist/core/semantic/index.d.ts.map +1 -1
  312. package/dist/core/semantic/index.js +7 -3
  313. package/dist/core/semantic/once.d.ts +6 -1
  314. package/dist/core/semantic/once.d.ts.map +1 -1
  315. package/dist/core/semantic/once.js +80 -9
  316. package/dist/core/semantic/prompt.d.ts.map +1 -1
  317. package/dist/core/semantic/prompt.js +14 -1
  318. package/dist/core/semantic/review.d.ts +144 -0
  319. package/dist/core/semantic/review.d.ts.map +1 -0
  320. package/dist/core/semantic/review.js +544 -0
  321. package/dist/core/semantic/routes.d.ts +10 -0
  322. package/dist/core/semantic/routes.d.ts.map +1 -0
  323. package/dist/core/semantic/routes.js +21 -0
  324. package/dist/core/semantic/scheduler.d.ts +14 -3
  325. package/dist/core/semantic/scheduler.d.ts.map +1 -1
  326. package/dist/core/semantic/scheduler.js +30 -6
  327. package/dist/core/semantic/service-status.d.ts +20 -0
  328. package/dist/core/semantic/service-status.d.ts.map +1 -1
  329. package/dist/core/semantic/service-status.js +60 -4
  330. package/dist/core/semantic/service.d.ts +1 -0
  331. package/dist/core/semantic/service.d.ts.map +1 -1
  332. package/dist/core/semantic/service.js +104 -15
  333. package/dist/core/semantic/soak.d.ts +75 -0
  334. package/dist/core/semantic/soak.d.ts.map +1 -0
  335. package/dist/core/semantic/soak.js +476 -0
  336. package/dist/core/semantic/storage.d.ts +11 -1
  337. package/dist/core/semantic/storage.d.ts.map +1 -1
  338. package/dist/core/semantic/storage.js +4 -3
  339. package/dist/core/semantic/usage.d.ts +43 -0
  340. package/dist/core/semantic/usage.d.ts.map +1 -0
  341. package/dist/core/semantic/usage.js +193 -0
  342. package/dist/core/semantic/validate.d.ts +3 -1
  343. package/dist/core/semantic/validate.d.ts.map +1 -1
  344. package/dist/core/semantic/validate.js +34 -1
  345. package/dist/core/storage/buffer.d.ts +28 -0
  346. package/dist/core/storage/buffer.d.ts.map +1 -0
  347. package/dist/core/storage/buffer.js +101 -0
  348. package/dist/core/storage/builtins.d.ts +3 -0
  349. package/dist/core/storage/builtins.d.ts.map +1 -0
  350. package/dist/core/storage/builtins.js +683 -0
  351. package/dist/core/storage/catalog.d.ts +19 -0
  352. package/dist/core/storage/catalog.d.ts.map +1 -0
  353. package/dist/core/storage/catalog.js +365 -0
  354. package/dist/core/storage/config.d.ts +16 -0
  355. package/dist/core/storage/config.d.ts.map +1 -0
  356. package/dist/core/storage/config.js +311 -0
  357. package/dist/core/storage/contract.d.ts +275 -0
  358. package/dist/core/storage/contract.d.ts.map +1 -0
  359. package/dist/core/storage/contract.js +3 -0
  360. package/dist/core/storage/durable-history.d.ts +36 -0
  361. package/dist/core/storage/durable-history.d.ts.map +1 -0
  362. package/dist/core/storage/durable-history.js +606 -0
  363. package/dist/core/storage/health.d.ts +4 -0
  364. package/dist/core/storage/health.d.ts.map +1 -0
  365. package/dist/core/storage/health.js +65 -0
  366. package/dist/core/storage/index.d.ts +16 -0
  367. package/dist/core/storage/index.d.ts.map +1 -0
  368. package/dist/core/storage/index.js +15 -0
  369. package/dist/core/storage/inventory.d.ts +25 -0
  370. package/dist/core/storage/inventory.d.ts.map +1 -0
  371. package/dist/core/storage/inventory.js +666 -0
  372. package/dist/core/storage/jsonl.d.ts +52 -0
  373. package/dist/core/storage/jsonl.d.ts.map +1 -0
  374. package/dist/core/storage/jsonl.js +156 -0
  375. package/dist/core/storage/log-retention.d.ts +52 -0
  376. package/dist/core/storage/log-retention.d.ts.map +1 -0
  377. package/dist/core/storage/log-retention.js +419 -0
  378. package/dist/core/storage/logger.d.ts +82 -0
  379. package/dist/core/storage/logger.d.ts.map +1 -0
  380. package/dist/core/storage/logger.js +411 -0
  381. package/dist/core/storage/maintenance-providers.d.ts +26 -0
  382. package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
  383. package/dist/core/storage/maintenance-providers.js +141 -0
  384. package/dist/core/storage/maintenance.d.ts +125 -0
  385. package/dist/core/storage/maintenance.d.ts.map +1 -0
  386. package/dist/core/storage/maintenance.js +609 -0
  387. package/dist/core/storage/metrics.d.ts +60 -0
  388. package/dist/core/storage/metrics.d.ts.map +1 -0
  389. package/dist/core/storage/metrics.js +134 -0
  390. package/dist/core/storage/policy.d.ts +7 -0
  391. package/dist/core/storage/policy.d.ts.map +1 -0
  392. package/dist/core/storage/policy.js +110 -0
  393. package/dist/core/storage/process-log.d.ts +38 -0
  394. package/dist/core/storage/process-log.d.ts.map +1 -0
  395. package/dist/core/storage/process-log.js +165 -0
  396. package/dist/core/storage/query.d.ts +34 -0
  397. package/dist/core/storage/query.d.ts.map +1 -0
  398. package/dist/core/storage/query.js +295 -0
  399. package/dist/core/storage/receipts.d.ts +23 -0
  400. package/dist/core/storage/receipts.d.ts.map +1 -0
  401. package/dist/core/storage/receipts.js +117 -0
  402. package/dist/core/storage/segments.d.ts +84 -0
  403. package/dist/core/storage/segments.d.ts.map +1 -0
  404. package/dist/core/storage/segments.js +542 -0
  405. package/dist/core/storage/sink-graph.d.ts +65 -0
  406. package/dist/core/storage/sink-graph.d.ts.map +1 -0
  407. package/dist/core/storage/sink-graph.js +213 -0
  408. package/dist/core/storage/storm-control.d.ts +23 -0
  409. package/dist/core/storage/storm-control.d.ts.map +1 -0
  410. package/dist/core/storage/storm-control.js +59 -0
  411. package/dist/core/work/state.d.ts.map +1 -1
  412. package/dist/core/work/state.js +10 -14
  413. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  414. package/dist/core/workflow/live-session-v3.js +2 -1
  415. package/dist/index.d.ts +2 -0
  416. package/dist/index.d.ts.map +1 -1
  417. package/dist/index.js +2 -0
  418. package/dist/lazy-commands.d.ts +26 -0
  419. package/dist/lazy-commands.d.ts.map +1 -0
  420. package/dist/lazy-commands.js +210 -0
  421. package/dist/lib/docs-lint.d.ts +2 -0
  422. package/dist/lib/docs-lint.d.ts.map +1 -1
  423. package/dist/lib/docs-lint.js +45 -80
  424. package/dist/lib/docs-metadata-audit.d.ts +3 -0
  425. package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
  426. package/dist/lib/docs-metadata-audit.js +13 -23
  427. package/dist/lib/docs-metadata-sync.d.ts +1 -0
  428. package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
  429. package/dist/lib/docs-metadata-sync.js +28 -10
  430. package/dist/lib/docs-repository-view.d.ts +22 -0
  431. package/dist/lib/docs-repository-view.d.ts.map +1 -0
  432. package/dist/lib/docs-repository-view.js +185 -0
  433. package/dist/lib/http/client.d.ts +11 -5
  434. package/dist/lib/http/client.d.ts.map +1 -1
  435. package/dist/lib/http/client.js +22 -4
  436. package/dist/lib/http/index.d.ts +1 -1
  437. package/dist/lib/http/index.d.ts.map +1 -1
  438. package/dist/lib/http/index.js +1 -1
  439. package/dist/lib/indexer-exclusions.d.ts +27 -0
  440. package/dist/lib/indexer-exclusions.d.ts.map +1 -0
  441. package/dist/lib/indexer-exclusions.js +176 -0
  442. package/dist/lib/instructions/templates.d.ts.map +1 -1
  443. package/dist/lib/instructions/templates.js +5 -0
  444. package/dist/lib/local-file-url.d.ts +9 -0
  445. package/dist/lib/local-file-url.d.ts.map +1 -0
  446. package/dist/lib/local-file-url.js +20 -0
  447. package/dist/lib/web-performance.d.ts +118 -0
  448. package/dist/lib/web-performance.d.ts.map +1 -0
  449. package/dist/lib/web-performance.js +192 -0
  450. package/package.json +29 -2
  451. package/schemas/config.schema.json +58 -0
  452. package/schemas/event-v3.schema.json +324 -112
  453. package/src/commander.ts +462 -95
  454. package/src/commands/agents.ts +517 -190
  455. package/src/commands/backup.ts +18 -14
  456. package/src/commands/browse-session.ts +12 -0
  457. package/src/commands/browse.ts +6 -7
  458. package/src/commands/conversations.ts +279 -0
  459. package/src/commands/deinit.ts +6 -0
  460. package/src/commands/docs.ts +25 -6
  461. package/src/commands/doctor.ts +75 -9
  462. package/src/commands/fetch.ts +7 -6
  463. package/src/commands/files.ts +143 -0
  464. package/src/commands/governor.ts +13 -12
  465. package/src/commands/inbox.ts +61 -0
  466. package/src/commands/init.ts +78 -16
  467. package/src/commands/ledger-v3.ts +421 -1
  468. package/src/commands/logs.ts +224 -0
  469. package/src/commands/messages.ts +61 -0
  470. package/src/commands/outline.ts +6 -2
  471. package/src/commands/read.ts +6 -2
  472. package/src/commands/semantic.ts +66 -1
  473. package/src/commands/storage.ts +310 -0
  474. package/src/commands/tunnel.ts +66 -52
  475. package/src/commands/web.ts +77 -7
  476. package/src/commands/work.ts +3 -3
  477. package/src/commands/workflow.ts +13 -13
  478. package/src/core/agents/cli.ts +259 -53
  479. package/src/core/agents/live-authority-v3.ts +341 -10
  480. package/src/core/agents/live-lifecycle-v3.ts +6 -1
  481. package/src/core/agents/live-observation-v3.ts +6 -1
  482. package/src/core/agents/render/prompt-context.ts +27 -6
  483. package/src/core/agents/rules/stop-hook.ts +107 -16
  484. package/src/core/agents/rules/verdict.ts +1 -0
  485. package/src/core/agents/session-events.ts +4 -0
  486. package/src/core/agents/session-finalization-state-v3.ts +1 -1
  487. package/src/core/agents/session-finalizer-v3.ts +4 -1
  488. package/src/core/agents/state/activity-log.ts +7 -2
  489. package/src/core/agents/state/heartbeat-writer.ts +27 -0
  490. package/src/core/agents/state/live-coordination-view.ts +16 -105
  491. package/src/core/agents/state/live-coordination-writer.ts +141 -0
  492. package/src/core/artifacts/index.ts +64 -1
  493. package/src/core/config.ts +126 -5
  494. package/src/core/conversations/archive.ts +237 -0
  495. package/src/core/conversations/catalog.ts +79 -0
  496. package/src/core/conversations/context-pack.ts +72 -0
  497. package/src/core/conversations/contract.ts +178 -0
  498. package/src/core/conversations/evaluation.ts +30 -0
  499. package/src/core/conversations/index.ts +9 -0
  500. package/src/core/conversations/lifecycle.ts +63 -0
  501. package/src/core/conversations/normalize.ts +105 -0
  502. package/src/core/conversations/query.ts +318 -0
  503. package/src/core/conversations/search-index.ts +48 -0
  504. package/src/core/events/legacy-storage/canary.ts +177 -0
  505. package/src/core/events/legacy-storage/fence.ts +129 -0
  506. package/src/core/events/legacy-storage/index.ts +5 -0
  507. package/src/core/events/legacy-storage/inventory.ts +51 -0
  508. package/src/core/events/legacy-storage/manifest.ts +136 -0
  509. package/src/core/events/legacy-storage/reader.ts +178 -0
  510. package/src/core/events/v3/authority-outbox.ts +22 -1
  511. package/src/core/events/v3/base-contract.ts +17 -7
  512. package/src/core/events/v3/bootstrap.ts +195 -2
  513. package/src/core/events/v3/capabilities.ts +3 -3
  514. package/src/core/events/v3/control-witness.ts +339 -0
  515. package/src/core/events/v3/control-writer.ts +16 -0
  516. package/src/core/events/v3/control.ts +54 -18
  517. package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
  518. package/src/core/events/v3/coordination-view.ts +17 -1
  519. package/src/core/events/v3/generated.ts +1 -1
  520. package/src/core/events/v3/index.ts +5 -2
  521. package/src/core/events/v3/live-route-observer.ts +80 -0
  522. package/src/core/events/v3/live-routing.ts +64 -46
  523. package/src/core/events/v3/producers/coordination-recorder.ts +95 -10
  524. package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
  525. package/src/core/events/v3/producers/hook-base.ts +1 -1
  526. package/src/core/events/v3/producers/intake.ts +30 -2
  527. package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
  528. package/src/core/events/v3/producers/recorder.ts +571 -33
  529. package/src/core/events/v3/reader.ts +243 -2
  530. package/src/core/events/v3/rotation-config.ts +98 -0
  531. package/src/core/events/v3/runtime-build.ts +41 -0
  532. package/src/core/events/v3/runtime-identity.ts +16 -0
  533. package/src/core/events/v3/runtime-telemetry-capabilities.ts +14 -8
  534. package/src/core/events/v3/support-storage/classify.ts +209 -0
  535. package/src/core/events/v3/support-storage/eligibility.ts +58 -0
  536. package/src/core/events/v3/support-storage/index.ts +9 -0
  537. package/src/core/events/v3/support-storage/inventory.ts +135 -0
  538. package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
  539. package/src/core/events/v3/support-storage/maintenance.ts +501 -0
  540. package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
  541. package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
  542. package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
  543. package/src/core/events/v3/support-storage/recovery.ts +43 -0
  544. package/src/core/events/v3/turn-telemetry.ts +58 -7
  545. package/src/core/events/v3/writer.ts +168 -16
  546. package/src/core/governor/plan-read.ts +5 -18
  547. package/src/core/governor/planning.ts +5 -8
  548. package/src/core/governor/service-read.ts +320 -2
  549. package/src/core/governor/service.ts +49 -22
  550. package/src/core/guard/evidence-v3.ts +1 -0
  551. package/src/core/hooks/adapter/events.ts +1 -0
  552. package/src/core/hooks/adapter/output.ts +12 -5
  553. package/src/core/hooks/adapter/runtime-telemetry.ts +408 -13
  554. package/src/core/hooks/cli.ts +226 -32
  555. package/src/core/hooks/effects/image-capture.ts +4 -1
  556. package/src/core/hooks/remediation-cap.ts +12 -6
  557. package/src/core/hooks/resolve/coord-root.ts +91 -11
  558. package/src/core/hooks/resolve/owner.ts +4 -0
  559. package/src/core/hooks/resolve/transcript.ts +18 -0
  560. package/src/core/inbox/contract.ts +81 -0
  561. package/src/core/inbox/index.ts +4 -0
  562. package/src/core/inbox/lifecycle.ts +104 -0
  563. package/src/core/inbox/service.ts +305 -0
  564. package/src/core/inbox/watcher.ts +36 -0
  565. package/src/core/presence/codec-digest.ts +15 -9
  566. package/src/core/presence/relay-client.ts +55 -7
  567. package/src/core/semantic/adapters.ts +200 -41
  568. package/src/core/semantic/contract.ts +135 -3
  569. package/src/core/semantic/index.ts +76 -2
  570. package/src/core/semantic/once.ts +93 -7
  571. package/src/core/semantic/prompt.ts +13 -1
  572. package/src/core/semantic/review.ts +803 -0
  573. package/src/core/semantic/routes.ts +30 -0
  574. package/src/core/semantic/scheduler.ts +49 -5
  575. package/src/core/semantic/service-status.ts +99 -5
  576. package/src/core/semantic/service.ts +116 -15
  577. package/src/core/semantic/soak.ts +638 -0
  578. package/src/core/semantic/storage.ts +20 -6
  579. package/src/core/semantic/usage.ts +272 -0
  580. package/src/core/semantic/validate.ts +31 -0
  581. package/src/core/storage/buffer.ts +124 -0
  582. package/src/core/storage/builtins.ts +916 -0
  583. package/src/core/storage/catalog.ts +467 -0
  584. package/src/core/storage/config.ts +423 -0
  585. package/src/core/storage/contract.ts +342 -0
  586. package/src/core/storage/durable-history.ts +738 -0
  587. package/src/core/storage/health.ts +76 -0
  588. package/src/core/storage/index.ts +15 -0
  589. package/src/core/storage/inventory.ts +859 -0
  590. package/src/core/storage/jsonl.ts +213 -0
  591. package/src/core/storage/log-retention.ts +555 -0
  592. package/src/core/storage/logger.ts +546 -0
  593. package/src/core/storage/maintenance-providers.ts +200 -0
  594. package/src/core/storage/maintenance.ts +929 -0
  595. package/src/core/storage/metrics.ts +199 -0
  596. package/src/core/storage/policy.ts +141 -0
  597. package/src/core/storage/process-log.ts +203 -0
  598. package/src/core/storage/query.ts +360 -0
  599. package/src/core/storage/receipts.ts +162 -0
  600. package/src/core/storage/segments.ts +721 -0
  601. package/src/core/storage/sink-graph.ts +343 -0
  602. package/src/core/storage/storm-control.ts +91 -0
  603. package/src/core/work/state.ts +12 -21
  604. package/src/core/workflow/live-session-v3.ts +2 -4
  605. package/src/index.ts +2 -0
  606. package/src/lazy-commands.ts +294 -0
  607. package/src/lib/docs-lint.ts +58 -77
  608. package/src/lib/docs-metadata-audit.ts +26 -21
  609. package/src/lib/docs-metadata-sync.ts +32 -9
  610. package/src/lib/docs-repository-view.ts +220 -0
  611. package/src/lib/http/client.ts +44 -8
  612. package/src/lib/http/index.ts +6 -1
  613. package/src/lib/indexer-exclusions.ts +173 -0
  614. package/src/lib/instructions/templates.ts +5 -0
  615. package/src/lib/local-file-url.ts +31 -0
  616. package/src/lib/web-performance.ts +335 -0
@@ -0,0 +1,178 @@
1
+ import { createHash } from "node:crypto";
2
+ import { constants, createReadStream } from "node:fs";
3
+ import { lstat, open, realpath } from "node:fs/promises";
4
+ import { dirname, isAbsolute, relative, resolve } from "node:path";
5
+ import { createGunzip } from "node:zlib";
6
+ import { type LegacyV1SegmentManifest, validateLegacyV1SegmentManifest } from "./manifest.ts";
7
+
8
+ export interface LegacyV1LogicalRow {
9
+ row_number: number;
10
+ bytes: Buffer;
11
+ }
12
+
13
+ export interface LegacyV1ReaderLimits {
14
+ max_manifest_bytes?: number;
15
+ max_payload_bytes?: number;
16
+ max_decompressed_bytes?: number;
17
+ max_row_bytes?: number;
18
+ max_rows?: number;
19
+ fault?: (boundary: "after_source_digest", path: string) => void;
20
+ }
21
+
22
+ const DEFAULTS: Required<Omit<LegacyV1ReaderLimits, "fault">> = {
23
+ max_manifest_bytes: 1024 * 1024,
24
+ max_payload_bytes: 8 * 1024 * 1024 * 1024,
25
+ max_decompressed_bytes: 16 * 1024 * 1024 * 1024,
26
+ max_row_bytes: 64 * 1024 * 1024,
27
+ max_rows: 20_000_000,
28
+ };
29
+
30
+ /** Stream rows from one loose sealed segment or one manifest-bound gzip canary. */
31
+ export async function* streamLegacyV1Rows(
32
+ sourcePath: string,
33
+ limits: LegacyV1ReaderLimits = {},
34
+ ): AsyncGenerator<LegacyV1LogicalRow> {
35
+ const bounded = { ...DEFAULTS, ...limits };
36
+ const source = resolve(sourcePath);
37
+ let input = source;
38
+ let expectedRows: number | undefined;
39
+ let expectedSourceBytes: number | undefined;
40
+ let expectedSourceDigest: `sha256:${string}` | undefined;
41
+ let expectedPayloadBytes: number | undefined;
42
+ let expectedPayloadDigest: `sha256:${string}` | undefined;
43
+ let containmentRoot: string | undefined;
44
+ if (source.endsWith(".manifest.json")) {
45
+ const manifestHandle = await openStableRegularFile(source, undefined, "manifest");
46
+ let manifest: LegacyV1SegmentManifest;
47
+ try {
48
+ const stat = await manifestHandle.stat();
49
+ if (stat.size > bounded.max_manifest_bytes) throw new Error("legacy_v1_manifest_too_large");
50
+ manifest = validateLegacyV1SegmentManifest(
51
+ JSON.parse(await manifestHandle.readFile("utf8")) as unknown,
52
+ );
53
+ } finally {
54
+ await manifestHandle.close();
55
+ }
56
+ const directory = await realpath(dirname(source));
57
+ containmentRoot = directory;
58
+ input = resolve(directory, manifest.payload.path);
59
+ expectedRows = manifest.source.row_count;
60
+ expectedSourceBytes = manifest.source.bytes;
61
+ expectedSourceDigest = manifest.source.digest;
62
+ expectedPayloadBytes = manifest.payload.bytes;
63
+ expectedPayloadDigest = manifest.payload.digest;
64
+ }
65
+
66
+ const compressed = source.endsWith(".manifest.json") || source.endsWith(".gz");
67
+ const kind = source.endsWith(".manifest.json") ? "payload" : "segment";
68
+ const inputHandle = await openStableRegularFile(input, containmentRoot, kind);
69
+ try {
70
+ const inputStat = await inputHandle.stat();
71
+ if (source.endsWith(".manifest.json")) {
72
+ if (inputStat.size !== expectedPayloadBytes)
73
+ throw new Error("legacy_v1_payload_length_mismatch");
74
+ if (inputStat.size > bounded.max_payload_bytes)
75
+ throw new Error("legacy_v1_payload_too_large");
76
+ if ((await hashHandle(input, inputHandle)) !== expectedPayloadDigest) {
77
+ throw new Error("legacy_v1_payload_digest_mismatch");
78
+ }
79
+ }
80
+ limits.fault?.("after_source_digest", input);
81
+ const file = createReadStream(input, { fd: inputHandle.fd, autoClose: false, start: 0 });
82
+ const stream = compressed ? file.pipe(createGunzip()) : file;
83
+ let pending: Buffer<ArrayBufferLike> = Buffer.alloc(0);
84
+ let rows = 0;
85
+ let decompressed = 0;
86
+ const sourceHash = createHash("sha256");
87
+ for await (const current of stream) {
88
+ const chunk = current as Buffer;
89
+ decompressed += chunk.length;
90
+ sourceHash.update(chunk);
91
+ if (decompressed > bounded.max_decompressed_bytes) {
92
+ throw new Error("legacy_v1_decompression_bound_exceeded");
93
+ }
94
+ pending = pending.length === 0 ? chunk : Buffer.concat([pending, chunk]);
95
+ if (pending.length > bounded.max_row_bytes && !pending.includes(0x0a)) {
96
+ throw new Error("legacy_v1_row_bound_exceeded");
97
+ }
98
+ let newline = pending.indexOf(0x0a);
99
+ while (newline >= 0) {
100
+ const row = pending.subarray(0, newline);
101
+ pending = pending.subarray(newline + 1);
102
+ if (row.length === 0) throw new Error("legacy_v1_empty_row");
103
+ if (row.length > bounded.max_row_bytes) throw new Error("legacy_v1_row_bound_exceeded");
104
+ rows += 1;
105
+ if (rows > bounded.max_rows) throw new Error("legacy_v1_row_count_bound_exceeded");
106
+ yield { row_number: rows, bytes: Buffer.from(row) };
107
+ newline = pending.indexOf(0x0a);
108
+ }
109
+ }
110
+ if (pending.length !== 0) throw new Error("legacy_v1_segment_unterminated_or_truncated");
111
+ if (expectedRows !== undefined && rows !== expectedRows)
112
+ throw new Error("legacy_v1_row_count_mismatch");
113
+ if (expectedSourceBytes !== undefined && decompressed !== expectedSourceBytes) {
114
+ throw new Error("legacy_v1_source_length_mismatch");
115
+ }
116
+ const digest = `sha256:${sourceHash.digest("hex")}`;
117
+ if (expectedSourceDigest !== undefined && digest !== expectedSourceDigest) {
118
+ throw new Error("legacy_v1_source_digest_mismatch");
119
+ }
120
+ } finally {
121
+ await inputHandle.close();
122
+ }
123
+ }
124
+
125
+ async function hashHandle(
126
+ path: string,
127
+ handle: Awaited<ReturnType<typeof open>>,
128
+ ): Promise<`sha256:${string}`> {
129
+ const hash = createHash("sha256");
130
+ const stream = createReadStream(path, { fd: handle.fd, autoClose: false, start: 0 });
131
+ for await (const current of stream) hash.update(current as Buffer);
132
+ return `sha256:${hash.digest("hex")}`;
133
+ }
134
+
135
+ async function openStableRegularFile(
136
+ path: string,
137
+ containmentRoot: string | undefined,
138
+ kind: "manifest" | "payload" | "segment",
139
+ ) {
140
+ const before = await lstat(path);
141
+ if (!before.isFile() || before.isSymbolicLink()) throw new Error(`legacy_v1_${kind}_not_regular`);
142
+ const beforeReal = await realpath(path);
143
+ if (containmentRoot) assertContained(containmentRoot, beforeReal);
144
+ const handle = await open(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
145
+ try {
146
+ const opened = await handle.stat();
147
+ const after = await lstat(path);
148
+ const afterReal = await realpath(path);
149
+ if (
150
+ !opened.isFile() ||
151
+ !after.isFile() ||
152
+ after.isSymbolicLink() ||
153
+ opened.dev !== before.dev ||
154
+ opened.ino !== before.ino ||
155
+ opened.dev !== after.dev ||
156
+ opened.ino !== after.ino ||
157
+ beforeReal !== afterReal
158
+ )
159
+ throw new Error(`legacy_v1_${kind}_changed_during_open`);
160
+ if (containmentRoot) assertContained(containmentRoot, afterReal);
161
+ return handle;
162
+ } catch (error) {
163
+ await handle.close();
164
+ throw error;
165
+ }
166
+ }
167
+
168
+ function assertContained(root: string, candidate: string): void {
169
+ const path = relative(root, candidate);
170
+ if (
171
+ path === "" ||
172
+ (path !== ".." &&
173
+ !path.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) &&
174
+ !isAbsolute(path))
175
+ )
176
+ return;
177
+ throw new Error("legacy_v1_payload_escape");
178
+ }
@@ -14,9 +14,15 @@ import { join } from "node:path";
14
14
  import { fsyncParentDirectory } from "../../workflow/durable-record.ts";
15
15
  import { canonicalJsonV3, sha256V3 } from "./canonical.ts";
16
16
  import type { EventV3 } from "./contract.ts";
17
+ import { liveGenesisIdV3 } from "./control.ts";
17
18
  import { assertEventV3 } from "./validate.ts";
18
19
  import { ensureEventV3Layout, eventV3Paths, writeEventV3 } from "./writer.ts";
19
20
 
21
+ export interface AuthorityEpochFenceV3 {
22
+ /** Genesis id of the epoch the transaction's event was produced for. */
23
+ expectedGenesisId?: `gex_${string}`;
24
+ }
25
+
20
26
  const SHA256_PATTERN = /^sha256:[a-f0-9]{64}$/;
21
27
  const INSTANCE_PATTERN = /^inst_[a-zA-Z0-9._-]{1,128}$/;
22
28
  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}$/;
@@ -146,9 +152,13 @@ export function buildAuthorityTransactionV3(
146
152
  export function publishAuthorityTransactionV3(
147
153
  coordRoot: string,
148
154
  transaction: AuthorityTransactionV3,
155
+ fence: AuthorityEpochFenceV3 = {},
149
156
  ): AuthorityTransactionV3 {
150
157
  validateTransaction(transaction);
151
158
  const paths = ensureEventV3Layout(coordRoot);
159
+ if (fence.expectedGenesisId && liveGenesisIdV3(coordRoot) !== fence.expectedGenesisId) {
160
+ throw new Error("authority transaction epoch was replaced before publication");
161
+ }
152
162
  const readyPath = authorityReadyPath(paths.authorityOutbox, transaction.transaction_id);
153
163
  const serialized = `${canonicalJsonV3(transaction)}\n`;
154
164
  if (existsSync(readyPath)) {
@@ -173,6 +183,7 @@ export function reconcileAuthorityTransactionV3(
173
183
  coordRoot: string,
174
184
  transactionId: string,
175
185
  reconciler: AuthorityReconcilerV3,
186
+ fence: AuthorityEpochFenceV3 = {},
176
187
  ): AuthorityReceiptV3 {
177
188
  assertTransactionId(transactionId);
178
189
  const paths = ensureEventV3Layout(coordRoot);
@@ -191,7 +202,12 @@ export function reconcileAuthorityTransactionV3(
191
202
  }
192
203
  const event = JSON.parse(transaction.event_row) as unknown;
193
204
  assertEventV3(event);
194
- writeEventV3(coordRoot, event);
205
+ const durability = writeEventV3(coordRoot, event, {
206
+ ...(fence.expectedGenesisId ? { expectedGenesisId: fence.expectedGenesisId } : {}),
207
+ });
208
+ if (durability.state === "epoch_replaced") {
209
+ throw new Error("authority transaction epoch was replaced before its event committed");
210
+ }
195
211
  const receipt: AuthorityReceiptV3 = {
196
212
  format: "harnery-event-v3-authority-receipt",
197
213
  format_version: 1,
@@ -222,6 +238,11 @@ export function listPendingAuthorityTransactionsV3(coordRoot: string): Authority
222
238
  .map((name) => readAuthorityTransactionV3(join(outbox, name)));
223
239
  }
224
240
 
241
+ export function authorityRecoveryIntentPathV3(coordRoot: string, transactionId: string): string {
242
+ assertTransactionId(transactionId);
243
+ return join(eventV3Paths(coordRoot).root, "authority-recoveries", `${transactionId}.ready.json`);
244
+ }
245
+
225
246
  export function readAuthorityTransactionV3(path: string): AuthorityTransactionV3 {
226
247
  const serialized = readFileSync(path, "utf8");
227
248
  let parsed: unknown;
@@ -109,6 +109,8 @@ const RuntimeTelemetryCapabilityValueV3BaseSchema = StrictObject({
109
109
  source: SafeToken,
110
110
  completeness: Type.Union([
111
111
  Type.Literal("exact"),
112
+ Type.Literal("inferred"),
113
+ Type.Literal("percentage_only"),
112
114
  Type.Literal("lower_bound"),
113
115
  Type.Literal("unknown"),
114
116
  ]),
@@ -430,13 +432,21 @@ const AuthorityReferenceSchema = StrictObject({
430
432
  record_id: Type.Optional(SafeToken),
431
433
  });
432
434
 
433
- const MeasurementSchema = StrictObject({
434
- used_tokens: Type.Integer({ minimum: 0 }),
435
- limit_tokens: Type.Integer({ minimum: 1 }),
436
- remaining_tokens: Type.Optional(Type.Integer({ minimum: 0 })),
437
- measured_at: Timestamp,
438
- method: SafeToken,
439
- });
435
+ const MeasurementSchema = Type.Union([
436
+ StrictObject({
437
+ used_tokens: Type.Integer({ minimum: 0 }),
438
+ limit_tokens: Type.Integer({ minimum: 1 }),
439
+ remaining_tokens: Type.Optional(Type.Integer({ minimum: 0 })),
440
+ measured_at: Timestamp,
441
+ method: SafeToken,
442
+ }),
443
+ StrictObject({
444
+ used_percent: Type.Number({ minimum: 0, maximum: 100 }),
445
+ remaining_percent: Type.Optional(Type.Number({ minimum: 0, maximum: 100 })),
446
+ measured_at: Timestamp,
447
+ method: SafeToken,
448
+ }),
449
+ ]);
440
450
 
441
451
  const ArtifactReferenceSchema = StrictObject({
442
452
  artifact_id: Type.String({ pattern: "^art_[a-zA-Z0-9._-]{1,128}$" }),
@@ -9,10 +9,13 @@ import {
9
9
  openSync,
10
10
  readFileSync,
11
11
  renameSync,
12
+ statSync,
12
13
  writeFileSync,
13
14
  } from "node:fs";
15
+ import { hostname } from "node:os";
14
16
  import { dirname, join, resolve } from "node:path";
15
17
  import { fsyncParentDirectory } from "../../workflow/durable-record.ts";
18
+ import { acquireNoClobberLease } from "../../workflow/workspaces/leases.ts";
16
19
  import { canonicalJsonV3, sha256V3 } from "./canonical.ts";
17
20
  import { ADAPTER_CAPABILITY_PROFILES_V3 } from "./capabilities.ts";
18
21
  import {
@@ -23,11 +26,13 @@ import {
23
26
  EVENT_V3_GENESIS_MANIFEST,
24
27
  type EventV3ControlState,
25
28
  readEventV3ControlState,
26
- repairEventV3ControlPair,
27
29
  } from "./control.ts";
30
+ import { repairEventV3ControlPair } from "./control-writer.ts";
28
31
  import { loadOrCreateFingerprintKeyStoreV3 } from "./fingerprint-keys.ts";
29
32
  import { EVENT_V3_SCHEMA_DIGEST } from "./generated.ts";
30
- import { liveEventV3BuildId, livePlatformV3 } from "./live-routing.ts";
33
+ import { resolveEventLedgerRotateActiveBytesV3 } from "./rotation-config.ts";
34
+ import { currentHarneryRuntimeBuild, liveEventV3BuildId, livePlatformV3 } from "./runtime-build.ts";
35
+ import { drainReadyEventsV3 } from "./writer.ts";
31
36
 
32
37
  export interface InitializeEventLedgerV3Input {
33
38
  coordRoot: string;
@@ -47,6 +52,17 @@ export interface InitializeEventLedgerV3Result {
47
52
  control: Extract<EventV3ControlState, { state: "active" }>;
48
53
  }
49
54
 
55
+ export interface RefreshIncompatibleEventLedgerV3Result {
56
+ state: "current" | "refreshed";
57
+ archived_epoch?: string;
58
+ control: Extract<EventV3ControlState, { state: "active" }>;
59
+ }
60
+
61
+ const BOOTSTRAP_LEASE_RETRIES = 12;
62
+ const BOOTSTRAP_LEASE_RETRY_MS = 25;
63
+ const BOOTSTRAP_LEASE_STALE_MS = 10_000;
64
+ const bootstrapSleepCell = new Int32Array(new SharedArrayBuffer(4));
65
+
50
66
  /**
51
67
  * Ensure programmatic Harnery entry points have the same universal V3
52
68
  * boundary as `harn init`. Only a genuinely absent control pair is created;
@@ -79,6 +95,133 @@ export function ensureEventLedgerV3(
79
95
  */
80
96
  export function initializeEventLedgerV3(
81
97
  input: InitializeEventLedgerV3Input,
98
+ ): InitializeEventLedgerV3Result {
99
+ return withBootstrapLease(input.coordRoot, () => initializeEventLedgerV3Locked(input));
100
+ }
101
+
102
+ /**
103
+ * Replace only a runtime-incompatible epoch that the current code can name
104
+ * exactly. Corruption and ambiguous control failures remain closed for the
105
+ * explicit recovery command.
106
+ */
107
+ export function refreshIncompatibleEventLedgerV3(
108
+ coordRoot: string,
109
+ ): RefreshIncompatibleEventLedgerV3Result {
110
+ const root = resolve(coordRoot);
111
+ return withBootstrapLease(root, () => {
112
+ const current = readEventV3ControlState(root);
113
+ if (current.state === "active" && runtimeCapabilityProfileCurrent(current)) {
114
+ return { state: "current", control: current };
115
+ }
116
+ const refreshable =
117
+ (current.state === "invalid" && current.reason === "genesis_schema_digest_incompatible") ||
118
+ ((current.state === "candidate" || current.state === "active") &&
119
+ !runtimeCapabilityProfileCurrent(current));
120
+ if (!refreshable) {
121
+ const reason = "reason" in current ? `${current.state}:${current.reason}` : current.state;
122
+ throw new Error(`event_v3_runtime_refresh_refused:${reason}`);
123
+ }
124
+ const configPath = join(root, ".harnery", "config.jsonc");
125
+ const initialized = initializeEventLedgerV3Locked({
126
+ coordRoot: root,
127
+ harneryBuild: currentHarneryRuntimeBuild(),
128
+ hostBuild: repositoryBuild(root),
129
+ configDigest: sha256V3(
130
+ existsSync(configPath) ? readFileSync(configPath) : Buffer.from("{}\n"),
131
+ ),
132
+ approvalRecordId: "harnery-runtime-v3-auto-refresh",
133
+ forceNewEpoch: true,
134
+ });
135
+ return {
136
+ state: "refreshed",
137
+ ...(initialized.archived_epoch ? { archived_epoch: initialized.archived_epoch } : {}),
138
+ control: initialized.control,
139
+ };
140
+ });
141
+ }
142
+
143
+ export interface RotateOversizedEventLedgerV3Result {
144
+ state: "rotated" | "not_oversized" | "not_active" | "disabled";
145
+ active_bytes: number;
146
+ threshold_bytes: number;
147
+ archived_epoch?: string;
148
+ control?: Extract<EventV3ControlState, { state: "active" }>;
149
+ }
150
+
151
+ /**
152
+ * Archive a valid oversized epoch intact and start a fresh one.
153
+ *
154
+ * Every canonical read validates the complete epoch, and hook producers are
155
+ * one-shot processes, so an unbounded active segment makes every hook's cold
156
+ * read scale with all history. Rotation bounds that cost: the replaced epoch
157
+ * (events, spool, producer states, manifests) moves whole into the V3
158
+ * archive, live sessions re-onboard into the new epoch on their next signal,
159
+ * and the writer's epoch fence keeps in-flight producers of the old epoch
160
+ * from ever committing into the new one. Only a currently valid, active
161
+ * ledger rotates; integrity failures stay closed for the explicit recovery
162
+ * command. The threshold comes from the isolated Event V3 config resolver
163
+ * unless the caller pins one; a non-positive threshold disables rotation.
164
+ */
165
+ export function rotateOversizedEventLedgerV3(
166
+ coordRoot: string,
167
+ options: { thresholdBytes?: number } = {},
168
+ ): RotateOversizedEventLedgerV3Result {
169
+ const root = resolve(coordRoot);
170
+ const threshold = options.thresholdBytes ?? resolveEventLedgerRotateActiveBytesV3(root);
171
+ const activePath = join(root, ".harnery", "ledgers", "v3", "active.ndjson");
172
+ const measure = () => {
173
+ try {
174
+ return statSync(activePath).size;
175
+ } catch {
176
+ return 0;
177
+ }
178
+ };
179
+ if (threshold <= 0) {
180
+ return { state: "disabled", active_bytes: measure(), threshold_bytes: threshold };
181
+ }
182
+ if (measure() < threshold) {
183
+ return { state: "not_oversized", active_bytes: measure(), threshold_bytes: threshold };
184
+ }
185
+ return withBootstrapLease(root, () => {
186
+ const activeBytes = measure();
187
+ if (activeBytes < threshold) {
188
+ return { state: "not_oversized", active_bytes: activeBytes, threshold_bytes: threshold };
189
+ }
190
+ const current = readEventV3ControlState(root);
191
+ if (current.state !== "active") {
192
+ return { state: "not_active", active_bytes: activeBytes, threshold_bytes: threshold };
193
+ }
194
+ // Flush durable ready rows into the epoch they were produced for, so the
195
+ // archive carries them committed instead of stranded in its spool.
196
+ try {
197
+ drainReadyEventsV3(root);
198
+ } catch {
199
+ // A busy append lease only leaves rows in the archived spool; rotation
200
+ // itself stays safe.
201
+ }
202
+ const configPath = join(root, ".harnery", "config.jsonc");
203
+ const initialized = initializeEventLedgerV3Locked({
204
+ coordRoot: root,
205
+ harneryBuild: currentHarneryRuntimeBuild(),
206
+ hostBuild: repositoryBuild(root),
207
+ configDigest: sha256V3(
208
+ existsSync(configPath) ? readFileSync(configPath) : Buffer.from("{}\n"),
209
+ ),
210
+ approvalRecordId: "harnery-runtime-v3-size-rotation",
211
+ forceNewEpoch: true,
212
+ });
213
+ return {
214
+ state: "rotated",
215
+ active_bytes: activeBytes,
216
+ threshold_bytes: threshold,
217
+ ...(initialized.archived_epoch ? { archived_epoch: initialized.archived_epoch } : {}),
218
+ control: initialized.control,
219
+ };
220
+ });
221
+ }
222
+
223
+ function initializeEventLedgerV3Locked(
224
+ input: InitializeEventLedgerV3Input,
82
225
  ): InitializeEventLedgerV3Result {
83
226
  const root = resolve(input.coordRoot);
84
227
  let current = readEventV3ControlState(root);
@@ -147,6 +290,56 @@ export function initializeEventLedgerV3(
147
290
  };
148
291
  }
149
292
 
293
+ function runtimeCapabilityProfileCurrent(
294
+ control: Extract<EventV3ControlState, { state: "candidate" | "active" }>,
295
+ ): boolean {
296
+ const expected = Object.values(ADAPTER_CAPABILITY_PROFILES_V3).map((profile) =>
297
+ sha256V3(canonicalJsonV3(profile)),
298
+ );
299
+ const approved = control.genesis.profile.adapter_capability_profile_digests;
300
+ const expectedDigests = new Set<string>(expected);
301
+ return control.state === "candidate"
302
+ ? approved.some((digest) => expectedDigests.has(digest))
303
+ : expected.every((digest) => approved.includes(digest));
304
+ }
305
+
306
+ function withBootstrapLease<T>(coordRoot: string, operation: () => T): T {
307
+ const root = resolve(coordRoot);
308
+ const authority = createHash("sha256").update(root).digest("hex");
309
+ let lease: ReturnType<typeof acquireNoClobberLease> | undefined;
310
+ for (let attempt = 0; attempt < BOOTSTRAP_LEASE_RETRIES; attempt += 1) {
311
+ try {
312
+ lease = acquireNoClobberLease({
313
+ path: join(root, ".harnery", "private", "event-v3-bootstrap-lease"),
314
+ scope: "event-v3-bootstrap",
315
+ authoritySha256: authority,
316
+ staleAfterMs: BOOTSTRAP_LEASE_STALE_MS,
317
+ validateStaleOwner: (owner) => owner.host === hostname() && !pidIsAlive(owner.pid),
318
+ });
319
+ break;
320
+ } catch (error) {
321
+ if (attempt === BOOTSTRAP_LEASE_RETRIES - 1) throw error;
322
+ Atomics.wait(bootstrapSleepCell, 0, 0, BOOTSTRAP_LEASE_RETRY_MS);
323
+ }
324
+ }
325
+ if (!lease) throw new Error("event_v3_bootstrap_lease_busy");
326
+ try {
327
+ return operation();
328
+ } finally {
329
+ lease.release();
330
+ }
331
+ }
332
+
333
+ function pidIsAlive(pid: number): boolean {
334
+ if (!Number.isSafeInteger(pid) || pid < 1) return false;
335
+ try {
336
+ process.kill(pid, 0);
337
+ return true;
338
+ } catch (error) {
339
+ return (error as NodeJS.ErrnoException).code !== "ESRCH";
340
+ }
341
+ }
342
+
150
343
  function activateCandidateEpoch(
151
344
  root: string,
152
345
  candidate: CandidateGenesisManifestV3,
@@ -84,7 +84,7 @@ const BASE_SIGNAL_SUPPORT: Record<Adapter, Record<BaseAdapterSignalV3, Capabilit
84
84
  turn_id: "conditional",
85
85
  permission: "native",
86
86
  post_compaction: "native",
87
- context_usage: "unsupported",
87
+ context_usage: "conditional",
88
88
  },
89
89
  codex: {
90
90
  ...SHARED_SIGNAL_SUPPORT,
@@ -92,7 +92,7 @@ const BASE_SIGNAL_SUPPORT: Record<Adapter, Record<BaseAdapterSignalV3, Capabilit
92
92
  turn_id: "native",
93
93
  permission: "native",
94
94
  post_compaction: "native",
95
- context_usage: "unsupported",
95
+ context_usage: "derived",
96
96
  },
97
97
  cursor: {
98
98
  ...SHARED_SIGNAL_SUPPORT,
@@ -106,7 +106,7 @@ const BASE_SIGNAL_SUPPORT: Record<Adapter, Record<BaseAdapterSignalV3, Capabilit
106
106
  shell: "conditional",
107
107
  permission: "conditional",
108
108
  post_compaction: "unsupported",
109
- context_usage: "unsupported",
109
+ context_usage: "conditional",
110
110
  },
111
111
  };
112
112