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,8 +1,10 @@
1
1
  import { existsSync as __existsSyncForDocs } from "node:fs";
2
2
  import { resolve as __resolveForDocs } from "node:path";
3
3
  import { hasYamlStatus } from "./docs-frontmatter.ts";
4
- import { initDocsMetadataAuditContext, runDocsMetadataAudit } from "./docs-metadata-audit.ts";
5
- import { sh } from "./exec.ts";
4
+ import {
5
+ auditDocsMetadataRepository,
6
+ initDocsMetadataAuditContext,
7
+ } from "./docs-metadata-audit.ts";
6
8
 
7
9
  // Module-level docs context, initialized by initDocsContext() before any
8
10
  // other function in this file is called. Consumers pass repo metadata
@@ -34,8 +36,13 @@ function isSubmoduleInitialized(name: string): boolean {
34
36
  return __existsSyncForDocs(__resolveForDocs(REPO_ROOT, name, ".git"));
35
37
  }
36
38
 
37
- import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
39
+ import { readFileSync } from "node:fs";
38
40
  import { basename, join } from "node:path";
41
+ import {
42
+ createDocsRepositoryView,
43
+ type DocsRepositorySource,
44
+ type DocsRepositoryView,
45
+ } from "./docs-repository-view.ts";
39
46
 
40
47
  /**
41
48
  * Documentation linter. Enforces the docs directory-layout + naming contract.
@@ -58,6 +65,7 @@ export interface Violation {
58
65
  export interface LintOpts {
59
66
  fast?: boolean;
60
67
  repo?: string; // limit to one submodule or "." for parent
68
+ source?: DocsRepositorySource;
61
69
  }
62
70
 
63
71
  /** Files allowed at a submodule root level. Includes:
@@ -145,15 +153,9 @@ function getTargetRepos(opts: LintOpts): { name: string; path: string; isSubmodu
145
153
  return all;
146
154
  }
147
155
 
148
- /** List all tracked .md files in the given repo via `git ls-files`.
149
- * Returns paths relative to the repo root. Automatically skips node_modules,
150
- * vendor, .venv, dbt_packages, build/ etc. because they're gitignored.
151
- */
152
- async function findMarkdownFiles(root: string): Promise<string[]> {
153
- const result = await sh('git ls-files --cached "**/*.md" "*.md"', { cwd: root });
154
- if (result.exitCode !== 0 || !result.stdout) return [];
155
- return result.stdout
156
- .split("\n")
156
+ /** Select tracked Markdown from the coherent repository view. */
157
+ function findMarkdownFiles(view: DocsRepositoryView): string[] {
158
+ return view.trackedPaths
157
159
  .filter((f) => f.endsWith(".md"))
158
160
  .filter(
159
161
  (f) =>
@@ -164,19 +166,9 @@ async function findMarkdownFiles(root: string): Promise<string[]> {
164
166
  );
165
167
  }
166
168
 
167
- /** Read first N lines of a file for header inspection */
168
- function readHead(path: string, lines = 20): string {
169
- try {
170
- const content = readFileSync(path, "utf8");
171
- return content.split("\n").slice(0, lines).join("\n");
172
- } catch {
173
- return "";
174
- }
175
- }
176
-
177
169
  /** Detect whether a file declares itself an intentional monolith */
178
- function isDeclaredMonolith(path: string): boolean {
179
- const head = readHead(path, 10);
170
+ function isDeclaredMonolith(content: string): boolean {
171
+ const head = content.split("\n").slice(0, 10).join("\n");
180
172
  return /INTENTIONAL-MONOLITH/i.test(head);
181
173
  }
182
174
 
@@ -192,10 +184,14 @@ export function hasStatusHeader(path: string): boolean {
192
184
  // --- Individual checks ---
193
185
 
194
186
  /** Entry tier files exist at the repo root */
195
- function checkEntryTier(repoName: string, repoPath: string, isSubmodule: boolean): Violation[] {
187
+ function checkEntryTier(
188
+ repoName: string,
189
+ view: DocsRepositoryView,
190
+ isSubmodule: boolean,
191
+ ): Violation[] {
196
192
  const violations: Violation[] = [];
197
193
  // README.md is required for any repo
198
- if (!existsSync(join(repoPath, "README.md"))) {
194
+ if (!view.has("README.md")) {
199
195
  violations.push({
200
196
  severity: "error",
201
197
  repo: repoName,
@@ -205,7 +201,7 @@ function checkEntryTier(repoName: string, repoPath: string, isSubmodule: boolean
205
201
  });
206
202
  }
207
203
  // CLAUDE.md required for submodules (primary LLM context)
208
- if (isSubmodule && !existsSync(join(repoPath, "CLAUDE.md"))) {
204
+ if (isSubmodule && !view.has("CLAUDE.md")) {
209
205
  violations.push({
210
206
  severity: "error",
211
207
  repo: repoName,
@@ -218,14 +214,9 @@ function checkEntryTier(repoName: string, repoPath: string, isSubmodule: boolean
218
214
  }
219
215
 
220
216
  /** No forbidden root-level files */
221
- function checkRootAllowlist(repoName: string, repoPath: string): Violation[] {
217
+ function checkRootAllowlist(repoName: string, view: DocsRepositoryView): Violation[] {
222
218
  const violations: Violation[] = [];
223
- let entries: string[];
224
- try {
225
- entries = readdirSync(repoPath);
226
- } catch {
227
- return violations;
228
- }
219
+ const entries = view.directFileNames(".");
229
220
  for (const entry of entries) {
230
221
  if (!entry.endsWith(".md")) continue;
231
222
  if (ROOT_FILE_ALLOWLIST.has(entry)) continue;
@@ -257,27 +248,13 @@ function checkRootAllowlist(repoName: string, repoPath: string): Violation[] {
257
248
  * a no-op unless the host supplies `docsRootAllowlist`. Parent-repo only:
258
249
  * submodule `docs/` roots have their own entry tiers, not this one.
259
250
  */
260
- function checkDocsRootAllowlist(repoName: string, repoPath: string): Violation[] {
251
+ function checkDocsRootAllowlist(repoName: string, view: DocsRepositoryView): Violation[] {
261
252
  const violations: Violation[] = [];
262
253
  if (DOCS_ROOT_ALLOWLIST.length === 0) return violations; // opt-in
263
254
  if (repoName !== "(root)") return violations; // parent repo only
264
255
  const allow = new Set(DOCS_ROOT_ALLOWLIST);
265
- const docsDir = join(repoPath, "docs");
266
- let entries: string[];
267
- try {
268
- entries = readdirSync(docsDir);
269
- } catch {
270
- return violations; // no docs/ dir — nothing to check
271
- }
256
+ const entries = view.directFileNames("docs");
272
257
  for (const entry of entries) {
273
- // Subdirs are the intended home for topic docs; only loose files matter.
274
- let isFile: boolean;
275
- try {
276
- isFile = statSync(join(docsDir, entry)).isFile();
277
- } catch {
278
- continue;
279
- }
280
- if (!isFile) continue;
281
258
  if (!(entry.endsWith(".md") || entry.endsWith(".json"))) continue;
282
259
  if (allow.has(entry)) continue;
283
260
  violations.push({
@@ -383,13 +360,14 @@ function checkChangelogNames(repoName: string, _repoPath: string, files: string[
383
360
  }
384
361
 
385
362
  /** Intentional monoliths >30KB need a declaration banner */
386
- function checkMonolithDeclaration(
363
+ async function checkMonolithDeclaration(
387
364
  repoName: string,
388
- repoPath: string,
365
+ view: DocsRepositoryView,
389
366
  files: string[],
390
- ): Violation[] {
367
+ ): Promise<Violation[]> {
391
368
  const violations: Violation[] = [];
392
369
  const SIZE_THRESHOLD = 30 * 1024;
370
+ const candidatePaths: string[] = [];
393
371
  for (const rel of files) {
394
372
  // Only flag top-level docs/ files, not per-repo entry tier (LLM-BRIEFING
395
373
  // files are monoliths by convention, no banner needed).
@@ -399,15 +377,17 @@ function checkMonolithDeclaration(
399
377
  if (rel.startsWith("docs/audits/")) continue;
400
378
  if (rel.startsWith("docs/issues/")) continue;
401
379
  if (rel.startsWith("docs/changelogs/")) continue;
402
- const full = join(repoPath, rel);
403
- let size: number;
404
- try {
405
- size = statSync(full).size;
406
- } catch {
407
- continue;
408
- }
380
+ const size = await view.byteLength(rel);
381
+ if (size === null) continue;
409
382
  if (size < SIZE_THRESHOLD) continue;
410
- if (isDeclaredMonolith(full)) continue;
383
+ candidatePaths.push(rel);
384
+ }
385
+ const texts = await view.readTexts(candidatePaths);
386
+ for (const rel of candidatePaths) {
387
+ const content = texts.get(rel);
388
+ if (content === undefined || isDeclaredMonolith(content)) continue;
389
+ const size = await view.byteLength(rel);
390
+ if (size === null) continue;
411
391
  violations.push({
412
392
  severity: "warning",
413
393
  repo: repoName,
@@ -426,30 +406,31 @@ export async function runLint(opts: LintOpts): Promise<Violation[]> {
426
406
  const repos = getTargetRepos(opts);
427
407
 
428
408
  for (const { name, path, isSubmodule } of repos) {
429
- violations.push(...checkEntryTier(name, path, isSubmodule));
430
- violations.push(...checkRootAllowlist(name, path));
431
- violations.push(...checkDocsRootAllowlist(name, path));
409
+ const view = await createDocsRepositoryView(path, opts.source ?? "worktree");
410
+ violations.push(...checkEntryTier(name, view, isSubmodule));
411
+ violations.push(...checkRootAllowlist(name, view));
412
+ violations.push(...checkDocsRootAllowlist(name, view));
432
413
 
433
- const files = await findMarkdownFiles(path);
414
+ const files = findMarkdownFiles(view);
434
415
  violations.push(...checkNamingConvention(name, path, files));
435
416
  violations.push(...checkDatedDirs(name, path, files));
436
417
  violations.push(...checkChangelogNames(name, path, files));
437
418
 
438
419
  if (!opts.fast) {
439
- violations.push(...checkMonolithDeclaration(name, path, files));
420
+ violations.push(...(await checkMonolithDeclaration(name, view, files)));
440
421
  }
441
- }
442
422
 
443
- const metadataRows = await runDocsMetadataAudit({ repo: opts.repo });
444
- for (const row of metadataRows) {
445
- for (const issue of row.issues.filter((entry) => entry.severity === "error")) {
446
- violations.push({
447
- severity: "error",
448
- repo: row.repo,
449
- path: row.path,
450
- rule: `metadata-v2:${issue.code}`,
451
- message: issue.field ? `${issue.field}: ${issue.message}` : issue.message,
452
- });
423
+ const metadataRows = await auditDocsMetadataRepository(name, view);
424
+ for (const row of metadataRows) {
425
+ for (const issue of row.issues.filter((entry) => entry.severity === "error")) {
426
+ violations.push({
427
+ severity: "error",
428
+ repo: row.repo,
429
+ path: row.path,
430
+ rule: `metadata-v2:${issue.code}`,
431
+ message: issue.field ? `${issue.field}: ${issue.message}` : issue.message,
432
+ });
433
+ }
453
434
  }
454
435
  }
455
436
 
@@ -1,4 +1,4 @@
1
- import { existsSync, readFileSync } from "node:fs";
1
+ import { existsSync } from "node:fs";
2
2
  import { join, relative, resolve } from "node:path";
3
3
  import { parseFrontmatter } from "./docs-frontmatter.ts";
4
4
  import { isManagedDocsMetadataFile, managedDocsMetadataType } from "./docs-metadata-managed.ts";
@@ -9,7 +9,11 @@ import {
9
9
  isDocsMetadataV2,
10
10
  validateDocsMetadataV2,
11
11
  } from "./docs-metadata-v2.ts";
12
- import { sh } from "./exec.ts";
12
+ import {
13
+ createDocsRepositoryView,
14
+ type DocsRepositorySource,
15
+ type DocsRepositoryView,
16
+ } from "./docs-repository-view.ts";
13
17
 
14
18
  let REPO_ROOT = "";
15
19
  let SUBMODULES: readonly string[] = [];
@@ -24,6 +28,7 @@ export function initDocsMetadataAuditContext(opts: {
24
28
 
25
29
  export interface DocsMetadataAuditOpts {
26
30
  repo?: string;
31
+ source?: DocsRepositorySource;
27
32
  }
28
33
 
29
34
  export type DocsMetadataAuditState = "valid" | "invalid" | "legacy" | "missing";
@@ -40,20 +45,12 @@ function isInitializedRepo(path: string): boolean {
40
45
  return existsSync(join(path, ".git"));
41
46
  }
42
47
 
43
- async function trackedMarkdownFiles(repoPath: string): Promise<string[]> {
44
- const result = await sh('git ls-files --cached "**/*.md" "*.md"', { cwd: repoPath });
45
- if (result.exitCode !== 0 || !result.stdout.trim()) return [];
46
- return result.stdout
47
- .trim()
48
- .split("\n")
49
- .filter((path) => path.endsWith(".md"));
50
- }
51
-
52
- function auditFile(repoName: string, repoPath: string, path: string): DocsMetadataAuditRow | null {
53
- let content: string;
54
- try {
55
- content = readFileSync(join(repoPath, path), "utf8");
56
- } catch {
48
+ function auditFile(
49
+ repoName: string,
50
+ path: string,
51
+ content: string | undefined,
52
+ ): DocsMetadataAuditRow | null {
53
+ if (content === undefined) {
57
54
  return {
58
55
  repo: repoName,
59
56
  path: join(repoName === "(root)" ? "" : repoName, path),
@@ -105,6 +102,17 @@ function auditFile(repoName: string, repoPath: string, path: string): DocsMetada
105
102
  };
106
103
  }
107
104
 
105
+ export async function auditDocsMetadataRepository(
106
+ repoName: string,
107
+ view: DocsRepositoryView,
108
+ ): Promise<DocsMetadataAuditRow[]> {
109
+ const files = view.trackedPaths.filter((path) => path.endsWith(".md"));
110
+ const texts = await view.readTexts(files);
111
+ return files
112
+ .map((path) => auditFile(repoName, path, texts.get(path)))
113
+ .filter((row): row is DocsMetadataAuditRow => row !== null);
114
+ }
115
+
108
116
  export async function runDocsMetadataAudit(
109
117
  opts: DocsMetadataAuditOpts,
110
118
  ): Promise<DocsMetadataAuditRow[]> {
@@ -120,11 +128,8 @@ export async function runDocsMetadataAudit(
120
128
 
121
129
  const rows: DocsMetadataAuditRow[] = [];
122
130
  for (const target of selected) {
123
- const files = await trackedMarkdownFiles(target.path);
124
- for (const path of files) {
125
- const row = auditFile(target.name, target.path, path);
126
- if (row) rows.push(row);
127
- }
131
+ const view = await createDocsRepositoryView(target.path, opts.source ?? "worktree");
132
+ rows.push(...(await auditDocsMetadataRepository(target.name, view)));
128
133
  }
129
134
 
130
135
  return rows.sort((a, b) => a.path.localeCompare(b.path));
@@ -4,6 +4,7 @@ import { dump as dumpYaml, JSON_SCHEMA } from "js-yaml";
4
4
  import { parseFrontmatter } from "./docs-frontmatter.ts";
5
5
  import { managedDocsMetadataType } from "./docs-metadata-managed.ts";
6
6
  import { isDocsMetadataV2, validateDocsMetadataV2 } from "./docs-metadata-v2.ts";
7
+ import { createDocsRepositoryView } from "./docs-repository-view.ts";
7
8
  import { sh } from "./exec.ts";
8
9
 
9
10
  let REPO_ROOT = "";
@@ -21,6 +22,7 @@ export interface DocsMetadataSyncOpts {
21
22
  repo?: string;
22
23
  files?: string[];
23
24
  check?: boolean;
25
+ cached?: boolean;
24
26
  reviewed?: boolean;
25
27
  now?: string;
26
28
  }
@@ -49,15 +51,27 @@ function targets(repo?: string): Target[] {
49
51
  return selected;
50
52
  }
51
53
 
52
- async function changedFiles(target: Target, explicit: string[]): Promise<string[]> {
53
- if (explicit.length > 0) return explicit;
54
- const result = await sh("git diff --cached --name-only --diff-filter=ACMR -- '*.md'", {
55
- cwd: target.path,
56
- });
57
- if (result.exitCode !== 0) throw new Error(result.stderr || "git diff failed");
54
+ async function gitMarkdownPaths(target: Target, command: string): Promise<string[]> {
55
+ const result = await sh(command, { cwd: target.path });
56
+ if (result.exitCode !== 0) throw new Error(result.stderr || `${command} failed`);
58
57
  return result.stdout.split("\n").filter(Boolean);
59
58
  }
60
59
 
60
+ async function changedFiles(target: Target, explicit: string[], check: boolean): Promise<string[]> {
61
+ if (explicit.length > 0) return explicit;
62
+ const staged = await gitMarkdownPaths(
63
+ target,
64
+ "git diff --cached --name-only --diff-filter=ACMR -- '*.md'",
65
+ );
66
+ if (check) return staged;
67
+
68
+ const [unstaged, untracked] = await Promise.all([
69
+ gitMarkdownPaths(target, "git diff --name-only --diff-filter=ACMR -- '*.md'"),
70
+ gitMarkdownPaths(target, "git ls-files --others --exclude-standard -- '*.md'"),
71
+ ]);
72
+ return [...new Set([...staged, ...unstaged, ...untracked])];
73
+ }
74
+
61
75
  async function headContent(target: Target, path: string): Promise<string | null> {
62
76
  const result = await sh(`git show HEAD:${JSON.stringify(path)}`, { cwd: target.path });
63
77
  return result.exitCode === 0 ? result.stdout : null;
@@ -107,13 +121,22 @@ function addDays(value: string, days: number): string {
107
121
  export async function runDocsMetadataSync(
108
122
  opts: DocsMetadataSyncOpts,
109
123
  ): Promise<DocsMetadataSyncRow[]> {
124
+ if (opts.cached && !opts.check) {
125
+ throw new Error("--cached requires --check because Git index validation is read-only");
126
+ }
110
127
  const now = opts.now ?? new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
111
128
  const rows: DocsMetadataSyncRow[] = [];
112
129
  for (const target of targets(opts.repo)) {
113
- for (const path of await changedFiles(target, opts.files ?? [])) {
130
+ const paths = await changedFiles(target, opts.files ?? [], opts.check ?? false);
131
+ const cachedView = opts.cached ? await createDocsRepositoryView(target.path, "index") : null;
132
+ const cachedTexts = cachedView ? await cachedView.readTexts(paths) : null;
133
+ for (const path of paths) {
114
134
  const full = join(target.path, path);
115
- if (!existsSync(full)) continue;
116
- const currentText = readFileSync(full, "utf8");
135
+ if (cachedView ? !cachedView.has(path) : !existsSync(full)) continue;
136
+ const currentText = cachedView ? cachedTexts?.get(path) : readFileSync(full, "utf8");
137
+ if (currentText === undefined) {
138
+ throw new Error(`Git index content could not be read for ${path}`);
139
+ }
117
140
  const current = parseFrontmatter(currentText);
118
141
  if (!managedDocsMetadataType(path, current.data, current.raw !== null)) continue;
119
142
  if (!isDocsMetadataV2(current.data)) {
@@ -0,0 +1,220 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
3
+ import { basename, dirname, join } from "node:path";
4
+ import { exec } from "./exec.ts";
5
+
6
+ export type DocsRepositorySource = "worktree" | "index";
7
+
8
+ interface IndexEntry {
9
+ oid: string;
10
+ stage: number;
11
+ }
12
+
13
+ /**
14
+ * One coherent repository view for documentation commands.
15
+ *
16
+ * Worktree mode preserves the interactive commands' existing behavior. Index
17
+ * mode reads both path membership and file bytes through Git, so a pre-commit
18
+ * hook validates the exact index Git handed to it. During a path-scoped commit,
19
+ * Git exposes its temporary partial-commit index through GIT_INDEX_FILE; the
20
+ * view deliberately inherits that environment instead of rediscovering the
21
+ * shared working tree.
22
+ */
23
+ export interface DocsRepositoryView {
24
+ readonly root: string;
25
+ readonly source: DocsRepositorySource;
26
+ readonly trackedPaths: readonly string[];
27
+ has(path: string): boolean;
28
+ directFileNames(directory: string): string[];
29
+ readTexts(paths: readonly string[]): Promise<Map<string, string>>;
30
+ byteLength(path: string): Promise<number | null>;
31
+ }
32
+
33
+ function normalize(path: string): string {
34
+ return path.replaceAll("\\", "/").replace(/^\.\//, "");
35
+ }
36
+
37
+ function trackedPathList(stdout: string): string[] {
38
+ return stdout.split("\0").map(normalize).filter(Boolean);
39
+ }
40
+
41
+ async function worktreePaths(root: string): Promise<string[]> {
42
+ const result = await exec(["git", "ls-files", "--cached", "-z"], { cwd: root, trim: false });
43
+ if (result.exitCode !== 0) {
44
+ // Worktree lint historically supports non-repository fixtures and simply
45
+ // has no tracked-file checks to run there. Index mode remains strict.
46
+ return [];
47
+ }
48
+ return trackedPathList(result.stdout);
49
+ }
50
+
51
+ async function indexEntries(root: string): Promise<Map<string, IndexEntry>> {
52
+ const result = await exec(["git", "ls-files", "--cached", "--stage", "-z"], {
53
+ cwd: root,
54
+ trim: false,
55
+ });
56
+ if (result.exitCode !== 0) {
57
+ throw new Error(result.stderr || "git ls-files --stage failed");
58
+ }
59
+
60
+ const entries = new Map<string, IndexEntry>();
61
+ for (const record of result.stdout.split("\0").filter(Boolean)) {
62
+ const tab = record.indexOf("\t");
63
+ if (tab === -1) throw new Error(`invalid git ls-files --stage record: ${record}`);
64
+ const [mode, oid, stageText] = record.slice(0, tab).split(" ");
65
+ const path = normalize(record.slice(tab + 1));
66
+ const stage = Number.parseInt(stageText ?? "", 10);
67
+ if (!mode || !oid || !Number.isInteger(stage)) {
68
+ throw new Error(`invalid git ls-files --stage record for ${path}`);
69
+ }
70
+ if (stage !== 0) {
71
+ throw new Error(`cannot validate an index with unmerged entry: ${path}`);
72
+ }
73
+ entries.set(path, { oid, stage });
74
+ }
75
+ return entries;
76
+ }
77
+
78
+ function parseBatch(stdout: Buffer, requested: readonly string[]): Map<string, Buffer> {
79
+ const blobs = new Map<string, Buffer>();
80
+ let offset = 0;
81
+ for (const oid of requested) {
82
+ const newline = stdout.indexOf(0x0a, offset);
83
+ if (newline === -1) throw new Error(`git cat-file omitted the header for ${oid}`);
84
+ const header = stdout.subarray(offset, newline).toString("utf8");
85
+ offset = newline + 1;
86
+ const [reportedOid, type, sizeText] = header.split(" ");
87
+ const size = Number.parseInt(sizeText ?? "", 10);
88
+ if (reportedOid !== oid || type !== "blob" || !Number.isInteger(size) || size < 0) {
89
+ throw new Error(`git cat-file returned an invalid blob header for ${oid}: ${header}`);
90
+ }
91
+ const end = offset + size;
92
+ if (end > stdout.length) throw new Error(`git cat-file truncated blob ${oid}`);
93
+ blobs.set(oid, stdout.subarray(offset, end));
94
+ offset = end;
95
+ if (stdout[offset] !== 0x0a) throw new Error(`git cat-file omitted the separator for ${oid}`);
96
+ offset += 1;
97
+ }
98
+ return blobs;
99
+ }
100
+
101
+ function readIndexBlobs(root: string, oids: readonly string[]): Promise<Map<string, Buffer>> {
102
+ const unique = [...new Set(oids)];
103
+ if (unique.length === 0) return Promise.resolve(new Map());
104
+
105
+ return new Promise((resolveResult, rejectResult) => {
106
+ const process = spawn("git", ["cat-file", "--batch"], {
107
+ cwd: root,
108
+ env: { ...globalThis.process.env },
109
+ stdio: ["pipe", "pipe", "pipe"],
110
+ });
111
+ const stdout: Buffer[] = [];
112
+ const stderr: Buffer[] = [];
113
+ const timer = setTimeout(() => process.kill(), 30_000);
114
+ process.stdout.on("data", (chunk: Buffer) => stdout.push(chunk));
115
+ process.stderr.on("data", (chunk: Buffer) => stderr.push(chunk));
116
+ process.on("error", (error) => {
117
+ clearTimeout(timer);
118
+ rejectResult(error);
119
+ });
120
+ process.on("close", (code) => {
121
+ clearTimeout(timer);
122
+ if (code !== 0) {
123
+ rejectResult(
124
+ new Error(Buffer.concat(stderr).toString("utf8").trim() || "git cat-file failed"),
125
+ );
126
+ return;
127
+ }
128
+ try {
129
+ resolveResult(parseBatch(Buffer.concat(stdout), unique));
130
+ } catch (error) {
131
+ rejectResult(error);
132
+ }
133
+ });
134
+ process.stdin.end(`${unique.join("\n")}\n`);
135
+ });
136
+ }
137
+
138
+ function directIndexFiles(paths: readonly string[], directory: string): string[] {
139
+ const normalizedDirectory = normalize(directory).replace(/\/$/, "");
140
+ return paths
141
+ .filter((path) => normalize(dirname(path)) === normalizedDirectory)
142
+ .map((path) => basename(path));
143
+ }
144
+
145
+ export async function createDocsRepositoryView(
146
+ root: string,
147
+ source: DocsRepositorySource = "worktree",
148
+ ): Promise<DocsRepositoryView> {
149
+ if (source === "worktree") {
150
+ const trackedPaths = await worktreePaths(root);
151
+ return {
152
+ root,
153
+ source,
154
+ trackedPaths,
155
+ has: (path) => existsSync(join(root, path)),
156
+ directFileNames: (directory) => {
157
+ try {
158
+ return readdirSync(join(root, directory)).filter((entry) => {
159
+ try {
160
+ return statSync(join(root, directory, entry)).isFile();
161
+ } catch {
162
+ return false;
163
+ }
164
+ });
165
+ } catch {
166
+ return [];
167
+ }
168
+ },
169
+ readTexts: async (paths) => {
170
+ const texts = new Map<string, string>();
171
+ for (const path of paths) {
172
+ try {
173
+ texts.set(path, readFileSync(join(root, path), "utf8"));
174
+ } catch {
175
+ // The caller decides whether a missing tracked path is a finding.
176
+ }
177
+ }
178
+ return texts;
179
+ },
180
+ byteLength: async (path) => {
181
+ try {
182
+ return statSync(join(root, path)).size;
183
+ } catch {
184
+ return null;
185
+ }
186
+ },
187
+ };
188
+ }
189
+
190
+ const entries = await indexEntries(root);
191
+ const trackedPaths = [...entries.keys()];
192
+ const textCache = new Map<string, string>();
193
+ const loadTexts = async (paths: readonly string[]): Promise<Map<string, string>> => {
194
+ const wanted = [...new Set(paths.map(normalize))].filter((path) => entries.has(path));
195
+ const missing = wanted.filter((path) => !textCache.has(path));
196
+ const oids = missing.map((path) => entries.get(path)!.oid);
197
+ const blobs = await readIndexBlobs(root, oids);
198
+ for (const path of missing) {
199
+ const blob = blobs.get(entries.get(path)!.oid);
200
+ if (blob) textCache.set(path, blob.toString("utf8"));
201
+ }
202
+ return new Map(
203
+ wanted.flatMap((path) => (textCache.has(path) ? [[path, textCache.get(path)!]] : [])),
204
+ );
205
+ };
206
+
207
+ return {
208
+ root,
209
+ source,
210
+ trackedPaths,
211
+ has: (path) => entries.has(normalize(path)),
212
+ directFileNames: (directory) => directIndexFiles(trackedPaths, directory),
213
+ readTexts: loadTexts,
214
+ byteLength: async (path) => {
215
+ const normalized = normalize(path);
216
+ const text = (await loadTexts([normalized])).get(normalized);
217
+ return text === undefined ? null : Buffer.byteLength(text, "utf8");
218
+ },
219
+ };
220
+ }