@talgent/workbench-ui 0.0.0-stage → 0.1.2

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 (205) hide show
  1. package/README.md +15 -2
  2. package/assets/brand-icons/LICENSE.md +30 -0
  3. package/assets/brand-icons/README.md +5 -0
  4. package/assets/brand-icons/figma.svg +1 -0
  5. package/assets/brand-icons/github.svg +1 -0
  6. package/assets/brand-icons/linear.svg +1 -0
  7. package/assets/brand-icons/notion.svg +1 -0
  8. package/assets/brand-icons/sentry.svg +1 -0
  9. package/assets/brand-icons/slack.svg +1 -0
  10. package/assets/fonts/Inter-OFL.txt +93 -0
  11. package/assets/fonts/inter-latin.woff2 +0 -0
  12. package/components/agent/agent-icon.css +14 -0
  13. package/components/agent/agent-icon.tsx +14 -0
  14. package/components/analytics/chart-geometry.ts +95 -0
  15. package/components/analytics/dashboard-charts.tsx +136 -0
  16. package/components/analytics/model-usage-chart.tsx +84 -0
  17. package/components/analytics/token-breakdown.css +13 -0
  18. package/components/analytics/token-breakdown.tsx +23 -0
  19. package/components/analytics/token-report.tsx +57 -0
  20. package/components/analytics/work-usage/turn-timeline.tsx +98 -0
  21. package/components/analytics/work-usage/turns.ts +170 -0
  22. package/components/analytics/work-usage/work-status.ts +36 -0
  23. package/components/analytics/work-usage/work-usage-reader.tsx +122 -0
  24. package/components/analytics/work-usage/work-usage.css +48 -0
  25. package/components/auth/auth-gate.tsx +44 -0
  26. package/components/chat/message-input.tsx +105 -0
  27. package/components/composer/permission-mode-list.tsx +15 -0
  28. package/components/composer/prompt-bar-controls.tsx +77 -0
  29. package/components/composer/prompt-bar.tsx +45 -0
  30. package/components/composer/skill-completion.css +27 -0
  31. package/components/composer/skill-completion.tsx +49 -0
  32. package/components/composer/use-slash-completion.tsx +69 -0
  33. package/components/composer/work-start.css +133 -0
  34. package/components/feedback/toast-region.css +2 -0
  35. package/components/feedback/toast-region.tsx +15 -0
  36. package/components/files/file-facts.tsx +16 -0
  37. package/components/files/file-section.tsx +181 -0
  38. package/components/markdown.tsx +144 -0
  39. package/components/marketplace/connector-pages.tsx +166 -0
  40. package/components/marketplace/marketplace-icons.tsx +66 -0
  41. package/components/marketplace/marketplace-shared.tsx +43 -0
  42. package/components/marketplace/marketplace-shell.tsx +32 -0
  43. package/components/marketplace/marketplace.css +97 -0
  44. package/components/marketplace/parameter-fields.tsx +46 -0
  45. package/components/marketplace/plugin-list.tsx +84 -0
  46. package/components/marketplace/plugin-page.tsx +133 -0
  47. package/components/marketplace/provider-pages.tsx +120 -0
  48. package/components/preview/file-format.ts +75 -0
  49. package/components/preview/file-preview.tsx +153 -0
  50. package/components/preview/preview-verdict.ts +44 -0
  51. package/components/preview/preview.css +19 -0
  52. package/components/preview/text-preview.tsx +174 -0
  53. package/components/profile/provider-callback.tsx +43 -0
  54. package/components/profile/work-agent-appearance.tsx +109 -0
  55. package/components/profile/work-agent-soul.tsx +76 -0
  56. package/components/rail/rail-section.tsx +20 -0
  57. package/components/rail/rail.css +19 -0
  58. package/components/rail/use-expand-on-change.ts +18 -0
  59. package/components/session/startup-progress.css +77 -0
  60. package/components/session/startup-progress.tsx +103 -0
  61. package/components/session/work-permission-control.tsx +45 -0
  62. package/components/session/work-thinking-control.tsx +52 -0
  63. package/components/shell/account-menu.tsx +134 -0
  64. package/components/shell/app-shell.tsx +148 -0
  65. package/components/shell/core-reading-views.tsx +26 -0
  66. package/components/shell/core-reading.tsx +17 -0
  67. package/components/shell/document-title.tsx +11 -0
  68. package/components/shell/entry-shell.ts +39 -0
  69. package/components/shell/file-reading.tsx +22 -0
  70. package/components/shell/page-layout.tsx +7 -0
  71. package/components/shell/reading-context.ts +41 -0
  72. package/components/shell/reading-panel.css +67 -0
  73. package/components/shell/reading-panel.tsx +74 -0
  74. package/components/shell/sidebar-parts.tsx +38 -0
  75. package/components/work/context-rail.css +61 -0
  76. package/components/work/conversation-unavailable.css +6 -0
  77. package/components/work/conversation-unavailable.tsx +11 -0
  78. package/components/work/subagent-item.tsx +42 -0
  79. package/components/work/subagents-section.css +31 -0
  80. package/components/work/subagents-section.tsx +40 -0
  81. package/components/work/token-usage.tsx +28 -0
  82. package/components/work/tool-message-detail.tsx +39 -0
  83. package/components/work/tool-output-preview.tsx +52 -0
  84. package/components/work/tool-preview-reading.tsx +27 -0
  85. package/components/work/tool-reading-content.tsx +31 -0
  86. package/components/work/work-context-rail.tsx +23 -0
  87. package/components/work/work-conversation.tsx +207 -0
  88. package/components/work/work-history.tsx +115 -0
  89. package/components/work/work-interaction.css +38 -0
  90. package/components/work/work-interaction.tsx +105 -0
  91. package/components/work/work-message-flow.css +86 -0
  92. package/components/work/work-message-flow.tsx +352 -0
  93. package/components/work/work-progress-section.tsx +20 -0
  94. package/components/work/work-prompt-bar.tsx +82 -0
  95. package/components/work/work-question-record.tsx +72 -0
  96. package/components/work/work-snapshot-state.tsx +24 -0
  97. package/components/work/work-status-control.tsx +54 -0
  98. package/components/work-start/start-work-launch-state.ts +33 -0
  99. package/components/work-start/work-start-catalog.tsx +116 -0
  100. package/components/work-start/work-start-form.tsx +173 -0
  101. package/components/work-start/work-start-tray.css +40 -0
  102. package/components/work-start/work-start-tray.tsx +128 -0
  103. package/hooks/use-debounced.ts +11 -0
  104. package/hooks/use-work-conversation.ts +125 -0
  105. package/hooks/use-work-lifecycle-controls.ts +40 -0
  106. package/hooks/use-work-stream.ts +91 -0
  107. package/lib/account-service.ts +77 -0
  108. package/lib/agent-appearance-service.ts +59 -0
  109. package/lib/agent-icon.ts +26 -0
  110. package/lib/agent-soul-service.ts +48 -0
  111. package/lib/agent-work-service.ts +23 -0
  112. package/lib/client.ts +20 -0
  113. package/lib/computer-release.ts +30 -0
  114. package/lib/computer-service.ts +241 -0
  115. package/lib/dashboard-report.ts +38 -0
  116. package/lib/dashboard.ts +21 -0
  117. package/lib/marketplace-catalog.ts +138 -0
  118. package/lib/marketplace-connections.ts +98 -0
  119. package/lib/marketplace-plugins.ts +53 -0
  120. package/lib/marketplace-routes.ts +12 -0
  121. package/lib/model-vendors.ts +13 -0
  122. package/lib/name-taken-error.ts +7 -0
  123. package/lib/notifications.ts +37 -0
  124. package/lib/permission-modes.ts +25 -0
  125. package/lib/personal-usage-service.ts +19 -0
  126. package/lib/personal-work-service.ts +159 -0
  127. package/lib/plugin-parameters.ts +64 -0
  128. package/lib/preview-verdict.ts +26 -0
  129. package/lib/relative-time.ts +11 -0
  130. package/lib/session.ts +108 -0
  131. package/lib/share-link.ts +4 -0
  132. package/lib/stale-build-reload.ts +41 -0
  133. package/lib/start-work-request.ts +34 -0
  134. package/lib/startup-progress.ts +9 -0
  135. package/lib/subagents.ts +12 -0
  136. package/lib/thinking-levels.ts +2 -0
  137. package/lib/token-analytics.ts +168 -0
  138. package/lib/token-usage.ts +64 -0
  139. package/lib/trace-view-model.ts +292 -0
  140. package/lib/transport.ts +29 -0
  141. package/lib/use-now.ts +11 -0
  142. package/lib/use-work-trace.ts +175 -0
  143. package/lib/user-display.ts +49 -0
  144. package/lib/work-conversation.ts +118 -0
  145. package/lib/work-file-service.ts +118 -0
  146. package/lib/work-model.ts +38 -0
  147. package/lib/work-notices.ts +23 -0
  148. package/lib/work-progress.ts +41 -0
  149. package/lib/work-projection.ts +122 -0
  150. package/lib/work-questions.ts +18 -0
  151. package/lib/work-start-draft.ts +61 -0
  152. package/lib/work-start-loadout.ts +100 -0
  153. package/lib/work-start-source.ts +16 -0
  154. package/lib/work-state-presentation.ts +80 -0
  155. package/lib/work-stream-source.ts +32 -0
  156. package/package.json +87 -3
  157. package/pages/computers/computers-page.tsx +56 -0
  158. package/pages/computers/connect-computer-page.tsx +92 -0
  159. package/pages/computers/install-commands.tsx +42 -0
  160. package/pages/computers/remove-computer-dialog.tsx +33 -0
  161. package/pages/computers/rename-computer-dialog.tsx +37 -0
  162. package/pages/computers/room-rules-dialog.tsx +55 -0
  163. package/pages/login-page.css +33 -0
  164. package/pages/login-page.tsx +88 -0
  165. package/pages/login-threads.tsx +51 -0
  166. package/pages/marketplace-page.tsx +59 -0
  167. package/pages/profile-page.tsx +68 -0
  168. package/pages/workbench/library-page.tsx +88 -0
  169. package/pages/workbench/new-work-page.tsx +24 -0
  170. package/pages/workbench/person.tsx +13 -0
  171. package/pages/workbench/personal-work-context.tsx +93 -0
  172. package/pages/workbench/personal-work-page.tsx +100 -0
  173. package/pages/workbench/personal-works-page.tsx +36 -0
  174. package/pages/workbench/share-dialog.tsx +57 -0
  175. package/pages/workbench/title-dialog.tsx +35 -0
  176. package/pages/workbench/usage-page.tsx +52 -0
  177. package/public/assets/brand/talgent-lettering.png +0 -0
  178. package/public/assets/brand/talgent-logo-page-bg.png +0 -0
  179. package/public/assets/brand/talgent-logo-white-bg.png +0 -0
  180. package/public/assets/brand/talgent-mark-page-bg.png +0 -0
  181. package/public/assets/brand/talgent-mark-white-bg.png +0 -0
  182. package/public/assets/brand/talgent-mark.png +0 -0
  183. package/public/assets/product-icons/LICENSE +21 -0
  184. package/public/assets/product-icons/README.md +13 -0
  185. package/public/assets/product-icons/anthropic.svg +1 -0
  186. package/public/assets/product-icons/deepseek.svg +1 -0
  187. package/public/assets/product-icons/glm.svg +1 -0
  188. package/public/assets/product-icons/kimi.svg +1 -0
  189. package/public/assets/product-icons/linear.svg +1 -0
  190. package/public/assets/product-icons/minimax.svg +1 -0
  191. package/public/assets/product-icons/notion.svg +1 -0
  192. package/public/assets/product-icons/openai.svg +1 -0
  193. package/public/assets/product-icons/qwen.svg +1 -0
  194. package/styles/base.css +95 -0
  195. package/styles/fonts.css +14 -0
  196. package/styles/markdown.css +79 -0
  197. package/styles/uber-theme.css +96 -0
  198. package/styles/work-composer.css +222 -0
  199. package/styles/work-stream.css +343 -0
  200. package/styles/workbench.css +144 -0
  201. package/styles/workspace.css +260 -0
  202. package/test-support/backend.ts +67 -0
  203. package/test-support/plugin-summary.ts +8 -0
  204. package/test-support/setup.ts +59 -0
  205. package/vite-preset.ts +85 -0
@@ -0,0 +1 @@
1
+ <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>OpenAI</title><path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Qwen</title><path d="M12.604 1.34c.393.69.784 1.382 1.174 2.075a.18.18 0 00.157.091h5.552c.174 0 .322.11.446.327l1.454 2.57c.19.337.24.478.024.837-.26.43-.513.864-.76 1.3l-.367.658c-.106.196-.223.28-.04.512l2.652 4.637c.172.301.111.494-.043.77-.437.785-.882 1.564-1.335 2.34-.159.272-.352.375-.68.37-.777-.016-1.552-.01-2.327.016a.099.099 0 00-.081.05 575.097 575.097 0 01-2.705 4.74c-.169.293-.38.363-.725.364-.997.003-2.002.004-3.017.002a.537.537 0 01-.465-.271l-1.335-2.323a.09.09 0 00-.083-.049H4.982c-.285.03-.553-.001-.805-.092l-1.603-2.77a.543.543 0 01-.002-.54l1.207-2.12a.198.198 0 000-.197 550.951 550.951 0 01-1.875-3.272l-.79-1.395c-.16-.31-.173-.496.095-.965.465-.813.927-1.625 1.387-2.436.132-.234.304-.334.584-.335a338.3 338.3 0 012.589-.001.124.124 0 00.107-.063l2.806-4.895a.488.488 0 01.422-.246c.524-.001 1.053 0 1.583-.006L11.704 1c.341-.003.724.032.9.34zm-3.432.403a.06.06 0 00-.052.03L6.254 6.788a.157.157 0 01-.135.078H3.253c-.056 0-.07.025-.041.074l5.81 10.156c.025.042.013.062-.034.063l-2.795.015a.218.218 0 00-.2.116l-1.32 2.31c-.044.078-.021.118.068.118l5.716.008c.046 0 .08.02.104.061l1.403 2.454c.046.081.092.082.139 0l5.006-8.76.783-1.382a.055.055 0 01.096 0l1.424 2.53a.122.122 0 00.107.062l2.763-.02a.04.04 0 00.035-.02.041.041 0 000-.04l-2.9-5.086a.108.108 0 010-.113l.293-.507 1.12-1.977c.024-.041.012-.062-.035-.062H9.2c-.059 0-.073-.026-.043-.077l1.434-2.505a.107.107 0 000-.114L9.225 1.774a.06.06 0 00-.053-.031zm6.29 8.02c.046 0 .058.02.034.06l-.832 1.465-2.613 4.585a.056.056 0 01-.05.029.058.058 0 01-.05-.029L8.498 9.841c-.02-.034-.01-.052.028-.054l.216-.012 6.722-.012z"></path></svg>
@@ -0,0 +1,95 @@
1
+ /* Page geometry, brand artwork, scrollbars and the app shell. */
2
+
3
+ /* HeroUI's inline span needs a layout box for its size to constrain the SVG. */
4
+ .spinner {
5
+ display: inline-flex;
6
+ flex-shrink: 0;
7
+ }
8
+
9
+ /* Page geometry and readable document content; HeroUI owns component appearance. */
10
+ :root {
11
+ color-scheme: light;
12
+ --background: oklch(97.2% 0 0);
13
+ --brand-foreground: #18181b;
14
+ /* Shared topbar geometry: one row on desktop, controls no taller than a HeroUI Button. */
15
+ --topbar-height: 44px;
16
+ --topbar-control-height: 36px;
17
+ }
18
+
19
+ /* Approved brand artwork; component states remain owned by HeroUI. */
20
+ .p-brand-icon, .p-brand-name { background: var(--brand-foreground); }
21
+ .p-brand-icon { mask: url('/assets/brand/talgent-mark.png') center / 32px 32px no-repeat; }
22
+ .p-brand-name { mask: url('/assets/brand/talgent-lettering.png') center calc(50% + 3px) / 84px auto no-repeat; }
23
+
24
+ html {
25
+ scroll-behavior: smooth;
26
+ }
27
+
28
+ * {
29
+ box-sizing: border-box;
30
+ }
31
+
32
+ /* One scrollbar everywhere: a 12px grab area (thinner than Windows' 17px
33
+ default) whose thumb draws 6px and widens to 8px under the pointer.
34
+ Engines with ::-webkit-scrollbar (Chromium, Safari) take the custom gutter;
35
+ setting scrollbar-width/scrollbar-color on an element switches Chromium back
36
+ to its standard scrollbar, so only Firefox gets those. A scroller that hides
37
+ its bar declares scrollbar-width: none, which still wins.
38
+ Overlay backdrops are excluded for the reason HeroUI disabled its own global
39
+ scrollbar rule (@heroui/styles base.css): backdrop clicks stop closing them.
40
+ :where() keeps these at zero specificity so any scroller can override.
41
+ HeroUI scrollers (Dropdown, Select, Modal, Table, ScrollShadow) apply its
42
+ `scrollbar` utility, which reads --scrollbar-width/--scrollbar-color; those
43
+ are reset to auto where the custom gutter exists, and HeroUI's thin default
44
+ is kept for Firefox with this thumb color. */
45
+ :root, [data-theme] { --scrollbar-thumb: color-mix(in oklab, var(--foreground) 22%, transparent); }
46
+ @supports selector(::-webkit-scrollbar) {
47
+ :root, [data-theme] { --scrollbar-width: auto; --scrollbar-color: auto; }
48
+ }
49
+ :where(:not(.modal__backdrop, .alert-dialog__backdrop))::-webkit-scrollbar { width: 12px; height: 12px; }
50
+ :where(:not(.modal__backdrop, .alert-dialog__backdrop))::-webkit-scrollbar-track, :where(:not(.modal__backdrop, .alert-dialog__backdrop))::-webkit-scrollbar-corner { background: transparent; }
51
+ :where(:not(.modal__backdrop, .alert-dialog__backdrop))::-webkit-scrollbar-thumb {
52
+ min-height: 32px;
53
+ min-width: 32px;
54
+ border: 3px solid transparent;
55
+ border-radius: 999px;
56
+ background: var(--scrollbar-thumb) padding-box;
57
+ }
58
+ :where(:not(.modal__backdrop, .alert-dialog__backdrop))::-webkit-scrollbar-thumb:hover { border-width: 2px; background-color: color-mix(in oklab, var(--foreground) 38%, transparent); }
59
+ :where(:not(.modal__backdrop, .alert-dialog__backdrop))::-webkit-scrollbar-thumb:active { border-width: 2px; background-color: color-mix(in oklab, var(--foreground) 50%, transparent); }
60
+ @supports not selector(::-webkit-scrollbar) {
61
+ :where(:not(.modal__backdrop, .alert-dialog__backdrop)) { scrollbar-width: thin; scrollbar-color: var(--scrollbar-thumb) transparent; }
62
+ }
63
+
64
+ body {
65
+ min-width: 0;
66
+ min-height: 100dvh;
67
+ margin: 0;
68
+ font-size: 16px;
69
+ line-height: 1.5;
70
+ font-variant-numeric: tabular-nums;
71
+ text-rendering: geometricPrecision;
72
+ -webkit-font-smoothing: antialiased;
73
+ }
74
+
75
+ button,
76
+ [role="button"],
77
+ select,
78
+ label:has(input[type="file"]) {
79
+ cursor: pointer;
80
+ }
81
+
82
+ button:disabled,
83
+ [aria-disabled="true"] {
84
+ cursor: not-allowed;
85
+ }
86
+
87
+ .app-shell {
88
+ display: grid;
89
+ grid-template-columns: 248px minmax(0, 1fr);
90
+ min-height: 100dvh;
91
+ }
92
+
93
+ .app-shell[data-sidebar-state="collapsed"] {
94
+ grid-template-columns: 72px minmax(0, 1fr);
95
+ }
@@ -0,0 +1,14 @@
1
+ /* Inter Latin variable font used by the official HeroUI preview. SIL OFL: ../assets/fonts/Inter-OFL.txt */
2
+ @font-face {
3
+ font-family: "Inter";
4
+ font-style: normal;
5
+ font-weight: 100 900;
6
+ font-display: swap;
7
+ src: url("../assets/fonts/inter-latin.woff2") format("woff2");
8
+ unicode-range: U+0-FF, U+131, U+152-153, U+2BB-2BC, U+2C6, U+2DA, U+2DC, U+304, U+308, U+329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
9
+ }
10
+ :root { --font-inter: "Inter", "PingFang SC", "Microsoft YaHei", "Noto Sans CJK SC", "Noto Sans SC", sans-serif; }
11
+ /* Monospace Latin, then the same CJK sans as body text: monospace stacks carry
12
+ * no CJK face, so Chinese in code otherwise falls back to a serif system font. */
13
+ :root { --font-mono: ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono", "PingFang SC", "Microsoft YaHei", "Noto Sans CJK SC", "Noto Sans SC", monospace; }
14
+
@@ -0,0 +1,79 @@
1
+ /* Streamdown renders utility classes from its own bundle: beside this package
2
+ in the workspace, and as its sibling once installed from the registry. */
3
+ @source "../node_modules/streamdown/dist/*.js";
4
+ @source "../node_modules/@streamdown/code/dist/*.js";
5
+ @source "../../../streamdown/dist/*.js";
6
+ @source "../../../@streamdown/code/dist/*.js";
7
+
8
+ @theme inline {
9
+ --color-primary: var(--foreground);
10
+ --color-muted-foreground: var(--foreground);
11
+ --color-sidebar: var(--surface-secondary);
12
+ }
13
+
14
+ /* Adapt Streamdown's document theme to HeroUI without changing UI tokens.
15
+ * Streamdown uses `muted` for a surface; HeroUI uses it for secondary text. */
16
+ .app-markdown {
17
+ --muted: var(--surface-secondary);
18
+ --background: var(--surface);
19
+ min-width: 0;
20
+ max-width: 100%;
21
+ color: var(--foreground);
22
+ font-family: var(--font-sans);
23
+ font-size: 15px;
24
+ line-height: 1.75;
25
+ letter-spacing: normal;
26
+ overflow-wrap: anywhere;
27
+ line-break: strict;
28
+ }
29
+
30
+ .app-markdown > :first-child { margin-top: 0; }
31
+ .app-markdown > :last-child { margin-bottom: 0; }
32
+ .app-markdown :is(h1, h2, h3, h4, h5, h6) { line-height: 1.4; }
33
+ :is(.app-markdown, .app-markdown-inline) [data-streamdown="inline-code"] {
34
+ border: 1px solid var(--separator);
35
+ background: color-mix(in oklab, var(--foreground) 9%, var(--surface));
36
+ font-size: .9em;
37
+ box-decoration-break: clone;
38
+ }
39
+ /* A code block is one framed box. Streamdown's header row (language label)
40
+ * and outer card double the frame and add a row, so they are dropped; the copy
41
+ * control floats in the box's corner while the block is hovered or focused. */
42
+ .app-markdown [data-streamdown="code-block"] { position: relative; gap: 0; padding: 0; border: 0; border-radius: var(--radius); background: none; }
43
+ .app-markdown [data-streamdown="code-block-header"] { display: none; }
44
+ .app-markdown [data-streamdown="code-block"] > div:has(> [data-streamdown="code-block-actions"]) { position: absolute; top: 6px; right: 6px; margin: 0; height: auto; opacity: 0; transition: opacity .15s; }
45
+ .app-markdown [data-streamdown="code-block"]:is(:hover, :focus-within) > div:has(> [data-streamdown="code-block-actions"]) { opacity: 1; }
46
+ .app-markdown [data-streamdown="code-block-body"] { padding: 12px 14px; border-radius: var(--radius); font-size: 13px; line-height: 1.6; }
47
+ .app-markdown .task-list-item { list-style: none; }
48
+ .app-markdown [data-streamdown="blockquote"] { font-style: normal; }
49
+ :is(.app-markdown, .app-markdown-inline) [data-streamdown="link"] { text-underline-offset: 3px; }
50
+ .app-markdown :is(pre, code) { line-break: auto; }
51
+ .app-markdown [data-streamdown="table-wrapper"] { min-width: 0; max-width: 100%; }
52
+ /* Inherited `anywhere` lets the table squeeze columns until words split
53
+ * ("Rea|d"); cells keep whole words and the wrapper scrolls instead. */
54
+ .app-markdown :is(th, td) { overflow-wrap: break-word; }
55
+
56
+ @media (max-width: 640px) {
57
+ .app-markdown :is(th, td) { overflow-wrap: anywhere; white-space: normal; }
58
+ .app-markdown :is(th, td) code { white-space: normal; word-break: break-word; }
59
+ }
60
+
61
+ /* Inline Markdown takes the type of the line it sits in. */
62
+ .app-markdown-inline { overflow-wrap: anywhere; }
63
+ @media (hover: none) {
64
+ .app-markdown [data-streamdown="code-block"] > div:has(> [data-streamdown="code-block-actions"]) { opacity: 1; }
65
+ }
66
+
67
+ /* A source listing wraps long lines under a hanging indent, so the counter
68
+ * still numbers logical lines and continuations stay clear of the gutter,
69
+ * which is as wide as the last line number (--line-gutter, in ch). */
70
+ .app-code-listing [data-streamdown="code-block-body"] { overflow-x: hidden; }
71
+ .app-code-listing [data-streamdown="code-block-body"] :is(pre, code) { white-space: pre-wrap; overflow-wrap: anywhere; }
72
+ .app-code-listing pre code > span { padding-left: calc(var(--line-gutter, 2ch) + 1rem); text-indent: calc(-1 * (var(--line-gutter, 2ch) + 1rem)); }
73
+ .app-code-listing pre code > span::before { width: var(--line-gutter, 2ch); margin-right: 1rem; text-indent: 0; }
74
+
75
+ /* A stored document shown inside a page: its headings sit below the page
76
+ title around it. */
77
+ .app-markdown-document h1 { font-size: 18px; margin-top: 20px; }
78
+ .app-markdown-document h2 { font-size: 16px; margin-top: 18px; }
79
+ .app-markdown-document h3 { font-size: 15px; }
@@ -0,0 +1,96 @@
1
+ /* Exported from the user-selected HeroUI Theme Builder configuration.
2
+ * https://heroui.com/en/themes?base=0&chroma=0&formRadius=small&hue=0&lightness=0&radius=small
3
+ * Retrieved 2026-09-21; values below are the official export, unchanged. */
4
+ /*
5
+ * HeroUI Theme Customization
6
+ * Add this to your global.css after importing @heroui/styles
7
+ * Only includes variables users need to customize
8
+ * @see https://heroui.com/docs/react/getting-started/theming
9
+ */
10
+
11
+ :root,
12
+ .light,
13
+ .default,
14
+ [data-theme="light"],
15
+ [data-theme="default"] {
16
+ /* Theme Colors (Light Mode) */
17
+ --accent: oklch(0 0 0);
18
+ --accent-foreground: oklch(99.11% 0 0);
19
+ --background: oklch(97.02% 0.0000 0.00);
20
+ --border: oklch(90.00% 0.0000 0.00);
21
+ --danger: oklch(0.573 0.2249 21.97);
22
+ --danger-foreground: oklch(98% 0.0200 21.97);
23
+ --default: oklch(94.00% 0.0000 0.00);
24
+ --default-foreground: oklch(21.03% 0.0059 0.00);
25
+ --field-background: oklch(100.00% 0.0000 0.00);
26
+ --field-border: transparent;
27
+ --field-foreground: oklch(21.03% 0.0000 0.00);
28
+ --field-placeholder: oklch(55.17% 0.0000 0.00);
29
+ --focus: oklch(0 0 0);
30
+ --foreground: oklch(21.03% 0.0000 0.00);
31
+ /* 52.5% keeps secondary text at 4.5:1 on the page, white and --default surfaces. */
32
+ --muted: oklch(52.50% 0.0000 0.00);
33
+ --overlay: oklch(100.00% 0.0000 0.00);
34
+ --overlay-foreground: oklch(21.03% 0.0000 0.00);
35
+ --scrollbar: oklch(87.10% 0.0000 0.00);
36
+ --segment: oklch(100.00% 0.0000 0.00);
37
+ --segment-foreground: oklch(21.03% 0.0000 0.00);
38
+ --separator: oklch(92.00% 0.0000 0.00);
39
+ --success: oklch(0.6277 0.1604 153.06);
40
+ --success-foreground: oklch(98% 0.0160 153.06);
41
+ --surface: oklch(100.00% 0.0000 0.00);
42
+ --surface-foreground: oklch(21.03% 0.0000 0.00);
43
+ --surface-secondary: oklch(95.24% 0.0000 0.00);
44
+ --surface-secondary-foreground: oklch(21.03% 0.0000 0.00);
45
+ --surface-tertiary: oklch(93.73% 0.0000 0.00);
46
+ --surface-tertiary-foreground: oklch(21.03% 0.0000 0.00);
47
+ --warning: oklch(0.8446 0.1525 80.6);
48
+ --warning-foreground: oklch(15% 0.0457 80.60);
49
+ --accent-soft-foreground: oklch(0 0 0);
50
+
51
+ /* Border Radius */
52
+ --radius: 0.25rem;
53
+ --field-radius: 0.25rem;
54
+
55
+ /* Font Family */
56
+ /* Make sure to load Inter font in your app */
57
+ --font-sans: var(--font-inter);
58
+ }
59
+
60
+ .dark,
61
+ [data-theme="dark"] {
62
+ color-scheme: dark;
63
+ /* Theme Colors (Dark Mode) */
64
+ --accent: oklch(0.9848 0 0);
65
+ --accent-foreground: oklch(15% 0.0000 0.00);
66
+ --background: oklch(12.00% 0.0000 0.00);
67
+ --border: oklch(28.00% 0.0000 0.00);
68
+ --danger: oklch(0.7044 0.1872 23.19);
69
+ --danger-foreground: oklch(15% 0.0500 23.19);
70
+ --default: oklch(27.40% 0.0000 0.00);
71
+ --default-foreground: oklch(99.11% 0 0);
72
+ --field-background: oklch(21.03% 0.0000 0.00);
73
+ --field-border: transparent;
74
+ --field-foreground: oklch(99.11% 0.0000 0.00);
75
+ --field-placeholder: oklch(70.50% 0.0000 0.00);
76
+ --focus: oklch(0.9848 0 0);
77
+ --foreground: oklch(99.11% 0.0000 0.00);
78
+ --muted: oklch(70.50% 0.0000 0.00);
79
+ --overlay: oklch(21.03% 0.0000 0.00);
80
+ --overlay-foreground: oklch(99.11% 0.0000 0.00);
81
+ --scrollbar: oklch(70.50% 0.0000 0.00);
82
+ --segment: oklch(39.64% 0.0000 0.00);
83
+ --segment-foreground: oklch(99.11% 0.0000 0.00);
84
+ --separator: oklch(25.00% 0.0000 0.00);
85
+ --success: oklch(0.6514 0.1321 156.22);
86
+ --success-foreground: oklch(15% 0.0396 156.22);
87
+ --surface: oklch(21.03% 0.0000 0.00);
88
+ --surface-foreground: oklch(99.11% 0.0000 0.00);
89
+ --surface-secondary: oklch(25.70% 0.0000 0.00);
90
+ --surface-secondary-foreground: oklch(99.11% 0.0000 0.00);
91
+ --surface-tertiary: oklch(27.21% 0.0000 0.00);
92
+ --surface-tertiary-foreground: oklch(99.11% 0.0000 0.00);
93
+ --warning: oklch(0.8803 0.1348 86.06);
94
+ --warning-foreground: oklch(15% 0.0404 86.06);
95
+ --accent-soft-foreground: oklch(0.9848 0 0);
96
+ }
@@ -0,0 +1,222 @@
1
+ /* A Work's pending actions, composer, progress, charts and previews. */
2
+
3
+ .pending-action-dock {
4
+ position: relative;
5
+ z-index: 5;
6
+ display: grid;
7
+ grid-template-columns: minmax(0, 1fr);
8
+ align-items: start;
9
+ gap: 8px;
10
+ margin: 0 12px 7px;
11
+ pointer-events: auto;
12
+ }
13
+
14
+ .pending-card {
15
+ display: grid;
16
+ grid-template-columns: minmax(0, 1fr);
17
+ align-items: start;
18
+ gap: 10px;
19
+ min-height: 62px;
20
+ padding: 7px 9px;
21
+ pointer-events: auto;
22
+ }
23
+
24
+ .pending-card-collapsed {
25
+ min-height: 48px;
26
+ }
27
+
28
+ .composer {
29
+ padding: 8px 12px 10px;
30
+ }
31
+
32
+ .composer-box {
33
+ position: relative;
34
+ padding: 10px 10px 9px;
35
+ }
36
+
37
+ .composer-textarea {
38
+ min-height: 38px;
39
+ width: 100%;
40
+ resize: none;
41
+ padding: 0 2px;
42
+ font-size: 15px;
43
+ line-height: 1.5;
44
+ outline: none;
45
+ }
46
+
47
+ .composer-tools {
48
+ display: flex;
49
+ align-items: center;
50
+ justify-content: space-between;
51
+ gap: 12px;
52
+ margin-top: 8px;
53
+ }
54
+
55
+ .composer-tool-row {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: 4px;
59
+ }
60
+
61
+ .composer-status-icon {
62
+ width: 18px;
63
+ height: 18px;
64
+ flex: 0 0 auto;
65
+ }
66
+
67
+ .composer-primary-actions {
68
+ display: inline-flex;
69
+ flex: 0 0 auto;
70
+ align-items: center;
71
+ justify-content: flex-end;
72
+ }
73
+
74
+ .composer-primary-actions-split {
75
+ height: 34px;
76
+ overflow: visible;
77
+ }
78
+
79
+ .composer-split-button,
80
+ .composer-primary-button {
81
+ display: inline-flex;
82
+ width: 38px;
83
+ height: 36px;
84
+ align-items: center;
85
+ justify-content: center;
86
+ gap: 7px;
87
+ }
88
+
89
+ .composer-primary-actions-split .composer-primary-button {
90
+ width: 42px;
91
+ min-width: 42px;
92
+ height: 34px;
93
+ padding: 0;
94
+ }
95
+
96
+ .composer-primary-actions-split .composer-primary-send {
97
+ width: 42px;
98
+ }
99
+
100
+ .composer-primary-actions-split .composer-split-menu-button {
101
+ width: 28px;
102
+ height: 34px;
103
+ }
104
+
105
+ .composer-primary-button:active,
106
+ .composer-split-button:active {
107
+ transform: translateY(1px) scale(0.99);
108
+ }
109
+
110
+ .composer-primary-button:focus-visible,
111
+ .composer-split-button:focus-visible {
112
+ outline: 2px solid rgb(0 212 164 / 0.34);
113
+ outline-offset: 2px;
114
+ }
115
+
116
+ .composer-primary-button:disabled,
117
+ .composer-split-button:disabled {
118
+ cursor: not-allowed;
119
+ transform: none;
120
+ }
121
+
122
+ .progress-steps,
123
+ .artifacts-section {
124
+ display: grid;
125
+ gap: 6px;
126
+ }
127
+
128
+ .artifacts-toolbar {
129
+ display: flex;
130
+ min-width: 0;
131
+ align-items: center;
132
+ justify-content: space-between;
133
+ gap: 10px;
134
+ margin-bottom: 10px;
135
+ }
136
+
137
+ .artifacts-count {
138
+ font-size: 12px;
139
+ font-weight: 680;
140
+ }
141
+
142
+ .artifacts-file-list {
143
+ margin-top: 0;
144
+ }
145
+
146
+ .progress-steps {
147
+ font-size: 13px;
148
+ }
149
+
150
+ .progress-steps div {
151
+ display: flex;
152
+ align-items: center;
153
+ gap: 8px;
154
+ padding: 8px;
155
+ }
156
+
157
+ @media (max-width: 1280px) {
158
+ .agent-grid {
159
+ grid-template-columns: minmax(0, 1fr);
160
+ height: auto;
161
+ min-height: 0;
162
+ }
163
+
164
+ .agent-grid .stream-panel {
165
+ height: min(760px, calc(100vh - 96px));
166
+ min-height: min(560px, calc(100vh - 96px));
167
+ }
168
+
169
+ }
170
+
171
+ .token-chart {
172
+ overflow: hidden;
173
+ padding: 8px 9px 9px;
174
+ }
175
+
176
+ .token-chart svg {
177
+ display: block;
178
+ width: 100%;
179
+ height: 145px;
180
+ overflow: visible;
181
+ }
182
+
183
+ .chart-axis-label {
184
+ font-size: 10px;
185
+ font-weight: 650;
186
+ }
187
+
188
+ .chart-legend {
189
+ display: flex;
190
+ gap: 12px;
191
+ margin-top: 6px;
192
+ font-size: 11px;
193
+ }
194
+
195
+ .chart-legend span {
196
+ display: inline-flex;
197
+ align-items: center;
198
+ gap: 5px;
199
+ }
200
+
201
+ .chart-legend i {
202
+ display: inline-block;
203
+ width: 8px;
204
+ height: 8px;
205
+ }
206
+
207
+ .html-preview-shell {
208
+ position: relative;
209
+ min-width: 0;
210
+ }
211
+
212
+ .html-preview-fullscreen {
213
+ position: absolute;
214
+ z-index: 2;
215
+ top: 8px;
216
+ right: 8px;
217
+ }
218
+
219
+ .html-frame {
220
+ width: 100%;
221
+ height: 220px;
222
+ }