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
@@ -1,17 +1,15 @@
1
+ import { type ChildProcess, spawnSync } from "node:child_process";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { resolve } from "node:path";
1
4
  import type { Command } from "commander";
2
5
  import type { EmitContext, HarneryProgramContext } from "../commander.ts";
3
6
 
4
- // Inline cachePath; see lib/tunnel/state.ts for rationale.
5
- function cachePath(tool: string, filename: string): string {
6
- const dir = resolve(process.cwd(), ".cache", tool);
7
- return resolve(dir, filename);
8
- }
9
-
10
- import { type ChildProcess, spawn, spawnSync } from "node:child_process";
11
- import { existsSync, openSync, readFileSync, writeFileSync } from "node:fs";
12
- import { resolve } from "node:path";
13
-
14
7
  import { resolveBinName } from "../core/config.ts";
8
+ import {
9
+ processLogDestination,
10
+ runRotatingProcessSync,
11
+ spawnRotatingProcess,
12
+ } from "../core/storage/process-log.ts";
15
13
  import {
16
14
  clearState,
17
15
  DEFAULT_INSTANCE,
@@ -79,6 +77,27 @@ interface LogsOpts {
79
77
  provider?: boolean;
80
78
  }
81
79
 
80
+ export function tunnelLogDestinations(
81
+ name: string,
82
+ provider: TunnelProvider,
83
+ env: NodeJS.ProcessEnv = process.env,
84
+ root = process.cwd(),
85
+ ): { gate: string; provider: string } {
86
+ const destination = (filename: string) =>
87
+ processLogDestination({
88
+ coord_root: root,
89
+ project_root: root,
90
+ family_id: "tunnel-process-log",
91
+ filename,
92
+ legacy_path: resolve(root, ".cache", "tunnel", filename),
93
+ env,
94
+ });
95
+ return {
96
+ gate: destination(gateLogFile(name)),
97
+ provider: destination(providerLogFile(name, provider)),
98
+ };
99
+ }
100
+
82
101
  /**
83
102
  * Validate + normalize an instance name. Names become filename fragments
84
103
  * (state-<name>.json) and pgrep patterns, so they're restricted to a safe
@@ -348,7 +367,6 @@ function runTailscaleShare(
348
367
  httpsPort: number,
349
368
  logPath: string,
350
369
  ): void {
351
- const fd = openSync(logPath, "a");
352
370
  const args = [
353
371
  tailscaleCommand(mode),
354
372
  "--bg",
@@ -357,31 +375,36 @@ function runTailscaleShare(
357
375
  `--set-path=${path}`,
358
376
  targetUrl,
359
377
  ];
360
- const r = spawnSync("tailscale", args, {
361
- stdio: ["ignore", fd, fd],
378
+ const status = runRotatingProcessSync({
379
+ path: logPath,
380
+ command: "tailscale",
381
+ arguments: args,
362
382
  });
363
- if (r.status !== 0) {
383
+ if (status !== 0) {
364
384
  emit.error({
365
385
  code: "tunnel_tailscale_failed",
366
386
  message: `tailscale ${tailscaleCommand(mode)} failed. Check log: ${logPath}`,
367
387
  });
368
- process.exit(r.status ?? 1);
388
+ process.exit(status ?? 1);
369
389
  }
370
390
  }
371
391
 
372
392
  function stopTailscaleShare(state: TunnelState): boolean {
373
393
  if (state.provider !== "tailscale" || !state.tailscale_mode) return true;
374
394
  const cmd = tailscaleCommand(state.tailscale_mode);
375
- const logPath = cachePath("tunnel", providerLogFile(state.name, "tailscale"));
376
- const fd = openSync(logPath, "a");
395
+ const logPath = tunnelLogDestinations(state.name, "tailscale").provider;
377
396
  const args = [
378
397
  cmd,
379
398
  `--https=${state.tailscale_https_port ?? 443}`,
380
399
  `--set-path=${state.tailscale_path ?? "/"}`,
381
400
  "off",
382
401
  ];
383
- const r = spawnSync("tailscale", args, { stdio: ["ignore", fd, fd] });
384
- if (r.status !== 0) {
402
+ const status = runRotatingProcessSync({
403
+ path: logPath,
404
+ command: "tailscale",
405
+ arguments: args,
406
+ });
407
+ if (status !== 0) {
385
408
  // The gate is torn down and its port is freed for reuse regardless, so a
386
409
  // surviving serve/funnel mapping could later re-expose whatever next binds
387
410
  // that port. Surface it loudly so the operator can clear it by hand.
@@ -432,26 +455,22 @@ interface GateSpawnOpts {
432
455
  * re-reads — that snapshot is precisely why `reload` has to exist.
433
456
  */
434
457
  function spawnGate(o: GateSpawnOpts): ChildProcess {
435
- const gateFd = openSync(o.gateLogPath, "a");
436
458
  // `--name`/`--port` on argv mirror the env vars; they're what makes the gate
437
459
  // process distinguishable per-instance in `pgrep -f` (see sweepStrays).
438
- const gateProc = spawn(
439
- "bun",
440
- ["run", gateScriptPath(), "--name", o.name, "--port", String(o.gatePort)],
441
- {
442
- detached: true,
443
- stdio: ["ignore", gateFd, gateFd],
444
- env: {
445
- ...process.env,
446
- HARNERY_TUNNEL_ALLOW: o.allowedIps.join(","),
447
- HARNERY_TUNNEL_ACCESS:
448
- o.provider === "cloudflare" ? "cloudflare-allowlist" : "trusted-local-proxy",
449
- HARNERY_TUNNEL_TARGET: o.target,
450
- HARNERY_TUNNEL_VHOST: o.vhost,
451
- HARNERY_TUNNEL_PORT: String(o.gatePort),
452
- },
460
+ const gateProc = spawnRotatingProcess({
461
+ path: o.gateLogPath,
462
+ command: "bun",
463
+ arguments: ["run", gateScriptPath(), "--name", o.name, "--port", String(o.gatePort)],
464
+ env: {
465
+ ...process.env,
466
+ HARNERY_TUNNEL_ALLOW: o.allowedIps.join(","),
467
+ HARNERY_TUNNEL_ACCESS:
468
+ o.provider === "cloudflare" ? "cloudflare-allowlist" : "trusted-local-proxy",
469
+ HARNERY_TUNNEL_TARGET: o.target,
470
+ HARNERY_TUNNEL_VHOST: o.vhost,
471
+ HARNERY_TUNNEL_PORT: String(o.gatePort),
453
472
  },
454
- );
473
+ });
455
474
  gateProc.unref();
456
475
  return gateProc;
457
476
  }
@@ -521,10 +540,9 @@ async function up(opts: UpOpts): Promise<void> {
521
540
  process.exit(1);
522
541
  }
523
542
 
524
- const gateLogPath = cachePath("tunnel", gateLogFile(name));
525
- const providerLogPath = cachePath("tunnel", providerLogFile(name, provider));
526
- writeFileSync(gateLogPath, "");
527
- writeFileSync(providerLogPath, "");
543
+ const logPaths = tunnelLogDestinations(name, provider);
544
+ const gateLogPath = logPaths.gate;
545
+ const providerLogPath = logPaths.provider;
528
546
 
529
547
  const gateProc = spawnGate({
530
548
  name,
@@ -551,20 +569,16 @@ async function up(opts: UpOpts): Promise<void> {
551
569
  let cloudflaredPid: number | undefined;
552
570
 
553
571
  if (provider === "cloudflare") {
554
- const cfdFd = openSync(providerLogPath, "a");
555
572
  // Force HTTP/2 transport. The default QUIC transport wedges at precheck on
556
573
  // constrained hosts (e.g. WSL, where UDP receive buffers can't grow and ICMP
557
574
  // is restricted): the URL prints but the edge never registers. HTTP/2 is
558
575
  // marginally higher-latency but registers reliably, which is what a dev
559
576
  // tunnel needs.
560
- const cfdProc = spawn(
561
- cloudflaredBin!,
562
- ["tunnel", "--protocol", "http2", "--url", `http://localhost:${gatePort}`],
563
- {
564
- detached: true,
565
- stdio: ["ignore", cfdFd, cfdFd],
566
- },
567
- );
577
+ const cfdProc = spawnRotatingProcess({
578
+ path: providerLogPath,
579
+ command: cloudflaredBin!,
580
+ arguments: ["tunnel", "--protocol", "http2", "--url", `http://localhost:${gatePort}`],
581
+ });
568
582
  cfdProc.unref();
569
583
  cloudflaredPid = cfdProc.pid!;
570
584
 
@@ -788,7 +802,7 @@ export async function reloadOne(state: TunnelState): Promise<{ ok: boolean; mess
788
802
  vhost: state.vhost,
789
803
  provider: state.provider,
790
804
  allowedIps: cfg.allowed_ips,
791
- gateLogPath: cachePath("tunnel", gateLogFile(name)),
805
+ gateLogPath: tunnelLogDestinations(name, state.provider).gate,
792
806
  });
793
807
 
794
808
  await sleep(800);
@@ -952,8 +966,8 @@ function logs(opts: LogsOpts): void {
952
966
  const name = resolveName(opts.name);
953
967
  const state = readState(name);
954
968
  const provider = state?.provider ?? "cloudflare";
955
- const which = opts.provider ? providerLogFile(name, provider) : gateLogFile(name);
956
- const path = cachePath("tunnel", which);
969
+ const destinations = tunnelLogDestinations(name, provider);
970
+ const path = opts.provider ? destinations.provider : destinations.gate;
957
971
  if (!existsSync(path)) {
958
972
  emit.error({ code: "tunnel_no_log", message: `No log file at ${path}` });
959
973
  process.exit(1);
@@ -2,11 +2,17 @@ import { spawn, spawnSync } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  import { createServer } from "node:net";
4
4
  import path from "node:path";
5
- import { fileURLToPath } from "node:url";
5
+ import { fileURLToPath, pathToFileURL } from "node:url";
6
6
  import type { Command } from "commander";
7
7
  import type { EmitContext } from "../commander.ts";
8
8
  import { DEFAULT_WEB_PORT, resolveWebPort } from "../core/config.ts";
9
9
  import { ensureSemanticServiceRunning } from "../core/semantic/service.ts";
10
+ import { processLogDestination } from "../core/storage/process-log.ts";
11
+ import {
12
+ parsePerformanceWindow,
13
+ readWebPerformanceReport,
14
+ WEB_PERFORMANCE_LOG,
15
+ } from "../lib/web-performance.ts";
10
16
  import { lazyFetchWebRoot, webRunner } from "./web-fetch.ts";
11
17
 
12
18
  /**
@@ -16,6 +22,7 @@ import { lazyFetchWebRoot, webRunner } from "./web-fetch.ts";
16
22
  * up [--prod]: start the server (dev mode default; --prod runs next start)
17
23
  * build: next build (production bundle)
18
24
  * start: next start (must `harn web build` first)
25
+ * performance: summarize request latency and event-loop delays
19
26
  *
20
27
  * Launches the Next.js app under `harnery/web/` against the user's current
21
28
  * working directory. The web app reads `.harnery/` via `HARNERY_COORD_ROOT`;
@@ -70,6 +77,27 @@ export function nodeOptionsWithHeapCap(mb: number): string | undefined {
70
77
  return `${inherited} --max-old-space-size=${mb}`.trim();
71
78
  }
72
79
 
80
+ /** Preload the request diagnostics hook without replacing Next's HTTP server. */
81
+ export function nodeOptionsWithWebDiagnostics(webDir: string, mb: number): string {
82
+ const inherited = nodeOptionsWithHeapCap(mb) ?? "";
83
+ if (inherited.includes("server-performance.mjs")) return inherited;
84
+ const preload = pathToFileURL(path.join(webDir, "server-performance.mjs")).href;
85
+ return `${inherited} --import=${preload}`.trim();
86
+ }
87
+
88
+ export function webPerformanceLogDestination(
89
+ coordRoot: string,
90
+ env: Readonly<Record<string, string | undefined>> = process.env,
91
+ ): string {
92
+ return processLogDestination({
93
+ coord_root: coordRoot,
94
+ family_id: "web-performance-log",
95
+ filename: "active.jsonl",
96
+ legacy_path: path.join(coordRoot, ".harnery", "logs", WEB_PERFORMANCE_LOG),
97
+ env,
98
+ });
99
+ }
100
+
73
101
  async function startSemanticServiceWithWeb(coordRoot: string, emit: EmitContext): Promise<void> {
74
102
  const result = await ensureSemanticServiceRunning(coordRoot);
75
103
  if (result.state === "started") emit.log("semantic reader · started automatically", "info");
@@ -208,9 +236,12 @@ export function registerWebCommand(program: Command, emit: EmitContext): void {
208
236
  await startSemanticServiceWithWeb(coordRoot, emit);
209
237
 
210
238
  const heapMb = resolveMaxOldSpaceMb(opts.maxOldSpace);
239
+ const nodeOptions = nodeOptionsWithWebDiagnostics(root, heapMb);
240
+ const performanceLogPath = webPerformanceLogDestination(coordRoot);
211
241
  emit.log(`harn web · http://localhost:${port} (${mode})`, "info");
212
242
  emit.log(`files origin · http://harnery-files.localhost:${port}`, "info");
213
243
  emit.log(`reading .harnery/ from: ${coordRoot}`, "info");
244
+ emit.log(`performance log · ${performanceLogPath}`, "info");
214
245
  if (heapMb > 0) emit.log(`heap ceiling · ${heapMb} MB`, "info");
215
246
 
216
247
  const child = spawn(webRunner(), ["run", mode], {
@@ -219,9 +250,9 @@ export function registerWebCommand(program: Command, emit: EmitContext): void {
219
250
  ...process.env,
220
251
  HARNERY_COORD_ROOT: coordRoot,
221
252
  HARNERY_WEB_PORT: String(port),
222
- ...(nodeOptionsWithHeapCap(heapMb)
223
- ? { NODE_OPTIONS: nodeOptionsWithHeapCap(heapMb) as string }
224
- : {}),
253
+ HARNERY_WEB_MODE: mode,
254
+ HARNERY_WEB_PERFORMANCE_LOG_PATH: performanceLogPath,
255
+ NODE_OPTIONS: nodeOptions,
225
256
  },
226
257
  stdio: "inherit",
227
258
  });
@@ -297,8 +328,11 @@ export function registerWebCommand(program: Command, emit: EmitContext): void {
297
328
  if (!(await requireAvailablePort(emit, port))) return;
298
329
  await startSemanticServiceWithWeb(coordRoot, emit);
299
330
  const heapMb = resolveMaxOldSpaceMb(opts.maxOldSpace);
331
+ const nodeOptions = nodeOptionsWithWebDiagnostics(root, heapMb);
332
+ const performanceLogPath = webPerformanceLogDestination(coordRoot);
300
333
  emit.log(`harn web · http://localhost:${port} (start)`, "info");
301
334
  emit.log(`reading .harnery/ from: ${coordRoot}`, "info");
335
+ emit.log(`performance log · ${performanceLogPath}`, "info");
302
336
  if (heapMb > 0) emit.log(`heap ceiling · ${heapMb} MB`, "info");
303
337
 
304
338
  const child = spawn(webRunner(), ["run", "start"], {
@@ -307,9 +341,9 @@ export function registerWebCommand(program: Command, emit: EmitContext): void {
307
341
  ...process.env,
308
342
  HARNERY_COORD_ROOT: coordRoot,
309
343
  HARNERY_WEB_PORT: String(port),
310
- ...(nodeOptionsWithHeapCap(heapMb)
311
- ? { NODE_OPTIONS: nodeOptionsWithHeapCap(heapMb) as string }
312
- : {}),
344
+ HARNERY_WEB_MODE: "start",
345
+ HARNERY_WEB_PERFORMANCE_LOG_PATH: performanceLogPath,
346
+ NODE_OPTIONS: nodeOptions,
313
347
  },
314
348
  stdio: "inherit",
315
349
  });
@@ -324,4 +358,40 @@ export function registerWebCommand(program: Command, emit: EmitContext): void {
324
358
  process.exitCode = code ?? 0;
325
359
  });
326
360
  });
361
+
362
+ web
363
+ .command("performance")
364
+ .description("Summarize dashboard request, event-loop, memory, and GC diagnostics")
365
+ .option("--coord-root <dir>", "Override the coordination root", process.cwd())
366
+ .option("--since <window>", "Include the last Nm, Nh, or Nd", "1h")
367
+ .option("--limit <n>", "Keep the N slowest requests and delays", "20")
368
+ .option("--json", "Emit structured JSON")
369
+ .action((opts: { coordRoot: string; since: string; limit: string; json?: boolean }) => {
370
+ const windowMs = parsePerformanceWindow(opts.since);
371
+ if (windowMs === null) {
372
+ emit.error({
373
+ code: "invalid_web_performance_window",
374
+ message: `invalid --since value '${opts.since}'`,
375
+ hint: "Use Nm, Nh, or Nd, for example 30m, 1h, or 7d.",
376
+ });
377
+ return;
378
+ }
379
+ const limit = Number(opts.limit);
380
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 500) {
381
+ emit.error({
382
+ code: "invalid_web_performance_limit",
383
+ message: `invalid --limit value '${opts.limit}'`,
384
+ hint: "Use an integer from 1 through 500.",
385
+ });
386
+ return;
387
+ }
388
+ if (opts.json) emit.config({ format: "json" });
389
+ emit.data(
390
+ readWebPerformanceReport({
391
+ root: opts.coordRoot,
392
+ since: opts.since,
393
+ limit,
394
+ }),
395
+ );
396
+ });
327
397
  }
@@ -6,9 +6,9 @@ import {
6
6
  createBuiltinAdapterRegistry,
7
7
  probeBinaryVersion,
8
8
  } from "../core/adapters/index.ts";
9
+ import { resolveCoordRoot } from "../core/agents/coord-client.ts";
9
10
  import { workflowSubscriptionOnly } from "../core/config.ts";
10
11
  import { findCompletedMissionGoverning, reopenGovernorMission } from "../core/governor/index.ts";
11
- import { findCoordRoot } from "../core/hooks/resolve/coord-root.ts";
12
12
  import type { PolicyIsolation } from "../core/policy/index.ts";
13
13
  import { loadPolicyFile } from "../core/policy/index.ts";
14
14
  import {
@@ -467,7 +467,7 @@ export function renderAttemptBudget(record: WorkRecord): string {
467
467
  }
468
468
 
469
469
  function withWorkRoot(emit: EmitContext, fn: (coordRoot: string) => void): void {
470
- const coordRoot = findCoordRoot();
470
+ const coordRoot = resolveCoordRoot();
471
471
  if (!coordRoot) {
472
472
  emit.error({
473
473
  code: "no_coord_root",
@@ -488,7 +488,7 @@ async function withWorkRootAsync(
488
488
  emit: EmitContext,
489
489
  fn: (coordRoot: string) => Promise<void>,
490
490
  ): Promise<void> {
491
- const coordRoot = findCoordRoot();
491
+ const coordRoot = resolveCoordRoot();
492
492
  if (!coordRoot) {
493
493
  emit.error({
494
494
  code: "no_coord_root",
@@ -7,8 +7,8 @@ import {
7
7
  createBuiltinAdapterRegistry,
8
8
  probeBinaryVersion,
9
9
  } from "../core/adapters/index.ts";
10
+ import { resolveCoordRoot } from "../core/agents/coord-client.ts";
10
11
  import { resolveBinName, workflowSubscriptionOnly } from "../core/config.ts";
11
- import { findCoordRoot } from "../core/hooks/resolve/coord-root.ts";
12
12
  import type { PolicyIsolation } from "../core/policy/index.ts";
13
13
  import { loadPolicyFile } from "../core/policy/index.ts";
14
14
  import type { WorkflowApproval, WorkflowApprovalStatus } from "../core/workflow/approvals.ts";
@@ -132,7 +132,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
132
132
  .option("--approval-to <address>", "Address durable ASK requests (default: operator)")
133
133
  .option("--json", "Emit the full RunReport as JSON")
134
134
  .action(async (script: string, opts: WorkflowRunOpts) => {
135
- const coordRoot = findCoordRoot();
135
+ const coordRoot = resolveCoordRoot();
136
136
  if (!coordRoot) {
137
137
  emit.error({
138
138
  code: "no_coord_root",
@@ -263,7 +263,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
263
263
  .description("Resume a parked workflow after its durable approval has been resolved.")
264
264
  .option("--json", "Emit the full RunReport or parked result as JSON")
265
265
  .action(async (runId: string, opts: { json?: boolean }) => {
266
- const coordRoot = findCoordRoot();
266
+ const coordRoot = resolveCoordRoot();
267
267
  if (!coordRoot) {
268
268
  emit.error({
269
269
  code: "no_coord_root",
@@ -345,7 +345,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
345
345
  .description("Show validated allocation, verification, integration, and cleanup state.")
346
346
  .option("--json", "Emit the validated workspace status as JSON")
347
347
  .action(async (runId: string, opts: { json?: boolean }) => {
348
- const coordRoot = findCoordRoot();
348
+ const coordRoot = resolveCoordRoot();
349
349
  if (!coordRoot) {
350
350
  emit.error({
351
351
  code: "no_coord_root",
@@ -374,7 +374,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
374
374
  .description("List validated isolated and shared-compatibility workspace decisions.")
375
375
  .option("--json", "Emit workspace inspections as JSON")
376
376
  .action(async (opts: { json?: boolean }) => {
377
- const coordRoot = findCoordRoot();
377
+ const coordRoot = resolveCoordRoot();
378
378
  if (!coordRoot) {
379
379
  emit.error({
380
380
  code: "no_coord_root",
@@ -433,7 +433,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
433
433
  .option("--approval-to <address>", "Address a durable policy ASK request")
434
434
  .option("--json", "Emit the durable integration plan as JSON")
435
435
  .action(async (runId: string, opts: WorkflowIntegrationPrepareOpts) => {
436
- const coordRoot = findCoordRoot();
436
+ const coordRoot = resolveCoordRoot();
437
437
  if (!coordRoot) {
438
438
  emit.error({
439
439
  code: "no_coord_root",
@@ -521,7 +521,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
521
521
  .option("--yes", "Confirm the target-branch mutation")
522
522
  .option("--json", "Emit the durable integration receipt as JSON")
523
523
  .action(async (runId: string, opts: WorkflowConfirmedMutationOpts) => {
524
- const coordRoot = findCoordRoot();
524
+ const coordRoot = resolveCoordRoot();
525
525
  if (!coordRoot) {
526
526
  emit.error({
527
527
  code: "no_coord_root",
@@ -565,7 +565,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
565
565
  .option("--yes", "Confirm the worktree and provider-branch removal attempt")
566
566
  .option("--json", "Emit the cleanup attempt or receipt as JSON")
567
567
  .action(async (runId: string, opts: WorkflowConfirmedMutationOpts) => {
568
- const coordRoot = findCoordRoot();
568
+ const coordRoot = resolveCoordRoot();
569
569
  if (!coordRoot) {
570
570
  emit.error({
571
571
  code: "no_coord_root",
@@ -616,7 +616,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
616
616
  .option("--discard", "Throw the uncommitted work away instead of salvaging it")
617
617
  .option("--json", "Emit the reclaim preparation and cleanup result as JSON")
618
618
  .action(async (runId: string, opts: WorkflowReclaimOpts) => {
619
- const coordRoot = findCoordRoot();
619
+ const coordRoot = resolveCoordRoot();
620
620
  if (!coordRoot) {
621
621
  emit.error({
622
622
  code: "no_coord_root",
@@ -687,7 +687,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
687
687
  .option("--status <status>", "Filter: pending | approved | denied")
688
688
  .option("--json", "Emit approval records as JSON")
689
689
  .action(async (opts: WorkflowApprovalListOpts) => {
690
- const coordRoot = findCoordRoot();
690
+ const coordRoot = resolveCoordRoot();
691
691
  if (!coordRoot) {
692
692
  emit.error({ code: "no_coord_root", message: "no .harnery/ coordination root found" });
693
693
  process.exit(1);
@@ -725,7 +725,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
725
725
  .description("Show one durable workflow approval.")
726
726
  .option("--json", "Emit the approval record as JSON")
727
727
  .action(async (approvalId: string, opts: { json?: boolean }) => {
728
- const coordRoot = findCoordRoot();
728
+ const coordRoot = resolveCoordRoot();
729
729
  if (!coordRoot) {
730
730
  emit.error({ code: "no_coord_root", message: "no .harnery/ coordination root found" });
731
731
  process.exit(1);
@@ -755,7 +755,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
755
755
  .option("--reason <text>", "Bounded decision reason")
756
756
  .option("--json", "Emit the resolved approval as JSON")
757
757
  .action(async (approvalId: string, opts: WorkflowApprovalDecisionOpts) => {
758
- const coordRoot = findCoordRoot();
758
+ const coordRoot = resolveCoordRoot();
759
759
  if (!coordRoot) {
760
760
  emit.error({ code: "no_coord_root", message: "no .harnery/ coordination root found" });
761
761
  process.exit(1);
@@ -798,7 +798,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
798
798
  .description("Show the bounded proof packet for a completed workflow run.")
799
799
  .option("--json", "Emit the stored proof packet as JSON")
800
800
  .action(async (runId: string, opts: WorkflowProofOpts) => {
801
- const coordRoot = findCoordRoot();
801
+ const coordRoot = resolveCoordRoot();
802
802
  if (!coordRoot) {
803
803
  emit.error({
804
804
  code: "no_coord_root",