@vibefield/rosetta-room 0.0.0-stage → 0.1.1

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,222 @@
1
+ import type { AssetRef, CollaborationSubscriptionHandlers, CommandResponse, DayUsageResponse, ImageVariant, IngestProgress, MetaSubscriptionHandlers, SearchBuildProgress, SearchReadiness, SearchResponse, SessionSubscriptionHandlers, TimelineEntry, TimelineMetaPlanSource, TimelinePage, UsageResponse } from "@vibefield/rosetta-protocol";
2
+ import type { ProjectStats } from "./lib/model.js";
3
+ /** A live subscription the room can end. */
4
+ export interface Closable {
5
+ close(): void;
6
+ }
7
+ /** The index's own state, as the room reads it. */
8
+ export interface CatalogStatus {
9
+ /** Canonical publication: the cross-session figures are served. */
10
+ readonly canonicalReady: boolean;
11
+ readonly searchReadiness: SearchReadiness;
12
+ readonly searchProgress: SearchBuildProgress | null;
13
+ /** The cold-start board; null from an index that keeps none. */
14
+ readonly ingest: IngestProgress | null;
15
+ readonly startedAt: number | null;
16
+ readonly uptimeMs: number;
17
+ }
18
+ /** The window the figures are folded over: since when, in which timezone. */
19
+ export interface FigureWindow {
20
+ readonly sinceMs: number;
21
+ readonly offsetMinutes: number;
22
+ }
23
+ /** One settled search, as the room's sheet asks it. */
24
+ export interface CatalogSearch {
25
+ readonly q: string;
26
+ readonly limit: number;
27
+ readonly project: string | null;
28
+ readonly kind: string | null;
29
+ readonly agent: string | null;
30
+ }
31
+ /**
32
+ * The index's catalog: who and what exists, the figures a panel draws,
33
+ * search, and the index's own state — never a transcript body.
34
+ *
35
+ * A project's sessions and the unassigned pseudo-project are the room's own
36
+ * reading of the meta rows; a session's facts (tokens, messages, cost) are
37
+ * its row in its project's `contribution`.
38
+ */
39
+ export interface CatalogPort {
40
+ /** Runtimes, projects and every session row, live: one snapshot, then
41
+ * mutations. */
42
+ subscribeMeta(handlers: MetaSubscriptionHandlers): Closable;
43
+ /** Liveness, publication, search readiness and the cold-start board.
44
+ * Rejects when the index cannot answer. */
45
+ status(signal?: AbortSignal): Promise<CatalogStatus>;
46
+ /** Fires when the host's route to the index changes; the room re-asks status. */
47
+ onConnectionChange?(listener: () => void): () => void;
48
+ /** The host's own sentence for why the index cannot answer, or null. */
49
+ unavailable?(): string | null;
50
+ /** One project's per-day heat over the window, and its sessions' facts. */
51
+ projectStats(projectId: string, window: FigureWindow, signal?: AbortSignal): Promise<ProjectStats>;
52
+ /** Every listed project's figures in one ask, for a host whose figures
53
+ * fan out per call or that already holds them. Optional: present, the
54
+ * room asks this once per refresh instead of `projectStats` per project;
55
+ * a project missing from the answer counts as failed and is asked again. */
56
+ projectStatsBatch?(projectIds: readonly string[], window: FigureWindow, signal?: AbortSignal): Promise<ReadonlyMap<string, ProjectStats>>;
57
+ /** The selected project's usage by model and hour over the same window. */
58
+ usage(projectId: string, window: FigureWindow, signal?: AbortSignal): Promise<UsageResponse>;
59
+ /** One day of that project, hour by hour. */
60
+ dayUsage(projectId: string, day: string, offsetMinutes: number, signal?: AbortSignal): Promise<DayUsageResponse>;
61
+ search(request: CatalogSearch, signal?: AbortSignal): Promise<SearchResponse>;
62
+ /** Advisory: read this still-queued session next. Optional — a grant never
63
+ * opens a write, so only a host that holds the daemon's bearer offers it;
64
+ * without it the index keeps its own order. */
65
+ boost?(sessionId: string, signal?: AbortSignal): Promise<unknown>;
66
+ }
67
+ /** One session's live transcript, as the room reads it. */
68
+ export interface SessionFeed extends Closable {
69
+ entries(): TimelineEntry[];
70
+ fetchPage(cursor: string, limit?: number, signal?: AbortSignal): Promise<TimelinePage>;
71
+ reveal(entries: readonly TimelineEntry[]): void;
72
+ loadEntry(timelineId: string, signal?: AbortSignal): Promise<boolean>;
73
+ }
74
+ /** One team member's delivered conversation. */
75
+ export interface CollaborationFeed extends Closable {
76
+ restart(): void;
77
+ }
78
+ /**
79
+ * What the room asks of ONE session: its live subscription and the reads that
80
+ * hang off its rows. A `RosettaClient` is one; a host whose daemon wants a
81
+ * per-session credential hands a client that carries it.
82
+ */
83
+ export interface SessionClient {
84
+ subscribeSession(sessionId: string, handlers: SessionSubscriptionHandlers): SessionFeed;
85
+ subscribeCollaboration(sessionId: string, handlers: CollaborationSubscriptionHandlers): CollaborationFeed;
86
+ timelineEntry(sessionId: string, timelineId: string, signal?: AbortSignal): Promise<TimelineEntry>;
87
+ reportWork(sessionId: string, timelineId: string, signal?: AbortSignal): Promise<TimelineEntry[]>;
88
+ command(sessionId: string, timelineId: string, signal?: AbortSignal): Promise<CommandResponse>;
89
+ readFileTarget(sessionId: string, timelineId: string, targetIndex: number, signal?: AbortSignal): Promise<Uint8Array>;
90
+ readPlan(sessionId: string, source: TimelineMetaPlanSource, signal?: AbortSignal): Promise<Uint8Array>;
91
+ readTextAsset(asset: AssetRef, signal?: AbortSignal): Promise<string>;
92
+ readAsset(asset: AssetRef, signal?: AbortSignal): Promise<Uint8Array>;
93
+ }
94
+ /**
95
+ * Opens one session's body. The room opens a session at most once at a time
96
+ * and follows every `open` with exactly one `close`, when nothing in the room
97
+ * reads that session any more. `open` may answer at once or with a promise
98
+ * (a host that must ask for a credential first).
99
+ */
100
+ export interface SessionPort {
101
+ open(sessionId: string): SessionClient | PromiseLike<SessionClient>;
102
+ close(sessionId: string): void;
103
+ }
104
+ /** One checkout of the repository a root belongs to. */
105
+ export interface GitWorktree {
106
+ readonly path: string;
107
+ /** Absent on a detached HEAD. */
108
+ readonly branch: string | null;
109
+ }
110
+ /** Read-only git facts for one root. Every field is nullable because a folder
111
+ * without a repository is a fact, not a failure: the room says less rather
112
+ * than something untrue. */
113
+ export interface GitFacts {
114
+ readonly branch: string | null;
115
+ readonly dirty: number | null;
116
+ readonly worktrees: readonly GitWorktree[];
117
+ }
118
+ /** An accepted request to start a new worktree engine generation. */
119
+ export type WorktreeOpenResult = {
120
+ readonly ok: true;
121
+ readonly generation: number;
122
+ } | {
123
+ readonly ok: false;
124
+ readonly error: string;
125
+ };
126
+ export interface WorktreeFileActionRequest {
127
+ readonly root: string;
128
+ readonly generation: number;
129
+ readonly action: "copyPath" | "revealInFileManager";
130
+ /** POSIX paths below the displayed root; empty string names the root. */
131
+ readonly paths: readonly string[];
132
+ }
133
+ export type WorktreeFileActionResult = {
134
+ readonly ok: true;
135
+ } | {
136
+ readonly ok: false;
137
+ readonly error: string;
138
+ };
139
+ /** What the host's worktree engine says, in the order it says it: a
140
+ * generation starting or failing, and — once it is up — the two transferred
141
+ * ports for the tree (mille's) and git. A port is a one-owner capability:
142
+ * the room is its only consumer. */
143
+ export type WorktreeHostEvent = {
144
+ readonly type: "ports";
145
+ readonly root: string;
146
+ readonly generation: number;
147
+ readonly treePort: MessagePort;
148
+ readonly gitPort: MessagePort;
149
+ } | {
150
+ readonly type: "status";
151
+ readonly root: string;
152
+ readonly generation: number;
153
+ readonly state: "starting" | "error";
154
+ readonly message?: string;
155
+ };
156
+ /** The worktree guest's engine, which only a desktop host can run. */
157
+ export interface WorktreeHostPort {
158
+ /** Point the engine at a project root. Each accepted request starts a fresh
159
+ * generation, including an explicit retry of the same root. */
160
+ open(root: string): Promise<WorktreeOpenResult>;
161
+ /** Branch · dirty count · worktrees for the open root, or null when the
162
+ * folder is not a repository. */
163
+ gitFacts(root: string, generation: number): Promise<GitFacts | null>;
164
+ /** Copy absolute path text or reveal one entry in the native file manager. */
165
+ fileAction(request: WorktreeFileActionRequest): Promise<WorktreeFileActionResult>;
166
+ /** The engine's events. A host replays what arrived before the room
167
+ * listened; the returned function stops listening. */
168
+ ports(listener: (event: WorktreeHostEvent) => void): () => void;
169
+ }
170
+ /** An installed browser offered by the host. The id is opaque to the room;
171
+ * executable paths and launch arguments stay inside the desktop host. */
172
+ export interface InstalledBrowser {
173
+ readonly id: string;
174
+ readonly name: string;
175
+ readonly icon: string | null;
176
+ }
177
+ /** What the room asks a desktop. A browser tab has none, and the room says
178
+ * so: no worktree guest, a globe for every site icon, no "open in browser". */
179
+ export interface HostPort {
180
+ /** The user's home directory, for writing paths as `~/…`; null when unknown. */
181
+ readonly homeDir: string | null;
182
+ /** The desktop's platform (`darwin`, …), for the names of its own acts. */
183
+ readonly platform: string | null;
184
+ /** Hand the exact HTML/SVG bytes to the chosen installed browser. Omitting
185
+ * the id retains the default-browser action for hosts without discovery. */
186
+ openInBrowser(name: string, bytes: Uint8Array, browserId?: string): Promise<boolean>;
187
+ /** Re-read installed browsers. Absent on hosts with only a default action. */
188
+ browsers?(): Promise<readonly InstalledBrowser[]>;
189
+ /** One site's own icon as an image URL, or null for every honest no — a
190
+ * refused host, no icon, a timeout. The room draws the globe for all. */
191
+ favicon(host: string): Promise<string | null>;
192
+ /** Absent: the worktree guest stays closed and says why. */
193
+ readonly worktree?: WorktreeHostPort | undefined;
194
+ }
195
+ /** An address an `<img>` can load: now, later, or not at all. */
196
+ export type AssetUrl = string | null | PromiseLike<string | null>;
197
+ /** Where every stored image and attachment is addressed. */
198
+ export interface AssetSource {
199
+ /**
200
+ * One recorded image rendition's address, or null for the image's
201
+ * "could not load" face. A host whose daemon wants no credential answers
202
+ * the daemon's own URL (rosetta's app). A host whose daemon wants one cannot
203
+ * put it in an `<img src>`: it fetches the bytes through a session's client
204
+ * and answers an object URL — a promise while it fetches — bounding and
205
+ * revoking what it made. The room asks on every mount and every retry, so
206
+ * an evicted URL is asked for again, never reused, and a host must not
207
+ * keep a failure.
208
+ */
209
+ imageAssetUrl(asset: AssetRef, variant: ImageVariant): AssetUrl;
210
+ /** The address that names one stored attachment member, or null when the
211
+ * room should not offer it. The room uses it as the attachment's identity
212
+ * and to decide it can be opened; it never loads it. */
213
+ attachmentAssetUrl(asset: AssetRef): string | null;
214
+ }
215
+ /** Everything a host hands the room. */
216
+ export interface RoomPorts {
217
+ readonly catalog: CatalogPort;
218
+ readonly sessions: SessionPort;
219
+ readonly assets: AssetSource;
220
+ /** Absent: a browser tab, which the room states rather than papers over. */
221
+ readonly host?: HostPort | null;
222
+ }
package/dist/ports.js ADDED
@@ -0,0 +1,3 @@
1
+ const rosettaClientIsASessionClient = true;
2
+ void rosettaClientIsASessionClient;
3
+ export {};
@@ -0,0 +1,60 @@
1
+ import type { ReactNode } from "react";
2
+ import type { AssetSource, CatalogPort, HostPort, RoomPorts } from "./ports.js";
3
+ import type { SessionLeases } from "./lib/session-leases.js";
4
+ import type { FaviconStore } from "./lib/transcript/favicons.js";
5
+ import type { KeyValueStore, RoomStorage } from "./lib/room-storage.js";
6
+ import type { TintDealer } from "./lib/tint.js";
7
+ import type { FoldPreference } from "./components/transcript/fold-preference.js";
8
+ /** The two faces the project panel's chart can open on. */
9
+ export type SummaryTab = "activity" | "models";
10
+ /** What a host decides about the room beyond its ports. */
11
+ export interface RoomOptions {
12
+ /** The chart the project panel opens on (rosetta's app reads `?tab=`). */
13
+ readonly initialSummaryTab?: SummaryTab | undefined;
14
+ /** Where the room's dialogs and its sheet are portalled; the document's
15
+ * body when absent. */
16
+ readonly portalContainer?: HTMLElement | null | undefined;
17
+ /** Every name the room stores goes under this prefix. Default `ah.`. */
18
+ readonly storagePrefix?: string | undefined;
19
+ /** The host's store: the browser's localStorage when absent; null keeps
20
+ * nothing across runs. */
21
+ readonly storage?: KeyValueStore | null | undefined;
22
+ }
23
+ /** How many of the room's dialogs are open: the root recedes while any is. */
24
+ export interface OverlayCount {
25
+ hold(): () => void;
26
+ subscribe(listener: () => void): () => void;
27
+ count(): number;
28
+ }
29
+ export interface Room {
30
+ readonly catalog: CatalogPort;
31
+ readonly sessions: SessionLeases;
32
+ readonly assets: AssetSource;
33
+ readonly host: HostPort | null;
34
+ readonly initialSummaryTab: SummaryTab;
35
+ /** The room's site icons, asked of its host. */
36
+ readonly favicons: FaviconStore;
37
+ readonly portalContainer: HTMLElement | null;
38
+ readonly overlays: OverlayCount;
39
+ /** The host's store under the host's prefix. */
40
+ readonly storage: RoomStorage;
41
+ /** The room's project colours, dealt once each and remembered. */
42
+ readonly tints: TintDealer;
43
+ /** The room's fold: conversation or every run open. */
44
+ readonly fold: FoldPreference;
45
+ }
46
+ export declare function RoomProvider({ ports, options, children, }: {
47
+ readonly ports: RoomPorts;
48
+ readonly options?: RoomOptions;
49
+ readonly children?: ReactNode;
50
+ }): import("react").JSX.Element;
51
+ export declare function useRoom(): Room;
52
+ /** Mark the room's root while one of its dialogs is open. A part mounted
53
+ * outside any room (a harness) marks nothing. */
54
+ export declare function useRoomOverlay(open: boolean): void;
55
+ /** Whether any of the room's dialogs is open. */
56
+ export declare function useRoomOverlayOpen(): boolean;
57
+ /** Where the room portals its dialogs: the host's container, or the body. */
58
+ export declare function useRoomPortal(): HTMLElement | undefined;
59
+ export declare const ReadingSessionProvider: import("react").Provider<string | null>;
60
+ export declare function useReadingSession(): string | null;
@@ -0,0 +1,87 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // The ports, as the room's parts read them. `HistoryRoom` provides them; a
3
+ // harness that mounts one column on its own wraps it in `RoomProvider`.
4
+ import { createContext, useContext, useEffect, useMemo, useSyncExternalStore } from "react";
5
+ import { createSessionLeases } from "./lib/session-leases.js";
6
+ import { createFaviconStore } from "./lib/transcript/favicons.js";
7
+ import { browserStorage, createRoomStorage, DEFAULT_STORAGE_PREFIX } from "./lib/room-storage.js";
8
+ import { createTintDealer } from "./lib/tint.js";
9
+ import { createFoldPreference } from "./components/transcript/fold-preference.js";
10
+ function createOverlayCount() {
11
+ let open = 0;
12
+ const listeners = new Set();
13
+ const announce = () => {
14
+ for (const listener of listeners)
15
+ listener();
16
+ };
17
+ return {
18
+ hold() {
19
+ open += 1;
20
+ announce();
21
+ let released = false;
22
+ return () => {
23
+ if (released)
24
+ return;
25
+ released = true;
26
+ open -= 1;
27
+ announce();
28
+ };
29
+ },
30
+ subscribe(listener) {
31
+ listeners.add(listener);
32
+ return () => {
33
+ listeners.delete(listener);
34
+ };
35
+ },
36
+ count: () => open,
37
+ };
38
+ }
39
+ const RoomContext = createContext(null);
40
+ export function RoomProvider({ ports, options = {}, children, }) {
41
+ const { catalog, sessions: sessionPort, assets } = ports;
42
+ const host = ports.host ?? null;
43
+ const initialSummaryTab = options.initialSummaryTab ?? "activity";
44
+ const portalContainer = options.portalContainer ?? null;
45
+ const prefix = options.storagePrefix ?? DEFAULT_STORAGE_PREFIX;
46
+ const backend = options.storage === undefined ? browserStorage() : options.storage;
47
+ const storage = useMemo(() => createRoomStorage(prefix, backend), [prefix, backend]);
48
+ const overlays = useMemo(createOverlayCount, []);
49
+ const sessions = useMemo(() => createSessionLeases(sessionPort), [sessionPort]);
50
+ const favicons = useMemo(() => createFaviconStore(host === null ? null : (site) => host.favicon(site), storage), [host, storage]);
51
+ const tints = useMemo(() => createTintDealer(storage), [storage]);
52
+ const fold = useMemo(() => createFoldPreference(storage), [storage]);
53
+ const room = useMemo(() => ({
54
+ catalog, sessions, assets, host, initialSummaryTab, favicons, portalContainer, overlays,
55
+ storage, tints, fold,
56
+ }), [catalog, sessions, assets, host, initialSummaryTab, favicons, portalContainer, overlays, storage, tints, fold]);
57
+ return _jsx(RoomContext.Provider, { value: room, children: children });
58
+ }
59
+ export function useRoom() {
60
+ const room = useContext(RoomContext);
61
+ if (room === null) {
62
+ throw new Error("The History room's parts read their ports from <HistoryRoom> or <RoomProvider>.");
63
+ }
64
+ return room;
65
+ }
66
+ /** Mark the room's root while one of its dialogs is open. A part mounted
67
+ * outside any room (a harness) marks nothing. */
68
+ export function useRoomOverlay(open) {
69
+ const overlays = useContext(RoomContext)?.overlays ?? null;
70
+ useEffect(() => (open && overlays !== null ? overlays.hold() : undefined), [open, overlays]);
71
+ }
72
+ /** Whether any of the room's dialogs is open. */
73
+ export function useRoomOverlayOpen() {
74
+ const { overlays } = useRoom();
75
+ return useSyncExternalStore(overlays.subscribe, () => overlays.count() > 0, () => false);
76
+ }
77
+ /** Where the room portals its dialogs: the host's container, or the body. */
78
+ export function useRoomPortal() {
79
+ return useContext(RoomContext)?.portalContainer ?? undefined;
80
+ }
81
+ /** The session whose document is being read here. Reads that name no session
82
+ * of their own — a stored text member, an attachment's bytes — ride its client. */
83
+ const ReadingSessionContext = createContext(null);
84
+ export const ReadingSessionProvider = ReadingSessionContext.Provider;
85
+ export function useReadingSession() {
86
+ return useContext(ReadingSessionContext);
87
+ }
@@ -0,0 +1,127 @@
1
+ /* The small calendar is one launch target. The cursor repeats the app's
2
+ fullscreen corners, with contrasting strokes that stay visible in both themes. */
3
+ .ah-chart-launcher { position: relative; }
4
+ .ah-chart-launcher--models { flex: 1; min-height: 0; display: flex; flex-direction: column; }
5
+ .ah-chart-launcher__button {
6
+ position: absolute; inset: 0; width: 100%; padding: 0;
7
+ border: 0; border-radius: 6px; background: transparent;
8
+ cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M12 6H6v6M20 6h6v6M12 26H6v-6M20 26h6v-6' fill='none' stroke='white' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M12 6H6v6M20 6h6v6M12 26H6v-6M20 26h6v-6' fill='none' stroke='%23202020' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") 16 16, zoom-in;
9
+ }
10
+ .ah-chart-launcher__button:disabled { cursor: default; }
11
+ .ah-chart-launcher__button:focus-visible { outline: 2px solid var(--vf-select); outline-offset: 4px; }
12
+ .ah-chart-launcher__hint {
13
+ position: absolute; top: -3px; right: 0; display: flex; align-items: center; gap: 4px;
14
+ padding: 3px 6px; border-radius: 5px; background: var(--vf-chrome-solid);
15
+ color: var(--vf-text-secondary); font-size: 9px; opacity: 0;
16
+ transition: opacity 160ms ease; pointer-events: none;
17
+ }
18
+ .ah-chart-launcher__hint svg { width: 11px; height: 11px; }
19
+ .ah-chart-launcher__button:not(:disabled):hover .ah-chart-launcher__hint,
20
+ .ah-chart-launcher__button:focus-visible .ah-chart-launcher__hint { opacity: 1; }
21
+ @media (hover: none) { .ah-chart-launcher__button:not(:disabled) .ah-chart-launcher__hint { opacity: 1; } }
22
+
23
+ /* The calendar is a compact date picker; the hourly plot uses the remaining
24
+ dialog height. Overflow remains available as a fallback, never as clipping. */
25
+ .ah-activity {
26
+ --activity-run-current: var(--vf-foreground);
27
+ --activity-run-best: color-mix(in srgb, var(--vf-foreground) 45%, var(--vf-chrome-solid));
28
+ flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: auto; padding: 14px 16px; color: var(--vf-text-primary);
29
+ }
30
+ .ah-activity__calendar { flex: none; min-width: 0; }
31
+ .ah-activity__toolbar { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
32
+ .ah-activity h2 { margin: 0 0 3px; font-size: 15px; font-weight: 550; letter-spacing: -.02em; }
33
+ .ah-activity__toolbar p, .ah-activity__dayhead p { margin: 0; font-size: 10px; line-height: 1.4; color: var(--vf-text-tertiary); }
34
+ .ah-activity__calendar-nav, .ah-daychart__modelnav { display: flex; align-items: center; gap: 4px; font-size: 9px; color: var(--vf-text-tertiary); }
35
+ .ah-activity__calendar-nav { flex: none; }
36
+ .ah-activity__calendar-nav button { display: grid; place-items: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 5px; background: var(--vf-fill); color: var(--vf-text-secondary); font: inherit; font-size: 12px; }
37
+ .ah-activity__calendar-nav button:disabled, .ah-daychart__modelnav button:disabled { opacity: .3; cursor: default; }
38
+ .ah-activity__calendar-scroll { min-width: 0; }
39
+ .ah-activity__calendar-layout { display: grid; grid-template-columns: 24px minmax(0, 1fr); gap: 6px; max-width: 100%; margin: 0 auto; }
40
+ .ah-activity__weekdays { display: grid; grid-template-rows: repeat(7, 1fr); margin-top: 19px; margin-bottom: 21px; align-items: center; font-size: 9px; color: var(--vf-text-tertiary); }
41
+ .ah-activity .ah-calendar-heatmap { width: min(100%, calc(var(--activity-weeks) * 16px - 2px)); }
42
+ .ah-activity .ah-calendar-heatmap__axis { margin: 0 0 5px; height: 14px; }
43
+ .ah-activity .ah-calendar-heatmap__axis span { font-size: 9px; color: var(--vf-text-tertiary); }
44
+ .ah-activity .ah-calendar-heatmap__grid, .ah-activity .ah-calendar-heatmap__week { gap: 2px; }
45
+ .ah-activity .ah-calendar-heatmap__cell { position: relative; border: 0; padding: 0; border-radius: 2px; min-height: 0; max-height: 14px; }
46
+ .ah-activity .ah-calendar-heatmap__cell[data-run]::after { content: ''; position: absolute; left: 1px; right: 1px; bottom: 1px; height: 2px; border-radius: 1px; background: var(--activity-run-current); }
47
+ .ah-activity .ah-calendar-heatmap__cell[data-run="best"]::after { background: var(--activity-run-best); }
48
+ .ah-activity .ah-calendar-heatmap__cell[data-run="both"]::after { background: linear-gradient(90deg, var(--activity-run-current) 50%, var(--activity-run-best) 50%); }
49
+ .ah-activity .ah-calendar-heatmap__cell[aria-pressed="true"] { outline: 2px solid var(--vf-foreground); outline-offset: 1px; }
50
+ .ah-activity .ah-calendar-heatmap__cell:hover, .ah-activity .ah-calendar-heatmap__cell:focus-visible { outline: 2px solid var(--vf-select); outline-offset: 1px; }
51
+ .ah-activity .ah-calendar-heatmap__footer { width: var(--activity-footer-width); min-width: 0; margin-top: 8px; font-size: 9px; min-height: 13px; }
52
+ .ah-activity .ah-calendar-heatmap__legend { gap: 3px; }
53
+ .ah-activity .ah-calendar-heatmap__legend i { width: 8px; height: 8px; }
54
+ .ah-activity__runs { display: flex; flex-wrap: wrap; align-items: center; gap: 5px 18px; margin-top: 8px; min-height: 24px; }
55
+ .ah-activity__run { display: grid; grid-template-columns: 11px auto auto; align-items: center; gap: 5px; padding: 3px 0; border: 0; background: transparent; color: var(--vf-text-secondary); font: inherit; font-size: 10px; text-align: left; }
56
+ .ah-activity__run > i { width: 9px; height: 3px; border-radius: 2px; background: var(--activity-run-current); }
57
+ .ah-activity__run > i[data-kind="best"] { background: var(--activity-run-best); }
58
+ .ah-activity__run > i[data-kind="both"] { background: linear-gradient(90deg, var(--activity-run-current) 50%, var(--activity-run-best) 50%); }
59
+ .ah-activity__run b { font-weight: 500; margin-left: 3px; }
60
+ .ah-activity__run small { font-size: 9px; color: var(--vf-text-tertiary); }
61
+ .ah-activity__run:hover span { text-decoration: underline; }
62
+ .ah-activity__jump { margin-left: auto; display: flex; gap: 6px; padding: 5px 8px; border: 0; border-radius: 6px; background: var(--vf-fill); color: var(--vf-text-secondary); font: inherit; font-size: 10px; text-align: left; }
63
+ .ah-activity__jump span { color: var(--vf-text-tertiary); }
64
+ .ah-activity__day { flex: 1; min-height: 0; display: flex; flex-direction: column; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--vf-hairline); }
65
+ .ah-activity__dayhead { flex: none; display: flex; justify-content: space-between; gap: 10px; align-items: center; margin-bottom: 8px; }
66
+ .ah-activity__daynav { display: flex; gap: 5px; flex: none; }
67
+ .ah-activity__daynav button, .ah-activity__empty button { border: 0; border-radius: 6px; background: var(--vf-fill); color: var(--vf-text-secondary); padding: 5px 8px; font: inherit; font-size: 12px; }
68
+ .ah-activity__daynav button:disabled { opacity: .3; cursor: default; }
69
+ .ah-activity__empty { flex: 1; min-height: 0; display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 8px; color: var(--vf-text-tertiary); font-size: 11px; text-align: center; }
70
+ .ah-activity__empty strong { font-weight: 500; color: var(--vf-text-secondary); }
71
+ .ah-activity__updated { flex: none; margin: 4px 0 0; font-size: 9px; color: var(--vf-text-tertiary); }
72
+ .ah-daychart { flex: 1; min-height: 0; display: flex; flex-direction: column; }
73
+ .ah-daychart__readout { flex: none; display: flex; flex-wrap: wrap; gap: 4px 10px; align-items: baseline; margin-bottom: 8px; min-height: 14px; font-size: 10px; }
74
+ .ah-daychart__readout strong { font-weight: 500; }
75
+ .ah-daychart__readout span { color: var(--vf-text-tertiary); }
76
+ .ah-daychart__body { flex: 1; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr) clamp(146px, 20vw, 210px); grid-template-rows: minmax(0, 1fr); gap: 16px; }
77
+ .ah-daychart__graph { min-width: 0; min-height: 0; display: flex; flex-direction: column; padding: 20px 12px 21px 38px; position: relative; }
78
+ .ah-daychart__unit { position: absolute; top: 0; left: 0; font-size: 9px; color: var(--vf-text-tertiary); cursor: help; }
79
+ .ah-daychart__plot { flex: 1; position: relative; min-height: 80px; }
80
+ .ah-daychart__gridline { position: absolute; left: 0; right: 0; border-top: 1px solid var(--vf-hairline); }
81
+ .ah-daychart__gridline > span { position: absolute; right: calc(100% + 8px); transform: translateY(-50%); font-size: 9px; color: var(--vf-text-tertiary); font-variant-numeric: tabular-nums; white-space: nowrap; }
82
+ .ah-daychart__plot svg { position: relative; display: block; width: 100%; height: 100%; overflow: visible; cursor: crosshair; }
83
+ .ah-daychart__area { opacity: .65; pointer-events: none; }
84
+ .ah-daychart__glow { opacity: .2; filter: blur(3px); pointer-events: none; }
85
+ .dark .ah-daychart__area { opacity: 1; }
86
+ .dark .ah-daychart__glow { opacity: .4; }
87
+ .ah-daychart__line, .ah-daychart__glow, .ah-daychart__pending { stroke-linecap: round; stroke-linejoin: round; }
88
+ .ah-daychart__pending { stroke-dasharray: 3 6; opacity: .4; }
89
+ .ah-daychart__point { position: absolute; width: 8px; height: 8px; box-sizing: border-box; border: 2px solid var(--model-color); border-radius: 50%; background: var(--vf-chrome-solid); box-shadow: 0 0 8px color-mix(in srgb, var(--model-color) 45%, transparent); transform: translate(-50%, -50%); pointer-events: none; }
90
+ .ah-daychart__peak { position: absolute; top: 0; bottom: 0; border-left: 1px dashed var(--vf-text-faint); opacity: .5; }
91
+ .ah-daychart__crosshair { stroke: var(--vf-text-tertiary); stroke-width: 1; stroke-dasharray: 4 4; }
92
+ .ah-daychart__axis { position: relative; margin-top: 10px; font-size: 9px; color: var(--vf-text-tertiary); }
93
+ .ah-daychart__axis span { position: absolute; transform: translateX(-50%); white-space: nowrap; }
94
+ .ah-daychart__future { position: absolute; top: 0; right: 0; bottom: 0; background: linear-gradient(90deg, transparent, var(--vf-fill)); pointer-events: none; }
95
+ .ah-daychart__future-label { position: absolute; top: -20px; right: 0; max-width: calc(100% - 12px); text-align: right; font-size: 9px; color: var(--vf-text-tertiary); pointer-events: none; }
96
+ .ah-daychart__legendhead { display: flex; justify-content: space-between; gap: 8px; margin-bottom: 6px; font-size: 9px; line-height: 14px; color: var(--vf-text-tertiary); }
97
+ .ah-daychart__models { min-width: 0; min-height: 0; }
98
+ .ah-daychart__models > button { display: grid; grid-template-columns: minmax(0, 1fr) 36px; grid-template-rows: 13px 3px; gap: 4px 8px; width: 100%; padding: 4px 0; border: 0; background: transparent; color: var(--vf-text-secondary); font: inherit; font-size: 10px; text-align: left; }
99
+ .ah-daychart__models > button[aria-pressed="false"] { opacity: .4; }
100
+ .ah-daychart__modelname { display: flex; align-items: center; gap: 5px; min-width: 0; }
101
+ .ah-daychart__modelname > i { flex: none; width: 6px; height: 6px; border-radius: 50%; background: var(--model-color); }
102
+ .ah-daychart__modelname > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
103
+ .ah-daychart__models b, .ah-daychart__models small { font-weight: 400; text-align: right; font-variant-numeric: tabular-nums; }
104
+ .ah-daychart__models small { font-size: 8px; line-height: 3px; color: var(--vf-text-tertiary); }
105
+ .ah-daychart__share { height: 3px; margin-left: 11px; background: var(--vf-fill); border-radius: 2px; align-self: center; overflow: hidden; }
106
+ .ah-daychart__share > i { display: block; height: 100%; background: var(--model-color); border-radius: inherit; }
107
+ .ah-daychart__modelnav { justify-content: flex-end; height: 22px; margin-top: 4px; }
108
+ .ah-daychart__modelnav button { display: grid; place-items: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 5px; background: var(--vf-fill); color: var(--vf-text-secondary); font: inherit; font-size: 12px; }
109
+ .ah-activity button:focus-visible, .ah-daychart__plot svg:focus-visible { outline: 2px solid var(--vf-select); outline-offset: 3px; }
110
+ .ah-activity__jump:hover, .ah-activity__calendar-nav button:not(:disabled):hover, .ah-daychart__modelnav button:not(:disabled):hover, .ah-activity__daynav button:not(:disabled):hover, .ah-activity__empty button:hover { background: var(--vf-fill-hover); }
111
+ @media (max-width: 760px) {
112
+ .ah-activity { padding: 12px; }
113
+ .ah-activity__toolbar { flex-wrap: wrap; gap: 8px; }
114
+ .ah-activity__runs { gap: 5px 12px; }
115
+ .ah-activity__run small { display: none; }
116
+ .ah-activity__jump { margin-left: 0; }
117
+ .ah-activity__dayhead h2 { font-size: 14px; }
118
+ .ah-daychart__body { gap: 12px; }
119
+ }
120
+ @media (max-width: 500px) {
121
+ .ah-daychart__body { grid-template-columns: minmax(0, 1fr) 126px; gap: 8px; }
122
+ .ah-daychart__graph { padding-left: 32px; padding-right: 10px; }
123
+ .ah-daychart__legendhead { font-size: 8px; gap: 4px; }
124
+ .ah-daychart__models > button { font-size: 9px; gap: 4px; grid-template-columns: minmax(0, 1fr) 30px; }
125
+ .ah-daychart__axis span:nth-child(2), .ah-daychart__axis span:nth-child(4) { display: none; }
126
+ }
127
+ @media (prefers-reduced-motion: reduce) { .ah-chart-launcher__hint { transition: none; } }
@@ -0,0 +1,29 @@
1
+ /* §06A: image strips sit below authored text and outside both activity folds. */
2
+ .tr-prompt-message { min-width: 0; max-width: 100%; width: 100%; }
3
+ .tr-attachments { container-type: inline-size; position: relative; margin-top: 10px; min-width: 0; max-width: 100%; }
4
+ .tr-att { display: flex; gap: 10px; overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: none; padding: 4px; margin: -4px; scroll-padding-inline: 4px; }
5
+ .tr-att::-webkit-scrollbar { display: none; }
6
+ .tr-att figure { flex: 0 0 144px; width: 144px; min-width: 0; margin: 0; }
7
+ .tr-att__tile { display: grid; place-items: center; position: relative; width: 100%; aspect-ratio: 1; box-sizing: border-box; overflow: hidden; border-radius: 16px; background: var(--vf-fill); box-shadow: inset 0 0 0 1px var(--vf-hairline); }
8
+ button.tr-att__tile { padding: 0; border: 0; color: inherit; cursor: pointer; appearance: none; }
9
+ .tr-att__tile img { display: block; position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
10
+ .tr-att__tile--missing, .tr-att__tile--loading { align-content: center; gap: 6px; padding: 12px; color: var(--vf-text-tertiary); font-size: 11px; line-height: 1.4; text-align: center; }
11
+ .tr-att__tile--missing { border: 1px dashed var(--vf-hairline-strong); box-shadow: none; }
12
+ .tr-att__tile--loading { color: var(--vf-text-faint); }
13
+ .tr-att__retry { appearance: none; border: 0; padding: 3px 6px; background: transparent; color: var(--vf-text-secondary); font: inherit; cursor: pointer; text-decoration: underline; text-underline-offset: 3px; }
14
+ .tr-att__nav { position: absolute; top: calc(50% - 15px); width: 30px; height: 30px; display: grid; place-items: center; border: 1px solid var(--vf-hairline-strong); border-radius: 50%; background: var(--vf-chrome-solid); color: var(--vf-text-secondary); box-shadow: var(--vf-shadow-island); font: 24px/1 var(--vf-font-sans); padding: 0 0 2px; cursor: pointer; }
15
+ .tr-att__nav[data-edge] { visibility: hidden; }
16
+ .tr-att__nav[data-edge]:focus-visible { visibility: visible; opacity: 0.5; }
17
+ .tr-att__nav--previous { left: 6px; }
18
+ .tr-att__nav--next { right: 6px; }
19
+ .tr-att__tile:focus-visible, .tr-att__nav:focus-visible, .tr-att__retry:focus-visible { outline: 2px solid var(--vf-select); outline-offset: 2px; }
20
+ @media (hover: hover) {
21
+ .tr-att__nav { opacity: 0; transition: opacity 120ms; }
22
+ .tr-attachments:hover .tr-att__nav, .tr-attachments:focus-within .tr-att__nav { opacity: 1; }
23
+ button.tr-att__tile:hover { outline: 1px solid var(--vf-hairline-strong); outline-offset: 2px; }
24
+ }
25
+ @media (prefers-reduced-motion: reduce) { .tr-att__nav { transition: none; } }
26
+ @container (max-width: 440px) { .tr-att figure { flex-basis: 112px; width: 112px; } .tr-att { gap: 8px; } }
27
+ @container (max-width: 300px) { .tr-att__tile--missing svg, .tr-att__tile--loading svg { display: none; } .tr-att__tile--missing, .tr-att__tile--loading { padding: 10px; } .tr-att figure { flex-basis: 96px; width: 96px; } .tr-att__tile { border-radius: 13px; } }
28
+ .tr-ledger > .tr-attachments { margin-top: 8px; margin-bottom: 12px; }
29
+ .tr-prompt-message + .tr-prompt-message:has(.tr-attachments), .tr-prompt-message:has(.tr-attachments) + .tr-prompt-message { margin-top: 8px; }
@@ -0,0 +1,73 @@
1
+ /* SITE ICONS — the design record's `.fav` rules, ported to this app's tokens
2
+ and kept under the transcript's `tr-` prefix.
3
+
4
+ A search's sources are the one place identity should carry colour: a site's
5
+ own icon is content, like a widget's committed surface, and it is the
6
+ fastest way to tell GitHub from MDN from a blog. So the icon keeps its
7
+ colour — but it lives in the detail and in a small stack at the line's
8
+ edge, NEVER in the glyph slot, which stays monoline. State and identity do
9
+ not share a place.
10
+
11
+ A site whose icon was not fetched — refused, 404, setting off, no bridge —
12
+ wears the globe: no ring, no plate, on the tertiary ramp, because the globe
13
+ is a glyph and not a site's mark. */
14
+
15
+ .tr-fav {
16
+ --tr-fav-size: 14px;
17
+ display: inline-flex;
18
+ flex: none;
19
+ width: var(--tr-fav-size);
20
+ height: var(--tr-fav-size);
21
+ border-radius: 4px;
22
+ overflow: hidden;
23
+ /* A hairline RING rather than a border: it costs no layout box, so a 14px
24
+ icon stays 14px in a row whose height is already spoken for. */
25
+ box-shadow: 0 0 0 1px var(--vf-hairline);
26
+ background: var(--vf-chrome-solid);
27
+ }
28
+
29
+ .tr-fav > svg,
30
+ .tr-fav > img {
31
+ display: block;
32
+ width: var(--tr-fav-size);
33
+ height: var(--tr-fav-size);
34
+ /* Icons arrive at whatever size the site drew them; letterboxing a
35
+ non-square one is honest, cropping it is not. */
36
+ object-fit: contain;
37
+ }
38
+
39
+ /* The globe is a glyph, so it obeys the glyph rules: no plate, no ring, and
40
+ the tertiary ramp — never hue. */
41
+ .tr-fav--globe {
42
+ box-shadow: none;
43
+ background: none;
44
+ color: var(--vf-text-tertiary);
45
+ }
46
+
47
+ /* While the shell is being asked, the plate is the whole state: a ring and an
48
+ empty surface. Nothing spins — a 14px spinner for a 2KB icon is machinery
49
+ louder than what it is waiting for. */
50
+ .tr-fav--loading {
51
+ background: var(--vf-fill);
52
+ box-shadow: 0 0 0 1px var(--vf-hairline);
53
+ }
54
+
55
+ /* THE STACK — the first three sites of a search, at the line's right edge.
56
+ They overlap by 4px, and each carries a ring in the SURFACE colour rather
57
+ than the hairline so the overlap reads as depth instead of as a smudge. */
58
+ .tr-favs {
59
+ display: inline-flex;
60
+ align-items: center;
61
+ }
62
+
63
+ .tr-favs .tr-fav {
64
+ box-shadow: 0 0 0 1.5px var(--ah-plate);
65
+ }
66
+
67
+ .tr-favs .tr-fav--globe {
68
+ box-shadow: none;
69
+ }
70
+
71
+ .tr-favs .tr-fav + .tr-fav {
72
+ margin-left: -4px;
73
+ }
@@ -0,0 +1,18 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════════
2
+ @vibefield/rosetta-room's stylesheet (`@vibefield/rosetta-room/styles/room.css`). Import it once,
3
+ after the host's tokens: the room reads the VibeField design-kit's --vf-*
4
+ names and brings its own (--ah-*, --tr-*, the --tint-* band). Every rule is
5
+ scoped to the room's root (.ah-frame) and to the layers it portals
6
+ (.ah-layer); the page itself is the host's. A few parts import their own
7
+ sheets beside them, which the bundler brings along.
8
+ ═══════════════════════════════════════════════════════════════════════ */
9
+ @import "./room.css";
10
+ @import "./ingest.css";
11
+ @import "./transcript.css";
12
+ @import "./search.css";
13
+ @import "./reader.css";
14
+ @import "./host-inputs.css";
15
+ /* The worktree guest's tree: mille's token surface and the VibeField theme,
16
+ which reads the host's --vf-* tokens live. */
17
+ @import "@vibecook/mille-ui/tokens.css";
18
+ @import "@vibecook/mille-ui/theme/vibefield.css";