@crvouga/atlas 0.4.0 → 0.5.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 (379) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/README.md +178 -617
  3. package/dist/bun/src/driver.d.ts +41 -7
  4. package/dist/bun/src/driver.js +47 -6
  5. package/dist/bun/src/index.d.ts +8 -0
  6. package/dist/bun/src/index.js +8 -0
  7. package/dist/core/src/cli.d.ts +14 -1
  8. package/dist/core/src/cli.js +30 -1
  9. package/dist/core/src/config.d.ts +70 -4
  10. package/dist/core/src/config.js +62 -3
  11. package/dist/core/src/events/cloudevents.d.ts +54 -9
  12. package/dist/core/src/events/cloudevents.js +60 -9
  13. package/dist/core/src/graph.d.ts +21 -0
  14. package/dist/core/src/graph.js +26 -0
  15. package/dist/core/src/index.d.ts +11 -0
  16. package/dist/core/src/index.js +11 -0
  17. package/dist/core/src/lint.d.ts +30 -0
  18. package/dist/core/src/lint.js +13 -0
  19. package/dist/core/src/plan.d.ts +39 -1
  20. package/dist/core/src/plan.js +28 -1
  21. package/dist/core/src/privacy.d.ts +29 -2
  22. package/dist/core/src/privacy.js +19 -2
  23. package/dist/core/src/report/formats.d.ts +34 -4
  24. package/dist/core/src/report/formats.js +24 -4
  25. package/dist/core/src/report/markdown.d.ts +15 -0
  26. package/dist/core/src/report/markdown.js +8 -0
  27. package/dist/core/src/run/clients.d.ts +44 -5
  28. package/dist/core/src/run/clients.js +46 -2
  29. package/dist/core/src/run/execute.d.ts +69 -16
  30. package/dist/core/src/run/execute.js +67 -16
  31. package/dist/core/src/run/frames.d.ts +13 -4
  32. package/dist/core/src/run/frames.js +19 -4
  33. package/dist/core/src/run/http.d.ts +34 -1
  34. package/dist/core/src/run/http.js +14 -1
  35. package/dist/core/src/run/types.d.ts +76 -3
  36. package/dist/core/src/run/types.js +19 -3
  37. package/dist/core/src/signals.d.ts +49 -5
  38. package/dist/core/src/signals.js +22 -5
  39. package/dist/core/src/spec/compose.d.ts +23 -1
  40. package/dist/core/src/spec/compose.js +10 -1
  41. package/dist/core/src/spec/index.d.ts +9 -1
  42. package/dist/core/src/spec/index.js +9 -1
  43. package/dist/core/src/spec/load.d.ts +22 -1
  44. package/dist/core/src/spec/load.js +31 -1
  45. package/dist/core/src/spec/parse.d.ts +16 -2
  46. package/dist/core/src/spec/parse.js +25 -2
  47. package/dist/core/src/spec/scxml.d.ts +25 -4
  48. package/dist/core/src/spec/scxml.js +36 -4
  49. package/dist/core/src/spec/types.d.ts +52 -1
  50. package/dist/core/src/spec/types.js +24 -0
  51. package/dist/detox/src/index.d.ts +54 -11
  52. package/dist/detox/src/index.js +45 -7
  53. package/dist/playwright/src/driver.d.ts +39 -3
  54. package/dist/playwright/src/driver.js +27 -3
  55. package/dist/playwright/src/index.d.ts +10 -0
  56. package/dist/playwright/src/index.js +10 -0
  57. package/dist/playwright/src/media.d.ts +50 -4
  58. package/dist/playwright/src/media.js +55 -4
  59. package/dist/playwright/src/signals.d.ts +44 -5
  60. package/dist/playwright/src/signals.js +29 -5
  61. package/dist/reports/src/attachment-files.d.ts +44 -0
  62. package/dist/reports/src/attachment-files.js +121 -0
  63. package/dist/reports/src/attachment-response.d.ts +31 -0
  64. package/dist/reports/src/attachment-response.js +55 -0
  65. package/dist/reports/src/aws-credentials.d.ts +48 -0
  66. package/dist/reports/src/aws-credentials.js +221 -0
  67. package/dist/reports/src/browser-navigation.d.ts +14 -0
  68. package/dist/reports/src/browser-navigation.js +7 -0
  69. package/dist/reports/src/bundle.d.ts +34 -2
  70. package/dist/reports/src/bundle.js +38 -2
  71. package/dist/reports/src/catalog.d.ts +34 -3
  72. package/dist/reports/src/catalog.js +17 -3
  73. package/dist/reports/src/cli-stores.d.ts +36 -0
  74. package/dist/reports/src/cli-stores.js +73 -0
  75. package/dist/reports/src/clock.d.ts +7 -2
  76. package/dist/reports/src/clock.js +5 -2
  77. package/dist/reports/src/completion-order.d.ts +18 -5
  78. package/dist/reports/src/completion-order.js +18 -5
  79. package/dist/reports/src/compose.d.ts +80 -0
  80. package/dist/reports/src/compose.js +117 -0
  81. package/dist/reports/src/copy-store.d.ts +29 -0
  82. package/dist/reports/src/copy-store.js +52 -0
  83. package/dist/reports/src/directory-outline.d.ts +38 -0
  84. package/dist/reports/src/directory-outline.js +103 -0
  85. package/dist/reports/src/directory-store.d.ts +20 -0
  86. package/dist/reports/src/directory-store.js +166 -0
  87. package/dist/reports/src/doctor.d.ts +29 -0
  88. package/dist/reports/src/doctor.js +83 -0
  89. package/dist/reports/src/effective-delta.d.ts +34 -0
  90. package/dist/reports/src/effective-delta.js +25 -0
  91. package/dist/reports/src/evidence-detail.d.ts +64 -0
  92. package/dist/reports/src/evidence-detail.js +92 -0
  93. package/dist/reports/src/evidence-live.d.ts +35 -5
  94. package/dist/reports/src/evidence-live.js +18 -2
  95. package/dist/reports/src/evidence-types.d.ts +68 -1
  96. package/dist/reports/src/evidence-types.js +5 -1
  97. package/dist/reports/src/evidence-view.d.ts +43 -4
  98. package/dist/reports/src/evidence-view.js +13 -2
  99. package/dist/reports/src/explorer-types.d.ts +40 -3
  100. package/dist/reports/src/explorer-types.js +8 -0
  101. package/dist/reports/src/explorer-versions.d.ts +9 -1
  102. package/dist/reports/src/explorer-versions.js +18 -1
  103. package/dist/reports/src/export-evidence.d.ts +16 -1
  104. package/dist/reports/src/export-evidence.js +52 -1
  105. package/dist/reports/src/fetcher.d.ts +27 -3
  106. package/dist/reports/src/fetcher.js +11 -3
  107. package/dist/reports/src/format-date.d.ts +6 -0
  108. package/dist/reports/src/format-date.js +6 -0
  109. package/dist/reports/src/format.d.ts +16 -0
  110. package/dist/reports/src/format.js +10 -0
  111. package/dist/reports/src/frames.d.ts +36 -3
  112. package/dist/reports/src/frames.js +22 -3
  113. package/dist/reports/src/hash.d.ts +18 -0
  114. package/dist/reports/src/hash.js +13 -0
  115. package/dist/reports/src/host.d.ts +29 -0
  116. package/dist/reports/src/host.js +64 -0
  117. package/dist/reports/src/html-frame.d.ts +5 -6
  118. package/dist/reports/src/html-frame.js +12 -1
  119. package/dist/reports/src/http-store.d.ts +52 -0
  120. package/dist/reports/src/http-store.js +145 -0
  121. package/dist/reports/src/http.d.ts +7 -0
  122. package/dist/reports/src/http.js +6 -0
  123. package/dist/reports/src/ingest.d.ts +54 -0
  124. package/dist/reports/src/ingest.js +210 -0
  125. package/dist/reports/src/init.d.ts +40 -0
  126. package/dist/reports/src/init.js +364 -0
  127. package/dist/reports/src/junit.d.ts +33 -6
  128. package/dist/reports/src/junit.js +87 -21
  129. package/dist/reports/src/keyboard.d.ts +20 -0
  130. package/dist/reports/src/keyboard.js +11 -0
  131. package/dist/reports/src/keys.d.ts +21 -3
  132. package/dist/reports/src/keys.js +21 -3
  133. package/dist/reports/src/layer-axes.d.ts +35 -5
  134. package/dist/reports/src/layer-axes.js +25 -5
  135. package/dist/reports/src/layer-catalog.d.ts +28 -1
  136. package/dist/reports/src/layer-catalog.js +18 -1
  137. package/dist/reports/src/layer-merge.d.ts +98 -9
  138. package/dist/reports/src/layer-merge.js +147 -31
  139. package/dist/reports/src/layer-source.d.ts +18 -0
  140. package/dist/reports/src/layer-source.js +11 -0
  141. package/dist/reports/src/layer-store.d.ts +42 -0
  142. package/dist/reports/src/layer-store.js +63 -5
  143. package/dist/reports/src/layer-types.d.ts +32 -1
  144. package/dist/reports/src/layers-route.d.ts +47 -4
  145. package/dist/reports/src/layers-route.js +86 -7
  146. package/dist/reports/src/media-types.d.ts +11 -0
  147. package/dist/reports/src/media-types.js +22 -0
  148. package/dist/reports/src/namespace-guard.d.ts +10 -1
  149. package/dist/reports/src/namespace-guard.js +10 -1
  150. package/dist/reports/src/navigation.d.ts +12 -0
  151. package/dist/reports/src/navigation.js +7 -0
  152. package/dist/reports/src/object-io.d.ts +11 -4
  153. package/dist/reports/src/object-io.js +4 -4
  154. package/dist/reports/src/object-store-conformance.d.ts +27 -0
  155. package/dist/reports/src/object-store-conformance.js +87 -0
  156. package/dist/reports/src/object-store.d.ts +33 -24
  157. package/dist/reports/src/object-store.js +17 -24
  158. package/dist/reports/src/parse-with.d.ts +16 -0
  159. package/dist/reports/src/parse-with.js +14 -0
  160. package/dist/reports/src/performance-part.d.ts +25 -1
  161. package/dist/reports/src/performance-part.js +15 -1
  162. package/dist/reports/src/performance.d.ts +22 -2
  163. package/dist/reports/src/performance.js +12 -2
  164. package/dist/reports/src/persist.d.ts +12 -3
  165. package/dist/reports/src/persist.js +12 -3
  166. package/dist/reports/src/phone.d.ts +18 -1
  167. package/dist/reports/src/phone.js +18 -1
  168. package/dist/reports/src/protocol.d.ts +26 -4
  169. package/dist/reports/src/protocol.js +15 -4
  170. package/dist/reports/src/publication.d.ts +21 -1
  171. package/dist/reports/src/publication.js +21 -1
  172. package/dist/reports/src/publish-checks.d.ts +35 -0
  173. package/dist/reports/src/publish-checks.js +122 -0
  174. package/dist/reports/src/publish.d.ts +42 -9
  175. package/dist/reports/src/publish.js +36 -7
  176. package/dist/reports/src/read.d.ts +46 -16
  177. package/dist/reports/src/read.js +38 -14
  178. package/dist/reports/src/recording-bundle.d.ts +13 -2
  179. package/dist/reports/src/recording-bundle.js +4 -2
  180. package/dist/reports/src/recording-keys.d.ts +15 -1
  181. package/dist/reports/src/recording-keys.js +15 -1
  182. package/dist/reports/src/remote-report.d.ts +28 -7
  183. package/dist/reports/src/remote-report.js +15 -7
  184. package/dist/reports/src/report-cli.d.ts +51 -0
  185. package/dist/reports/src/report-cli.js +485 -0
  186. package/dist/reports/src/report-index.d.ts +99 -0
  187. package/dist/reports/src/report-index.js +337 -0
  188. package/dist/reports/src/report-loader.d.ts +10 -0
  189. package/dist/reports/src/report-loader.js +6 -0
  190. package/dist/reports/src/report-parts.d.ts +29 -3
  191. package/dist/reports/src/report-parts.js +37 -3
  192. package/dist/reports/src/report-status.d.ts +48 -0
  193. package/dist/reports/src/report-status.js +156 -0
  194. package/dist/reports/src/report-types.d.ts +73 -0
  195. package/dist/reports/src/report-types.js +3 -0
  196. package/dist/reports/src/reporter.d.ts +67 -0
  197. package/dist/reports/src/reporter.js +128 -0
  198. package/dist/reports/src/reports-explorer-route.d.ts +541 -0
  199. package/dist/reports/src/reports-explorer-route.js +11 -0
  200. package/dist/reports/src/reports-list-route.d.ts +9 -0
  201. package/dist/reports/src/reports-list-route.js +9 -0
  202. package/dist/reports/src/reports-route.d.ts +561 -22
  203. package/dist/reports/src/reports-route.js +11 -3
  204. package/dist/reports/src/reports-store.d.ts +19 -2
  205. package/dist/reports/src/reports-store.js +10 -2
  206. package/dist/reports/src/resilient-cache.d.ts +14 -1
  207. package/dist/reports/src/resilient-cache.js +8 -1
  208. package/dist/reports/src/retention.d.ts +17 -1
  209. package/dist/reports/src/retention.js +5 -1
  210. package/dist/reports/src/run-bundle.d.ts +63 -0
  211. package/dist/reports/src/run-bundle.js +159 -0
  212. package/dist/reports/src/s3-store.d.ts +79 -0
  213. package/dist/reports/src/s3-store.js +295 -0
  214. package/dist/reports/src/scenario.d.ts +14 -4
  215. package/dist/reports/src/scenario.js +5 -4
  216. package/dist/reports/src/sigv4.d.ts +72 -0
  217. package/dist/reports/src/sigv4.js +96 -0
  218. package/dist/reports/src/snapshot-bundle.d.ts +24 -1
  219. package/dist/reports/src/snapshot-bundle.js +27 -2
  220. package/dist/reports/src/snapshot-surface.d.ts +20 -9
  221. package/dist/reports/src/snapshot-surface.js +32 -19
  222. package/dist/reports/src/source-content.d.ts +23 -0
  223. package/dist/reports/src/source-content.js +30 -1
  224. package/dist/reports/src/source-entries.d.ts +13 -0
  225. package/dist/reports/src/source-entries.js +6 -0
  226. package/dist/reports/src/source-part.d.ts +15 -0
  227. package/dist/reports/src/source-part.js +8 -0
  228. package/dist/reports/src/source-reader.d.ts +11 -0
  229. package/dist/reports/src/source-reader.js +5 -0
  230. package/dist/reports/src/spec-evidence.d.ts +12 -2
  231. package/dist/reports/src/spec-evidence.js +6 -2
  232. package/dist/reports/src/spec-inventory.d.ts +15 -1
  233. package/dist/reports/src/spec-inventory.js +22 -1
  234. package/dist/reports/src/spec-link.d.ts +28 -0
  235. package/dist/reports/src/spec-link.js +70 -0
  236. package/dist/reports/src/spec-set.d.ts +63 -0
  237. package/dist/reports/src/spec-set.js +177 -0
  238. package/dist/reports/src/status.d.ts +10 -0
  239. package/dist/reports/src/status.js +5 -0
  240. package/dist/reports/src/store-prefix.d.ts +28 -0
  241. package/dist/reports/src/store-prefix.js +22 -0
  242. package/dist/reports/src/store-url.d.ts +89 -0
  243. package/dist/reports/src/store-url.js +160 -0
  244. package/dist/reports/src/test-catalog-entity.d.ts +11 -0
  245. package/dist/reports/src/test-catalog-entity.js +6 -0
  246. package/dist/reports/src/types.d.ts +6 -1
  247. package/dist/reports/src/use-report-nav.d.ts +35 -0
  248. package/dist/reports/src/use-report-nav.js +12 -0
  249. package/dist/schema/src/api.d.ts +799 -0
  250. package/dist/schema/src/api.js +201 -0
  251. package/dist/schema/src/cli-results.d.ts +210 -0
  252. package/dist/schema/src/cli-results.js +124 -0
  253. package/dist/schema/src/common.d.ts +53 -0
  254. package/dist/schema/src/common.js +42 -0
  255. package/dist/schema/src/index.d.ts +14 -0
  256. package/dist/schema/src/index.js +14 -0
  257. package/dist/schema/src/layer.d.ts +2273 -0
  258. package/dist/schema/src/layer.js +462 -0
  259. package/dist/schema/src/manifest.d.ts +95 -0
  260. package/dist/schema/src/manifest.js +84 -0
  261. package/dist/schema/src/report-sources.d.ts +28 -0
  262. package/dist/schema/src/report-sources.js +25 -0
  263. package/dist/schema/src/runs-index.d.ts +16 -0
  264. package/dist/schema/src/runs-index.js +15 -0
  265. package/dist/schema/src/server-config.d.ts +93 -0
  266. package/dist/schema/src/server-config.js +73 -0
  267. package/dist/schema/src/spec.d.ts +69 -0
  268. package/dist/schema/src/spec.js +58 -0
  269. package/dist/server/src/app.d.ts +62 -0
  270. package/dist/server/src/app.js +419 -0
  271. package/dist/server/src/auth.d.ts +41 -0
  272. package/dist/server/src/auth.js +59 -0
  273. package/dist/server/src/config.d.ts +83 -0
  274. package/dist/server/src/config.js +187 -0
  275. package/dist/server/src/dev.d.ts +12 -0
  276. package/dist/server/src/dev.js +80 -0
  277. package/dist/server/src/events.d.ts +29 -0
  278. package/dist/server/src/events.js +101 -0
  279. package/dist/server/src/host.d.ts +30 -0
  280. package/dist/server/src/host.js +115 -0
  281. package/dist/server/src/index.d.ts +16 -0
  282. package/dist/server/src/index.js +16 -0
  283. package/dist/server/src/llms.d.ts +19 -0
  284. package/dist/server/src/llms.js +63 -0
  285. package/dist/server/src/main.d.ts +30 -0
  286. package/dist/server/src/main.js +112 -0
  287. package/dist/server/src/openapi.d.ts +59 -0
  288. package/dist/server/src/openapi.js +374 -0
  289. package/dist/server/src/problem.d.ts +8 -0
  290. package/dist/server/src/problem.js +39 -0
  291. package/dist/server/src/site.d.ts +13 -0
  292. package/dist/server/src/site.js +43 -0
  293. package/dist/server/src/store-api.d.ts +28 -0
  294. package/dist/server/src/store-api.js +159 -0
  295. package/dist/server/src/validate.d.ts +71 -0
  296. package/dist/server/src/validate.js +197 -0
  297. package/dist/vitest/src/index.d.ts +27 -5
  298. package/dist/vitest/src/index.js +18 -5
  299. package/dist/webdriver/src/driver.d.ts +63 -11
  300. package/dist/webdriver/src/driver.js +57 -6
  301. package/dist/webdriver/src/index.d.ts +8 -0
  302. package/dist/webdriver/src/index.js +1 -0
  303. package/dist/webdriver/src/protocol.d.ts +75 -6
  304. package/dist/webdriver/src/protocol.js +79 -6
  305. package/docs/agents.md +137 -0
  306. package/docs/deploying.md +345 -0
  307. package/docs/dogfooding.md +175 -0
  308. package/docs/extending.md +242 -0
  309. package/docs/integrating.md +485 -0
  310. package/docs/reference/bun.md +141 -0
  311. package/docs/reference/cli.md +146 -0
  312. package/docs/reference/core.md +2426 -0
  313. package/docs/reference/detox.md +150 -0
  314. package/docs/reference/http-api.md +303 -0
  315. package/docs/reference/playwright.md +303 -0
  316. package/docs/reference/reports.md +7098 -0
  317. package/docs/reference/schema.md +1651 -0
  318. package/docs/reference/server.md +685 -0
  319. package/docs/reference/vitest.md +45 -0
  320. package/docs/reference/webdriver.md +330 -0
  321. package/docs/report-backends.md +144 -0
  322. package/docs/report-contract.md +400 -0
  323. package/docs/reporting-issues.md +160 -0
  324. package/docs/server.md +285 -0
  325. package/docs/statecharts.md +641 -0
  326. package/llms-full.txt +3506 -0
  327. package/llms.txt +47 -0
  328. package/package.json +32 -4
  329. package/packages/core/README.md +2 -1
  330. package/packages/reports/README.md +65 -0
  331. package/packages/reports/STORAGE.md +4 -0
  332. package/packages/schema/README.md +14 -0
  333. package/packages/schema/schemas/check-detail.schema.json +1032 -0
  334. package/packages/schema/schemas/checks-result.schema.json +26 -0
  335. package/packages/schema/schemas/command-error.schema.json +35 -0
  336. package/packages/schema/schemas/doctor-result.schema.json +60 -0
  337. package/packages/schema/schemas/effective-delta.schema.json +490 -0
  338. package/packages/schema/schemas/effective-evidence.schema.json +471 -0
  339. package/packages/schema/schemas/evidence-page.schema.json +271 -0
  340. package/packages/schema/schemas/hello-event.schema.json +22 -0
  341. package/packages/schema/schemas/init-plan.schema.json +347 -0
  342. package/packages/schema/schemas/layer-rows.schema.json +199 -0
  343. package/packages/schema/schemas/layer.schema.json +2888 -0
  344. package/packages/schema/schemas/merge-result.schema.json +40 -0
  345. package/packages/schema/schemas/outline.schema.json +62 -0
  346. package/packages/schema/schemas/problem.schema.json +37 -0
  347. package/packages/schema/schemas/publish-checks.schema.json +1413 -0
  348. package/packages/schema/schemas/publish-result.schema.json +168 -0
  349. package/packages/schema/schemas/ready.schema.json +68 -0
  350. package/packages/schema/schemas/report-event.schema.json +100 -0
  351. package/packages/schema/schemas/report-status.schema.json +370 -0
  352. package/packages/schema/schemas/server-config.schema.json +194 -0
  353. package/packages/schema/schemas/server-info.schema.json +114 -0
  354. package/packages/schema/schemas/spec-set.schema.json +103 -0
  355. package/packages/schema/schemas/store-listing.schema.json +29 -0
  356. package/packages/schema/schemas/store-write-result.schema.json +28 -0
  357. package/packages/schema/schemas/stream-result.schema.json +59 -0
  358. package/packages/server/README.md +43 -0
  359. package/packages/server/openapi.json +6699 -0
  360. package/packages/visualizer/README.md +21 -0
  361. package/packages/visualizer/src/app/AppShell.tsx +9 -2
  362. package/packages/visualizer/src/app/report-sources.tsx +6 -4
  363. package/packages/visualizer/src/app/router.tsx +3 -3
  364. package/packages/visualizer/src/components/Header.module.css +35 -0
  365. package/packages/visualizer/src/components/Header.tsx +40 -3
  366. package/packages/visualizer/src/data/adapters/adapter.ts +5 -17
  367. package/packages/visualizer/src/data/adapters/index.ts +10 -1
  368. package/packages/visualizer/src/evidence/api.ts +14 -2
  369. package/packages/visualizer/src/evidence/artifacts.module.css +213 -0
  370. package/packages/visualizer/src/evidence/artifacts.tsx +272 -0
  371. package/packages/visualizer/src/evidence/check-detail.tsx +3 -1
  372. package/packages/visualizer/src/evidence/evidence-context.tsx +74 -12
  373. package/packages/visualizer/src/evidence/spec-page.tsx +23 -16
  374. package/packages/visualizer/src/find/Finder.tsx +1 -7
  375. package/packages/visualizer/src/find/open.ts +4 -0
  376. package/packages/visualizer/src/live/live-stream.ts +204 -0
  377. package/packages/visualizer/src/runtime.ts +19 -0
  378. package/packages/visualizer/vite/atlas-server-proxy.ts +36 -0
  379. package/packages/visualizer/vite.config.ts +11 -3
@@ -1,48 +1,66 @@
1
- import type { LiveSource } from './evidence-live.js';
2
- import type { ReportOutline } from './layer-types.js';
3
- import { type ReportBackend } from './layers-route.js';
4
1
  /**
5
- * The spec reports API: read-only views of the shared reports store (R2,
6
- * keyed by commit sha; Atlas owns the layout), streamed to
7
- * the reports screen as Server-Sent Events.
2
+ * @module Reports HTTP API
8
3
  *
9
- * - `GET /reports` — commits with a report, newest first (`?cursor=`)
10
- * - `GET /reports/:sha` — one commit's run record
11
- * - `GET /reports/:sha/events` — the commit, then each source as it is read;
12
- * a running commit stays open and sends new sources as CI publishes them
13
- * (`?have=a,b` skips the sources a reconnecting client holds)
14
- * - `GET /reports/:sha/sources` — every source record of the selected attempt
15
- * - `GET /reports/:sha/frame.css` — the stylesheet its snapshots render with
16
- * - `GET /reports/:sha/tests/:source/:testId` — one test's timeline, no frames
17
- * - `GET /reports/:sha/tests/:source/:testId/files/*` — one frame file
18
- * - `GET /reports/:sha/tests/:source/:testId/events` — a test, then its frames
4
+ * The HTTP API behind the viewer, as one Hono app: the layer routes of `layers-route.ts`, the explorer routes, and the
5
+ * read-only commit-keyed routes for recordings written before layers existed. Every route is a GET (or HEAD) with
6
+ * `cache-control: no-store` unless a layer route says otherwise, and CORS reflects the caller's origin. Nothing here
7
+ * writes. Mounted at `/api/reports` by `reportsHost` and by the Atlas server.
19
8
  *
20
- * Mounted ahead of the per-request database middleware: nothing here touches
21
- * Postgres, and a long-lived stream must not hold a connection. Every
22
- * environment reads the same store, so any deployment serves any commit.
9
+ * Commit-keyed routes (`:sha` is a 40-hex commit; anything else is 404 `not_found`, no store configured is 503
10
+ * `reports_unavailable`):
11
+ * - `GET /` commits with a report, newest first (`?cursor=`), see `reportsListRoute`.
12
+ * - `GET /:sha` one commit's run record.
13
+ * - `GET /:sha/events` Server-Sent Events: the commit, then each source as it is read. A running commit stays open and
14
+ * sends new sources as they are published, for at most `REPORTS_TAIL_MS`; `?have=a,b` skips sources a reconnecting
15
+ * client already holds.
16
+ * - `GET /:sha/sources` every source record of the commit, merged from the shared and the local store.
17
+ * - `GET /:sha/frame.css` the stylesheet its snapshots render with.
18
+ * - `GET /:sha/tests/:source/:testId` one test's timeline without frames.
19
+ * - `GET /:sha/tests/:source/:testId/files/*` one frame file.
20
+ * - `GET /:sha/tests/:source/:testId/events` a test, then its frames, as Server-Sent Events.
21
+ * - `GET /:sha/explorer` and `GET /:sha/spec?path=` see `createReportsExplorerApp`.
22
+ *
23
+ * @see docs/server.md
23
24
  */
25
+ import type { LiveSource } from './evidence-live.js';
26
+ import type { ReportOutline } from './layer-types.js';
27
+ import { type ReportBackend } from './layers-route.js';
24
28
  import type { Clock, Timers } from './clock.js';
25
29
  import type { ObjectStore } from './object-store.js';
26
30
  import { type ReportsExplorerDeps } from './reports-explorer-route.js';
27
- /** Commits per page of `GET /reports`. */
31
+ /** Intended commits per page of the commit list. The list route currently pages by its own constant of the same value (30) and does not read this one. */
28
32
  export declare const REPORTS_PAGE_SIZE = 30;
29
- /** How often a running commit is re-listed for new sources. */
33
+ /** How often, in milliseconds, a running commit's event stream re-lists the store for new sources. */
30
34
  export declare const REPORTS_POLL_MS = 2000;
31
- /** A running commit's stream ends after this long; the client reconnects. */
35
+ /** How long, in milliseconds, a running commit's event stream stays open before it ends; the client reconnects. */
32
36
  export declare const REPORTS_TAIL_MS: number;
37
+ /** What `createReportsApp` and `createLayersApp` need from their host: stores, an outline of current specs, and time. */
33
38
  export type ReportsAppDeps = ReportsExplorerDeps & {
39
+ /** Loads the current specs (and the text of each) every report is laid over. Without it `GET /outline` answers 503. */
34
40
  readonly outline?: () => Promise<ReportOutline & {
35
41
  readSpec: (path: string) => Promise<string | null>;
36
42
  }>;
43
+ /** Leave layers out of the report, in every route. */
44
+ readonly include?: (layer: import('./evidence-types.js').LayerHeader) => boolean;
37
45
  /** Further stores whose layers join the combined report beside `localStore` and `store`. */
38
46
  readonly backends?: readonly ReportBackend[];
39
47
  /** Results of spec runs that are still running on this machine. */
40
48
  readonly live?: LiveSource;
41
49
  /** The shared reports store; null when this deployment has no credential. */
42
50
  readonly store: ObjectStore | null;
51
+ /** Time source; injected so caches and polling are testable. */
43
52
  readonly clock: Clock;
53
+ /** Timer functions for the event streams; injected so tests need no real time. */
44
54
  readonly timers: Timers;
45
55
  };
56
+ /**
57
+ * Builds the complete reports app (layer routes, explorer routes and the commit-keyed routes). Read-only: nothing it
58
+ * serves can change a store. CORS reflects any caller's origin for GET, HEAD and OPTIONS.
59
+ *
60
+ * @example
61
+ * const app = createReportsApp({ store: null, backends: [{ id: 'ci', label: 'CI', store }], clock: { now: Date.now }, timers });
62
+ * const response = await app.request('/evidence');
63
+ */
46
64
  export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hono-base").HonoBase<{}, ((((((((import("hono/types").BlankSchema | import("hono/types").MergeSchemaPath<import("hono/types").BlankSchema, "/"> | import("hono/types").MergeSchemaPath<{
47
65
  "/:sha/explorer": {
48
66
  $get: {
@@ -86,6 +104,266 @@ export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hon
86
104
  }[];
87
105
  } | null;
88
106
  parts: readonly {
107
+ tags?: string[] | undefined;
108
+ attachments?: {
109
+ [x: string]: import("hono/utils/types").JSONValue;
110
+ name: string;
111
+ id?: string | undefined;
112
+ role?: string | undefined;
113
+ contentType?: string | undefined;
114
+ bundleKey?: string | undefined;
115
+ uri?: string | undefined;
116
+ text?: string | undefined;
117
+ bytes?: number | undefined;
118
+ sha256?: string | undefined;
119
+ width?: number | undefined;
120
+ height?: number | undefined;
121
+ durationMs?: number | undefined;
122
+ description?: string | undefined;
123
+ at?: {
124
+ [x: string]: import("hono/utils/types").JSONValue;
125
+ step?: string | undefined;
126
+ offsetMs?: number | undefined;
127
+ } | undefined;
128
+ poster?: string | undefined;
129
+ captions?: string[] | undefined;
130
+ extensions?: {
131
+ [x: string]: import("hono/utils/types").JSONValue;
132
+ } | undefined;
133
+ }[] | undefined;
134
+ attempts?: {
135
+ [x: string]: import("hono/utils/types").JSONValue;
136
+ index: number;
137
+ status: "passed" | "failed" | "running" | "not-run";
138
+ durationMs?: number | undefined;
139
+ startedAtMs?: number | undefined;
140
+ detail?: string | undefined;
141
+ steps?: {
142
+ [x: string]: import("hono/utils/types").JSONValue;
143
+ name: string;
144
+ id?: string | undefined;
145
+ parentId?: string | undefined;
146
+ kind?: string | undefined;
147
+ status?: string | undefined;
148
+ offsetMs?: number | undefined;
149
+ durationMs?: number | undefined;
150
+ detail?: string | undefined;
151
+ attachments?: {
152
+ [x: string]: import("hono/utils/types").JSONValue;
153
+ name: string;
154
+ id?: string | undefined;
155
+ role?: string | undefined;
156
+ contentType?: string | undefined;
157
+ bundleKey?: string | undefined;
158
+ uri?: string | undefined;
159
+ text?: string | undefined;
160
+ bytes?: number | undefined;
161
+ sha256?: string | undefined;
162
+ width?: number | undefined;
163
+ height?: number | undefined;
164
+ durationMs?: number | undefined;
165
+ description?: string | undefined;
166
+ at?: {
167
+ [x: string]: import("hono/utils/types").JSONValue;
168
+ step?: string | undefined;
169
+ offsetMs?: number | undefined;
170
+ } | undefined;
171
+ poster?: string | undefined;
172
+ captions?: string[] | undefined;
173
+ extensions?: {
174
+ [x: string]: import("hono/utils/types").JSONValue;
175
+ } | undefined;
176
+ }[] | undefined;
177
+ annotations?: {
178
+ [x: string]: import("hono/utils/types").JSONValue;
179
+ type: string;
180
+ message: string;
181
+ level?: string | undefined;
182
+ at?: {
183
+ [x: string]: import("hono/utils/types").JSONValue;
184
+ step?: string | undefined;
185
+ offsetMs?: number | undefined;
186
+ } | undefined;
187
+ source?: {
188
+ [x: string]: import("hono/utils/types").JSONValue;
189
+ file?: string | undefined;
190
+ line?: number | undefined;
191
+ column?: number | undefined;
192
+ } | undefined;
193
+ links?: {
194
+ [x: string]: import("hono/utils/types").JSONValue;
195
+ url: string;
196
+ name?: string | undefined;
197
+ rel?: string | undefined;
198
+ }[] | undefined;
199
+ extensions?: {
200
+ [x: string]: import("hono/utils/types").JSONValue;
201
+ } | undefined;
202
+ }[] | undefined;
203
+ extensions?: {
204
+ [x: string]: import("hono/utils/types").JSONValue;
205
+ } | undefined;
206
+ }[] | undefined;
207
+ attachments?: {
208
+ [x: string]: import("hono/utils/types").JSONValue;
209
+ name: string;
210
+ id?: string | undefined;
211
+ role?: string | undefined;
212
+ contentType?: string | undefined;
213
+ bundleKey?: string | undefined;
214
+ uri?: string | undefined;
215
+ text?: string | undefined;
216
+ bytes?: number | undefined;
217
+ sha256?: string | undefined;
218
+ width?: number | undefined;
219
+ height?: number | undefined;
220
+ durationMs?: number | undefined;
221
+ description?: string | undefined;
222
+ at?: {
223
+ [x: string]: import("hono/utils/types").JSONValue;
224
+ step?: string | undefined;
225
+ offsetMs?: number | undefined;
226
+ } | undefined;
227
+ poster?: string | undefined;
228
+ captions?: string[] | undefined;
229
+ extensions?: {
230
+ [x: string]: import("hono/utils/types").JSONValue;
231
+ } | undefined;
232
+ }[] | undefined;
233
+ annotations?: {
234
+ [x: string]: import("hono/utils/types").JSONValue;
235
+ type: string;
236
+ message: string;
237
+ level?: string | undefined;
238
+ at?: {
239
+ [x: string]: import("hono/utils/types").JSONValue;
240
+ step?: string | undefined;
241
+ offsetMs?: number | undefined;
242
+ } | undefined;
243
+ source?: {
244
+ [x: string]: import("hono/utils/types").JSONValue;
245
+ file?: string | undefined;
246
+ line?: number | undefined;
247
+ column?: number | undefined;
248
+ } | undefined;
249
+ links?: {
250
+ [x: string]: import("hono/utils/types").JSONValue;
251
+ url: string;
252
+ name?: string | undefined;
253
+ rel?: string | undefined;
254
+ }[] | undefined;
255
+ extensions?: {
256
+ [x: string]: import("hono/utils/types").JSONValue;
257
+ } | undefined;
258
+ }[] | undefined;
259
+ extensions?: {
260
+ [x: string]: import("hono/utils/types").JSONValue;
261
+ } | undefined;
262
+ }[] | undefined;
263
+ steps?: {
264
+ [x: string]: import("hono/utils/types").JSONValue;
265
+ name: string;
266
+ id?: string | undefined;
267
+ parentId?: string | undefined;
268
+ kind?: string | undefined;
269
+ status?: string | undefined;
270
+ offsetMs?: number | undefined;
271
+ durationMs?: number | undefined;
272
+ detail?: string | undefined;
273
+ attachments?: {
274
+ [x: string]: import("hono/utils/types").JSONValue;
275
+ name: string;
276
+ id?: string | undefined;
277
+ role?: string | undefined;
278
+ contentType?: string | undefined;
279
+ bundleKey?: string | undefined;
280
+ uri?: string | undefined;
281
+ text?: string | undefined;
282
+ bytes?: number | undefined;
283
+ sha256?: string | undefined;
284
+ width?: number | undefined;
285
+ height?: number | undefined;
286
+ durationMs?: number | undefined;
287
+ description?: string | undefined;
288
+ at?: {
289
+ [x: string]: import("hono/utils/types").JSONValue;
290
+ step?: string | undefined;
291
+ offsetMs?: number | undefined;
292
+ } | undefined;
293
+ poster?: string | undefined;
294
+ captions?: string[] | undefined;
295
+ extensions?: {
296
+ [x: string]: import("hono/utils/types").JSONValue;
297
+ } | undefined;
298
+ }[] | undefined;
299
+ annotations?: {
300
+ [x: string]: import("hono/utils/types").JSONValue;
301
+ type: string;
302
+ message: string;
303
+ level?: string | undefined;
304
+ at?: {
305
+ [x: string]: import("hono/utils/types").JSONValue;
306
+ step?: string | undefined;
307
+ offsetMs?: number | undefined;
308
+ } | undefined;
309
+ source?: {
310
+ [x: string]: import("hono/utils/types").JSONValue;
311
+ file?: string | undefined;
312
+ line?: number | undefined;
313
+ column?: number | undefined;
314
+ } | undefined;
315
+ links?: {
316
+ [x: string]: import("hono/utils/types").JSONValue;
317
+ url: string;
318
+ name?: string | undefined;
319
+ rel?: string | undefined;
320
+ }[] | undefined;
321
+ extensions?: {
322
+ [x: string]: import("hono/utils/types").JSONValue;
323
+ } | undefined;
324
+ }[] | undefined;
325
+ extensions?: {
326
+ [x: string]: import("hono/utils/types").JSONValue;
327
+ } | undefined;
328
+ }[] | undefined;
329
+ extensions?: {
330
+ [x: string]: import("hono/utils/types").JSONValue;
331
+ } | undefined;
332
+ links?: {
333
+ [x: string]: import("hono/utils/types").JSONValue;
334
+ url: string;
335
+ name?: string | undefined;
336
+ rel?: string | undefined;
337
+ }[] | undefined;
338
+ annotations?: {
339
+ [x: string]: import("hono/utils/types").JSONValue;
340
+ type: string;
341
+ message: string;
342
+ level?: string | undefined;
343
+ at?: {
344
+ [x: string]: import("hono/utils/types").JSONValue;
345
+ step?: string | undefined;
346
+ offsetMs?: number | undefined;
347
+ } | undefined;
348
+ source?: {
349
+ [x: string]: import("hono/utils/types").JSONValue;
350
+ file?: string | undefined;
351
+ line?: number | undefined;
352
+ column?: number | undefined;
353
+ } | undefined;
354
+ links?: {
355
+ [x: string]: import("hono/utils/types").JSONValue;
356
+ url: string;
357
+ name?: string | undefined;
358
+ rel?: string | undefined;
359
+ }[] | undefined;
360
+ extensions?: {
361
+ [x: string]: import("hono/utils/types").JSONValue;
362
+ } | undefined;
363
+ }[] | undefined;
364
+ labels?: {
365
+ [x: string]: string;
366
+ } | undefined;
89
367
  readonly freshness?: "unknown" | "modified" | undefined;
90
368
  readonly parameters?: {
91
369
  readonly [x: string]: string;
@@ -96,6 +374,266 @@ export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hon
96
374
  readonly title: string;
97
375
  readonly recordedAtMs: number;
98
376
  readonly checks: readonly {
377
+ tags?: string[] | undefined;
378
+ attachments?: {
379
+ [x: string]: import("hono/utils/types").JSONValue;
380
+ name: string;
381
+ id?: string | undefined;
382
+ role?: string | undefined;
383
+ contentType?: string | undefined;
384
+ bundleKey?: string | undefined;
385
+ uri?: string | undefined;
386
+ text?: string | undefined;
387
+ bytes?: number | undefined;
388
+ sha256?: string | undefined;
389
+ width?: number | undefined;
390
+ height?: number | undefined;
391
+ durationMs?: number | undefined;
392
+ description?: string | undefined;
393
+ at?: {
394
+ [x: string]: import("hono/utils/types").JSONValue;
395
+ step?: string | undefined;
396
+ offsetMs?: number | undefined;
397
+ } | undefined;
398
+ poster?: string | undefined;
399
+ captions?: string[] | undefined;
400
+ extensions?: {
401
+ [x: string]: import("hono/utils/types").JSONValue;
402
+ } | undefined;
403
+ }[] | undefined;
404
+ attempts?: {
405
+ [x: string]: import("hono/utils/types").JSONValue;
406
+ index: number;
407
+ status: "passed" | "failed" | "running" | "not-run";
408
+ durationMs?: number | undefined;
409
+ startedAtMs?: number | undefined;
410
+ detail?: string | undefined;
411
+ steps?: {
412
+ [x: string]: import("hono/utils/types").JSONValue;
413
+ name: string;
414
+ id?: string | undefined;
415
+ parentId?: string | undefined;
416
+ kind?: string | undefined;
417
+ status?: string | undefined;
418
+ offsetMs?: number | undefined;
419
+ durationMs?: number | undefined;
420
+ detail?: string | undefined;
421
+ attachments?: {
422
+ [x: string]: import("hono/utils/types").JSONValue;
423
+ name: string;
424
+ id?: string | undefined;
425
+ role?: string | undefined;
426
+ contentType?: string | undefined;
427
+ bundleKey?: string | undefined;
428
+ uri?: string | undefined;
429
+ text?: string | undefined;
430
+ bytes?: number | undefined;
431
+ sha256?: string | undefined;
432
+ width?: number | undefined;
433
+ height?: number | undefined;
434
+ durationMs?: number | undefined;
435
+ description?: string | undefined;
436
+ at?: {
437
+ [x: string]: import("hono/utils/types").JSONValue;
438
+ step?: string | undefined;
439
+ offsetMs?: number | undefined;
440
+ } | undefined;
441
+ poster?: string | undefined;
442
+ captions?: string[] | undefined;
443
+ extensions?: {
444
+ [x: string]: import("hono/utils/types").JSONValue;
445
+ } | undefined;
446
+ }[] | undefined;
447
+ annotations?: {
448
+ [x: string]: import("hono/utils/types").JSONValue;
449
+ type: string;
450
+ message: string;
451
+ level?: string | undefined;
452
+ at?: {
453
+ [x: string]: import("hono/utils/types").JSONValue;
454
+ step?: string | undefined;
455
+ offsetMs?: number | undefined;
456
+ } | undefined;
457
+ source?: {
458
+ [x: string]: import("hono/utils/types").JSONValue;
459
+ file?: string | undefined;
460
+ line?: number | undefined;
461
+ column?: number | undefined;
462
+ } | undefined;
463
+ links?: {
464
+ [x: string]: import("hono/utils/types").JSONValue;
465
+ url: string;
466
+ name?: string | undefined;
467
+ rel?: string | undefined;
468
+ }[] | undefined;
469
+ extensions?: {
470
+ [x: string]: import("hono/utils/types").JSONValue;
471
+ } | undefined;
472
+ }[] | undefined;
473
+ extensions?: {
474
+ [x: string]: import("hono/utils/types").JSONValue;
475
+ } | undefined;
476
+ }[] | undefined;
477
+ attachments?: {
478
+ [x: string]: import("hono/utils/types").JSONValue;
479
+ name: string;
480
+ id?: string | undefined;
481
+ role?: string | undefined;
482
+ contentType?: string | undefined;
483
+ bundleKey?: string | undefined;
484
+ uri?: string | undefined;
485
+ text?: string | undefined;
486
+ bytes?: number | undefined;
487
+ sha256?: string | undefined;
488
+ width?: number | undefined;
489
+ height?: number | undefined;
490
+ durationMs?: number | undefined;
491
+ description?: string | undefined;
492
+ at?: {
493
+ [x: string]: import("hono/utils/types").JSONValue;
494
+ step?: string | undefined;
495
+ offsetMs?: number | undefined;
496
+ } | undefined;
497
+ poster?: string | undefined;
498
+ captions?: string[] | undefined;
499
+ extensions?: {
500
+ [x: string]: import("hono/utils/types").JSONValue;
501
+ } | undefined;
502
+ }[] | undefined;
503
+ annotations?: {
504
+ [x: string]: import("hono/utils/types").JSONValue;
505
+ type: string;
506
+ message: string;
507
+ level?: string | undefined;
508
+ at?: {
509
+ [x: string]: import("hono/utils/types").JSONValue;
510
+ step?: string | undefined;
511
+ offsetMs?: number | undefined;
512
+ } | undefined;
513
+ source?: {
514
+ [x: string]: import("hono/utils/types").JSONValue;
515
+ file?: string | undefined;
516
+ line?: number | undefined;
517
+ column?: number | undefined;
518
+ } | undefined;
519
+ links?: {
520
+ [x: string]: import("hono/utils/types").JSONValue;
521
+ url: string;
522
+ name?: string | undefined;
523
+ rel?: string | undefined;
524
+ }[] | undefined;
525
+ extensions?: {
526
+ [x: string]: import("hono/utils/types").JSONValue;
527
+ } | undefined;
528
+ }[] | undefined;
529
+ extensions?: {
530
+ [x: string]: import("hono/utils/types").JSONValue;
531
+ } | undefined;
532
+ }[] | undefined;
533
+ steps?: {
534
+ [x: string]: import("hono/utils/types").JSONValue;
535
+ name: string;
536
+ id?: string | undefined;
537
+ parentId?: string | undefined;
538
+ kind?: string | undefined;
539
+ status?: string | undefined;
540
+ offsetMs?: number | undefined;
541
+ durationMs?: number | undefined;
542
+ detail?: string | undefined;
543
+ attachments?: {
544
+ [x: string]: import("hono/utils/types").JSONValue;
545
+ name: string;
546
+ id?: string | undefined;
547
+ role?: string | undefined;
548
+ contentType?: string | undefined;
549
+ bundleKey?: string | undefined;
550
+ uri?: string | undefined;
551
+ text?: string | undefined;
552
+ bytes?: number | undefined;
553
+ sha256?: string | undefined;
554
+ width?: number | undefined;
555
+ height?: number | undefined;
556
+ durationMs?: number | undefined;
557
+ description?: string | undefined;
558
+ at?: {
559
+ [x: string]: import("hono/utils/types").JSONValue;
560
+ step?: string | undefined;
561
+ offsetMs?: number | undefined;
562
+ } | undefined;
563
+ poster?: string | undefined;
564
+ captions?: string[] | undefined;
565
+ extensions?: {
566
+ [x: string]: import("hono/utils/types").JSONValue;
567
+ } | undefined;
568
+ }[] | undefined;
569
+ annotations?: {
570
+ [x: string]: import("hono/utils/types").JSONValue;
571
+ type: string;
572
+ message: string;
573
+ level?: string | undefined;
574
+ at?: {
575
+ [x: string]: import("hono/utils/types").JSONValue;
576
+ step?: string | undefined;
577
+ offsetMs?: number | undefined;
578
+ } | undefined;
579
+ source?: {
580
+ [x: string]: import("hono/utils/types").JSONValue;
581
+ file?: string | undefined;
582
+ line?: number | undefined;
583
+ column?: number | undefined;
584
+ } | undefined;
585
+ links?: {
586
+ [x: string]: import("hono/utils/types").JSONValue;
587
+ url: string;
588
+ name?: string | undefined;
589
+ rel?: string | undefined;
590
+ }[] | undefined;
591
+ extensions?: {
592
+ [x: string]: import("hono/utils/types").JSONValue;
593
+ } | undefined;
594
+ }[] | undefined;
595
+ extensions?: {
596
+ [x: string]: import("hono/utils/types").JSONValue;
597
+ } | undefined;
598
+ }[] | undefined;
599
+ extensions?: {
600
+ [x: string]: import("hono/utils/types").JSONValue;
601
+ } | undefined;
602
+ links?: {
603
+ [x: string]: import("hono/utils/types").JSONValue;
604
+ url: string;
605
+ name?: string | undefined;
606
+ rel?: string | undefined;
607
+ }[] | undefined;
608
+ annotations?: {
609
+ [x: string]: import("hono/utils/types").JSONValue;
610
+ type: string;
611
+ message: string;
612
+ level?: string | undefined;
613
+ at?: {
614
+ [x: string]: import("hono/utils/types").JSONValue;
615
+ step?: string | undefined;
616
+ offsetMs?: number | undefined;
617
+ } | undefined;
618
+ source?: {
619
+ [x: string]: import("hono/utils/types").JSONValue;
620
+ file?: string | undefined;
621
+ line?: number | undefined;
622
+ column?: number | undefined;
623
+ } | undefined;
624
+ links?: {
625
+ [x: string]: import("hono/utils/types").JSONValue;
626
+ url: string;
627
+ name?: string | undefined;
628
+ rel?: string | undefined;
629
+ }[] | undefined;
630
+ extensions?: {
631
+ [x: string]: import("hono/utils/types").JSONValue;
632
+ } | undefined;
633
+ }[] | undefined;
634
+ labels?: {
635
+ [x: string]: string;
636
+ } | undefined;
99
637
  readonly id: string;
100
638
  readonly title: string;
101
639
  readonly status: import('./explorer-types.js').EvidenceStatus;
@@ -107,6 +645,7 @@ export declare function createReportsApp(deps: ReportsAppDeps): import("hono/hon
107
645
  readonly unit: string;
108
646
  readonly limit?: number | undefined;
109
647
  }[];
648
+ readonly durationMs?: number | undefined;
110
649
  }[];
111
650
  }[];
112
651
  };
@@ -7,11 +7,11 @@ import { cors } from 'hono/cors';
7
7
  import { createReportsExplorerApp, } from './reports-explorer-route.js';
8
8
  import { reportsListRoute } from './reports-list-route.js';
9
9
  import { reportsSources, reportsStoreForCommit, reportsStoreForSource, } from './reports-store.js';
10
- /** Commits per page of `GET /reports`. */
10
+ /** Intended commits per page of the commit list. The list route currently pages by its own constant of the same value (30) and does not read this one. */
11
11
  export const REPORTS_PAGE_SIZE = 30;
12
- /** How often a running commit is re-listed for new sources. */
12
+ /** How often, in milliseconds, a running commit's event stream re-lists the store for new sources. */
13
13
  export const REPORTS_POLL_MS = 2_000;
14
- /** A running commit's stream ends after this long; the client reconnects. */
14
+ /** How long, in milliseconds, a running commit's event stream stays open before it ends; the client reconnects. */
15
15
  export const REPORTS_TAIL_MS = 5 * 60_000;
16
16
  const NO_STORE = { 'cache-control': 'no-store' };
17
17
  function eventStream(events) {
@@ -148,6 +148,14 @@ function testEventsRoute(deps) {
148
148
  return eventStream(testEvents(store, params));
149
149
  };
150
150
  }
151
+ /**
152
+ * Builds the complete reports app (layer routes, explorer routes and the commit-keyed routes). Read-only: nothing it
153
+ * serves can change a store. CORS reflects any caller's origin for GET, HEAD and OPTIONS.
154
+ *
155
+ * @example
156
+ * const app = createReportsApp({ store: null, backends: [{ id: 'ci', label: 'CI', store }], clock: { now: Date.now }, timers });
157
+ * const response = await app.request('/evidence');
158
+ */
151
159
  export function createReportsApp(deps) {
152
160
  return new Hono()
153
161
  .use('*', cors({ origin: (origin) => origin, allowMethods: ['GET', 'HEAD', 'OPTIONS'] }))