@nocoo/basalt 2.2.0 → 3.0.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 (319) hide show
  1. package/README.md +2 -0
  2. package/ai/COMPATIBILITY.md +11 -1
  3. package/ai/DESIGN.md +342 -0
  4. package/ai/INTEGRATION.md +179 -128
  5. package/ai/RECIPES.md +51 -26
  6. package/ai/USAGE.md +4 -4
  7. package/ai/registry.json +2836 -270
  8. package/dist/charts/config.d.ts +11 -11
  9. package/dist/charts/config.js +4 -4
  10. package/dist/charts/config.js.map +1 -1
  11. package/dist/charts/date-navigation.js +10 -10
  12. package/dist/charts/date-navigation.js.map +1 -1
  13. package/dist/charts/donut.js +1 -1
  14. package/dist/charts/donut.js.map +1 -1
  15. package/dist/charts/frame.d.ts +1 -1
  16. package/dist/charts/frame.js +4 -4
  17. package/dist/charts/frame.js.map +1 -1
  18. package/dist/charts/gauge.js +5 -5
  19. package/dist/charts/gauge.js.map +1 -1
  20. package/dist/charts/heatmap-calendar.js +11 -11
  21. package/dist/charts/heatmap-calendar.js.map +1 -1
  22. package/dist/charts/heatmap-matrix.js +8 -8
  23. package/dist/charts/heatmap-matrix.js.map +1 -1
  24. package/dist/charts/item-list.js +1 -1
  25. package/dist/charts/item-list.js.map +1 -1
  26. package/dist/charts/legend.js +19 -19
  27. package/dist/charts/legend.js.map +1 -1
  28. package/dist/charts/palette.js +2 -2
  29. package/dist/charts/palette.js.map +1 -1
  30. package/dist/charts/slot-bar.js +2 -2
  31. package/dist/charts/slot-bar.js.map +1 -1
  32. package/dist/charts/sparkline.js +38 -23
  33. package/dist/charts/sparkline.js.map +1 -1
  34. package/dist/charts/stat-card.d.ts +2 -2
  35. package/dist/charts/stat-card.js +61 -58
  36. package/dist/charts/stat-card.js.map +1 -1
  37. package/dist/charts/timeline.js +18 -9
  38. package/dist/charts/timeline.js.map +1 -1
  39. package/dist/charts/tooltip.js +16 -16
  40. package/dist/charts/tooltip.js.map +1 -1
  41. package/dist/components/accordion.js +1 -1
  42. package/dist/components/accordion.js.map +1 -1
  43. package/dist/components/alert-dialog.js +4 -4
  44. package/dist/components/alert-dialog.js.map +1 -1
  45. package/dist/components/app-header.js +8 -8
  46. package/dist/components/app-header.js.map +1 -1
  47. package/dist/components/app-shell.js +1 -1
  48. package/dist/components/app-shell.js.map +1 -1
  49. package/dist/components/approval-card.d.ts +13 -0
  50. package/dist/components/approval-card.js +161 -0
  51. package/dist/components/approval-card.js.map +1 -0
  52. package/dist/components/avatar.d.ts +12 -0
  53. package/dist/components/avatar.js +39 -18
  54. package/dist/components/avatar.js.map +1 -1
  55. package/dist/components/badge.js +8 -8
  56. package/dist/components/badge.js.map +1 -1
  57. package/dist/components/banner.d.ts +2 -2
  58. package/dist/components/banner.js +9 -8
  59. package/dist/components/banner.js.map +1 -1
  60. package/dist/components/basalt-mark.js +1 -1
  61. package/dist/components/basalt-mark.js.map +1 -1
  62. package/dist/components/battery-meter.js +5 -5
  63. package/dist/components/battery-meter.js.map +1 -1
  64. package/dist/components/breadcrumbs.js +6 -6
  65. package/dist/components/breadcrumbs.js.map +1 -1
  66. package/dist/components/button.js +10 -10
  67. package/dist/components/button.js.map +1 -1
  68. package/dist/components/chat-bubble.js +4 -3
  69. package/dist/components/chat-bubble.js.map +1 -1
  70. package/dist/components/chat-composer.d.ts +21 -3
  71. package/dist/components/chat-composer.js +126 -60
  72. package/dist/components/chat-composer.js.map +1 -1
  73. package/dist/components/chat-header.js +6 -6
  74. package/dist/components/chat-header.js.map +1 -1
  75. package/dist/components/chat-inbox.js +34 -30
  76. package/dist/components/chat-inbox.js.map +1 -1
  77. package/dist/components/chat-markdown.d.ts +8 -0
  78. package/dist/components/chat-markdown.js +122 -0
  79. package/dist/components/chat-markdown.js.map +1 -0
  80. package/dist/components/chat-message.d.ts +26 -0
  81. package/dist/components/chat-message.js +145 -0
  82. package/dist/components/chat-message.js.map +1 -0
  83. package/dist/components/checkbox.js +11 -11
  84. package/dist/components/checkbox.js.map +1 -1
  85. package/dist/components/clipboard-text.js +3 -3
  86. package/dist/components/clipboard-text.js.map +1 -1
  87. package/dist/components/code.d.ts +22 -20
  88. package/dist/components/code.js +94 -32
  89. package/dist/components/code.js.map +1 -1
  90. package/dist/components/collapsible.js +8 -4
  91. package/dist/components/collapsible.js.map +1 -1
  92. package/dist/components/command-palette.js +73 -47
  93. package/dist/components/command-palette.js.map +1 -1
  94. package/dist/components/context-cards.d.ts +15 -0
  95. package/dist/components/context-cards.js +148 -0
  96. package/dist/components/context-cards.js.map +1 -0
  97. package/dist/components/context-menu.d.ts +1 -1
  98. package/dist/components/context-menu.js +18 -14
  99. package/dist/components/context-menu.js.map +1 -1
  100. package/dist/components/data-table.d.ts +8 -2
  101. package/dist/components/data-table.js +161 -106
  102. package/dist/components/data-table.js.map +1 -1
  103. package/dist/components/date-picker.js +13 -13
  104. package/dist/components/date-picker.js.map +1 -1
  105. package/dist/components/delete-resource.js +1 -1
  106. package/dist/components/delete-resource.js.map +1 -1
  107. package/dist/components/description-list.js +3 -3
  108. package/dist/components/description-list.js.map +1 -1
  109. package/dist/components/dialog.d.ts +2 -2
  110. package/dist/components/dialog.js +8 -8
  111. package/dist/components/dialog.js.map +1 -1
  112. package/dist/components/diff-table.d.ts +15 -0
  113. package/dist/components/diff-table.js +146 -0
  114. package/dist/components/diff-table.js.map +1 -0
  115. package/dist/components/dock.js +2 -2
  116. package/dist/components/dock.js.map +1 -1
  117. package/dist/components/dropdown-menu.js +23 -18
  118. package/dist/components/dropdown-menu.js.map +1 -1
  119. package/dist/components/editable-nav-item.js +63 -58
  120. package/dist/components/editable-nav-item.js.map +1 -1
  121. package/dist/components/empty.js +6 -6
  122. package/dist/components/empty.js.map +1 -1
  123. package/dist/components/fab.js +1 -1
  124. package/dist/components/fab.js.map +1 -1
  125. package/dist/components/field.js +3 -3
  126. package/dist/components/field.js.map +1 -1
  127. package/dist/components/file-dropzone.js +7 -7
  128. package/dist/components/file-dropzone.js.map +1 -1
  129. package/dist/components/filter-bar.js +6 -6
  130. package/dist/components/filter-bar.js.map +1 -1
  131. package/dist/components/flow.js +4 -3
  132. package/dist/components/flow.js.map +1 -1
  133. package/dist/components/grid.d.ts +3 -1
  134. package/dist/components/grid.js +15 -8
  135. package/dist/components/grid.js.map +1 -1
  136. package/dist/components/hover-card.js +1 -1
  137. package/dist/components/hover-card.js.map +1 -1
  138. package/dist/components/icon-picker.d.ts +8 -2
  139. package/dist/components/icon-picker.js +75 -47
  140. package/dist/components/icon-picker.js.map +1 -1
  141. package/dist/components/inline-editable.js +6 -6
  142. package/dist/components/inline-editable.js.map +1 -1
  143. package/dist/components/input-area.js +3 -3
  144. package/dist/components/input-area.js.map +1 -1
  145. package/dist/components/input-group.js +5 -5
  146. package/dist/components/input-group.js.map +1 -1
  147. package/dist/components/input.js +4 -4
  148. package/dist/components/input.js.map +1 -1
  149. package/dist/components/label.js +3 -3
  150. package/dist/components/label.js.map +1 -1
  151. package/dist/components/layer-card.d.ts +9 -4
  152. package/dist/components/layer-card.js +72 -67
  153. package/dist/components/layer-card.js.map +1 -1
  154. package/dist/components/loader.d.ts +16 -10
  155. package/dist/components/loader.js +46 -53
  156. package/dist/components/loader.js.map +1 -1
  157. package/dist/components/loading-screen.js +3 -3
  158. package/dist/components/loading-screen.js.map +1 -1
  159. package/dist/components/menu-bar.js +32 -27
  160. package/dist/components/menu-bar.js.map +1 -1
  161. package/dist/components/meter.d.ts +5 -5
  162. package/dist/components/meter.js +25 -12
  163. package/dist/components/meter.js.map +1 -1
  164. package/dist/components/multi-select.js +66 -62
  165. package/dist/components/multi-select.js.map +1 -1
  166. package/dist/components/navigation-menu.d.ts +2 -2
  167. package/dist/components/navigation-menu.js +22 -8
  168. package/dist/components/navigation-menu.js.map +1 -1
  169. package/dist/components/overlay.js +2 -2
  170. package/dist/components/overlay.js.map +1 -1
  171. package/dist/components/page-header.d.ts +3 -1
  172. package/dist/components/page-header.js +12 -12
  173. package/dist/components/page-header.js.map +1 -1
  174. package/dist/components/pagination.js +3 -3
  175. package/dist/components/pagination.js.map +1 -1
  176. package/dist/components/popover.js +18 -23
  177. package/dist/components/popover.js.map +1 -1
  178. package/dist/components/prompt-bar.d.ts +16 -0
  179. package/dist/components/prompt-bar.js +49 -0
  180. package/dist/components/prompt-bar.js.map +1 -0
  181. package/dist/components/radio.js +9 -9
  182. package/dist/components/radio.js.map +1 -1
  183. package/dist/components/recommendation-card.d.ts +13 -0
  184. package/dist/components/recommendation-card.js +123 -0
  185. package/dist/components/recommendation-card.js.map +1 -0
  186. package/dist/components/resource-list.js +1 -1
  187. package/dist/components/resource-list.js.map +1 -1
  188. package/dist/components/responsive-master-detail.js +4 -4
  189. package/dist/components/responsive-master-detail.js.map +1 -1
  190. package/dist/components/scroll-area.js +3 -3
  191. package/dist/components/scroll-area.js.map +1 -1
  192. package/dist/components/section-rule.d.ts +5 -3
  193. package/dist/components/section-rule.js +12 -12
  194. package/dist/components/section-rule.js.map +1 -1
  195. package/dist/components/segment-control.js +3 -3
  196. package/dist/components/segment-control.js.map +1 -1
  197. package/dist/components/select.js +47 -32
  198. package/dist/components/select.js.map +1 -1
  199. package/dist/components/sensitive-input.js +17 -19
  200. package/dist/components/sensitive-input.js.map +1 -1
  201. package/dist/components/sheet.d.ts +4 -4
  202. package/dist/components/sheet.js +11 -10
  203. package/dist/components/sheet.js.map +1 -1
  204. package/dist/components/sidebar.js +146 -137
  205. package/dist/components/sidebar.js.map +1 -1
  206. package/dist/components/skeleton-line.d.ts +1 -1
  207. package/dist/components/skeleton-line.js +2 -2
  208. package/dist/components/skeleton-line.js.map +1 -1
  209. package/dist/components/slider.js +2 -2
  210. package/dist/components/slider.js.map +1 -1
  211. package/dist/components/stat-strip.js +5 -4
  212. package/dist/components/stat-strip.js.map +1 -1
  213. package/dist/components/switch.js +6 -6
  214. package/dist/components/switch.js.map +1 -1
  215. package/dist/components/table-of-contents.js +5 -5
  216. package/dist/components/table-of-contents.js.map +1 -1
  217. package/dist/components/table-pager.js +2 -2
  218. package/dist/components/table-pager.js.map +1 -1
  219. package/dist/components/table.js +4 -4
  220. package/dist/components/table.js.map +1 -1
  221. package/dist/components/tabs.js +7 -6
  222. package/dist/components/tabs.js.map +1 -1
  223. package/dist/components/tag-badge.d.ts +10 -10
  224. package/dist/components/tag-badge.js +11 -11
  225. package/dist/components/tag-badge.js.map +1 -1
  226. package/dist/components/tag-color-picker.d.ts +8 -1
  227. package/dist/components/tag-color-picker.js +33 -25
  228. package/dist/components/tag-color-picker.js.map +1 -1
  229. package/dist/components/text.js +5 -5
  230. package/dist/components/text.js.map +1 -1
  231. package/dist/components/theme-toggle.js +1 -1
  232. package/dist/components/theme-toggle.js.map +1 -1
  233. package/dist/components/thinking.d.ts +16 -0
  234. package/dist/components/thinking.js +85 -0
  235. package/dist/components/thinking.js.map +1 -0
  236. package/dist/components/toast.js +25 -20
  237. package/dist/components/toast.js.map +1 -1
  238. package/dist/components/toggle-group.js +6 -5
  239. package/dist/components/toggle-group.js.map +1 -1
  240. package/dist/components/toggle.js +6 -6
  241. package/dist/components/toggle.js.map +1 -1
  242. package/dist/components/tool-chips.d.ts +12 -0
  243. package/dist/components/tool-chips.js +138 -0
  244. package/dist/components/tool-chips.js.map +1 -0
  245. package/dist/components/toolbar.js +3 -3
  246. package/dist/components/toolbar.js.map +1 -1
  247. package/dist/components/tooltip.js +1 -1
  248. package/dist/components/tooltip.js.map +1 -1
  249. package/dist/components/typeahead-field.js +59 -56
  250. package/dist/components/typeahead-field.js.map +1 -1
  251. package/dist/components/upload-queue.js +15 -14
  252. package/dist/components/upload-queue.js.map +1 -1
  253. package/dist/models/agent-feedback.d.ts +44 -0
  254. package/dist/models/agent-feedback.js +28 -0
  255. package/dist/models/agent-feedback.js.map +1 -0
  256. package/dist/models/avatar.d.ts +2 -0
  257. package/dist/models/avatar.js +15 -0
  258. package/dist/models/avatar.js.map +1 -0
  259. package/dist/models/code.d.ts +6 -0
  260. package/dist/models/code.js +24 -0
  261. package/dist/models/code.js.map +1 -0
  262. package/dist/models/context-cards.d.ts +13 -0
  263. package/dist/models/context-cards.js +17 -0
  264. package/dist/models/context-cards.js.map +1 -0
  265. package/dist/models/diff-table.d.ts +12 -0
  266. package/dist/models/diff-table.js +9 -0
  267. package/dist/models/diff-table.js.map +1 -0
  268. package/dist/models/recommendation.d.ts +26 -0
  269. package/dist/models/recommendation.js +23 -0
  270. package/dist/models/recommendation.js.map +1 -0
  271. package/dist/styles/base.css +14 -2
  272. package/dist/styles/standalone.css +1865 -929
  273. package/dist/styles/tailwind.css +179 -13
  274. package/dist/styles/tokens.css +679 -20
  275. package/dist/utils/cn.js +25 -4
  276. package/dist/utils/cn.js.map +1 -1
  277. package/dist/utils/control-surface.d.ts +1 -1
  278. package/dist/utils/control-surface.js +1 -1
  279. package/dist/utils/control-surface.js.map +1 -1
  280. package/dist/utils/navigation.d.ts +3 -0
  281. package/dist/utils/navigation.js +8 -0
  282. package/dist/utils/navigation.js.map +1 -0
  283. package/dist/utils/selection-indicator.d.ts +1 -1
  284. package/dist/utils/selection-indicator.js +49 -72
  285. package/dist/utils/selection-indicator.js.map +1 -1
  286. package/dist/utils/use-hover-highlight.d.ts +4 -0
  287. package/dist/utils/use-hover-highlight.js +80 -0
  288. package/dist/utils/use-hover-highlight.js.map +1 -0
  289. package/dist/viewmodels/use-approval-card.d.ts +20 -0
  290. package/dist/viewmodels/use-approval-card.js +83 -0
  291. package/dist/viewmodels/use-approval-card.js.map +1 -0
  292. package/dist/viewmodels/use-chat-composer.d.ts +16 -0
  293. package/dist/viewmodels/use-chat-composer.js +34 -0
  294. package/dist/viewmodels/use-chat-composer.js.map +1 -0
  295. package/dist/viewmodels/use-chat-message.d.ts +16 -0
  296. package/dist/viewmodels/use-chat-message.js +26 -0
  297. package/dist/viewmodels/use-chat-message.js.map +1 -0
  298. package/dist/viewmodels/use-code-block.d.ts +8 -0
  299. package/dist/viewmodels/use-code-block.js +38 -0
  300. package/dist/viewmodels/use-code-block.js.map +1 -0
  301. package/dist/viewmodels/use-context-cards.d.ts +17 -0
  302. package/dist/viewmodels/use-context-cards.js +18 -0
  303. package/dist/viewmodels/use-context-cards.js.map +1 -0
  304. package/dist/viewmodels/use-diff-table.d.ts +16 -0
  305. package/dist/viewmodels/use-diff-table.js +42 -0
  306. package/dist/viewmodels/use-diff-table.js.map +1 -0
  307. package/dist/viewmodels/use-loader.d.ts +4 -0
  308. package/dist/viewmodels/use-loader.js +22 -0
  309. package/dist/viewmodels/use-loader.js.map +1 -0
  310. package/dist/viewmodels/use-recommendation-card.d.ts +17 -0
  311. package/dist/viewmodels/use-recommendation-card.js +41 -0
  312. package/dist/viewmodels/use-recommendation-card.js.map +1 -0
  313. package/dist/viewmodels/use-thinking.d.ts +13 -0
  314. package/dist/viewmodels/use-thinking.js +18 -0
  315. package/dist/viewmodels/use-thinking.js.map +1 -0
  316. package/dist/viewmodels/use-tool-chips.d.ts +10 -0
  317. package/dist/viewmodels/use-tool-chips.js +20 -0
  318. package/dist/viewmodels/use-tool-chips.js.map +1 -0
  319. package/package.json +3 -1
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { contextSourceHref as e } from "../models/context-cards.js";
3
+ import { useState as t } from "react";
4
+ //#region src/viewmodels/use-chat-message.ts
5
+ function n(n, r) {
6
+ let [i, a] = t(null), [o, s] = t(null);
7
+ return {
8
+ copied: i === n,
9
+ copyError: o === n,
10
+ sources: r.map((t) => ({
11
+ ...t,
12
+ href: e(t.href)
13
+ })),
14
+ async copy(e) {
15
+ try {
16
+ await e(n), a(n), s(null);
17
+ } catch {
18
+ s(n);
19
+ }
20
+ }
21
+ };
22
+ }
23
+ //#endregion
24
+ export { n as useChatMessage };
25
+
26
+ //# sourceMappingURL=use-chat-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-chat-message.js","names":["useChatMessage","copied","setCopied","useState","copyError","setCopyError","content","sources","source","contextSourceHref","write"],"sources":["../../src/viewmodels/use-chat-message.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { contextSourceHref } from \"../models/context-cards\";\n\nexport function useChatMessage(\n\tcontent: string,\n\tsources: readonly { id: string; name: string; type?: string; href?: string }[],\n) {\n\tconst [copied, setCopied] = useState<string | null>(null);\n\tconst [copyError, setCopyError] = useState<string | null>(null);\n\treturn {\n\t\tcopied: copied === content,\n\t\tcopyError: copyError === content,\n\t\tsources: sources.map((source) => ({ ...source, href: contextSourceHref(source.href) })),\n\t\tasync copy(write: (text: string) => Promise<void>) {\n\t\t\ttry {\n\t\t\t\tawait write(content);\n\t\t\t\tsetCopied(content);\n\t\t\t\tsetCopyError(null);\n\t\t\t} catch {\n\t\t\t\tsetCopyError(content);\n\t\t\t}\n\t\t},\n\t};\n}\n"],"mappings":";;;;AAGA,SAAgBA,EACf,GACA,GACC;CACD,IAAM,CAACC,GAAQC,KAAaC,EAAwB,IAAI,GAClD,CAACC,GAAWC,KAAgBF,EAAwB,IAAI;CAC9D,OAAO;EACN,QAAQF,MAAWK;EACnB,WAAWF,MAAcE;EACzB,SAASC,EAAQ,KAAK,OAAY;GAAE,GAAGC;GAAQ,MAAMC,EAAkBD,EAAO,IAAI;EAAE,EAAE;EACtF,MAAM,KAAK,GAAwC;GAClD,IAAI;IAGH,AAFA,MAAME,EAAMJ,CAAO,GACnBJ,EAAUI,CAAO,GACjBD,EAAa,IAAI;GAClB,QAAQ;IACP,EAAaC,CAAO;GACrB;EACD;CACD;AACD"}
@@ -0,0 +1,8 @@
1
+ export declare function useCodeBlock(code: string, highlighted: boolean): {
2
+ lines: {
3
+ text: string;
4
+ className?: string;
5
+ }[][];
6
+ status: string;
7
+ copy(write: (text: string) => Promise<void>): Promise<void>;
8
+ };
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import { codeLines as e } from "../models/code.js";
3
+ import { useEffect as t, useMemo as n, useRef as r, useState as i } from "react";
4
+ //#region src/viewmodels/use-code-block.ts
5
+ function a(a, o) {
6
+ let s = n(() => e(a, o), [a, o]), [c, l] = i(null), u = r(!1), d = r(!0);
7
+ return t(() => (d.current = !0, () => {
8
+ d.current = !1;
9
+ }), []), {
10
+ lines: s,
11
+ status: c?.code === a ? c.status : "idle",
12
+ async copy(e) {
13
+ if (!u.current) {
14
+ u.current = !0, l({
15
+ code: a,
16
+ status: "pending"
17
+ });
18
+ try {
19
+ await e(a), d.current && l({
20
+ code: a,
21
+ status: "copied"
22
+ });
23
+ } catch {
24
+ d.current && l({
25
+ code: a,
26
+ status: "error"
27
+ });
28
+ } finally {
29
+ u.current = !1;
30
+ }
31
+ }
32
+ }
33
+ };
34
+ }
35
+ //#endregion
36
+ export { a as useCodeBlock };
37
+
38
+ //# sourceMappingURL=use-code-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-code-block.js","names":["useCodeBlock","lines","useMemo","codeLines","code","highlighted","feedback","setFeedback","useState","locked","useRef","mounted","useEffect","write"],"sources":["../../src/viewmodels/use-code-block.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { codeLines } from \"../models/code\";\n\nexport function useCodeBlock(code: string, highlighted: boolean) {\n\tconst lines = useMemo(() => codeLines(code, highlighted), [code, highlighted]);\n\tconst [feedback, setFeedback] = useState<{\n\t\tcode: string;\n\t\tstatus: \"pending\" | \"copied\" | \"error\";\n\t} | null>(null);\n\tconst locked = useRef(false);\n\tconst mounted = useRef(true);\n\tuseEffect(() => {\n\t\tmounted.current = true;\n\t\treturn () => {\n\t\t\tmounted.current = false;\n\t\t};\n\t}, []);\n\treturn {\n\t\tlines,\n\t\tstatus: feedback?.code === code ? feedback.status : \"idle\",\n\t\tasync copy(write: (text: string) => Promise<void>) {\n\t\t\tif (locked.current) return;\n\t\t\tlocked.current = true;\n\t\t\tsetFeedback({ code, status: \"pending\" });\n\t\t\ttry {\n\t\t\t\tawait write(code);\n\t\t\t\tif (mounted.current) setFeedback({ code, status: \"copied\" });\n\t\t\t} catch {\n\t\t\t\tif (mounted.current) setFeedback({ code, status: \"error\" });\n\t\t\t} finally {\n\t\t\t\tlocked.current = false;\n\t\t\t}\n\t\t},\n\t};\n}\n"],"mappings":";;;;AAGA,SAAgBA,EAAa,GAAc,GAAsB;CAChE,IAAMC,IAAQC,QAAcC,EAAUC,GAAMC,CAAW,GAAG,CAACD,GAAMC,CAAW,CAAC,GACvE,CAACC,GAAUC,KAAeC,EAGtB,IAAI,GACRC,IAASC,EAAO,EAAK,GACrBC,IAAUD,EAAO,EAAI;CAO3B,OANAE,SACC,EAAQ,UAAU,UACL;EACZ,EAAQ,UAAU;CACnB,IACE,CAAC,CAAC,GACE;EACN;EACA,QAAQN,GAAU,SAASF,IAAOE,EAAS,SAAS;EACpD,MAAM,KAAK,GAAwC;GAClD,IAAI,GAAO,SAEX;IADA,EAAO,UAAU,IACjBC,EAAY;KAAE;KAAM,QAAQ;IAAU,CAAC;IACvC,IAAI;KAEH,AADA,MAAMM,EAAMT,CAAI,GACZO,EAAQ,WAASJ,EAAY;MAAE;MAAM,QAAQ;KAAS,CAAC;IAC5D,QAAQ;KACP,AAAII,EAAQ,WAASJ,EAAY;MAAE;MAAM,QAAQ;KAAQ,CAAC;IAC3D,UAAU;KACT,EAAO,UAAU;IAClB;GARuC;EASxC;CACD;AACD"}
@@ -0,0 +1,17 @@
1
+ import { type ContextChunk } from "../models/context-cards.js";
2
+ export declare function useContextCardsViewModel(chunks: readonly ContextChunk[], totalCount?: number): {
3
+ count: number;
4
+ chunks: {
5
+ id: string;
6
+ title: string;
7
+ body: string;
8
+ source: {
9
+ name: string;
10
+ type: string;
11
+ href?: string;
12
+ };
13
+ characters: number;
14
+ href: string | undefined;
15
+ delay: number;
16
+ }[];
17
+ };
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { contextSourceHref as e } from "../models/context-cards.js";
3
+ //#region src/viewmodels/use-context-cards.ts
4
+ function t(t, n) {
5
+ return {
6
+ count: n !== void 0 && Number.isFinite(n) ? Math.max(t.length, Math.floor(n)) : t.length,
7
+ chunks: t.map((t, n) => ({
8
+ ...t,
9
+ characters: t.characters !== void 0 && Number.isFinite(t.characters) ? Math.max(0, Math.floor(t.characters)) : Array.from(t.body).length,
10
+ href: e(t.source.href),
11
+ delay: Math.min(n, 4) * 60
12
+ }))
13
+ };
14
+ }
15
+ //#endregion
16
+ export { t as useContextCardsViewModel };
17
+
18
+ //# sourceMappingURL=use-context-cards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-context-cards.js","names":["useContextCardsViewModel","totalCount","chunks","chunk","contextSourceHref","index"],"sources":["../../src/viewmodels/use-context-cards.ts"],"sourcesContent":["import { type ContextChunk, contextSourceHref } from \"../models/context-cards\";\n\nexport function useContextCardsViewModel(chunks: readonly ContextChunk[], totalCount?: number) {\n\treturn {\n\t\tcount:\n\t\t\ttotalCount !== undefined && Number.isFinite(totalCount)\n\t\t\t\t? Math.max(chunks.length, Math.floor(totalCount))\n\t\t\t\t: chunks.length,\n\t\tchunks: chunks.map((chunk, index) => ({\n\t\t\t...chunk,\n\t\t\tcharacters:\n\t\t\t\tchunk.characters !== undefined && Number.isFinite(chunk.characters)\n\t\t\t\t\t? Math.max(0, Math.floor(chunk.characters))\n\t\t\t\t\t: Array.from(chunk.body).length,\n\t\t\thref: contextSourceHref(chunk.source.href),\n\t\t\tdelay: Math.min(index, 4) * 60,\n\t\t})),\n\t};\n}\n"],"mappings":";;;AAEA,SAAgBA,EAAyB,GAAiC,GAAqB;CAC9F,OAAO;EACN,OACCC,MAAe,KAAA,KAAa,OAAO,SAASA,CAAU,IACnD,KAAK,IAAIC,EAAO,QAAQ,KAAK,MAAMD,CAAU,CAAC,IAC9CC,EAAO;EACX,QAAQA,EAAO,KAAK,GAAO,OAAW;GACrC,GAAGC;GACH,YACCA,EAAM,eAAe,KAAA,KAAa,OAAO,SAASA,EAAM,UAAU,IAC/D,KAAK,IAAI,GAAG,KAAK,MAAMA,EAAM,UAAU,CAAC,IACxC,MAAM,KAAKA,EAAM,IAAI,CAAC,CAAC;GAC3B,MAAMC,EAAkBD,EAAM,OAAO,IAAI;GACzC,OAAO,KAAK,IAAIE,GAAO,CAAC,IAAI;EAC7B,EAAE;CACH;AACD"}
@@ -0,0 +1,16 @@
1
+ import { type DiffTableRow } from "../models/diff-table.js";
2
+ export declare function useDiffTableViewModel({ rows, onApply, disabled, }: {
3
+ rows: readonly DiffTableRow[];
4
+ onApply: (changes: readonly DiffTableRow[]) => void | Promise<void>;
5
+ disabled?: boolean;
6
+ }): {
7
+ excluded: string[];
8
+ selected: DiffTableRow[];
9
+ status: "applied" | "applying" | "editing";
10
+ error: string;
11
+ blocked: boolean;
12
+ additions: number;
13
+ removals: number;
14
+ toggle(id: string): void;
15
+ apply(): Promise<void>;
16
+ };
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { selectedDiffRows as e } from "../models/diff-table.js";
3
+ import { useEffect as t, useRef as n, useState as r } from "react";
4
+ //#region src/viewmodels/use-diff-table.ts
5
+ function i({ rows: i, onApply: a, disabled: o = !1 }) {
6
+ let [s, c] = r([]), [l, u] = r("editing"), [d, f] = r(""), p = n(!1), m = n(!0);
7
+ t(() => (m.current = !0, () => {
8
+ m.current = !1;
9
+ }), []);
10
+ let h = e(i, s);
11
+ return {
12
+ excluded: s,
13
+ selected: h,
14
+ status: l,
15
+ error: d,
16
+ blocked: o || l !== "editing",
17
+ additions: h.filter((e) => e.change === "add").length,
18
+ removals: h.filter((e) => e.change === "remove").length,
19
+ toggle(e) {
20
+ o || p.current || l === "applied" || !i.some((t) => t.id === e && t.change !== "unchanged") || (c((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]), f(""));
21
+ },
22
+ async apply() {
23
+ if (!(o || p.current || l === "applied" || h.length === 0)) {
24
+ p.current = !0, u("applying"), f("");
25
+ try {
26
+ await a(h.map((e) => ({
27
+ ...e,
28
+ values: { ...e.values }
29
+ }))), m.current && u("applied");
30
+ } catch (e) {
31
+ m.current && (f(e instanceof Error ? e.message : "Could not apply changes. Try again."), u("editing"));
32
+ } finally {
33
+ p.current = !1;
34
+ }
35
+ }
36
+ }
37
+ };
38
+ }
39
+ //#endregion
40
+ export { i as useDiffTableViewModel };
41
+
42
+ //# sourceMappingURL=use-diff-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-diff-table.js","names":["useDiffTableViewModel","excluded","setExcluded","useState","status","setStatus","error","setError","locked","useRef","mounted","selected","selectedDiffRows","rows","disabled","row","id","current","value","onApply","reason"],"sources":["../../src/viewmodels/use-diff-table.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { type DiffTableRow, selectedDiffRows } from \"../models/diff-table\";\n\nexport function useDiffTableViewModel({\n\trows,\n\tonApply,\n\tdisabled = false,\n}: {\n\trows: readonly DiffTableRow[];\n\tonApply: (changes: readonly DiffTableRow[]) => void | Promise<void>;\n\tdisabled?: boolean;\n}) {\n\tconst [excluded, setExcluded] = useState<string[]>([]);\n\tconst [status, setStatus] = useState<\"editing\" | \"applying\" | \"applied\">(\"editing\");\n\tconst [error, setError] = useState(\"\");\n\tconst locked = useRef(false);\n\tconst mounted = useRef(true);\n\tuseEffect(() => {\n\t\tmounted.current = true;\n\t\treturn () => {\n\t\t\tmounted.current = false;\n\t\t};\n\t}, []);\n\tconst selected = selectedDiffRows(rows, excluded);\n\treturn {\n\t\texcluded,\n\t\tselected,\n\t\tstatus,\n\t\terror,\n\t\tblocked: disabled || status !== \"editing\",\n\t\tadditions: selected.filter((row) => row.change === \"add\").length,\n\t\tremovals: selected.filter((row) => row.change === \"remove\").length,\n\t\ttoggle(id: string) {\n\t\t\tif (\n\t\t\t\tdisabled ||\n\t\t\t\tlocked.current ||\n\t\t\t\tstatus === \"applied\" ||\n\t\t\t\t!rows.some((row) => row.id === id && row.change !== \"unchanged\")\n\t\t\t)\n\t\t\t\treturn;\n\t\t\tsetExcluded((current) =>\n\t\t\t\tcurrent.includes(id) ? current.filter((value) => value !== id) : [...current, id],\n\t\t\t);\n\t\t\tsetError(\"\");\n\t\t},\n\t\tasync apply() {\n\t\t\tif (disabled || locked.current || status === \"applied\" || selected.length === 0) return;\n\t\t\tlocked.current = true;\n\t\t\tsetStatus(\"applying\");\n\t\t\tsetError(\"\");\n\t\t\ttry {\n\t\t\t\tawait onApply(selected.map((row) => ({ ...row, values: { ...row.values } })));\n\t\t\t\tif (mounted.current) setStatus(\"applied\");\n\t\t\t} catch (reason) {\n\t\t\t\tif (mounted.current) {\n\t\t\t\t\tsetError(\n\t\t\t\t\t\treason instanceof Error ? reason.message : \"Could not apply changes. Try again.\",\n\t\t\t\t\t);\n\t\t\t\t\tsetStatus(\"editing\");\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tlocked.current = false;\n\t\t\t}\n\t\t},\n\t};\n}\n"],"mappings":";;;;AAGA,SAAgBA,EAAsB,EACrC,SACA,YACA,cAAW,MAKT;CACF,IAAM,CAACC,GAAUC,KAAeC,EAAmB,CAAC,CAAC,GAC/C,CAACC,GAAQC,KAAaF,EAA6C,SAAS,GAC5E,CAACG,GAAOC,KAAYJ,EAAS,EAAE,GAC/BK,IAASC,EAAO,EAAK,GACrBC,IAAUD,EAAO,EAAI;CAC3B,SACC,EAAQ,UAAU,UACL;EACZ,EAAQ,UAAU;CACnB,IACE,CAAC,CAAC;CACL,IAAME,IAAWC,EAAiBC,GAAMZ,CAAQ;CAChD,OAAO;EACN;EACA;EACA;EACA;EACA,SAASa,KAAYV,MAAW;EAChC,WAAWO,EAAS,QAAQ,MAAQI,EAAI,WAAW,KAAK,CAAC,CAAC;EAC1D,UAAUJ,EAAS,QAAQ,MAAQI,EAAI,WAAW,QAAQ,CAAC,CAAC;EAC5D,OAAO,GAAY;GAClB,AACCD,KACAN,EAAO,WACPJ,MAAW,aACX,CAACS,EAAK,MAAM,MAAQE,EAAI,OAAOC,KAAMD,EAAI,WAAW,WAAW,MAGhEb,GAAa,MACZe,EAAQ,SAASD,CAAE,IAAIC,EAAQ,QAAQ,MAAUC,MAAUF,CAAE,IAAI,CAAC,GAAGC,GAASD,CAAE,CACjF,GACAT,EAAS,EAAE;EACZ;EACA,MAAM,QAAQ;GACb,IAAI,OAAYC,EAAO,WAAWJ,MAAW,aAAaO,EAAS,WAAW,IAG9E;IAFA,EAAO,UAAU,IACjBN,EAAU,UAAU,GACpBE,EAAS,EAAE;IACX,IAAI;KAEH,AADA,MAAMY,EAAQR,EAAS,KAAK,OAAS;MAAE,GAAGI;MAAK,QAAQ,EAAE,GAAGA,EAAI,OAAO;KAAE,EAAE,CAAC,GACxEL,EAAQ,WAASL,EAAU,SAAS;IACzC,SAASe,GAAQ;KAChB,AAAIV,EAAQ,YACXH,EACCa,aAAkB,QAAQA,EAAO,UAAU,qCAC5C,GACAf,EAAU,SAAS;IAErB,UAAU;KACT,EAAO,UAAU;IAClB;GAbW;EAcZ;CACD;AACD"}
@@ -0,0 +1,4 @@
1
+ export declare function useLoaderViewModel(showElapsed: boolean, elapsedDelayMs: number): {
2
+ visible: boolean;
3
+ text: string;
4
+ };
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { useEffect as e, useRef as t, useState as n } from "react";
3
+ //#region src/viewmodels/use-loader.ts
4
+ function r(r, i) {
5
+ let a = t(performance.now()), [o, s] = n(0);
6
+ e(() => {
7
+ if (!r) return;
8
+ let e = () => s(Math.max(0, performance.now() - a.current));
9
+ e();
10
+ let t = setInterval(e, 100);
11
+ return () => clearInterval(t);
12
+ }, [r]);
13
+ let c = Number.isFinite(i) ? Math.max(0, i) : 5e3, l = Math.floor(o / 100) / 10;
14
+ return {
15
+ visible: r && o >= c,
16
+ text: l < 60 ? `${l.toFixed(1)}s` : `${Math.floor(l / 60)}m ${(l % 60).toFixed(1)}s`
17
+ };
18
+ }
19
+ //#endregion
20
+ export { r as useLoaderViewModel };
21
+
22
+ //# sourceMappingURL=use-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-loader.js","names":["useLoaderViewModel","started","useRef","elapsed","setElapsed","useState","showElapsed","update","timer","delay","elapsedDelayMs","seconds"],"sources":["../../src/viewmodels/use-loader.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\nexport function useLoaderViewModel(showElapsed: boolean, elapsedDelayMs: number) {\n\tconst started = useRef(performance.now());\n\tconst [elapsed, setElapsed] = useState(0);\n\tuseEffect(() => {\n\t\tif (!showElapsed) return;\n\t\tconst update = () => setElapsed(Math.max(0, performance.now() - started.current));\n\t\tupdate();\n\t\tconst timer = setInterval(update, 100);\n\t\treturn () => clearInterval(timer);\n\t}, [showElapsed]);\n\tconst delay = Number.isFinite(elapsedDelayMs) ? Math.max(0, elapsedDelayMs) : 5000;\n\tconst seconds = Math.floor(elapsed / 100) / 10;\n\treturn {\n\t\tvisible: showElapsed && elapsed >= delay,\n\t\ttext:\n\t\t\tseconds < 60\n\t\t\t\t? `${seconds.toFixed(1)}s`\n\t\t\t\t: `${Math.floor(seconds / 60)}m ${(seconds % 60).toFixed(1)}s`,\n\t};\n}\n"],"mappings":";;;AAEA,SAAgBA,EAAmB,GAAsB,GAAwB;CAChF,IAAMC,IAAUC,EAAO,YAAY,IAAI,CAAC,GAClC,CAACC,GAASC,KAAcC,EAAS,CAAC;CACxC,QAAgB;EACf,IAAI,CAACC,GAAa;EAClB,IAAMC,UAAeH,EAAW,KAAK,IAAI,GAAG,YAAY,IAAI,IAAIH,EAAQ,OAAO,CAAC;EAChF,EAAO;EACP,IAAMO,IAAQ,YAAYD,GAAQ,GAAG;EACrC,aAAa,cAAcC,CAAK;CACjC,GAAG,CAACF,CAAW,CAAC;CAChB,IAAMG,IAAQ,OAAO,SAASC,CAAc,IAAI,KAAK,IAAI,GAAGA,CAAc,IAAI,KACxEC,IAAU,KAAK,MAAMR,IAAU,GAAG,IAAI;CAC5C,OAAO;EACN,SAASG,KAAeH,KAAWM;EACnC,MACCE,IAAU,KACP,GAAGA,EAAQ,QAAQ,CAAC,EAAE,KACtB,GAAG,KAAK,MAAMA,IAAU,EAAE,EAAE,KAAKA,IAAU,GAAA,CAAI,QAAQ,CAAC,EAAE;CAC/D;AACD"}
@@ -0,0 +1,17 @@
1
+ import type { RecommendationOption } from "../models/recommendation.js";
2
+ export declare function useRecommendationCardViewModel({ options, onAccept, disabled, }: {
3
+ options: readonly RecommendationOption[];
4
+ onAccept: (option: RecommendationOption) => void | Promise<void>;
5
+ disabled?: boolean;
6
+ }): {
7
+ active: RecommendationOption;
8
+ others: RecommendationOption[];
9
+ open: boolean;
10
+ pending: boolean;
11
+ error: string;
12
+ accepted: boolean;
13
+ blocked: boolean;
14
+ setOpen(next: boolean): void;
15
+ select(id: string): void;
16
+ accept(): Promise<void>;
17
+ };
@@ -0,0 +1,41 @@
1
+ "use client";
2
+ import { useEffect as e, useRef as t, useState as n } from "react";
3
+ //#region src/viewmodels/use-recommendation-card.ts
4
+ function r({ options: r, onAccept: i, disabled: a = !1 }) {
5
+ let [o, s] = n(), [c, l] = n(!1), [u, d] = n(!1), [f, p] = n(), [m, h] = n(""), g = t(!1), _ = t(!0);
6
+ e(() => (_.current = !0, () => {
7
+ _.current = !1;
8
+ }), []);
9
+ let v = r.find((e) => e.id === o) ?? r.find((e) => !e.disabled) ?? r[0];
10
+ return {
11
+ active: v,
12
+ others: r.filter((e) => e.id !== v?.id),
13
+ open: c,
14
+ pending: u,
15
+ error: m,
16
+ accepted: !!(v && f === v.id),
17
+ blocked: a || u,
18
+ setOpen(e) {
19
+ !a && !g.current && l(e);
20
+ },
21
+ select(e) {
22
+ a || g.current || !r.some((t) => t.id === e && !t.disabled) || (s(e), p(void 0), h(""));
23
+ },
24
+ async accept() {
25
+ if (!(!v || a || v.disabled || g.current || f === v.id)) {
26
+ g.current = !0, d(!0), h("");
27
+ try {
28
+ await i({ ...v }), _.current && p(v.id);
29
+ } catch (e) {
30
+ _.current && h(e instanceof Error ? e.message : "Could not accept recommendation. Try again.");
31
+ } finally {
32
+ g.current = !1, _.current && d(!1);
33
+ }
34
+ }
35
+ }
36
+ };
37
+ }
38
+ //#endregion
39
+ export { r as useRecommendationCardViewModel };
40
+
41
+ //# sourceMappingURL=use-recommendation-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-recommendation-card.js","names":["useRecommendationCardViewModel","selected","setSelected","useState","open","setOpen","pending","setPending","accepted","setAccepted","error","setError","lock","useRef","mounted","active","options","option","disabled","next","id","onAccept","reason"],"sources":["../../src/viewmodels/use-recommendation-card.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport type { RecommendationOption } from \"../models/recommendation\";\n\nexport function useRecommendationCardViewModel({\n\toptions,\n\tonAccept,\n\tdisabled = false,\n}: {\n\toptions: readonly RecommendationOption[];\n\tonAccept: (option: RecommendationOption) => void | Promise<void>;\n\tdisabled?: boolean;\n}) {\n\tconst [selected, setSelected] = useState<string>();\n\tconst [open, setOpen] = useState(false);\n\tconst [pending, setPending] = useState(false);\n\tconst [accepted, setAccepted] = useState<string>();\n\tconst [error, setError] = useState(\"\");\n\tconst lock = useRef(false);\n\tconst mounted = useRef(true);\n\tuseEffect(() => {\n\t\tmounted.current = true;\n\t\treturn () => {\n\t\t\tmounted.current = false;\n\t\t};\n\t}, []);\n\tconst active =\n\t\toptions.find((option) => option.id === selected) ??\n\t\toptions.find((option) => !option.disabled) ??\n\t\toptions[0];\n\tconst others = options.filter((option) => option.id !== active?.id);\n\treturn {\n\t\tactive,\n\t\tothers,\n\t\topen,\n\t\tpending,\n\t\terror,\n\t\taccepted: Boolean(active && accepted === active.id),\n\t\tblocked: disabled || pending,\n\t\tsetOpen(next: boolean) {\n\t\t\tif (!disabled && !lock.current) setOpen(next);\n\t\t},\n\t\tselect(id: string) {\n\t\t\tif (\n\t\t\t\tdisabled ||\n\t\t\t\tlock.current ||\n\t\t\t\t!options.some((option) => option.id === id && !option.disabled)\n\t\t\t)\n\t\t\t\treturn;\n\t\t\tsetSelected(id);\n\t\t\tsetAccepted(undefined);\n\t\t\tsetError(\"\");\n\t\t},\n\t\tasync accept() {\n\t\t\tif (!active || disabled || active.disabled || lock.current || accepted === active.id) return;\n\t\t\tlock.current = true;\n\t\t\tsetPending(true);\n\t\t\tsetError(\"\");\n\t\t\ttry {\n\t\t\t\tawait onAccept({ ...active });\n\t\t\t\tif (mounted.current) setAccepted(active.id);\n\t\t\t} catch (reason) {\n\t\t\t\tif (mounted.current)\n\t\t\t\t\tsetError(\n\t\t\t\t\t\treason instanceof Error\n\t\t\t\t\t\t\t? reason.message\n\t\t\t\t\t\t\t: \"Could not accept recommendation. Try again.\",\n\t\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tlock.current = false;\n\t\t\t\tif (mounted.current) setPending(false);\n\t\t\t}\n\t\t},\n\t};\n}\n"],"mappings":";;;AAGA,SAAgBA,EAA+B,EAC9C,YACA,aACA,cAAW,MAKT;CACF,IAAM,CAACC,GAAUC,KAAeC,EAAiB,GAC3C,CAACC,GAAMC,KAAWF,EAAS,EAAK,GAChC,CAACG,GAASC,KAAcJ,EAAS,EAAK,GACtC,CAACK,GAAUC,KAAeN,EAAiB,GAC3C,CAACO,GAAOC,KAAYR,EAAS,EAAE,GAC/BS,IAAOC,EAAO,EAAK,GACnBC,IAAUD,EAAO,EAAI;CAC3B,SACC,EAAQ,UAAU,UACL;EACZ,EAAQ,UAAU;CACnB,IACE,CAAC,CAAC;CACL,IAAME,IACLC,EAAQ,MAAM,MAAWC,EAAO,OAAOhB,CAAQ,KAC/Ce,EAAQ,MAAM,MAAW,CAACC,EAAO,QAAQ,KACzCD,EAAQ;CAET,OAAO;EACN;EACA,QAHcA,EAAQ,QAAQ,MAAWC,EAAO,OAAOF,GAAQ,EAG/D;EACA;EACA;EACA;EACA,UAAU,GAAQA,KAAUP,MAAaO,EAAO;EAChD,SAASG,KAAYZ;EACrB,QAAQ,GAAe;GACtB,AAAI,CAACY,KAAY,CAACN,EAAK,WAASP,EAAQc,CAAI;EAC7C;EACA,OAAO,GAAY;GAClB,AACCD,KACAN,EAAK,WACL,CAACI,EAAQ,MAAM,MAAWC,EAAO,OAAOG,KAAM,CAACH,EAAO,QAAQ,MAG/Df,EAAYkB,CAAE,GACdX,EAAY,KAAA,CAAS,GACrBE,EAAS,EAAE;EACZ;EACA,MAAM,SAAS;GACd,IAAI,GAACI,KAAUG,KAAYH,EAAO,YAAYH,EAAK,WAAWJ,MAAaO,EAAO,KAGlF;IAFA,EAAK,UAAU,IACfR,EAAW,EAAI,GACfI,EAAS,EAAE;IACX,IAAI;KAEH,AADA,MAAMU,EAAS,EAAE,GAAGN,EAAO,CAAC,GACxBD,EAAQ,WAASL,EAAYM,EAAO,EAAE;IAC3C,SAASO,GAAQ;KAChB,AAAIR,EAAQ,WACXH,EACCW,aAAkB,QACfA,EAAO,UACP,6CACJ;IACF,UAAU;KAET,AADA,EAAK,UAAU,IACXR,EAAQ,WAASP,EAAW,EAAK;IACtC;GAdW;EAeZ;CACD;AACD"}
@@ -0,0 +1,13 @@
1
+ import { type ThinkingStep } from "../models/agent-feedback.js";
2
+ export declare function useThinkingViewModel({ steps, open, defaultOpen, onOpenChange, }: {
3
+ steps: readonly ThinkingStep[];
4
+ open?: boolean;
5
+ defaultOpen?: boolean;
6
+ onOpenChange?: (open: boolean) => void;
7
+ }): {
8
+ completed: number;
9
+ total: number;
10
+ status: import("../models/agent-feedback.js").AgentStepStatus;
11
+ open: boolean;
12
+ setOpen(next: boolean): void;
13
+ };
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { summarizeSteps as e } from "../models/agent-feedback.js";
3
+ import { useState as t } from "react";
4
+ //#region src/viewmodels/use-thinking.ts
5
+ function n({ steps: n, open: r, defaultOpen: i = !0, onOpenChange: a }) {
6
+ let [o, s] = t(i);
7
+ return {
8
+ ...e(n),
9
+ open: r ?? o,
10
+ setOpen(e) {
11
+ s(e), a?.(e);
12
+ }
13
+ };
14
+ }
15
+ //#endregion
16
+ export { n as useThinkingViewModel };
17
+
18
+ //# sourceMappingURL=use-thinking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-thinking.js","names":["useThinkingViewModel","localOpen","setLocalOpen","useState","defaultOpen","summarizeSteps","steps","open","next","onOpenChange"],"sources":["../../src/viewmodels/use-thinking.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { summarizeSteps, type ThinkingStep } from \"../models/agent-feedback\";\n\nexport function useThinkingViewModel({\n\tsteps,\n\topen,\n\tdefaultOpen = true,\n\tonOpenChange,\n}: {\n\tsteps: readonly ThinkingStep[];\n\topen?: boolean;\n\tdefaultOpen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}) {\n\tconst [localOpen, setLocalOpen] = useState(defaultOpen);\n\treturn {\n\t\t...summarizeSteps(steps),\n\t\topen: open ?? localOpen,\n\t\tsetOpen(next: boolean) {\n\t\t\tsetLocalOpen(next);\n\t\t\tonOpenChange?.(next);\n\t\t},\n\t};\n}\n"],"mappings":";;;;AAGA,SAAgBA,EAAqB,EACpC,UACA,SACA,iBAAc,IACd,mBAME;CACF,IAAM,CAACC,GAAWC,KAAgBC,EAASC,CAAW;CACtD,OAAO;EACN,GAAGC,EAAeC,CAAK;EACvB,MAAMC,KAAQN;EACd,QAAQ,GAAe;GAEtB,AADAC,EAAaM,CAAI,GACjBC,IAAeD,CAAI;EACpB;CACD;AACD"}
@@ -0,0 +1,10 @@
1
+ import { type ToolStep } from "../models/agent-feedback.js";
2
+ export declare function useToolChipsViewModel(steps: readonly ToolStep[], defaultOpen: boolean): {
3
+ completed: number;
4
+ total: number;
5
+ status: import("../models/agent-feedback.js").AgentStepStatus;
6
+ open: boolean;
7
+ setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
8
+ expanded: string[];
9
+ setExpanded(id: string, next: boolean): void;
10
+ };
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { summarizeSteps as e } from "../models/agent-feedback.js";
3
+ import { useState as t } from "react";
4
+ //#region src/viewmodels/use-tool-chips.ts
5
+ function n(n, r) {
6
+ let [i, a] = t(r), [o, s] = t([]);
7
+ return {
8
+ ...e(n),
9
+ open: i,
10
+ setOpen: a,
11
+ expanded: o,
12
+ setExpanded(e, t) {
13
+ s((n) => t ? [.../* @__PURE__ */ new Set([...n, e])] : n.filter((t) => t !== e));
14
+ }
15
+ };
16
+ }
17
+ //#endregion
18
+ export { n as useToolChipsViewModel };
19
+
20
+ //# sourceMappingURL=use-tool-chips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tool-chips.js","names":["useToolChipsViewModel","open","setOpen","useState","defaultOpen","expanded","setExpanded","summarizeSteps","steps","next","current","id","value"],"sources":["../../src/viewmodels/use-tool-chips.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { summarizeSteps, type ToolStep } from \"../models/agent-feedback\";\n\nexport function useToolChipsViewModel(steps: readonly ToolStep[], defaultOpen: boolean) {\n\tconst [open, setOpen] = useState(defaultOpen);\n\tconst [expanded, setExpanded] = useState<string[]>([]);\n\treturn {\n\t\t...summarizeSteps(steps),\n\t\topen,\n\t\tsetOpen,\n\t\texpanded,\n\t\tsetExpanded(id: string, next: boolean) {\n\t\t\tsetExpanded((current) =>\n\t\t\t\tnext ? [...new Set([...current, id])] : current.filter((value) => value !== id),\n\t\t\t);\n\t\t},\n\t};\n}\n"],"mappings":";;;;AAGA,SAAgBA,EAAsB,GAA4B,GAAsB;CACvF,IAAM,CAACC,GAAMC,KAAWC,EAASC,CAAW,GACtC,CAACC,GAAUC,KAAeH,EAAmB,CAAC,CAAC;CACrD,OAAO;EACN,GAAGI,EAAeC,CAAK;EACvB;EACA;EACA;EACA,YAAY,GAAY,GAAe;GACtC,GAAa,MACZC,IAAO,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAGC,GAASC,CAAE,CAAC,CAAC,IAAID,EAAQ,QAAQ,MAAUE,MAAUD,CAAE,CAC/E;EACD;CACD;AACD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocoo/basalt",
3
- "version": "2.2.0",
3
+ "version": "3.0.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -80,6 +80,8 @@
80
80
  "class-variance-authority": "^0.7.1",
81
81
  "clsx": "^2.1.1",
82
82
  "cmdk": "^1.1.1",
83
+ "entities": "8.0.0",
84
+ "marked": "18.0.14",
83
85
  "sonner": "2.0.8",
84
86
  "tailwind-merge": "3.7.0"
85
87
  },