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
@@ -12,13 +12,17 @@
12
12
  */
13
13
 
14
14
  import { spawnSync } from "node:child_process";
15
- import { existsSync } from "node:fs";
15
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
16
16
  import os from "node:os";
17
17
  import path from "node:path";
18
18
  import type { Command } from "commander";
19
19
  import type { EmitContext } from "../commander.ts";
20
20
  import { BUILTIN_ADAPTER_IDS } from "../core/adapters/index.ts";
21
21
  import { resolveBinName, ripgrepAutoInstall } from "../core/config.ts";
22
+ import {
23
+ countSummarizedSinceV3,
24
+ listDiagnosticSummariesV3,
25
+ } from "../core/events/v3/producers/diagnostic-summaries.ts";
22
26
  import { ADAPTER_SPECS, type AdapterId } from "../core/hooks/adapter/events.ts";
23
27
  import { loadAdapterWiring, summarizeAdapterWiring } from "../core/hooks/adapter/wiring.ts";
24
28
  import {
@@ -107,8 +111,10 @@ export function registerDoctorCommand(program: Command, emit: EmitContext): void
107
111
  }
108
112
 
109
113
  export async function runChecks(): Promise<Check[]> {
114
+ const root = findCoordProjectRoot();
110
115
  const codexWslStatus = inspectCodexWslBridge();
111
- const codexWslBridge = checkCodexWslBridge(codexWslStatus);
116
+ const recentCodexMidFlightCount = root ? countRecentCodexMidFlightOnboardings(root) : 0;
117
+ const codexWslBridge = codexWslBridgeCheck(codexWslStatus, recentCodexMidFlightCount);
112
118
  // Probe the adapter CLIs before the hook check runs, not in output order:
113
119
  // an unwired adapter only matters if its CLI is actually installed, and
114
120
  // probing once here keeps that join to one spawn per CLI.
@@ -163,18 +169,78 @@ function checkGitHookRegions(): Check {
163
169
  }
164
170
  }
165
171
 
166
- function checkCodexWslBridge(status: CodexWslBridgeStatus | null): Check | null {
167
- if (!status) return null;
172
+ export function codexWslBridgeCheck(
173
+ status: CodexWslBridgeStatus | null,
174
+ recentMidFlightCount = 0,
175
+ ): Check | null {
176
+ if (!status && recentMidFlightCount === 0) return null;
177
+ const historical =
178
+ recentMidFlightCount === 0
179
+ ? null
180
+ : `${recentMidFlightCount} Codex mid-flight onboarding${recentMidFlightCount === 1 ? "" : "s"} recorded in the last 48h`;
168
181
  return {
169
182
  name: "codex:WSL bridge",
170
- severity: status.ok ? "ok" : "warn",
171
- detail: status.detail,
172
- hint: status.ok
173
- ? undefined
174
- : "forward CODEX_THREAD_ID through WSLENV in the Codex shell environment policy, then start a fresh task",
183
+ severity: status?.ok && !historical ? "ok" : "warn",
184
+ detail: [status?.detail, historical].filter(Boolean).join("; "),
185
+ hint:
186
+ status?.ok && !historical
187
+ ? undefined
188
+ : "forward CODEX_THREAD_ID through WSLENV in the Codex shell environment policy, then start a fresh task",
175
189
  };
176
190
  }
177
191
 
192
+ const CODEX_MID_FLIGHT_HISTORY_WINDOW_MS = 48 * 60 * 60 * 1000;
193
+
194
+ /** Count bounded, privacy-safe recovery diagnostics so a healthy environment
195
+ * now does not hide an intermittent Codex-to-WSL identity drop. */
196
+ export function countRecentCodexMidFlightOnboardings(
197
+ coordRoot: string,
198
+ nowMs = Date.now(),
199
+ windowMs = CODEX_MID_FLIGHT_HISTORY_WINDOW_MS,
200
+ ): number {
201
+ // Occurrences past the producer's loose-exemplar bound live in summary
202
+ // files instead of loose diagnostics; count them too so the mitigation
203
+ // cannot hide an active Codex identity drop from this warning.
204
+ let count = 0;
205
+ try {
206
+ const listing = listDiagnosticSummariesV3(coordRoot);
207
+ count += countSummarizedSinceV3(
208
+ listing.summaries,
209
+ nowMs - windowMs,
210
+ (summary) =>
211
+ summary.category === "mid_flight_onboarding" && summary.metadata.adapter === "codex",
212
+ nowMs,
213
+ );
214
+ } catch {
215
+ // Summary reads are best-effort; loose diagnostics below still count.
216
+ }
217
+ const directory = path.join(coordRoot, ".harnery", "ledgers", "v3", "diagnostics");
218
+ if (!existsSync(directory)) return count;
219
+ for (const name of readdirSync(directory)) {
220
+ if (!name.startsWith("mid_flight_onboarding-") || !name.endsWith(".json")) continue;
221
+ try {
222
+ const row = JSON.parse(readFileSync(path.join(directory, name), "utf8")) as {
223
+ recorded_at?: unknown;
224
+ category?: unknown;
225
+ adapter?: unknown;
226
+ };
227
+ const recordedAt = typeof row.recorded_at === "string" ? Date.parse(row.recorded_at) : NaN;
228
+ if (
229
+ row.category === "mid_flight_onboarding" &&
230
+ row.adapter === "codex" &&
231
+ Number.isFinite(recordedAt) &&
232
+ recordedAt <= nowMs &&
233
+ nowMs - recordedAt <= windowMs
234
+ ) {
235
+ count += 1;
236
+ }
237
+ } catch {
238
+ // A malformed best-effort diagnostic cannot make doctor fail.
239
+ }
240
+ }
241
+ return count;
242
+ }
243
+
178
244
  export function codexAuthorizationCheck(result: CodexHookAuthorizationResult): Check {
179
245
  const reviewHint =
180
246
  "terminal UI: run `/hooks`; Codex Desktop: open Settings > Hooks; after approval, start a fresh task";
@@ -86,7 +86,7 @@ async function runFetch(
86
86
  const timeoutMs = Number.parseInt(opts.timeout, 10);
87
87
  const ac = new AbortController();
88
88
  const timer = setTimeout(() => ac.abort(), timeoutMs);
89
- let result: Awaited<ReturnType<typeof fetchWithJar>>;
89
+ let result: Awaited<ReturnType<typeof fetchWithJar<"bytes">>>;
90
90
  try {
91
91
  result = await fetchWithJar(url, {
92
92
  method: opts.method,
@@ -96,13 +96,14 @@ async function runFetch(
96
96
  redirect: opts.redirect as RequestRedirect,
97
97
  signal: ac.signal,
98
98
  extraHeaders: context?.extraHeaders,
99
+ responseType: "bytes",
99
100
  });
100
101
  } finally {
101
102
  clearTimeout(timer);
102
103
  }
103
104
 
104
105
  if (opts.json) {
105
- emit.data(result as unknown as Record<string, unknown>);
106
+ emit.data({ ...result, body: new TextDecoder().decode(result.body) });
106
107
  return;
107
108
  }
108
109
  if (opts.status) {
@@ -117,14 +118,14 @@ async function runFetch(
117
118
  if (opts.output) {
118
119
  writeFileSync(opts.output, result.body);
119
120
  emit.file(opts.output, {
120
- bytes: result.body.length,
121
+ bytes: result.body.byteLength,
121
122
  status: result.status,
122
123
  status_text: result.statusText,
123
124
  });
124
125
  } else {
125
- // Body is potentially binary; route as text since most fetch responses
126
- // are text/HTML/JSON. Binary callers should use --output.
127
- emit.text(result.body);
126
+ // Text destinations decode at the presentation boundary. File output
127
+ // above keeps the response bytes intact regardless of MIME type.
128
+ emit.text(new TextDecoder().decode(result.body));
128
129
  }
129
130
 
130
131
  if (jar && result.cookiesSaved > 0) {
@@ -0,0 +1,143 @@
1
+ import { realpathSync, statSync } from "node:fs";
2
+ import path from "node:path";
3
+ import type { Command } from "commander";
4
+ import type { EmitContext, HarneryProgramContext } from "../commander.ts";
5
+ import { resolveCoordRoot } from "../core/agents/coord-client.ts";
6
+ import { DEFAULT_WEB_PORT, resolveWebPort } from "../core/config.ts";
7
+ import { localFilesOriginUrl, localFileViewerUrl } from "../lib/local-file-url.ts";
8
+
9
+ export { FILES_ORIGIN_HOST } from "../lib/local-file-url.ts";
10
+
11
+ export type LocalFileUrlMode = "auto" | "raw" | "viewer";
12
+
13
+ export interface LocalFileUrlOptions {
14
+ coordRoot: string;
15
+ port: number;
16
+ mode?: LocalFileUrlMode;
17
+ }
18
+
19
+ export interface LocalFileUrl {
20
+ url: string;
21
+ relPath: string;
22
+ mode: Exclude<LocalFileUrlMode, "auto">;
23
+ }
24
+
25
+ function isOutsideRoot(relPath: string): boolean {
26
+ return relPath === "" || relPath === ".." || relPath.startsWith(`..${path.sep}`);
27
+ }
28
+
29
+ function canonicalRepoPath(input: string, coordRoot: string): string {
30
+ if (input.trim() === "") throw new Error("path must not be empty");
31
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: URL output must stay one clean line
32
+ if (/[\u0000-\u001f\u007f]/.test(input)) throw new Error("path contains control bytes");
33
+
34
+ let root: string;
35
+ try {
36
+ root = realpathSync(coordRoot);
37
+ } catch {
38
+ throw new Error(`coord root does not exist: ${coordRoot}`);
39
+ }
40
+
41
+ const candidate = path.isAbsolute(input) ? input : path.resolve(root, input);
42
+ let canonical: string;
43
+ try {
44
+ canonical = realpathSync(candidate);
45
+ } catch {
46
+ throw new Error(`file does not exist: ${input}`);
47
+ }
48
+
49
+ const relPath = path.relative(root, canonical);
50
+ if (isOutsideRoot(relPath) || path.isAbsolute(relPath)) {
51
+ throw new Error(`file is outside the coord root: ${input}`);
52
+ }
53
+ if (!statSync(canonical).isFile()) throw new Error(`path is not a file: ${input}`);
54
+ return relPath.split(path.sep).join("/");
55
+ }
56
+
57
+ function isHtmlPath(relPath: string): boolean {
58
+ const lower = relPath.toLowerCase();
59
+ return lower.endsWith(".html") || lower.endsWith(".htm");
60
+ }
61
+
62
+ /**
63
+ * Mint the local browser URL for a file under the dashboard's coord root.
64
+ * HTML defaults to the isolated files origin so scripts and relative assets
65
+ * work. Other files default to the dashboard viewer.
66
+ */
67
+ export function mintLocalFileUrl(input: string, options: LocalFileUrlOptions): LocalFileUrl {
68
+ const relPath = canonicalRepoPath(input, options.coordRoot);
69
+ const requestedMode = options.mode ?? "auto";
70
+ const mode = requestedMode === "auto" ? (isHtmlPath(relPath) ? "raw" : "viewer") : requestedMode;
71
+ const url =
72
+ mode === "raw"
73
+ ? localFilesOriginUrl(relPath, options.port)
74
+ : localFileViewerUrl(relPath, options.port);
75
+ return { url, relPath, mode };
76
+ }
77
+
78
+ export function registerFilesCommand(
79
+ program: Command,
80
+ emit: EmitContext,
81
+ context?: HarneryProgramContext,
82
+ ): void {
83
+ const files = program
84
+ .command("files")
85
+ .description("Mint browser links for files served by the local dashboard");
86
+
87
+ files
88
+ .command("url")
89
+ .description("Mint the local browser URL for a repo file")
90
+ .argument("<path>", "Repo-relative path, or an absolute path inside the coord root")
91
+ .option("-p, --port <port>", `Dashboard port (default ${DEFAULT_WEB_PORT})`)
92
+ .option("--coord-root <dir>", "Override the coord root")
93
+ .option("--raw", "Use the isolated files origin, regardless of extension")
94
+ .option("--viewer", "Use the dashboard file viewer, regardless of extension")
95
+ .action(
96
+ (
97
+ filePath: string,
98
+ opts: { port?: string; coordRoot?: string; raw?: boolean; viewer?: boolean },
99
+ ) => {
100
+ if (opts.raw && opts.viewer) {
101
+ emit.error({
102
+ code: "conflicting_url_modes",
103
+ message: "--raw and --viewer cannot be used together",
104
+ });
105
+ emit.setExitCode(1);
106
+ return;
107
+ }
108
+ const coordRoot =
109
+ opts.coordRoot ??
110
+ context?.resolveCoordRoot?.() ??
111
+ context?.repoRoot ??
112
+ resolveCoordRoot(process.cwd()) ??
113
+ process.cwd();
114
+ let port: number;
115
+ try {
116
+ port = resolveWebPort(opts.port, coordRoot);
117
+ } catch (error) {
118
+ emit.error({
119
+ code: "invalid_web_port",
120
+ message: error instanceof Error ? error.message : "invalid web port",
121
+ hint: `Use an integer from 1024 through 65535; the default is ${DEFAULT_WEB_PORT}.`,
122
+ });
123
+ emit.setExitCode(1);
124
+ return;
125
+ }
126
+ try {
127
+ const result = mintLocalFileUrl(filePath, {
128
+ coordRoot,
129
+ port,
130
+ mode: opts.raw ? "raw" : opts.viewer ? "viewer" : "auto",
131
+ });
132
+ emit.text(`${result.url}\n`);
133
+ } catch (error) {
134
+ emit.error({
135
+ code: "invalid_local_file",
136
+ message: error instanceof Error ? error.message : "invalid local file path",
137
+ hint: "Pass an existing file inside the dashboard coord root.",
138
+ });
139
+ emit.setExitCode(1);
140
+ }
141
+ },
142
+ );
143
+ }
@@ -1,4 +1,4 @@
1
- import { existsSync, readFileSync } from "node:fs";
1
+ import { readFileSync } from "node:fs";
2
2
  import { dirname, isAbsolute, resolve } from "node:path";
3
3
  import type { Command } from "commander";
4
4
  import type { EmitContext } from "../commander.ts";
@@ -8,6 +8,7 @@ import {
8
8
  probeBinaryVersion,
9
9
  readAttestation,
10
10
  } from "../core/adapters/index.ts";
11
+ import { resolveCoordRoot } from "../core/agents/coord-client.ts";
11
12
  import { workflowSubscriptionOnly } from "../core/config.ts";
12
13
  import { inspectAdapterSpread } from "../core/governor/adapter-spread.ts";
13
14
  import {
@@ -22,7 +23,6 @@ import {
22
23
  type GovernorRunReport,
23
24
  type GovernorServiceConfig,
24
25
  type GovernorServiceStatus,
25
- governorServiceLogPath,
26
26
  listGovernorsWithWarnings,
27
27
  readGovernor,
28
28
  readGovernorPlan,
@@ -35,7 +35,7 @@ import {
35
35
  runGovernorServiceDaemon,
36
36
  spawnGovernorService,
37
37
  } from "../core/governor/index.ts";
38
- import { findCoordRoot } from "../core/hooks/resolve/coord-root.ts";
38
+ import { readGovernorServiceLogs } from "../core/governor/service-read.ts";
39
39
  import type { PolicyIsolation } from "../core/policy/index.ts";
40
40
  import { loadPolicyFile } from "../core/policy/index.ts";
41
41
  import type { WorkflowSpecialistProfile } from "../core/workflow/index.ts";
@@ -401,16 +401,17 @@ function registerServiceCommand(
401
401
  withGovernorRoot(emit, (coordRoot) => {
402
402
  const lines = integer(opts.lines) ?? 50;
403
403
  if (lines > 10_000) throw new Error("service log lines must not exceed 10000");
404
- const path = governorServiceLogPath(coordRoot);
405
- if (!existsSync(path)) {
404
+ const result = readGovernorServiceLogs(coordRoot, {
405
+ max_bytes: 512 * 1024,
406
+ max_records: 10_000,
407
+ });
408
+ if (result.lines.length === 0) {
406
409
  emit.text("no governor service log\n");
407
410
  return;
408
411
  }
409
- const selected = readFileSync(path, "utf8")
410
- .split("\n")
411
- .slice(-(lines + 1))
412
- .join("\n");
413
- emit.text(selected.endsWith("\n") ? selected : `${selected}\n`);
412
+ emit.text(`${result.lines.slice(-lines).join("\n")}\n`);
413
+ if (result.truncated)
414
+ emit.log("governor service log read stopped at its bounded budget", "warn");
414
415
  });
415
416
  });
416
417
 
@@ -922,7 +923,7 @@ function delay(ms: number): Promise<void> {
922
923
  }
923
924
 
924
925
  function withGovernorRoot(emit: EmitContext, fn: (coordRoot: string) => void): void {
925
- const coordRoot = findCoordRoot();
926
+ const coordRoot = resolveCoordRoot();
926
927
  if (!coordRoot) {
927
928
  emit.error({
928
929
  code: "no_coord_root",
@@ -943,7 +944,7 @@ async function withGovernorRootAsync(
943
944
  emit: EmitContext,
944
945
  fn: (coordRoot: string) => Promise<void>,
945
946
  ): Promise<void> {
946
- const coordRoot = findCoordRoot();
947
+ const coordRoot = resolveCoordRoot();
947
948
  if (!coordRoot) {
948
949
  emit.error({
949
950
  code: "no_coord_root",
@@ -0,0 +1,61 @@
1
+ import type { Command } from "commander";
2
+ import type { EmitContext } from "../commander.ts";
3
+ import type { HarneryInboxService } from "../core/inbox/service.ts";
4
+
5
+ export function registerInboxCommand(
6
+ program: Command,
7
+ emit: EmitContext,
8
+ service?: HarneryInboxService,
9
+ ): void {
10
+ const inbox = program.command("inbox").description("Inspect private coordination inbox state");
11
+ inbox
12
+ .command("list <recipient>")
13
+ .option("--json", "Emit stable JSON")
14
+ .action((recipient: string, options: { json?: boolean }) => {
15
+ run(emit, () => {
16
+ const rows = requireInboxService(service)
17
+ .pending(recipient)
18
+ .map((record) => ({
19
+ message_id: record.message_id,
20
+ sender_instance_id: record.sender_instance_id,
21
+ sender_display_name: record.sender_display_name,
22
+ created_at: record.created_at,
23
+ body_bytes: record.body_bytes,
24
+ body: record.body,
25
+ }));
26
+ if (options.json) {
27
+ emit.config({ format: "json" });
28
+ emit.data({ schema: "harnery.inbox-list/v1", recipient_instance_id: recipient, rows });
29
+ } else emit.rows(rows);
30
+ });
31
+ });
32
+ inbox
33
+ .command("status <recipient>")
34
+ .option("--json", "Emit stable JSON")
35
+ .action((recipient: string, options: { json?: boolean }) => {
36
+ run(emit, () => {
37
+ const status = requireInboxService(service).status(recipient);
38
+ if (options.json) {
39
+ emit.config({ format: "json" });
40
+ emit.data(status);
41
+ } else emit.rows([status as unknown as Record<string, unknown>]);
42
+ });
43
+ });
44
+ }
45
+
46
+ function requireInboxService(service?: HarneryInboxService): HarneryInboxService {
47
+ if (!service) throw new Error("coordination inbox is not configured by this host");
48
+ return service;
49
+ }
50
+
51
+ function run(emit: EmitContext, action: () => void): void {
52
+ try {
53
+ action();
54
+ } catch (error) {
55
+ emit.error({
56
+ code: "inbox_failed",
57
+ message: error instanceof Error ? error.message : String(error),
58
+ });
59
+ emit.setExitCode(1);
60
+ }
61
+ }
@@ -33,7 +33,6 @@ import {
33
33
  readEventV3ControlState,
34
34
  sha256V3,
35
35
  } from "../core/events/v3/index.ts";
36
- import { liveEventV3BuildId } from "../core/events/v3/live-routing.ts";
37
36
  import { ADAPTER_SPECS, type AdapterId, type AdapterSpec } from "../core/hooks/adapter/events.ts";
38
37
  import {
39
38
  agentHookPathForProject,
@@ -46,6 +45,7 @@ import {
46
45
  makeEntry,
47
46
  type SettingsFile,
48
47
  } from "../core/hooks/adapter/wiring.ts";
48
+ import { applyIndexerExclusions } from "../lib/indexer-exclusions.ts";
49
49
  import {
50
50
  type ApplyResult,
51
51
  applyInstructions,
@@ -61,6 +61,7 @@ interface InitOpts {
61
61
  adapter: string;
62
62
  dryRun?: boolean;
63
63
  check?: boolean;
64
+ instructionsOnly?: boolean;
64
65
  projectRoot?: string;
65
66
  }
66
67
 
@@ -75,7 +76,11 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
75
76
  )
76
77
  .option("--adapter <id>", "claude-code | cursor | codex", "claude-code")
77
78
  .option("--dry-run", "Show what would change without writing")
78
- .option("--check", "Report instructions/skills drift without writing; exit 0/2/1")
79
+ .option("--check", "Report managed-surface drift without writing; exit 0/2/1")
80
+ .option(
81
+ "--instructions-only",
82
+ "Refresh only AGENTS.md regions and Harnery-owned skills; leave runtime wiring untouched",
83
+ )
79
84
  .option("--project-root <path>", "Project root (default: git toplevel, else cwd)")
80
85
  .action((opts: InitOpts) => {
81
86
  const adapter = opts.adapter as AdapterId;
@@ -94,6 +99,44 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
94
99
  // CLI re-stamps the host's name into committed agent-facing surfaces.
95
100
  const bin = pinnedBinName(projectRoot) ?? (binName?.trim() ? binName : DEFAULT_BIN_NAME);
96
101
 
102
+ // ── --instructions-only: committed guidance, never runtime wiring ────
103
+ // Some hosts consume Harnery's managed instruction bundle without
104
+ // enabling local adapter hooks or an event ledger. Keep this branch
105
+ // before every coord-root, config, ledger, adapter-settings, and Git-hook
106
+ // operation so its no-runtime-writes contract is structural.
107
+ if (opts.instructionsOnly === true) {
108
+ if (opts.check === true) {
109
+ const { status, issues } = checkInstructions(projectRoot, { binName: bin, adapter });
110
+ const head =
111
+ status === "fresh"
112
+ ? `${bin} init --instructions-only --check: instructions + skills are current`
113
+ : status === "drift"
114
+ ? `${bin} init --instructions-only --check: drift found (re-run \`init --instructions-only\` to refresh)`
115
+ : `${bin} init --instructions-only --check: error`;
116
+ const lines = issues.length
117
+ ? `\n${issues.map((issue) => ` ✗ ${issue}`).join("\n")}`
118
+ : "";
119
+ emit.text(`${head}${lines}`);
120
+ emit.setExitCode(status === "fresh" ? 0 : status === "drift" ? 2 : 1);
121
+ return;
122
+ }
123
+
124
+ const dryRun = opts.dryRun === true;
125
+ let applied: ApplyResult;
126
+ try {
127
+ applied = applyInstructions(projectRoot, { binName: bin, adapter, dryRun });
128
+ } catch (err) {
129
+ if (!(err instanceof HostAddendumError)) throw err;
130
+ emit.text(`${bin} init --instructions-only: ${err.message}`);
131
+ emit.setExitCode(1);
132
+ return;
133
+ }
134
+ emit.text(
135
+ renderInstructionsOnly(projectRoot, bin, dryRun, applied.actions, applied.warnings),
136
+ );
137
+ return;
138
+ }
139
+
97
140
  // ── --check: read-only drift report on every init-managed surface ─────
98
141
  if (opts.check === true) {
99
142
  const { status, issues } = checkInstructions(projectRoot, { binName: bin, adapter });
@@ -158,7 +201,7 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
158
201
  if (gitHooks.status !== "fresh") issues.push(...gitHooks.issues);
159
202
  const ledger = readEventV3ControlState(projectRoot);
160
203
  if (ledger.state !== "active") issues.push(`event ledger V3 is ${ledger.state}`);
161
- const ledgerRuntimeIssues = eventLedgerV3RuntimeIssues(ledger, gitBuild(HARNERY_ROOT));
204
+ const ledgerRuntimeIssues = eventLedgerV3RuntimeIssues(ledger);
162
205
  if (ledgerRuntimeIssues.length > 0) {
163
206
  issues.push(`event ledger V3 is runtime-stale (${ledgerRuntimeIssues.join(", ")})`);
164
207
  }
@@ -199,6 +242,13 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
199
242
  actions.push("+ created .harnery/ (+ .harnery/.gitignore)");
200
243
  }
201
244
 
245
+ // ── 1a′. editor indexer exclusions ─────────────────────────────────────
246
+ // .harnery/.gitignore keeps git-aware tools out, but Cursor's codebase
247
+ // indexer and the VS Code/Cursor file watcher do not respect gitignore.
248
+ // A busy coord root holds enough ledger events and artifacts to become a
249
+ // boot-time indexing storm, so exclude it from both here.
250
+ actions.push(...applyIndexerExclusions(projectRoot, dryRun));
251
+
202
252
  // ── 1b. stamp the host bin name ────────────────────────────────────────
203
253
  // The coord binaries (agent-hook/agent-coord) and web UI run as harnery
204
254
  // itself, so they can't see a consumer CLI's name; they read it back from
@@ -225,7 +275,7 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
225
275
  // ── 1d. universal V3 event ledger ────────────────────────────────────
226
276
  if (dryRun) {
227
277
  const ledger = readEventV3ControlState(projectRoot);
228
- const runtimeIssues = eventLedgerV3RuntimeIssues(ledger, gitBuild(HARNERY_ROOT));
278
+ const runtimeIssues = eventLedgerV3RuntimeIssues(ledger);
229
279
  actions.push(
230
280
  ledger.state === "active" && runtimeIssues.length === 0
231
281
  ? "· event ledger V3 is active"
@@ -236,7 +286,7 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
236
286
  } else {
237
287
  const harneryBuild = gitBuild(HARNERY_ROOT);
238
288
  const ledgerBefore = readEventV3ControlState(projectRoot);
239
- const runtimeIssues = eventLedgerV3RuntimeIssues(ledgerBefore, harneryBuild);
289
+ const runtimeIssues = eventLedgerV3RuntimeIssues(ledgerBefore);
240
290
  const initialized = initializeEventLedgerV3({
241
291
  coordRoot: projectRoot,
242
292
  harneryBuild,
@@ -337,23 +387,16 @@ function digestConfig(path: string): `sha256:${string}` {
337
387
  }
338
388
 
339
389
  /**
340
- * Runtime gates bound into an immutable V3 epoch. `init` is the explicit
341
- * upgrade boundary: when code or capability profiles change, it archives the
342
- * old epoch intact and activates a compatible one instead of letting upgraded
343
- * hooks fail closed against stale approvals.
390
+ * Runtime contracts bound into an immutable V3 epoch. `init` replaces the
391
+ * epoch only when the schema or adapter capability contract changed. A new
392
+ * Harnery build alone keeps the current epoch and its live session generations.
344
393
  */
345
- export function eventLedgerV3RuntimeIssues(
346
- control: EventV3ControlState,
347
- harneryBuild: string,
348
- ): string[] {
394
+ export function eventLedgerV3RuntimeIssues(control: EventV3ControlState): string[] {
349
395
  if (control.state !== "active") return [];
350
396
  const issues: string[] = [];
351
397
  const profile = control.genesis.profile;
352
398
  if (profile.initial_schema_digest !== EVENT_V3_SCHEMA_DIGEST) issues.push("schema digest");
353
399
  if (profile.contract_source_digest !== EVENT_V3_SCHEMA_DIGEST) issues.push("contract digest");
354
- if (!profile.producer_build_ids.includes(liveEventV3BuildId(harneryBuild))) {
355
- issues.push("producer build");
356
- }
357
400
  const expectedCapabilities = Object.values(ADAPTER_CAPABILITY_PROFILES_V3).map((value) =>
358
401
  sha256V3(canonicalJsonV3(value)),
359
402
  );
@@ -699,6 +742,25 @@ function render(
699
742
  return `${head}\n root: ${projectRoot}\n${actions.map((a) => ` ${a}`).join("\n")}${warnBlock}${tail}`;
700
743
  }
701
744
 
745
+ function renderInstructionsOnly(
746
+ projectRoot: string,
747
+ binName: string,
748
+ dryRun: boolean,
749
+ actions: string[],
750
+ warnings: string[] = [],
751
+ ): string {
752
+ const head = dryRun
753
+ ? `${binName} init --instructions-only (dry run): no changes written`
754
+ : `${binName} init --instructions-only`;
755
+ const warnBlock = warnings.length
756
+ ? `\n${warnings.map((warning) => ` ! ${warning}`).join("\n")}`
757
+ : "";
758
+ const tail = dryRun
759
+ ? "\nRe-run without --dry-run to apply."
760
+ : "\nDone. Adapter hooks, managed Git hooks, configuration, and event ledger state were left unchanged.";
761
+ return `${head}\n root: ${projectRoot}\n${actions.map((action) => ` ${action}`).join("\n")}${warnBlock}${tail}`;
762
+ }
763
+
702
764
  function gitTopLevel(): string | null {
703
765
  const r = spawnSync("git", ["rev-parse", "--show-toplevel"], { encoding: "utf8" });
704
766
  const out = r.status === 0 ? r.stdout.trim() : "";