@nocoo/basalt 2.1.8 → 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 (352) 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 +239 -152
  5. package/ai/RECIPES.md +96 -26
  6. package/ai/USAGE.md +5 -5
  7. package/ai/registry.json +2883 -275
  8. package/dist/assets/brand-mark.js.map +1 -1
  9. package/dist/charts/area.js.map +1 -1
  10. package/dist/charts/bar.js.map +1 -1
  11. package/dist/charts/bullet.js.map +1 -1
  12. package/dist/charts/charts.js.map +1 -1
  13. package/dist/charts/config.d.ts +11 -11
  14. package/dist/charts/config.js +4 -4
  15. package/dist/charts/config.js.map +1 -1
  16. package/dist/charts/custom-chart.js.map +1 -1
  17. package/dist/charts/date-navigation.js +10 -10
  18. package/dist/charts/date-navigation.js.map +1 -1
  19. package/dist/charts/donut.js +1 -1
  20. package/dist/charts/donut.js.map +1 -1
  21. package/dist/charts/frame.d.ts +1 -1
  22. package/dist/charts/frame.js +4 -4
  23. package/dist/charts/frame.js.map +1 -1
  24. package/dist/charts/funnel.js.map +1 -1
  25. package/dist/charts/gauge.js +5 -5
  26. package/dist/charts/gauge.js.map +1 -1
  27. package/dist/charts/grouped-bar.js.map +1 -1
  28. package/dist/charts/heatmap-calendar.js +11 -11
  29. package/dist/charts/heatmap-calendar.js.map +1 -1
  30. package/dist/charts/heatmap-matrix.js +8 -8
  31. package/dist/charts/heatmap-matrix.js.map +1 -1
  32. package/dist/charts/item-list.js +1 -1
  33. package/dist/charts/item-list.js.map +1 -1
  34. package/dist/charts/legend.js +19 -19
  35. package/dist/charts/legend.js.map +1 -1
  36. package/dist/charts/line.js.map +1 -1
  37. package/dist/charts/palette.js +2 -2
  38. package/dist/charts/palette.js.map +1 -1
  39. package/dist/charts/radar.js.map +1 -1
  40. package/dist/charts/sample.js.map +1 -1
  41. package/dist/charts/sankey.js.map +1 -1
  42. package/dist/charts/series.js.map +1 -1
  43. package/dist/charts/slot-bar.js +2 -2
  44. package/dist/charts/slot-bar.js.map +1 -1
  45. package/dist/charts/sparkline.js +38 -23
  46. package/dist/charts/sparkline.js.map +1 -1
  47. package/dist/charts/stacked-bar.js.map +1 -1
  48. package/dist/charts/stat-card.d.ts +2 -2
  49. package/dist/charts/stat-card.js +61 -58
  50. package/dist/charts/stat-card.js.map +1 -1
  51. package/dist/charts/timeline.js +18 -9
  52. package/dist/charts/timeline.js.map +1 -1
  53. package/dist/charts/timeseries.js.map +1 -1
  54. package/dist/charts/tooltip.js +16 -16
  55. package/dist/charts/tooltip.js.map +1 -1
  56. package/dist/components/accordion.js +1 -1
  57. package/dist/components/accordion.js.map +1 -1
  58. package/dist/components/alert-dialog.js +4 -4
  59. package/dist/components/alert-dialog.js.map +1 -1
  60. package/dist/components/app-header.d.ts +5 -1
  61. package/dist/components/app-header.js +19 -11
  62. package/dist/components/app-header.js.map +1 -1
  63. package/dist/components/app-shell.d.ts +4 -1
  64. package/dist/components/app-shell.js +8 -5
  65. package/dist/components/app-shell.js.map +1 -1
  66. package/dist/components/approval-card.d.ts +13 -0
  67. package/dist/components/approval-card.js +161 -0
  68. package/dist/components/approval-card.js.map +1 -0
  69. package/dist/components/autocomplete.js.map +1 -1
  70. package/dist/components/avatar.d.ts +12 -0
  71. package/dist/components/avatar.js +39 -18
  72. package/dist/components/avatar.js.map +1 -1
  73. package/dist/components/badge.js +8 -8
  74. package/dist/components/badge.js.map +1 -1
  75. package/dist/components/banner.d.ts +2 -2
  76. package/dist/components/banner.js +9 -8
  77. package/dist/components/banner.js.map +1 -1
  78. package/dist/components/basalt-mark.js +1 -1
  79. package/dist/components/basalt-mark.js.map +1 -1
  80. package/dist/components/battery-meter.js +5 -5
  81. package/dist/components/battery-meter.js.map +1 -1
  82. package/dist/components/breadcrumbs.js +6 -6
  83. package/dist/components/breadcrumbs.js.map +1 -1
  84. package/dist/components/button.js +10 -10
  85. package/dist/components/button.js.map +1 -1
  86. package/dist/components/chat-bubble.js +4 -3
  87. package/dist/components/chat-bubble.js.map +1 -1
  88. package/dist/components/chat-composer.d.ts +21 -3
  89. package/dist/components/chat-composer.js +126 -60
  90. package/dist/components/chat-composer.js.map +1 -1
  91. package/dist/components/chat-header.js +6 -6
  92. package/dist/components/chat-header.js.map +1 -1
  93. package/dist/components/chat-inbox.js +34 -30
  94. package/dist/components/chat-inbox.js.map +1 -1
  95. package/dist/components/chat-markdown.d.ts +8 -0
  96. package/dist/components/chat-markdown.js +122 -0
  97. package/dist/components/chat-markdown.js.map +1 -0
  98. package/dist/components/chat-message.d.ts +26 -0
  99. package/dist/components/chat-message.js +145 -0
  100. package/dist/components/chat-message.js.map +1 -0
  101. package/dist/components/checkbox.js +11 -11
  102. package/dist/components/checkbox.js.map +1 -1
  103. package/dist/components/clipboard-text.js +3 -3
  104. package/dist/components/clipboard-text.js.map +1 -1
  105. package/dist/components/code.d.ts +22 -20
  106. package/dist/components/code.js +94 -32
  107. package/dist/components/code.js.map +1 -1
  108. package/dist/components/collapsible.js +8 -4
  109. package/dist/components/collapsible.js.map +1 -1
  110. package/dist/components/combobox.js.map +1 -1
  111. package/dist/components/command-palette.js +73 -47
  112. package/dist/components/command-palette.js.map +1 -1
  113. package/dist/components/confirm-dialog.d.ts +4 -1
  114. package/dist/components/confirm-dialog.js +20 -18
  115. package/dist/components/confirm-dialog.js.map +1 -1
  116. package/dist/components/context-cards.d.ts +15 -0
  117. package/dist/components/context-cards.js +148 -0
  118. package/dist/components/context-cards.js.map +1 -0
  119. package/dist/components/context-menu.d.ts +1 -1
  120. package/dist/components/context-menu.js +18 -14
  121. package/dist/components/context-menu.js.map +1 -1
  122. package/dist/components/data-table.d.ts +8 -2
  123. package/dist/components/data-table.js +161 -106
  124. package/dist/components/data-table.js.map +1 -1
  125. package/dist/components/date-picker.js +13 -13
  126. package/dist/components/date-picker.js.map +1 -1
  127. package/dist/components/delete-resource.js +1 -1
  128. package/dist/components/delete-resource.js.map +1 -1
  129. package/dist/components/description-list.js +3 -3
  130. package/dist/components/description-list.js.map +1 -1
  131. package/dist/components/dialog.d.ts +2 -2
  132. package/dist/components/dialog.js +8 -8
  133. package/dist/components/dialog.js.map +1 -1
  134. package/dist/components/diff-table.d.ts +15 -0
  135. package/dist/components/diff-table.js +146 -0
  136. package/dist/components/diff-table.js.map +1 -0
  137. package/dist/components/dock.js +2 -2
  138. package/dist/components/dock.js.map +1 -1
  139. package/dist/components/dropdown-menu.js +23 -18
  140. package/dist/components/dropdown-menu.js.map +1 -1
  141. package/dist/components/editable-nav-item.js +63 -58
  142. package/dist/components/editable-nav-item.js.map +1 -1
  143. package/dist/components/empty.js +6 -6
  144. package/dist/components/empty.js.map +1 -1
  145. package/dist/components/fab.js +1 -1
  146. package/dist/components/fab.js.map +1 -1
  147. package/dist/components/field.js +3 -3
  148. package/dist/components/field.js.map +1 -1
  149. package/dist/components/file-dropzone.js +7 -7
  150. package/dist/components/file-dropzone.js.map +1 -1
  151. package/dist/components/filter-bar.js +6 -6
  152. package/dist/components/filter-bar.js.map +1 -1
  153. package/dist/components/flow.js +4 -3
  154. package/dist/components/flow.js.map +1 -1
  155. package/dist/components/grid.d.ts +3 -1
  156. package/dist/components/grid.js +15 -8
  157. package/dist/components/grid.js.map +1 -1
  158. package/dist/components/hover-card.js +1 -1
  159. package/dist/components/hover-card.js.map +1 -1
  160. package/dist/components/icon-picker.d.ts +8 -2
  161. package/dist/components/icon-picker.js +75 -47
  162. package/dist/components/icon-picker.js.map +1 -1
  163. package/dist/components/inline-editable.js +6 -6
  164. package/dist/components/inline-editable.js.map +1 -1
  165. package/dist/components/input-area.js +3 -3
  166. package/dist/components/input-area.js.map +1 -1
  167. package/dist/components/input-group.js +5 -5
  168. package/dist/components/input-group.js.map +1 -1
  169. package/dist/components/input.js +4 -4
  170. package/dist/components/input.js.map +1 -1
  171. package/dist/components/label.js +3 -3
  172. package/dist/components/label.js.map +1 -1
  173. package/dist/components/layer-card.d.ts +9 -4
  174. package/dist/components/layer-card.js +72 -67
  175. package/dist/components/layer-card.js.map +1 -1
  176. package/dist/components/link.js.map +1 -1
  177. package/dist/components/loader.d.ts +16 -10
  178. package/dist/components/loader.js +46 -53
  179. package/dist/components/loader.js.map +1 -1
  180. package/dist/components/loading-screen.js +3 -3
  181. package/dist/components/loading-screen.js.map +1 -1
  182. package/dist/components/menu-bar.js +32 -27
  183. package/dist/components/menu-bar.js.map +1 -1
  184. package/dist/components/meter.d.ts +5 -5
  185. package/dist/components/meter.js +25 -12
  186. package/dist/components/meter.js.map +1 -1
  187. package/dist/components/multi-select.js +66 -62
  188. package/dist/components/multi-select.js.map +1 -1
  189. package/dist/components/navigation-menu.d.ts +2 -2
  190. package/dist/components/navigation-menu.js +22 -8
  191. package/dist/components/navigation-menu.js.map +1 -1
  192. package/dist/components/overlay.js +2 -2
  193. package/dist/components/overlay.js.map +1 -1
  194. package/dist/components/page-header.d.ts +3 -1
  195. package/dist/components/page-header.js +12 -12
  196. package/dist/components/page-header.js.map +1 -1
  197. package/dist/components/pagination.js +3 -3
  198. package/dist/components/pagination.js.map +1 -1
  199. package/dist/components/popover.js +18 -23
  200. package/dist/components/popover.js.map +1 -1
  201. package/dist/components/prompt-bar.d.ts +16 -0
  202. package/dist/components/prompt-bar.js +49 -0
  203. package/dist/components/prompt-bar.js.map +1 -0
  204. package/dist/components/radio.js +9 -9
  205. package/dist/components/radio.js.map +1 -1
  206. package/dist/components/recommendation-card.d.ts +13 -0
  207. package/dist/components/recommendation-card.js +123 -0
  208. package/dist/components/recommendation-card.js.map +1 -0
  209. package/dist/components/resource-list.js +1 -1
  210. package/dist/components/resource-list.js.map +1 -1
  211. package/dist/components/responsive-master-detail.js +7 -7
  212. package/dist/components/responsive-master-detail.js.map +1 -1
  213. package/dist/components/scroll-area.js +3 -3
  214. package/dist/components/scroll-area.js.map +1 -1
  215. package/dist/components/section-rule.d.ts +5 -3
  216. package/dist/components/section-rule.js +12 -12
  217. package/dist/components/section-rule.js.map +1 -1
  218. package/dist/components/segment-control.js +3 -3
  219. package/dist/components/segment-control.js.map +1 -1
  220. package/dist/components/select.js +47 -32
  221. package/dist/components/select.js.map +1 -1
  222. package/dist/components/sensitive-input.js +17 -19
  223. package/dist/components/sensitive-input.js.map +1 -1
  224. package/dist/components/separator.js.map +1 -1
  225. package/dist/components/sheet.d.ts +4 -4
  226. package/dist/components/sheet.js +12 -10
  227. package/dist/components/sheet.js.map +1 -1
  228. package/dist/components/sidebar.d.ts +3 -1
  229. package/dist/components/sidebar.js +150 -138
  230. package/dist/components/sidebar.js.map +1 -1
  231. package/dist/components/skeleton-line.d.ts +1 -1
  232. package/dist/components/skeleton-line.js +2 -2
  233. package/dist/components/skeleton-line.js.map +1 -1
  234. package/dist/components/slider.js +2 -2
  235. package/dist/components/slider.js.map +1 -1
  236. package/dist/components/stat-strip.js +5 -4
  237. package/dist/components/stat-strip.js.map +1 -1
  238. package/dist/components/switch.js +6 -6
  239. package/dist/components/switch.js.map +1 -1
  240. package/dist/components/table-of-contents.js +5 -5
  241. package/dist/components/table-of-contents.js.map +1 -1
  242. package/dist/components/table-pager.js +2 -2
  243. package/dist/components/table-pager.js.map +1 -1
  244. package/dist/components/table.js +4 -4
  245. package/dist/components/table.js.map +1 -1
  246. package/dist/components/tabs.js +7 -6
  247. package/dist/components/tabs.js.map +1 -1
  248. package/dist/components/tag-badge.d.ts +10 -10
  249. package/dist/components/tag-badge.js +11 -11
  250. package/dist/components/tag-badge.js.map +1 -1
  251. package/dist/components/tag-color-picker.d.ts +8 -1
  252. package/dist/components/tag-color-picker.js +33 -25
  253. package/dist/components/tag-color-picker.js.map +1 -1
  254. package/dist/components/text.js +5 -5
  255. package/dist/components/text.js.map +1 -1
  256. package/dist/components/theme-toggle.js +1 -1
  257. package/dist/components/theme-toggle.js.map +1 -1
  258. package/dist/components/thinking.d.ts +16 -0
  259. package/dist/components/thinking.js +85 -0
  260. package/dist/components/thinking.js.map +1 -0
  261. package/dist/components/toast.js +25 -20
  262. package/dist/components/toast.js.map +1 -1
  263. package/dist/components/toggle-group.js +6 -5
  264. package/dist/components/toggle-group.js.map +1 -1
  265. package/dist/components/toggle.js +6 -6
  266. package/dist/components/toggle.js.map +1 -1
  267. package/dist/components/tool-chips.d.ts +12 -0
  268. package/dist/components/tool-chips.js +138 -0
  269. package/dist/components/tool-chips.js.map +1 -0
  270. package/dist/components/toolbar.js +3 -3
  271. package/dist/components/toolbar.js.map +1 -1
  272. package/dist/components/tooltip.js +1 -1
  273. package/dist/components/tooltip.js.map +1 -1
  274. package/dist/components/typeahead-field.js +59 -56
  275. package/dist/components/typeahead-field.js.map +1 -1
  276. package/dist/components/upload-queue.js +15 -14
  277. package/dist/components/upload-queue.js.map +1 -1
  278. package/dist/models/agent-feedback.d.ts +44 -0
  279. package/dist/models/agent-feedback.js +28 -0
  280. package/dist/models/agent-feedback.js.map +1 -0
  281. package/dist/models/avatar.d.ts +2 -0
  282. package/dist/models/avatar.js +15 -0
  283. package/dist/models/avatar.js.map +1 -0
  284. package/dist/models/code.d.ts +6 -0
  285. package/dist/models/code.js +24 -0
  286. package/dist/models/code.js.map +1 -0
  287. package/dist/models/context-cards.d.ts +13 -0
  288. package/dist/models/context-cards.js +17 -0
  289. package/dist/models/context-cards.js.map +1 -0
  290. package/dist/models/diff-table.d.ts +12 -0
  291. package/dist/models/diff-table.js +9 -0
  292. package/dist/models/diff-table.js.map +1 -0
  293. package/dist/models/recommendation.d.ts +26 -0
  294. package/dist/models/recommendation.js +23 -0
  295. package/dist/models/recommendation.js.map +1 -0
  296. package/dist/providers/accent.js +1 -1
  297. package/dist/providers/accent.js.map +1 -1
  298. package/dist/providers/link.js.map +1 -1
  299. package/dist/providers/theme.js +1 -1
  300. package/dist/providers/theme.js.map +1 -1
  301. package/dist/styles/base.css +128 -0
  302. package/dist/styles/standalone.css +1994 -937
  303. package/dist/styles/tailwind.css +179 -13
  304. package/dist/styles/tokens.css +679 -20
  305. package/dist/utils/cn.js +25 -4
  306. package/dist/utils/cn.js.map +1 -1
  307. package/dist/utils/control-surface.d.ts +1 -1
  308. package/dist/utils/control-surface.js +1 -1
  309. package/dist/utils/control-surface.js.map +1 -1
  310. package/dist/utils/navigation.d.ts +3 -0
  311. package/dist/utils/navigation.js +8 -0
  312. package/dist/utils/navigation.js.map +1 -0
  313. package/dist/utils/preference-store.js +1 -1
  314. package/dist/utils/preference-store.js.map +1 -1
  315. package/dist/utils/selection-indicator.d.ts +1 -1
  316. package/dist/utils/selection-indicator.js +49 -72
  317. package/dist/utils/selection-indicator.js.map +1 -1
  318. package/dist/utils/use-checkable-group.js.map +1 -1
  319. package/dist/utils/use-hover-highlight.d.ts +4 -0
  320. package/dist/utils/use-hover-highlight.js +80 -0
  321. package/dist/utils/use-hover-highlight.js.map +1 -0
  322. package/dist/viewmodels/use-approval-card.d.ts +20 -0
  323. package/dist/viewmodels/use-approval-card.js +83 -0
  324. package/dist/viewmodels/use-approval-card.js.map +1 -0
  325. package/dist/viewmodels/use-chat-composer.d.ts +16 -0
  326. package/dist/viewmodels/use-chat-composer.js +34 -0
  327. package/dist/viewmodels/use-chat-composer.js.map +1 -0
  328. package/dist/viewmodels/use-chat-message.d.ts +16 -0
  329. package/dist/viewmodels/use-chat-message.js +26 -0
  330. package/dist/viewmodels/use-chat-message.js.map +1 -0
  331. package/dist/viewmodels/use-code-block.d.ts +8 -0
  332. package/dist/viewmodels/use-code-block.js +38 -0
  333. package/dist/viewmodels/use-code-block.js.map +1 -0
  334. package/dist/viewmodels/use-context-cards.d.ts +17 -0
  335. package/dist/viewmodels/use-context-cards.js +18 -0
  336. package/dist/viewmodels/use-context-cards.js.map +1 -0
  337. package/dist/viewmodels/use-diff-table.d.ts +16 -0
  338. package/dist/viewmodels/use-diff-table.js +42 -0
  339. package/dist/viewmodels/use-diff-table.js.map +1 -0
  340. package/dist/viewmodels/use-loader.d.ts +4 -0
  341. package/dist/viewmodels/use-loader.js +22 -0
  342. package/dist/viewmodels/use-loader.js.map +1 -0
  343. package/dist/viewmodels/use-recommendation-card.d.ts +17 -0
  344. package/dist/viewmodels/use-recommendation-card.js +41 -0
  345. package/dist/viewmodels/use-recommendation-card.js.map +1 -0
  346. package/dist/viewmodels/use-thinking.d.ts +13 -0
  347. package/dist/viewmodels/use-thinking.js +18 -0
  348. package/dist/viewmodels/use-thinking.js.map +1 -0
  349. package/dist/viewmodels/use-tool-chips.d.ts +10 -0
  350. package/dist/viewmodels/use-tool-chips.js +20 -0
  351. package/dist/viewmodels/use-tool-chips.js.map +1 -0
  352. package/package.json +3 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-approval-card.js","names":["useApprovalCardViewModel","index","setIndex","useState","focusToken","setFocusToken","answers","setAnswers","status","setStatus","error","setError","locked","useRef","mounted","advanceTimer","cancelAdvance","position","questions","question","answer","last","canContinue","validApprovalAnswer","show","next","token","move","choose","option","id","selected","value","autoAdvance","submit","missing","item","nextAnswers","onSubmit","approvalSnapshot","reason"],"sources":["../../src/viewmodels/use-approval-card.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport {\n\ttype ApprovalAnswers,\n\ttype ApprovalQuestion,\n\tapprovalSnapshot,\n\tvalidApprovalAnswer,\n} from \"../models/agent-feedback\";\n\nexport function useApprovalCardViewModel({\n\tquestions,\n\tonSubmit,\n\tautoAdvance = true,\n}: {\n\tquestions: readonly ApprovalQuestion[];\n\tonSubmit: (answers: ApprovalAnswers) => void | Promise<void>;\n\tautoAdvance?: boolean;\n}) {\n\tconst [index, setIndex] = useState(0);\n\tconst [focusToken, setFocusToken] = useState(0);\n\tconst [answers, setAnswers] = useState<ApprovalAnswers>({});\n\tconst [status, setStatus] = useState<\"editing\" | \"submitting\" | \"submitted\">(\"editing\");\n\tconst [error, setError] = useState(\"\");\n\tconst locked = useRef(false);\n\tconst mounted = useRef(true);\n\tconst advanceTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\tconst cancelAdvance = () => {\n\t\tclearTimeout(advanceTimer.current);\n\t\tadvanceTimer.current = undefined;\n\t};\n\tuseEffect(() => {\n\t\tmounted.current = true;\n\t\treturn () => {\n\t\t\tmounted.current = false;\n\t\t\tclearTimeout(advanceTimer.current);\n\t\t};\n\t}, []);\n\tconst position = Math.min(index, Math.max(0, questions.length - 1));\n\tconst question = questions[position];\n\tconst answer = question ? answers[question.id] : undefined;\n\tconst last = position === questions.length - 1;\n\tconst canContinue = Boolean(question && validApprovalAnswer(question, answer));\n\t/** Every programmatic question change asks the view to keep focus inside the card. */\n\tconst show = (next: number) => {\n\t\tsetIndex(next);\n\t\tsetFocusToken((token) => token + 1);\n\t};\n\tconst move = (next: number) => {\n\t\tif (locked.current || questions.length === 0) return;\n\t\tcancelAdvance();\n\t\tshow(Math.min(Math.max(0, next), questions.length - 1));\n\t\tsetError(\"\");\n\t};\n\tconst choose = (id: string) => {\n\t\tif (\n\t\t\t!question ||\n\t\t\tlocked.current ||\n\t\t\t!question.options.some((option) => option.id === id && !option.disabled)\n\t\t)\n\t\t\treturn;\n\t\tcancelAdvance();\n\t\tconst selected = answer?.selected ?? [];\n\t\tsetAnswers({\n\t\t\t...answers,\n\t\t\t[question.id]: {\n\t\t\t\t...answer,\n\t\t\t\tskipped: false,\n\t\t\t\tselected:\n\t\t\t\t\tquestion.type === \"single\"\n\t\t\t\t\t\t? [id]\n\t\t\t\t\t\t: selected.includes(id)\n\t\t\t\t\t\t\t? selected.filter((value) => value !== id)\n\t\t\t\t\t\t\t: [...selected, id],\n\t\t\t},\n\t\t});\n\t\tsetError(\"\");\n\t\tif (question.type === \"single\" && autoAdvance && !last)\n\t\t\tadvanceTimer.current = setTimeout(() => show(position + 1), 240);\n\t};\n\tconst submit = async (nextAnswers: ApprovalAnswers) => {\n\t\tif (locked.current || questions.length === 0) return;\n\t\tconst missing = questions.findIndex((item) => !validApprovalAnswer(item, nextAnswers[item.id]));\n\t\tif (missing >= 0) {\n\t\t\tshow(missing);\n\t\t\treturn;\n\t\t}\n\t\tlocked.current = true;\n\t\tsetStatus(\"submitting\");\n\t\tsetError(\"\");\n\t\tcancelAdvance();\n\t\ttry {\n\t\t\tawait onSubmit(approvalSnapshot(questions, nextAnswers));\n\t\t\tif (mounted.current) setStatus(\"submitted\");\n\t\t} catch (reason) {\n\t\t\tif (mounted.current) {\n\t\t\t\tsetError(reason instanceof Error ? reason.message : \"Could not submit answers. Try again.\");\n\t\t\t\tsetStatus(\"editing\");\n\t\t\t}\n\t\t} finally {\n\t\t\tlocked.current = false;\n\t\t}\n\t};\n\treturn {\n\t\tposition,\n\t\tfocusToken,\n\t\tquestion,\n\t\tanswer,\n\t\tstatus,\n\t\terror,\n\t\tcanContinue,\n\t\tlast,\n\t\tchoose,\n\t\tmove,\n\t\tsetCustom(value: string) {\n\t\t\tif (!question?.allowCustom || locked.current) return;\n\t\t\tcancelAdvance();\n\t\t\tsetAnswers({\n\t\t\t\t...answers,\n\t\t\t\t[question.id]: { selected: answer?.selected ?? [], custom: value },\n\t\t\t});\n\t\t},\n\t\tcontinue() {\n\t\t\tif (!canContinue || locked.current) return;\n\t\t\tif (last) void submit(answers);\n\t\t\telse move(position + 1);\n\t\t},\n\t\tskip() {\n\t\t\tif (question?.required !== false || locked.current) return;\n\t\t\tconst next = { ...answers, [question.id]: { selected: [], skipped: true } };\n\t\t\tsetAnswers(next);\n\t\t\tif (last) void submit(next);\n\t\t\telse move(position + 1);\n\t\t},\n\t};\n}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare function useChatComposer({ value, defaultValue, onValueChange, onSend, disabled, streaming, hasAttachments, }: {
2
+ value?: string;
3
+ defaultValue?: string;
4
+ onValueChange?: (value: string) => void;
5
+ onSend: (text: string) => void | Promise<void>;
6
+ disabled: boolean;
7
+ streaming: boolean;
8
+ hasAttachments: boolean;
9
+ }): {
10
+ value: string;
11
+ update: (next: string) => void;
12
+ pending: boolean;
13
+ error: string;
14
+ canSend: boolean;
15
+ send(): Promise<boolean>;
16
+ };
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { useEffect as e, useRef as t, useState as n } from "react";
3
+ //#region src/viewmodels/use-chat-composer.ts
4
+ function r({ value: r, defaultValue: i = "", onValueChange: a, onSend: o, disabled: s, streaming: c, hasAttachments: l }) {
5
+ let [u, d] = n(i), [f, p] = n(!1), [m, h] = n(""), g = t(!1), _ = t(!0);
6
+ e(() => (_.current = !0, () => {
7
+ _.current = !1;
8
+ }), []);
9
+ let v = r ?? u;
10
+ return {
11
+ value: v,
12
+ update: (e) => {
13
+ g.current || s || (r === void 0 && d(e), a?.(e), h(""));
14
+ },
15
+ pending: f,
16
+ error: m,
17
+ canSend: !s && !c && !f && (!!v.trim() || l),
18
+ async send() {
19
+ if (g.current || s || c || !v.trim() && !l) return !1;
20
+ g.current = !0, p(!0), h("");
21
+ try {
22
+ return await o(v.trim()), _.current && (r === void 0 && d(""), a?.("")), !0;
23
+ } catch (e) {
24
+ return _.current && h(e instanceof Error ? e.message : "Could not send message. Try again."), !1;
25
+ } finally {
26
+ g.current = !1, _.current && p(!1);
27
+ }
28
+ }
29
+ };
30
+ }
31
+ //#endregion
32
+ export { r as useChatComposer };
33
+
34
+ //# sourceMappingURL=use-chat-composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-chat-composer.js","names":["useChatComposer","draft","setDraft","useState","defaultValue","pending","setPending","error","setError","locked","useRef","mounted","text","value","disabled","next","onValueChange","streaming","hasAttachments","onSend","reason"],"sources":["../../src/viewmodels/use-chat-composer.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\nexport function useChatComposer({\n\tvalue,\n\tdefaultValue = \"\",\n\tonValueChange,\n\tonSend,\n\tdisabled,\n\tstreaming,\n\thasAttachments,\n}: {\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonValueChange?: (value: string) => void;\n\tonSend: (text: string) => void | Promise<void>;\n\tdisabled: boolean;\n\tstreaming: boolean;\n\thasAttachments: boolean;\n}) {\n\tconst [draft, setDraft] = useState(defaultValue);\n\tconst [pending, setPending] = useState(false);\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 text = value ?? draft;\n\tconst update = (next: string) => {\n\t\tif (locked.current || disabled) return;\n\t\tif (value === undefined) setDraft(next);\n\t\tonValueChange?.(next);\n\t\tsetError(\"\");\n\t};\n\treturn {\n\t\tvalue: text,\n\t\tupdate,\n\t\tpending,\n\t\terror,\n\t\tcanSend: !disabled && !streaming && !pending && (Boolean(text.trim()) || hasAttachments),\n\t\tasync send() {\n\t\t\tif (locked.current || disabled || streaming || (!text.trim() && !hasAttachments))\n\t\t\t\treturn false;\n\t\t\tlocked.current = true;\n\t\t\tsetPending(true);\n\t\t\tsetError(\"\");\n\t\t\ttry {\n\t\t\t\tawait onSend(text.trim());\n\t\t\t\tif (mounted.current) {\n\t\t\t\t\tif (value === undefined) setDraft(\"\");\n\t\t\t\t\tonValueChange?.(\"\");\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t} catch (reason) {\n\t\t\t\tif (mounted.current)\n\t\t\t\t\tsetError(reason instanceof Error ? reason.message : \"Could not send message. Try again.\");\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tlocked.current = false;\n\t\t\t\tif (mounted.current) setPending(false);\n\t\t\t}\n\t\t},\n\t};\n}\n"],"mappings":";;;AAEA,SAAgBA,EAAgB,EAC/B,UACA,kBAAe,IACf,kBACA,WACA,aACA,cACA,qBASE;CACF,IAAM,CAACC,GAAOC,KAAYC,EAASC,CAAY,GACzC,CAACC,GAASC,KAAcH,EAAS,EAAK,GACtC,CAACI,GAAOC,KAAYL,EAAS,EAAE,GAC/BM,IAASC,EAAO,EAAK,GACrBC,IAAUD,EAAO,EAAI;CAC3B,SACC,EAAQ,UAAU,UACL;EACZ,EAAQ,UAAU;CACnB,IACE,CAAC,CAAC;CACL,IAAME,IAAOC,KAASZ;CAOtB,OAAO;EACN,OAAOW;EACP,SARe,MAAiB;GAChC,AAAIH,EAAO,WAAWK,MAClBD,MAAU,KAAA,KAAWX,EAASa,CAAI,GACtCC,IAAgBD,CAAI,GACpBP,EAAS,EAAE;EACZ;EAIC;EACA;EACA,SAAS,CAACM,KAAY,CAACG,KAAa,CAACZ,MAAY,EAAQO,EAAK,KAAK,KAAMM;EACzE,MAAM,OAAO;GACZ,IAAIT,EAAO,WAAWK,KAAYG,KAAc,CAACL,EAAK,KAAK,KAAK,CAACM,GAChE,OAAO;GAGR,AAFA,EAAO,UAAU,IACjBZ,EAAW,EAAI,GACfE,EAAS,EAAE;GACX,IAAI;IAMH,OALA,MAAMW,EAAOP,EAAK,KAAK,CAAC,GACpBD,EAAQ,YACPE,MAAU,KAAA,KAAWX,EAAS,EAAE,GACpCc,IAAgB,EAAE,IAEZ;GACR,SAASI,GAAQ;IAGhB,OAFIT,EAAQ,WACXH,EAASY,aAAkB,QAAQA,EAAO,UAAU,oCAAoC,GAClF;GACR,UAAU;IAET,AADA,EAAO,UAAU,IACbT,EAAQ,WAASL,EAAW,EAAK;GACtC;EACD;CACD;AACD"}
@@ -0,0 +1,16 @@
1
+ export declare function useChatMessage(content: string, sources: readonly {
2
+ id: string;
3
+ name: string;
4
+ type?: string;
5
+ href?: string;
6
+ }[]): {
7
+ copied: boolean;
8
+ copyError: boolean;
9
+ sources: {
10
+ id: string;
11
+ name: string;
12
+ type?: string;
13
+ href: string | undefined;
14
+ }[];
15
+ copy(write: (text: string) => Promise<void>): Promise<void>;
16
+ };
@@ -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.1.8",
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
  },