@cairn-tool/cairn 2.0.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 (526) hide show
  1. package/.markdownlintrc +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1431 -0
  4. package/dist/agent/audit/baseline.d.ts +69 -0
  5. package/dist/agent/audit/baseline.js +128 -0
  6. package/dist/agent/audit/baseline.js.map +1 -0
  7. package/dist/agent/audit/index.d.ts +126 -0
  8. package/dist/agent/audit/index.js +625 -0
  9. package/dist/agent/audit/index.js.map +1 -0
  10. package/dist/agent/import/detect.d.ts +49 -0
  11. package/dist/agent/import/detect.js +159 -0
  12. package/dist/agent/import/detect.js.map +1 -0
  13. package/dist/agent/import/normalize.d.ts +72 -0
  14. package/dist/agent/import/normalize.js +475 -0
  15. package/dist/agent/import/normalize.js.map +1 -0
  16. package/dist/agent/install/index.d.ts +211 -0
  17. package/dist/agent/install/index.js +907 -0
  18. package/dist/agent/install/index.js.map +1 -0
  19. package/dist/agent/manifest.d.ts +75 -0
  20. package/dist/agent/manifest.js +210 -0
  21. package/dist/agent/manifest.js.map +1 -0
  22. package/dist/agent/marketplace/index.d.ts +69 -0
  23. package/dist/agent/marketplace/index.js +212 -0
  24. package/dist/agent/marketplace/index.js.map +1 -0
  25. package/dist/agent/marketplace/spec.d.ts +48 -0
  26. package/dist/agent/marketplace/spec.js +237 -0
  27. package/dist/agent/marketplace/spec.js.map +1 -0
  28. package/dist/agent/output.d.ts +36 -0
  29. package/dist/agent/output.js +56 -0
  30. package/dist/agent/output.js.map +1 -0
  31. package/dist/agent/overlays.d.ts +38 -0
  32. package/dist/agent/overlays.js +223 -0
  33. package/dist/agent/overlays.js.map +1 -0
  34. package/dist/agent/package/index.d.ts +105 -0
  35. package/dist/agent/package/index.js +339 -0
  36. package/dist/agent/package/index.js.map +1 -0
  37. package/dist/agent/package/tar.d.ts +36 -0
  38. package/dist/agent/package/tar.js +137 -0
  39. package/dist/agent/package/tar.js.map +1 -0
  40. package/dist/agent/parser.d.ts +13 -0
  41. package/dist/agent/parser.js +559 -0
  42. package/dist/agent/parser.js.map +1 -0
  43. package/dist/agent/render.d.ts +16 -0
  44. package/dist/agent/render.js +721 -0
  45. package/dist/agent/render.js.map +1 -0
  46. package/dist/agent/sarif.d.ts +18 -0
  47. package/dist/agent/sarif.js +56 -0
  48. package/dist/agent/sarif.js.map +1 -0
  49. package/dist/agent/scaffold.d.ts +86 -0
  50. package/dist/agent/scaffold.js +250 -0
  51. package/dist/agent/scaffold.js.map +1 -0
  52. package/dist/agent/targets/antigravity.d.ts +17 -0
  53. package/dist/agent/targets/antigravity.js +218 -0
  54. package/dist/agent/targets/antigravity.js.map +1 -0
  55. package/dist/agent/targets/claude-code.d.ts +2 -0
  56. package/dist/agent/targets/claude-code.js +220 -0
  57. package/dist/agent/targets/claude-code.js.map +1 -0
  58. package/dist/agent/targets/codex.d.ts +2 -0
  59. package/dist/agent/targets/codex.js +212 -0
  60. package/dist/agent/targets/codex.js.map +1 -0
  61. package/dist/agent/targets/cursor.d.ts +2 -0
  62. package/dist/agent/targets/cursor.js +210 -0
  63. package/dist/agent/targets/cursor.js.map +1 -0
  64. package/dist/agent/targets/index.d.ts +31 -0
  65. package/dist/agent/targets/index.js +64 -0
  66. package/dist/agent/targets/index.js.map +1 -0
  67. package/dist/agent/targets/opencode.d.ts +15 -0
  68. package/dist/agent/targets/opencode.js +215 -0
  69. package/dist/agent/targets/opencode.js.map +1 -0
  70. package/dist/agent/targets/schema.d.ts +315 -0
  71. package/dist/agent/targets/schema.js +179 -0
  72. package/dist/agent/targets/schema.js.map +1 -0
  73. package/dist/agent/test/assert.d.ts +46 -0
  74. package/dist/agent/test/assert.js +288 -0
  75. package/dist/agent/test/assert.js.map +1 -0
  76. package/dist/agent/test/index.d.ts +73 -0
  77. package/dist/agent/test/index.js +181 -0
  78. package/dist/agent/test/index.js.map +1 -0
  79. package/dist/agent/test/schema.d.ts +81 -0
  80. package/dist/agent/test/schema.js +235 -0
  81. package/dist/agent/test/schema.js.map +1 -0
  82. package/dist/agent/types.d.ts +204 -0
  83. package/dist/agent/types.js +11 -0
  84. package/dist/agent/types.js.map +1 -0
  85. package/dist/agent/upgrade.d.ts +29 -0
  86. package/dist/agent/upgrade.js +72 -0
  87. package/dist/agent/upgrade.js.map +1 -0
  88. package/dist/agent/writer.d.ts +30 -0
  89. package/dist/agent/writer.js +73 -0
  90. package/dist/agent/writer.js.map +1 -0
  91. package/dist/archive/db.d.ts +20 -0
  92. package/dist/archive/db.js +98 -0
  93. package/dist/archive/db.js.map +1 -0
  94. package/dist/archive/progress.d.ts +62 -0
  95. package/dist/archive/progress.js +151 -0
  96. package/dist/archive/progress.js.map +1 -0
  97. package/dist/archive/query.d.ts +86 -0
  98. package/dist/archive/query.js +241 -0
  99. package/dist/archive/query.js.map +1 -0
  100. package/dist/archive/run.d.ts +91 -0
  101. package/dist/archive/run.js +331 -0
  102. package/dist/archive/run.js.map +1 -0
  103. package/dist/archive/segments.d.ts +89 -0
  104. package/dist/archive/segments.js +144 -0
  105. package/dist/archive/segments.js.map +1 -0
  106. package/dist/archive/sets.d.ts +58 -0
  107. package/dist/archive/sets.js +344 -0
  108. package/dist/archive/sets.js.map +1 -0
  109. package/dist/archive/tar-read.d.ts +35 -0
  110. package/dist/archive/tar-read.js +90 -0
  111. package/dist/archive/tar-read.js.map +1 -0
  112. package/dist/audit-baseline.d.ts +66 -0
  113. package/dist/audit-baseline.js +124 -0
  114. package/dist/audit-baseline.js.map +1 -0
  115. package/dist/automation.d.ts +16 -0
  116. package/dist/automation.js +38 -0
  117. package/dist/automation.js.map +1 -0
  118. package/dist/backlinks.d.ts +15 -0
  119. package/dist/backlinks.js +30 -0
  120. package/dist/backlinks.js.map +1 -0
  121. package/dist/checkers/katex.d.ts +3 -0
  122. package/dist/checkers/katex.js +71 -0
  123. package/dist/checkers/katex.js.map +1 -0
  124. package/dist/checkers/markdown-lint.d.ts +28 -0
  125. package/dist/checkers/markdown-lint.js +53 -0
  126. package/dist/checkers/markdown-lint.js.map +1 -0
  127. package/dist/checkers/mermaid.d.ts +6 -0
  128. package/dist/checkers/mermaid.js +53 -0
  129. package/dist/checkers/mermaid.js.map +1 -0
  130. package/dist/checkers/references.d.ts +3 -0
  131. package/dist/checkers/references.js +55 -0
  132. package/dist/checkers/references.js.map +1 -0
  133. package/dist/cli.d.ts +2 -0
  134. package/dist/cli.js +1117 -0
  135. package/dist/cli.js.map +1 -0
  136. package/dist/command-result.d.ts +6 -0
  137. package/dist/command-result.js +13 -0
  138. package/dist/command-result.js.map +1 -0
  139. package/dist/commands/agent-audit.d.ts +21 -0
  140. package/dist/commands/agent-audit.js +119 -0
  141. package/dist/commands/agent-audit.js.map +1 -0
  142. package/dist/commands/agent-doctor.d.ts +25 -0
  143. package/dist/commands/agent-doctor.js +217 -0
  144. package/dist/commands/agent-doctor.js.map +1 -0
  145. package/dist/commands/agent-import.d.ts +21 -0
  146. package/dist/commands/agent-import.js +212 -0
  147. package/dist/commands/agent-import.js.map +1 -0
  148. package/dist/commands/agent-install.d.ts +18 -0
  149. package/dist/commands/agent-install.js +59 -0
  150. package/dist/commands/agent-install.js.map +1 -0
  151. package/dist/commands/agent-installed.d.ts +6 -0
  152. package/dist/commands/agent-installed.js +17 -0
  153. package/dist/commands/agent-installed.js.map +1 -0
  154. package/dist/commands/agent-marketplace.d.ts +11 -0
  155. package/dist/commands/agent-marketplace.js +178 -0
  156. package/dist/commands/agent-marketplace.js.map +1 -0
  157. package/dist/commands/agent-package.d.ts +16 -0
  158. package/dist/commands/agent-package.js +159 -0
  159. package/dist/commands/agent-package.js.map +1 -0
  160. package/dist/commands/agent-scaffold.d.ts +17 -0
  161. package/dist/commands/agent-scaffold.js +181 -0
  162. package/dist/commands/agent-scaffold.js.map +1 -0
  163. package/dist/commands/agent-specs.d.ts +7 -0
  164. package/dist/commands/agent-specs.js +20 -0
  165. package/dist/commands/agent-specs.js.map +1 -0
  166. package/dist/commands/agent-test.d.ts +21 -0
  167. package/dist/commands/agent-test.js +50 -0
  168. package/dist/commands/agent-test.js.map +1 -0
  169. package/dist/commands/agent-uninstall.d.ts +6 -0
  170. package/dist/commands/agent-uninstall.js +45 -0
  171. package/dist/commands/agent-uninstall.js.map +1 -0
  172. package/dist/commands/agent-upgrade.d.ts +5 -0
  173. package/dist/commands/agent-upgrade.js +105 -0
  174. package/dist/commands/agent-upgrade.js.map +1 -0
  175. package/dist/commands/agent.d.ts +27 -0
  176. package/dist/commands/agent.js +549 -0
  177. package/dist/commands/agent.js.map +1 -0
  178. package/dist/commands/archive.d.ts +47 -0
  179. package/dist/commands/archive.js +311 -0
  180. package/dist/commands/archive.js.map +1 -0
  181. package/dist/commands/audit.d.ts +25 -0
  182. package/dist/commands/audit.js +325 -0
  183. package/dist/commands/audit.js.map +1 -0
  184. package/dist/commands/check-snippets.d.ts +58 -0
  185. package/dist/commands/check-snippets.js +247 -0
  186. package/dist/commands/check-snippets.js.map +1 -0
  187. package/dist/commands/check-urls.d.ts +52 -0
  188. package/dist/commands/check-urls.js +205 -0
  189. package/dist/commands/check-urls.js.map +1 -0
  190. package/dist/commands/code-blocks.d.ts +8 -0
  191. package/dist/commands/code-blocks.js +66 -0
  192. package/dist/commands/code-blocks.js.map +1 -0
  193. package/dist/commands/completion.d.ts +15 -0
  194. package/dist/commands/completion.js +20 -0
  195. package/dist/commands/completion.js.map +1 -0
  196. package/dist/commands/context.d.ts +16 -0
  197. package/dist/commands/context.js +131 -0
  198. package/dist/commands/context.js.map +1 -0
  199. package/dist/commands/describe.d.ts +12 -0
  200. package/dist/commands/describe.js +62 -0
  201. package/dist/commands/describe.js.map +1 -0
  202. package/dist/commands/diff.d.ts +11 -0
  203. package/dist/commands/diff.js +185 -0
  204. package/dist/commands/diff.js.map +1 -0
  205. package/dist/commands/fix.d.ts +59 -0
  206. package/dist/commands/fix.js +173 -0
  207. package/dist/commands/fix.js.map +1 -0
  208. package/dist/commands/frontmatter.d.ts +7 -0
  209. package/dist/commands/frontmatter.js +84 -0
  210. package/dist/commands/frontmatter.js.map +1 -0
  211. package/dist/commands/graph.d.ts +12 -0
  212. package/dist/commands/graph.js +122 -0
  213. package/dist/commands/graph.js.map +1 -0
  214. package/dist/commands/headers.d.ts +7 -0
  215. package/dist/commands/headers.js +48 -0
  216. package/dist/commands/headers.js.map +1 -0
  217. package/dist/commands/index.d.ts +8 -0
  218. package/dist/commands/index.js +32 -0
  219. package/dist/commands/index.js.map +1 -0
  220. package/dist/commands/links.d.ts +9 -0
  221. package/dist/commands/links.js +123 -0
  222. package/dist/commands/links.js.map +1 -0
  223. package/dist/commands/lint-dir.d.ts +15 -0
  224. package/dist/commands/lint-dir.js +156 -0
  225. package/dist/commands/lint-dir.js.map +1 -0
  226. package/dist/commands/lint.d.ts +14 -0
  227. package/dist/commands/lint.js +45 -0
  228. package/dist/commands/lint.js.map +1 -0
  229. package/dist/commands/orphans.d.ts +10 -0
  230. package/dist/commands/orphans.js +74 -0
  231. package/dist/commands/orphans.js.map +1 -0
  232. package/dist/commands/outline.d.ts +7 -0
  233. package/dist/commands/outline.js +54 -0
  234. package/dist/commands/outline.js.map +1 -0
  235. package/dist/commands/query.d.ts +18 -0
  236. package/dist/commands/query.js +341 -0
  237. package/dist/commands/query.js.map +1 -0
  238. package/dist/commands/refs-to.d.ts +8 -0
  239. package/dist/commands/refs-to.js +65 -0
  240. package/dist/commands/refs-to.js.map +1 -0
  241. package/dist/commands/refs.d.ts +10 -0
  242. package/dist/commands/refs.js +103 -0
  243. package/dist/commands/refs.js.map +1 -0
  244. package/dist/commands/rename-file.d.ts +16 -0
  245. package/dist/commands/rename-file.js +215 -0
  246. package/dist/commands/rename-file.js.map +1 -0
  247. package/dist/commands/rename-heading.d.ts +10 -0
  248. package/dist/commands/rename-heading.js +182 -0
  249. package/dist/commands/rename-heading.js.map +1 -0
  250. package/dist/commands/schema.d.ts +10 -0
  251. package/dist/commands/schema.js +34 -0
  252. package/dist/commands/schema.js.map +1 -0
  253. package/dist/commands/scripts.d.ts +59 -0
  254. package/dist/commands/scripts.js +222 -0
  255. package/dist/commands/scripts.js.map +1 -0
  256. package/dist/commands/section.d.ts +9 -0
  257. package/dist/commands/section.js +49 -0
  258. package/dist/commands/section.js.map +1 -0
  259. package/dist/commands/serve.d.ts +6 -0
  260. package/dist/commands/serve.js +48 -0
  261. package/dist/commands/serve.js.map +1 -0
  262. package/dist/commands/stats.d.ts +6 -0
  263. package/dist/commands/stats.js +109 -0
  264. package/dist/commands/stats.js.map +1 -0
  265. package/dist/commands/structure.d.ts +6 -0
  266. package/dist/commands/structure.js +130 -0
  267. package/dist/commands/structure.js.map +1 -0
  268. package/dist/commands/tables.d.ts +8 -0
  269. package/dist/commands/tables.js +77 -0
  270. package/dist/commands/tables.js.map +1 -0
  271. package/dist/commands/tasks.d.ts +8 -0
  272. package/dist/commands/tasks.js +59 -0
  273. package/dist/commands/tasks.js.map +1 -0
  274. package/dist/commands/toc.d.ts +18 -0
  275. package/dist/commands/toc.js +105 -0
  276. package/dist/commands/toc.js.map +1 -0
  277. package/dist/commands/update-check.d.ts +36 -0
  278. package/dist/commands/update-check.js +119 -0
  279. package/dist/commands/update-check.js.map +1 -0
  280. package/dist/commands/usage.d.ts +56 -0
  281. package/dist/commands/usage.js +883 -0
  282. package/dist/commands/usage.js.map +1 -0
  283. package/dist/commands/validate-frontmatter.d.ts +13 -0
  284. package/dist/commands/validate-frontmatter.js +34 -0
  285. package/dist/commands/validate-frontmatter.js.map +1 -0
  286. package/dist/completion/model.d.ts +49 -0
  287. package/dist/completion/model.js +194 -0
  288. package/dist/completion/model.js.map +1 -0
  289. package/dist/completion/shells.d.ts +2 -0
  290. package/dist/completion/shells.js +280 -0
  291. package/dist/completion/shells.js.map +1 -0
  292. package/dist/config-schema.d.ts +15 -0
  293. package/dist/config-schema.js +44 -0
  294. package/dist/config-schema.js.map +1 -0
  295. package/dist/config.d.ts +102 -0
  296. package/dist/config.js +614 -0
  297. package/dist/config.js.map +1 -0
  298. package/dist/context.d.ts +106 -0
  299. package/dist/context.js +202 -0
  300. package/dist/context.js.map +1 -0
  301. package/dist/contract/describe.d.ts +84 -0
  302. package/dist/contract/describe.js +104 -0
  303. package/dist/contract/describe.js.map +1 -0
  304. package/dist/contract/registry.d.ts +2 -0
  305. package/dist/contract/registry.js +622 -0
  306. package/dist/contract/registry.js.map +1 -0
  307. package/dist/contract/schemas/agent.d.ts +2 -0
  308. package/dist/contract/schemas/agent.js +572 -0
  309. package/dist/contract/schemas/agent.js.map +1 -0
  310. package/dist/contract/schemas/archive.d.ts +3 -0
  311. package/dist/contract/schemas/archive.js +227 -0
  312. package/dist/contract/schemas/archive.js.map +1 -0
  313. package/dist/contract/schemas/index.d.ts +11 -0
  314. package/dist/contract/schemas/index.js +49 -0
  315. package/dist/contract/schemas/index.js.map +1 -0
  316. package/dist/contract/schemas/markdown.d.ts +15 -0
  317. package/dist/contract/schemas/markdown.js +1035 -0
  318. package/dist/contract/schemas/markdown.js.map +1 -0
  319. package/dist/contract/schemas/meta.d.ts +5 -0
  320. package/dist/contract/schemas/meta.js +233 -0
  321. package/dist/contract/schemas/meta.js.map +1 -0
  322. package/dist/contract/schemas/scripts.d.ts +4 -0
  323. package/dist/contract/schemas/scripts.js +183 -0
  324. package/dist/contract/schemas/scripts.js.map +1 -0
  325. package/dist/contract/schemas/shared.d.ts +11 -0
  326. package/dist/contract/schemas/shared.js +26 -0
  327. package/dist/contract/schemas/shared.js.map +1 -0
  328. package/dist/contract/schemas/usage.d.ts +6 -0
  329. package/dist/contract/schemas/usage.js +489 -0
  330. package/dist/contract/schemas/usage.js.map +1 -0
  331. package/dist/contract/types.d.ts +63 -0
  332. package/dist/contract/types.js +2 -0
  333. package/dist/contract/types.js.map +1 -0
  334. package/dist/contract/version.d.ts +20 -0
  335. package/dist/contract/version.js +21 -0
  336. package/dist/contract/version.js.map +1 -0
  337. package/dist/diff.d.ts +156 -0
  338. package/dist/diff.js +500 -0
  339. package/dist/diff.js.map +1 -0
  340. package/dist/edit-plan.d.ts +133 -0
  341. package/dist/edit-plan.js +245 -0
  342. package/dist/edit-plan.js.map +1 -0
  343. package/dist/fix/markdownlint-fixer.d.ts +34 -0
  344. package/dist/fix/markdownlint-fixer.js +125 -0
  345. package/dist/fix/markdownlint-fixer.js.map +1 -0
  346. package/dist/fix/registry.d.ts +48 -0
  347. package/dist/fix/registry.js +28 -0
  348. package/dist/fix/registry.js.map +1 -0
  349. package/dist/fix/relative-links-fixer.d.ts +21 -0
  350. package/dist/fix/relative-links-fixer.js +96 -0
  351. package/dist/fix/relative-links-fixer.js.map +1 -0
  352. package/dist/fix/snippets-fixer.d.ts +2 -0
  353. package/dist/fix/snippets-fixer.js +64 -0
  354. package/dist/fix/snippets-fixer.js.map +1 -0
  355. package/dist/fix/toc-fixer.d.ts +2 -0
  356. package/dist/fix/toc-fixer.js +94 -0
  357. package/dist/fix/toc-fixer.js.map +1 -0
  358. package/dist/formats.d.ts +22 -0
  359. package/dist/formats.js +34 -0
  360. package/dist/formats.js.map +1 -0
  361. package/dist/formatters.d.ts +11 -0
  362. package/dist/formatters.js +48 -0
  363. package/dist/formatters.js.map +1 -0
  364. package/dist/frontmatter-validation.d.ts +11 -0
  365. package/dist/frontmatter-validation.js +188 -0
  366. package/dist/frontmatter-validation.js.map +1 -0
  367. package/dist/git.d.ts +40 -0
  368. package/dist/git.js +124 -0
  369. package/dist/git.js.map +1 -0
  370. package/dist/graph.d.ts +50 -0
  371. package/dist/graph.js +200 -0
  372. package/dist/graph.js.map +1 -0
  373. package/dist/input-selection.d.ts +9 -0
  374. package/dist/input-selection.js +122 -0
  375. package/dist/input-selection.js.map +1 -0
  376. package/dist/input.d.ts +2 -0
  377. package/dist/input.js +32 -0
  378. package/dist/input.js.map +1 -0
  379. package/dist/link-target.d.ts +39 -0
  380. package/dist/link-target.js +68 -0
  381. package/dist/link-target.js.map +1 -0
  382. package/dist/lint.d.ts +13 -0
  383. package/dist/lint.js +27 -0
  384. package/dist/lint.js.map +1 -0
  385. package/dist/markdown-ast.d.ts +73 -0
  386. package/dist/markdown-ast.js +187 -0
  387. package/dist/markdown-ast.js.map +1 -0
  388. package/dist/object-path.d.ts +14 -0
  389. package/dist/object-path.js +14 -0
  390. package/dist/object-path.js.map +1 -0
  391. package/dist/option-utils.d.ts +13 -0
  392. package/dist/option-utils.js +25 -0
  393. package/dist/option-utils.js.map +1 -0
  394. package/dist/outline.d.ts +16 -0
  395. package/dist/outline.js +32 -0
  396. package/dist/outline.js.map +1 -0
  397. package/dist/query/entities.d.ts +60 -0
  398. package/dist/query/entities.js +219 -0
  399. package/dist/query/entities.js.map +1 -0
  400. package/dist/query/execute.d.ts +22 -0
  401. package/dist/query/execute.js +0 -0
  402. package/dist/query/execute.js.map +1 -0
  403. package/dist/query/plan.d.ts +76 -0
  404. package/dist/query/plan.js +183 -0
  405. package/dist/query/plan.js.map +1 -0
  406. package/dist/query/render.d.ts +3 -0
  407. package/dist/query/render.js +39 -0
  408. package/dist/query/render.js.map +1 -0
  409. package/dist/refs.d.ts +19 -0
  410. package/dist/refs.js +10 -0
  411. package/dist/refs.js.map +1 -0
  412. package/dist/result.d.ts +49 -0
  413. package/dist/result.js +47 -0
  414. package/dist/result.js.map +1 -0
  415. package/dist/runtime.d.ts +35 -0
  416. package/dist/runtime.js +77 -0
  417. package/dist/runtime.js.map +1 -0
  418. package/dist/sarif.d.ts +36 -0
  419. package/dist/sarif.js +30 -0
  420. package/dist/sarif.js.map +1 -0
  421. package/dist/scripts/execute.d.ts +65 -0
  422. package/dist/scripts/execute.js +235 -0
  423. package/dist/scripts/execute.js.map +1 -0
  424. package/dist/scripts/registry.d.ts +55 -0
  425. package/dist/scripts/registry.js +103 -0
  426. package/dist/scripts/registry.js.map +1 -0
  427. package/dist/scripts/resolve.d.ts +90 -0
  428. package/dist/scripts/resolve.js +288 -0
  429. package/dist/scripts/resolve.js.map +1 -0
  430. package/dist/sections.d.ts +53 -0
  431. package/dist/sections.js +100 -0
  432. package/dist/sections.js.map +1 -0
  433. package/dist/serve/errors.d.ts +25 -0
  434. package/dist/serve/errors.js +45 -0
  435. package/dist/serve/errors.js.map +1 -0
  436. package/dist/serve/paths.d.ts +32 -0
  437. package/dist/serve/paths.js +71 -0
  438. package/dist/serve/paths.js.map +1 -0
  439. package/dist/serve/server.d.ts +31 -0
  440. package/dist/serve/server.js +123 -0
  441. package/dist/serve/server.js.map +1 -0
  442. package/dist/serve/tools.d.ts +19 -0
  443. package/dist/serve/tools.js +597 -0
  444. package/dist/serve/tools.js.map +1 -0
  445. package/dist/snippets.d.ts +184 -0
  446. package/dist/snippets.js +454 -0
  447. package/dist/snippets.js.map +1 -0
  448. package/dist/sqlite-store.d.ts +62 -0
  449. package/dist/sqlite-store.js +104 -0
  450. package/dist/sqlite-store.js.map +1 -0
  451. package/dist/sqlite.d.ts +59 -0
  452. package/dist/sqlite.js +51 -0
  453. package/dist/sqlite.js.map +1 -0
  454. package/dist/toc.d.ts +58 -0
  455. package/dist/toc.js +83 -0
  456. package/dist/toc.js.map +1 -0
  457. package/dist/types.d.ts +7 -0
  458. package/dist/types.js +2 -0
  459. package/dist/types.js.map +1 -0
  460. package/dist/update-notifier.d.ts +95 -0
  461. package/dist/update-notifier.js +301 -0
  462. package/dist/update-notifier.js.map +1 -0
  463. package/dist/url-cache.d.ts +14 -0
  464. package/dist/url-cache.js +70 -0
  465. package/dist/url-cache.js.map +1 -0
  466. package/dist/usage/aggregate.d.ts +107 -0
  467. package/dist/usage/aggregate.js +435 -0
  468. package/dist/usage/aggregate.js.map +1 -0
  469. package/dist/usage/db/index.d.ts +49 -0
  470. package/dist/usage/db/index.js +118 -0
  471. package/dist/usage/db/index.js.map +1 -0
  472. package/dist/usage/db/migrations.d.ts +29 -0
  473. package/dist/usage/db/migrations.js +38 -0
  474. package/dist/usage/db/migrations.js.map +1 -0
  475. package/dist/usage/db/open.d.ts +33 -0
  476. package/dist/usage/db/open.js +37 -0
  477. package/dist/usage/db/open.js.map +1 -0
  478. package/dist/usage/db/schema.d.ts +18 -0
  479. package/dist/usage/db/schema.js +147 -0
  480. package/dist/usage/db/schema.js.map +1 -0
  481. package/dist/usage/db/store.d.ts +74 -0
  482. package/dist/usage/db/store.js +280 -0
  483. package/dist/usage/db/store.js.map +1 -0
  484. package/dist/usage/events.d.ts +202 -0
  485. package/dist/usage/events.js +243 -0
  486. package/dist/usage/events.js.map +1 -0
  487. package/dist/usage/filter.d.ts +43 -0
  488. package/dist/usage/filter.js +97 -0
  489. package/dist/usage/filter.js.map +1 -0
  490. package/dist/usage/providers/antigravity.d.ts +2 -0
  491. package/dist/usage/providers/antigravity.js +431 -0
  492. package/dist/usage/providers/antigravity.js.map +1 -0
  493. package/dist/usage/providers/claude-code.d.ts +2 -0
  494. package/dist/usage/providers/claude-code.js +400 -0
  495. package/dist/usage/providers/claude-code.js.map +1 -0
  496. package/dist/usage/providers/codex.d.ts +2 -0
  497. package/dist/usage/providers/codex.js +387 -0
  498. package/dist/usage/providers/codex.js.map +1 -0
  499. package/dist/usage/providers/gemini-cli.d.ts +2 -0
  500. package/dist/usage/providers/gemini-cli.js +466 -0
  501. package/dist/usage/providers/gemini-cli.js.map +1 -0
  502. package/dist/usage/providers/index.d.ts +23 -0
  503. package/dist/usage/providers/index.js +46 -0
  504. package/dist/usage/providers/index.js.map +1 -0
  505. package/dist/usage/providers/opencode.d.ts +2 -0
  506. package/dist/usage/providers/opencode.js +422 -0
  507. package/dist/usage/providers/opencode.js.map +1 -0
  508. package/dist/usage/providers/protobuf.d.ts +35 -0
  509. package/dist/usage/providers/protobuf.js +125 -0
  510. package/dist/usage/providers/protobuf.js.map +1 -0
  511. package/dist/usage/providers/types.d.ts +74 -0
  512. package/dist/usage/providers/types.js +2 -0
  513. package/dist/usage/providers/types.js.map +1 -0
  514. package/dist/usage/scan.d.ts +54 -0
  515. package/dist/usage/scan.js +216 -0
  516. package/dist/usage/scan.js.map +1 -0
  517. package/dist/version.d.ts +2 -0
  518. package/dist/version.js +8 -0
  519. package/dist/version.js.map +1 -0
  520. package/dist/workspace-index.d.ts +39 -0
  521. package/dist/workspace-index.js +265 -0
  522. package/dist/workspace-index.js.map +1 -0
  523. package/dist/workspace.d.ts +89 -0
  524. package/dist/workspace.js +219 -0
  525. package/dist/workspace.js.map +1 -0
  526. package/package.json +92 -0
@@ -0,0 +1,301 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { spawn } from "node:child_process";
5
+ /** How long a cached result stays fresh. */
6
+ export const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
7
+ /** argv token that runs the detached cache refresh. Hidden from help. */
8
+ export const REFRESH_COMMAND = "__refresh-update-cache";
9
+ /** User-facing command that checks explicitly; suppresses the passive notice. */
10
+ export const CHECK_COMMAND = "check-update";
11
+ /**
12
+ * Contract-discovery commands. Their stdout is unconditionally a machine
13
+ * document, so a notice is never useful alongside them.
14
+ */
15
+ export const DESCRIBE_COMMAND = "describe";
16
+ export const SCHEMA_COMMAND = "schema";
17
+ export const COMPLETION_COMMAND = "completion";
18
+ /**
19
+ * `scripts run` hands its stderr to a child process, so a notice appended at exit
20
+ * would land inside whatever the calling hook captured.
21
+ */
22
+ export const SCRIPTS_COMMAND = "scripts";
23
+ export const SCRIPTS_RUN_SUBCOMMAND = "run";
24
+ /**
25
+ * The machine-stream guarantees, published through `describe` so consumers can
26
+ * read them rather than infer them. Exported from here, next to the gate that
27
+ * enforces them, so the two cannot drift.
28
+ */
29
+ export const NOTIFIER_CONTRACT = {
30
+ description: "The update notice is advisory only and never appears on a machine-readable stream.",
31
+ stream: "stderr",
32
+ suppressedWhen: [
33
+ "CAIRN_NO_UPDATE_NOTIFIER=1",
34
+ "CI is set",
35
+ "stderr is not a TTY",
36
+ "--format is json, jsonl, or sarif, including a project-configured format",
37
+ "the command is check-update, describe, schema, completion, scripts run, or the internal cache refresh",
38
+ ],
39
+ optOutEnv: "CAIRN_NO_UPDATE_NOTIFIER",
40
+ };
41
+ /**
42
+ * How long a held refresh lock is trusted. Must exceed the child's own fetch
43
+ * timeout so a working refresh is never treated as abandoned.
44
+ */
45
+ export const LOCK_STALE_MS = 60_000;
46
+ export function getCachePath(env = process.env, homedir) {
47
+ const home = homedir ?? os.homedir();
48
+ const xdg = env.XDG_CACHE_HOME?.trim();
49
+ const base = xdg && xdg.length > 0 ? xdg : path.join(home, ".cache");
50
+ return path.join(base, "cairn", "update-check.json");
51
+ }
52
+ export function readCache(cachePath) {
53
+ try {
54
+ const parsed = JSON.parse(fs.readFileSync(cachePath, "utf-8"));
55
+ if (typeof parsed !== "object" || parsed === null)
56
+ return null;
57
+ const { lastCheckedAt, latestVersion } = parsed;
58
+ if (typeof lastCheckedAt !== "number" || !Number.isFinite(lastCheckedAt))
59
+ return null;
60
+ return {
61
+ lastCheckedAt,
62
+ latestVersion: typeof latestVersion === "string" ? latestVersion : null,
63
+ };
64
+ }
65
+ catch {
66
+ // A missing or corrupt cache is not an error — treat it as "never checked".
67
+ return null;
68
+ }
69
+ }
70
+ export function writeCache(cachePath, cache) {
71
+ try {
72
+ fs.mkdirSync(path.dirname(cachePath), { recursive: true });
73
+ fs.writeFileSync(cachePath, JSON.stringify(cache), "utf-8");
74
+ return true;
75
+ }
76
+ catch {
77
+ // The cache is an optimisation; never let it break a command.
78
+ return false;
79
+ }
80
+ }
81
+ export function getLockPath(cachePath) {
82
+ return path.join(path.dirname(cachePath), "update-check.lock");
83
+ }
84
+ function isLockStale(lockPath, now, staleMs) {
85
+ try {
86
+ const parsed = JSON.parse(fs.readFileSync(lockPath, "utf-8"));
87
+ const at = parsed.at;
88
+ // An unreadable lock cannot be reasoned about; assume it was abandoned.
89
+ if (typeof at !== "number" || !Number.isFinite(at))
90
+ return true;
91
+ const age = now - at;
92
+ return age < 0 || age >= staleMs;
93
+ }
94
+ catch {
95
+ return true;
96
+ }
97
+ }
98
+ /**
99
+ * Exclusively claims the right to spawn a refresh, so concurrent invocations
100
+ * cannot each start their own child process. Uses an atomic `wx` create rather
101
+ * than an exists-then-write check, which would race.
102
+ *
103
+ * Returns false when another refresh is already in flight.
104
+ */
105
+ export function acquireRefreshLock(lockPath, now, staleMs = LOCK_STALE_MS) {
106
+ const payload = JSON.stringify({ pid: process.pid, at: now });
107
+ try {
108
+ fs.mkdirSync(path.dirname(lockPath), { recursive: true });
109
+ fs.writeFileSync(lockPath, payload, { flag: "wx" });
110
+ return true;
111
+ }
112
+ catch {
113
+ // Either the lock is held or the directory is unwritable. Only take it over
114
+ // when it is demonstrably stale — a crashed child must not block forever.
115
+ if (!isLockStale(lockPath, now, staleMs))
116
+ return false;
117
+ try {
118
+ fs.rmSync(lockPath, { force: true });
119
+ fs.writeFileSync(lockPath, payload, { flag: "wx" });
120
+ return true;
121
+ }
122
+ catch {
123
+ return false;
124
+ }
125
+ }
126
+ }
127
+ export function releaseRefreshLock(lockPath) {
128
+ try {
129
+ fs.rmSync(lockPath, { force: true });
130
+ }
131
+ catch {
132
+ // Best-effort; the stale timeout is the backstop.
133
+ }
134
+ }
135
+ export function isCacheStale(cache, now, intervalMs = CHECK_INTERVAL_MS) {
136
+ if (!cache)
137
+ return true;
138
+ const age = now - cache.lastCheckedAt;
139
+ // A negative age means the clock moved backwards; re-check rather than
140
+ // trusting a timestamp from the future and going quiet indefinitely.
141
+ return age < 0 || age >= intervalMs;
142
+ }
143
+ function parseVersion(value) {
144
+ const m = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/.exec(value.trim());
145
+ if (!m)
146
+ return null;
147
+ return {
148
+ core: [Number(m[1]), Number(m[2]), Number(m[3])],
149
+ prerelease: m[4] ?? null,
150
+ };
151
+ }
152
+ /**
153
+ * True when `candidate` is a strictly newer release than `current`.
154
+ *
155
+ * Deliberately conservative: unparseable input and prerelease-to-prerelease
156
+ * comparisons return false. A wrong `true` nags the user on every command, so
157
+ * staying quiet is the safer failure mode.
158
+ */
159
+ export function isNewerVersion(candidate, current) {
160
+ const a = parseVersion(candidate);
161
+ const b = parseVersion(current);
162
+ if (!a || !b)
163
+ return false;
164
+ for (let i = 0; i < 3; i++) {
165
+ if (a.core[i] > b.core[i])
166
+ return true;
167
+ if (a.core[i] < b.core[i])
168
+ return false;
169
+ }
170
+ // Same core version: a final release supersedes a prerelease of it.
171
+ return a.prerelease === null && b.prerelease !== null;
172
+ }
173
+ /** Detects JSON output from already-normalised argv (cli.ts expands `-fj` first). */
174
+ export function hasJsonOutput(argv) {
175
+ for (let i = 0; i < argv.length; i++) {
176
+ const arg = argv[i];
177
+ if (/^--format=(?:json|jsonl|sarif)$/.test(arg))
178
+ return true;
179
+ if (arg === "--format" && ["json", "jsonl", "sarif"].includes(argv[i + 1] ?? ""))
180
+ return true;
181
+ }
182
+ return false;
183
+ }
184
+ /**
185
+ * Whether the notice may be shown at all. Also gates the background refresh, so
186
+ * non-interactive callers never spawn a child process either.
187
+ */
188
+ export function isNotifierAllowed(ctx) {
189
+ // The pre-rename spelling stays honored: an opt-out already exported in a CI
190
+ // job or a shell profile must not start printing notices because the tool was
191
+ // renamed. Only the current name is published through `describe`.
192
+ if (ctx.env.CAIRN_NO_UPDATE_NOTIFIER === "1")
193
+ return false;
194
+ if (ctx.env.CLAUDE_CLI_NO_UPDATE_NOTIFIER === "1")
195
+ return false;
196
+ if (ctx.env.CI)
197
+ return false;
198
+ // Not a terminal means the output is being parsed by something. Both stdout
199
+ // and stderr carry machine-readable payloads depending on the command, so
200
+ // there is no safe stream to write to.
201
+ if (!ctx.isTty)
202
+ return false;
203
+ if (hasJsonOutput(ctx.argv))
204
+ return false;
205
+ // The refresh child must not recurse, and `check-update` reports the same
206
+ // thing itself — a passive notice alongside it would just be duplication.
207
+ if (ctx.argv.includes(REFRESH_COMMAND))
208
+ return false;
209
+ if (ctx.argv.includes(CHECK_COMMAND))
210
+ return false;
211
+ // Contract-discovery commands always emit a machine document, and agents that
212
+ // poll them should not keep spawning the background refresh.
213
+ if (ctx.argv.includes(DESCRIBE_COMMAND))
214
+ return false;
215
+ if (ctx.argv.includes(SCHEMA_COMMAND))
216
+ return false;
217
+ // `eval "$(cairn completion zsh)"` belongs in an interactive rc file,
218
+ // where stderr *is* a TTY. Without this the notice would print on every shell
219
+ // start and the background refresh would spawn on every shell start.
220
+ if (ctx.argv.includes(COMPLETION_COMMAND))
221
+ return false;
222
+ // `scripts run` gives its stderr to a child process, so anything written at
223
+ // exit lands inside the output a calling hook captured. Matched by adjacency
224
+ // rather than by `includes`, because `run` is also a legal script name.
225
+ const scriptsIndex = ctx.argv.indexOf(SCRIPTS_COMMAND);
226
+ if (scriptsIndex !== -1 && ctx.argv[scriptsIndex + 1] === SCRIPTS_RUN_SUBCOMMAND)
227
+ return false;
228
+ return true;
229
+ }
230
+ export function shouldNotify(ctx) {
231
+ if (!isNotifierAllowed(ctx))
232
+ return false;
233
+ const latest = ctx.cache?.latestVersion;
234
+ if (!latest)
235
+ return false;
236
+ return isNewerVersion(latest, ctx.currentVersion);
237
+ }
238
+ export function formatNotice(current, latest, packageName) {
239
+ const dim = "\x1b[2m";
240
+ const bold = "\x1b[1m";
241
+ const yellow = "\x1b[33m";
242
+ const reset = "\x1b[0m";
243
+ return [
244
+ "",
245
+ `${yellow}Update available${reset} ${dim}${current}${reset} → ${bold}${latest}${reset}`,
246
+ `${dim}Run${reset} npm install -g ${packageName} ${dim}to update.${reset}`,
247
+ "",
248
+ ].join("\n");
249
+ }
250
+ /**
251
+ * Prints an update notice from cache at process exit and kicks off a detached refresh when
252
+ * the cache is stale. Never delays or fails a command.
253
+ */
254
+ export function installUpdateNotifier(opts) {
255
+ const env = opts.env ?? process.env;
256
+ const isTty = opts.isTty ?? process.stderr.isTTY === true;
257
+ const argv = opts.argv;
258
+ if (!isNotifierAllowed({ argv, isTty, env }))
259
+ return;
260
+ const cachePath = opts.cachePath ?? getCachePath(env);
261
+ const cache = readCache(cachePath);
262
+ const now = opts.now ?? Date.now();
263
+ if (shouldNotify({ currentVersion: opts.currentVersion, cache, argv, isTty, env })) {
264
+ const latest = cache?.latestVersion;
265
+ if (latest) {
266
+ // Deferred to exit so the notice lands after the command's own output.
267
+ process.on("exit", () => {
268
+ process.stderr.write(formatNotice(opts.currentVersion, latest, opts.packageName));
269
+ });
270
+ }
271
+ }
272
+ if (!isCacheStale(cache, now))
273
+ return;
274
+ // Claim the lock here, in the parent, rather than in the child. Letting every
275
+ // invocation spawn a child that then discovers it lost the race would defeat
276
+ // the point — the cost being avoided is the process spawn itself.
277
+ const lockPath = getLockPath(cachePath);
278
+ if (!acquireRefreshLock(lockPath, now))
279
+ return;
280
+ if (!spawnRefresh(opts.entryPoint, env)) {
281
+ // Nothing will ever release it otherwise.
282
+ releaseRefreshLock(lockPath);
283
+ }
284
+ }
285
+ function spawnRefresh(entryPoint, env) {
286
+ try {
287
+ const child = spawn(process.execPath, [entryPoint, REFRESH_COMMAND], {
288
+ detached: true,
289
+ stdio: "ignore",
290
+ env,
291
+ });
292
+ // Let the parent exit immediately regardless of the child.
293
+ child.unref();
294
+ return true;
295
+ }
296
+ catch {
297
+ // A failed spawn must never surface to the user.
298
+ return false;
299
+ }
300
+ }
301
+ //# sourceMappingURL=update-notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-notifier.js","sourceRoot":"","sources":["../src/update-notifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface RawUrlResult {
2
+ status: number | null;
3
+ error?: string;
4
+ redirected: boolean;
5
+ finalUrl: string;
6
+ }
7
+ export declare function getUrlCachePath(env?: NodeJS.ProcessEnv, homedir?: string): string;
8
+ export declare function urlCacheKey(url: string, options: {
9
+ timeout: number;
10
+ retries: number;
11
+ headFallbackStatuses: readonly number[];
12
+ }): string;
13
+ export declare function readUrlCache(cachePath: string, key: string, ttl: number, now?: number): RawUrlResult | undefined;
14
+ export declare function writeUrlCache(cachePath: string, key: string, result: RawUrlResult, now?: number): boolean;
@@ -0,0 +1,70 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { createHash } from "node:crypto";
5
+ export function getUrlCachePath(env = process.env, homedir = os.homedir()) {
6
+ const configured = env.XDG_CACHE_HOME?.trim();
7
+ const base = configured ? configured : path.join(homedir, ".cache");
8
+ return path.join(base, "cairn", "url-checks.json");
9
+ }
10
+ export function urlCacheKey(url, options) {
11
+ return createHash("sha256")
12
+ .update(JSON.stringify({
13
+ url,
14
+ timeout: options.timeout,
15
+ retries: options.retries,
16
+ headFallbackStatuses: [...options.headFallbackStatuses].sort((a, b) => a - b),
17
+ }))
18
+ .digest("hex");
19
+ }
20
+ function read(cachePath) {
21
+ try {
22
+ const parsed = JSON.parse(fs.readFileSync(cachePath, "utf-8"));
23
+ if (parsed.version !== 1 || !parsed.entries || typeof parsed.entries !== "object")
24
+ throw new Error();
25
+ return parsed;
26
+ }
27
+ catch {
28
+ return { version: 1, entries: {} };
29
+ }
30
+ }
31
+ export function readUrlCache(cachePath, key, ttl, now = Date.now()) {
32
+ const entry = read(cachePath).entries[key];
33
+ if (!entry ||
34
+ !Number.isFinite(entry.checkedAt) ||
35
+ !(entry.status === null ||
36
+ (Number.isInteger(entry.status) && entry.status >= 100 && entry.status <= 599)) ||
37
+ typeof entry.redirected !== "boolean" ||
38
+ typeof entry.finalUrl !== "string" ||
39
+ (entry.error !== undefined && typeof entry.error !== "string"))
40
+ return undefined;
41
+ const age = now - entry.checkedAt;
42
+ if (age < 0 || age >= ttl)
43
+ return undefined;
44
+ const { checkedAt: _checkedAt, ...result } = entry;
45
+ return result;
46
+ }
47
+ export function writeUrlCache(cachePath, key, result, now = Date.now()) {
48
+ let temporary;
49
+ try {
50
+ const cache = read(cachePath);
51
+ cache.entries[key] = { ...result, checkedAt: now };
52
+ fs.mkdirSync(path.dirname(cachePath), { recursive: true });
53
+ temporary = `${cachePath}.${process.pid}.tmp`;
54
+ fs.writeFileSync(temporary, JSON.stringify(cache), "utf-8");
55
+ fs.renameSync(temporary, cachePath);
56
+ return true;
57
+ }
58
+ catch {
59
+ if (temporary) {
60
+ try {
61
+ fs.rmSync(temporary, { force: true });
62
+ }
63
+ catch {
64
+ // Cache cleanup is best-effort.
65
+ }
66
+ }
67
+ return false;
68
+ }
69
+ }
70
+ //# sourceMappingURL=url-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-cache.js","sourceRoot":"","sources":["../src/url-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import type { DayBucket, FileAggregate, TokenTotals, ToolKind } from "./events.js";
2
+ /**
3
+ * Rollups over scanned aggregates.
4
+ *
5
+ * Pure: every function here takes `FileAggregate[]` and returns rows. Nothing
6
+ * reads the filesystem, nothing knows which provider produced the input, and
7
+ * nothing formats anything — that is `src/commands/usage.ts`.
8
+ */
9
+ export declare const TOKEN_DIMENSIONS: readonly ["model", "day", "week", "month", "project", "session", "provider"];
10
+ export type TokenDimension = (typeof TOKEN_DIMENSIONS)[number];
11
+ export declare const TOOL_DIMENSIONS: readonly ["name", "kind", "server", "day", "session", "provider"];
12
+ export type ToolDimension = (typeof TOOL_DIMENSIONS)[number];
13
+ export declare const SESSION_SORTS: readonly ["recent", "tokens", "tools", "duration"];
14
+ /**
15
+ * How `usage agents` groups.
16
+ *
17
+ * `role` is the reusable agent type, which is what `agentType` means for every
18
+ * provider. `path` is the task-specific identifier, which only some record.
19
+ */
20
+ export declare const AGENT_DIMENSIONS: readonly ["role", "path"];
21
+ export type AgentDimension = (typeof AGENT_DIMENSIONS)[number];
22
+ export type SessionSort = (typeof SESSION_SORTS)[number];
23
+ /**
24
+ * One row of any rollup.
25
+ *
26
+ * A single row type across every subcommand is what lets them share the
27
+ * `usage-rollup` schema. Only `key` and `count` are always present; each
28
+ * dimension fills in the fields that mean something for it and leaves the rest
29
+ * off, so a consumer reads a row by the `dimension` the payload declares.
30
+ */
31
+ export interface RollupRow {
32
+ key: string;
33
+ /** Which provider a row came from, where a row belongs to exactly one. */
34
+ provider?: string;
35
+ count: number;
36
+ tokens?: TokenTotals;
37
+ sessions?: number;
38
+ toolCalls?: number;
39
+ prompts?: number;
40
+ /** Tools. */
41
+ kind?: ToolKind;
42
+ server?: string;
43
+ /** Hooks. */
44
+ failures?: number;
45
+ cancelled?: number;
46
+ meanMs?: number;
47
+ maxMs?: number;
48
+ /** Subagents. */
49
+ maxDepth?: number;
50
+ /** Sessions. */
51
+ project?: string;
52
+ title?: string;
53
+ gitBranch?: string;
54
+ firstTs?: string;
55
+ lastTs?: string;
56
+ durationMs?: number;
57
+ subagents?: number;
58
+ models?: string[];
59
+ }
60
+ /** The Monday that starts the ISO week a UTC day falls in. */
61
+ export declare function weekOf(day: string): string;
62
+ export declare function totalsOf(files: readonly FileAggregate[]): TokenTotals;
63
+ /** Every day bucket in the selection, merged. */
64
+ export declare function mergedBucket(files: readonly FileAggregate[]): DayBucket;
65
+ export interface UsageSummary {
66
+ sessions: number;
67
+ transcripts: number;
68
+ subagentTranscripts: number;
69
+ projects: number;
70
+ prompts: number;
71
+ errors: number;
72
+ compactions: number;
73
+ firstDay: string | null;
74
+ lastDay: string | null;
75
+ days: number;
76
+ tokens: TokenTotals;
77
+ tokensByKind: {
78
+ main: TokenTotals;
79
+ subagent: TokenTotals;
80
+ };
81
+ models: RollupRow[];
82
+ tools: RollupRow[];
83
+ features: {
84
+ skills: number;
85
+ subagents: number;
86
+ hooks: number;
87
+ hookFailures: number;
88
+ slashCommands: number;
89
+ mcpCalls: number;
90
+ };
91
+ }
92
+ export declare function summarize(files: readonly FileAggregate[]): UsageSummary;
93
+ export declare function rollupTokens(files: readonly FileAggregate[], dimension: TokenDimension): RollupRow[];
94
+ export declare function rollupTools(files: readonly FileAggregate[], dimension: ToolDimension, kind?: ToolKind): RollupRow[];
95
+ export declare function rollupSessions(files: readonly FileAggregate[], sort?: SessionSort): RollupRow[];
96
+ export declare function rollupProjects(files: readonly FileAggregate[]): RollupRow[];
97
+ export declare function rollupSkills(files: readonly FileAggregate[]): RollupRow[];
98
+ /**
99
+ * Subagent activity.
100
+ *
101
+ * Spawn counts come from the parent's `Agent` tool calls; tokens come from the
102
+ * subagent transcripts themselves, because the parent's `toolUseResult` records
103
+ * only the subagent's final message and understates real spend several-fold.
104
+ */
105
+ export declare function rollupAgents(files: readonly FileAggregate[], dimension?: AgentDimension): RollupRow[];
106
+ export declare function rollupHooks(files: readonly FileAggregate[]): RollupRow[];
107
+ export declare function rollupCommands(files: readonly FileAggregate[]): RollupRow[];