harnery 0.34.1 → 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 (692) 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 -94
  4. package/dist/commands/agents.d.ts +37 -6
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +466 -371
  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 +31 -6
  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/decision.d.ts.map +1 -1
  18. package/dist/commands/decision.js +2 -2
  19. package/dist/commands/deinit.d.ts.map +1 -1
  20. package/dist/commands/deinit.js +5 -0
  21. package/dist/commands/docs.d.ts.map +1 -1
  22. package/dist/commands/docs.js +13 -2
  23. package/dist/commands/doctor.d.ts +5 -0
  24. package/dist/commands/doctor.d.ts.map +1 -1
  25. package/dist/commands/doctor.js +51 -7
  26. package/dist/commands/events.d.ts.map +1 -1
  27. package/dist/commands/events.js +18 -1
  28. package/dist/commands/fetch.js +6 -5
  29. package/dist/commands/files.d.ts +22 -0
  30. package/dist/commands/files.d.ts.map +1 -0
  31. package/dist/commands/files.js +113 -0
  32. package/dist/commands/governor.js +14 -12
  33. package/dist/commands/inbox.d.ts +5 -0
  34. package/dist/commands/inbox.d.ts.map +1 -0
  35. package/dist/commands/inbox.js +57 -0
  36. package/dist/commands/init.d.ts +4 -5
  37. package/dist/commands/init.d.ts.map +1 -1
  38. package/dist/commands/init.js +63 -13
  39. package/dist/commands/ledger-v3.d.ts.map +1 -1
  40. package/dist/commands/ledger-v3.js +347 -1
  41. package/dist/commands/logs.d.ts +4 -0
  42. package/dist/commands/logs.d.ts.map +1 -0
  43. package/dist/commands/logs.js +169 -0
  44. package/dist/commands/messages.d.ts +5 -0
  45. package/dist/commands/messages.d.ts.map +1 -0
  46. package/dist/commands/messages.js +45 -0
  47. package/dist/commands/outline.d.ts +1 -1
  48. package/dist/commands/outline.d.ts.map +1 -1
  49. package/dist/commands/outline.js +2 -2
  50. package/dist/commands/presence.d.ts.map +1 -1
  51. package/dist/commands/presence.js +2 -2
  52. package/dist/commands/read.d.ts +1 -1
  53. package/dist/commands/read.d.ts.map +1 -1
  54. package/dist/commands/read.js +2 -2
  55. package/dist/commands/semantic.d.ts +4 -0
  56. package/dist/commands/semantic.d.ts.map +1 -0
  57. package/dist/commands/semantic.js +199 -0
  58. package/dist/commands/storage.d.ts +4 -0
  59. package/dist/commands/storage.d.ts.map +1 -0
  60. package/dist/commands/storage.js +238 -0
  61. package/dist/commands/tunnel.d.ts +5 -1
  62. package/dist/commands/tunnel.d.ts.map +1 -1
  63. package/dist/commands/tunnel.js +44 -31
  64. package/dist/commands/web.d.ts +3 -0
  65. package/dist/commands/web.d.ts.map +1 -1
  66. package/dist/commands/web.js +84 -7
  67. package/dist/commands/work.js +3 -3
  68. package/dist/commands/workflow.js +13 -13
  69. package/dist/core/adapters/profiles.d.ts +1 -1
  70. package/dist/core/agents/canonical-emit.d.ts +3 -0
  71. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  72. package/dist/core/agents/canonical-emit.js +12 -0
  73. package/dist/core/agents/claim-path.d.ts +11 -0
  74. package/dist/core/agents/claim-path.d.ts.map +1 -0
  75. package/dist/core/agents/claim-path.js +22 -0
  76. package/dist/core/agents/cli.js +209 -39
  77. package/dist/core/agents/coord-client.d.ts +29 -3
  78. package/dist/core/agents/coord-client.d.ts.map +1 -1
  79. package/dist/core/agents/coord-client.js +88 -9
  80. package/dist/core/agents/live-authority-v3.d.ts +47 -1
  81. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  82. package/dist/core/agents/live-authority-v3.js +245 -13
  83. package/dist/core/agents/live-lifecycle-v3.js +9 -4
  84. package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
  85. package/dist/core/agents/live-observation-v3.js +8 -3
  86. package/dist/core/agents/render/prompt-context.d.ts +9 -3
  87. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  88. package/dist/core/agents/render/prompt-context.js +36 -17
  89. package/dist/core/agents/rules/stop-hook.d.ts +2 -0
  90. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  91. package/dist/core/agents/rules/stop-hook.js +115 -22
  92. package/dist/core/agents/rules/verdict.d.ts +1 -0
  93. package/dist/core/agents/rules/verdict.d.ts.map +1 -1
  94. package/dist/core/agents/session-events.d.ts.map +1 -1
  95. package/dist/core/agents/session-events.js +4 -0
  96. package/dist/core/agents/session-finalization-state-v3.js +1 -1
  97. package/dist/core/agents/session-finalizer-v3.js +5 -1
  98. package/dist/core/agents/session-name-display.d.ts +1 -0
  99. package/dist/core/agents/session-name-display.d.ts.map +1 -1
  100. package/dist/core/agents/session-name-display.js +8 -1
  101. package/dist/core/agents/state/activity-log.d.ts +3 -0
  102. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  103. package/dist/core/agents/state/activity-log.js +6 -3
  104. package/dist/core/agents/state/heartbeat-reader.d.ts +46 -0
  105. package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -0
  106. package/dist/core/agents/state/heartbeat-reader.js +25 -0
  107. package/dist/core/agents/state/heartbeat-writer.d.ts +9 -48
  108. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  109. package/dist/core/agents/state/heartbeat-writer.js +34 -34
  110. package/dist/core/agents/state/live-coordination-view.d.ts +6 -8
  111. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  112. package/dist/core/agents/state/live-coordination-view.js +16 -67
  113. package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
  114. package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
  115. package/dist/core/agents/state/live-coordination-writer.js +92 -0
  116. package/dist/core/agents/state/names.d.ts +9 -1
  117. package/dist/core/agents/state/names.d.ts.map +1 -1
  118. package/dist/core/agents/state/names.js +190 -182
  119. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  120. package/dist/core/agents/state/stale-sweep.js +23 -5
  121. package/dist/core/artifacts/constants.d.ts +5 -0
  122. package/dist/core/artifacts/constants.d.ts.map +1 -0
  123. package/dist/core/artifacts/constants.js +4 -0
  124. package/dist/core/artifacts/index.d.ts +24 -3
  125. package/dist/core/artifacts/index.d.ts.map +1 -1
  126. package/dist/core/artifacts/index.js +96 -8
  127. package/dist/core/config.d.ts +62 -4
  128. package/dist/core/config.d.ts.map +1 -1
  129. package/dist/core/config.js +98 -4
  130. package/dist/core/conversations/archive.d.ts +49 -0
  131. package/dist/core/conversations/archive.d.ts.map +1 -0
  132. package/dist/core/conversations/archive.js +136 -0
  133. package/dist/core/conversations/catalog.d.ts +10 -0
  134. package/dist/core/conversations/catalog.d.ts.map +1 -0
  135. package/dist/core/conversations/catalog.js +72 -0
  136. package/dist/core/conversations/context-pack.d.ts +6 -0
  137. package/dist/core/conversations/context-pack.d.ts.map +1 -0
  138. package/dist/core/conversations/context-pack.js +60 -0
  139. package/dist/core/conversations/contract.d.ts +155 -0
  140. package/dist/core/conversations/contract.d.ts.map +1 -0
  141. package/dist/core/conversations/contract.js +1 -0
  142. package/dist/core/conversations/evaluation.d.ts +16 -0
  143. package/dist/core/conversations/evaluation.d.ts.map +1 -0
  144. package/dist/core/conversations/evaluation.js +9 -0
  145. package/dist/core/conversations/index.d.ts +10 -0
  146. package/dist/core/conversations/index.d.ts.map +1 -0
  147. package/dist/core/conversations/index.js +9 -0
  148. package/dist/core/conversations/lifecycle.d.ts +28 -0
  149. package/dist/core/conversations/lifecycle.d.ts.map +1 -0
  150. package/dist/core/conversations/lifecycle.js +29 -0
  151. package/dist/core/conversations/normalize.d.ts +14 -0
  152. package/dist/core/conversations/normalize.d.ts.map +1 -0
  153. package/dist/core/conversations/normalize.js +82 -0
  154. package/dist/core/conversations/query.d.ts +8 -0
  155. package/dist/core/conversations/query.d.ts.map +1 -0
  156. package/dist/core/conversations/query.js +280 -0
  157. package/dist/core/conversations/search-index.d.ts +9 -0
  158. package/dist/core/conversations/search-index.d.ts.map +1 -0
  159. package/dist/core/conversations/search-index.js +29 -0
  160. package/dist/core/events/legacy-storage/canary.d.ts +18 -0
  161. package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
  162. package/dist/core/events/legacy-storage/canary.js +150 -0
  163. package/dist/core/events/legacy-storage/fence.d.ts +15 -0
  164. package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
  165. package/dist/core/events/legacy-storage/fence.js +115 -0
  166. package/dist/core/events/legacy-storage/index.d.ts +6 -0
  167. package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
  168. package/dist/core/events/legacy-storage/index.js +5 -0
  169. package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
  170. package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
  171. package/dist/core/events/legacy-storage/inventory.js +40 -0
  172. package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
  173. package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
  174. package/dist/core/events/legacy-storage/manifest.js +108 -0
  175. package/dist/core/events/legacy-storage/reader.d.ts +15 -0
  176. package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
  177. package/dist/core/events/legacy-storage/reader.js +154 -0
  178. package/dist/core/events/v3/authority-outbox.d.ts +7 -2
  179. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  180. package/dist/core/events/v3/authority-outbox.js +16 -3
  181. package/dist/core/events/v3/base-contract.d.ts +851 -16
  182. package/dist/core/events/v3/base-contract.d.ts.map +1 -1
  183. package/dist/core/events/v3/base-contract.js +50 -7
  184. package/dist/core/events/v3/bootstrap.d.ts +39 -0
  185. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  186. package/dist/core/events/v3/bootstrap.js +167 -3
  187. package/dist/core/events/v3/capabilities.d.ts +11 -0
  188. package/dist/core/events/v3/capabilities.d.ts.map +1 -1
  189. package/dist/core/events/v3/capabilities.js +26 -3
  190. package/dist/core/events/v3/control-witness.d.ts +44 -0
  191. package/dist/core/events/v3/control-witness.d.ts.map +1 -0
  192. package/dist/core/events/v3/control-witness.js +233 -0
  193. package/dist/core/events/v3/control-writer.d.ts +4 -0
  194. package/dist/core/events/v3/control-writer.d.ts.map +1 -0
  195. package/dist/core/events/v3/control-writer.js +16 -0
  196. package/dist/core/events/v3/control.d.ts +8 -2
  197. package/dist/core/events/v3/control.d.ts.map +1 -1
  198. package/dist/core/events/v3/control.js +46 -18
  199. package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
  200. package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
  201. package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
  202. package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
  203. package/dist/core/events/v3/coordination-view.js +16 -1
  204. package/dist/core/events/v3/generated.d.ts +1 -1
  205. package/dist/core/events/v3/generated.js +1 -1
  206. package/dist/core/events/v3/index.d.ts +8 -5
  207. package/dist/core/events/v3/index.d.ts.map +1 -1
  208. package/dist/core/events/v3/index.js +7 -4
  209. package/dist/core/events/v3/latency.d.ts +31 -1
  210. package/dist/core/events/v3/latency.d.ts.map +1 -1
  211. package/dist/core/events/v3/latency.js +127 -3
  212. package/dist/core/events/v3/live-route-observer.d.ts +31 -0
  213. package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
  214. package/dist/core/events/v3/live-route-observer.js +58 -0
  215. package/dist/core/events/v3/live-routing.d.ts +42 -20
  216. package/dist/core/events/v3/live-routing.d.ts.map +1 -1
  217. package/dist/core/events/v3/live-routing.js +153 -41
  218. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
  219. package/dist/core/events/v3/producers/command-recorder.js +10 -1
  220. package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
  221. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  222. package/dist/core/events/v3/producers/coordination-recorder.js +90 -13
  223. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
  224. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
  226. package/dist/core/events/v3/producers/hook-base.d.ts +17 -1
  227. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
  228. package/dist/core/events/v3/producers/hook-base.js +83 -2
  229. package/dist/core/events/v3/producers/intake.d.ts +13 -0
  230. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  231. package/dist/core/events/v3/producers/intake.js +36 -2
  232. package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
  233. package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
  234. package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
  235. package/dist/core/events/v3/producers/recorder.d.ts +117 -1
  236. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  237. package/dist/core/events/v3/producers/recorder.js +992 -27
  238. package/dist/core/events/v3/reader.d.ts +51 -0
  239. package/dist/core/events/v3/reader.d.ts.map +1 -1
  240. package/dist/core/events/v3/reader.js +181 -1
  241. package/dist/core/events/v3/rotation-config.d.ts +9 -0
  242. package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
  243. package/dist/core/events/v3/rotation-config.js +91 -0
  244. package/dist/core/events/v3/runtime-build.d.ts +11 -0
  245. package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
  246. package/dist/core/events/v3/runtime-build.js +39 -0
  247. package/dist/core/events/v3/runtime-identity.d.ts +5 -0
  248. package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
  249. package/dist/core/events/v3/runtime-identity.js +18 -0
  250. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +52 -0
  251. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -0
  252. package/dist/core/events/v3/runtime-telemetry-capabilities.js +54 -0
  253. package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
  254. package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
  255. package/dist/core/events/v3/support-storage/classify.js +149 -0
  256. package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
  257. package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
  258. package/dist/core/events/v3/support-storage/eligibility.js +35 -0
  259. package/dist/core/events/v3/support-storage/index.d.ts +10 -0
  260. package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
  261. package/dist/core/events/v3/support-storage/index.js +9 -0
  262. package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
  263. package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
  264. package/dist/core/events/v3/support-storage/inventory.js +94 -0
  265. package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
  266. package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
  267. package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
  268. package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
  269. package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
  270. package/dist/core/events/v3/support-storage/maintenance.js +352 -0
  271. package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
  272. package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
  273. package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
  274. package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
  275. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
  276. package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
  277. package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
  278. package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
  279. package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
  280. package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
  281. package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
  282. package/dist/core/events/v3/support-storage/recovery.js +22 -0
  283. package/dist/core/events/v3/turn-telemetry.d.ts +21 -6
  284. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
  285. package/dist/core/events/v3/turn-telemetry.js +32 -2
  286. package/dist/core/events/v3/writer.d.ts +13 -1
  287. package/dist/core/events/v3/writer.d.ts.map +1 -1
  288. package/dist/core/events/v3/writer.js +126 -12
  289. package/dist/core/governor/plan-read.d.ts.map +1 -1
  290. package/dist/core/governor/plan-read.js +5 -21
  291. package/dist/core/governor/planning.js +6 -8
  292. package/dist/core/governor/service-read.d.ts +12 -0
  293. package/dist/core/governor/service-read.d.ts.map +1 -1
  294. package/dist/core/governor/service-read.js +266 -2
  295. package/dist/core/governor/service.d.ts +1 -0
  296. package/dist/core/governor/service.d.ts.map +1 -1
  297. package/dist/core/governor/service.js +53 -18
  298. package/dist/core/guard/evidence-v3.d.ts.map +1 -1
  299. package/dist/core/guard/evidence-v3.js +2 -0
  300. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  301. package/dist/core/hooks/adapter/events.js +1 -0
  302. package/dist/core/hooks/adapter/output.d.ts +4 -2
  303. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  304. package/dist/core/hooks/adapter/output.js +13 -5
  305. package/dist/core/hooks/adapter/parse.d.ts +3 -0
  306. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  307. package/dist/core/hooks/adapter/parse.js +14 -0
  308. package/dist/core/hooks/adapter/runtime-telemetry.d.ts +142 -0
  309. package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -0
  310. package/dist/core/hooks/adapter/runtime-telemetry.js +869 -0
  311. package/dist/core/hooks/cli.js +318 -61
  312. package/dist/core/hooks/effects/image-capture.d.ts +1 -1
  313. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  314. package/dist/core/hooks/effects/image-capture.js +4 -2
  315. package/dist/core/hooks/remediation-cap.d.ts +39 -0
  316. package/dist/core/hooks/remediation-cap.d.ts.map +1 -0
  317. package/dist/core/hooks/remediation-cap.js +63 -0
  318. package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
  319. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
  320. package/dist/core/hooks/resolve/coord-root.js +92 -11
  321. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  322. package/dist/core/hooks/resolve/owner.js +5 -0
  323. package/dist/core/hooks/resolve/transcript.d.ts +33 -9
  324. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  325. package/dist/core/hooks/resolve/transcript.js +33 -10
  326. package/dist/core/inbox/contract.d.ts +64 -0
  327. package/dist/core/inbox/contract.d.ts.map +1 -0
  328. package/dist/core/inbox/contract.js +13 -0
  329. package/dist/core/inbox/index.d.ts +5 -0
  330. package/dist/core/inbox/index.d.ts.map +1 -0
  331. package/dist/core/inbox/index.js +4 -0
  332. package/dist/core/inbox/lifecycle.d.ts +22 -0
  333. package/dist/core/inbox/lifecycle.d.ts.map +1 -0
  334. package/dist/core/inbox/lifecycle.js +41 -0
  335. package/dist/core/inbox/service.d.ts +36 -0
  336. package/dist/core/inbox/service.d.ts.map +1 -0
  337. package/dist/core/inbox/service.js +210 -0
  338. package/dist/core/inbox/watcher.d.ts +7 -0
  339. package/dist/core/inbox/watcher.d.ts.map +1 -0
  340. package/dist/core/inbox/watcher.js +26 -0
  341. package/dist/core/presence/codec-digest.d.ts.map +1 -1
  342. package/dist/core/presence/codec-digest.js +14 -3
  343. package/dist/core/presence/relay-client.d.ts +1 -0
  344. package/dist/core/presence/relay-client.d.ts.map +1 -1
  345. package/dist/core/presence/relay-client.js +52 -8
  346. package/dist/core/semantic/adapters.d.ts +37 -0
  347. package/dist/core/semantic/adapters.d.ts.map +1 -0
  348. package/dist/core/semantic/adapters.js +360 -0
  349. package/dist/core/semantic/contract.d.ts +1072 -0
  350. package/dist/core/semantic/contract.d.ts.map +1 -0
  351. package/dist/core/semantic/contract.js +331 -0
  352. package/dist/core/semantic/evidence.d.ts +11 -0
  353. package/dist/core/semantic/evidence.d.ts.map +1 -0
  354. package/dist/core/semantic/evidence.js +262 -0
  355. package/dist/core/semantic/index.d.ts +14 -0
  356. package/dist/core/semantic/index.d.ts.map +1 -0
  357. package/dist/core/semantic/index.js +13 -0
  358. package/dist/core/semantic/once.d.ts +38 -0
  359. package/dist/core/semantic/once.d.ts.map +1 -0
  360. package/dist/core/semantic/once.js +364 -0
  361. package/dist/core/semantic/prompt.d.ts +12 -0
  362. package/dist/core/semantic/prompt.d.ts.map +1 -0
  363. package/dist/core/semantic/prompt.js +83 -0
  364. package/dist/core/semantic/review.d.ts +144 -0
  365. package/dist/core/semantic/review.d.ts.map +1 -0
  366. package/dist/core/semantic/review.js +544 -0
  367. package/dist/core/semantic/routes.d.ts +10 -0
  368. package/dist/core/semantic/routes.d.ts.map +1 -0
  369. package/dist/core/semantic/routes.js +21 -0
  370. package/dist/core/semantic/scheduler.d.ts +27 -0
  371. package/dist/core/semantic/scheduler.d.ts.map +1 -0
  372. package/dist/core/semantic/scheduler.js +91 -0
  373. package/dist/core/semantic/service-status.d.ts +51 -0
  374. package/dist/core/semantic/service-status.d.ts.map +1 -0
  375. package/dist/core/semantic/service-status.js +140 -0
  376. package/dist/core/semantic/service.d.ts +52 -0
  377. package/dist/core/semantic/service.d.ts.map +1 -0
  378. package/dist/core/semantic/service.js +559 -0
  379. package/dist/core/semantic/soak.d.ts +75 -0
  380. package/dist/core/semantic/soak.d.ts.map +1 -0
  381. package/dist/core/semantic/soak.js +476 -0
  382. package/dist/core/semantic/storage.d.ts +81 -0
  383. package/dist/core/semantic/storage.d.ts.map +1 -0
  384. package/dist/core/semantic/storage.js +180 -0
  385. package/dist/core/semantic/usage.d.ts +43 -0
  386. package/dist/core/semantic/usage.d.ts.map +1 -0
  387. package/dist/core/semantic/usage.js +193 -0
  388. package/dist/core/semantic/validate.d.ts +18 -0
  389. package/dist/core/semantic/validate.d.ts.map +1 -0
  390. package/dist/core/semantic/validate.js +207 -0
  391. package/dist/core/storage/buffer.d.ts +28 -0
  392. package/dist/core/storage/buffer.d.ts.map +1 -0
  393. package/dist/core/storage/buffer.js +101 -0
  394. package/dist/core/storage/builtins.d.ts +3 -0
  395. package/dist/core/storage/builtins.d.ts.map +1 -0
  396. package/dist/core/storage/builtins.js +683 -0
  397. package/dist/core/storage/catalog.d.ts +19 -0
  398. package/dist/core/storage/catalog.d.ts.map +1 -0
  399. package/dist/core/storage/catalog.js +365 -0
  400. package/dist/core/storage/config.d.ts +16 -0
  401. package/dist/core/storage/config.d.ts.map +1 -0
  402. package/dist/core/storage/config.js +311 -0
  403. package/dist/core/storage/contract.d.ts +275 -0
  404. package/dist/core/storage/contract.d.ts.map +1 -0
  405. package/dist/core/storage/contract.js +3 -0
  406. package/dist/core/storage/durable-history.d.ts +36 -0
  407. package/dist/core/storage/durable-history.d.ts.map +1 -0
  408. package/dist/core/storage/durable-history.js +606 -0
  409. package/dist/core/storage/health.d.ts +4 -0
  410. package/dist/core/storage/health.d.ts.map +1 -0
  411. package/dist/core/storage/health.js +65 -0
  412. package/dist/core/storage/index.d.ts +16 -0
  413. package/dist/core/storage/index.d.ts.map +1 -0
  414. package/dist/core/storage/index.js +15 -0
  415. package/dist/core/storage/inventory.d.ts +25 -0
  416. package/dist/core/storage/inventory.d.ts.map +1 -0
  417. package/dist/core/storage/inventory.js +666 -0
  418. package/dist/core/storage/jsonl.d.ts +52 -0
  419. package/dist/core/storage/jsonl.d.ts.map +1 -0
  420. package/dist/core/storage/jsonl.js +156 -0
  421. package/dist/core/storage/log-retention.d.ts +52 -0
  422. package/dist/core/storage/log-retention.d.ts.map +1 -0
  423. package/dist/core/storage/log-retention.js +419 -0
  424. package/dist/core/storage/logger.d.ts +82 -0
  425. package/dist/core/storage/logger.d.ts.map +1 -0
  426. package/dist/core/storage/logger.js +411 -0
  427. package/dist/core/storage/maintenance-providers.d.ts +26 -0
  428. package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
  429. package/dist/core/storage/maintenance-providers.js +141 -0
  430. package/dist/core/storage/maintenance.d.ts +125 -0
  431. package/dist/core/storage/maintenance.d.ts.map +1 -0
  432. package/dist/core/storage/maintenance.js +609 -0
  433. package/dist/core/storage/metrics.d.ts +60 -0
  434. package/dist/core/storage/metrics.d.ts.map +1 -0
  435. package/dist/core/storage/metrics.js +134 -0
  436. package/dist/core/storage/policy.d.ts +7 -0
  437. package/dist/core/storage/policy.d.ts.map +1 -0
  438. package/dist/core/storage/policy.js +110 -0
  439. package/dist/core/storage/process-log.d.ts +38 -0
  440. package/dist/core/storage/process-log.d.ts.map +1 -0
  441. package/dist/core/storage/process-log.js +165 -0
  442. package/dist/core/storage/query.d.ts +34 -0
  443. package/dist/core/storage/query.d.ts.map +1 -0
  444. package/dist/core/storage/query.js +295 -0
  445. package/dist/core/storage/receipts.d.ts +23 -0
  446. package/dist/core/storage/receipts.d.ts.map +1 -0
  447. package/dist/core/storage/receipts.js +117 -0
  448. package/dist/core/storage/segments.d.ts +84 -0
  449. package/dist/core/storage/segments.d.ts.map +1 -0
  450. package/dist/core/storage/segments.js +542 -0
  451. package/dist/core/storage/sink-graph.d.ts +65 -0
  452. package/dist/core/storage/sink-graph.d.ts.map +1 -0
  453. package/dist/core/storage/sink-graph.js +213 -0
  454. package/dist/core/storage/storm-control.d.ts +23 -0
  455. package/dist/core/storage/storm-control.d.ts.map +1 -0
  456. package/dist/core/storage/storm-control.js +59 -0
  457. package/dist/core/work/state.d.ts.map +1 -1
  458. package/dist/core/work/state.js +10 -14
  459. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  460. package/dist/core/workflow/live-session-v3.js +2 -1
  461. package/dist/index.d.ts +2 -0
  462. package/dist/index.d.ts.map +1 -1
  463. package/dist/index.js +2 -0
  464. package/dist/lazy-commands.d.ts +26 -0
  465. package/dist/lazy-commands.d.ts.map +1 -0
  466. package/dist/lazy-commands.js +210 -0
  467. package/dist/lib/browser/client.d.ts +11 -0
  468. package/dist/lib/browser/client.d.ts.map +1 -1
  469. package/dist/lib/browser/client.js +13 -0
  470. package/dist/lib/browser/index.d.ts +1 -0
  471. package/dist/lib/browser/index.d.ts.map +1 -1
  472. package/dist/lib/browser/standalone-html.d.ts +25 -0
  473. package/dist/lib/browser/standalone-html.d.ts.map +1 -0
  474. package/dist/lib/browser/standalone-html.js +284 -0
  475. package/dist/lib/docs-lint.d.ts +2 -0
  476. package/dist/lib/docs-lint.d.ts.map +1 -1
  477. package/dist/lib/docs-lint.js +45 -80
  478. package/dist/lib/docs-metadata-audit.d.ts +3 -0
  479. package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
  480. package/dist/lib/docs-metadata-audit.js +13 -23
  481. package/dist/lib/docs-metadata-sync.d.ts +1 -0
  482. package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
  483. package/dist/lib/docs-metadata-sync.js +28 -10
  484. package/dist/lib/docs-repository-view.d.ts +22 -0
  485. package/dist/lib/docs-repository-view.d.ts.map +1 -0
  486. package/dist/lib/docs-repository-view.js +185 -0
  487. package/dist/lib/http/client.d.ts +11 -5
  488. package/dist/lib/http/client.d.ts.map +1 -1
  489. package/dist/lib/http/client.js +22 -4
  490. package/dist/lib/http/index.d.ts +1 -1
  491. package/dist/lib/http/index.d.ts.map +1 -1
  492. package/dist/lib/http/index.js +1 -1
  493. package/dist/lib/indexer-exclusions.d.ts +27 -0
  494. package/dist/lib/indexer-exclusions.d.ts.map +1 -0
  495. package/dist/lib/indexer-exclusions.js +176 -0
  496. package/dist/lib/instructions/apply.d.ts.map +1 -1
  497. package/dist/lib/instructions/apply.js +1 -0
  498. package/dist/lib/instructions/templates.d.ts +2 -0
  499. package/dist/lib/instructions/templates.d.ts.map +1 -1
  500. package/dist/lib/instructions/templates.js +149 -4
  501. package/dist/lib/local-file-url.d.ts +9 -0
  502. package/dist/lib/local-file-url.d.ts.map +1 -0
  503. package/dist/lib/local-file-url.js +20 -0
  504. package/dist/lib/web-performance.d.ts +118 -0
  505. package/dist/lib/web-performance.d.ts.map +1 -0
  506. package/dist/lib/web-performance.js +192 -0
  507. package/package.json +34 -2
  508. package/schemas/config.schema.json +58 -0
  509. package/schemas/event-v3.schema.json +3073 -581
  510. package/src/commander.ts +462 -93
  511. package/src/commands/agents.ts +617 -355
  512. package/src/commands/backup.ts +18 -14
  513. package/src/commands/browse-session.ts +12 -0
  514. package/src/commands/browse.ts +31 -9
  515. package/src/commands/conversations.ts +279 -0
  516. package/src/commands/decision.ts +8 -2
  517. package/src/commands/deinit.ts +6 -0
  518. package/src/commands/docs.ts +25 -6
  519. package/src/commands/doctor.ts +75 -9
  520. package/src/commands/events.ts +21 -1
  521. package/src/commands/fetch.ts +7 -6
  522. package/src/commands/files.ts +143 -0
  523. package/src/commands/governor.ts +13 -12
  524. package/src/commands/inbox.ts +61 -0
  525. package/src/commands/init.ts +78 -16
  526. package/src/commands/ledger-v3.ts +421 -1
  527. package/src/commands/logs.ts +224 -0
  528. package/src/commands/messages.ts +61 -0
  529. package/src/commands/outline.ts +6 -2
  530. package/src/commands/presence.ts +7 -2
  531. package/src/commands/read.ts +6 -2
  532. package/src/commands/semantic.ts +244 -0
  533. package/src/commands/storage.ts +310 -0
  534. package/src/commands/tunnel.ts +66 -52
  535. package/src/commands/web.ts +92 -7
  536. package/src/commands/work.ts +3 -3
  537. package/src/commands/workflow.ts +13 -13
  538. package/src/core/agents/canonical-emit.ts +15 -0
  539. package/src/core/agents/claim-path.ts +23 -0
  540. package/src/core/agents/cli.ts +259 -53
  541. package/src/core/agents/coord-client.ts +92 -8
  542. package/src/core/agents/live-authority-v3.ts +342 -14
  543. package/src/core/agents/live-lifecycle-v3.ts +14 -4
  544. package/src/core/agents/live-observation-v3.ts +13 -3
  545. package/src/core/agents/render/prompt-context.ts +40 -16
  546. package/src/core/agents/rules/stop-hook.ts +129 -25
  547. package/src/core/agents/rules/verdict.ts +1 -0
  548. package/src/core/agents/session-events.ts +4 -0
  549. package/src/core/agents/session-finalization-state-v3.ts +1 -1
  550. package/src/core/agents/session-finalizer-v3.ts +4 -1
  551. package/src/core/agents/session-name-display.ts +9 -1
  552. package/src/core/agents/state/activity-log.ts +7 -2
  553. package/src/core/agents/state/heartbeat-reader.ts +69 -0
  554. package/src/core/agents/state/heartbeat-writer.ts +47 -84
  555. package/src/core/agents/state/live-coordination-view.ts +17 -81
  556. package/src/core/agents/state/live-coordination-writer.ts +141 -0
  557. package/src/core/agents/state/names.ts +190 -182
  558. package/src/core/agents/state/stale-sweep.ts +25 -5
  559. package/src/core/artifacts/constants.ts +4 -0
  560. package/src/core/artifacts/index.ts +113 -8
  561. package/src/core/config.ts +126 -5
  562. package/src/core/conversations/archive.ts +237 -0
  563. package/src/core/conversations/catalog.ts +79 -0
  564. package/src/core/conversations/context-pack.ts +72 -0
  565. package/src/core/conversations/contract.ts +178 -0
  566. package/src/core/conversations/evaluation.ts +30 -0
  567. package/src/core/conversations/index.ts +9 -0
  568. package/src/core/conversations/lifecycle.ts +63 -0
  569. package/src/core/conversations/normalize.ts +105 -0
  570. package/src/core/conversations/query.ts +318 -0
  571. package/src/core/conversations/search-index.ts +48 -0
  572. package/src/core/events/legacy-storage/canary.ts +177 -0
  573. package/src/core/events/legacy-storage/fence.ts +129 -0
  574. package/src/core/events/legacy-storage/index.ts +5 -0
  575. package/src/core/events/legacy-storage/inventory.ts +51 -0
  576. package/src/core/events/legacy-storage/manifest.ts +136 -0
  577. package/src/core/events/legacy-storage/reader.ts +178 -0
  578. package/src/core/events/v3/authority-outbox.ts +22 -1
  579. package/src/core/events/v3/base-contract.ts +56 -7
  580. package/src/core/events/v3/bootstrap.ts +195 -2
  581. package/src/core/events/v3/capabilities.ts +37 -3
  582. package/src/core/events/v3/control-witness.ts +339 -0
  583. package/src/core/events/v3/control-writer.ts +16 -0
  584. package/src/core/events/v3/control.ts +54 -18
  585. package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
  586. package/src/core/events/v3/coordination-view.ts +17 -1
  587. package/src/core/events/v3/generated.ts +1 -1
  588. package/src/core/events/v3/index.ts +26 -2
  589. package/src/core/events/v3/latency.ts +213 -2
  590. package/src/core/events/v3/live-route-observer.ts +80 -0
  591. package/src/core/events/v3/live-routing.ts +182 -45
  592. package/src/core/events/v3/producers/command-recorder.ts +10 -1
  593. package/src/core/events/v3/producers/coordination-recorder.ts +112 -15
  594. package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
  595. package/src/core/events/v3/producers/hook-base.ts +116 -2
  596. package/src/core/events/v3/producers/intake.ts +48 -2
  597. package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
  598. package/src/core/events/v3/producers/recorder.ts +1403 -30
  599. package/src/core/events/v3/reader.ts +243 -2
  600. package/src/core/events/v3/rotation-config.ts +98 -0
  601. package/src/core/events/v3/runtime-build.ts +41 -0
  602. package/src/core/events/v3/runtime-identity.ts +16 -0
  603. package/src/core/events/v3/runtime-telemetry-capabilities.ts +143 -0
  604. package/src/core/events/v3/support-storage/classify.ts +209 -0
  605. package/src/core/events/v3/support-storage/eligibility.ts +58 -0
  606. package/src/core/events/v3/support-storage/index.ts +9 -0
  607. package/src/core/events/v3/support-storage/inventory.ts +135 -0
  608. package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
  609. package/src/core/events/v3/support-storage/maintenance.ts +501 -0
  610. package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
  611. package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
  612. package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
  613. package/src/core/events/v3/support-storage/recovery.ts +43 -0
  614. package/src/core/events/v3/turn-telemetry.ts +66 -5
  615. package/src/core/events/v3/writer.ts +168 -16
  616. package/src/core/governor/plan-read.ts +5 -18
  617. package/src/core/governor/planning.ts +5 -8
  618. package/src/core/governor/service-read.ts +320 -2
  619. package/src/core/governor/service.ts +49 -22
  620. package/src/core/guard/evidence-v3.ts +1 -0
  621. package/src/core/hooks/adapter/events.ts +1 -0
  622. package/src/core/hooks/adapter/output.ts +12 -5
  623. package/src/core/hooks/adapter/parse.ts +16 -0
  624. package/src/core/hooks/adapter/runtime-telemetry.ts +1200 -0
  625. package/src/core/hooks/cli.ts +342 -64
  626. package/src/core/hooks/effects/image-capture.ts +4 -1
  627. package/src/core/hooks/remediation-cap.ts +83 -0
  628. package/src/core/hooks/resolve/coord-root.ts +91 -11
  629. package/src/core/hooks/resolve/owner.ts +4 -0
  630. package/src/core/hooks/resolve/transcript.ts +55 -11
  631. package/src/core/inbox/contract.ts +81 -0
  632. package/src/core/inbox/index.ts +4 -0
  633. package/src/core/inbox/lifecycle.ts +104 -0
  634. package/src/core/inbox/service.ts +305 -0
  635. package/src/core/inbox/watcher.ts +36 -0
  636. package/src/core/presence/codec-digest.ts +15 -9
  637. package/src/core/presence/relay-client.ts +55 -7
  638. package/src/core/semantic/adapters.ts +452 -0
  639. package/src/core/semantic/contract.ts +430 -0
  640. package/src/core/semantic/evidence.ts +336 -0
  641. package/src/core/semantic/index.ts +201 -0
  642. package/src/core/semantic/once.ts +496 -0
  643. package/src/core/semantic/prompt.ts +96 -0
  644. package/src/core/semantic/review.ts +803 -0
  645. package/src/core/semantic/routes.ts +30 -0
  646. package/src/core/semantic/scheduler.ts +151 -0
  647. package/src/core/semantic/service-status.ts +212 -0
  648. package/src/core/semantic/service.ts +681 -0
  649. package/src/core/semantic/soak.ts +638 -0
  650. package/src/core/semantic/storage.ts +300 -0
  651. package/src/core/semantic/usage.ts +272 -0
  652. package/src/core/semantic/validate.ts +243 -0
  653. package/src/core/storage/buffer.ts +124 -0
  654. package/src/core/storage/builtins.ts +916 -0
  655. package/src/core/storage/catalog.ts +467 -0
  656. package/src/core/storage/config.ts +423 -0
  657. package/src/core/storage/contract.ts +342 -0
  658. package/src/core/storage/durable-history.ts +738 -0
  659. package/src/core/storage/health.ts +76 -0
  660. package/src/core/storage/index.ts +15 -0
  661. package/src/core/storage/inventory.ts +859 -0
  662. package/src/core/storage/jsonl.ts +213 -0
  663. package/src/core/storage/log-retention.ts +555 -0
  664. package/src/core/storage/logger.ts +546 -0
  665. package/src/core/storage/maintenance-providers.ts +200 -0
  666. package/src/core/storage/maintenance.ts +929 -0
  667. package/src/core/storage/metrics.ts +199 -0
  668. package/src/core/storage/policy.ts +141 -0
  669. package/src/core/storage/process-log.ts +203 -0
  670. package/src/core/storage/query.ts +360 -0
  671. package/src/core/storage/receipts.ts +162 -0
  672. package/src/core/storage/segments.ts +721 -0
  673. package/src/core/storage/sink-graph.ts +343 -0
  674. package/src/core/storage/storm-control.ts +91 -0
  675. package/src/core/work/state.ts +12 -21
  676. package/src/core/workflow/live-session-v3.ts +2 -4
  677. package/src/index.ts +2 -0
  678. package/src/lazy-commands.ts +294 -0
  679. package/src/lib/browser/client.ts +21 -0
  680. package/src/lib/browser/index.ts +4 -0
  681. package/src/lib/browser/standalone-html.ts +312 -0
  682. package/src/lib/docs-lint.ts +58 -77
  683. package/src/lib/docs-metadata-audit.ts +26 -21
  684. package/src/lib/docs-metadata-sync.ts +32 -9
  685. package/src/lib/docs-repository-view.ts +220 -0
  686. package/src/lib/http/client.ts +44 -8
  687. package/src/lib/http/index.ts +6 -1
  688. package/src/lib/indexer-exclusions.ts +173 -0
  689. package/src/lib/instructions/apply.ts +1 -0
  690. package/src/lib/instructions/templates.ts +154 -4
  691. package/src/lib/local-file-url.ts +31 -0
  692. package/src/lib/web-performance.ts +335 -0
@@ -1,12 +1,13 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import type { Adapter } from "../adapter.ts";
3
3
  import type { AuthorityMutationV3 } from "../events/v3/authority-outbox.ts";
4
- import { canonicalJsonV3, sha256V3 } from "../events/v3/canonical.ts";
5
- import type { EventV3WriteMode } from "../events/v3/control.ts";
4
+ import { canonicalJsonV3, normalizeNativeIdV3, sha256V3 } from "../events/v3/canonical.ts";
5
+ import { type EventV3WriteMode, readEventV3ControlState } from "../events/v3/control.ts";
6
6
  import {
7
7
  readCoordinationViewV3,
8
8
  requireAuthoritySafeCoordinationViewV3,
9
9
  } from "../events/v3/coordination-view.ts";
10
+ import { fingerprintContextV3 } from "../events/v3/fingerprint-keys.ts";
10
11
  import {
11
12
  LIVE_HOOK_V3_PRODUCER_ID,
12
13
  liveInstanceIdV3,
@@ -22,9 +23,13 @@ import {
22
23
  recordCoordinationAuthorityV3,
23
24
  } from "../events/v3/producers/coordination-recorder.ts";
24
25
  import {
26
+ type HookProducerStateV3,
27
+ listHookProducerStateRecordsV3,
28
+ readHookProducerStateV3,
25
29
  readTerminalHookProducerStateV3,
26
30
  recordHookSignalV3,
27
31
  } from "../events/v3/producers/recorder.ts";
32
+ import { canonicalClaimPath } from "./claim-path.ts";
28
33
  import {
29
34
  acquireClaim,
30
35
  type Heartbeat,
@@ -35,9 +40,10 @@ import {
35
40
  setTask,
36
41
  } from "./state/heartbeat-writer.ts";
37
42
  import {
38
- ensureLiveCoordinationHeartbeat,
39
43
  liveCoordinationAdapterV3,
44
+ readLiveCoordinationRow,
40
45
  } from "./state/live-coordination-view.ts";
46
+ import { ensureLiveCoordinationHeartbeat } from "./state/live-coordination-writer.ts";
41
47
  import { recordNameAssumption } from "./state/names.ts";
42
48
 
43
49
  export const LIVE_COORDINATION_V3_PRODUCER_ID = "prd_agent-coord" as const;
@@ -60,6 +66,20 @@ export interface ReopenedLiveCoordinationGenerationV3 {
60
66
  generation_id: `gen_${string}`;
61
67
  }
62
68
 
69
+ export interface BootstrappedLiveCoordinationAuthorityV3 {
70
+ state: "created" | "reused";
71
+ adapter: Adapter;
72
+ generation_id: `gen_${string}`;
73
+ heartbeat: Heartbeat;
74
+ }
75
+
76
+ export interface RestoredLiveCoordinationStateV3 {
77
+ state: "unchanged" | "restored";
78
+ task: boolean;
79
+ claims: number;
80
+ lifecycle: boolean;
81
+ }
82
+
63
83
  interface LiveAuthorityBaseV3 {
64
84
  coordRoot: string;
65
85
  owner: string;
@@ -69,6 +89,315 @@ interface LiveAuthorityBaseV3 {
69
89
  observationId?: string;
70
90
  }
71
91
 
92
+ /**
93
+ * Establish the missing generation authority for one adapter-native session,
94
+ * then reconstruct its disposable heartbeat cache.
95
+ *
96
+ * This is intentionally narrower than mid-flight hook onboarding. The caller
97
+ * must supply an already validated native session, adapter, and current
98
+ * instance identity. Existing authority is reused only when all three bind to
99
+ * the same non-terminal producer generation. A terminal generation, an
100
+ * adapter/session collision, or any disagreement between private producer
101
+ * control and the public projection fails closed. No turn is synthesized.
102
+ */
103
+ export function bootstrapLiveCoordinationAuthorityV3(input: {
104
+ coordRoot: string;
105
+ owner: string;
106
+ nativeSessionId: string;
107
+ adapter: Adapter;
108
+ }): BootstrappedLiveCoordinationAuthorityV3 {
109
+ if (!/^[a-zA-Z0-9._-]{1,128}$/.test(input.owner)) {
110
+ throw new LiveCoordinationAuthorityV3Error("invalid_instance_identity");
111
+ }
112
+ if (
113
+ input.nativeSessionId.length === 0 ||
114
+ input.nativeSessionId.length > 512 ||
115
+ input.nativeSessionId.includes("\0")
116
+ ) {
117
+ throw new LiveCoordinationAuthorityV3Error("invalid_native_session_identity");
118
+ }
119
+
120
+ const route = resolveLiveEventLedgerRouteV3(input.coordRoot);
121
+ if (route.state === "blocked") throw new LiveCoordinationAuthorityV3Error(route.reason);
122
+ const control = readEventV3ControlState(input.coordRoot);
123
+ if (control.state !== route.mode) {
124
+ throw new LiveCoordinationAuthorityV3Error("control_state_mismatch");
125
+ }
126
+
127
+ const instanceId = liveInstanceIdV3(input.owner);
128
+ const rootId = control.genesis.event.scope.root_id as `root_${string}`;
129
+ const context = fingerprintContextV3(
130
+ input.coordRoot,
131
+ rootId,
132
+ undefined,
133
+ control.genesis.profile.privacy_key_epoch,
134
+ );
135
+ const sessionId = `sid_${normalizeNativeIdV3(
136
+ context,
137
+ `${input.adapter}.session`,
138
+ input.nativeSessionId,
139
+ ).slice(4)}`;
140
+
141
+ const view = readAuthoritySafeViewForBootstrap(input.coordRoot);
142
+ const existing = view.instances[instanceId];
143
+ const sessionStates = readSessionProducerStatesForBootstrap(
144
+ input.coordRoot,
145
+ input.nativeSessionId,
146
+ );
147
+ const instanceStates = readInstanceProducerStatesForBootstrap(input.coordRoot, instanceId);
148
+
149
+ const crossAdapter = sessionStates.find((state) => state.adapter !== input.adapter);
150
+ if (crossAdapter) {
151
+ throw new LiveCoordinationAuthorityV3Error("cross_adapter_identity");
152
+ }
153
+ const crossInstance = sessionStates.find((state) => state.instance_id !== instanceId);
154
+ if (crossInstance) {
155
+ throw new LiveCoordinationAuthorityV3Error("cross_instance_identity");
156
+ }
157
+
158
+ const direct = sessionStates.find((state) => state.adapter === input.adapter);
159
+ if (
160
+ direct?.terminal ||
161
+ (!existing && terminalGenerationForSession(view, instanceId, sessionId))
162
+ ) {
163
+ throw new LiveCoordinationAuthorityV3Error("terminal_generation_forbidden");
164
+ }
165
+
166
+ const liveInstanceStates = instanceStates.filter((state) => !state.terminal);
167
+ if (liveInstanceStates.length > 1 || sessionStates.length > 1) {
168
+ throw new LiveCoordinationAuthorityV3Error("generation_ambiguous");
169
+ }
170
+
171
+ if (existing) {
172
+ const observedAdapter = existing.runtime_attestation.adapter;
173
+ if (observedAdapter.state !== "observed" || observedAdapter.value.id !== input.adapter) {
174
+ throw new LiveCoordinationAuthorityV3Error("cross_adapter_identity");
175
+ }
176
+ if (existing.session_id !== sessionId) {
177
+ throw new LiveCoordinationAuthorityV3Error("cross_session_identity");
178
+ }
179
+ if (
180
+ !direct ||
181
+ direct.terminal ||
182
+ direct.generation_id !== existing.generation_id ||
183
+ liveInstanceStates.length !== 1 ||
184
+ liveInstanceStates[0]?.generation_id !== existing.generation_id
185
+ ) {
186
+ throw new LiveCoordinationAuthorityV3Error("generation_control_mismatch");
187
+ }
188
+ return materializeBootstrappedAuthority(input, existing.generation_id, "reused");
189
+ }
190
+
191
+ if (direct || liveInstanceStates.length > 0) {
192
+ throw new LiveCoordinationAuthorityV3Error("generation_control_mismatch");
193
+ }
194
+
195
+ const started = recordHookSignalV3({
196
+ coordRoot: input.coordRoot,
197
+ mode: route.mode,
198
+ signal: "session-start",
199
+ payload: { raw: {}, session_id: input.nativeSessionId },
200
+ adapter: input.adapter,
201
+ instance_id: instanceId,
202
+ producer_id: LIVE_HOOK_V3_PRODUCER_ID,
203
+ build_id: route.build_id,
204
+ platform: livePlatformV3(),
205
+ session_start_derivation: "validated_current_session_heal",
206
+ });
207
+ if (started.state !== "recorded" && started.state !== "already_started") {
208
+ const reason = "reason" in started ? `:${started.reason}` : "";
209
+ throw new LiveCoordinationAuthorityV3Error(
210
+ `generation_bootstrap_failed:${started.state}${reason}`,
211
+ );
212
+ }
213
+
214
+ const after = readAuthoritySafeViewForBootstrap(input.coordRoot).instances[instanceId];
215
+ const producer = readSessionProducerStatesForBootstrap(
216
+ input.coordRoot,
217
+ input.nativeSessionId,
218
+ ).filter((state) => state.adapter === input.adapter && state.instance_id === instanceId);
219
+ if (
220
+ !after ||
221
+ after.session_id !== sessionId ||
222
+ producer.length !== 1 ||
223
+ producer[0]?.terminal ||
224
+ producer[0]?.generation_id !== after.generation_id
225
+ ) {
226
+ throw new LiveCoordinationAuthorityV3Error("generation_control_mismatch");
227
+ }
228
+ return materializeBootstrappedAuthority(
229
+ input,
230
+ after.generation_id,
231
+ started.state === "recorded" ? "created" : "reused",
232
+ );
233
+ }
234
+
235
+ function readAuthoritySafeViewForBootstrap(coordRoot: string) {
236
+ try {
237
+ return requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
238
+ } catch (error) {
239
+ if (error instanceof LiveCoordinationAuthorityV3Error) throw error;
240
+ throw new LiveCoordinationAuthorityV3Error("coordination_view_unsafe");
241
+ }
242
+ }
243
+
244
+ function readSessionProducerStatesForBootstrap(
245
+ coordRoot: string,
246
+ nativeSessionId: string,
247
+ ): HookProducerStateV3[] {
248
+ try {
249
+ return (["claude-code", "codex", "cursor"] as const)
250
+ .map((adapter) => readHookProducerStateV3(coordRoot, adapter, nativeSessionId))
251
+ .filter((state): state is HookProducerStateV3 => state !== undefined);
252
+ } catch {
253
+ throw new LiveCoordinationAuthorityV3Error("producer_state_unsafe");
254
+ }
255
+ }
256
+
257
+ function readInstanceProducerStatesForBootstrap(
258
+ coordRoot: string,
259
+ instanceId: `inst_${string}`,
260
+ ): HookProducerStateV3[] {
261
+ try {
262
+ return listHookProducerStateRecordsV3(coordRoot, { includeTerminal: true })
263
+ .map((record) => record.state)
264
+ .filter((state) => state.instance_id === instanceId);
265
+ } catch {
266
+ throw new LiveCoordinationAuthorityV3Error("producer_state_unsafe");
267
+ }
268
+ }
269
+
270
+ function terminalGenerationForSession(
271
+ view: ReturnType<typeof readCoordinationViewV3>,
272
+ instanceId: `inst_${string}`,
273
+ sessionId: string,
274
+ ): boolean {
275
+ return Object.values(view.terminal_generations).some(
276
+ (generation) => generation.instance_id === instanceId && generation.session_id === sessionId,
277
+ );
278
+ }
279
+
280
+ function materializeBootstrappedAuthority(
281
+ input: { coordRoot: string; owner: string; nativeSessionId: string; adapter: Adapter },
282
+ generationId: string,
283
+ state: "created" | "reused",
284
+ ): BootstrappedLiveCoordinationAuthorityV3 {
285
+ const heartbeat = ensureLiveCoordinationHeartbeat(
286
+ input.coordRoot,
287
+ input.owner,
288
+ input.nativeSessionId,
289
+ input.adapter,
290
+ );
291
+ if (!heartbeat || heartbeat.v3_generation_id !== generationId) {
292
+ throw new LiveCoordinationAuthorityV3Error("generation_materialization_failed");
293
+ }
294
+ return {
295
+ state,
296
+ adapter: input.adapter,
297
+ generation_id: generationId as `gen_${string}`,
298
+ heartbeat,
299
+ };
300
+ }
301
+
302
+ /**
303
+ * Reapply private, generation-bound coordination state after a runtime epoch
304
+ * replaces the canonical ledger. The old heartbeat is only accepted for the
305
+ * same native session and a different V3 generation. Its task prose and
306
+ * lifecycle reason remain in the disposable cache; canonical events retain
307
+ * only the privacy-safe authority signals.
308
+ */
309
+ export function restoreLiveCoordinationStateAfterEpochV3(input: {
310
+ coordRoot: string;
311
+ owner: string;
312
+ nativeSessionId: string;
313
+ adapter: Adapter;
314
+ prior: Heartbeat | null;
315
+ currentGenerationId?: `gen_${string}`;
316
+ }): RestoredLiveCoordinationStateV3 {
317
+ const unchanged: RestoredLiveCoordinationStateV3 = {
318
+ state: "unchanged",
319
+ task: false,
320
+ claims: 0,
321
+ lifecycle: false,
322
+ };
323
+ const prior = input.prior;
324
+ if (!prior || prior.instance_id !== input.owner) return unchanged;
325
+ if (
326
+ prior.session_id !== input.nativeSessionId &&
327
+ prior.native_session_id !== input.nativeSessionId
328
+ ) {
329
+ return unchanged;
330
+ }
331
+ // The recorder just committed this hook under the named generation. When
332
+ // it is the cache's generation, no epoch replacement occurred and the
333
+ // expensive complete coordination projection cannot change the answer.
334
+ if (input.currentGenerationId && prior.v3_generation_id === input.currentGenerationId) {
335
+ return unchanged;
336
+ }
337
+ const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(input.coordRoot));
338
+ const priorGenerationStillCurrent = [
339
+ ...Object.values(view.instances),
340
+ ...Object.values(view.terminal_generations),
341
+ ].some((generation) => generation.generation_id === prior.v3_generation_id);
342
+ if (priorGenerationStillCurrent) return unchanged;
343
+ const current = readLiveCoordinationRow(input.coordRoot, input.owner);
344
+ if (!current || !prior.v3_generation_id || current.v3_generation_id === prior.v3_generation_id) {
345
+ return unchanged;
346
+ }
347
+
348
+ let task = false;
349
+ let claims = 0;
350
+ let lifecycle = false;
351
+ if (typeof prior.task === "string" && prior.task.length > 0 && current.task !== prior.task) {
352
+ recordLiveTaskChangeV3({
353
+ coordRoot: input.coordRoot,
354
+ owner: input.owner,
355
+ nativeSessionId: input.nativeSessionId,
356
+ adapter: input.adapter,
357
+ task: prior.task,
358
+ });
359
+ task = true;
360
+ }
361
+ const currentClaims = new Set(
362
+ (current.files_touched ?? []).map((path) => canonicalClaimPath(input.coordRoot, path)),
363
+ );
364
+ for (const path of [...new Set(prior.files_touched ?? [])].sort()) {
365
+ const canonical = canonicalClaimPath(input.coordRoot, path);
366
+ if (currentClaims.has(canonical)) continue;
367
+ recordLiveClaimChangeV3({
368
+ coordRoot: input.coordRoot,
369
+ owner: input.owner,
370
+ nativeSessionId: input.nativeSessionId,
371
+ adapter: input.adapter,
372
+ operation: "acquired",
373
+ path: canonical,
374
+ });
375
+ currentClaims.add(canonical);
376
+ claims += 1;
377
+ }
378
+ const priorLifecycle = prior.task_state ?? "active";
379
+ if (
380
+ priorLifecycle !== "active" &&
381
+ (current.task_state !== priorLifecycle || current.task_state_reason !== prior.task_state_reason)
382
+ ) {
383
+ recordLiveLifecycleChangeV3({
384
+ coordRoot: input.coordRoot,
385
+ owner: input.owner,
386
+ nativeSessionId: input.nativeSessionId,
387
+ adapter: input.adapter,
388
+ state: priorLifecycle,
389
+ ...(prior.task_state_reason ? { reason: prior.task_state_reason } : {}),
390
+ ...(prior.suggested_session_name
391
+ ? { suggestedSessionName: prior.suggested_session_name }
392
+ : {}),
393
+ });
394
+ lifecycle = true;
395
+ }
396
+ return task || claims > 0 || lifecycle
397
+ ? { state: "restored", task, claims, lifecycle }
398
+ : unchanged;
399
+ }
400
+
72
401
  /**
73
402
  * Open a fresh derived generation for a human-facing session that is executing
74
403
  * again after an authoritative terminal. The terminal generation is never
@@ -184,7 +513,8 @@ export function recordLiveLifecycleChangeV3(
184
513
  task_state_reason: input.state === "active" ? undefined : input.reason,
185
514
  ...(input.suggestedSessionName ? { suggested_session_name: input.suggestedSessionName } : {}),
186
515
  };
187
- if (authorityStateDigest(before) === authorityStateDigest(desired)) return { state: "unchanged" };
516
+ if (coordinationAuthorityStateDigestV3(before) === coordinationAuthorityStateDigestV3(desired))
517
+ return { state: "unchanged" };
188
518
  return recordLiveAuthority(
189
519
  input,
190
520
  "lifecycle-changed",
@@ -236,7 +566,8 @@ export function recordLiveClaimChangeV3(
236
566
  (path) => canonicalClaimPath(input.coordRoot, path) !== canonical,
237
567
  );
238
568
  const desired: Heartbeat = { ...before, files_touched: desiredFiles };
239
- if (authorityStateDigest(before) === authorityStateDigest(desired)) return { state: "unchanged" };
569
+ if (coordinationAuthorityStateDigestV3(before) === coordinationAuthorityStateDigestV3(desired))
570
+ return { state: "unchanged" };
240
571
  return recordLiveAuthority(
241
572
  input,
242
573
  "claim-changed",
@@ -265,7 +596,8 @@ export function recordLiveIdentityChangeV3(
265
596
  const subject = input.subject ?? input.owner;
266
597
  const before = requireHeartbeat(input, subject);
267
598
  const desired: Heartbeat = { ...before, name: input.name, agent_id: input.identityId };
268
- if (authorityStateDigest(before) === authorityStateDigest(desired)) return { state: "unchanged" };
599
+ if (coordinationAuthorityStateDigestV3(before) === coordinationAuthorityStateDigestV3(desired))
600
+ return { state: "unchanged" };
269
601
  return recordLiveAuthority(
270
602
  input,
271
603
  "identity-attested",
@@ -310,15 +642,15 @@ function recordLiveAuthority<S extends CoordinationAuthoritySignalV3>(
310
642
  producer_id: LIVE_COORDINATION_V3_PRODUCER_ID,
311
643
  build_id: route.build_id,
312
644
  platform: livePlatformV3(),
313
- expected_prior_state_digest: authorityStateDigest(expected),
314
- desired_state_digest: authorityStateDigest(desired),
645
+ expected_prior_state_digest: coordinationAuthorityStateDigestV3(expected),
646
+ desired_state_digest: coordinationAuthorityStateDigestV3(desired),
315
647
  reconciler: {
316
648
  readStateDigest: () => {
317
649
  const heartbeat = readHeartbeat(input.coordRoot, subject);
318
650
  if (!heartbeat || heartbeat.v3_generation_id !== expected.v3_generation_id) {
319
651
  throw new LiveCoordinationAuthorityV3Error(`heartbeat_generation_mismatch:${subject}`);
320
652
  }
321
- return authorityStateDigest(heartbeat);
653
+ return coordinationAuthorityStateDigestV3(heartbeat);
322
654
  },
323
655
  apply: (_mutation: AuthorityMutationV3) => apply(),
324
656
  },
@@ -355,7 +687,7 @@ function requireHeartbeat(input: LiveAuthorityBaseV3, owner: string): Heartbeat
355
687
  return heartbeat;
356
688
  }
357
689
 
358
- function authorityStateDigest(heartbeat: Heartbeat): `sha256:${string}` {
690
+ export function coordinationAuthorityStateDigestV3(heartbeat: Heartbeat): `sha256:${string}` {
359
691
  return sha256V3(
360
692
  canonicalJsonV3({
361
693
  instance_id: heartbeat.v3_instance_id ?? heartbeat.instance_id,
@@ -369,7 +701,3 @@ function authorityStateDigest(heartbeat: Heartbeat): `sha256:${string}` {
369
701
  }),
370
702
  );
371
703
  }
372
-
373
- function canonicalClaimPath(coordRoot: string, path: string): string {
374
- return path.startsWith(`${coordRoot}/`) ? path.slice(coordRoot.length + 1) : path;
375
- }
@@ -10,7 +10,7 @@ import {
10
10
  livePlatformV3,
11
11
  resolveLiveEventLedgerRouteV3,
12
12
  } from "../events/v3/live-routing.ts";
13
- import { readHookProducerStateV3 } from "../events/v3/producers/recorder.ts";
13
+ import { readJoinableHookProducerStateV3 } from "../events/v3/producers/recorder.ts";
14
14
  import { writeEventV3 } from "../events/v3/writer.ts";
15
15
  import { LiveCoordinationAuthorityV3Error } from "./live-authority-v3.ts";
16
16
  import { liveCoordinationAdapterV3 } from "./state/live-coordination-view.ts";
@@ -121,7 +121,12 @@ function recordObservation<T extends "lifecycle.sweep_observed" | "session.resum
121
121
  monotonic_ns: process.hrtime.bigint().toString(),
122
122
  };
123
123
  const event = buildEventV3(eventType, { ...common, payload } as never) as EventV3;
124
- writeEventV3(input.coordRoot, event);
124
+ const durability = writeEventV3(input.coordRoot, event, {
125
+ expectedGenesisId: control.genesis.event.payload.genesis_id as `gex_${string}`,
126
+ });
127
+ if (durability.state === "epoch_replaced") {
128
+ throw new LiveCoordinationAuthorityV3Error("epoch_replaced");
129
+ }
125
130
  return { state: "recorded", event };
126
131
  }
127
132
 
@@ -132,8 +137,13 @@ function withAttestedAdapter<T extends LiveLifecycleObservationBaseV3>(input: T)
132
137
  }
133
138
 
134
139
  function requireHookState(input: LiveLifecycleObservationBaseV3) {
135
- const hook = readHookProducerStateV3(input.coordRoot, input.adapter, input.nativeSessionId);
136
- if (!hook || hook.instance_id !== liveInstanceIdV3(input.owner)) {
140
+ const hook = readJoinableHookProducerStateV3(
141
+ input.coordRoot,
142
+ input.adapter,
143
+ input.nativeSessionId,
144
+ liveInstanceIdV3(input.owner),
145
+ );
146
+ if (!hook) {
137
147
  throw new LiveCoordinationAuthorityV3Error("hook_generation_not_joinable");
138
148
  }
139
149
  return hook;
@@ -17,7 +17,7 @@ import {
17
17
  livePlatformV3,
18
18
  resolveLiveEventLedgerRouteV3,
19
19
  } from "../events/v3/live-routing.ts";
20
- import { readHookProducerStateV3 } from "../events/v3/producers/recorder.ts";
20
+ import { readJoinableHookProducerStateV3 } from "../events/v3/producers/recorder.ts";
21
21
  import { writeEventV3 } from "../events/v3/writer.ts";
22
22
  import { LiveCoordinationAuthorityV3Error } from "./live-authority-v3.ts";
23
23
  import { liveCoordinationAdapterV3 } from "./state/live-coordination-view.ts";
@@ -54,7 +54,12 @@ export function recordLiveCoordinationObservationV3(
54
54
  throw new LiveCoordinationAuthorityV3Error("control_state_changed");
55
55
  }
56
56
  const adapter = liveCoordinationAdapterV3(input.coordRoot, input.owner) ?? input.adapter;
57
- const hook = readHookProducerStateV3(input.coordRoot, adapter, input.nativeSessionId);
57
+ const hook = readJoinableHookProducerStateV3(
58
+ input.coordRoot,
59
+ adapter,
60
+ input.nativeSessionId,
61
+ liveInstanceIdV3(input.owner),
62
+ );
58
63
  if (
59
64
  !hook ||
60
65
  hook.terminal ||
@@ -190,7 +195,12 @@ export function recordLiveCoordinationObservationV3(
190
195
  break;
191
196
  }
192
197
  }
193
- writeEventV3(input.coordRoot, event);
198
+ const durability = writeEventV3(input.coordRoot, event, {
199
+ expectedGenesisId: control.genesis.event.payload.genesis_id as `gex_${string}`,
200
+ });
201
+ if (durability.state === "epoch_replaced") {
202
+ throw new LiveCoordinationAuthorityV3Error("epoch_replaced");
203
+ }
194
204
  return { state: "recorded", event };
195
205
  }
196
206
 
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * UserPromptSubmit UX renderer. Combines the peer-refresh dedup, the
3
3
  * council-pending hash-dedup, the cross-adapter first-session naming nudge,
4
- * the Cursor/Codex set-task staleness nudge, and the Codex status-footer
5
- * reminder.
4
+ * the Cursor/Codex set-task staleness nudge, a host-configured prompt reminder,
5
+ * and the Codex status-footer reminder.
6
6
  * agent-hook's turn.started post-emit handler calls this
7
7
  * and forwards the result as the adapter-shaped additionalContext payload.
8
8
  *
@@ -18,7 +18,10 @@
18
18
  * Cursor/Codex additionally get the existing unset/stale-task reminder
19
19
  * because their Stop hooks do not enforce task declarations as reliably
20
20
  * as Claude Code's.
21
- * 4. Codex status footer: a non-deduplicated reminder to put the live status
21
+ * 4. Host prompt reminder: a project-owned, non-deduplicated line for
22
+ * adapters whose prompt hook can inject context and which lack a native
23
+ * reminder mechanism. Hook routing decides which adapters enable it.
24
+ * 5. Codex status footer: a non-deduplicated reminder to put the live status
22
25
  * box after the substantive answer. Stop stays observe-only, so missing the
23
26
  * footer can never trigger a replacement response.
24
27
  *
@@ -43,7 +46,7 @@ import {
43
46
  import { join } from "node:path";
44
47
 
45
48
  import { coordEnv } from "../../../lib/env.ts";
46
- import { endOfTurnStatusCommand, resolveBinName } from "../../config.ts";
49
+ import { endOfTurnStatusCommand, hostPromptReminder, resolveBinName } from "../../config.ts";
47
50
  import { type RemoteMachine, readRemoteMachines } from "../../presence/index.ts";
48
51
  import { sessionNameDisplayBlock, sessionNameDisplayPending } from "../session-name-display.ts";
49
52
  import {
@@ -83,6 +86,9 @@ export interface PromptContextOpts {
83
86
  /** When true, run the unset/stale-task check after the first set-task.
84
87
  * Cursor/Codex use this; Claude Code has Stop-hook transcript enforcement. */
85
88
  taskNudge?: boolean;
89
+ /** When true, append the project-configured prompt reminder without hash
90
+ * deduplication. The caller enables this only on supported adapter routes. */
91
+ hostPromptReminder?: boolean;
86
92
  /** When true, append the non-deduplicated Codex status-footer reminder.
87
93
  * The caller enables this only for human-facing Codex sessions. */
88
94
  statusFooterNudge?: boolean;
@@ -110,6 +116,7 @@ export function renderPromptContext(opts: PromptContextOpts): string {
110
116
  agentName,
111
117
  sessionNameNudge,
112
118
  taskNudge,
119
+ hostPromptReminder: promptReminderEnabled,
113
120
  statusFooterNudge,
114
121
  turnRitualNudge,
115
122
  } = opts;
@@ -136,7 +143,15 @@ export function renderPromptContext(opts: PromptContextOpts): string {
136
143
  if (nudgeMsg) sections.push(nudgeMsg);
137
144
  }
138
145
 
139
- // 4. Codex gets this on every prompt. It is intentionally not hash-deduped:
146
+ // 4. A supported adapter gets the host reminder on every prompt. The text is
147
+ // intentionally not hash-deduped or persisted into runtime state: freshness
148
+ // is the feature, and the project config remains its only durable copy.
149
+ if (promptReminderEnabled) {
150
+ const reminder = renderHostPromptReminder(coordRoot, instanceId);
151
+ if (reminder) sections.push(reminder);
152
+ }
153
+
154
+ // 5. Codex gets this on every prompt. It is intentionally not hash-deduped:
140
155
  // the reminder must be fresh in the model's context when it writes the reply.
141
156
  // Missing it is harmless because Codex Stop enforcement remains observe-only.
142
157
  if (statusFooterNudge) {
@@ -144,7 +159,7 @@ export function renderPromptContext(opts: PromptContextOpts): string {
144
159
  if (statusMsg) sections.push(statusMsg);
145
160
  }
146
161
 
147
- // 5. Adapters whose Stop hook ENFORCES the turn ritual get a fresh reminder
162
+ // 6. Adapters whose Stop hook ENFORCES the turn ritual get a fresh reminder
148
163
  // on every prompt. Reminding before the reply is drafted is far cheaper than
149
164
  // the bounce-and-retry the Stop hook otherwise forces: enforcement-only
150
165
  // compliance was measured missing on a double-digit share of turns. Not
@@ -157,6 +172,12 @@ export function renderPromptContext(opts: PromptContextOpts): string {
157
172
  return sections.join("\n\n");
158
173
  }
159
174
 
175
+ function renderHostPromptReminder(coordRoot: string, selfInstanceId: string): string {
176
+ const hb = readLiveCoordinationRow(coordRoot, selfInstanceId);
177
+ if (!hb || hb.kind === "subagent" || hb.kind === "transient" || hb.workflow_run_id) return "";
178
+ return hostPromptReminder(coordRoot) ?? "";
179
+ }
180
+
160
181
  function renderTurnRitualReminder(
161
182
  coordRoot: string,
162
183
  selfInstanceId: string,
@@ -224,7 +245,7 @@ function computeFocusNudgeIfChanged(
224
245
  // Keyed on "a name was ever produced", not task_updated_at: a bare clear
225
246
  // as the first declaration must not end the naming window.
226
247
  needsNudge = true;
227
- nudgeKind = "session-name";
248
+ nudgeKind = pendingSessionName ? "session-name-pending" : "session-name-unminted";
228
249
  message = pendingSessionName
229
250
  ? `This session name is still pending display. Before any prose or another tool call, send this exact block as your next assistant text:\n\n${sessionNameDisplayBlock(pendingSessionName)}`
230
251
  : `This session has no name yet: run \`${bin} agents set-task "<2-5 word session topic>"\` as your first tool call. ` +
@@ -254,19 +275,22 @@ function computeFocusNudgeIfChanged(
254
275
  return "";
255
276
  }
256
277
 
257
- // The session-name reminder is deliberately NOT deduped: it re-emits on
258
- // every prompt until a name is produced, because the "still unnamed" state
259
- // is the failure state — deduping it erases the only reminder after one
260
- // ignored prompt (the miss mode operators reported). Bounded in practice:
261
- // Stop rule 3/3 forces a set-task on the first tool-using turn.
262
- if (nudgeKind === "session-name") {
278
+ // An unminted session still gets a fresh reminder on every prompt until its
279
+ // first focus declaration. Once a name exists, the exact pending-name prompt
280
+ // is delivered once per minted value. Repeating it on every prompt creates
281
+ // an unbounded loop on adapters that cannot verify assistant reply text.
282
+ if (nudgeKind === "session-name-unminted") {
263
283
  clearHashFile(hashFile);
264
284
  return message;
265
285
  }
266
286
 
267
- // Dedup the task-unset/stale reminders on kind + task state so a repeat
268
- // prompt in the same state stays quiet.
269
- const state = `${nudgeKind}|task=${taskValue}|updated=${hb.task_updated_at ?? ""}|threshold=${threshold}`;
287
+ // A pending reminder is keyed only to the minted name: changing the task
288
+ // must not reconstruct or re-request that older title. Task reminders retain
289
+ // their own task-state key.
290
+ const state =
291
+ nudgeKind === "session-name-pending"
292
+ ? `${nudgeKind}|name=${pendingSessionName ?? ""}`
293
+ : `${nudgeKind}|task=${taskValue}|updated=${hb.task_updated_at ?? ""}|threshold=${threshold}`;
270
294
  const newHash = sha256Hex16(state);
271
295
  const oldHash = safeRead(hashFile);
272
296
  if (oldHash && oldHash === newHash) return "";