@vibefield/rosetta-room 0.0.0-stage → 0.1.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 (435) hide show
  1. package/README.md +247 -2
  2. package/dist/HistoryRoom.d.ts +98 -0
  3. package/dist/HistoryRoom.js +440 -0
  4. package/dist/TranscriptReader.d.ts +22 -0
  5. package/dist/TranscriptReader.js +72 -0
  6. package/dist/components/ColdStart.d.ts +4 -0
  7. package/dist/components/ColdStart.js +5 -0
  8. package/dist/components/FilterChips.d.ts +4 -0
  9. package/dist/components/FilterChips.js +5 -0
  10. package/dist/components/HostAct.d.ts +9 -0
  11. package/dist/components/HostAct.js +16 -0
  12. package/dist/components/HostMenu.d.ts +41 -0
  13. package/dist/components/HostMenu.js +216 -0
  14. package/dist/components/IngestStatus.d.ts +4 -0
  15. package/dist/components/IngestStatus.js +20 -0
  16. package/dist/components/ListActivityNotice.d.ts +5 -0
  17. package/dist/components/ListActivityNotice.js +4 -0
  18. package/dist/components/ListSections.d.ts +20 -0
  19. package/dist/components/ListSections.js +39 -0
  20. package/dist/components/RenameHeading.d.ts +9 -0
  21. package/dist/components/RenameHeading.js +75 -0
  22. package/dist/components/SearchStrip.d.ts +5 -0
  23. package/dist/components/SearchStrip.js +8 -0
  24. package/dist/components/SummaryMetrics.d.ts +13 -0
  25. package/dist/components/SummaryMetrics.js +9 -0
  26. package/dist/components/SummaryPanels.d.ts +35 -0
  27. package/dist/components/SummaryPanels.js +117 -0
  28. package/dist/components/Transcript.d.ts +46 -0
  29. package/dist/components/Transcript.js +358 -0
  30. package/dist/components/charts/ActivityChartDetail.d.ts +13 -0
  31. package/dist/components/charts/ActivityChartDetail.js +78 -0
  32. package/dist/components/charts/CalendarHeatmap.d.ts +16 -0
  33. package/dist/components/charts/CalendarHeatmap.js +55 -0
  34. package/dist/components/charts/DayActivityChart.d.ts +8 -0
  35. package/dist/components/charts/DayActivityChart.js +71 -0
  36. package/dist/components/charts/ModelsChartDetail.d.ts +7 -0
  37. package/dist/components/charts/ModelsChartDetail.js +19 -0
  38. package/dist/components/charts/ProjectChartDialog.d.ts +19 -0
  39. package/dist/components/charts/ProjectChartDialog.js +39 -0
  40. package/dist/components/charts/Streamgraph.d.ts +16 -0
  41. package/dist/components/charts/Streamgraph.js +94 -0
  42. package/dist/components/charts/Treemap.d.ts +26 -0
  43. package/dist/components/charts/Treemap.js +81 -0
  44. package/dist/components/charts/index.d.ts +9 -0
  45. package/dist/components/charts/index.js +4 -0
  46. package/dist/components/charts/streamgraph-layout.d.ts +23 -0
  47. package/dist/components/charts/streamgraph-layout.js +114 -0
  48. package/dist/components/charts/treemap-layout.d.ts +32 -0
  49. package/dist/components/charts/treemap-layout.js +140 -0
  50. package/dist/components/charts/types.d.ts +65 -0
  51. package/dist/components/charts/types.js +8 -0
  52. package/dist/components/file-viewer/FileViewerBrowsers.d.ts +10 -0
  53. package/dist/components/file-viewer/FileViewerBrowsers.js +65 -0
  54. package/dist/components/file-viewer/FileViewerDialog.d.ts +33 -0
  55. package/dist/components/file-viewer/FileViewerDialog.js +82 -0
  56. package/dist/components/file-viewer/FileViewerHeader.d.ts +26 -0
  57. package/dist/components/file-viewer/FileViewerHeader.js +17 -0
  58. package/dist/components/file-viewer/ImageGalleryDialog.d.ts +14 -0
  59. package/dist/components/file-viewer/ImageGalleryDialog.js +98 -0
  60. package/dist/components/file-viewer/diff/index.d.ts +2 -0
  61. package/dist/components/file-viewer/diff/index.js +2 -0
  62. package/dist/components/file-viewer/diff/parse.d.ts +2 -0
  63. package/dist/components/file-viewer/diff/parse.js +164 -0
  64. package/dist/components/file-viewer/diff/types.d.ts +44 -0
  65. package/dist/components/file-viewer/diff/types.js +7 -0
  66. package/dist/components/file-viewer/gallery-source.d.ts +11 -0
  67. package/dist/components/file-viewer/gallery-source.js +75 -0
  68. package/dist/components/file-viewer/image-resource.d.ts +19 -0
  69. package/dist/components/file-viewer/image-resource.js +60 -0
  70. package/dist/components/file-viewer/index.d.ts +5 -0
  71. package/dist/components/file-viewer/index.js +8 -0
  72. package/dist/components/file-viewer/markdown/blocks.d.ts +2 -0
  73. package/dist/components/file-viewer/markdown/blocks.js +277 -0
  74. package/dist/components/file-viewer/markdown/index.d.ts +4 -0
  75. package/dist/components/file-viewer/markdown/index.js +35 -0
  76. package/dist/components/file-viewer/markdown/inline.d.ts +10 -0
  77. package/dist/components/file-viewer/markdown/inline.js +178 -0
  78. package/dist/components/file-viewer/markdown/render.d.ts +9 -0
  79. package/dist/components/file-viewer/markdown/render.js +78 -0
  80. package/dist/components/file-viewer/markdown/types.d.ts +57 -0
  81. package/dist/components/file-viewer/markdown/types.js +11 -0
  82. package/dist/components/file-viewer/minimap/CodeMinimap.d.ts +10 -0
  83. package/dist/components/file-viewer/minimap/CodeMinimap.js +296 -0
  84. package/dist/components/file-viewer/minimap/layout.d.ts +60 -0
  85. package/dist/components/file-viewer/minimap/layout.js +117 -0
  86. package/dist/components/file-viewer/minimap/palette.d.ts +2 -0
  87. package/dist/components/file-viewer/minimap/palette.js +73 -0
  88. package/dist/components/file-viewer/minimap/raster.d.ts +19 -0
  89. package/dist/components/file-viewer/minimap/raster.js +122 -0
  90. package/dist/components/file-viewer/registry.d.ts +25 -0
  91. package/dist/components/file-viewer/registry.js +182 -0
  92. package/dist/components/file-viewer/syntax/grammars.d.ts +16 -0
  93. package/dist/components/file-viewer/syntax/grammars.js +221 -0
  94. package/dist/components/file-viewer/syntax/index.d.ts +8 -0
  95. package/dist/components/file-viewer/syntax/index.js +9 -0
  96. package/dist/components/file-viewer/syntax/languages.d.ts +14 -0
  97. package/dist/components/file-viewer/syntax/languages.js +115 -0
  98. package/dist/components/file-viewer/syntax/tokenize-config.d.ts +2 -0
  99. package/dist/components/file-viewer/syntax/tokenize-config.js +132 -0
  100. package/dist/components/file-viewer/syntax/tokenize-css.d.ts +2 -0
  101. package/dist/components/file-viewer/syntax/tokenize-css.js +169 -0
  102. package/dist/components/file-viewer/syntax/tokenize-markup.d.ts +2 -0
  103. package/dist/components/file-viewer/syntax/tokenize-markup.js +124 -0
  104. package/dist/components/file-viewer/syntax/tokenize.d.ts +9 -0
  105. package/dist/components/file-viewer/syntax/tokenize.js +289 -0
  106. package/dist/components/file-viewer/syntax/types.d.ts +74 -0
  107. package/dist/components/file-viewer/syntax/types.js +13 -0
  108. package/dist/components/file-viewer/types.d.ts +111 -0
  109. package/dist/components/file-viewer/types.js +8 -0
  110. package/dist/components/file-viewer/use-file-content.d.ts +26 -0
  111. package/dist/components/file-viewer/use-file-content.js +144 -0
  112. package/dist/components/file-viewer/views/BinaryView.d.ts +2 -0
  113. package/dist/components/file-viewer/views/BinaryView.js +34 -0
  114. package/dist/components/file-viewer/views/CodeView.d.ts +2 -0
  115. package/dist/components/file-viewer/views/CodeView.js +46 -0
  116. package/dist/components/file-viewer/views/DiffBody.d.ts +7 -0
  117. package/dist/components/file-viewer/views/DiffBody.js +77 -0
  118. package/dist/components/file-viewer/views/DiffView.d.ts +2 -0
  119. package/dist/components/file-viewer/views/DiffView.js +11 -0
  120. package/dist/components/file-viewer/views/ImageView.d.ts +9 -0
  121. package/dist/components/file-viewer/views/ImageView.js +28 -0
  122. package/dist/components/file-viewer/views/MarkdownView.d.ts +9 -0
  123. package/dist/components/file-viewer/views/MarkdownView.js +20 -0
  124. package/dist/components/file-viewer/views/SvgView.d.ts +9 -0
  125. package/dist/components/file-viewer/views/SvgView.js +10 -0
  126. package/dist/components/git/ChangeTree.d.ts +20 -0
  127. package/dist/components/git/ChangeTree.js +35 -0
  128. package/dist/components/git/CommitViewer.d.ts +12 -0
  129. package/dist/components/git/CommitViewer.js +85 -0
  130. package/dist/components/git/GitChanges.d.ts +17 -0
  131. package/dist/components/git/GitChanges.js +70 -0
  132. package/dist/components/git/GitHistory.d.ts +9 -0
  133. package/dist/components/git/GitHistory.js +58 -0
  134. package/dist/components/git/co-author.d.ts +14 -0
  135. package/dist/components/git/co-author.js +55 -0
  136. package/dist/components/git/git-file-source.d.ts +18 -0
  137. package/dist/components/git/git-file-source.js +53 -0
  138. package/dist/components/git/git-host.d.ts +24 -0
  139. package/dist/components/git/git-host.js +130 -0
  140. package/dist/components/git/index.d.ts +10 -0
  141. package/dist/components/git/index.js +12 -0
  142. package/dist/components/git/path-tree.d.ts +23 -0
  143. package/dist/components/git/path-tree.js +73 -0
  144. package/dist/components/git/session-files.d.ts +9 -0
  145. package/dist/components/git/session-files.js +50 -0
  146. package/dist/components/git/types.d.ts +92 -0
  147. package/dist/components/git/types.js +9 -0
  148. package/dist/components/projects/ProjectActivitySparkline.d.ts +6 -0
  149. package/dist/components/projects/ProjectActivitySparkline.js +12 -0
  150. package/dist/components/projects/ProjectList.d.ts +25 -0
  151. package/dist/components/projects/ProjectList.js +43 -0
  152. package/dist/components/projects/ProjectListItem.d.ts +19 -0
  153. package/dist/components/projects/ProjectListItem.js +78 -0
  154. package/dist/components/projects/ProjectsColumn.d.ts +19 -0
  155. package/dist/components/projects/ProjectsColumn.js +36 -0
  156. package/dist/components/projects/index.d.ts +8 -0
  157. package/dist/components/projects/index.js +4 -0
  158. package/dist/components/search/MatchStepper.d.ts +9 -0
  159. package/dist/components/search/MatchStepper.js +14 -0
  160. package/dist/components/search/SearchLauncher.d.ts +12 -0
  161. package/dist/components/search/SearchLauncher.js +13 -0
  162. package/dist/components/search/SearchSheet.d.ts +29 -0
  163. package/dist/components/search/SearchSheet.js +230 -0
  164. package/dist/components/search/index.d.ts +8 -0
  165. package/dist/components/search/index.js +4 -0
  166. package/dist/components/search/shortcut.d.ts +25 -0
  167. package/dist/components/search/shortcut.js +32 -0
  168. package/dist/components/sessions/SessionList.d.ts +24 -0
  169. package/dist/components/sessions/SessionList.js +76 -0
  170. package/dist/components/sessions/SessionListItem.d.ts +13 -0
  171. package/dist/components/sessions/SessionListItem.js +58 -0
  172. package/dist/components/sessions/SessionsColumn.d.ts +26 -0
  173. package/dist/components/sessions/SessionsColumn.js +32 -0
  174. package/dist/components/sessions/index.d.ts +9 -0
  175. package/dist/components/sessions/index.js +4 -0
  176. package/dist/components/sessions/session-display.d.ts +8 -0
  177. package/dist/components/sessions/session-display.js +18 -0
  178. package/dist/components/sessions/types.d.ts +7 -0
  179. package/dist/components/sessions/types.js +1 -0
  180. package/dist/components/transcript/Activity.d.ts +45 -0
  181. package/dist/components/transcript/Activity.js +75 -0
  182. package/dist/components/transcript/Anchor.d.ts +8 -0
  183. package/dist/components/transcript/Anchor.js +23 -0
  184. package/dist/components/transcript/Attachments.d.ts +21 -0
  185. package/dist/components/transcript/Attachments.js +138 -0
  186. package/dist/components/transcript/AuthoredMessage.d.ts +19 -0
  187. package/dist/components/transcript/AuthoredMessage.js +17 -0
  188. package/dist/components/transcript/Compaction.d.ts +9 -0
  189. package/dist/components/transcript/Compaction.js +50 -0
  190. package/dist/components/transcript/DayPill.d.ts +38 -0
  191. package/dist/components/transcript/DayPill.js +68 -0
  192. package/dist/components/transcript/Document.d.ts +32 -0
  193. package/dist/components/transcript/Document.js +503 -0
  194. package/dist/components/transcript/Favicon.d.ts +32 -0
  195. package/dist/components/transcript/Favicon.js +71 -0
  196. package/dist/components/transcript/HeadOfDocument.d.ts +19 -0
  197. package/dist/components/transcript/HeadOfDocument.js +44 -0
  198. package/dist/components/transcript/Ledger.d.ts +53 -0
  199. package/dist/components/transcript/Ledger.js +182 -0
  200. package/dist/components/transcript/LineDetail.d.ts +24 -0
  201. package/dist/components/transcript/LineDetail.js +81 -0
  202. package/dist/components/transcript/Marker.d.ts +33 -0
  203. package/dist/components/transcript/Marker.js +21 -0
  204. package/dist/components/transcript/MessagePreview.d.ts +12 -0
  205. package/dist/components/transcript/MessagePreview.js +58 -0
  206. package/dist/components/transcript/Prompt.d.ts +20 -0
  207. package/dist/components/transcript/Prompt.js +55 -0
  208. package/dist/components/transcript/Prose.d.ts +19 -0
  209. package/dist/components/transcript/Prose.js +109 -0
  210. package/dist/components/transcript/ReceiptPill.d.ts +10 -0
  211. package/dist/components/transcript/ReceiptPill.js +10 -0
  212. package/dist/components/transcript/ResponseHead.d.ts +9 -0
  213. package/dist/components/transcript/ResponseHead.js +36 -0
  214. package/dist/components/transcript/Subthread.d.ts +19 -0
  215. package/dist/components/transcript/Subthread.js +96 -0
  216. package/dist/components/transcript/Team.d.ts +53 -0
  217. package/dist/components/transcript/Team.js +185 -0
  218. package/dist/components/transcript/Thinking.d.ts +24 -0
  219. package/dist/components/transcript/Thinking.js +50 -0
  220. package/dist/components/transcript/TimelineMeta.d.ts +9 -0
  221. package/dist/components/transcript/TimelineMeta.js +161 -0
  222. package/dist/components/transcript/TranscriptLoading.d.ts +10 -0
  223. package/dist/components/transcript/TranscriptLoading.js +10 -0
  224. package/dist/components/transcript/WebDetail.d.ts +8 -0
  225. package/dist/components/transcript/WebDetail.js +29 -0
  226. package/dist/components/transcript/Workflow.d.ts +12 -0
  227. package/dist/components/transcript/Workflow.js +208 -0
  228. package/dist/components/transcript/activity-plan.d.ts +84 -0
  229. package/dist/components/transcript/activity-plan.js +209 -0
  230. package/dist/components/transcript/attachment-file-source.d.ts +23 -0
  231. package/dist/components/transcript/attachment-file-source.js +103 -0
  232. package/dist/components/transcript/attachment-gallery.d.ts +12 -0
  233. package/dist/components/transcript/attachment-gallery.js +33 -0
  234. package/dist/components/transcript/detail-parts.d.ts +50 -0
  235. package/dist/components/transcript/detail-parts.js +295 -0
  236. package/dist/components/transcript/disclosure-state.d.ts +6 -0
  237. package/dist/components/transcript/disclosure-state.js +32 -0
  238. package/dist/components/transcript/disclosure-store.d.ts +8 -0
  239. package/dist/components/transcript/disclosure-store.js +31 -0
  240. package/dist/components/transcript/document-model.d.ts +15 -0
  241. package/dist/components/transcript/document-model.js +104 -0
  242. package/dist/components/transcript/document-plan.d.ts +28 -0
  243. package/dist/components/transcript/document-plan.js +145 -0
  244. package/dist/components/transcript/fold-preference.d.ts +17 -0
  245. package/dist/components/transcript/fold-preference.js +63 -0
  246. package/dist/components/transcript/glyphs.d.ts +15 -0
  247. package/dist/components/transcript/glyphs.js +47 -0
  248. package/dist/components/transcript/index.d.ts +23 -0
  249. package/dist/components/transcript/index.js +22 -0
  250. package/dist/components/transcript/message-file-source.d.ts +15 -0
  251. package/dist/components/transcript/message-file-source.js +31 -0
  252. package/dist/components/transcript/message-preview.d.ts +9 -0
  253. package/dist/components/transcript/message-preview.js +46 -0
  254. package/dist/components/transcript/read-file-source.d.ts +7 -0
  255. package/dist/components/transcript/read-file-source.js +34 -0
  256. package/dist/components/transcript/reader-context.d.ts +13 -0
  257. package/dist/components/transcript/reader-context.js +55 -0
  258. package/dist/components/transcript/reading-identity.d.ts +2 -0
  259. package/dist/components/transcript/reading-identity.js +52 -0
  260. package/dist/components/transcript/scroll-to-row.d.ts +2 -0
  261. package/dist/components/transcript/scroll-to-row.js +13 -0
  262. package/dist/components/transcript/thread-index.d.ts +14 -0
  263. package/dist/components/transcript/thread-index.js +40 -0
  264. package/dist/components/transcript/thread-navigation.d.ts +5 -0
  265. package/dist/components/transcript/thread-navigation.js +3 -0
  266. package/dist/components/transcript/timeline-meta-file-source.d.ts +6 -0
  267. package/dist/components/transcript/timeline-meta-file-source.js +55 -0
  268. package/dist/components/transcript/timeline-meta-state.d.ts +12 -0
  269. package/dist/components/transcript/timeline-meta-state.js +24 -0
  270. package/dist/components/ui/ColumnHeading.d.ts +27 -0
  271. package/dist/components/ui/ColumnHeading.js +7 -0
  272. package/dist/components/ui/ConfirmDialog.d.ts +14 -0
  273. package/dist/components/ui/ConfirmDialog.js +22 -0
  274. package/dist/components/ui/DialogShell.d.ts +18 -0
  275. package/dist/components/ui/DialogShell.js +40 -0
  276. package/dist/components/ui/EmptyState.d.ts +10 -0
  277. package/dist/components/ui/EmptyState.js +6 -0
  278. package/dist/components/ui/ListSummaryHeader.d.ts +9 -0
  279. package/dist/components/ui/ListSummaryHeader.js +6 -0
  280. package/dist/components/ui/ListToolbar.d.ts +6 -0
  281. package/dist/components/ui/ListToolbar.js +5 -0
  282. package/dist/components/ui/ResultGroupHeader.d.ts +9 -0
  283. package/dist/components/ui/ResultGroupHeader.js +5 -0
  284. package/dist/components/ui/SegmentedControl.d.ts +16 -0
  285. package/dist/components/ui/SegmentedControl.js +9 -0
  286. package/dist/components/ui/SummaryMetric.d.ts +13 -0
  287. package/dist/components/ui/SummaryMetric.js +10 -0
  288. package/dist/components/ui/Veil.d.ts +7 -0
  289. package/dist/components/ui/Veil.js +5 -0
  290. package/dist/components/ui/index.d.ts +20 -0
  291. package/dist/components/ui/index.js +10 -0
  292. package/dist/components/worktree/WorktreeColumn.d.ts +22 -0
  293. package/dist/components/worktree/WorktreeColumn.js +170 -0
  294. package/dist/components/worktree/WorktreeFileTree.d.ts +19 -0
  295. package/dist/components/worktree/WorktreeFileTree.js +60 -0
  296. package/dist/components/worktree/WorktreeHeader.d.ts +32 -0
  297. package/dist/components/worktree/WorktreeHeader.js +81 -0
  298. package/dist/components/worktree/WorktreeList.d.ts +8 -0
  299. package/dist/components/worktree/WorktreeList.js +12 -0
  300. package/dist/components/worktree/index.d.ts +12 -0
  301. package/dist/components/worktree/index.js +7 -0
  302. package/dist/components/worktree/types.d.ts +17 -0
  303. package/dist/components/worktree/types.js +3 -0
  304. package/dist/components/worktree/use-worktree-guest.d.ts +21 -0
  305. package/dist/components/worktree/use-worktree-guest.js +92 -0
  306. package/dist/components/worktree/worktree-file-commands.d.ts +19 -0
  307. package/dist/components/worktree/worktree-file-commands.js +112 -0
  308. package/dist/components/worktree/worktree-file-source.d.ts +15 -0
  309. package/dist/components/worktree/worktree-file-source.js +75 -0
  310. package/dist/components/worktree/worktree-host.d.ts +31 -0
  311. package/dist/components/worktree/worktree-host.js +242 -0
  312. package/dist/fixtures/index.d.ts +24 -0
  313. package/dist/fixtures/index.js +292 -0
  314. package/dist/host-inputs.d.ts +231 -0
  315. package/dist/host-inputs.js +35 -0
  316. package/dist/index.d.ts +18 -0
  317. package/dist/index.js +14 -0
  318. package/dist/lib/activity-details.d.ts +23 -0
  319. package/dist/lib/activity-details.js +78 -0
  320. package/dist/lib/activity-order.d.ts +32 -0
  321. package/dist/lib/activity-order.js +86 -0
  322. package/dist/lib/agent-paths.d.ts +6 -0
  323. package/dist/lib/agent-paths.js +19 -0
  324. package/dist/lib/agents.d.ts +15 -0
  325. package/dist/lib/agents.js +60 -0
  326. package/dist/lib/catalog-status.d.ts +3 -0
  327. package/dist/lib/catalog-status.js +10 -0
  328. package/dist/lib/chart-data.d.ts +14 -0
  329. package/dist/lib/chart-data.js +151 -0
  330. package/dist/lib/day-activity.d.ts +21 -0
  331. package/dist/lib/day-activity.js +56 -0
  332. package/dist/lib/format.d.ts +24 -0
  333. package/dist/lib/format.js +116 -0
  334. package/dist/lib/hooks.d.ts +118 -0
  335. package/dist/lib/hooks.js +608 -0
  336. package/dist/lib/icons.d.ts +21 -0
  337. package/dist/lib/icons.js +49 -0
  338. package/dist/lib/image-media.d.ts +6 -0
  339. package/dist/lib/image-media.js +30 -0
  340. package/dist/lib/ingest-activity.d.ts +50 -0
  341. package/dist/lib/ingest-activity.js +151 -0
  342. package/dist/lib/ingest.d.ts +25 -0
  343. package/dist/lib/ingest.js +70 -0
  344. package/dist/lib/model-labels.d.ts +5 -0
  345. package/dist/lib/model-labels.js +28 -0
  346. package/dist/lib/model.d.ts +73 -0
  347. package/dist/lib/model.js +141 -0
  348. package/dist/lib/motion.d.ts +13 -0
  349. package/dist/lib/motion.js +80 -0
  350. package/dist/lib/room-storage.d.ts +13 -0
  351. package/dist/lib/room-storage.js +40 -0
  352. package/dist/lib/search-results.d.ts +27 -0
  353. package/dist/lib/search-results.js +83 -0
  354. package/dist/lib/search-sheet.d.ts +119 -0
  355. package/dist/lib/search-sheet.js +282 -0
  356. package/dist/lib/sections.d.ts +19 -0
  357. package/dist/lib/sections.js +36 -0
  358. package/dist/lib/session-activity.d.ts +5 -0
  359. package/dist/lib/session-activity.js +15 -0
  360. package/dist/lib/session-leases.d.ts +15 -0
  361. package/dist/lib/session-leases.js +61 -0
  362. package/dist/lib/spend.d.ts +42 -0
  363. package/dist/lib/spend.js +112 -0
  364. package/dist/lib/tint.d.ts +9 -0
  365. package/dist/lib/tint.js +53 -0
  366. package/dist/lib/transcript/collaboration.d.ts +97 -0
  367. package/dist/lib/transcript/collaboration.js +423 -0
  368. package/dist/lib/transcript/families.d.ts +212 -0
  369. package/dist/lib/transcript/families.js +906 -0
  370. package/dist/lib/transcript/favicons.d.ts +54 -0
  371. package/dist/lib/transcript/favicons.js +183 -0
  372. package/dist/lib/transcript/head-of-document.d.ts +27 -0
  373. package/dist/lib/transcript/head-of-document.js +274 -0
  374. package/dist/lib/transcript/head-state.d.ts +182 -0
  375. package/dist/lib/transcript/head-state.js +305 -0
  376. package/dist/lib/transcript/history-window.d.ts +13 -0
  377. package/dist/lib/transcript/history-window.js +52 -0
  378. package/dist/lib/transcript/images.d.ts +8 -0
  379. package/dist/lib/transcript/images.js +60 -0
  380. package/dist/lib/transcript/index.d.ts +15 -0
  381. package/dist/lib/transcript/index.js +8 -0
  382. package/dist/lib/transcript/ledger.d.ts +143 -0
  383. package/dist/lib/transcript/ledger.js +513 -0
  384. package/dist/lib/transcript/protocol.d.ts +23 -0
  385. package/dist/lib/transcript/protocol.js +1 -0
  386. package/dist/lib/transcript/sittings.d.ts +75 -0
  387. package/dist/lib/transcript/sittings.js +147 -0
  388. package/dist/lib/transcript/tail-scroll.d.ts +36 -0
  389. package/dist/lib/transcript/tail-scroll.js +167 -0
  390. package/dist/lib/transcript/tail-state.d.ts +17 -0
  391. package/dist/lib/transcript/tail-state.js +30 -0
  392. package/dist/lib/transcript/turns.d.ts +192 -0
  393. package/dist/lib/transcript/turns.js +576 -0
  394. package/dist/lib/transcript/use-transcript-opening.d.ts +12 -0
  395. package/dist/lib/transcript/use-transcript-opening.js +31 -0
  396. package/dist/lib/transcript/use-transcript-tail.d.ts +25 -0
  397. package/dist/lib/transcript/use-transcript-tail.js +158 -0
  398. package/dist/lib/transcript/vocabulary.d.ts +119 -0
  399. package/dist/lib/transcript/vocabulary.js +293 -0
  400. package/dist/lib/transcript/web-address.d.ts +6 -0
  401. package/dist/lib/transcript/web-address.js +18 -0
  402. package/dist/lib/transcript/workflow.d.ts +31 -0
  403. package/dist/lib/transcript/workflow.js +133 -0
  404. package/dist/lib/use-activity-order.d.ts +2 -0
  405. package/dist/lib/use-activity-order.js +23 -0
  406. package/dist/lib/use-day-usage.d.ts +8 -0
  407. package/dist/lib/use-day-usage.js +31 -0
  408. package/dist/lib/use-deferred-list-order.d.ts +26 -0
  409. package/dist/lib/use-deferred-list-order.js +142 -0
  410. package/dist/lib/use-ingest-activity.d.ts +2 -0
  411. package/dist/lib/use-ingest-activity.js +49 -0
  412. package/dist/lib/use-list-motion.d.ts +4 -0
  413. package/dist/lib/use-list-motion.js +67 -0
  414. package/dist/ports.d.ts +222 -0
  415. package/dist/ports.js +3 -0
  416. package/dist/room-context.d.ts +60 -0
  417. package/dist/room-context.js +87 -0
  418. package/dist/styles/activity-chart.css +127 -0
  419. package/dist/styles/attachments.css +29 -0
  420. package/dist/styles/favicon.css +73 -0
  421. package/dist/styles/history-room.css +18 -0
  422. package/dist/styles/host-inputs.css +250 -0
  423. package/dist/styles/image-gallery.css +30 -0
  424. package/dist/styles/ingest.css +51 -0
  425. package/dist/styles/message-preview.css +34 -0
  426. package/dist/styles/models-chart.css +66 -0
  427. package/dist/styles/project-chart.css +19 -0
  428. package/dist/styles/reader.css +33 -0
  429. package/dist/styles/room.css +1411 -0
  430. package/dist/styles/search.css +252 -0
  431. package/dist/styles/transcript-activity.css +70 -0
  432. package/dist/styles/transcript-head.css +220 -0
  433. package/dist/styles/transcript-loading.css +57 -0
  434. package/dist/styles/transcript.css +1226 -0
  435. package/package.json +61 -4
@@ -0,0 +1,14 @@
1
+ import type { SessionRow } from "@vibefield/rosetta-protocol";
2
+ export interface ThreadFocus {
3
+ readonly sessionId: string;
4
+ readonly timelineId: string;
5
+ }
6
+ export interface ThreadIndex {
7
+ readonly byId: ReadonlyMap<string, SessionRow>;
8
+ readonly childrenByParent: ReadonlyMap<string, readonly SessionRow[]>;
9
+ }
10
+ export declare function buildThreadIndex(sessions: readonly SessionRow[]): ThreadIndex;
11
+ export declare function sessionContains(ancestorId: string, candidateId: string, sessions: ReadonlyMap<string, SessionRow>): boolean;
12
+ /** The element id a row's element carries. Search results land on it. */
13
+ export declare function messageDomId(sessionId: string, timelineId: string): string;
14
+ export declare function subthreadTitle(session: SessionRow): string;
@@ -0,0 +1,40 @@
1
+ export function buildThreadIndex(sessions) {
2
+ const byId = new Map(sessions.map((session) => [session.id, session]));
3
+ const childrenByParent = new Map();
4
+ for (const session of sessions) {
5
+ if (session.parent_session_id === null)
6
+ continue;
7
+ const children = childrenByParent.get(session.parent_session_id);
8
+ if (children)
9
+ children.push(session);
10
+ else
11
+ childrenByParent.set(session.parent_session_id, [session]);
12
+ }
13
+ for (const children of childrenByParent.values()) {
14
+ children.sort((left, right) => left.started_at - right.started_at || left.id.localeCompare(right.id));
15
+ }
16
+ return { byId, childrenByParent };
17
+ }
18
+ export function sessionContains(ancestorId, candidateId, sessions) {
19
+ let current = candidateId;
20
+ const visited = new Set();
21
+ while (current !== null && !visited.has(current)) {
22
+ if (current === ancestorId)
23
+ return true;
24
+ visited.add(current);
25
+ current = sessions.get(current)?.parent_session_id ?? null;
26
+ }
27
+ return false;
28
+ }
29
+ /** The element id a row's element carries. Search results land on it. */
30
+ export function messageDomId(sessionId, timelineId) {
31
+ return `msg-${sessionId}-${timelineId}`;
32
+ }
33
+ export function subthreadTitle(session) {
34
+ if (session.title !== null)
35
+ return session.title;
36
+ if (session.summary !== null)
37
+ return session.summary;
38
+ const native = session.native_session_id.split("/").at(-1) ?? session.native_session_id;
39
+ return `Subagent ${native.length > 12 ? native.slice(-12) : native}`;
40
+ }
@@ -0,0 +1,5 @@
1
+ /** Deep workers open at the column's full measure instead of adding rails. */
2
+ export declare const ThreadNavigationContext: import("react").Context<{
3
+ readonly depth: number;
4
+ readonly open: ((sessionId: string) => void) | null;
5
+ }>;
@@ -0,0 +1,3 @@
1
+ import { createContext } from "react";
2
+ /** Deep workers open at the column's full measure instead of adding rails. */
3
+ export const ThreadNavigationContext = createContext({ depth: 0, open: null });
@@ -0,0 +1,6 @@
1
+ import type { TimelineMetaArtifact, TimelineMetaPlan } from "@vibefield/rosetta-protocol";
2
+ import type { SessionLeases } from "../../lib/session-leases.js";
3
+ import type { FileHandle, FileSource } from "../file-viewer/index.js";
4
+ export declare function handleForTimelineMetaPlan(sessions: SessionLeases, sessionId: string, plan: TimelineMetaPlan): Promise<FileHandle>;
5
+ export declare function handleForTimelineMetaArtifact(sessions: SessionLeases, sessionId: string, artifact: TimelineMetaArtifact): Promise<FileHandle>;
6
+ export declare const timelineMetaFileSource: FileSource;
@@ -0,0 +1,55 @@
1
+ // Lazy timeline_meta resources through the room's shared file viewer.
2
+ // The metadata frame carries only safe canonical references; bytes are read
3
+ // after the reader presses a plan or artifact row and then ride on the handle
4
+ // so the viewer never repeats a mutable filesystem read.
5
+ import { resolveKind } from "../file-viewer/index.js";
6
+ const EXTENSION_BY_MEDIA_TYPE = new Map([
7
+ ["image/png", "png"],
8
+ ["image/jpeg", "jpg"],
9
+ ["image/gif", "gif"],
10
+ ["image/webp", "webp"],
11
+ ["image/avif", "avif"],
12
+ ["image/svg+xml", "svg"],
13
+ ["application/json", "json"],
14
+ ["text/markdown", "md"],
15
+ ["text/plain", "txt"],
16
+ ]);
17
+ function nameWithType(name, mediaType) {
18
+ if (resolveKind(name).viewer.id !== "binary" || mediaType === null)
19
+ return name;
20
+ const extension = EXTENSION_BY_MEDIA_TYPE.get(mediaType.toLowerCase());
21
+ return extension === undefined ? name : `${name}.${extension}`;
22
+ }
23
+ function handle(key, name, path, bytes) {
24
+ return {
25
+ key,
26
+ name,
27
+ path,
28
+ size: bytes.byteLength,
29
+ ref: { type: "timeline-meta-file", bytes },
30
+ };
31
+ }
32
+ export async function handleForTimelineMetaPlan(sessions, sessionId, plan) {
33
+ const bytes = await sessions.run(sessionId, (client) => client.readPlan(sessionId, plan.source));
34
+ return handle(`timeline-meta:plan:${sessionId}:${plan.id}`, plan.name, null, bytes);
35
+ }
36
+ export async function handleForTimelineMetaArtifact(sessions, sessionId, artifact) {
37
+ const source = artifact.source;
38
+ if (source.type === "timeline_file") {
39
+ const bytes = await sessions.run(sessionId, (client) => client.readFileTarget(sessionId, source.timeline_id, source.target_index));
40
+ return handle(`timeline-meta:artifact:${sessionId}:${artifact.id}`, nameWithType(artifact.name, artifact.media_type), source.path, bytes);
41
+ }
42
+ const bytes = await sessions.run(sessionId, (client) => client.readAsset(source.asset));
43
+ return handle(`timeline-meta:artifact:${sessionId}:${artifact.id}`, nameWithType(artifact.name, artifact.media_type ?? source.asset.media_type), null, bytes);
44
+ }
45
+ export const timelineMetaFileSource = {
46
+ async read(file, signal) {
47
+ if (signal.aborted)
48
+ throw new DOMException("the file open was cancelled", "AbortError");
49
+ const payload = file.ref;
50
+ if (payload?.type !== "timeline-meta-file" || !(payload.bytes instanceof Uint8Array)) {
51
+ throw new Error("that timeline resource is no longer available");
52
+ }
53
+ return payload.bytes;
54
+ },
55
+ };
@@ -0,0 +1,12 @@
1
+ import type { TimelineMeta, TimelineMetaTask, TimelineMetaWorkflow } from "@vibefield/rosetta-protocol";
2
+ export declare const TIMELINE_META_KINDS: readonly ["tasks", "workflows", "plans", "artifacts"];
3
+ export type TimelineMetaKind = (typeof TIMELINE_META_KINDS)[number];
4
+ /** Archived running states do not prove work continued until the wall clock. */
5
+ export declare function recordedTaskDuration(task: TimelineMetaTask): number | null;
6
+ export declare function recordedWorkflowDuration(workflow: TimelineMetaWorkflow): number | null;
7
+ /** Empty categories are not navigation: keep both their launcher and tab out
8
+ * of the focus order, and omit the entire control when the session has none. */
9
+ export declare function availableTimelineMetaKinds(meta: TimelineMeta): TimelineMetaKind[];
10
+ /** Live replacement frames can remove the open category. Keep the island on
11
+ * the first remaining category; close it only when no session work remains. */
12
+ export declare function resolveTimelineMetaKind(active: TimelineMetaKind | null, available: readonly TimelineMetaKind[]): TimelineMetaKind | null;
@@ -0,0 +1,24 @@
1
+ export const TIMELINE_META_KINDS = ["tasks", "workflows", "plans", "artifacts"];
2
+ /** Archived running states do not prove work continued until the wall clock. */
3
+ export function recordedTaskDuration(task) {
4
+ if (task.status === "in_progress" || task.started_at === null || task.terminal_at === null)
5
+ return null;
6
+ const duration = task.terminal_at - task.started_at;
7
+ return Number.isFinite(duration) && duration >= 0 ? duration : null;
8
+ }
9
+ export function recordedWorkflowDuration(workflow) {
10
+ const duration = workflow.duration_ms;
11
+ return duration !== null && Number.isFinite(duration) && duration >= 0 ? duration : null;
12
+ }
13
+ /** Empty categories are not navigation: keep both their launcher and tab out
14
+ * of the focus order, and omit the entire control when the session has none. */
15
+ export function availableTimelineMetaKinds(meta) {
16
+ return TIMELINE_META_KINDS.filter((kind) => (meta[kind] ?? []).length > 0);
17
+ }
18
+ /** Live replacement frames can remove the open category. Keep the island on
19
+ * the first remaining category; close it only when no session work remains. */
20
+ export function resolveTimelineMetaKind(active, available) {
21
+ if (active === null || available.includes(active))
22
+ return active;
23
+ return available[0] ?? null;
24
+ }
@@ -0,0 +1,27 @@
1
+ export interface ColumnHeadingProps {
2
+ /** What this column is showing. Truncates with an ellipsis; the head keeps
3
+ * its band whatever the name's length. */
4
+ readonly name: string;
5
+ /**
6
+ * The §2.6 accent for the marker. `null` leaves the marker to inherit
7
+ * whatever `--tint` the surrounding surface sets — which is not the same
8
+ * as "no tint", and is how a head inside an already-tinted panel avoids
9
+ * naming the same colour twice.
10
+ */
11
+ readonly tint?: string | null;
12
+ /** A fact about the name, so it travels WITH it rather than sitting at the
13
+ * far end of the band. Omitted when the column has no honest count. */
14
+ readonly count?: number | null;
15
+ /** What the count counts, for its tooltip. */
16
+ readonly countTitle?: string | undefined;
17
+ /** Ids — paths, branches, shas — set in mono. The head keeps its size and
18
+ * weight; only the face changes. */
19
+ readonly mono?: boolean;
20
+ /**
21
+ * The name's tooltip. Defaults to the name, which is right whenever the
22
+ * name is the whole truth; pass the longer form when the head shows an
23
+ * abbreviation, or `null` for a name that needs no second telling.
24
+ */
25
+ readonly title?: string | null | undefined;
26
+ }
27
+ export declare function ColumnHeading({ name, tint, count, countTitle, mono, title, }: ColumnHeadingProps): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function ColumnHeading({ name, tint = null, count = null, countTitle, mono = false, title, }) {
3
+ // `undefined` means "not specified", which is different from an explicit
4
+ // `null` asking for no tooltip at all.
5
+ const nameTitle = title === undefined ? name : title;
6
+ return (_jsxs("div", { className: "ah-colhead", children: [_jsx("i", { style: tint !== null ? { "--tint": tint } : undefined }), _jsx("strong", { className: mono ? "ah-idname" : undefined, title: nameTitle ?? undefined, children: name }), count !== null && (_jsx("span", { className: "ah-bubble", title: countTitle, children: count }))] }));
7
+ }
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from "react";
2
+ export interface ConfirmDialogProps {
3
+ /** `null` when nothing is being asked. */
4
+ readonly question: {
5
+ readonly title: string;
6
+ readonly body: ReactNode;
7
+ /** What the confirming button says — a verb, not "OK". */
8
+ readonly confirm: string;
9
+ readonly destructive?: boolean;
10
+ } | null;
11
+ readonly onConfirm: () => void;
12
+ readonly onCancel: () => void;
13
+ }
14
+ export declare function ConfirmDialog({ question, onConfirm, onCancel }: ConfirmDialogProps): import("react").JSX.Element | null;
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // The one thing this room asks before doing.
3
+ //
4
+ // Reading history needs no confirmation and never gets one. Discarding a
5
+ // file does: it destroys work that exists nowhere else, and git keeps no
6
+ // reflog for a working-tree change. So the act names what it will destroy
7
+ // and waits — which is the difference between a tool and a trap.
8
+ //
9
+ // Same material as the file viewer, one size down: this is the only other
10
+ // thing in the room that covers it.
11
+ import * as Dialog from "@radix-ui/react-dialog";
12
+ import { useRoomOverlay, useRoomPortal } from "../../room-context.js";
13
+ export function ConfirmDialog({ question, onConfirm, onCancel }) {
14
+ useRoomOverlay(question !== null);
15
+ const container = useRoomPortal();
16
+ if (question === null)
17
+ return null;
18
+ return (_jsx(Dialog.Root, { open: true, onOpenChange: (open) => !open && onCancel(), children: _jsxs(Dialog.Portal, { container: container, children: [_jsx(Dialog.Overlay, { className: "ah-layer ah-fileview__backdrop", "data-ah-fileview": true }), _jsxs(Dialog.Content, { className: "ah-layer ah-confirm", "aria-describedby": undefined, children: [_jsx(Dialog.Title, { className: "ah-confirm__title", children: question.title }), _jsx("div", { className: "ah-confirm__body", children: question.body }), _jsxs("div", { className: "ah-confirm__acts", children: [_jsx("button", { type: "button", className: "ah-confirm__cancel", onClick: onCancel, children: "Cancel" }), _jsx("button", { type: "button", className: "ah-confirm__go", "data-destructive": question.destructive === true ? "" : undefined,
19
+ // The destructive act does NOT take focus on open: a reader who
20
+ // opens this and hits Return should cancel, not destroy.
21
+ onClick: onConfirm, children: question.confirm })] })] })] }) }));
22
+ }
@@ -0,0 +1,18 @@
1
+ import type { KeyboardEventHandler, ReactNode } from "react";
2
+ export interface DialogShellProps {
3
+ /** The accessible name. Rendered for screen readers only — the visible
4
+ * band beside it is the sighted reader's version of the same fact. */
5
+ readonly title: string;
6
+ readonly onClose: () => void;
7
+ /** Wider than the default, for a surface that holds two panes. */
8
+ readonly wide?: boolean;
9
+ /** Fill the application viewport while preserving the dialog's focus and
10
+ * accessibility mechanics. */
11
+ readonly fullscreen?: boolean;
12
+ /** In fullscreen, the first Escape restores the dialog instead of closing
13
+ * it. */
14
+ readonly onExitFullscreen?: () => void;
15
+ readonly onKeyDown?: KeyboardEventHandler<HTMLDivElement> | undefined;
16
+ readonly children: ReactNode;
17
+ }
18
+ export declare function DialogShell({ title, onClose, wide, fullscreen, onExitFullscreen, onKeyDown, children, }: DialogShellProps): import("react").JSX.Element;
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // The one modal surface this room has, and the only place its mechanics live.
3
+ //
4
+ // Two things open over the room now — one file, and one commit — and they
5
+ // must be the same object to the reader: same material, same backdrop, same
6
+ // receding stage, same Escape. Sharing the chrome is how that stays true
7
+ // without either surface remembering to match the other.
8
+ //
9
+ // Radix owns what a modal must not get wrong: focus trap, focus restore,
10
+ // Escape, scroll lock, `aria-modal`, the portal.
11
+ import * as Dialog from "@radix-ui/react-dialog";
12
+ import { useRef } from "react";
13
+ import { useRoomOverlay, useRoomPortal } from "../../room-context.js";
14
+ export function DialogShell({ title, onClose, wide = false, fullscreen = false, onExitFullscreen, onKeyDown, children, }) {
15
+ // These controlled dialogs have no Radix Trigger. Remember the actual
16
+ // opener so closing a message returns to its preview without scrolling.
17
+ const opener = useRef(document.activeElement instanceof HTMLElement ? document.activeElement : null);
18
+ // The room's root recedes while this is open; the dialog lands where the
19
+ // host asked the room's layers to go.
20
+ useRoomOverlay(true);
21
+ const container = useRoomPortal();
22
+ return (_jsx(Dialog.Root, { open: true, onOpenChange: (open) => !open && onClose(), children: _jsxs(Dialog.Portal, { container: container, children: [_jsx(Dialog.Overlay, { className: "ah-layer ah-fileview__backdrop", "data-ah-fileview": true }), _jsxs(Dialog.Content, { className: "ah-layer ah-fileview", "data-wide": wide ? "" : undefined, "data-fullscreen": fullscreen ? "" : undefined, "aria-describedby": undefined, onKeyDown: onKeyDown,
23
+ // Radix focuses the first tabbable child, which lights a focus ring
24
+ // on a control nobody pressed. The dialog itself takes focus
25
+ // instead — Escape and the focus trap still work, and Tab still
26
+ // walks in.
27
+ onOpenAutoFocus: (event) => {
28
+ event.preventDefault();
29
+ event.currentTarget?.focus();
30
+ }, onCloseAutoFocus: (event) => {
31
+ event.preventDefault();
32
+ if (opener.current?.isConnected)
33
+ opener.current.focus({ preventScroll: true });
34
+ }, onEscapeKeyDown: (event) => {
35
+ if (!fullscreen)
36
+ return;
37
+ event.preventDefault();
38
+ onExitFullscreen?.();
39
+ }, children: [_jsx(Dialog.Title, { className: "ah-visually-hidden", children: title }), children] })] }) }));
40
+ }
@@ -0,0 +1,10 @@
1
+ import type { CSSProperties, ReactNode } from "react";
2
+ export interface EmptyStateProps {
3
+ readonly title: ReactNode;
4
+ readonly description: ReactNode;
5
+ readonly children?: ReactNode;
6
+ readonly className?: string;
7
+ readonly style?: CSSProperties;
8
+ }
9
+ /** Consistent empty-state copy and spacing for room columns and lists. */
10
+ export declare function EmptyState({ title, description, children, className, style, }: EmptyStateProps): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** Consistent empty-state copy and spacing for room columns and lists. */
3
+ export function EmptyState({ title, description, children, className, style, }) {
4
+ const classes = className ? `ah-empty ${className}` : "ah-empty";
5
+ return (_jsxs("div", { className: classes, style: style, children: [children, _jsx("strong", { children: title }), _jsx("p", { children: description })] }));
6
+ }
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from "react";
2
+ export interface ListSummaryHeaderProps {
3
+ readonly label: ReactNode;
4
+ readonly count: number;
5
+ readonly singularNoun: string;
6
+ readonly pluralNoun?: string;
7
+ }
8
+ /** Compact replacement for an expanded summary panel while a list is filtered. */
9
+ export declare function ListSummaryHeader({ label, count, singularNoun, pluralNoun, }: ListSummaryHeaderProps): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** Compact replacement for an expanded summary panel while a list is filtered. */
3
+ export function ListSummaryHeader({ label, count, singularNoun, pluralNoun = `${singularNoun}s`, }) {
4
+ const noun = count === 1 ? singularNoun : pluralNoun;
5
+ return (_jsx("div", { className: "ah-meta", children: _jsxs("div", { className: "ah-meta__head", children: [_jsx("span", { className: "ah-eyebrow", children: label }), _jsxs("span", { className: "ah-caption tnum", children: [count, " ", noun] })] }) }));
6
+ }
@@ -0,0 +1,6 @@
1
+ import type { ReactNode } from "react";
2
+ export interface ListToolbarProps {
3
+ readonly children: ReactNode;
4
+ }
5
+ /** Controls bar above a scrollable column list. */
6
+ export declare function ListToolbar({ children }: ListToolbarProps): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /** Controls bar above a scrollable column list. */
3
+ export function ListToolbar({ children }) {
4
+ return (_jsx("div", { className: "ah-listbar", children: children }));
5
+ }
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from "react";
2
+ export interface ResultGroupHeaderProps {
3
+ readonly label: ReactNode;
4
+ readonly count: number;
5
+ readonly tint: string;
6
+ readonly countLabel?: string;
7
+ }
8
+ /** Header for one grouped set of search results. */
9
+ export declare function ResultGroupHeader({ label, count, tint, countLabel, }: ResultGroupHeaderProps): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** Header for one grouped set of search results. */
3
+ export function ResultGroupHeader({ label, count, tint, countLabel, }) {
4
+ return (_jsxs("div", { className: "ah-group", style: { "--tint": tint }, children: [_jsx("i", { "aria-hidden": "true" }), label, _jsx("span", { className: "ah-hitcount", "aria-label": countLabel ?? `${count} ${count === 1 ? "result" : "results"}`, children: count })] }));
5
+ }
@@ -0,0 +1,16 @@
1
+ import type { ReactNode } from "react";
2
+ export interface SegmentedControlOption<Value extends string> {
3
+ readonly value: Value;
4
+ readonly label: ReactNode;
5
+ readonly accessibleLabel?: string;
6
+ readonly disabled?: boolean;
7
+ }
8
+ export interface SegmentedControlProps<Value extends string> {
9
+ readonly value: Value;
10
+ readonly options: readonly SegmentedControlOption<Value>[];
11
+ readonly accessibleLabel: string;
12
+ readonly onValueChange: (value: Value) => void;
13
+ readonly className?: string;
14
+ }
15
+ /** A controlled, mutually exclusive group of pressed buttons. */
16
+ export declare function SegmentedControl<Value extends string>({ value, options, accessibleLabel, onValueChange, className, }: SegmentedControlProps<Value>): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /** A controlled, mutually exclusive group of pressed buttons. */
3
+ export function SegmentedControl({ value, options, accessibleLabel, onValueChange, className, }) {
4
+ const classes = className ? `ah-seg ${className}` : "ah-seg";
5
+ return (_jsx("div", { className: classes, role: "group", "aria-label": accessibleLabel, children: options.map((option) => {
6
+ const isSelected = option.value === value;
7
+ return (_jsx("button", { type: "button", className: isSelected ? "is-on" : "", "aria-label": option.accessibleLabel, "aria-pressed": isSelected, disabled: option.disabled, onClick: () => onValueChange(option.value), children: option.label }, option.value));
8
+ }) }));
9
+ }
@@ -0,0 +1,13 @@
1
+ export interface SummaryMetricProps {
2
+ readonly label: string;
3
+ readonly value: number | null;
4
+ /** Currency values arrive in micro-USD, as they do everywhere in the app. */
5
+ readonly unit?: "number" | "usd";
6
+ readonly estimated?: boolean;
7
+ readonly lowerBound?: boolean;
8
+ readonly unknown?: boolean;
9
+ readonly emptyValue?: string;
10
+ readonly title?: string;
11
+ }
12
+ /** Every summary figure shares the same digits, unit, and coverage slots. */
13
+ export declare function SummaryMetric({ label, value, unit, estimated, lowerBound, unknown, emptyValue, title, }: SummaryMetricProps): import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { fmtCompactNumber } from "../../lib/format.js";
3
+ import { fmtUsd } from "../../lib/spend.js";
4
+ /** Every summary figure shares the same digits, unit, and coverage slots. */
5
+ export function SummaryMetric({ label, value, unit = "number", estimated = false, lowerBound = false, unknown = false, emptyValue = "—", title, }) {
6
+ const figure = unknown || value === null ? null
7
+ : unit === "usd" ? fmtUsd(value) : fmtCompactNumber(value);
8
+ const description = unknown ? `Loading ${label}…` : title;
9
+ return (_jsxs("div", { className: "ah-stat", title: description, role: "group", "aria-label": description ?? label, children: [_jsxs("b", { children: [figure === null ? unknown ? "—" : emptyValue : `${estimated ? "~" : ""}${figure.n}`, figure !== null && (figure.u || lowerBound) && (_jsx("small", { children: `${figure.u}${lowerBound ? "+" : ""}` }))] }), _jsx("span", { children: label })] }));
10
+ }
@@ -0,0 +1,7 @@
1
+ export interface VeilProps {
2
+ /** One label line, e.g. "preparing · 2,314 of 5,912 sessions". */
3
+ readonly label: string;
4
+ /** 0..1 fills the meter; null renders the meter idling at a sliver. */
5
+ readonly progress: number | null;
6
+ }
7
+ export declare function Veil({ label, progress }: VeilProps): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function Veil({ label, progress }) {
3
+ const width = progress === null ? "8%" : `${Math.min(100, Math.max(2, progress * 100)).toFixed(1)}%`;
4
+ return (_jsxs("div", { className: "ah-veil", role: "status", "aria-label": label, children: [_jsx("div", { className: "ah-meter", children: _jsx("i", { style: { width } }) }), _jsx("span", { className: "ah-veil__label", children: label })] }));
5
+ }
@@ -0,0 +1,20 @@
1
+ export { ColumnHeading } from "./ColumnHeading.js";
2
+ export type { ColumnHeadingProps } from "./ColumnHeading.js";
3
+ export { ConfirmDialog } from "./ConfirmDialog.js";
4
+ export type { ConfirmDialogProps } from "./ConfirmDialog.js";
5
+ export { DialogShell } from "./DialogShell.js";
6
+ export type { DialogShellProps } from "./DialogShell.js";
7
+ export { EmptyState } from "./EmptyState.js";
8
+ export type { EmptyStateProps } from "./EmptyState.js";
9
+ export { ListSummaryHeader } from "./ListSummaryHeader.js";
10
+ export type { ListSummaryHeaderProps } from "./ListSummaryHeader.js";
11
+ export { ListToolbar } from "./ListToolbar.js";
12
+ export type { ListToolbarProps } from "./ListToolbar.js";
13
+ export { SummaryMetric } from "./SummaryMetric.js";
14
+ export type { SummaryMetricProps } from "./SummaryMetric.js";
15
+ export { ResultGroupHeader } from "./ResultGroupHeader.js";
16
+ export type { ResultGroupHeaderProps } from "./ResultGroupHeader.js";
17
+ export { SegmentedControl } from "./SegmentedControl.js";
18
+ export type { SegmentedControlOption, SegmentedControlProps, } from "./SegmentedControl.js";
19
+ export { Veil } from "./Veil.js";
20
+ export type { VeilProps } from "./Veil.js";
@@ -0,0 +1,10 @@
1
+ export { ColumnHeading } from "./ColumnHeading.js";
2
+ export { ConfirmDialog } from "./ConfirmDialog.js";
3
+ export { DialogShell } from "./DialogShell.js";
4
+ export { EmptyState } from "./EmptyState.js";
5
+ export { ListSummaryHeader } from "./ListSummaryHeader.js";
6
+ export { ListToolbar } from "./ListToolbar.js";
7
+ export { SummaryMetric } from "./SummaryMetric.js";
8
+ export { ResultGroupHeader } from "./ResultGroupHeader.js";
9
+ export { SegmentedControl } from "./SegmentedControl.js";
10
+ export { Veil } from "./Veil.js";
@@ -0,0 +1,22 @@
1
+ import type { RoomFolder, RoomMenu } from "../../host-inputs.js";
2
+ export interface WorktreeColumnProps {
3
+ /** The selected project's first root path, from rosettad. */
4
+ readonly projectRoot: string | null;
5
+ /** The project's §2.6 accent, following it across the room. */
6
+ readonly tint: string | null;
7
+ readonly homeDirectory: string | null;
8
+ /** Paths the open session touched, workspace-relative. */
9
+ readonly sessionPaths: ReadonlySet<string>;
10
+ readonly currentTimestamp: number;
11
+ /** The room's receipt line, so an act is never silent. */
12
+ readonly onReceipt: (text: string) => void;
13
+ readonly requestError: string | null;
14
+ readonly onRetry: () => void;
15
+ /** R6: the host's folders — the head becomes their dropdown, and a folder
16
+ * the host marks elsewhere draws its honest state instead of opening. */
17
+ readonly folders?: {
18
+ readonly menu: RoomMenu;
19
+ readonly shown: RoomFolder | null;
20
+ } | null | undefined;
21
+ }
22
+ export declare function WorktreeColumn({ projectRoot, tint, homeDirectory, sessionPaths, currentTimestamp, onReceipt, requestError, onRetry, folders, }: WorktreeColumnProps): import("react").JSX.Element;