@nuvin/components 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 (269) hide show
  1. package/dist/MarkdownBody-XBNXK6P4.js +121 -0
  2. package/dist/app/App.d.ts +24 -0
  3. package/dist/app/App.d.ts.map +1 -0
  4. package/dist/app/AppShell.d.ts +13 -0
  5. package/dist/app/AppShell.d.ts.map +1 -0
  6. package/dist/app/Header.d.ts +11 -0
  7. package/dist/app/Header.d.ts.map +1 -0
  8. package/dist/app/SessionSubHeader.d.ts +15 -0
  9. package/dist/app/SessionSubHeader.d.ts.map +1 -0
  10. package/dist/app/WorkspacePanel.d.ts +15 -0
  11. package/dist/app/WorkspacePanel.d.ts.map +1 -0
  12. package/dist/app/app-shell.styles.d.ts +11 -0
  13. package/dist/app/app-shell.styles.d.ts.map +1 -0
  14. package/dist/app/route-components.d.ts +46 -0
  15. package/dist/app/route-components.d.ts.map +1 -0
  16. package/dist/app/routes.d.ts +11 -0
  17. package/dist/app/routes.d.ts.map +1 -0
  18. package/dist/assets/fonts/inter-latin-400-normal.woff2 +0 -0
  19. package/dist/assets/fonts/inter-latin-500-normal.woff2 +0 -0
  20. package/dist/assets/fonts/inter-latin-600-normal.woff2 +0 -0
  21. package/dist/assets/fonts/inter-latin-700-normal.woff2 +0 -0
  22. package/dist/assets/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  23. package/dist/assets/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
  24. package/dist/assets/fonts/jetbrains-mono-latin-600-normal.woff2 +0 -0
  25. package/dist/assets/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
  26. package/dist/chunk-TLWTUPOJ.js +10 -0
  27. package/dist/features/account/auth-gate.d.ts +17 -0
  28. package/dist/features/account/auth-gate.d.ts.map +1 -0
  29. package/dist/features/account/index.d.ts +3 -0
  30. package/dist/features/account/index.d.ts.map +1 -0
  31. package/dist/features/composer/Composer.d.ts +39 -0
  32. package/dist/features/composer/Composer.d.ts.map +1 -0
  33. package/dist/features/composer/QuestionCard.d.ts +21 -0
  34. package/dist/features/composer/QuestionCard.d.ts.map +1 -0
  35. package/dist/features/composer/context-status.d.ts +6 -0
  36. package/dist/features/composer/context-status.d.ts.map +1 -0
  37. package/dist/features/composer/index.d.ts +2 -0
  38. package/dist/features/composer/index.d.ts.map +1 -0
  39. package/dist/features/config/CloudProviderSetup.d.ts +12 -0
  40. package/dist/features/config/CloudProviderSetup.d.ts.map +1 -0
  41. package/dist/features/config/OnboardingGate.d.ts +22 -0
  42. package/dist/features/config/OnboardingGate.d.ts.map +1 -0
  43. package/dist/features/config/ProviderManager.d.ts +15 -0
  44. package/dist/features/config/ProviderManager.d.ts.map +1 -0
  45. package/dist/features/config/WorkspaceManager.d.ts +13 -0
  46. package/dist/features/config/WorkspaceManager.d.ts.map +1 -0
  47. package/dist/features/config/config-client.d.ts +49 -0
  48. package/dist/features/config/config-client.d.ts.map +1 -0
  49. package/dist/features/config/index.d.ts +10 -0
  50. package/dist/features/config/index.d.ts.map +1 -0
  51. package/dist/features/config/protocol-config-client.d.ts +22 -0
  52. package/dist/features/config/protocol-config-client.d.ts.map +1 -0
  53. package/dist/features/config/rest-config-client.d.ts +4 -0
  54. package/dist/features/config/rest-config-client.d.ts.map +1 -0
  55. package/dist/features/config/use-provider-status.d.ts +8 -0
  56. package/dist/features/config/use-provider-status.d.ts.map +1 -0
  57. package/dist/features/daemon-switcher/DaemonAvatar.d.ts +16 -0
  58. package/dist/features/daemon-switcher/DaemonAvatar.d.ts.map +1 -0
  59. package/dist/features/daemon-switcher/DaemonRail.d.ts +18 -0
  60. package/dist/features/daemon-switcher/DaemonRail.d.ts.map +1 -0
  61. package/dist/features/daemon-switcher/DaemonSwitcher.d.ts +17 -0
  62. package/dist/features/daemon-switcher/DaemonSwitcher.d.ts.map +1 -0
  63. package/dist/features/daemon-switcher/index.d.ts +7 -0
  64. package/dist/features/daemon-switcher/index.d.ts.map +1 -0
  65. package/dist/features/diff/DiffView.d.ts +13 -0
  66. package/dist/features/diff/DiffView.d.ts.map +1 -0
  67. package/dist/features/diff/diff.d.ts +23 -0
  68. package/dist/features/diff/diff.d.ts.map +1 -0
  69. package/dist/features/diff/index.d.ts +4 -0
  70. package/dist/features/diff/index.d.ts.map +1 -0
  71. package/dist/features/launcher/SessionItem.d.ts +12 -0
  72. package/dist/features/launcher/SessionItem.d.ts.map +1 -0
  73. package/dist/features/launcher/SessionSidebar.d.ts +24 -0
  74. package/dist/features/launcher/SessionSidebar.d.ts.map +1 -0
  75. package/dist/features/launcher/index.d.ts +5 -0
  76. package/dist/features/launcher/index.d.ts.map +1 -0
  77. package/dist/features/launcher/session-sidebar-model.d.ts +77 -0
  78. package/dist/features/launcher/session-sidebar-model.d.ts.map +1 -0
  79. package/dist/features/launcher/session-status.d.ts +9 -0
  80. package/dist/features/launcher/session-status.d.ts.map +1 -0
  81. package/dist/features/launcher/use-daemon-history.d.ts +17 -0
  82. package/dist/features/launcher/use-daemon-history.d.ts.map +1 -0
  83. package/dist/features/new-session/StartScreen.d.ts +31 -0
  84. package/dist/features/new-session/StartScreen.d.ts.map +1 -0
  85. package/dist/features/new-session/index.d.ts +3 -0
  86. package/dist/features/new-session/index.d.ts.map +1 -0
  87. package/dist/features/new-session/start-screen.styles.d.ts +46 -0
  88. package/dist/features/new-session/start-screen.styles.d.ts.map +1 -0
  89. package/dist/features/picker/Picker.d.ts +23 -0
  90. package/dist/features/picker/Picker.d.ts.map +1 -0
  91. package/dist/features/picker/PickerSession.d.ts +8 -0
  92. package/dist/features/picker/PickerSession.d.ts.map +1 -0
  93. package/dist/features/picker/index.d.ts +6 -0
  94. package/dist/features/picker/index.d.ts.map +1 -0
  95. package/dist/features/picker/picker-model.d.ts +31 -0
  96. package/dist/features/picker/picker-model.d.ts.map +1 -0
  97. package/dist/features/tabs/Tab.d.ts +8 -0
  98. package/dist/features/tabs/Tab.d.ts.map +1 -0
  99. package/dist/features/tabs/TabBar.d.ts +7 -0
  100. package/dist/features/tabs/TabBar.d.ts.map +1 -0
  101. package/dist/features/tabs/index.d.ts +8 -0
  102. package/dist/features/tabs/index.d.ts.map +1 -0
  103. package/dist/features/tabs/tab-model.d.ts +39 -0
  104. package/dist/features/tabs/tab-model.d.ts.map +1 -0
  105. package/dist/features/tabs/tab.styles.d.ts +9 -0
  106. package/dist/features/tabs/tab.styles.d.ts.map +1 -0
  107. package/dist/features/theme/ThemeToggle.d.ts +8 -0
  108. package/dist/features/theme/ThemeToggle.d.ts.map +1 -0
  109. package/dist/features/theme/index.d.ts +5 -0
  110. package/dist/features/theme/index.d.ts.map +1 -0
  111. package/dist/features/theme/themes.d.ts +13 -0
  112. package/dist/features/theme/themes.d.ts.map +1 -0
  113. package/dist/features/theme/use-theme-mode.d.ts +3 -0
  114. package/dist/features/theme/use-theme-mode.d.ts.map +1 -0
  115. package/dist/features/transcript/components/AssistantMessage.d.ts +21 -0
  116. package/dist/features/transcript/components/AssistantMessage.d.ts.map +1 -0
  117. package/dist/features/transcript/components/ChildMessagesContext.d.ts +27 -0
  118. package/dist/features/transcript/components/ChildMessagesContext.d.ts.map +1 -0
  119. package/dist/features/transcript/components/CodeBlock.d.ts +5 -0
  120. package/dist/features/transcript/components/CodeBlock.d.ts.map +1 -0
  121. package/dist/features/transcript/components/MarkdownBody.d.ts +17 -0
  122. package/dist/features/transcript/components/MarkdownBody.d.ts.map +1 -0
  123. package/dist/features/transcript/components/MessageList.d.ts +24 -0
  124. package/dist/features/transcript/components/MessageList.d.ts.map +1 -0
  125. package/dist/features/transcript/components/NestedMessageListContext.d.ts +18 -0
  126. package/dist/features/transcript/components/NestedMessageListContext.d.ts.map +1 -0
  127. package/dist/features/transcript/components/ProcessingIndicator.d.ts +5 -0
  128. package/dist/features/transcript/components/ProcessingIndicator.d.ts.map +1 -0
  129. package/dist/features/transcript/components/styles-test-utils.d.ts +6 -0
  130. package/dist/features/transcript/components/styles-test-utils.d.ts.map +1 -0
  131. package/dist/features/transcript/components/tool-display/BareLine.d.ts +14 -0
  132. package/dist/features/transcript/components/tool-display/BareLine.d.ts.map +1 -0
  133. package/dist/features/transcript/components/tool-display/Card.d.ts +31 -0
  134. package/dist/features/transcript/components/tool-display/Card.d.ts.map +1 -0
  135. package/dist/features/transcript/components/tool-display/Turn.d.ts +15 -0
  136. package/dist/features/transcript/components/tool-display/Turn.d.ts.map +1 -0
  137. package/dist/features/transcript/components/tool-display/index.d.ts +3 -0
  138. package/dist/features/transcript/components/tool-display/index.d.ts.map +1 -0
  139. package/dist/features/transcript/components/tool-display/renderers/AskUserRenderer.d.ts +4 -0
  140. package/dist/features/transcript/components/tool-display/renderers/AskUserRenderer.d.ts.map +1 -0
  141. package/dist/features/transcript/components/tool-display/renderers/AssignTaskRenderer.d.ts +9 -0
  142. package/dist/features/transcript/components/tool-display/renderers/AssignTaskRenderer.d.ts.map +1 -0
  143. package/dist/features/transcript/components/tool-display/renderers/BareToolRenderer.d.ts +8 -0
  144. package/dist/features/transcript/components/tool-display/renderers/BareToolRenderer.d.ts.map +1 -0
  145. package/dist/features/transcript/components/tool-display/renderers/BashRenderer.d.ts +11 -0
  146. package/dist/features/transcript/components/tool-display/renderers/BashRenderer.d.ts.map +1 -0
  147. package/dist/features/transcript/components/tool-display/renderers/FileEditRenderer.d.ts +4 -0
  148. package/dist/features/transcript/components/tool-display/renderers/FileEditRenderer.d.ts.map +1 -0
  149. package/dist/features/transcript/components/tool-display/renderers/FileNewRenderer.d.ts +4 -0
  150. package/dist/features/transcript/components/tool-display/renderers/FileNewRenderer.d.ts.map +1 -0
  151. package/dist/features/transcript/components/tool-display/renderers/TodoWriteRenderer.d.ts +4 -0
  152. package/dist/features/transcript/components/tool-display/renderers/TodoWriteRenderer.d.ts.map +1 -0
  153. package/dist/features/transcript/components/tool-display/renderers/UnknownRenderer.d.ts +4 -0
  154. package/dist/features/transcript/components/tool-display/renderers/UnknownRenderer.d.ts.map +1 -0
  155. package/dist/features/transcript/components/tool-display/tool-icon.d.ts +4 -0
  156. package/dist/features/transcript/components/tool-display/tool-icon.d.ts.map +1 -0
  157. package/dist/features/transcript/components/tool-display/tool-meta.d.ts +9 -0
  158. package/dist/features/transcript/components/tool-display/tool-meta.d.ts.map +1 -0
  159. package/dist/features/transcript/components/tool-display/tool-variants.d.ts +8 -0
  160. package/dist/features/transcript/components/tool-display/tool-variants.d.ts.map +1 -0
  161. package/dist/features/transcript/components/tool-display/types.d.ts +11 -0
  162. package/dist/features/transcript/components/tool-display/types.d.ts.map +1 -0
  163. package/dist/features/transcript/hooks/use-live-tick.d.ts +8 -0
  164. package/dist/features/transcript/hooks/use-live-tick.d.ts.map +1 -0
  165. package/dist/features/transcript/hooks/use-revealed-text.d.ts +28 -0
  166. package/dist/features/transcript/hooks/use-revealed-text.d.ts.map +1 -0
  167. package/dist/features/transcript/index.d.ts +6 -0
  168. package/dist/features/transcript/index.d.ts.map +1 -0
  169. package/dist/features/transcript/lib/message-groups.d.ts +9 -0
  170. package/dist/features/transcript/lib/message-groups.d.ts.map +1 -0
  171. package/dist/features/transcript/lib/preview-lines.d.ts +27 -0
  172. package/dist/features/transcript/lib/preview-lines.d.ts.map +1 -0
  173. package/dist/features/transcript/lib/processing-state.d.ts +16 -0
  174. package/dist/features/transcript/lib/processing-state.d.ts.map +1 -0
  175. package/dist/features/transcript/lib/reasoning-label.d.ts +9 -0
  176. package/dist/features/transcript/lib/reasoning-label.d.ts.map +1 -0
  177. package/dist/features/transcript/lib/tool-format-utils.d.ts +29 -0
  178. package/dist/features/transcript/lib/tool-format-utils.d.ts.map +1 -0
  179. package/dist/features/transcript/lib/tool-formatters.d.ts +45 -0
  180. package/dist/features/transcript/lib/tool-formatters.d.ts.map +1 -0
  181. package/dist/features/transcript/lib/tool-status.d.ts +39 -0
  182. package/dist/features/transcript/lib/tool-status.d.ts.map +1 -0
  183. package/dist/features/transcript/lib/transcript-rows.d.ts +15 -0
  184. package/dist/features/transcript/lib/transcript-rows.d.ts.map +1 -0
  185. package/dist/features/transcript/lib/turn-groups.d.ts +20 -0
  186. package/dist/features/transcript/lib/turn-groups.d.ts.map +1 -0
  187. package/dist/features/transcript/lib/turn-summary.d.ts +11 -0
  188. package/dist/features/transcript/lib/turn-summary.d.ts.map +1 -0
  189. package/dist/features/workflows/WorkflowsPanel.d.ts +11 -0
  190. package/dist/features/workflows/WorkflowsPanel.d.ts.map +1 -0
  191. package/dist/features/workflows/index.d.ts +3 -0
  192. package/dist/features/workflows/index.d.ts.map +1 -0
  193. package/dist/index.d.ts +45 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +7877 -0
  196. package/dist/session/client-commands.d.ts +26 -0
  197. package/dist/session/client-commands.d.ts.map +1 -0
  198. package/dist/session/commands.d.ts +9 -0
  199. package/dist/session/commands.d.ts.map +1 -0
  200. package/dist/session/directory-source.d.ts +101 -0
  201. package/dist/session/directory-source.d.ts.map +1 -0
  202. package/dist/session/directory-status.d.ts +8 -0
  203. package/dist/session/directory-status.d.ts.map +1 -0
  204. package/dist/session/directory.d.ts +41 -0
  205. package/dist/session/directory.d.ts.map +1 -0
  206. package/dist/session/index.d.ts +16 -0
  207. package/dist/session/index.d.ts.map +1 -0
  208. package/dist/session/snapshot.d.ts +11 -0
  209. package/dist/session/snapshot.d.ts.map +1 -0
  210. package/dist/session/store.d.ts +96 -0
  211. package/dist/session/store.d.ts.map +1 -0
  212. package/dist/session/tool-timing.d.ts +14 -0
  213. package/dist/session/tool-timing.d.ts.map +1 -0
  214. package/dist/session/transport.d.ts +187 -0
  215. package/dist/session/transport.d.ts.map +1 -0
  216. package/dist/session/types.d.ts +73 -0
  217. package/dist/session/types.d.ts.map +1 -0
  218. package/dist/session/use-directory.d.ts +54 -0
  219. package/dist/session/use-directory.d.ts.map +1 -0
  220. package/dist/session/use-session-transport.d.ts +10 -0
  221. package/dist/session/use-session-transport.d.ts.map +1 -0
  222. package/dist/shared/hooks/use-stick-to-bottom-sentinel.d.ts +64 -0
  223. package/dist/shared/hooks/use-stick-to-bottom-sentinel.d.ts.map +1 -0
  224. package/dist/shared/lib/navigation.d.ts +20 -0
  225. package/dist/shared/lib/navigation.d.ts.map +1 -0
  226. package/dist/shared/lib/toast.d.ts +35 -0
  227. package/dist/shared/lib/toast.d.ts.map +1 -0
  228. package/dist/shared/lib/utils.d.ts +3 -0
  229. package/dist/shared/lib/utils.d.ts.map +1 -0
  230. package/dist/shared/ui/CopyButton.d.ts +6 -0
  231. package/dist/shared/ui/CopyButton.d.ts.map +1 -0
  232. package/dist/shared/ui/avatar.d.ts +9 -0
  233. package/dist/shared/ui/avatar.d.ts.map +1 -0
  234. package/dist/shared/ui/badge.d.ts +8 -0
  235. package/dist/shared/ui/badge.d.ts.map +1 -0
  236. package/dist/shared/ui/button.d.ts +11 -0
  237. package/dist/shared/ui/button.d.ts.map +1 -0
  238. package/dist/shared/ui/command.d.ts +10 -0
  239. package/dist/shared/ui/command.d.ts.map +1 -0
  240. package/dist/shared/ui/confirm-dialog.d.ts +17 -0
  241. package/dist/shared/ui/confirm-dialog.d.ts.map +1 -0
  242. package/dist/shared/ui/dropdown-menu.d.ts +9 -0
  243. package/dist/shared/ui/dropdown-menu.d.ts.map +1 -0
  244. package/dist/shared/ui/input.d.ts +3 -0
  245. package/dist/shared/ui/input.d.ts.map +1 -0
  246. package/dist/shared/ui/kbd.d.ts +3 -0
  247. package/dist/shared/ui/kbd.d.ts.map +1 -0
  248. package/dist/shared/ui/popover.d.ts +7 -0
  249. package/dist/shared/ui/popover.d.ts.map +1 -0
  250. package/dist/shared/ui/scroll-area.d.ts +5 -0
  251. package/dist/shared/ui/scroll-area.d.ts.map +1 -0
  252. package/dist/shared/ui/tabs.d.ts +7 -0
  253. package/dist/shared/ui/tabs.d.ts.map +1 -0
  254. package/dist/shared/ui/toast.d.ts +7 -0
  255. package/dist/shared/ui/toast.d.ts.map +1 -0
  256. package/dist/shared/ui/tooltip.d.ts +7 -0
  257. package/dist/shared/ui/tooltip.d.ts.map +1 -0
  258. package/dist/styles/base.css +49 -0
  259. package/dist/styles/components.css +206 -0
  260. package/dist/styles/effects.css +76 -0
  261. package/dist/styles/fonts.css +49 -0
  262. package/dist/styles/index.css +14 -0
  263. package/dist/styles/styles.test.ts +45 -0
  264. package/dist/styles/themes.css +33 -0
  265. package/dist/styles/tokens.css +245 -0
  266. package/dist/styles/tokens.test.ts +113 -0
  267. package/dist/test-setup.d.ts +29 -0
  268. package/dist/test-setup.d.ts.map +1 -0
  269. package/package.json +71 -0
@@ -0,0 +1,121 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-TLWTUPOJ.js";
4
+
5
+ // src/features/transcript/components/MarkdownBody.tsx
6
+ import "katex/dist/katex.min.css";
7
+ import "streamdown/styles.css";
8
+ import rehypeKatex from "rehype-katex";
9
+ import remarkMath from "remark-math";
10
+ import { Streamdown } from "streamdown";
11
+
12
+ // src/features/transcript/components/CodeBlock.tsx
13
+ import { useState } from "react";
14
+ import { jsx, jsxs } from "react/jsx-runtime";
15
+ function CodeBlock({ code, language }) {
16
+ const [copied, setCopied] = useState(false);
17
+ const handleCopy = () => {
18
+ void navigator.clipboard?.writeText(code).then(() => {
19
+ setCopied(true);
20
+ setTimeout(() => setCopied(false), 1500);
21
+ }).catch(() => {
22
+ });
23
+ };
24
+ return /* @__PURE__ */ jsxs("div", { className: "group relative my-3 overflow-hidden rounded-lg border border-border-default bg-surface-inset", children: [
25
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-border-subtle px-3 py-1.5", children: [
26
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] uppercase tracking-wide text-fg-tertiary", children: language || "text" }),
27
+ /* @__PURE__ */ jsx(
28
+ "button",
29
+ {
30
+ type: "button",
31
+ onClick: handleCopy,
32
+ className: cn(
33
+ "rounded px-1.5 py-0.5 font-mono text-[10px] text-fg-tertiary transition",
34
+ "opacity-0 hover:text-fg-secondary group-hover:opacity-100 focus-visible:opacity-100"
35
+ ),
36
+ children: copied ? "Copied" : "Copy"
37
+ }
38
+ )
39
+ ] }),
40
+ /* @__PURE__ */ jsx("pre", { className: "overflow-x-auto px-3 py-2.5 text-[12.5px] leading-[1.55]", children: /* @__PURE__ */ jsx("code", { className: "font-mono text-fg-primary", children: code }) })
41
+ ] });
42
+ }
43
+
44
+ // src/features/transcript/components/MarkdownBody.tsx
45
+ import { jsx as jsx2 } from "react/jsx-runtime";
46
+ var mathPlugin = {
47
+ name: "katex",
48
+ type: "math",
49
+ remarkPlugin: remarkMath,
50
+ rehypePlugin: rehypeKatex
51
+ };
52
+ function denormalizeHref(href) {
53
+ if (!href) return href;
54
+ const match = /^(https?:\/\/[^/?#]+)\/$/.exec(href);
55
+ return match ? match[1] : href;
56
+ }
57
+ var proseClasses = cn(
58
+ "text-[13.5px] leading-[1.6] text-fg-primary",
59
+ "[&>*:first-child]:mt-0 [&>*:last-child]:mb-0",
60
+ "[&_p]:my-2",
61
+ "[&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-5 [&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-5 [&_li]:my-0.5",
62
+ "[&_h1]:mb-1.5 [&_h1]:mt-3 [&_h1]:text-[16px] [&_h1]:font-semibold",
63
+ "[&_h2]:mb-1.5 [&_h2]:mt-3 [&_h2]:text-[15px] [&_h2]:font-semibold",
64
+ "[&_h3]:mb-1 [&_h3]:mt-2.5 [&_h3]:text-[14px] [&_h3]:font-semibold",
65
+ "[&_blockquote]:border-l-2 [&_blockquote]:border-border-strong [&_blockquote]:pl-3 [&_blockquote]:text-fg-secondary"
66
+ // Tables are styled by streamdown's own table block (themed via the shadcn
67
+ // token bridge in tokens.css); don't hand-style th/td here or the two conflict.
68
+ );
69
+ function MarkdownBody({
70
+ text,
71
+ streaming = false
72
+ }) {
73
+ return /* @__PURE__ */ jsx2("div", { className: proseClasses, children: /* @__PURE__ */ jsx2(
74
+ Streamdown,
75
+ {
76
+ mode: streaming ? "streaming" : "static",
77
+ plugins: { math: mathPlugin },
78
+ components: {
79
+ // Intercept block code at the <pre> level: read the language + raw text
80
+ // from the hast node so bare (no-language) fences are still treated as
81
+ // blocks, then render our dependency-free CodeBlock (no Shiki).
82
+ pre: ({ node }) => {
83
+ const codeNode = node?.children?.[0];
84
+ const classes = codeNode?.properties?.className;
85
+ const className = Array.isArray(classes) ? classes.join(" ") : String(classes ?? "");
86
+ const language = /language-(\w+)/.exec(className)?.[1] ?? "";
87
+ const code = (codeNode?.children?.[0]?.value ?? "").replace(/\n$/, "");
88
+ return /* @__PURE__ */ jsx2(CodeBlock, { code, language });
89
+ },
90
+ // Inline code only (block code is intercepted at the <pre> level above).
91
+ inlineCode: ({ className, children }) => /* @__PURE__ */ jsx2(
92
+ "code",
93
+ {
94
+ className: cn(
95
+ "rounded bg-surface-inset px-1 py-0.5 font-mono text-[0.85em] text-fg-primary",
96
+ className
97
+ ),
98
+ children
99
+ }
100
+ ),
101
+ // streamdown's default renders bold as a styled <span>; emit a real
102
+ // <strong> so the rendered markup uses semantic emphasis elements.
103
+ strong: ({ children }) => /* @__PURE__ */ jsx2("strong", { className: "font-semibold", children }),
104
+ a: ({ href, children }) => /* @__PURE__ */ jsx2(
105
+ "a",
106
+ {
107
+ href: denormalizeHref(href),
108
+ target: "_blank",
109
+ rel: "noreferrer noopener",
110
+ className: "text-accent underline underline-offset-2 hover:text-accent-hover",
111
+ children
112
+ }
113
+ )
114
+ },
115
+ children: text
116
+ }
117
+ ) });
118
+ }
119
+ export {
120
+ MarkdownBody as default
121
+ };
@@ -0,0 +1,24 @@
1
+ import type { ComponentType, ReactNode } from "react";
2
+ import { type ConfigClient } from "@/features/config";
3
+ import { type DirectorySource } from "@/session";
4
+ export type AppProps = {
5
+ configClient?: ConfigClient;
6
+ /** Cloud: the account-backed daemon source (default: local /api/servers). */
7
+ directorySource?: DirectorySource;
8
+ slots?: {
9
+ railFooter?: ReactNode;
10
+ AddDaemonModal?: ComponentType<{
11
+ open: boolean;
12
+ onClose: () => void;
13
+ }>;
14
+ };
15
+ /** Onboarding mode (web spec §7): "global" = today's app-wide OnboardingGate;
16
+ * "per-daemon" = badge unconfigured daemons + per-StartScreen provider setup. */
17
+ onboarding?: "global" | "per-daemon";
18
+ };
19
+ export type AppBodyProps = Omit<AppProps, "directorySource">;
20
+ declare function AppBody({ configClient: injectedClient, slots, onboarding, mode, }?: AppBodyProps & {
21
+ mode?: "home" | "shell";
22
+ }): import("react/jsx-runtime").JSX.Element;
23
+ export { AppBody };
24
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/app/App.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAa,SAAS,EAAE,MAAM,OAAO,CAAC;AAIjE,OAAO,EAEL,KAAK,YAAY,EAKlB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EACL,KAAK,eAAe,EAiBrB,MAAM,WAAW,CAAC;AAMnB,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,6EAA6E;IAC7E,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,SAAS,CAAC;QACvB,cAAc,CAAC,EAAE,aAAa,CAAC;YAAE,IAAI,EAAE,OAAO,CAAC;YAAC,OAAO,EAAE,MAAM,IAAI,CAAA;SAAE,CAAC,CAAC;KACxE,CAAC;IACF;qFACiF;IACjF,UAAU,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AAE7D,iBAAS,OAAO,CAAC,EACf,YAAY,EAAE,cAAc,EAC5B,KAAK,EACL,UAAqB,EACrB,IAAa,GACd,GAAE,YAAY,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAO,2CAqsBjD;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ReactNode } from "react";
2
+ export interface AppShellProps {
3
+ rail: ReactNode;
4
+ sidebar: ReactNode;
5
+ panel: ReactNode;
6
+ /** Mobile drawer open state (rail+sidebar overlay below sm). */
7
+ drawerOpen?: boolean;
8
+ onCloseDrawer?: () => void;
9
+ /** When true, the sidebar grid track narrows to the 48px icon rail (sm+). */
10
+ sidebarCollapsed?: boolean;
11
+ }
12
+ export declare function AppShell({ rail, sidebar, panel, drawerOpen, onCloseDrawer, sidebarCollapsed, }: AppShellProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=AppShell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../src/app/AppShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAiBvC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,UAAkB,EAClB,aAAa,EACb,gBAAwB,GACzB,EAAE,aAAa,2CAmCf"}
@@ -0,0 +1,11 @@
1
+ import type { ThemeMode } from "@/features/theme";
2
+ export declare const headerShellClassName = "mx-auto flex w-full max-w-6xl flex-col gap-3 lg:flex-row lg:items-end lg:justify-between";
3
+ export declare const headerTitleClassName = "text-xl font-semibold tracking-tight text-[var(--color-text)] sm:text-2xl";
4
+ export declare const showSessionTape = false;
5
+ interface HeaderProps {
6
+ onToggleTheme: () => void;
7
+ themeMode: ThemeMode;
8
+ }
9
+ export declare function Header({ onToggleTheme, themeMode }: HeaderProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=Header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/app/Header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,eAAO,MAAM,oBAAoB,6FAC2D,CAAC;AAC7F,eAAO,MAAM,oBAAoB,8EAC4C,CAAC;AAC9E,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC,UAAU,WAAW;IACnB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,MAAM,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,WAAW,2CAc/D"}
@@ -0,0 +1,15 @@
1
+ export declare const subHeaderClassName = "flex flex-row items-center gap-1.5 px-3 py-1 font-mono text-xs text-[var(--color-muted)] border-b border-[var(--color-border)] bg-[var(--color-panel)]";
2
+ export declare const subHeaderCwdClassName = "truncate max-w-[40ch] text-[var(--color-text)] opacity-70";
3
+ export declare const subHeaderSepClassName = "opacity-40 select-none";
4
+ export declare const subHeaderConnDotClassName = "ml-auto inline-block w-2 h-2 shrink-0";
5
+ export declare const subHeaderConnDotConnectedClassName = "ml-auto inline-block w-2 h-2 shrink-0 bg-[var(--color-accent)] opacity-80";
6
+ export declare const subHeaderConnDotDisconnectedClassName = "ml-auto inline-block w-2 h-2 shrink-0 bg-[var(--color-muted)] opacity-40";
7
+ interface SessionSubHeaderProps {
8
+ cwd: string;
9
+ modelName: string;
10
+ approvalMode: string;
11
+ connected: boolean;
12
+ }
13
+ export declare function SessionSubHeader({ cwd, modelName, approvalMode, connected, }: SessionSubHeaderProps): import("react/jsx-runtime").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=SessionSubHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionSubHeader.d.ts","sourceRoot":"","sources":["../../src/app/SessionSubHeader.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB,2JAC2H,CAAC;AAE3J,eAAO,MAAM,qBAAqB,8DAA8D,CAAC;AAEjG,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAE9D,eAAO,MAAM,yBAAyB,0CAA0C,CAAC;AAEjF,eAAO,MAAM,kCAAkC,8EAAqE,CAAC;AAErH,eAAO,MAAM,qCAAqC,6EAAoE,CAAC;AAEvH,UAAU,qBAAqB;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,GAAG,EACH,SAAS,EACT,YAAY,EACZ,SAAS,GACV,EAAE,qBAAqB,2CAkBvB"}
@@ -0,0 +1,15 @@
1
+ import type { ReactNode } from "react";
2
+ export interface WorkspacePanelProps {
3
+ daemonName: string;
4
+ sessionTitle: string;
5
+ /** Active workspace name. Surfaced in the breadcrumb or on the path line
6
+ * depending on whether a cwd is present. */
7
+ workspace?: string;
8
+ /** Working directory of the active session; rendered on the second header line. */
9
+ cwd?: string;
10
+ busy: boolean;
11
+ body: ReactNode;
12
+ composer: ReactNode;
13
+ }
14
+ export declare function WorkspacePanel({ daemonName, sessionTitle, workspace, cwd, busy, body, composer, }: WorkspacePanelProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=WorkspacePanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspacePanel.d.ts","sourceRoot":"","sources":["../../src/app/WorkspacePanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB;iDAC6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,EAC7B,UAAU,EACV,YAAY,EACZ,SAAS,EACT,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,QAAQ,GACT,EAAE,mBAAmB,2CA6GrB"}
@@ -0,0 +1,11 @@
1
+ export declare const appShellClassName = "relative grid h-dvh overflow-hidden bg-surface-base text-fg-primary grid-cols-[minmax(0,1fr)]";
2
+ export declare const sidebarExpandedColsClassName = "sm:grid-cols-[52px_256px_minmax(0,1fr)]";
3
+ export declare const sidebarCollapsedColsClassName = "sm:grid-cols-[52px_48px_minmax(0,1fr)]";
4
+ export declare const railColumnClassName = "hidden min-h-0 sm:block";
5
+ export declare const sidebarColumnClassName = "hidden min-h-0 sm:block";
6
+ export declare const panelColumnClassName = "min-h-0 min-w-0";
7
+ export declare const drawerOverlayClassName = "absolute inset-y-0 left-0 z-40 flex transition-transform duration-200 ease-out sm:hidden";
8
+ export declare const drawerOpenClassName = "translate-x-0";
9
+ export declare const drawerClosedClassName = "-translate-x-full";
10
+ export declare const drawerScrimClassName = "absolute inset-0 z-30 bg-black/40 sm:hidden";
11
+ //# sourceMappingURL=app-shell.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-shell.styles.d.ts","sourceRoot":"","sources":["../../src/app/app-shell.styles.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,iBAAiB,kGACmE,CAAC;AAGlG,eAAO,MAAM,4BAA4B,4CAA4C,CAAC;AACtF,eAAO,MAAM,6BAA6B,2CAA2C,CAAC;AAGtF,eAAO,MAAM,mBAAmB,4BAA4B,CAAC;AAC7D,eAAO,MAAM,sBAAsB,4BAA4B,CAAC;AAChE,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAGtD,eAAO,MAAM,sBAAsB,6FACyD,CAAC;AAC7F,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AACnD,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAGzD,eAAO,MAAM,oBAAoB,gDAAgD,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { type DirectorySource } from "@/session";
2
+ import { type AppBodyProps } from "./App";
3
+ /**
4
+ * Always-mounted layout-route element (spec §4). Owns the transport/directory
5
+ * bootstrap and the router-less navigate bridge (registerNavigate, moved here
6
+ * from the deleted route-sync so transport.ts's appNavigate keeps working).
7
+ * React Router keeps this mounted across every descendant navigation.
8
+ */
9
+ export declare function RootLayout({ directorySource }: {
10
+ directorySource?: DirectorySource;
11
+ }): import("react/jsx-runtime").JSX.Element;
12
+ /**
13
+ * Home is always the picker (spec §8): drop any session selection + resolution
14
+ * gate on mount. Picker liveness is mode-split (spec §5.3): local keeps a
15
+ * directory socket to every daemon; cloud holds zero sockets and polls REST.
16
+ */
17
+ export declare function Picker(props: AppBodyProps): import("react/jsx-runtime").JSX.Element;
18
+ /**
19
+ * Connect-on-entry (spec §5.2) + daemon scoping (spec §5.1). Acquires this
20
+ * route's :daemon directory link; once the directory is ready, bounces an
21
+ * unknown daemon to the picker (with a toast). Scope is URL-derived downstream
22
+ * (App reads useParams().daemon — no selectedDaemon store field). Nested param
23
+ * changes keep this mounted.
24
+ */
25
+ export declare function DaemonLayout(): import("react/jsx-runtime").JSX.Element;
26
+ /**
27
+ * New-session draft (spec §5.1/§5.4): ensure the daemon's addressable draft tab
28
+ * and activate it. One draft per daemon; a reload starts a fresh draft (the tabs
29
+ * map is rebuilt empty). The effect is passive, so a synchronous first commit
30
+ * renders the shell from the current store before the draft activates.
31
+ *
32
+ * The in-pane resolution gate is DERIVED from the URL params + pool + meta now
33
+ * (spec §6): the draft route has no :sessionId, so AppBody's derived gate is
34
+ * null on the draft shell — navigating here from an unreachable session self-
35
+ * clears the gate without any store write.
36
+ */
37
+ export declare function DraftView(props: AppBodyProps): import("react/jsx-runtime").JSX.Element;
38
+ /**
39
+ * The selected session (spec §4/§5.1). ensureAttached resolves live → attach,
40
+ * cold → read-only transcript, offline → in-pane unreachable gate, 404 → picker
41
+ * + toast. Re-runs when the directory view / daemon meta resolves (loading →
42
+ * ready, offline → online for the retry gate). Unmount does NOTHING to the
43
+ * socket — the pool keeps it warm (LRU-only eviction).
44
+ */
45
+ export declare function SessionView(props: AppBodyProps): import("react/jsx-runtime").JSX.Element;
46
+ //# sourceMappingURL=route-components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-components.d.ts","sourceRoot":"","sources":["../../src/app/route-components.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,eAAe,EAYrB,MAAM,WAAW,CAAC;AAInB,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,eAAe,EAAE,EAAE;IAAE,eAAe,CAAC,EAAE,eAAe,CAAA;CAAE,2CAmBpF;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,YAAY,2CAQzC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,4CA0B3B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,2CAY5C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,2CAU9C"}
@@ -0,0 +1,11 @@
1
+ import { type RouteObject } from "react-router";
2
+ import type { AppBodyProps, AppProps } from "./App";
3
+ /**
4
+ * Element-bearing route children (web spec §4). RootLayout (the layout-route
5
+ * element) owns the bootstrap and never unmounts. Phase 3 lands the <Navigate
6
+ * replace> redirects deferred from Phase 1 (the daemon index → /new, the
7
+ * catch-all → /) now that route-sync no longer owns redirects.
8
+ */
9
+ export declare function appRouteChildren(bodyProps?: AppBodyProps): RouteObject[];
10
+ export declare function buildRoutes(props?: AppProps): RouteObject[];
11
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/app/routes.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGpD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,YAAiB,GAAG,WAAW,EAAE,CAc5E;AAED,wBAAgB,WAAW,CAAC,KAAK,GAAE,QAAa,GAAG,WAAW,EAAE,CAS/D"}
@@ -0,0 +1,10 @@
1
+ // src/shared/lib/utils.ts
2
+ import { clsx } from "clsx";
3
+ import { twMerge } from "tailwind-merge";
4
+ function cn(...inputs) {
5
+ return twMerge(clsx(inputs));
6
+ }
7
+
8
+ export {
9
+ cn
10
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Auth seam (web spec §5/§11): components NEVER import Clerk. The cloud
3
+ * composition root bridges Clerk's useAuth() into this interface; the local
4
+ * build uses the always-open localAuthGate. getToken() resolves a fresh
5
+ * Clerk session JWT per call (Clerk handles refresh) — null when signed out
6
+ * or in local mode.
7
+ */
8
+ export interface AuthGate {
9
+ isReady: boolean;
10
+ isSignedIn: boolean;
11
+ userId: string | null;
12
+ getToken(): Promise<string | null>;
13
+ }
14
+ export declare const localAuthGate: AuthGate;
15
+ export declare const AuthGateContext: import("react").Context<AuthGate>;
16
+ export declare function useAuthGate(): AuthGate;
17
+ //# sourceMappingURL=auth-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-gate.d.ts","sourceRoot":"","sources":["../../../src/features/account/auth-gate.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,aAAa,EAAE,QAK3B,CAAC;AAEF,eAAO,MAAM,eAAe,mCAAyC,CAAC;AAEtE,wBAAgB,WAAW,IAAI,QAAQ,CAEtC"}
@@ -0,0 +1,3 @@
1
+ export type { AuthGate } from "./auth-gate";
2
+ export { AuthGateContext, localAuthGate, useAuthGate } from "./auth-gate";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/account/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { QueuedMessageView, SlashCommandDescriptor } from "@nuvin/session/protocol";
2
+ import type { FormEvent } from "react";
3
+ import { type WebSessionSnapshot } from "@/session";
4
+ export declare const composerShellClassName = "mx-auto w-full max-w-6xl space-y-2 sm:space-y-3";
5
+ export declare const composerFormClassName = "p-0";
6
+ export declare const composerActionsClassName = "mt-2 grid grid-cols-2 gap-2 sm:mt-3 sm:flex sm:grid-cols-none sm:items-center sm:justify-between sm:gap-3";
7
+ export declare const approvalContentClassName = "min-w-0";
8
+ export declare const approvalArgsClassName = "mt-2 max-w-full whitespace-pre-wrap break-words rounded-md border border-border-subtle bg-surface-sunken p-2 font-mono text-xs leading-5 text-fg-secondary";
9
+ export declare const approvalDiffClassName = "mt-2 overflow-hidden rounded-md border border-border-subtle";
10
+ export declare const approvalActionsClassName = "grid grid-cols-3 gap-2";
11
+ export declare const approvalButtonClassName = "min-w-0 whitespace-nowrap";
12
+ export declare function composerPrimaryActionLabel(busy: boolean): string;
13
+ interface ComposerProps {
14
+ activeApproval: WebSessionSnapshot["approval"]["active"];
15
+ activeQuestion?: WebSessionSnapshot["question"]["active"];
16
+ busy: boolean;
17
+ contextWindowLimit?: number;
18
+ contextWindowUsage?: number;
19
+ currentTokens?: number;
20
+ inputDisabled: boolean;
21
+ modelName?: string;
22
+ pendingApprovalCount: number;
23
+ persona?: string;
24
+ /** Messages queued for auto-send after the current turn (server-authoritative). */
25
+ queued?: QueuedMessageView[];
26
+ /** Active tab key; the composer reads/writes that tab's draft in the store. */
27
+ tabKey: string | null;
28
+ onSubmit(event: FormEvent<HTMLFormElement>): void;
29
+ /** Server + client-side slash command descriptors for the autocomplete popup. */
30
+ slashCommands?: SlashCommandDescriptor[];
31
+ }
32
+ export declare function Composer({ activeApproval, activeQuestion, busy, contextWindowLimit, contextWindowUsage, currentTokens, inputDisabled, modelName, onSubmit, pendingApprovalCount, persona, queued, tabKey, slashCommands, }: ComposerProps): import("react/jsx-runtime").JSX.Element;
33
+ export declare function ApprovalCard({ input, pendingCount, toolName, }: {
34
+ input: unknown;
35
+ pendingCount: number;
36
+ toolName: string;
37
+ }): import("react/jsx-runtime").JSX.Element;
38
+ export {};
39
+ //# sourceMappingURL=Composer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../../src/features/composer/Composer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEzF,OAAO,KAAK,EAAkB,SAAS,EAAiB,MAAM,OAAO,CAAC;AAUtE,OAAO,EAQL,KAAK,kBAAkB,EACxB,MAAM,WAAW,CAAC;AAWnB,eAAO,MAAM,sBAAsB,oDAAoD,CAAC;AACxF,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,wBAAwB,8GACwE,CAAC;AAC9G,eAAO,MAAM,wBAAwB,YAAY,CAAC;AAClD,eAAO,MAAM,qBAAqB,+JAC4H,CAAC;AAC/J,eAAO,MAAM,qBAAqB,gEAAgE,CAAC;AACnG,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AACjE,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhE;AAED,UAAU,aAAa;IACrB,cAAc,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;IACzD,cAAc,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1D,IAAI,EAAE,OAAO,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B,+EAA+E;IAC/E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAClD,iFAAiF;IACjF,aAAa,CAAC,EAAE,sBAAsB,EAAE,CAAC;CAC1C;AAED,wBAAgB,QAAQ,CAAC,EACvB,cAAc,EACd,cAAqB,EACrB,IAAI,EACJ,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,SAAS,EACT,QAAQ,EACR,oBAAoB,EACpB,OAAO,EACP,MAAW,EACX,MAAM,EACN,aAAa,GACd,EAAE,aAAa,2CA0Yf;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,YAAY,EACZ,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB,2CA+MA"}
@@ -0,0 +1,21 @@
1
+ import type { AskUserAnswers, AskUserQuestionRequest } from "@nuvin/agent-core/shared";
2
+ export declare const questionCardClassName = "rounded-lg border border-border-default bg-surface-raised p-4 shadow-[var(--shadow-md)]";
3
+ type QuestionCardProps = {
4
+ question: AskUserQuestionRequest;
5
+ onSubmit: (answers: AskUserAnswers) => void;
6
+ };
7
+ /**
8
+ * Web-native form for answering an active AskUser question (parity with the CLI
9
+ * `AskUserQuestionInteractive`, mouse-first instead of keyboard-driven).
10
+ *
11
+ * Questions are shown ONE AT A TIME, like the TUI: the card renders the current
12
+ * question with a `topic` label and an `N / total` counter, and the user walks
13
+ * the set with Back / Next. Single-select questions auto-advance the moment a
14
+ * real option is picked; multi-select questions wait for an explicit Next. The
15
+ * final question swaps Next for Submit, which stays disabled until every
16
+ * question has a non-empty answer. On submit it builds the `AskUserAnswers` map
17
+ * (`Record<questionId, string | string[]>`) keyed by `question.id`.
18
+ */
19
+ export declare function QuestionCard({ question, onSubmit }: QuestionCardProps): import("react/jsx-runtime").JSX.Element | null;
20
+ export {};
21
+ //# sourceMappingURL=QuestionCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuestionCard.d.ts","sourceRoot":"","sources":["../../../src/features/composer/QuestionCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAQlC,eAAO,MAAM,qBAAqB,4FACyD,CAAC;AAE5F,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,sBAAsB,CAAC;IACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;CAC7C,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,iBAAiB,kDAwNrE"}
@@ -0,0 +1,6 @@
1
+ export declare function formatComposerContext(input: {
2
+ contextWindowLimit?: number;
3
+ contextWindowUsage?: number;
4
+ currentTokens?: number;
5
+ }): string | null;
6
+ //# sourceMappingURL=context-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-status.d.ts","sourceRoot":"","sources":["../../../src/features/composer/context-status.ts"],"names":[],"mappings":"AAsBA,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,GAAG,IAAI,CAShB"}
@@ -0,0 +1,2 @@
1
+ export { approvalActionsClassName, approvalArgsClassName, approvalButtonClassName, approvalContentClassName, Composer, composerActionsClassName, composerFormClassName, composerPrimaryActionLabel, composerShellClassName, } from "./Composer";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/composer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,QAAQ,EACR,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ProtocolConfigClient } from "./protocol-config-client";
2
+ export type CloudProviderSetupProps = {
3
+ client: ProtocolConfigClient;
4
+ daemonLabel: string;
5
+ /** Called after a successful setProviderAuth (so App can re-poll status). */
6
+ onConfigured: () => void;
7
+ };
8
+ /** Per-daemon provider setup (web spec §7): manage credentials + default on a
9
+ * remote daemon's EXISTING providers over the protocol. Cannot create/delete
10
+ * named providers (locked decision 1). */
11
+ export declare function CloudProviderSetup({ client, daemonLabel, onConfigured }: CloudProviderSetupProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=CloudProviderSetup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudProviderSetup.d.ts","sourceRoot":"","sources":["../../../src/features/config/CloudProviderSetup.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAEF;;0CAE0C;AAC1C,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAiJhG"}
@@ -0,0 +1,22 @@
1
+ import { type ReactNode } from "react";
2
+ import type { ConfigClient } from "@/features/config/config-client";
3
+ export type OnboardingGateProps = {
4
+ /** Injected config client (real or fake in tests). */
5
+ client: ConfigClient;
6
+ children: ReactNode;
7
+ };
8
+ /**
9
+ * First-run onboarding gate (spec §9). On mount it loads the provider list and,
10
+ * once it *successfully* resolves to an empty / all-unauthed set, blocks the app
11
+ * body and renders the named-provider add flow ({@link ProviderManagerPanel}).
12
+ * As soon as a provider with `hasAuth` exists, the body renders.
13
+ *
14
+ * FAIL-OPEN (load-bearing): while the list is still loading — and on a
15
+ * rejected/malformed `listProviders()` — the gate renders `children` rather than
16
+ * blocking. This is what keeps the existing App suites green: those tests stub
17
+ * `fetch` to a non-`{providers}` body (and pass no config client), so the default
18
+ * client's `listProviders()` rejects/parses to nothing → the gate stays open and
19
+ * the normal body renders. Only a successfully-resolved empty list blocks.
20
+ */
21
+ export declare function OnboardingGate({ client, children }: OnboardingGateProps): import("react/jsx-runtime").JSX.Element;
22
+ //# sourceMappingURL=OnboardingGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OnboardingGate.d.ts","sourceRoot":"","sources":["../../../src/features/config/OnboardingGate.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAoC,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAGpE,MAAM,MAAM,mBAAmB,GAAG;IAChC,sDAAsD;IACtD,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAUF;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAgDvE"}
@@ -0,0 +1,15 @@
1
+ import type { ConfigClient } from "@/features/config/config-client";
2
+ export type ProviderManagerPanelProps = {
3
+ /** Injected config client (real or fake in tests). */
4
+ client: ConfigClient;
5
+ /** Fired after each successful mutation (add/remove/set-default) — lets a
6
+ * host (e.g. the OnboardingGate) re-evaluate the provider list. */
7
+ onChange?: () => void;
8
+ };
9
+ /**
10
+ * Named-provider (credential) manager — list / add / remove / set-default
11
+ * (spec §3/§9). Presentational: all I/O goes through the injected
12
+ * {@link ConfigClient}; the list reloads after every successful mutation.
13
+ */
14
+ export declare function ProviderManagerPanel({ client, onChange }: ProviderManagerPanelProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=ProviderManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderManager.d.ts","sourceRoot":"","sources":["../../../src/features/config/ProviderManager.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,iCAAiC,CAAC;AAcjF,MAAM,MAAM,yBAAyB,GAAG;IACtC,sDAAsD;IACtD,MAAM,EAAE,YAAY,CAAC;IACrB;uEACmE;IACnE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAUF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,yBAAyB,2CAiMnF"}
@@ -0,0 +1,13 @@
1
+ import type { ConfigClient } from "@/features/config/config-client";
2
+ export type WorkspaceManagerPanelProps = {
3
+ /** Injected config client (real or fake in tests). */
4
+ client: ConfigClient;
5
+ };
6
+ /**
7
+ * Workspace manager — list / create / set active provider / per-item toggle
8
+ * (spec §4/§5). Presentational: all I/O goes through the injected
9
+ * {@link ConfigClient}; the workspace list reloads after every successful
10
+ * mutation. The active-provider `<select>` is populated from the provider list.
11
+ */
12
+ export declare function WorkspaceManagerPanel({ client }: WorkspaceManagerPanelProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=WorkspaceManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceManager.d.ts","sourceRoot":"","sources":["../../../src/features/config/WorkspaceManager.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,iCAAiC,CAAC;AAEzC,MAAM,MAAM,0BAA0B,GAAG;IACvC,sDAAsD;IACtD,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAUF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,MAAM,EAAE,EAAE,0BAA0B,2CA0M3E"}
@@ -0,0 +1,49 @@
1
+ export type WebProvider = {
2
+ name: string;
3
+ surface?: string;
4
+ baseUrl?: string;
5
+ defaultModel?: string;
6
+ hasAuth: boolean;
7
+ isActive: boolean;
8
+ };
9
+ export type WebWorkspaceOption = {
10
+ name: string;
11
+ root: string;
12
+ adhoc: boolean;
13
+ providerLabel: string;
14
+ };
15
+ export type AddProviderInput = {
16
+ name: string;
17
+ surface: string;
18
+ baseUrl?: string;
19
+ apiKey: string;
20
+ };
21
+ /**
22
+ * Provider-config seam (web spec §7 / P6 seam 1). Two implementations:
23
+ * - REST (local, unchanged): rest-config-client.ts → the CLI web server's
24
+ * /api/providers* + /api/workspaces* surface.
25
+ * - Protocol (cloud): protocol-config-client.ts → the P1 provider-config
26
+ * DaemonCommands on the SELECTED daemon's directory socket.
27
+ * ProviderConfigClient is the shared subset (what OnboardingGate needs);
28
+ * ConfigClient is the full local REST surface existing components consume.
29
+ */
30
+ export interface ProviderConfigClient {
31
+ listProviders(): Promise<WebProvider[]>;
32
+ setDefaultProvider(name: string): Promise<void>;
33
+ }
34
+ export interface ConfigClient extends ProviderConfigClient {
35
+ addProvider(input: AddProviderInput): Promise<void>;
36
+ removeProvider(name: string): Promise<void>;
37
+ listWorkspaces(): Promise<WebWorkspaceOption[]>;
38
+ createWorkspace(name: string, opts: {
39
+ root?: string;
40
+ }): Promise<void>;
41
+ patchWorkspace(name: string, patch: {
42
+ activeProvider?: string;
43
+ toggle?: {
44
+ key: string;
45
+ enabled: boolean;
46
+ };
47
+ }): Promise<void>;
48
+ }
49
+ //# sourceMappingURL=config-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-client.d.ts","sourceRoot":"","sources":["../../../src/features/config/config-client.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACxC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,YAAa,SAAQ,oBAAoB;IACxD,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,cAAc,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAChD,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,cAAc,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,GAC7E,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB"}
@@ -0,0 +1,10 @@
1
+ export { CloudProviderSetup } from "./CloudProviderSetup";
2
+ export type { AddProviderInput, ConfigClient, ProviderConfigClient, WebProvider, WebWorkspaceOption, } from "./config-client";
3
+ export { OnboardingGate } from "./OnboardingGate";
4
+ export { ProviderManagerPanel } from "./ProviderManager";
5
+ export type { ProtocolConfigClient, ProtocolConfigClientOptions, } from "./protocol-config-client";
6
+ export { createProtocolConfigClient } from "./protocol-config-client";
7
+ export { createConfigClient } from "./rest-config-client";
8
+ export { useProviderStatus } from "./use-provider-status";
9
+ export { WorkspaceManagerPanel } from "./WorkspaceManager";
10
+ //# sourceMappingURL=index.d.ts.map