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
@@ -7,7 +7,14 @@ import type { Adapter } from "../../adapter.ts";
7
7
  import { transcriptPathCandidates } from "../resolve/transcript.ts";
8
8
 
9
9
  const DEFAULT_TAIL_BYTES = 256 * 1024;
10
+ /**
11
+ * An active turn can accumulate enough tool traffic to push its native turn
12
+ * ancestor beyond the ordinary status tail. Keep attribution bounded while
13
+ * giving long-running interactive turns a larger matching window.
14
+ */
15
+ const ACTIVE_TURN_TAIL_BYTES = 4 * 1024 * 1024;
10
16
  const DEFAULT_MAX_SAMPLE_AGE_MS = 30_000;
17
+ const DEFAULT_MAX_CURSOR_DATABASES = 8;
11
18
  const SESSION_CACHE_LIMIT = 128;
12
19
 
13
20
  export type RuntimeContextTelemetry =
@@ -16,9 +23,23 @@ export type RuntimeContextTelemetry =
16
23
  used_tokens: number;
17
24
  limit_tokens: number;
18
25
  measured_at: string;
19
- method: "codex_transcript_token_count";
26
+ method: "codex_transcript_token_count" | "claude_transcript_usage_model_capability";
20
27
  source_event: string;
21
28
  source_witness: string;
29
+ attestation: "derived" | "inferred";
30
+ confidence: "exact" | "high" | "medium";
31
+ bytes_read: number;
32
+ io_duration_ms: number;
33
+ }
34
+ | {
35
+ state: "observed";
36
+ used_percent: number;
37
+ measured_at: string;
38
+ method: "cursor_composer_context_percent";
39
+ source_event: string;
40
+ source_witness: string;
41
+ attestation: "derived";
42
+ confidence: "high";
22
43
  runtime_version?: string;
23
44
  bytes_read: number;
24
45
  io_duration_ms: number;
@@ -50,9 +71,17 @@ export type RuntimeContextMissingReason =
50
71
  | "context_limit_tokens_not_reported"
51
72
  | "context_limit_tokens_invalid"
52
73
  | "claude_context_limit_tokens_not_reported"
74
+ | "claude_transcript_sample_stale"
53
75
  | "claude_transcript_session_mismatch"
54
76
  | "claude_transcript_turn_not_found"
55
- | "claude_transcript_unreadable";
77
+ | "claude_transcript_unreadable"
78
+ | "cursor_context_database_unavailable"
79
+ | "cursor_context_database_unreadable"
80
+ | "cursor_context_session_not_found"
81
+ | "cursor_context_sample_ambiguous"
82
+ | "cursor_context_sample_stale"
83
+ | "cursor_context_sample_time_not_reported"
84
+ | "cursor_context_usage_invalid";
56
85
 
57
86
  export type RuntimeContextUnsupportedReason =
58
87
  | "runtime_context_telemetry_unavailable"
@@ -64,15 +93,25 @@ export interface RuntimeContextRequest {
64
93
  adapter: Adapter;
65
94
  session_id?: string;
66
95
  turn_id?: string;
96
+ /** Canonical producer turn boundary used when task_started has left the bounded tail. */
97
+ turn_started_at?: string;
67
98
  transcript_path?: string;
68
- /** Status callers may request the newest session sample without claiming turn attribution. */
69
- mode: "turn" | "status";
99
+ observed_at?: string;
100
+ /**
101
+ * Status reads the newest session sample without turn attribution. Active
102
+ * turn reads require a matching task_started boundary but not task_complete.
103
+ */
104
+ mode: "turn" | "active_turn" | "status";
70
105
  }
71
106
 
72
107
  export interface RuntimeTelemetryOptions {
73
108
  codexRoots?: string[];
109
+ cursorRoots?: string[];
110
+ maxCursorDatabases?: number;
74
111
  maxTailBytes?: number;
75
112
  maxSampleAgeMs?: number;
113
+ /** Recorder-only cadence override used by deterministic tests. */
114
+ activeContextProbeIntervalMs?: number;
76
115
  }
77
116
 
78
117
  interface TailRead {
@@ -101,6 +140,7 @@ interface CodexTokenSample {
101
140
  }
102
141
 
103
142
  const codexTranscriptCache = new Map<string, string>();
143
+ const cursorDatabaseCache = new Map<string, string>();
104
144
 
105
145
  /**
106
146
  * Read privacy-safe context telemetry from a local runtime transcript.
@@ -115,11 +155,12 @@ export function readRuntimeContextTelemetry(
115
155
  ): RuntimeContextTelemetry {
116
156
  const startedAt = performance.now();
117
157
  if (!request.session_id) return unsupported("runtime_session_id_not_reported", startedAt);
118
- if (request.mode === "turn" && !request.turn_id) {
158
+ if (request.mode !== "status" && !request.turn_id && request.adapter !== "cursor") {
119
159
  return unsupported("runtime_turn_id_not_reported", startedAt);
120
160
  }
121
161
  if (request.adapter === "codex") return readCodexContext(request, options, startedAt);
122
162
  if (request.adapter === "claude-code") return readClaudeContext(request, options, startedAt);
163
+ if (request.adapter === "cursor") return readCursorContext(request, options, startedAt);
123
164
  return unsupported("runtime_adapter_not_supported", startedAt);
124
165
  }
125
166
 
@@ -158,13 +199,14 @@ export function readRuntimeContextUsage(
158
199
  { adapter, session_id: sessionId, mode: "status" },
159
200
  options,
160
201
  );
161
- return result.state === "observed"
202
+ return result.state === "observed" && "used_tokens" in result
162
203
  ? { used: result.used_tokens, window: result.limit_tokens }
163
204
  : null;
164
205
  }
165
206
 
166
207
  export function clearRuntimeTelemetryCachesForTest(): void {
167
208
  codexTranscriptCache.clear();
209
+ cursorDatabaseCache.clear();
168
210
  }
169
211
 
170
212
  export type RuntimeTuningMissingReason =
@@ -422,7 +464,11 @@ function readCodexContext(
422
464
  return partial("codex_transcript_session_mismatch", 0, startedAt);
423
465
  }
424
466
 
425
- const tail = readTail(resolved.path, options.maxTailBytes ?? DEFAULT_TAIL_BYTES);
467
+ const tail = readTail(
468
+ resolved.path,
469
+ options.maxTailBytes ??
470
+ (request.mode === "active_turn" ? ACTIVE_TURN_TAIL_BYTES : DEFAULT_TAIL_BYTES),
471
+ );
426
472
  if (!tail) return partial("codex_transcript_unreadable", 0, startedAt);
427
473
  const rows = parseRuntimeRows(tail.text);
428
474
  if (request.mode === "status") {
@@ -430,6 +476,16 @@ function readCodexContext(
430
476
  return codexObservation(request, token, undefined, tail.bytes, options, startedAt);
431
477
  }
432
478
 
479
+ if (request.mode === "active_turn") {
480
+ const active = tokenWithinActiveTurn(rows, request.turn_id!);
481
+ const token =
482
+ active.state === "found" ? active.token : tokenAtOrAfter(rows, request.turn_started_at);
483
+ if (active.state === "turn_missing" && !token) {
484
+ return partial("codex_transcript_turn_not_found", tail.bytes, startedAt);
485
+ }
486
+ return codexObservation(request, token, undefined, tail.bytes, options, startedAt);
487
+ }
488
+
433
489
  const turnId = request.turn_id!;
434
490
  const terminalIndex = findCodexTurnTerminal(rows, turnId);
435
491
  if (terminalIndex < 0) {
@@ -478,6 +534,16 @@ function codexObservation(
478
534
  return partial("codex_transcript_sample_stale", bytesRead, startedAt, token);
479
535
  }
480
536
  }
537
+ if (request.mode === "active_turn" && request.observed_at) {
538
+ const age = Date.parse(request.observed_at) - Date.parse(token.measured_at);
539
+ if (
540
+ !Number.isFinite(age) ||
541
+ age < -5_000 ||
542
+ age > (options.maxSampleAgeMs ?? DEFAULT_MAX_SAMPLE_AGE_MS)
543
+ ) {
544
+ return partial("codex_transcript_sample_stale", bytesRead, startedAt, token);
545
+ }
546
+ }
481
547
  const witness = [
482
548
  request.session_id,
483
549
  request.turn_id ?? "status",
@@ -494,6 +560,8 @@ function codexObservation(
494
560
  method: "codex_transcript_token_count",
495
561
  source_event: "codex.rollout_token_count",
496
562
  source_witness: createHash("sha256").update(witness).digest("hex"),
563
+ attestation: "derived",
564
+ confidence: "exact",
497
565
  bytes_read: bytesRead,
498
566
  io_duration_ms: elapsed(startedAt),
499
567
  };
@@ -508,7 +576,11 @@ function readClaudeContext(
508
576
  existsSync(candidate),
509
577
  );
510
578
  if (!readablePath) return unsupported("runtime_context_telemetry_unavailable", startedAt);
511
- const tail = readTail(readablePath, options.maxTailBytes ?? DEFAULT_TAIL_BYTES);
579
+ const tail = readTail(
580
+ readablePath,
581
+ options.maxTailBytes ??
582
+ (request.mode === "active_turn" ? ACTIVE_TURN_TAIL_BYTES : DEFAULT_TAIL_BYTES),
583
+ );
512
584
  if (!tail) return partial("claude_transcript_unreadable", 0, startedAt);
513
585
  const rows = parseRuntimeRows(tail.text);
514
586
  const sessionRows = rows.filter(
@@ -517,11 +589,11 @@ function readClaudeContext(
517
589
  if (rows.some((row) => row.session_id !== undefined) && sessionRows.length === 0) {
518
590
  return partial("claude_transcript_session_mismatch", tail.bytes, startedAt);
519
591
  }
520
- const candidateRows =
521
- request.mode === "turn"
522
- ? claudeAssistantRowsForTurn(sessionRows, request.turn_id!)
523
- : sessionRows.filter((row) => row.type === "assistant");
524
- if (request.mode === "turn" && candidateRows.length === 0) {
592
+ const turnAttributed = request.mode === "turn" || request.mode === "active_turn";
593
+ const candidateRows = turnAttributed
594
+ ? claudeAssistantRowsForTurn(sessionRows, request.turn_id!)
595
+ : sessionRows.filter((row) => row.type === "assistant");
596
+ if (turnAttributed && candidateRows.length === 0) {
525
597
  return partial("claude_transcript_turn_not_found", tail.bytes, startedAt);
526
598
  }
527
599
  for (let index = candidateRows.length - 1; index >= 0; index--) {
@@ -538,6 +610,45 @@ function readClaudeContext(
538
610
  if (used === undefined) {
539
611
  return partial("context_used_tokens_not_reported", tail.bytes, startedAt);
540
612
  }
613
+ const model = stringValue(message?.model);
614
+ const capability = model ? claudeModelContextCapability(model) : undefined;
615
+ if (capability && row.timestamp) {
616
+ if (request.mode === "active_turn" && request.observed_at) {
617
+ const age = Date.parse(request.observed_at) - Date.parse(row.timestamp);
618
+ if (
619
+ !Number.isFinite(age) ||
620
+ age < -5_000 ||
621
+ age > (options.maxSampleAgeMs ?? DEFAULT_MAX_SAMPLE_AGE_MS)
622
+ ) {
623
+ return partial("claude_transcript_sample_stale", tail.bytes, startedAt, {
624
+ used_tokens: used,
625
+ measured_at: row.timestamp,
626
+ });
627
+ }
628
+ }
629
+ const witness = [
630
+ request.session_id,
631
+ request.turn_id ?? "status",
632
+ row.timestamp,
633
+ used,
634
+ model,
635
+ capability.limit_tokens,
636
+ capability.authority,
637
+ ].join("\0");
638
+ return {
639
+ state: "observed",
640
+ used_tokens: used,
641
+ limit_tokens: capability.limit_tokens,
642
+ measured_at: row.timestamp,
643
+ method: "claude_transcript_usage_model_capability",
644
+ source_event: "claude.transcript_usage_model_capability",
645
+ source_witness: createHash("sha256").update(witness).digest("hex"),
646
+ attestation: "inferred",
647
+ confidence: "high",
648
+ bytes_read: tail.bytes,
649
+ io_duration_ms: elapsed(startedAt),
650
+ };
651
+ }
541
652
  return partial("claude_context_limit_tokens_not_reported", tail.bytes, startedAt, {
542
653
  used_tokens: used,
543
654
  measured_at: row.timestamp,
@@ -546,6 +657,244 @@ function readClaudeContext(
546
657
  return partial("context_used_tokens_not_reported", tail.bytes, startedAt);
547
658
  }
548
659
 
660
+ interface ClaudeModelContextCapability {
661
+ limit_tokens: number;
662
+ authority: string;
663
+ }
664
+
665
+ /**
666
+ * Versioned exact-name families from Anthropic's published model capability
667
+ * table. Unknown aliases deliberately stay missing: matching a product label
668
+ * or guessing from a family name would turn an estimate into fake precision.
669
+ */
670
+ function claudeModelContextCapability(model: string): ClaudeModelContextCapability | undefined {
671
+ const normalized = model.toLowerCase();
672
+ const oneMillionTokenModels = new Set([
673
+ "claude-fable-5",
674
+ "claude-opus-5",
675
+ "claude-sonnet-5",
676
+ "claude-opus-4-8",
677
+ "claude-opus-4-7",
678
+ "claude-opus-4-6",
679
+ "claude-sonnet-4-6",
680
+ ]);
681
+ if (oneMillionTokenModels.has(normalized)) {
682
+ return { limit_tokens: 1_000_000, authority: "anthropic_model_capabilities_2026_08" };
683
+ }
684
+ if (normalized === "claude-haiku-4-5" || normalized === "claude-haiku-4-5-20251001") {
685
+ return { limit_tokens: 200_000, authority: "anthropic_model_capabilities_2026_08" };
686
+ }
687
+ return undefined;
688
+ }
689
+
690
+ interface CursorContextSample {
691
+ used_percent: number;
692
+ measured_at: string;
693
+ bytes_read: number;
694
+ database_path: string;
695
+ }
696
+
697
+ function readCursorContext(
698
+ request: RuntimeContextRequest,
699
+ options: RuntimeTelemetryOptions,
700
+ startedAt: number,
701
+ ): RuntimeContextTelemetry {
702
+ const cached = cursorDatabaseCache.get(request.session_id!);
703
+ if (cached && existsSync(cached)) {
704
+ const sample = readCursorDatabase(cached, request.session_id!);
705
+ if (sample.state === "found") {
706
+ return cursorObservation(request, sample.sample, options, startedAt);
707
+ }
708
+ cursorDatabaseCache.delete(request.session_id!);
709
+ }
710
+
711
+ const databases = cursorDatabasePaths(options);
712
+ if (databases.length === 0) {
713
+ return partial("cursor_context_database_unavailable", 0, startedAt);
714
+ }
715
+ const matches: CursorContextSample[] = [];
716
+ let bytesRead = 0;
717
+ let unreadable = 0;
718
+ for (const databasePath of databases) {
719
+ const result = readCursorDatabase(databasePath, request.session_id!);
720
+ bytesRead += result.state === "found" ? result.sample.bytes_read : result.bytes_read;
721
+ if (result.state === "unreadable") unreadable += 1;
722
+ if (result.state !== "found") continue;
723
+ matches.push(result.sample);
724
+ }
725
+ if (matches.length === 0) {
726
+ return partial(
727
+ unreadable === databases.length
728
+ ? "cursor_context_database_unreadable"
729
+ : "cursor_context_session_not_found",
730
+ bytesRead,
731
+ startedAt,
732
+ );
733
+ }
734
+ matches.sort((left, right) => Date.parse(right.measured_at) - Date.parse(left.measured_at));
735
+ const newest = matches[0]!;
736
+ const tied = matches.filter((sample) => sample.measured_at === newest.measured_at);
737
+ if (tied.some((sample) => sample.used_percent !== newest.used_percent)) {
738
+ return partial("cursor_context_sample_ambiguous", bytesRead, startedAt);
739
+ }
740
+ cacheCursorDatabase(request.session_id!, newest.database_path);
741
+ return cursorObservation(request, newest, options, startedAt);
742
+ }
743
+
744
+ function cursorObservation(
745
+ request: RuntimeContextRequest,
746
+ sample: CursorContextSample,
747
+ options: RuntimeTelemetryOptions,
748
+ startedAt: number,
749
+ ): RuntimeContextTelemetry {
750
+ if (
751
+ !Number.isFinite(sample.used_percent) ||
752
+ sample.used_percent < 0 ||
753
+ sample.used_percent > 100
754
+ ) {
755
+ return partial("cursor_context_usage_invalid", sample.bytes_read, startedAt);
756
+ }
757
+ const sampleMs = Date.parse(sample.measured_at);
758
+ if (!Number.isFinite(sampleMs)) {
759
+ return partial("cursor_context_sample_time_not_reported", sample.bytes_read, startedAt);
760
+ }
761
+ if ((request.mode === "turn" || request.mode === "active_turn") && request.observed_at) {
762
+ const observedMs = Date.parse(request.observed_at);
763
+ const age = observedMs - sampleMs;
764
+ if (
765
+ !Number.isFinite(observedMs) ||
766
+ age < -5_000 ||
767
+ age > (options.maxSampleAgeMs ?? DEFAULT_MAX_SAMPLE_AGE_MS)
768
+ ) {
769
+ return partial("cursor_context_sample_stale", sample.bytes_read, startedAt);
770
+ }
771
+ }
772
+ const witness = [request.session_id, sample.measured_at, sample.used_percent].join("\0");
773
+ return {
774
+ state: "observed",
775
+ used_percent: sample.used_percent,
776
+ measured_at: sample.measured_at,
777
+ method: "cursor_composer_context_percent",
778
+ source_event: "cursor.composer_context_percent",
779
+ source_witness: createHash("sha256").update(witness).digest("hex"),
780
+ attestation: "derived",
781
+ confidence: "high",
782
+ bytes_read: sample.bytes_read,
783
+ io_duration_ms: elapsed(startedAt),
784
+ };
785
+ }
786
+
787
+ type CursorDatabaseResult =
788
+ | { state: "found"; sample: CursorContextSample }
789
+ | { state: "missing"; bytes_read: number }
790
+ | { state: "unreadable"; bytes_read: number };
791
+
792
+ function readCursorDatabase(databasePath: string, sessionId: string): CursorDatabaseResult {
793
+ try {
794
+ // Bun is the primary hook runtime. Node fallback processes fail closed here
795
+ // instead of importing a Bun-only module at startup.
796
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
797
+ const { Database } = require("bun:sqlite") as {
798
+ Database: new (
799
+ path: string,
800
+ options: { readonly: boolean },
801
+ ) => {
802
+ query(sql: string): { get(): { value: string | Uint8Array } | null };
803
+ close(): void;
804
+ };
805
+ };
806
+ const database = new Database(databasePath, { readonly: true });
807
+ const row = database
808
+ .query("SELECT value FROM ItemTable WHERE key = 'composer.composerData'")
809
+ .get();
810
+ database.close();
811
+ if (!row?.value) return { state: "missing", bytes_read: 0 };
812
+ const text =
813
+ typeof row.value === "string" ? row.value : Buffer.from(row.value).toString("utf8");
814
+ const bytesRead = Buffer.byteLength(text);
815
+ const parsed = objectValue(JSON.parse(text));
816
+ const composers = Array.isArray(parsed?.allComposers) ? parsed.allComposers : [];
817
+ for (const candidate of composers) {
818
+ const composer = objectValue(candidate);
819
+ if (stringValue(composer?.composerId) !== sessionId) continue;
820
+ const usedPercent = numberValue(composer?.contextUsagePercent);
821
+ if (usedPercent === undefined) return { state: "missing", bytes_read: bytesRead };
822
+ const measuredAt = cursorMeasuredAt(composer?.lastUpdatedAt);
823
+ if (!measuredAt) return { state: "missing", bytes_read: bytesRead };
824
+ return {
825
+ state: "found",
826
+ sample: {
827
+ used_percent: usedPercent,
828
+ measured_at: measuredAt,
829
+ bytes_read: bytesRead,
830
+ database_path: databasePath,
831
+ },
832
+ };
833
+ }
834
+ return { state: "missing", bytes_read: bytesRead };
835
+ } catch {
836
+ return { state: "unreadable", bytes_read: 0 };
837
+ }
838
+ }
839
+
840
+ function cursorMeasuredAt(value: unknown): string | undefined {
841
+ if (typeof value === "string" && Number.isFinite(Date.parse(value))) {
842
+ return new Date(value).toISOString();
843
+ }
844
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) return undefined;
845
+ const milliseconds = value < 10_000_000_000 ? value * 1_000 : value;
846
+ const date = new Date(milliseconds);
847
+ return Number.isFinite(date.getTime()) ? date.toISOString() : undefined;
848
+ }
849
+
850
+ function cursorDatabasePaths(options: RuntimeTelemetryOptions): string[] {
851
+ const roots = options.cursorRoots ?? defaultCursorRoots();
852
+ const limit = Math.max(1, Math.floor(options.maxCursorDatabases ?? DEFAULT_MAX_CURSOR_DATABASES));
853
+ const candidates: Array<{ path: string; modified_ms: number }> = [];
854
+ for (const root of roots) {
855
+ let names: string[];
856
+ try {
857
+ names = readdirSync(root).sort();
858
+ } catch {
859
+ continue;
860
+ }
861
+ for (const name of names) {
862
+ const databasePath = join(root, name, "state.vscdb");
863
+ try {
864
+ candidates.push({ path: databasePath, modified_ms: statSync(databasePath).mtimeMs });
865
+ } catch {
866
+ // Removed or unreadable workspaces are not candidates.
867
+ }
868
+ }
869
+ }
870
+ return candidates
871
+ .sort((left, right) => right.modified_ms - left.modified_ms)
872
+ .slice(0, limit)
873
+ .map((candidate) => candidate.path);
874
+ }
875
+
876
+ function defaultCursorRoots(): string[] {
877
+ const roots = [resolve(homedir(), ".config", "Cursor", "User", "workspaceStorage")];
878
+ try {
879
+ if (existsSync("/mnt/c/Users")) {
880
+ for (const user of readdirSync("/mnt/c/Users")) {
881
+ roots.push(`/mnt/c/Users/${user}/AppData/Roaming/Cursor/User/workspaceStorage`);
882
+ }
883
+ }
884
+ } catch {
885
+ // Non-WSL hosts do not expose this mount.
886
+ }
887
+ return roots;
888
+ }
889
+
890
+ function cacheCursorDatabase(sessionId: string, databasePath: string): void {
891
+ cursorDatabaseCache.delete(sessionId);
892
+ cursorDatabaseCache.set(sessionId, databasePath);
893
+ while (cursorDatabaseCache.size > SESSION_CACHE_LIMIT) {
894
+ cursorDatabaseCache.delete(cursorDatabaseCache.keys().next().value!);
895
+ }
896
+ }
897
+
549
898
  /** Join assistant rows to the native CC prompt id through the transcript's
550
899
  * parent UUID chain. No UUID or prompt value crosses the reader boundary. */
551
900
  function claudeAssistantRowsForTurn(rows: ParsedRuntimeRow[], turnId: string): ParsedRuntimeRow[] {
@@ -573,6 +922,48 @@ function newestCodexToken(rows: ParsedRuntimeRow[]): CodexTokenSample | undefine
573
922
  return undefined;
574
923
  }
575
924
 
925
+ function tokenWithinActiveTurn(
926
+ rows: ParsedRuntimeRow[],
927
+ turnId: string,
928
+ ): { state: "found"; token?: CodexTokenSample } | { state: "turn_missing" } {
929
+ let startIndex = -1;
930
+ for (let index = rows.length - 1; index >= 0; index -= 1) {
931
+ const row = rows[index]!;
932
+ if (
933
+ row.type === "event_msg" &&
934
+ row.payload?.type === "task_started" &&
935
+ row.payload.turn_id === turnId
936
+ ) {
937
+ startIndex = index;
938
+ break;
939
+ }
940
+ }
941
+ if (startIndex < 0) return { state: "turn_missing" };
942
+
943
+ let token: CodexTokenSample | undefined;
944
+ for (let index = startIndex + 1; index < rows.length; index += 1) {
945
+ const row = rows[index]!;
946
+ if (
947
+ row.type === "event_msg" &&
948
+ (row.payload?.type === "task_started" || row.payload?.type === "task_complete")
949
+ ) {
950
+ break;
951
+ }
952
+ token = codexToken(row) ?? token;
953
+ }
954
+ return { state: "found", token };
955
+ }
956
+
957
+ function tokenAtOrAfter(
958
+ rows: ParsedRuntimeRow[],
959
+ turnStartedAt: string | undefined,
960
+ ): CodexTokenSample | undefined {
961
+ if (!turnStartedAt || !Number.isFinite(Date.parse(turnStartedAt))) return undefined;
962
+ const token = newestCodexToken(rows);
963
+ if (!token?.measured_at) return undefined;
964
+ return Date.parse(token.measured_at) >= Date.parse(turnStartedAt) ? token : undefined;
965
+ }
966
+
576
967
  function tokenBeforeTerminal(
577
968
  rows: ParsedRuntimeRow[],
578
969
  terminalIndex: number,
@@ -643,6 +1034,10 @@ function stringValue(value: unknown): string | undefined {
643
1034
  return typeof value === "string" && value.length > 0 ? value : undefined;
644
1035
  }
645
1036
 
1037
+ function numberValue(value: unknown): number | undefined {
1038
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
1039
+ }
1040
+
646
1041
  function readTail(path: string, maxBytes: number): TailRead | undefined {
647
1042
  let fd: number | undefined;
648
1043
  try {