@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,1226 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════════
2
+ THE TRANSCRIPT — the locked record (protos/agent-history-proto/transcript),
3
+ ported to this app's tokens.
4
+
5
+ Rules prefixed `tr-` are the record's own, transcribed rather than
6
+ redesigned: it was written against these same `--vf-` names, so the port is
7
+ a transcription and any drift between the two is a bug in this file. Where
8
+ the record used an inline style (an anchor's offset, a chosen option's ink)
9
+ the rule is written here instead, marked WRITTEN, because a component
10
+ cannot carry a stylesheet's job.
11
+
12
+ The claim it draws: at rest the prompt is the only container, the reply is bare, the
13
+ machinery is a ledger you can read without opening, and hue is spent only on
14
+ what did not complete or is still happening.
15
+
16
+ Two neighbours own their own files and are NOT duplicated here:
17
+ `transcript-head.css` (§08's head line, receipt and top fade) and
18
+ `favicon.css` (a source's own icon).
19
+ ═══════════════════════════════════════════════════════════════════════════ */
20
+
21
+ /* The measure is a CONTAINER: the anchor's margin appears and disappears with
22
+ the rail, not with the window, so the query has to ask the column. */
23
+ .tr-col { container-type: inline-size; container-name: measure; }
24
+ /* The record is one vertical reading surface. Wide code and tables own their
25
+ local scrollports; the document itself must never acquire a sideways one.
26
+ Removing the room's 6px top inset lets the fade begin at the literal
27
+ scrollport edge; the pill keeps its own inset above that painted ground.
28
+ The same 6px stays in the document's resting headroom. */
29
+ .tr-scroll { padding-top: 0; overflow-x: hidden; overscroll-behavior-y: contain; }
30
+ /* Native anchoring holds a paused reader in place. While following, the
31
+ tail controller owns the position, including images and streamed text. */
32
+ .tr-scroll[data-following] { overflow-anchor: none; }
33
+ .tr-scroll:focus-visible { outline: 2px solid var(--vf-select); outline-offset: -2px; }
34
+ .tr {
35
+ --tr-action-gap: 14px;
36
+ position: relative; max-width: 68ch; margin: 0 auto; padding: 28px 28px 30px;
37
+ font-size: 14px; line-height: 1.55; color: var(--vf-text-primary);
38
+ }
39
+ .tr p { margin: 0; }
40
+
41
+ /* the turn — one human prompt and everything that answered it */
42
+ .tr-turn { position: relative; }
43
+ .tr-turn + .tr-turn { margin-top: 30px; }
44
+
45
+ /* T-4 — every segment can be pointed at: the anchor lives in the margin when
46
+ the column has one, and on hover otherwise (decided Q3 A). */
47
+ .tr-seg { position: relative; }
48
+ .tr-seg + .tr-seg { margin-top: 12px; }
49
+ .tr-anchor {
50
+ position: absolute; top: 3px; right: 100%; margin-right: 18px; padding: 0 3px;
51
+ border-radius: 4px; color: var(--vf-text-faint);
52
+ font-family: var(--vf-font-mono); font-size: 10.5px; font-variant-numeric: tabular-nums;
53
+ line-height: 16px; white-space: nowrap; opacity: 0; cursor: copy;
54
+ transition: opacity 160ms ease, background-color 160ms ease, color 160ms ease;
55
+ }
56
+ /* WRITTEN — the record drew a span; this room needs a real act, so the
57
+ button is reset back to the span the record specified. */
58
+ button.tr-anchor { border: 0; background: none; font-weight: 400; }
59
+ .tr-anchor:hover { background: var(--vf-fill); color: var(--vf-text-secondary); }
60
+ .tr-seg:hover > .tr-anchor, .tr-seg:focus-within > .tr-anchor { opacity: 1; }
61
+ @container measure (min-width: 760px) { .tr-anchor { opacity: 1; } }
62
+ /* WRITTEN — the record carried these two offsets as inline styles on the
63
+ specimen's markup. A panel's first line sits lower than a paragraph's. */
64
+ .tr-seg[data-prompt] > .tr-anchor { top: 12px; }
65
+ .tr-seg[data-command] > .tr-anchor { top: 5px; }
66
+ /* WRITTEN — the record reveals the anchor on hover when the column has no
67
+ gutter, but only ever drew it against frames wide enough to have one. In
68
+ this room's three-column 1120px layout the transcript's 28px padding cannot
69
+ hold a 57px time, and a time hanging past the column's edge was clipped to
70
+ its last digit. Under 760px the transcript keeps a 60px gutter on the left
71
+ for exactly this: the column already caps the measure below 68ch here, so
72
+ the gutter costs about 24px of line, and the revealed anchor — one size
73
+ down, closer in — sits wholly inside the column, never over the words. */
74
+ @container measure (max-width: 759.98px) {
75
+ .tr { --tr-action-gap: 10px; padding-left: 60px; padding-right: 60px; }
76
+ .tr-anchor { margin-right: 4px; font-size: 10px; }
77
+ }
78
+
79
+ /* ── T-1 — the prompt: the one container in the document ──────────────────── */
80
+ .tr-prompt {
81
+ display: inline-block; max-width: 100%; padding: 11px 15px 12px;
82
+ border-radius: 10px; background: var(--vf-fill); color: var(--vf-text-primary);
83
+ transition: background-color 140ms ease;
84
+ /* WRITTEN — the record's specimen held prose; a real prompt holds pasted
85
+ urls and injected tags, and one unbreakable token must not push the
86
+ panel past the measure it is content-hugging inside. */
87
+ overflow-wrap: anywhere;
88
+ }
89
+ .tr-prompt p + p { margin-top: 8px; }
90
+ .tr-prompt code { font-family: var(--vf-font-mono); font-size: 12.5px; }
91
+
92
+ /* Message boundaries (2026-09-09): reveal the authored block under the pointer,
93
+ including its images and citations. Paint into the existing space around a
94
+ reply so text, wrapping, sticky actions and scroll geometry stay stationary. */
95
+ .tr-seg.tr-prose {
96
+ --tr-hover-fill: color-mix(in srgb, var(--vf-foreground) 2%, transparent);
97
+ border-radius: 3px;
98
+ box-shadow: 0 0 0 6px transparent;
99
+ transition: background-color 140ms ease, box-shadow 140ms ease;
100
+ }
101
+ .tr-prompt:has(:focus-visible) {
102
+ background: color-mix(in srgb, var(--vf-fill) 98%, var(--vf-foreground));
103
+ }
104
+ .tr-seg.tr-prose:has(:focus-visible) {
105
+ background: var(--tr-hover-fill);
106
+ box-shadow: 0 0 0 6px var(--tr-hover-fill);
107
+ }
108
+ @media (hover: hover) and (pointer: fine) {
109
+ .tr-prompt:hover {
110
+ background: color-mix(in srgb, var(--vf-fill) 98%, var(--vf-foreground));
111
+ }
112
+ .tr-seg.tr-prose:hover {
113
+ background: var(--tr-hover-fill);
114
+ box-shadow: 0 0 0 6px var(--tr-hover-fill);
115
+ }
116
+ }
117
+ @media (prefers-reduced-motion: reduce) {
118
+ .tr-prompt, .tr-seg.tr-prose { transition: none; }
119
+ }
120
+
121
+ /* A recorded image marker is a second handle for the same image. It
122
+ reads like a link and acts like the thumbnail, without navigating away. */
123
+ .tr-image-link {
124
+ margin: 0; padding: 0; border: 0; background: none; color: var(--vf-cyan);
125
+ font: inherit; line-height: inherit; text-decoration: underline;
126
+ text-decoration-color: color-mix(in srgb, currentColor 42%, transparent);
127
+ text-underline-offset: 2px; cursor: zoom-in;
128
+ }
129
+ .tr-image-link:hover { text-decoration-color: currentColor; }
130
+
131
+ /* §03 H — a command is one object; settings reduce to label + useful value */
132
+ .tr-setting {
133
+ display: inline-flex; align-items: center; min-width: 0; max-width: 100%; height: 26px;
134
+ padding: 0 10px; border-radius: 999px; background: var(--vf-fill); white-space: nowrap;
135
+ }
136
+ .tr-setting__label {
137
+ display: inline-flex; align-items: center; flex: none;
138
+ color: var(--vf-text-tertiary); font-size: 10.5px; font-weight: 500;
139
+ }
140
+ .tr-setting__label::after {
141
+ content: ""; width: 1px; height: 11px; margin: 0 8px;
142
+ background: var(--vf-hairline-strong);
143
+ }
144
+ .tr-setting__value {
145
+ min-width: 0; overflow: hidden; text-overflow: ellipsis;
146
+ color: var(--vf-text-primary); font-size: 11.5px; font-weight: 500;
147
+ }
148
+ .tr-cmd { display: inline-flex; align-items: center; gap: 8px; max-width: 100%; }
149
+ .tr-cmd code {
150
+ min-width: 0; overflow: hidden; text-overflow: ellipsis; display: inline-flex; align-items: center; height: 26px; padding: 0 10px;
151
+ border-radius: 999px; background: var(--vf-fill); color: var(--vf-text-primary);
152
+ font-family: var(--vf-font-mono); font-size: 11.5px; white-space: nowrap;
153
+ }
154
+ .tr-cmd span {
155
+ /* WRITTEN — a flex child will not shrink below its content without this,
156
+ and a command's output is one long line by nature. */
157
+ min-width: 0;
158
+ color: var(--vf-text-tertiary); font-size: 12.5px;
159
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
160
+ }
161
+
162
+ /* ── T-4 — one head per response ──────────────────────────────────────────── */
163
+ .tr-resp { margin-top: 16px; }
164
+ .tr-head {
165
+ display: flex; align-items: center; gap: 8px; height: 22px; margin-bottom: 6px;
166
+ color: var(--vf-text-tertiary); font-size: 10.5px; font-weight: 500;
167
+ text-transform: uppercase; letter-spacing: 0.07em;
168
+ }
169
+ .tr-head .mark { display: inline-flex; width: 14px; height: 14px; color: var(--vf-text-secondary); }
170
+ .tr-head .mark svg { width: 14px; height: 14px; }
171
+ /* WRITTEN — the room's own `AgentMark` draws a 12px span; the head's slot is
172
+ 14, and one rule sizes the wrapper and the drawing together. */
173
+ .tr-head .mark .ah-agent { width: 14px; height: 14px; color: inherit; }
174
+ .tr-head .model { font-weight: 400; text-transform: none; letter-spacing: 0; color: var(--vf-text-faint); }
175
+ .tr-head .facts {
176
+ margin-left: auto; font-weight: 400; text-transform: none; letter-spacing: 0;
177
+ color: var(--vf-text-faint); font-variant-numeric: tabular-nums; white-space: nowrap;
178
+ }
179
+ .tr-head .facts b { font-weight: 400; color: var(--vf-text-tertiary); }
180
+
181
+ /* ── prose — primary ink: it is the primary content ───────────────────────── */
182
+ .tr-prose { color: var(--vf-text-primary); overflow-wrap: anywhere; }
183
+ .tr-prose p + p, .tr-prose p + ul, .tr-prose p + ol,
184
+ .tr-prose ul + p, .tr-prose ol + p { margin-top: 12px; }
185
+ .tr-prose h3 { margin: 22px 0 8px; font-size: 14.5px; font-weight: 600; }
186
+ .tr-prose ul, .tr-prose ol { margin: 0; padding-left: 22px; }
187
+ .tr-prose li { margin-bottom: 5px; }
188
+ .tr-prose li::marker { color: var(--vf-text-tertiary); }
189
+ .tr-prose strong { font-weight: 600; }
190
+ .tr-prose em { color: var(--vf-text-primary); }
191
+ .tr-prose code {
192
+ padding: 1px 4px; border-radius: 4px; background: var(--vf-fill);
193
+ font-family: var(--vf-font-mono); font-size: 12px;
194
+ }
195
+ /* WRITTEN — the elements the record's specimen never happened to contain.
196
+ The transcript does not borrow `.ah-markdown`: two stylesheets setting the
197
+ same paragraph's margin is a rule with a race in it. */
198
+ .tr-prose h1, .tr-prose h2, .tr-prose h4, .tr-prose h5, .tr-prose h6 {
199
+ margin: 22px 0 8px; font-weight: 600; line-height: 1.3;
200
+ }
201
+ .tr-prose h1 { font-size: 17px; }
202
+ .tr-prose h2 { font-size: 15.5px; }
203
+ .tr-prose h4, .tr-prose h5, .tr-prose h6 { font-size: 13.5px; color: var(--vf-text-secondary); }
204
+ .tr-prose > :first-child { margin-top: 0; }
205
+ .tr-prose a { color: var(--vf-cyan); text-decoration: none; }
206
+ .tr-prose a:hover { text-decoration: underline; }
207
+ .tr-prose s { color: var(--vf-text-faint); }
208
+ .tr-prose blockquote {
209
+ margin: 12px 0; padding: 2px 0 2px 12px;
210
+ border-left: 2px solid var(--vf-hairline-strong); color: var(--vf-text-secondary);
211
+ }
212
+ .tr-prose hr { margin: 18px 0; border: 0; border-top: 1px solid var(--vf-hairline); }
213
+ .tr-prose li > ul, .tr-prose li > ol { margin-top: 5px; }
214
+ .tr-prose [data-tight] li > p { margin: 0; }
215
+ .tr-prose .ah-md__image, .tr-prose .ah-md__deadlink {
216
+ color: var(--vf-text-faint); font-family: var(--vf-font-mono); font-size: 11.5px;
217
+ }
218
+ /* A wide table scrolls inside its own box; the measure is not the table's to
219
+ widen — the same rule the markdown view already states. */
220
+ .tr-prose .ah-md__tablebox { margin: 12px 0; overflow-x: auto; }
221
+ .tr-prose table { border-collapse: collapse; width: 100%; font-size: 12.5px; }
222
+ .tr-prose th, .tr-prose td {
223
+ padding: 5px 10px 5px 0; border-bottom: 1px solid var(--vf-hairline);
224
+ text-align: left; vertical-align: top;
225
+ }
226
+ .tr-prose th { color: var(--vf-text-primary); font-weight: 500; white-space: nowrap; }
227
+ /* WRITTEN — a citation is a fact about a paragraph, on the caption ramp. */
228
+ .tr-cites {
229
+ margin-top: 6px; display: flex; flex-wrap: wrap; gap: 4px 10px;
230
+ color: var(--vf-text-faint); font-size: 10.5px;
231
+ }
232
+
233
+ /* the code bar — the fence's language, and a copy act */
234
+ .tr-code { margin: 12px 0 0; border-radius: 10px; background: var(--vf-fill); overflow: hidden; }
235
+ .tr-code__bar {
236
+ display: flex; align-items: center; height: 24px; padding: 0 12px;
237
+ border-bottom: 1px solid var(--vf-hairline); color: var(--vf-text-tertiary); font-size: 10.5px;
238
+ }
239
+ .tr-code__bar button {
240
+ margin-left: auto; border: 0; background: none; color: var(--vf-text-tertiary);
241
+ font-size: 10.5px; cursor: pointer; padding: 0;
242
+ }
243
+ .tr-code__bar button:hover { color: var(--vf-text-primary); }
244
+ .tr-code pre {
245
+ margin: 0; padding: 10px 12px; overflow-x: auto; color: var(--vf-text-secondary);
246
+ font-family: var(--vf-font-mono); font-size: 12px; line-height: 1.5;
247
+ }
248
+ /* WRITTEN — a fence inside the one filled container cannot use that
249
+ container's own fill as its ground: a fill on a fill is no boundary at all.
250
+ The panel supplies the ground, so the block takes the hairline instead. */
251
+ .tr-prompt .tr-code { background: var(--vf-chrome-solid); box-shadow: inset 0 0 0 1px var(--vf-hairline); }
252
+
253
+ /* the hover acts — copy is the one act this room actually has */
254
+ .tr-acts {
255
+ position: absolute; top: 0; bottom: 0; left: calc(100% + var(--tr-action-gap));
256
+ display: flex; align-items: flex-start; gap: 5px; width: max-content;
257
+ /* Sticky actions are chrome, so they share the day pill's layer above the
258
+ top fade (`.tr-frost` is 3) instead of dissolving with message content. */
259
+ z-index: 4; opacity: 0; transition: opacity 160ms ease;
260
+ }
261
+ .tr-seg:hover > .tr-acts, .tr-seg:focus-within > .tr-acts { opacity: 1; }
262
+ .tr-acts button {
263
+ position: sticky; top: 12px; flex: none; white-space: nowrap;
264
+ height: 24px; padding: 0 9px; border: 1px solid var(--vf-hairline); border-radius: 999px;
265
+ background: var(--vf-chrome-solid); color: var(--vf-text-secondary); font-size: 10.5px;
266
+ cursor: pointer; transition: transform 140ms ease, background-color 160ms ease;
267
+ }
268
+ .tr-acts button:hover { background: var(--vf-fill); color: var(--vf-text-primary); }
269
+ .tr-acts button:active { transform: scale(0.94); }
270
+
271
+ /* ── T-2 / T-3 — THE ACTIVITY LEDGER ──────────────────────────────────────
272
+ A contiguous run of machinery is one object (H-1). Its closed state is a
273
+ ledger you can read: verb · object · result, one line per act, on the tree's
274
+ indent guide at the tree's row pitch. Looking folds; acts stay. */
275
+ .tr-ledger { margin: 10px 0 12px 1px; padding-left: 13px; border-left: 1px solid var(--vf-hairline-strong); }
276
+ .tr-line {
277
+ display: grid; grid-template-columns: 16px minmax(72px, max-content) minmax(0, 1fr) auto;
278
+ column-gap: 10px; align-items: center; min-height: var(--vf-tree-row-height);
279
+ margin: 0 -8px; padding: 0 8px; border-radius: 6px;
280
+ color: var(--vf-text-secondary); font-size: 12.5px;
281
+ transition: background-color 120ms ease;
282
+ }
283
+ .tr-line[role="button"] { cursor: pointer; }
284
+ .tr-line[role="button"]:hover { background: var(--vf-fill); }
285
+ .tr-line:focus-visible { outline: none; box-shadow: inset 0 0 0 1.5px var(--vf-select); }
286
+ .tr-line__g { display: inline-flex; width: 14px; height: 14px; color: var(--vf-text-tertiary); }
287
+ .tr-line__g svg { width: 14px; height: 14px; }
288
+ .tr-line__v { color: var(--vf-text-secondary); white-space: nowrap; }
289
+ .tr-line__o {
290
+ font-family: var(--vf-font-mono); font-size: 11.5px; color: var(--vf-text-primary);
291
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0;
292
+ }
293
+ .tr-line__o .dir { color: var(--vf-text-tertiary); }
294
+ .tr-line__o .q { color: var(--vf-text-primary); }
295
+ .tr-line__o .in { color: var(--vf-text-tertiary); font-family: var(--vf-font-sans); font-size: 12px; }
296
+ .tr-line__r {
297
+ display: flex; gap: 12px; align-items: center; color: var(--vf-text-tertiary);
298
+ font-size: 11px; font-variant-numeric: tabular-nums; white-space: nowrap;
299
+ }
300
+ .tr-line__r .t { color: var(--vf-text-faint); font-family: var(--vf-font-mono); font-size: 10.5px; }
301
+ .tr-line__r .tr-fav { vertical-align: middle; }
302
+ .tr-line__r .ttl { max-width: 170px; overflow: hidden; text-overflow: ellipsis; }
303
+ @container measure (max-width: 640px) { .tr-line__r .t { display: none; } }
304
+ /* T-5 — hue only for what did not complete, or is still happening. */
305
+ .tr-line[data-state="failed"] .tr-line__g,
306
+ .tr-line[data-state="failed"] .tr-line__r .why { color: var(--vf-red); }
307
+ .tr-line[data-state="running"] .tr-line__g { color: var(--vf-green); }
308
+ .tr-line[data-state="running"] .tr-line__r .why { color: var(--vf-green); }
309
+ .tr-line[data-state="muted"] .tr-line__v,
310
+ .tr-line[data-state="muted"] .tr-line__o { color: var(--vf-text-tertiary); }
311
+ .tr-line[data-state="muted"] .tr-line__o { font-style: italic; }
312
+ .tr-dot {
313
+ width: 7px; height: 7px; margin: 3.5px; border-radius: 999px; background: currentColor;
314
+ animation: tr-breathe 1.6s ease-in-out infinite;
315
+ }
316
+ @keyframes tr-breathe { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } }
317
+ .tr-line .chev {
318
+ display: inline-flex; width: 12px; height: 12px; color: var(--vf-text-faint);
319
+ transition: transform 180ms var(--vf-ease-island);
320
+ }
321
+ .tr-line .chev svg { width: 12px; height: 12px; }
322
+ .tr-line[aria-expanded="true"] .chev { transform: rotate(90deg); }
323
+ /* WRITTEN — a search hit landing on a line borrows the room's own ring. */
324
+ .tr-line[data-hit="true"], .tr-prompt[data-hit="true"], .tr-seg[data-hit="true"],
325
+ .tr-mark[data-hit="true"], .tr-summary[data-hit="true"] {
326
+ animation: ah-land 1400ms ease;
327
+ }
328
+
329
+ /* the fold — every activity run, even a single line, closes to its head: one
330
+ sentence of nouns, acts first, the changed files named in mono, the failure
331
+ count in red at the right beside the span where a narrow column cannot hide
332
+ it (transcript-fold R-3, amended 2026-09-09). */
333
+ .tr-fold { grid-template-columns: 16px minmax(0, 1fr) auto; }
334
+ .tr-fold .tr-line__v {
335
+ color: var(--vf-text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
336
+ }
337
+ .tr-fold .names { font-family: var(--vf-font-mono); font-size: 11.5px; color: var(--vf-text-primary); }
338
+ /* Closed runs recede behind the conversation; attention restores their ink. */
339
+ .tr-fold[aria-expanded="false"] .tr-line__v,
340
+ .tr-fold[aria-expanded="false"] .names { color: var(--vf-text-tertiary); }
341
+ .tr-fold[aria-expanded="false"]:is(:hover, :focus-visible) .tr-line__v,
342
+ .tr-fold[aria-expanded="false"]:is(:hover, :focus-visible) .names { color: var(--vf-text-secondary); }
343
+ .tr-fold .tr-line__r b { font-weight: 500; color: var(--vf-red); }
344
+ .tr-fold .chev { color: var(--vf-text-tertiary); }
345
+ /* R-5 — a live run's head carries the line that is happening, in green */
346
+ .tr-fold .cur { color: var(--vf-green); }
347
+ .tr-fold .cur .tr-line__o { display: inline; font-family: var(--vf-font-mono); font-size: 11.5px; color: inherit; }
348
+ .tr-fold[aria-expanded="false"] ~ .tr-ladder { display: none; }
349
+ .tr-ladder { margin-left: 2px; padding-left: 12px; border-left: 1px solid var(--vf-hairline); }
350
+ /* inside the ladder every member keeps the form it had as a segment */
351
+ .tr-ladder > .tr-seg { margin: 6px 0 6px 26px; }
352
+ .tr-ladder > .tr-mark { margin: 8px 0; }
353
+ .tr-ladder > .tr-summary { margin: 8px 0 8px 26px; }
354
+ /* §05 — the room's activity act is a store every head reads (see
355
+ `fold-preference.ts`): it sets each run's default and the head's own
356
+ `aria-expanded` is the one switch, so a press on a head still folds it
357
+ while the act holds the room open. `[data-fold]` styles nothing here. */
358
+
359
+ /* the detail — opens in place, inset under its line */
360
+ .tr-detail {
361
+ margin: 2px 0 8px 26px; border: 1px solid var(--vf-hairline-strong); border-radius: 8px;
362
+ overflow: hidden; font-size: 11.5px;
363
+ }
364
+ .tr-detail:has(> .tr-command-cwd) {
365
+ position: relative; margin-top: 8px; overflow: visible;
366
+ }
367
+ .tr-command-cwd {
368
+ position: absolute; z-index: 2; top: 0; left: 10px; transform: translateY(-50%);
369
+ display: flex; align-items: center; gap: 5px; max-width: calc(100% - 22px); height: 15px;
370
+ padding: 0 4px; border-radius: 3px; background: var(--vf-chrome-solid);
371
+ color: var(--vf-text-tertiary); font-family: var(--vf-font-mono); font-size: 9.5px;
372
+ line-height: 15px;
373
+ }
374
+ .tr-command-cwd svg { flex: none; width: 11px; height: 11px; color: var(--vf-text-faint); }
375
+ .tr-command-cwd bdi { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
376
+ .tr-command-cwd + .tr-cmds { padding-top: 9px; }
377
+ .tr-command-cwd + .tr-command-stack { padding-top: 5px; }
378
+ .tr-detail__bar {
379
+ display: flex; align-items: center; gap: 12px; height: 26px; padding: 0 10px;
380
+ border-bottom: 1px solid var(--vf-hairline); color: var(--vf-text-tertiary);
381
+ font-size: 10.5px; font-variant-numeric: tabular-nums;
382
+ }
383
+ .tr-detail__bar .path {
384
+ flex: 1; min-width: 0; font-family: var(--vf-font-mono); color: var(--vf-text-secondary);
385
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
386
+ }
387
+ .tr-detail__bar > span:not(.path) { flex: none; white-space: nowrap; }
388
+ .tr-diff { font-family: var(--vf-font-mono); font-size: 11.5px; line-height: 1.55; overflow-x: auto; }
389
+ .tr-diff div { display: grid; grid-template-columns: 34px 14px 1fr; white-space: pre; }
390
+ .tr-diff div > span:first-child {
391
+ color: var(--vf-text-faint); text-align: right; padding-right: 8px;
392
+ font-variant-numeric: tabular-nums;
393
+ }
394
+ .tr-diff div > span:nth-child(2) { color: var(--vf-text-tertiary); }
395
+ .tr-diff .ctx { color: var(--vf-text-secondary); }
396
+ /* §2.5's own words: positive delta, negative delta — at 11%. */
397
+ .tr-diff .add { background: color-mix(in srgb, var(--vf-green) 11%, transparent); color: var(--vf-text-primary); }
398
+ .tr-diff .del { background: color-mix(in srgb, var(--vf-red) 10%, transparent); color: var(--vf-text-primary); }
399
+ .tr-diff .more {
400
+ padding: 4px 10px; color: var(--vf-text-faint);
401
+ font-family: var(--vf-font-sans); font-size: 10.5px; white-space: normal;
402
+ }
403
+ .tr-diag {
404
+ margin: 0; padding: 8px 10px; background: var(--vf-fill); color: var(--vf-text-secondary);
405
+ font-family: var(--vf-font-mono); font-size: 11.5px; line-height: 1.55; white-space: pre-wrap;
406
+ max-height: 260px; overflow: auto;
407
+ }
408
+ .tr-paths {
409
+ margin: 0; padding: 5px 10px; list-style: none; font-family: var(--vf-font-mono);
410
+ font-size: 11.5px; line-height: 1.9; color: var(--vf-text-secondary);
411
+ white-space: nowrap; overflow-x: hidden;
412
+ }
413
+ .tr-paths[data-openable] { padding: 4px 6px; overflow-x: hidden; }
414
+ .tr-paths__entry,
415
+ .tr-paths__file {
416
+ display: flex; align-items: center; gap: 6px; width: 100%; min-width: 0;
417
+ }
418
+ .tr-paths__entry { padding: 2px 4px; }
419
+ .tr-paths__file {
420
+ padding: 2px 4px; border: 0; border-radius: 5px;
421
+ background: none; color: var(--vf-text-secondary); font: inherit; line-height: inherit;
422
+ text-align: left; white-space: nowrap; overflow: hidden; cursor: pointer;
423
+ }
424
+ .tr-paths__file:hover { background: var(--vf-fill); color: var(--vf-text-primary); }
425
+ .tr-paths__file:focus-visible { outline: none; box-shadow: inset 0 0 0 1.5px var(--vf-select); }
426
+ .tr-paths__icon { flex: none; width: 13px; height: 13px; }
427
+ .tr-paths__icon svg { display: block; width: 100%; height: 100%; }
428
+ .tr-paths .name {
429
+ min-width: 0; overflow: hidden; color: inherit; text-overflow: ellipsis; white-space: nowrap;
430
+ }
431
+ .tr-paths__range {
432
+ flex: none; margin-left: auto; padding-left: 12px; color: var(--vf-text-tertiary);
433
+ font-size: 10.5px; font-variant-numeric: tabular-nums;
434
+ }
435
+ .tr-paths .n { color: var(--vf-text-faint); font-variant-numeric: tabular-nums; margin-left: 10px; }
436
+ .tr-kv { display: grid; grid-template-columns: 90px 1fr; gap: 3px 12px; padding: 7px 10px; font-size: 11.5px; margin: 0; }
437
+ .tr-kv dt { margin: 0; color: var(--vf-text-tertiary); }
438
+ .tr-kv dd { margin: 0; color: var(--vf-text-secondary); font-family: var(--vf-font-mono); word-break: break-word; }
439
+ /* WRITTEN — the record's specimen carried these three as inline styles: a
440
+ pair that must stay on one grid row, a prose value that is not an id, and
441
+ the chosen option in primary ink. */
442
+ .tr-kv__pair { display: contents; }
443
+ .tr-kv dd[data-prose] { font-family: var(--vf-font-sans); line-height: 1.5; }
444
+ .tr-kv dd b { color: var(--vf-text-primary); font-weight: 500; }
445
+ /* WRITTEN — a bounded list says so, and a detail that is prose reads as prose. */
446
+ .tr-more { color: var(--vf-text-faint); font-family: var(--vf-font-sans); font-size: 10.5px; }
447
+ .tr-tasks {
448
+ margin: 0; padding: 4px; list-style: none; color: var(--vf-text-secondary);
449
+ font-size: 11.5px;
450
+ }
451
+ .tr-task {
452
+ display: grid; grid-template-columns: 14px minmax(0, 1fr) auto auto;
453
+ align-items: center; gap: 8px; min-height: 28px; padding: 0 6px; border-radius: 5px;
454
+ }
455
+ .tr-task[data-change] { background: var(--vf-fill); }
456
+ .tr-task__check {
457
+ position: relative; display: block; width: 12px; height: 12px; box-sizing: border-box;
458
+ border: 1px solid var(--vf-hairline-strong); border-radius: 4px; color: var(--vf-text-tertiary);
459
+ }
460
+ .tr-task[data-status="in_progress"] .tr-task__check::after {
461
+ content: ""; position: absolute; inset: 3px; border-radius: 50%; background: currentColor;
462
+ }
463
+ .tr-task[data-status="completed"] .tr-task__check {
464
+ border-color: var(--vf-text-tertiary); background: var(--vf-text-tertiary);
465
+ }
466
+ .tr-task[data-status="completed"] .tr-task__check::after {
467
+ content: ""; position: absolute; left: 3px; top: 1px; width: 3px; height: 6px;
468
+ border: solid var(--vf-chrome-solid); border-width: 0 1.5px 1.5px 0; transform: rotate(45deg);
469
+ }
470
+ .tr-task[data-status="failed"] .tr-task__check,
471
+ .tr-task[data-status="cancelled"] .tr-task__check { border-color: var(--vf-red); color: var(--vf-red); }
472
+ .tr-task[data-status="failed"] .tr-task__check::after,
473
+ .tr-task[data-status="cancelled"] .tr-task__check::after {
474
+ content: "×"; position: absolute; inset: -4px 0 0; font-size: 13px; line-height: 12px;
475
+ text-align: center;
476
+ }
477
+ .tr-task__subject {
478
+ min-width: 0; overflow: hidden; color: var(--vf-text-primary); text-overflow: ellipsis;
479
+ white-space: nowrap;
480
+ }
481
+ .tr-task[data-status="completed"] .tr-task__subject {
482
+ color: var(--vf-text-secondary); text-decoration: line-through;
483
+ text-decoration-color: var(--vf-text-faint); text-decoration-thickness: 1px;
484
+ }
485
+ .tr-task__meta {
486
+ overflow: hidden; max-width: 250px; color: var(--vf-text-faint); font-family: var(--vf-font-mono);
487
+ font-size: 10px; text-overflow: ellipsis; white-space: nowrap;
488
+ }
489
+ .tr-task__delta {
490
+ min-width: 42px; color: var(--vf-text-secondary); font-size: 9.5px; font-weight: 500;
491
+ letter-spacing: .04em; text-align: right; text-transform: uppercase;
492
+ }
493
+ .tr-tasks__empty { padding: 7px 6px; color: var(--vf-text-faint); font-style: italic; }
494
+ .tr-tasks > .tr-more { padding: 5px 6px 3px 28px; }
495
+ .tr-tasks__toggle { display: flex; justify-content: flex-end; padding: 5px 6px 2px; }
496
+ .tr-tasks__toggle button {
497
+ padding: 0; border: 0; border-bottom: 1px dotted var(--vf-hairline-strong);
498
+ background: none; color: var(--vf-text-tertiary); font: inherit; font-size: 10.5px;
499
+ line-height: 1.5; cursor: pointer;
500
+ }
501
+ .tr-tasks__toggle button:hover { color: var(--vf-text-primary); }
502
+ .tr-tasks__toggle button:focus-visible { outline: 1.5px solid var(--vf-select); outline-offset: 3px; }
503
+ @container measure (max-width: 560px) { .tr-task__meta { display: none; } }
504
+
505
+ /* ═══ §05A — timeline_meta: four floating indexes, one island ═════════════
506
+ Overlay chrome belongs to the message-view wrapper, never the 68ch
507
+ document. The controls therefore spend no grid track and cause no reflow. */
508
+ .ah-col--measure { container-type: inline-size; container-name: message-view; }
509
+ .tr-meta {
510
+ position: absolute; z-index: 34; top: 60px; right: 14px; left: 14px; height: 0;
511
+ pointer-events: none;
512
+ }
513
+ .tr-meta-launchers { display: grid; width: 42px; gap: 7px; pointer-events: auto; }
514
+ .tr-meta-launch {
515
+ display: grid; grid-template-columns: 15px auto; gap: 4px; align-items: center;
516
+ justify-content: center; width: 42px; height: 30px; padding: 0; border: 0;
517
+ border-radius: 8px; background: var(--vf-chrome-surface); backdrop-filter: blur(20px);
518
+ box-shadow: 0 3px 14px rgb(0 0 0 / 7%), 0 0 0 1px var(--vf-hairline-strong);
519
+ color: var(--vf-text-tertiary); cursor: pointer;
520
+ transition: transform 140ms ease, color 160ms ease, background-color 160ms ease;
521
+ }
522
+ .tr-meta-launch:hover { color: var(--vf-text-primary); transform: translateY(-1px); }
523
+ .tr-meta-launch:active { transform: scale(.95); }
524
+ .tr-meta-launch:focus-visible { outline: 1.5px solid var(--vf-select); outline-offset: 3px; }
525
+ .tr-meta-launch[aria-expanded="true"] {
526
+ background: var(--vf-foreground); color: var(--vf-foreground-inverse);
527
+ }
528
+ .tr-meta-launch svg { display: block; width: 14px; height: 14px; }
529
+ .tr-meta-launch__count {
530
+ font-family: var(--vf-font-mono); font-size: 10px; font-variant-numeric: tabular-nums;
531
+ line-height: 1;
532
+ }
533
+ .tr-meta-popover {
534
+ position: absolute; top: 0; left: 50px; width: min(430px, calc(100% - 50px));
535
+ overflow: hidden; border-radius: 12px; background: var(--vf-chrome-surface);
536
+ backdrop-filter: blur(24px);
537
+ box-shadow: var(--vf-shadow-island), 0 0 0 1px var(--vf-hairline-strong);
538
+ pointer-events: auto; transform-origin: top left; animation: tr-meta-in 180ms var(--vf-ease-pop);
539
+ }
540
+ @keyframes tr-meta-in { from { opacity: 0; transform: translateY(-3px) scale(.98); } }
541
+ .tr-meta-top {
542
+ display: grid; grid-template-columns: minmax(0, 1fr) 30px; align-items: center;
543
+ min-height: 39px; padding: 0 6px 0 10px; border-bottom: 1px solid var(--vf-hairline);
544
+ }
545
+ .tr-meta-tabs { display: flex; align-self: stretch; min-width: 0; }
546
+ .tr-meta-tab {
547
+ position: relative; display: inline-flex; align-items: center; justify-content: center;
548
+ min-width: 0; height: 39px; padding: 0 12px; border: 0; background: none;
549
+ color: var(--vf-text-tertiary); font-family: inherit; font-size: 11.5px; cursor: pointer;
550
+ }
551
+ .tr-meta-tab:hover { color: var(--vf-text-primary); }
552
+ .tr-meta-tab:focus-visible { outline: none; box-shadow: inset 0 0 0 1.5px var(--vf-select); }
553
+ .tr-meta-tab[aria-selected="true"] { color: var(--vf-text-primary); font-weight: 600; }
554
+ .tr-meta-tab[aria-selected="true"]::after {
555
+ position: absolute; right: 11px; bottom: -1px; left: 11px; height: 2px;
556
+ border-radius: 999px 999px 0 0; background: currentColor; content: "";
557
+ }
558
+ .tr-meta-close {
559
+ display: grid; width: 26px; height: 26px; place-items: center; padding: 0; border: 0;
560
+ border-radius: 6px; background: none; color: var(--vf-text-faint); cursor: pointer;
561
+ }
562
+ .tr-meta-close:hover { background: var(--vf-fill); color: var(--vf-text-primary); }
563
+ .tr-meta-close:focus-visible { outline: 1.5px solid var(--vf-select); outline-offset: 2px; }
564
+ .tr-meta-close svg { width: 13px; height: 13px; }
565
+ .tr-meta-panel {
566
+ max-height: min(382px, calc(100vh - 145px)); overflow-y: auto; scrollbar-width: thin;
567
+ }
568
+ .tr-meta-listhead {
569
+ display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 12px; align-items: center;
570
+ height: 30px; padding: 0 34px 0 43px; color: var(--vf-text-faint); font-size: 9.5px;
571
+ font-weight: 500; text-transform: uppercase; letter-spacing: .07em;
572
+ }
573
+ .tr-meta-list { margin: 0; padding: 0 7px 7px; list-style: none; }
574
+ .tr-meta-row {
575
+ display: grid; grid-template-columns: 16px minmax(0, 1fr) auto 12px; gap: 9px;
576
+ align-items: center; width: 100%; min-height: 49px; padding: 6px 8px; border: 0;
577
+ border-top: 1px solid var(--vf-hairline); border-radius: 7px; background: none;
578
+ color: var(--vf-text-secondary); text-align: left; cursor: pointer;
579
+ transition: background-color 120ms ease;
580
+ }
581
+ .tr-meta-list li:first-child .tr-meta-row { border-top-color: transparent; }
582
+ .tr-meta-row:hover { background: var(--vf-fill); }
583
+ .tr-meta-row:focus-visible { outline: none; box-shadow: inset 0 0 0 1.5px var(--vf-select); }
584
+ .tr-meta-row:disabled { cursor: default; opacity: .72; }
585
+ .tr-meta-row:disabled:hover { background: none; }
586
+ .tr-meta-row:disabled .tr-meta-row__chev { visibility: hidden; }
587
+ .tr-meta-row__body { min-width: 0; }
588
+ .tr-meta-row__name {
589
+ display: block; overflow: hidden; color: var(--vf-text-primary); font-size: 11.5px;
590
+ font-weight: 500; text-overflow: ellipsis; white-space: nowrap;
591
+ }
592
+ .tr-meta-row__meta {
593
+ display: block; overflow: hidden; margin-top: 1px; color: var(--vf-text-tertiary);
594
+ font-size: 10.5px; text-overflow: ellipsis; white-space: nowrap;
595
+ }
596
+ .tr-meta-row__value {
597
+ color: var(--vf-text-tertiary); font-family: var(--vf-font-mono); font-size: 10px;
598
+ font-variant-numeric: tabular-nums; white-space: nowrap;
599
+ }
600
+ .tr-meta-row__chev { display: inline-flex; width: 12px; height: 12px; color: var(--vf-text-faint); }
601
+ .tr-meta-row__chev svg { width: 12px; height: 12px; }
602
+ .tr-meta-status {
603
+ position: relative; display: grid; width: 14px; height: 14px; place-items: center;
604
+ border: 1px solid var(--vf-hairline-strong); border-radius: 4px;
605
+ color: var(--vf-text-tertiary); font-family: var(--vf-font-mono); font-size: 9px; line-height: 1;
606
+ }
607
+ .tr-meta-row[data-state="completed"] .tr-meta-status { border-color: var(--vf-text-tertiary); }
608
+ .tr-meta-row[data-state="completed"] .tr-meta-row__name {
609
+ color: var(--vf-text-tertiary); text-decoration: line-through;
610
+ }
611
+ .tr-meta-row[data-kind="workflow"][data-state="completed"] .tr-meta-row__name {
612
+ color: var(--vf-text-primary); text-decoration: none;
613
+ }
614
+ .tr-meta-row[data-state="running"] .tr-meta-status { border-color: var(--vf-green); }
615
+ .tr-meta-row[data-state="running"] .tr-meta-status::after {
616
+ width: 6px; height: 6px; border-radius: 999px; background: var(--vf-green);
617
+ content: "";
618
+ }
619
+ .tr-meta-row[data-state="running"] .tr-meta-row__value { color: var(--vf-green); }
620
+ .tr-meta-row[data-state="failed"] .tr-meta-status,
621
+ .tr-meta-row[data-state="failed"] .tr-meta-row__value { border-color: var(--vf-red); color: var(--vf-red); }
622
+ .tr-meta-file { display: inline-flex; width: 15px; height: 15px; color: var(--vf-text-tertiary); }
623
+ .tr-meta-file svg { width: 15px; height: 15px; }
624
+ .tr-meta-empty {
625
+ margin: 0; padding: 26px 18px 28px; color: var(--vf-text-faint); font-size: 11px;
626
+ text-align: center;
627
+ }
628
+ @container message-view (max-width: 560px) {
629
+ .tr-meta { top: 56px; right: 8px; left: 10px; }
630
+ .tr-meta-popover { left: 48px; width: calc(100% - 48px); }
631
+ .tr-meta-tab { flex: 1; padding-right: 5px; padding-left: 5px; }
632
+ .tr-meta-listhead { padding-right: 27px; padding-left: 41px; }
633
+ .tr-meta-row { gap: 7px; padding-right: 6px; padding-left: 6px; }
634
+ }
635
+ .tr-text {
636
+ margin: 0; padding: 7px 10px; color: var(--vf-text-secondary);
637
+ font-size: 12px; line-height: 1.5; white-space: pre-wrap;
638
+ }
639
+ .tr-quiet { color: var(--vf-text-faint); font-style: italic; }
640
+ .tr-dtable { width: 100%; border-collapse: collapse; font-size: 11.5px; }
641
+ .tr-dtable caption { padding: 6px 10px 2px; color: var(--vf-text-tertiary); text-align: left; }
642
+ .tr-dtable th, .tr-dtable td {
643
+ padding: 4px 10px; border-bottom: 1px solid var(--vf-hairline);
644
+ text-align: left; vertical-align: top; color: var(--vf-text-secondary);
645
+ }
646
+ .tr-dtable th { color: var(--vf-text-tertiary); font-weight: 500; white-space: nowrap; }
647
+ /* the folded commands, one per line */
648
+ .tr-cmds {
649
+ margin: 0; padding: 5px 10px; list-style: none; font-family: var(--vf-font-mono);
650
+ font-size: 11.5px; line-height: 1.9; color: var(--vf-text-secondary);
651
+ white-space: pre-wrap; word-break: break-word;
652
+ }
653
+ .tr-cmds .tr-command {
654
+ position: relative; display: grid; grid-template-columns: 22px minmax(0, 1fr) auto;
655
+ align-items: center; min-width: 0;
656
+ }
657
+ .tr-command__prompt {
658
+ grid-column: 1; grid-row: 1; color: var(--vf-text-faint); white-space: nowrap;
659
+ }
660
+ .tr-command__text {
661
+ min-width: 0; margin: 0; color: inherit; font: inherit; line-height: inherit;
662
+ white-space: pre-wrap; overflow-wrap: anywhere;
663
+ }
664
+ .tr-command__text code { color: inherit; font: inherit; }
665
+ .tr-command__line { display: block; white-space: pre-wrap; overflow-wrap: anywhere; }
666
+ .tr-cmds .tr-command__line { min-height: 1.9em; }
667
+ .tr-command-stack .tr-command__line { min-height: 1.55em; }
668
+ .tr-cmds .tr-command__text { grid-column: 2; grid-row: 1; padding: 0; background: none; }
669
+ .tr-cmds .tr-command:not([data-full="true"]) .tr-command__text,
670
+ .tr-cmds .tr-command:not([data-full="true"]) .tr-command__line {
671
+ overflow: hidden; white-space: nowrap;
672
+ }
673
+ .tr-cmds .tr-command:not([data-full="true"]) .tr-command__more {
674
+ grid-column: 3; grid-row: 1; align-self: center; margin-left: 12px; white-space: nowrap;
675
+ }
676
+ .tr-cmds .tr-command[data-full="true"] .tr-command__text {
677
+ display: block; max-height: 360px; padding-bottom: 22px; overflow: auto;
678
+ }
679
+ .tr-cmds .tr-command[data-full="true"] .tr-command__more {
680
+ position: absolute; right: 0; bottom: 3px; z-index: 1; margin: 0; padding-left: 18px;
681
+ background: linear-gradient(90deg, transparent, var(--vf-chrome-solid) 16px);
682
+ }
683
+ .tr-command-stack .tr-command + .tr-command { border-top: 1px solid var(--vf-hairline); }
684
+ .tr-command-stack .tr-command__more { margin: 0 10px 8px; }
685
+ .tr-command__more {
686
+ padding: 0; border: 0; border-bottom: 1px dotted var(--vf-hairline-strong);
687
+ background: none; color: var(--vf-text-tertiary); font-family: var(--vf-font-sans);
688
+ font-size: 10.5px; line-height: 1.5; cursor: pointer;
689
+ }
690
+ .tr-command__more:hover { color: var(--vf-text-primary); }
691
+ .tr-command__more:disabled { cursor: wait; opacity: .7; }
692
+ /* the sources — a site's icon is content, so it keeps its colour */
693
+ .tr-web { container: web-entry / inline-size; }
694
+ .tr-src { list-style: none; margin: 0; padding: 4px 6px; }
695
+ .tr-src__row {
696
+ display: grid; grid-template-columns: 14px minmax(0, 1fr) minmax(0, max-content); gap: 10px; align-items: center;
697
+ height: 26px; padding: 0 6px; border-radius: 6px; font-size: 12px;
698
+ text-decoration: none;
699
+ }
700
+ .tr-src a:hover, .tr-src a:focus-visible { background: var(--vf-fill); }
701
+ .tr-src a:focus-visible { outline: 1.5px solid var(--vf-select); outline-offset: -1.5px; }
702
+ .tr-src .title {
703
+ color: var(--vf-text-primary); text-decoration: none;
704
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
705
+ }
706
+ .tr-src a:hover .title { text-decoration: underline; }
707
+ .tr-src .dom { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--vf-text-faint); font-family: var(--vf-font-mono); font-size: 10.5px; }
708
+ .tr-site-icons { display: flex; align-items: center; gap: 6px; width: fit-content; margin: 6px 12px 8px; color: var(--vf-text-tertiary); font-size: 10.5px; cursor: pointer; }
709
+ .tr-site-icons input { width: 12px; height: 12px; margin: 0; accent-color: var(--vf-text-secondary); }
710
+ .tr-web-note { padding: 8px 12px; color: var(--vf-text-tertiary); font-size: 11px; }
711
+ .tr-web-more { display: block; margin: 5px 12px 8px; padding: 0; border: 0; background: none; color: var(--vf-text-secondary); font-size: 11px; text-decoration: underline; text-underline-offset: 2px; }
712
+ .tr-fetch + .tr-fetch { border-top: 1px solid var(--vf-hairline); }
713
+ .tr-fetch a { color: var(--vf-text-primary); text-underline-offset: 2px; overflow-wrap: anywhere; }
714
+ .tr-fetch .tr-fav { vertical-align: middle; }
715
+ /* Web facts compete for space inside the reading measure and nested runs.
716
+ Ask their own width, not the wider message column, before moving them. */
717
+ @container web-entry (max-width: 640px) {
718
+ .tr-line[data-page-title] { grid-template-columns: 16px max-content minmax(0, 1fr); padding-top: 4px; padding-bottom: 4px; row-gap: 3px; }
719
+ .tr-line[data-page-title] .tr-line__r { grid-column: 2 / -1; min-width: 0; gap: 8px; }
720
+ .tr-line[data-web] .ttl { min-width: 0; }
721
+ }
722
+ @container web-entry (max-width: 520px) {
723
+ .tr-line[data-web] { grid-template-columns: 16px max-content minmax(0, 1fr); padding-top: 4px; padding-bottom: 4px; row-gap: 3px; }
724
+ .tr-line[data-web] .tr-line__r { grid-column: 2 / -1; min-width: 0; gap: 8px; }
725
+ }
726
+ @container web-entry (max-width: 420px) {
727
+ .tr-src__row { grid-template-columns: 14px minmax(0, 1fr); height: auto; min-height: 38px; gap: 1px 10px; padding-top: 3px; padding-bottom: 3px; }
728
+ .tr-src__row > .tr-fav { grid-row: 1 / 3; }
729
+ .tr-src .dom { grid-column: 2; max-width: 100%; }
730
+ .tr-fetch { grid-template-columns: 44px minmax(0, 1fr); }
731
+ .tr-line[data-web] .tr-line__r .t { display: none; }
732
+ }
733
+ @container web-entry (max-width: 360px) {
734
+ .tr-line[data-web] { grid-template-columns: 16px minmax(0, 1fr); }
735
+ .tr-line[data-web] .tr-line__o { grid-column: 2; }
736
+ }
737
+
738
+ /* Q4 C — reasoning is muted, clamped prose in the measure; no box, no rail */
739
+ .tr-think { color: var(--vf-text-tertiary); font-size: 13px; line-height: 1.5; }
740
+ .tr-think__text {
741
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
742
+ }
743
+ .tr-think__text p + p { margin-top: 8px; }
744
+ .tr-think[data-open="true"] .tr-think__text {
745
+ display: block; -webkit-line-clamp: unset; overflow: visible;
746
+ }
747
+ .tr-think__more {
748
+ margin-top: 3px; padding: 0; border: 0; border-bottom: 1px dotted var(--vf-hairline-strong);
749
+ background: none; color: var(--vf-text-tertiary); font-family: inherit; font-size: 11px;
750
+ font-variant-numeric: tabular-nums; cursor: pointer;
751
+ }
752
+ .tr-think__more:hover { color: var(--vf-text-primary); }
753
+ /* Q10 A — reasoning alone is a run of one, drawn as its line: Thought · its
754
+ first words · the span, opening to the same muted prose */
755
+ .tr-line[data-thought] .tr-line__o { font-family: var(--vf-font-sans); font-size: 12.5px; color: var(--vf-text-tertiary); }
756
+ .tr-thought > .tr-think { margin: 4px 0 8px 26px; }
757
+
758
+ /* ── §03 F — the child run: part of the calling document ──────────────────── */
759
+ .tr-sub { margin: 2px 0 10px 26px; padding-left: 12px; border-left: 1px solid var(--vf-hairline-strong); }
760
+ .tr-sub__head {
761
+ display: grid; grid-template-columns: 14px minmax(0, 1fr) auto; gap: 8px; align-items: center;
762
+ height: 26px; color: var(--vf-text-secondary); font-size: 11.5px;
763
+ }
764
+ .tr-sub__head .mark { display: inline-flex; width: 13px; height: 13px; color: var(--vf-text-tertiary); }
765
+ .tr-sub__head .mark svg { width: 13px; height: 13px; }
766
+ .tr-sub__head .mark .ah-agent { width: 13px; height: 13px; color: inherit; }
767
+ .tr-sub__head .when { color: var(--vf-text-faint); font-size: 10.5px; font-variant-numeric: tabular-nums; }
768
+ /* WRITTEN — the record's head named one subagent; a real one needs to
769
+ truncate, and its role is a caption beside the name rather than part of it. */
770
+ .tr-sub__name { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: left; }
771
+ /* WRITTEN — the head is a disclosure for a run nothing pressed open. */
772
+ button.tr-sub__head {
773
+ width: 100%; border: 0; background: none; padding: 0; font: inherit;
774
+ color: var(--vf-text-secondary); cursor: pointer; text-align: left;
775
+ }
776
+ button.tr-sub__head:hover { color: var(--vf-text-primary); }
777
+ .tr-sub__role { color: var(--vf-text-faint); }
778
+ .tr-sub .tr { padding: 4px 0 0; font-size: 13px; }
779
+ .tr-sub .tr-prompt { padding: 8px 12px 9px; font-size: 13px; }
780
+ .tr-sub .tr-turn + .tr-turn { margin-top: 18px; }
781
+ /* A child run has no margin of its own to put an anchor in. */
782
+ .tr-sub .tr-anchor { display: none; }
783
+
784
+ /* ── §04A — Agent workers and Agent Teams ──────────────────────────────────
785
+ A worker's machine-delivered assignment remains inside its one child
786
+ document. Team members are addressable and their delivered boundary events
787
+ enter shared chronology. Hue is confined to the small Claude mark. */
788
+ :where(.ah-frame, .ah-layer) [data-member-color="blue"] { --member-color: #3b82f6; }
789
+ :where(.ah-frame, .ah-layer) [data-member-color="green"] { --member-color: #22c55e; }
790
+ :where(.ah-frame, .ah-layer) [data-member-color="yellow"] { --member-color: #ffd60a; }
791
+ :where(.ah-frame, .ah-layer) [data-member-color="purple"] { --member-color: #8b5cf6; }
792
+ :where(.ah-frame, .ah-layer) [data-member-color="orange"] { --member-color: #f59e0b; }
793
+ :where(.ah-frame, .ah-layer) [data-member-color="pink"] { --member-color: #ec4899; }
794
+ :where(.ah-frame, .ah-layer) [data-member-color="cyan"] { --member-color: #06b6d4; }
795
+ :where(.ah-frame, .ah-layer) [data-member-color="red"] { --member-color: #ef4444; }
796
+ .tr-assignment {
797
+ margin: 5px 0 10px; padding: 6px 0 7px 11px;
798
+ border-left: 2px solid var(--vf-hairline-strong);
799
+ color: var(--vf-text-secondary); font-size: 12.5px; line-height: 1.5;
800
+ }
801
+ .tr-assignment__head {
802
+ display: block; margin-bottom: 2px; color: var(--vf-text-tertiary);
803
+ font-size: 9.5px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.07em;
804
+ }
805
+ .tm-avatar {
806
+ display: inline-flex; flex: none; width: 14px; height: 14px;
807
+ color: var(--member-color, var(--vf-text-tertiary));
808
+ }
809
+ .tm-avatar .ah-agent, .tm-avatar svg { display: block; width: 100%; height: 100%; color: inherit; }
810
+ .tm-avatar-stack { position: relative; width: 16px; overflow: visible; }
811
+ .tm-avatar-stack > .tm-avatar { position: absolute; top: 2px; width: 10px; height: 10px; }
812
+ .tm-avatar-stack > .tm-avatar:nth-child(1) { left: 0; }
813
+ .tm-avatar-stack > .tm-avatar:nth-child(2) { left: 4px; }
814
+ .tm-avatar-stack > .tm-avatar:nth-child(3) { left: 8px; }
815
+ .tm-mention {
816
+ display: inline-flex; align-items: center; gap: 5px; min-height: 20px;
817
+ padding: 0 7px 0 6px; border-radius: 999px; background: var(--vf-fill);
818
+ color: var(--vf-text-primary); font-family: var(--vf-font-mono);
819
+ font-size: 10.5px; line-height: 20px; white-space: nowrap;
820
+ }
821
+ .tm-mention .tm-avatar { width: 11px; height: 11px; }
822
+ .tm-roster {
823
+ margin: 2px 0 10px 26px; padding: 4px 0 5px 12px;
824
+ border-left: 1px solid var(--vf-hairline-strong);
825
+ }
826
+ .tm-roster__row {
827
+ display: grid; grid-template-columns: 14px minmax(118px, max-content) minmax(0, 1fr) auto;
828
+ gap: 9px; align-items: center; min-height: 28px;
829
+ color: var(--vf-text-secondary); font-size: 11.5px;
830
+ }
831
+ .tm-roster__name {
832
+ color: var(--vf-text-primary); font-family: var(--vf-font-mono);
833
+ font-size: 10.5px; white-space: nowrap;
834
+ }
835
+ .tm-roster__job {
836
+ min-width: 0; overflow: hidden; color: var(--vf-text-tertiary);
837
+ text-overflow: ellipsis; white-space: nowrap;
838
+ }
839
+ .tm-runtime {
840
+ color: var(--vf-text-faint); font-size: 10.5px;
841
+ font-variant-numeric: tabular-nums; white-space: nowrap;
842
+ }
843
+ .tm-note { margin: 7px 0 0 14px; color: var(--vf-text-faint); font-size: 10.5px; }
844
+ .tm-known { margin-top: 2px; margin-bottom: 16px; }
845
+ .tm-message { position: relative; margin: 14px 0 15px; padding: 1px 0 2px; }
846
+ .tm-message__head {
847
+ display: flex; flex-wrap: wrap; align-items: center; gap: 5px 7px;
848
+ min-height: 18px; color: var(--vf-text-tertiary); font-size: 10.5px;
849
+ }
850
+ .tm-message__head .mark { display: inline-flex; width: 12px; height: 12px; }
851
+ .tm-message__head .tm-avatar { width: 12px; height: 12px; }
852
+ .tm-message__who {
853
+ color: var(--vf-text-primary); font-family: var(--vf-font-mono);
854
+ font-size: 10.5px; font-weight: 500;
855
+ }
856
+ .tm-message__route { color: var(--vf-text-tertiary); }
857
+ .tm-message__kind {
858
+ margin-left: auto; color: var(--vf-text-faint); font-size: 9.5px;
859
+ font-weight: 500; text-transform: uppercase; letter-spacing: 0.07em;
860
+ }
861
+ .tm-message__time {
862
+ color: var(--vf-text-faint); font-family: var(--vf-font-mono);
863
+ font-size: 10px; font-variant-numeric: tabular-nums;
864
+ }
865
+ .tm-time-basis { color: var(--vf-text-faint); font-family: var(--vf-font-sans); }
866
+ .tm-message__subject {
867
+ margin: 5px 0 0 21px; color: var(--vf-text-secondary); font-size: 12px; font-weight: 500;
868
+ }
869
+ .tm-message__body {
870
+ margin: 4px 0 0 21px; color: var(--vf-text-primary); font-size: 13.5px; line-height: 1.55;
871
+ }
872
+ .tm-message__body p + p { margin-top: 8px; }
873
+ .tm-message__foot {
874
+ display: flex; align-items: center; gap: 8px; margin: 5px 0 0 21px;
875
+ color: var(--vf-text-faint); font-size: 10.5px;
876
+ }
877
+ .tm-report { margin-top: 14px; margin-bottom: 15px; }
878
+ .tm-report__detail .tm-message__body { margin: 0; padding: 9px 12px 4px; }
879
+ .tm-report__detail .tm-message__body:last-child { padding-bottom: 10px; }
880
+ .tm-report__detail .tm-message__foot { margin: 0; padding: 0 12px 9px; }
881
+ .tm-report__detail > .tm-workthread { margin: 0 10px 10px 22px; }
882
+ .tm-work {
883
+ display: inline-flex; align-items: center; gap: 4px; padding: 0; border: 0;
884
+ border-bottom: 1px dotted var(--vf-hairline-strong); background: none;
885
+ color: var(--vf-text-tertiary); font: inherit; cursor: pointer;
886
+ }
887
+ .tm-work:hover { color: var(--vf-text-primary); }
888
+ .tm-work .chev { width: 10px; height: 10px; }
889
+ .tm-work .chev svg {
890
+ display: block; width: 10px; height: 10px;
891
+ transition: transform 160ms var(--vf-ease-island);
892
+ }
893
+ .tm-work[aria-expanded="true"] .chev svg { transform: rotate(90deg); }
894
+ .tm-work:focus-visible { outline: 2px solid var(--vf-select); outline-offset: 2px; }
895
+ .tm-workthread { margin-top: 7px; margin-bottom: 15px; }
896
+ .tm-workthread .tr-sub__head .tm-avatar { width: 13px; height: 13px; }
897
+ .tm-workthread__name {
898
+ color: var(--vf-text-primary); font-family: var(--vf-font-mono); font-size: 10.5px;
899
+ }
900
+ .tr-head .tm-workthread__name { text-transform: none; letter-spacing: 0; }
901
+ .tm-workthread__kind { color: var(--vf-text-tertiary); }
902
+ .tm-workthread .tr-assignment { margin-top: 4px; margin-bottom: 9px; }
903
+ .tm-workthread__end {
904
+ display: flex; align-items: center; gap: 7px; margin: 8px 0 1px;
905
+ color: var(--vf-text-faint); font-size: 10.5px;
906
+ }
907
+ .tm-workthread__end::before {
908
+ content: ""; width: 16px; height: 1px; background: var(--vf-hairline-strong);
909
+ }
910
+ .tm-workthread__end time {
911
+ margin-left: auto; font-family: var(--vf-font-mono); font-variant-numeric: tabular-nums;
912
+ }
913
+ .tm-lifecycle .tm-avatar { width: 12px; height: 12px; }
914
+ .tm-message[data-hit="true"], .tm-roster__row[data-hit="true"], .tm-lifecycle[data-hit="true"] {
915
+ animation: ah-land 1400ms ease;
916
+ }
917
+ @container measure (max-width: 560px) {
918
+ .tm-roster__row { grid-template-columns: 14px minmax(0, 1fr); padding: 5px 0; }
919
+ .tm-roster__row .tm-runtime { grid-column: 2; grid-row: 2; }
920
+ .tm-roster__job { grid-column: 2; grid-row: 3; white-space: normal; }
921
+ .tm-message__kind { margin-left: 0; }
922
+ .tm-message__time { margin-left: auto; }
923
+ .tm-invocation[data-team-operation="add"],
924
+ .tm-invocation[data-team-operation="resume"] {
925
+ grid-template-columns: 16px minmax(0, 1fr);
926
+ grid-template-rows: minmax(var(--vf-tree-row-height), auto) auto auto;
927
+ padding-top: 3px; padding-bottom: 4px;
928
+ }
929
+ .tm-invocation[data-team-operation="add"] .tr-line__g,
930
+ .tm-invocation[data-team-operation="resume"] .tr-line__g {
931
+ grid-column: 1; grid-row: 1;
932
+ }
933
+ .tm-invocation[data-team-operation="add"] .tr-line__v,
934
+ .tm-invocation[data-team-operation="resume"] .tr-line__v {
935
+ grid-column: 2; grid-row: 1;
936
+ }
937
+ .tm-invocation[data-team-operation="add"] .tr-line__o,
938
+ .tm-invocation[data-team-operation="resume"] .tr-line__o {
939
+ grid-column: 2; grid-row: 2; min-width: 0;
940
+ overflow: visible; text-overflow: clip; white-space: normal;
941
+ }
942
+ .tm-invocation[data-team-operation="add"] .tr-line__r,
943
+ .tm-invocation[data-team-operation="resume"] .tr-line__r {
944
+ grid-column: 2; grid-row: 3; min-width: 0; justify-self: start;
945
+ flex-wrap: wrap;
946
+ }
947
+ .tm-report__line {
948
+ grid-template-columns: 16px minmax(0, 1fr);
949
+ grid-template-rows: minmax(var(--vf-tree-row-height), auto) 20px 20px;
950
+ }
951
+ .tm-report__line .tr-line__g { grid-column: 1; grid-row: 1; }
952
+ .tm-report__line .tr-line__v { grid-column: 2; grid-row: 1; }
953
+ .tm-report__line .tr-line__r {
954
+ grid-column: 2; grid-row: 3; min-width: 0; justify-self: start;
955
+ }
956
+ .tm-report__line .tr-line__o { grid-column: 2; grid-row: 2; }
957
+ .tm-report__detail .tm-message__foot {
958
+ flex-direction: column; align-items: flex-start; gap: 2px;
959
+ }
960
+ .tm-workthread .tr-sub__head {
961
+ grid-template-columns: 13px minmax(0, 1fr); height: auto; min-height: 26px; padding: 4px 0;
962
+ }
963
+ .tm-workthread .tr-sub__head .when { grid-column: 2; }
964
+ .tm-workthread .tr-head {
965
+ display: grid; grid-template-columns: 14px minmax(0, 1fr) auto;
966
+ row-gap: 0; height: auto; min-height: 22px;
967
+ }
968
+ .tm-workthread .tr-head .model { grid-column: 2 / -1; grid-row: 2; }
969
+ }
970
+
971
+ /* ── §04B — Workflow: one durable run, chronological attempts ─────────────
972
+ The collapsed row answers state and progress. Its disclosure reads purpose,
973
+ attempts, phases, workers and result in that order; worker runtime choice
974
+ always gets its own line and child transcripts remain lazy. */
975
+ .wf-run__detail { min-width: 0; padding: 0; }
976
+ .wf-run__mast { min-width: 0; padding: 12px 14px 11px; }
977
+ .wf-run__title { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
978
+ .wf-run__title strong {
979
+ min-width: 0; overflow: hidden; color: var(--vf-text-primary);
980
+ font-family: var(--vf-font-mono); font-size: 12px; font-weight: 500;
981
+ text-overflow: ellipsis; white-space: nowrap;
982
+ }
983
+ .wf-run__id {
984
+ color: var(--vf-text-faint); font-family: var(--vf-font-mono);
985
+ font-size: 9.5px; white-space: nowrap;
986
+ }
987
+ .wf-run__finished {
988
+ margin-left: auto; color: var(--vf-text-faint); font-size: 10.5px;
989
+ font-variant-numeric: tabular-nums; white-space: nowrap;
990
+ }
991
+ .wf-run__objective {
992
+ margin: 4px 0 9px; color: var(--vf-text-secondary); font-size: 11.5px;
993
+ line-height: 1.45; overflow-wrap: anywhere;
994
+ }
995
+ .wf-run__facts {
996
+ display: flex; flex-wrap: wrap; align-items: center; gap: 4px 12px;
997
+ min-width: 0; color: var(--vf-text-faint); font-size: 10.5px;
998
+ font-variant-numeric: tabular-nums;
999
+ }
1000
+ .wf-run__facts b { color: var(--vf-text-secondary); font-weight: 500; }
1001
+ .wf-run__actions { display: inline-flex; gap: 10px; margin-left: auto; }
1002
+ .wf-action {
1003
+ padding: 0; border: 0; border-bottom: 1px dotted var(--vf-hairline-strong);
1004
+ background: none; color: var(--vf-text-tertiary); font: inherit;
1005
+ font-size: 10.5px; cursor: pointer;
1006
+ }
1007
+ .wf-action:hover { color: var(--vf-text-primary); }
1008
+ .wf-action:disabled { border-bottom-color: transparent; opacity: .55; cursor: default; }
1009
+ .wf-action:focus-visible { outline: 2px solid var(--vf-select); outline-offset: 2px; }
1010
+ .wf-logs { position: relative; }
1011
+ .wf-logs > summary, .wf-full-result > summary { list-style: none; }
1012
+ .wf-logs > summary::-webkit-details-marker,
1013
+ .wf-full-result > summary::-webkit-details-marker { display: none; }
1014
+ .wf-logs > .tr-diag {
1015
+ position: absolute; z-index: 3; top: calc(100% + 5px); right: 0;
1016
+ width: min(520px, 72vw); max-height: 240px; border: 1px solid var(--vf-hairline-strong);
1017
+ border-radius: 7px; box-shadow: var(--vf-shadow-island);
1018
+ }
1019
+ .wf-section-label {
1020
+ display: block; padding: 8px 14px 5px; color: var(--vf-text-faint);
1021
+ font-size: 9.5px; font-weight: 500; letter-spacing: .07em; text-transform: uppercase;
1022
+ }
1023
+ .wf-attempts, .wf-phases, .wf-result { border-top: 1px solid var(--vf-hairline); }
1024
+ .wf-attempt {
1025
+ display: grid; grid-template-columns: 8px 62px minmax(0, 1fr) auto;
1026
+ gap: 8px; align-items: center; min-height: 27px; padding: 0 14px 7px;
1027
+ color: var(--vf-text-tertiary); font-size: 10.5px;
1028
+ }
1029
+ .wf-attempt__dot { width: 6px; height: 6px; border-radius: 999px; background: var(--vf-text-tertiary); }
1030
+ .wf-attempt strong { color: var(--vf-text-secondary); font-weight: 500; }
1031
+ .wf-attempt__launch { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1032
+ .wf-attempt__outcome { color: var(--vf-text-secondary); font-variant-numeric: tabular-nums; white-space: nowrap; }
1033
+ .wf-attempt[data-state="running"] .wf-attempt__dot { background: var(--vf-green); }
1034
+ .wf-attempt[data-state="failed"] .wf-attempt__dot { background: var(--vf-red); }
1035
+ .wf-attempt[data-state="failed"] .wf-attempt__outcome { color: var(--vf-red); }
1036
+ .wf-phase { border-top: 1px solid var(--vf-hairline); }
1037
+ .wf-phase:first-of-type { border-top: 0; }
1038
+ .wf-phase > summary, .wf-worker-thread > summary { list-style: none; }
1039
+ .wf-phase > summary::-webkit-details-marker,
1040
+ .wf-worker-thread > summary::-webkit-details-marker { display: none; }
1041
+ .wf-phase__head {
1042
+ display: grid; grid-template-columns: 20px minmax(0, 1fr) auto 12px;
1043
+ gap: 9px; align-items: center; width: 100%; min-height: 37px; padding: 5px 14px;
1044
+ color: var(--vf-text-secondary); cursor: pointer;
1045
+ }
1046
+ .wf-phase__head:hover { background: var(--vf-fill); }
1047
+ .wf-phase__head:focus-visible { outline: none; box-shadow: inset 0 0 0 1.5px var(--vf-select); }
1048
+ .wf-phase__index {
1049
+ display: grid; place-items: center; width: 18px; height: 18px;
1050
+ border: 1px solid var(--vf-hairline-strong); border-radius: 999px;
1051
+ color: var(--vf-text-tertiary); font-family: var(--vf-font-mono); font-size: 9.5px;
1052
+ font-variant-numeric: tabular-nums;
1053
+ }
1054
+ .wf-phase__name { display: flex; align-items: baseline; gap: 7px; min-width: 0; }
1055
+ .wf-phase__name strong { flex: none; color: var(--vf-text-primary); font-size: 11.5px; font-weight: 500; }
1056
+ .wf-phase__name span { min-width: 0; overflow: hidden; color: var(--vf-text-faint); font-size: 10.5px; text-overflow: ellipsis; white-space: nowrap; }
1057
+ .wf-phase__count { color: var(--vf-text-tertiary); font-size: 10.5px; font-variant-numeric: tabular-nums; white-space: nowrap; }
1058
+ .wf-phase__head .chev { display: inline-flex; width: 12px; height: 12px; color: var(--vf-text-faint); transition: transform 160ms var(--vf-ease-island); }
1059
+ .wf-phase__head .chev svg { width: 12px; height: 12px; }
1060
+ .wf-phase[open] > .wf-phase__head .chev { transform: rotate(90deg); }
1061
+ .wf-phase__workers { margin: 0 12px 8px 23px; padding: 2px 0 2px 12px; border-left: 1px solid var(--vf-hairline-strong); }
1062
+ .wf-empty { margin: 4px 8px 6px; color: var(--vf-text-faint); font-size: 10.5px; }
1063
+ .wf-worker-thread { margin: 0; }
1064
+ .wf-worker {
1065
+ grid-template-columns: 16px minmax(92px, max-content) minmax(0, 1fr) auto;
1066
+ grid-template-rows: 20px 18px; row-gap: 0; min-height: 42px;
1067
+ margin-right: 0; margin-left: -8px; padding-top: 2px; padding-bottom: 2px;
1068
+ }
1069
+ .wf-worker .tr-line__g { grid-column: 1; grid-row: 1 / 3; }
1070
+ .wf-worker .tr-line__v {
1071
+ grid-column: 2; grid-row: 1; min-width: 0; overflow: hidden;
1072
+ color: var(--vf-text-primary); font-family: var(--vf-font-mono); font-size: 11px;
1073
+ text-overflow: ellipsis;
1074
+ }
1075
+ .wf-worker .tr-line__o { grid-column: 3; grid-row: 1; color: var(--vf-text-tertiary); font-family: var(--vf-font-sans); font-size: 10.5px; }
1076
+ .wf-worker .tr-line__r { grid-column: 4; grid-row: 1; }
1077
+ .wf-worker__runtime {
1078
+ grid-column: 2 / 4; grid-row: 2; min-width: 0; overflow: hidden;
1079
+ color: var(--vf-text-tertiary); font-size: 10.5px; font-variant-numeric: tabular-nums;
1080
+ text-overflow: ellipsis; white-space: nowrap;
1081
+ }
1082
+ .wf-worker__runtime .wf-worker__basis { margin-right: 5px; color: var(--vf-text-faint); font-size: 9.5px; }
1083
+ .wf-worker__runtime b { color: var(--vf-text-secondary); font-weight: 500; }
1084
+ .wf-worker__runtime > span:last-child { margin-left: 4px; color: var(--vf-text-secondary); }
1085
+ .wf-worker__usage { grid-column: 4; grid-row: 2; color: var(--vf-text-faint); font-size: 10px; font-variant-numeric: tabular-nums; white-space: nowrap; }
1086
+ .wf-worker-thread[open] > .wf-worker .chev { transform: rotate(90deg); }
1087
+ .wf-worker[data-state="failed"] .tr-line__r .why,
1088
+ .wf-worker__result[data-state="failed"] { color: var(--vf-red); }
1089
+ .wf-worker[data-state="running"] .tr-line__r .why { color: var(--vf-green); }
1090
+ .wf-worker__detail { margin: 2px 0 8px 18px; }
1091
+ .wf-worker__result { padding: 7px 10px 8px; color: var(--vf-text-secondary); font-size: 11.5px; line-height: 1.45; }
1092
+ .wf-worker__result p { margin: 0; overflow-wrap: anywhere; }
1093
+ .wf-worker__detail > .tr-sub { margin: 2px 0 8px; }
1094
+ .wf-result { min-width: 0; padding: 0 14px 11px; }
1095
+ .wf-result .wf-section-label { padding-right: 0; padding-left: 0; }
1096
+ .wf-result__resources { display: grid; grid-template-columns: 78px minmax(0, 1fr); gap: 10px; align-items: start; margin-bottom: 6px; color: var(--vf-text-tertiary); font-size: 10.5px; }
1097
+ .wf-result__resources > .tr-paths { padding: 0; line-height: 1.55; }
1098
+ .wf-output { display: grid; grid-template-columns: 78px minmax(0, 1fr); gap: 5px 10px; min-width: 0; margin: 0; font-size: 10.5px; line-height: 1.45; }
1099
+ .wf-output__row { display: contents; }
1100
+ .wf-output dt { margin: 0; color: var(--vf-text-tertiary); }
1101
+ .wf-output dd { min-width: 0; margin: 0; color: var(--vf-text-secondary); overflow-wrap: anywhere; }
1102
+ .wf-output__verdict { display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
1103
+ .wf-result__error { margin-top: 8px; color: var(--vf-red); }
1104
+ .wf-result__foot { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px 12px; margin-top: 8px; color: var(--vf-text-faint); font-size: 10px; }
1105
+ .wf-result__foot > span { flex: 1 1 260px; min-width: 0; overflow-wrap: anywhere; }
1106
+ .wf-full-result { margin-left: auto; }
1107
+ .wf-full-result[open] { flex: 1 0 100%; margin-left: 0; }
1108
+ .wf-full-result[open] > summary { display: block; width: max-content; margin: 0 0 6px auto; }
1109
+ .wf-full-result > .tr-diag { border-radius: 6px; }
1110
+
1111
+ @container measure (max-width: 560px) {
1112
+ .wf-run__title { flex-wrap: wrap; }
1113
+ .wf-run__finished { width: 100%; margin-left: 0; }
1114
+ .wf-run__actions { width: 100%; margin: 3px 0 0; }
1115
+ .wf-attempt { grid-template-columns: 8px 62px minmax(0, 1fr); }
1116
+ .wf-attempt__outcome { grid-column: 3; }
1117
+ .wf-phase__name span, .wf-worker .tr-line__o { display: none; }
1118
+ .wf-worker { grid-template-columns: 16px minmax(0, 1fr) auto; grid-template-rows: 19px 18px 16px; align-items: center; min-height: 57px; padding-top: 3px; padding-bottom: 3px; }
1119
+ .wf-worker .tr-line__g { grid-column: 1; grid-row: 1 / 4; }
1120
+ .wf-worker .tr-line__v { grid-column: 2; grid-row: 1; }
1121
+ .wf-worker .tr-line__r { grid-column: 3; grid-row: 1; min-width: 0; font-size: 10px; }
1122
+ .wf-worker__runtime { grid-column: 2 / 4; grid-row: 2; font-size: 10px; }
1123
+ .wf-worker__runtime .wf-worker__basis { display: none; }
1124
+ .wf-worker__usage { grid-column: 2 / 4; grid-row: 3; justify-self: start; font-size: 9.5px; }
1125
+ .wf-output, .wf-result__resources { grid-template-columns: 1fr; gap: 1px; }
1126
+ .wf-output dd + dt { margin-top: 5px; }
1127
+ }
1128
+
1129
+ /* ── §03 G — markers: the system's own lines ──────────────────────────────── */
1130
+ .tr-mark {
1131
+ display: flex; align-items: center; gap: 10px; margin: 18px 0;
1132
+ color: var(--vf-text-faint); font-size: 10px; text-transform: uppercase;
1133
+ letter-spacing: 0.07em; font-variant-numeric: tabular-nums; text-align: center;
1134
+ }
1135
+ .tr-mark::before, .tr-mark::after { content: ""; flex: 1; height: 1px; background: var(--vf-hairline-strong); }
1136
+ .tr-mark--live { color: var(--vf-green); }
1137
+ .tr-mark--live::before, .tr-mark--live::after { background: color-mix(in srgb, var(--vf-green) 38%, transparent); }
1138
+ .tr-mark--error { color: var(--vf-red); }
1139
+ .tr-mark--gap::before, .tr-mark--gap::after {
1140
+ background: repeating-linear-gradient(90deg, var(--vf-hairline-strong) 0 4px, transparent 4px 8px);
1141
+ }
1142
+ button.tr-mark { width: 100%; border: 0; background: none; padding: 0; cursor: pointer; font-family: inherit; }
1143
+ button.tr-mark:hover { color: var(--vf-text-tertiary); }
1144
+
1145
+ /* A generated recap folds into its compaction marker, outside tool activity. */
1146
+ .tr-compaction { margin: 18px 0; min-width: 0; }
1147
+ .tr-compaction > summary { margin: 0; min-height: 28px; cursor: pointer; list-style: none; color: var(--vf-text-tertiary); }
1148
+ .tr-compaction > summary::-webkit-details-marker { display: none; }
1149
+ .tr-compaction > summary:hover { color: var(--vf-text-secondary); }
1150
+ .tr-compaction > summary:focus-visible { outline: 1.5px solid var(--vf-select); outline-offset: 3px; border-radius: 4px; }
1151
+ .tr-compaction__label { display: inline-flex; align-items: center; flex-wrap: wrap; justify-content: center; gap: 6px; }
1152
+ .tr-compaction__label .chev { display: inline-flex; flex: none; }
1153
+ .tr-compaction__label .chev svg { width: 12px; height: 12px; }
1154
+ .tr-compaction[open] .chev svg { transform: rotate(90deg); }
1155
+ .tr-compaction__hint { color: var(--vf-text-faint); }
1156
+ .tr-compaction__body { margin: 10px 0 0; padding: 4px 0 4px 14px; border-left: 1px solid var(--vf-hairline-strong); overflow-wrap: anywhere; }
1157
+ .tr-compaction__byline { display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px 14px; margin: 0 0 14px; color: var(--vf-text-tertiary); font-size: 11px; }
1158
+ .tr-compaction__byline button { margin-left: auto; white-space: nowrap; }
1159
+ .tr-compaction__byline button, .tr-compaction__status button { padding: 2px 0; border: 0; background: none; color: var(--vf-text-tertiary); font: inherit; cursor: pointer; text-decoration: underline; text-underline-offset: 3px; }
1160
+ .tr-compaction__byline button:hover, .tr-compaction__status button:hover { color: var(--vf-text-primary); }
1161
+ .tr-compaction__status { color: var(--vf-text-tertiary); font-size: 12px; }
1162
+ .tr-compaction__body .tr-prose > :first-child { margin-top: 0; }
1163
+
1164
+ /* the session summary — a footnote at the end, not a state */
1165
+ .tr-summary {
1166
+ margin: 18px 0 0; padding: 2px 0 2px 14px; border-left: 2px solid var(--vf-hairline-strong);
1167
+ color: var(--vf-text-tertiary); font-size: 13px;
1168
+ }
1169
+ /* WRITTEN — the record's `.eyebrow` is its page's chrome; scoped here it is
1170
+ the summary's own label and nothing else's. */
1171
+ .tr-summary .eyebrow {
1172
+ display: block; margin-bottom: 4px; color: var(--vf-text-tertiary);
1173
+ font-size: 10.5px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.08em;
1174
+ }
1175
+
1176
+ /* ── §07 — time: the pill is the one marker that is an object ─────────────── */
1177
+ .tr-day {
1178
+ position: sticky; top: 6px; z-index: 4; display: flex; align-items: center; gap: 10px;
1179
+ margin: 20px 0 16px; pointer-events: none;
1180
+ }
1181
+ .tr-day::before, .tr-day::after { content: ""; flex: 1; height: 1px; background: var(--vf-hairline-strong); }
1182
+ .tr-day__pill {
1183
+ pointer-events: auto; display: inline-flex; align-items: center; gap: 7px; height: 22px;
1184
+ padding: 0 10px; border: 0; border-radius: 999px; background: var(--vf-chrome-solid);
1185
+ box-shadow: 0 0 0 1px var(--vf-hairline-strong); color: var(--vf-text-secondary);
1186
+ font-family: inherit; font-size: 10.5px; font-weight: 500; font-variant-numeric: tabular-nums;
1187
+ letter-spacing: 0.02em; cursor: pointer;
1188
+ transition: background-color 120ms ease, box-shadow 160ms ease;
1189
+ }
1190
+ .tr-day__pill:hover { background: var(--vf-fill); }
1191
+ .tr-day__pill .after { font-weight: 400; color: var(--vf-text-tertiary); }
1192
+ .tr-day__pill .after::before { content: "·"; margin-right: 7px; color: var(--vf-text-faint); }
1193
+ .tr-day--first { margin-top: 4px; }
1194
+ /* pinned: the column stamps this while a pill is stuck, so it floats as chrome */
1195
+ .tr-day[data-stuck="true"] .tr-day__pill { box-shadow: var(--vf-shadow-island), 0 0 0 1px var(--vf-hairline-strong); }
1196
+ .tr-day[data-stuck="true"]::before, .tr-day[data-stuck="true"]::after { opacity: 0; }
1197
+ /* a sitting is a section: the sticky pill's containing block, so the next pill
1198
+ pushes it OUT instead of stacking on it */
1199
+ .tr-sitting { position: relative; }
1200
+ .tr-day + .tr-turn { margin-top: 0; }
1201
+ /* Grouped setting commands use a definite, shrinkable track. An implicit
1202
+ max-content track can otherwise widen the entire transcript scrollport. */
1203
+ .tr-cluster {
1204
+ display: grid; grid-template-columns: minmax(0, 1fr); gap: 4px; justify-items: start;
1205
+ }
1206
+ .tr-cluster .tr-prompt { border-radius: 10px; }
1207
+ .tr-cluster .tr-prompt-message + .tr-prompt-message .tr-prompt { border-top-left-radius: 4px; }
1208
+ .tr-cluster .tr-prompt-message:has(+ .tr-prompt-message) .tr-prompt { border-bottom-left-radius: 4px; }
1209
+ /* the day list the pill opens into */
1210
+ .tr-daymenu {
1211
+ position: absolute; left: 50%; transform: translateX(-50%); z-index: 12;
1212
+ min-width: 200px; padding: 6px; border-radius: 12px; background: var(--vf-chrome-surface);
1213
+ backdrop-filter: blur(20px); box-shadow: var(--vf-shadow-island), 0 0 0 1px var(--vf-hairline);
1214
+ }
1215
+ .tr-daymenu button {
1216
+ display: grid; grid-template-columns: 1fr auto; gap: 14px; width: 100%; height: 26px;
1217
+ padding: 0 8px; border: 0; border-radius: 6px; background: none; color: var(--vf-text-primary);
1218
+ font: inherit; font-size: 12px; text-align: left; cursor: pointer;
1219
+ }
1220
+ .tr-daymenu button:hover { background: var(--vf-fill); }
1221
+ .tr-daymenu button span { color: var(--vf-text-faint); font-size: 10.5px; font-variant-numeric: tabular-nums; }
1222
+ .tr-daymenu button[aria-current="true"] { background: var(--vf-fill); }
1223
+
1224
+ /* the landing ring — a day jump lands the way a search hit does */
1225
+ .tr-prompt.is-landed, .tr-prompt-message.is-landed > .tr-prompt,
1226
+ .tr-prompt-message.is-landed > .tr-attachments .tr-att__tile { box-shadow: inset 0 0 0 1.5px var(--vf-select); }