@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.
- package/README.md +2 -0
- package/ai/COMPATIBILITY.md +11 -1
- package/ai/DESIGN.md +342 -0
- package/ai/INTEGRATION.md +239 -152
- package/ai/RECIPES.md +96 -26
- package/ai/USAGE.md +5 -5
- package/ai/registry.json +2883 -275
- package/dist/assets/brand-mark.js.map +1 -1
- package/dist/charts/area.js.map +1 -1
- package/dist/charts/bar.js.map +1 -1
- package/dist/charts/bullet.js.map +1 -1
- package/dist/charts/charts.js.map +1 -1
- package/dist/charts/config.d.ts +11 -11
- package/dist/charts/config.js +4 -4
- package/dist/charts/config.js.map +1 -1
- package/dist/charts/custom-chart.js.map +1 -1
- package/dist/charts/date-navigation.js +10 -10
- package/dist/charts/date-navigation.js.map +1 -1
- package/dist/charts/donut.js +1 -1
- package/dist/charts/donut.js.map +1 -1
- package/dist/charts/frame.d.ts +1 -1
- package/dist/charts/frame.js +4 -4
- package/dist/charts/frame.js.map +1 -1
- package/dist/charts/funnel.js.map +1 -1
- package/dist/charts/gauge.js +5 -5
- package/dist/charts/gauge.js.map +1 -1
- package/dist/charts/grouped-bar.js.map +1 -1
- package/dist/charts/heatmap-calendar.js +11 -11
- package/dist/charts/heatmap-calendar.js.map +1 -1
- package/dist/charts/heatmap-matrix.js +8 -8
- package/dist/charts/heatmap-matrix.js.map +1 -1
- package/dist/charts/item-list.js +1 -1
- package/dist/charts/item-list.js.map +1 -1
- package/dist/charts/legend.js +19 -19
- package/dist/charts/legend.js.map +1 -1
- package/dist/charts/line.js.map +1 -1
- package/dist/charts/palette.js +2 -2
- package/dist/charts/palette.js.map +1 -1
- package/dist/charts/radar.js.map +1 -1
- package/dist/charts/sample.js.map +1 -1
- package/dist/charts/sankey.js.map +1 -1
- package/dist/charts/series.js.map +1 -1
- package/dist/charts/slot-bar.js +2 -2
- package/dist/charts/slot-bar.js.map +1 -1
- package/dist/charts/sparkline.js +38 -23
- package/dist/charts/sparkline.js.map +1 -1
- package/dist/charts/stacked-bar.js.map +1 -1
- package/dist/charts/stat-card.d.ts +2 -2
- package/dist/charts/stat-card.js +61 -58
- package/dist/charts/stat-card.js.map +1 -1
- package/dist/charts/timeline.js +18 -9
- package/dist/charts/timeline.js.map +1 -1
- package/dist/charts/timeseries.js.map +1 -1
- package/dist/charts/tooltip.js +16 -16
- package/dist/charts/tooltip.js.map +1 -1
- package/dist/components/accordion.js +1 -1
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/alert-dialog.js +4 -4
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/app-header.d.ts +5 -1
- package/dist/components/app-header.js +19 -11
- package/dist/components/app-header.js.map +1 -1
- package/dist/components/app-shell.d.ts +4 -1
- package/dist/components/app-shell.js +8 -5
- package/dist/components/app-shell.js.map +1 -1
- package/dist/components/approval-card.d.ts +13 -0
- package/dist/components/approval-card.js +161 -0
- package/dist/components/approval-card.js.map +1 -0
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/avatar.d.ts +12 -0
- package/dist/components/avatar.js +39 -18
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/badge.js +8 -8
- package/dist/components/badge.js.map +1 -1
- package/dist/components/banner.d.ts +2 -2
- package/dist/components/banner.js +9 -8
- package/dist/components/banner.js.map +1 -1
- package/dist/components/basalt-mark.js +1 -1
- package/dist/components/basalt-mark.js.map +1 -1
- package/dist/components/battery-meter.js +5 -5
- package/dist/components/battery-meter.js.map +1 -1
- package/dist/components/breadcrumbs.js +6 -6
- package/dist/components/breadcrumbs.js.map +1 -1
- package/dist/components/button.js +10 -10
- package/dist/components/button.js.map +1 -1
- package/dist/components/chat-bubble.js +4 -3
- package/dist/components/chat-bubble.js.map +1 -1
- package/dist/components/chat-composer.d.ts +21 -3
- package/dist/components/chat-composer.js +126 -60
- package/dist/components/chat-composer.js.map +1 -1
- package/dist/components/chat-header.js +6 -6
- package/dist/components/chat-header.js.map +1 -1
- package/dist/components/chat-inbox.js +34 -30
- package/dist/components/chat-inbox.js.map +1 -1
- package/dist/components/chat-markdown.d.ts +8 -0
- package/dist/components/chat-markdown.js +122 -0
- package/dist/components/chat-markdown.js.map +1 -0
- package/dist/components/chat-message.d.ts +26 -0
- package/dist/components/chat-message.js +145 -0
- package/dist/components/chat-message.js.map +1 -0
- package/dist/components/checkbox.js +11 -11
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/clipboard-text.js +3 -3
- package/dist/components/clipboard-text.js.map +1 -1
- package/dist/components/code.d.ts +22 -20
- package/dist/components/code.js +94 -32
- package/dist/components/code.js.map +1 -1
- package/dist/components/collapsible.js +8 -4
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/command-palette.js +73 -47
- package/dist/components/command-palette.js.map +1 -1
- package/dist/components/confirm-dialog.d.ts +4 -1
- package/dist/components/confirm-dialog.js +20 -18
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/context-cards.d.ts +15 -0
- package/dist/components/context-cards.js +148 -0
- package/dist/components/context-cards.js.map +1 -0
- package/dist/components/context-menu.d.ts +1 -1
- package/dist/components/context-menu.js +18 -14
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/data-table.d.ts +8 -2
- package/dist/components/data-table.js +161 -106
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.js +13 -13
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/delete-resource.js +1 -1
- package/dist/components/delete-resource.js.map +1 -1
- package/dist/components/description-list.js +3 -3
- package/dist/components/description-list.js.map +1 -1
- package/dist/components/dialog.d.ts +2 -2
- package/dist/components/dialog.js +8 -8
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/diff-table.d.ts +15 -0
- package/dist/components/diff-table.js +146 -0
- package/dist/components/diff-table.js.map +1 -0
- package/dist/components/dock.js +2 -2
- package/dist/components/dock.js.map +1 -1
- package/dist/components/dropdown-menu.js +23 -18
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/editable-nav-item.js +63 -58
- package/dist/components/editable-nav-item.js.map +1 -1
- package/dist/components/empty.js +6 -6
- package/dist/components/empty.js.map +1 -1
- package/dist/components/fab.js +1 -1
- package/dist/components/fab.js.map +1 -1
- package/dist/components/field.js +3 -3
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-dropzone.js +7 -7
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/filter-bar.js +6 -6
- package/dist/components/filter-bar.js.map +1 -1
- package/dist/components/flow.js +4 -3
- package/dist/components/flow.js.map +1 -1
- package/dist/components/grid.d.ts +3 -1
- package/dist/components/grid.js +15 -8
- package/dist/components/grid.js.map +1 -1
- package/dist/components/hover-card.js +1 -1
- package/dist/components/hover-card.js.map +1 -1
- package/dist/components/icon-picker.d.ts +8 -2
- package/dist/components/icon-picker.js +75 -47
- package/dist/components/icon-picker.js.map +1 -1
- package/dist/components/inline-editable.js +6 -6
- package/dist/components/inline-editable.js.map +1 -1
- package/dist/components/input-area.js +3 -3
- package/dist/components/input-area.js.map +1 -1
- package/dist/components/input-group.js +5 -5
- package/dist/components/input-group.js.map +1 -1
- package/dist/components/input.js +4 -4
- package/dist/components/input.js.map +1 -1
- package/dist/components/label.js +3 -3
- package/dist/components/label.js.map +1 -1
- package/dist/components/layer-card.d.ts +9 -4
- package/dist/components/layer-card.js +72 -67
- package/dist/components/layer-card.js.map +1 -1
- package/dist/components/link.js.map +1 -1
- package/dist/components/loader.d.ts +16 -10
- package/dist/components/loader.js +46 -53
- package/dist/components/loader.js.map +1 -1
- package/dist/components/loading-screen.js +3 -3
- package/dist/components/loading-screen.js.map +1 -1
- package/dist/components/menu-bar.js +32 -27
- package/dist/components/menu-bar.js.map +1 -1
- package/dist/components/meter.d.ts +5 -5
- package/dist/components/meter.js +25 -12
- package/dist/components/meter.js.map +1 -1
- package/dist/components/multi-select.js +66 -62
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/navigation-menu.d.ts +2 -2
- package/dist/components/navigation-menu.js +22 -8
- package/dist/components/navigation-menu.js.map +1 -1
- package/dist/components/overlay.js +2 -2
- package/dist/components/overlay.js.map +1 -1
- package/dist/components/page-header.d.ts +3 -1
- package/dist/components/page-header.js +12 -12
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/pagination.js +3 -3
- package/dist/components/pagination.js.map +1 -1
- package/dist/components/popover.js +18 -23
- package/dist/components/popover.js.map +1 -1
- package/dist/components/prompt-bar.d.ts +16 -0
- package/dist/components/prompt-bar.js +49 -0
- package/dist/components/prompt-bar.js.map +1 -0
- package/dist/components/radio.js +9 -9
- package/dist/components/radio.js.map +1 -1
- package/dist/components/recommendation-card.d.ts +13 -0
- package/dist/components/recommendation-card.js +123 -0
- package/dist/components/recommendation-card.js.map +1 -0
- package/dist/components/resource-list.js +1 -1
- package/dist/components/resource-list.js.map +1 -1
- package/dist/components/responsive-master-detail.js +7 -7
- package/dist/components/responsive-master-detail.js.map +1 -1
- package/dist/components/scroll-area.js +3 -3
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/section-rule.d.ts +5 -3
- package/dist/components/section-rule.js +12 -12
- package/dist/components/section-rule.js.map +1 -1
- package/dist/components/segment-control.js +3 -3
- package/dist/components/segment-control.js.map +1 -1
- package/dist/components/select.js +47 -32
- package/dist/components/select.js.map +1 -1
- package/dist/components/sensitive-input.js +17 -19
- package/dist/components/sensitive-input.js.map +1 -1
- package/dist/components/separator.js.map +1 -1
- package/dist/components/sheet.d.ts +4 -4
- package/dist/components/sheet.js +12 -10
- package/dist/components/sheet.js.map +1 -1
- package/dist/components/sidebar.d.ts +3 -1
- package/dist/components/sidebar.js +150 -138
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/skeleton-line.d.ts +1 -1
- package/dist/components/skeleton-line.js +2 -2
- package/dist/components/skeleton-line.js.map +1 -1
- package/dist/components/slider.js +2 -2
- package/dist/components/slider.js.map +1 -1
- package/dist/components/stat-strip.js +5 -4
- package/dist/components/stat-strip.js.map +1 -1
- package/dist/components/switch.js +6 -6
- package/dist/components/switch.js.map +1 -1
- package/dist/components/table-of-contents.js +5 -5
- package/dist/components/table-of-contents.js.map +1 -1
- package/dist/components/table-pager.js +2 -2
- package/dist/components/table-pager.js.map +1 -1
- package/dist/components/table.js +4 -4
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js +7 -6
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tag-badge.d.ts +10 -10
- package/dist/components/tag-badge.js +11 -11
- package/dist/components/tag-badge.js.map +1 -1
- package/dist/components/tag-color-picker.d.ts +8 -1
- package/dist/components/tag-color-picker.js +33 -25
- package/dist/components/tag-color-picker.js.map +1 -1
- package/dist/components/text.js +5 -5
- package/dist/components/text.js.map +1 -1
- package/dist/components/theme-toggle.js +1 -1
- package/dist/components/theme-toggle.js.map +1 -1
- package/dist/components/thinking.d.ts +16 -0
- package/dist/components/thinking.js +85 -0
- package/dist/components/thinking.js.map +1 -0
- package/dist/components/toast.js +25 -20
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toggle-group.js +6 -5
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle.js +6 -6
- package/dist/components/toggle.js.map +1 -1
- package/dist/components/tool-chips.d.ts +12 -0
- package/dist/components/tool-chips.js +138 -0
- package/dist/components/tool-chips.js.map +1 -0
- package/dist/components/toolbar.js +3 -3
- package/dist/components/toolbar.js.map +1 -1
- package/dist/components/tooltip.js +1 -1
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/typeahead-field.js +59 -56
- package/dist/components/typeahead-field.js.map +1 -1
- package/dist/components/upload-queue.js +15 -14
- package/dist/components/upload-queue.js.map +1 -1
- package/dist/models/agent-feedback.d.ts +44 -0
- package/dist/models/agent-feedback.js +28 -0
- package/dist/models/agent-feedback.js.map +1 -0
- package/dist/models/avatar.d.ts +2 -0
- package/dist/models/avatar.js +15 -0
- package/dist/models/avatar.js.map +1 -0
- package/dist/models/code.d.ts +6 -0
- package/dist/models/code.js +24 -0
- package/dist/models/code.js.map +1 -0
- package/dist/models/context-cards.d.ts +13 -0
- package/dist/models/context-cards.js +17 -0
- package/dist/models/context-cards.js.map +1 -0
- package/dist/models/diff-table.d.ts +12 -0
- package/dist/models/diff-table.js +9 -0
- package/dist/models/diff-table.js.map +1 -0
- package/dist/models/recommendation.d.ts +26 -0
- package/dist/models/recommendation.js +23 -0
- package/dist/models/recommendation.js.map +1 -0
- package/dist/providers/accent.js +1 -1
- package/dist/providers/accent.js.map +1 -1
- package/dist/providers/link.js.map +1 -1
- package/dist/providers/theme.js +1 -1
- package/dist/providers/theme.js.map +1 -1
- package/dist/styles/base.css +128 -0
- package/dist/styles/standalone.css +1994 -937
- package/dist/styles/tailwind.css +179 -13
- package/dist/styles/tokens.css +679 -20
- package/dist/utils/cn.js +25 -4
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/control-surface.d.ts +1 -1
- package/dist/utils/control-surface.js +1 -1
- package/dist/utils/control-surface.js.map +1 -1
- package/dist/utils/navigation.d.ts +3 -0
- package/dist/utils/navigation.js +8 -0
- package/dist/utils/navigation.js.map +1 -0
- package/dist/utils/preference-store.js +1 -1
- package/dist/utils/preference-store.js.map +1 -1
- package/dist/utils/selection-indicator.d.ts +1 -1
- package/dist/utils/selection-indicator.js +49 -72
- package/dist/utils/selection-indicator.js.map +1 -1
- package/dist/utils/use-checkable-group.js.map +1 -1
- package/dist/utils/use-hover-highlight.d.ts +4 -0
- package/dist/utils/use-hover-highlight.js +80 -0
- package/dist/utils/use-hover-highlight.js.map +1 -0
- package/dist/viewmodels/use-approval-card.d.ts +20 -0
- package/dist/viewmodels/use-approval-card.js +83 -0
- package/dist/viewmodels/use-approval-card.js.map +1 -0
- package/dist/viewmodels/use-chat-composer.d.ts +16 -0
- package/dist/viewmodels/use-chat-composer.js +34 -0
- package/dist/viewmodels/use-chat-composer.js.map +1 -0
- package/dist/viewmodels/use-chat-message.d.ts +16 -0
- package/dist/viewmodels/use-chat-message.js +26 -0
- package/dist/viewmodels/use-chat-message.js.map +1 -0
- package/dist/viewmodels/use-code-block.d.ts +8 -0
- package/dist/viewmodels/use-code-block.js +38 -0
- package/dist/viewmodels/use-code-block.js.map +1 -0
- package/dist/viewmodels/use-context-cards.d.ts +17 -0
- package/dist/viewmodels/use-context-cards.js +18 -0
- package/dist/viewmodels/use-context-cards.js.map +1 -0
- package/dist/viewmodels/use-diff-table.d.ts +16 -0
- package/dist/viewmodels/use-diff-table.js +42 -0
- package/dist/viewmodels/use-diff-table.js.map +1 -0
- package/dist/viewmodels/use-loader.d.ts +4 -0
- package/dist/viewmodels/use-loader.js +22 -0
- package/dist/viewmodels/use-loader.js.map +1 -0
- package/dist/viewmodels/use-recommendation-card.d.ts +17 -0
- package/dist/viewmodels/use-recommendation-card.js +41 -0
- package/dist/viewmodels/use-recommendation-card.js.map +1 -0
- package/dist/viewmodels/use-thinking.d.ts +13 -0
- package/dist/viewmodels/use-thinking.js +18 -0
- package/dist/viewmodels/use-thinking.js.map +1 -0
- package/dist/viewmodels/use-tool-chips.d.ts +10 -0
- package/dist/viewmodels/use-tool-chips.js +20 -0
- package/dist/viewmodels/use-tool-chips.js.map +1 -0
- 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,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,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": "
|
|
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
|
},
|