basalt-ui 1.41.0 → 2.0.1
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/AGENTS.md +46 -43
- package/CHANGELOG.md +542 -518
- package/MIGRATING.md +964 -37
- package/README.md +171 -366
- package/agent/rules/basalt-batteries.md +19 -74
- package/agent/rules/basalt-charts.md +21 -95
- package/agent/rules/basalt-controls.md +23 -131
- package/agent/rules/basalt-mantine.md +26 -99
- package/agent/rules/basalt-state.md +21 -103
- package/agent/rules/basalt-tokens.md +33 -114
- package/agent/skills/basalt-app/SKILL.md +229 -72
- package/agent/skills/basalt-charts/SKILL.md +23 -57
- package/agent/skills/basalt-design/SKILL.md +12 -70
- package/agent/templates/AGENTS-block.md.tpl +16 -26
- package/agent/templates/DESIGN.md.tpl +1 -1
- package/agent/templates/__root.tpl +9 -16
- package/agent/templates/main.tpl +21 -0
- package/agent/templates/nav.tpl +18 -0
- package/configs/oxlint-basalt.json +4 -10
- package/configs/oxlint-plugin.js +465 -844
- package/configs/oxlint-plugin.test.ts +661 -709
- package/configs/oxlint.json +10 -2
- package/dist/agent/ai-sdk-transport.d.ts +19 -7
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +10 -7
- package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
- package/dist/agent/chat/composer.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/composer.js +10 -9
- package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
- package/dist/agent/chat/message-affordances.d.ts.map +1 -0
- package/dist/agent/chat/relative-time.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
- package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
- package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
- package/dist/agent/chat/thread-feed.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
- package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
- package/dist/agent/chat/thread-message.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
- package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
- package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
- package/dist/agent/chat/tool-chip.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
- package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
- package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
- package/dist/agent/chat/virtualize.d.ts.map +1 -0
- package/dist/agent/error.d.ts +31 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +18 -0
- package/dist/agent/history.d.ts +2 -36
- package/dist/agent/history.d.ts.map +1 -1
- package/dist/agent/history.js +0 -32
- package/dist/agent/id.d.ts +4 -5
- package/dist/agent/id.d.ts.map +1 -1
- package/dist/agent/index.d.ts +19 -52
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -32
- package/dist/agent/outcome.d.ts +3 -14
- package/dist/agent/outcome.d.ts.map +1 -1
- package/dist/agent/outcome.js +0 -30
- package/dist/agent/part-list.d.ts +3 -3
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/parts.d.ts +23 -24
- package/dist/agent/parts.d.ts.map +1 -1
- package/dist/agent/run-committer.d.ts +23 -0
- package/dist/agent/run-committer.d.ts.map +1 -0
- package/dist/agent/run-committer.js +41 -0
- package/dist/agent/run-records.d.ts +77 -0
- package/dist/agent/run-records.d.ts.map +1 -0
- package/dist/agent/run-records.js +69 -0
- package/dist/agent/thread.d.ts +23 -47
- package/dist/agent/thread.d.ts.map +1 -1
- package/dist/agent/thread.js +3 -134
- package/dist/agent/transport.d.ts +6 -69
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +0 -18
- package/dist/agent/use-agent-thread-runs.d.ts +63 -26
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +202 -66
- package/dist/charts/BandStrip.d.ts +46 -0
- package/dist/charts/BandStrip.d.ts.map +1 -0
- package/dist/charts/BandStrip.js +151 -0
- package/dist/charts/Bars.d.ts +19 -0
- package/dist/charts/Bars.d.ts.map +1 -0
- package/dist/charts/Bars.js +77 -0
- package/dist/charts/CartesianChart.d.ts +57 -0
- package/dist/charts/CartesianChart.d.ts.map +1 -0
- package/dist/charts/CartesianChart.js +121 -0
- package/dist/charts/ChartCard.d.ts +34 -0
- package/dist/charts/ChartCard.d.ts.map +1 -0
- package/dist/charts/ChartCard.js +115 -0
- package/dist/charts/Donut.d.ts +25 -0
- package/dist/charts/Donut.d.ts.map +1 -0
- package/dist/charts/Donut.js +191 -0
- package/dist/charts/DualPanel.d.ts +47 -0
- package/dist/charts/DualPanel.d.ts.map +1 -0
- package/dist/charts/DualPanel.js +214 -0
- package/dist/charts/Heatmap.d.ts +41 -0
- package/dist/charts/Heatmap.d.ts.map +1 -0
- package/dist/charts/Heatmap.js +216 -0
- package/dist/charts/Lines.d.ts +11 -0
- package/dist/charts/Lines.d.ts.map +1 -0
- package/dist/charts/Lines.js +114 -0
- package/dist/charts/MirroredBars.d.ts +44 -0
- package/dist/charts/MirroredBars.d.ts.map +1 -0
- package/dist/charts/MirroredBars.js +190 -0
- package/dist/charts/Sparkline.d.ts +22 -0
- package/dist/charts/Sparkline.d.ts.map +1 -0
- package/dist/charts/Sparkline.js +129 -0
- package/dist/charts/StackedArea.d.ts +15 -0
- package/dist/charts/StackedArea.d.ts.map +1 -0
- package/dist/charts/StackedArea.js +46 -0
- package/dist/charts/box.d.ts +38 -0
- package/dist/charts/box.d.ts.map +1 -0
- package/dist/charts/box.js +72 -0
- package/dist/charts/card-context.d.ts +3 -0
- package/dist/charts/card-context.d.ts.map +1 -0
- package/dist/charts/card-context.js +7 -0
- package/dist/charts/chart-box.module.css +64 -0
- package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
- package/dist/charts/chart-card.module.css +25 -0
- package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
- package/dist/charts/chart-legend.module.css +38 -0
- package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
- package/dist/charts/compile.d.ts +62 -0
- package/dist/charts/compile.d.ts.map +1 -0
- package/dist/charts/compile.js +386 -0
- package/dist/charts/cursor.d.ts +50 -0
- package/dist/charts/cursor.d.ts.map +1 -0
- package/dist/charts/cursor.js +157 -0
- package/dist/charts/curves.d.ts +12 -0
- package/dist/charts/curves.d.ts.map +1 -0
- package/dist/charts/curves.js +86 -0
- package/dist/charts/donut.module.css +54 -0
- package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
- package/dist/charts/host.d.ts +17 -0
- package/dist/charts/host.d.ts.map +1 -0
- package/dist/charts/host.js +35 -0
- package/dist/charts/index.d.ts +18 -53
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +17 -189
- package/dist/charts/legend.d.ts +23 -0
- package/dist/charts/legend.d.ts.map +1 -0
- package/dist/charts/legend.js +160 -0
- package/dist/charts/marks.d.ts +25 -0
- package/dist/charts/marks.d.ts.map +1 -0
- package/dist/charts/marks.js +128 -0
- package/dist/charts/panel.d.ts +56 -0
- package/dist/charts/panel.d.ts.map +1 -0
- package/dist/charts/panel.js +123 -0
- package/dist/charts/scales.d.ts +44 -0
- package/dist/charts/scales.d.ts.map +1 -0
- package/dist/charts/scales.js +163 -0
- package/dist/charts/sizing.d.ts +12 -0
- package/dist/charts/sizing.d.ts.map +1 -0
- package/dist/charts/sizing.js +33 -0
- package/dist/charts/state.d.ts +17 -0
- package/dist/charts/state.d.ts.map +1 -0
- package/dist/charts/state.js +53 -0
- package/dist/charts/theme.d.ts +38 -19
- package/dist/charts/theme.d.ts.map +1 -1
- package/dist/charts/theme.js +48 -26
- package/dist/charts/types.d.ts +227 -0
- package/dist/charts/types.d.ts.map +1 -0
- package/dist/charts/types.js +4 -0
- package/dist/cli/audit-allows.d.ts +4 -17
- package/dist/cli/audit-allows.d.ts.map +1 -1
- package/dist/cli/config.d.ts +18 -43
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +6 -0
- package/dist/cli/doctor-upgrade.d.ts +43 -0
- package/dist/cli/doctor-upgrade.d.ts.map +1 -0
- package/dist/cli/doctor-upgrade.js +314 -0
- package/dist/cli/doctor.d.ts +14 -29
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +58 -9
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -4
- package/dist/cli/index.d.ts +48 -172
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +39 -132
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +43 -37
- package/dist/cli/sync.d.ts +5 -21
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +4 -23
- package/dist/cli/tokens-css.d.ts +7 -28
- package/dist/cli/tokens-css.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +4 -5
- package/dist/commands/define-commands.d.ts +15 -31
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +1 -11
- package/dist/commands/define-overlays.d.ts +5 -19
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +3 -11
- package/dist/commands/index.d.ts +10 -40
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +9 -46
- package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
- package/dist/commands/notifications/bell.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
- package/dist/commands/notifications/center.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.js +2 -2
- package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
- package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
- package/dist/commands/notifications/notify.d.ts +44 -0
- package/dist/commands/notifications/notify.d.ts.map +1 -0
- package/dist/commands/notifications/notify.js +79 -0
- package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
- package/dist/commands/notifications/store.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/store.js +4 -0
- package/dist/commands/projectors.d.ts +1 -131
- package/dist/commands/projectors.d.ts.map +1 -1
- package/dist/commands/projectors.js +2 -73
- package/dist/commands/shell-bridge.d.ts +3 -3
- package/dist/commands/shortcut-format.d.ts +5 -4
- package/dist/commands/shortcut-format.d.ts.map +1 -1
- package/dist/common/errors.d.ts +3 -3
- package/dist/common/use-measured-widths.d.ts.map +1 -1
- package/dist/common/use-measured-widths.js +5 -3
- package/dist/common/validate.d.ts +2 -2
- package/dist/content/article-layout.d.ts.map +1 -1
- package/dist/content/article-layout.js +3 -3
- package/dist/content/article-model.d.ts +1 -46
- package/dist/content/article-model.d.ts.map +1 -1
- package/dist/content/article-model.js +1 -29
- package/dist/content/index.d.ts +11 -41
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +3 -35
- package/dist/content/markdown.d.ts +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +1 -1
- package/dist/content/mermaid.d.ts.map +1 -1
- package/dist/content/mermaid.js +7 -7
- package/dist/content/slug.d.ts +1 -8
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/slug.js +1 -8
- package/dist/content/url-hardening.d.ts +2 -2
- package/dist/content/url-hardening.d.ts.map +1 -1
- package/dist/content/url-hardening.js +2 -0
- package/dist/controls/actions.d.ts +16 -1
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/enum-filter.d.ts +1 -1
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-context.js +3 -1
- package/dist/controls/filter-set.js +4 -6
- package/dist/controls/form-layout.d.ts +1 -1
- package/dist/controls/form-layout.d.ts.map +1 -1
- package/dist/controls/form-layout.js +1 -1
- package/dist/controls/glyphs.d.ts +0 -2
- package/dist/controls/glyphs.d.ts.map +1 -1
- package/dist/controls/glyphs.js +0 -7
- package/dist/controls/index.d.ts +12 -17
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +5 -39
- package/dist/controls/multi-select-filter.d.ts +4 -3
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.d.ts +4 -3
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +3 -1
- package/dist/controls/range-filter.d.ts +4 -3
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.d.ts +4 -3
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +19 -14
- package/dist/controls/select-filter.d.ts +4 -3
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +12 -15
- package/dist/controls/toggle-filter.d.ts +4 -3
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/uncontrolled.d.ts +12 -0
- package/dist/controls/uncontrolled.d.ts.map +1 -0
- package/dist/controls/view-tabs.d.ts +2 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls-dates/index.d.ts +0 -1
- package/dist/controls-dates/index.d.ts.map +1 -1
- package/dist/dashboard/index.d.ts +7 -9
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -23
- package/dist/dashboard/section.d.ts +4 -6
- package/dist/dashboard/section.d.ts.map +1 -1
- package/dist/dashboard/section.js +4 -10
- package/dist/dashboard/stat-card.d.ts +4 -4
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +3 -3
- package/dist/dashboard/widget-header.module.css +9 -7
- package/dist/dev-dock.d.ts.map +1 -1
- package/dist/dev-dock.js +6 -1
- package/dist/format/date.d.ts +0 -34
- package/dist/format/date.d.ts.map +1 -1
- package/dist/format/date.js +0 -54
- package/dist/format/index.d.ts +7 -22
- package/dist/format/index.d.ts.map +1 -1
- package/dist/format/index.js +2 -43
- package/dist/format/number.d.ts +3 -14
- package/dist/format/number.d.ts.map +1 -1
- package/dist/format/number.js +0 -13
- package/dist/format/shared.d.ts +2 -3
- package/dist/format/shared.d.ts.map +1 -1
- package/dist/forms/index.d.ts +0 -11
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -14
- package/dist/guard/index.d.ts +6 -21
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -115
- package/dist/guard/types.d.ts +7 -18
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +16 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -117
- package/dist/provider/create-router.d.ts +44 -0
- package/dist/provider/create-router.d.ts.map +1 -0
- package/dist/provider/create-router.js +62 -0
- package/dist/provider/hotkeys.d.ts +8 -0
- package/dist/provider/hotkeys.d.ts.map +1 -0
- package/dist/provider/hotkeys.js +50 -0
- package/dist/provider/index.d.ts +33 -110
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +182 -82
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/route-transition.d.ts +76 -0
- package/dist/provider/route-transition.d.ts.map +1 -0
- package/dist/provider/route-transition.js +98 -0
- package/dist/provider/spotlight-actions.d.ts +10 -0
- package/dist/provider/spotlight-actions.d.ts.map +1 -0
- package/dist/provider/spotlight-actions.js +55 -0
- package/dist/provider/test-router.d.ts +6 -0
- package/dist/provider/test-router.d.ts.map +1 -0
- package/dist/provider/test-router.js +18 -0
- package/dist/query-client.d.ts +4 -20
- package/dist/query-client.d.ts.map +1 -1
- package/dist/query-client.js +2 -2
- package/dist/router-tanstack/index.d.ts +18 -64
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +2 -16
- package/dist/router-tanstack/nav.d.ts +12 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/nav.js +8 -1
- package/dist/router-tanstack/search-store.d.ts +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.d.ts +8 -9
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +20 -1
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +1 -1
- package/dist/shell/index.d.ts +31 -10
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +14 -3
- package/dist/shell/page-aside.d.ts +2 -2
- package/dist/shell/page-aside.d.ts.map +1 -1
- package/dist/shell/page-aside.js +31 -12
- package/dist/shell/page-bar.d.ts +2 -2
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +1 -1
- package/dist/state.d.ts +10 -12
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +4 -6
- package/dist/styles.css +107 -7
- package/dist/surfaces.d.ts +28 -103
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +54 -143
- package/dist/{data → table}/data-table-state.d.ts +1 -1
- package/dist/table/data-table-state.d.ts.map +1 -0
- package/dist/{data → table}/data-table-state.js +4 -3
- package/dist/{data → table}/data-table.d.ts +28 -49
- package/dist/table/data-table.d.ts.map +1 -0
- package/dist/{data → table}/data-table.js +74 -60
- package/dist/table/index.d.ts +18 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/{data/table.js → table/index.js} +1 -1
- package/dist/table/query-branch.d.ts.map +1 -0
- package/dist/table/table-features.d.ts +69 -0
- package/dist/table/table-features.d.ts.map +1 -0
- package/dist/table/table-features.js +49 -0
- package/dist/telemetry.d.ts +77 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +33 -0
- package/dist/theme/index.d.ts +10 -21
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -14
- package/dist/theme/theme-toggle.d.ts.map +1 -1
- package/dist/theme/theme-toggle.js +7 -33
- package/dist/theme/theme-toggle.module.css +30 -0
- package/dist/theme/theme-toggle.module.css.d.ts +10 -0
- package/dist/theme-lab/derive-controls.d.ts.map +1 -1
- package/dist/theme-lab/derive-controls.js +5 -3
- package/dist/theme-lab/derive-state.d.ts.map +1 -1
- package/dist/theme-lab/derive-state.js +2 -1
- package/dist/tokens/core.d.ts +360 -0
- package/dist/tokens/core.d.ts.map +1 -0
- package/dist/tokens/core.js +708 -0
- package/dist/tokens/derive.d.ts +1 -1
- package/dist/tokens/derive.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +5 -373
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +8 -700
- package/dist/tokens/palette.d.ts +2 -6
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +1 -4
- package/dist/vite.d.ts +4 -3
- package/dist/vite.d.ts.map +1 -1
- package/llms.txt +43 -85
- package/package.json +80 -173
- package/src/agent/ai-sdk-transport.ts +57 -37
- package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
- package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
- package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
- package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
- package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
- package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
- package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
- package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
- package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
- package/src/agent/error.ts +43 -0
- package/src/agent/history.ts +2 -107
- package/src/agent/id.ts +4 -5
- package/src/agent/index.ts +23 -112
- package/src/agent/outcome.ts +3 -56
- package/src/agent/part-list.tsx +3 -3
- package/src/agent/parts.ts +23 -22
- package/src/agent/run-committer.ts +64 -0
- package/src/agent/run-records.ts +147 -0
- package/src/agent/thread.ts +24 -231
- package/src/agent/transport.ts +6 -96
- package/src/agent/use-agent-thread-runs.ts +364 -199
- package/src/charts/BandStrip.tsx +276 -0
- package/src/charts/Bars.tsx +141 -0
- package/src/charts/CartesianChart.tsx +206 -0
- package/src/charts/ChartCard.tsx +178 -0
- package/src/charts/Donut.tsx +256 -0
- package/src/charts/DualPanel.tsx +326 -0
- package/src/charts/Heatmap.tsx +282 -0
- package/src/charts/Lines.tsx +151 -0
- package/src/charts/MirroredBars.tsx +303 -0
- package/src/charts/Sparkline.tsx +176 -0
- package/src/charts/StackedArea.tsx +80 -0
- package/src/charts/box.tsx +96 -0
- package/src/charts/card-context.ts +11 -0
- package/src/charts/chart-box.module.css +64 -0
- package/src/charts/chart-box.module.css.d.ts +12 -0
- package/src/charts/chart-card.module.css +25 -0
- package/src/charts/chart-card.module.css.d.ts +8 -0
- package/src/charts/chart-legend.module.css +38 -0
- package/src/charts/chart-legend.module.css.d.ts +10 -0
- package/src/charts/compile.ts +585 -0
- package/src/charts/cursor.ts +282 -0
- package/src/charts/curves.ts +111 -0
- package/src/charts/donut.module.css +54 -0
- package/src/charts/donut.module.css.d.ts +9 -0
- package/src/charts/host.tsx +60 -0
- package/src/charts/index.ts +41 -178
- package/src/charts/legend.tsx +204 -0
- package/src/charts/marks.ts +201 -0
- package/src/charts/panel.tsx +227 -0
- package/src/charts/scales.ts +237 -0
- package/src/charts/sizing.ts +47 -0
- package/src/charts/state.tsx +80 -0
- package/src/charts/theme.ts +65 -0
- package/src/charts/types.ts +242 -0
- package/src/cli/audit-allows.ts +8 -30
- package/src/cli/config.ts +26 -43
- package/src/cli/doctor-upgrade.ts +457 -0
- package/src/cli/doctor.ts +89 -72
- package/src/cli/help.ts +2 -4
- package/src/cli/index.ts +100 -384
- package/src/cli/init.ts +60 -51
- package/src/cli/sync.ts +13 -68
- package/src/cli/tokens-css.ts +7 -28
- package/src/commands/ShortcutsHelp.tsx +8 -9
- package/src/commands/define-commands.ts +16 -43
- package/src/commands/define-overlays.ts +12 -36
- package/src/commands/index.ts +11 -94
- package/src/{notifications → commands/notifications}/bell.tsx +2 -2
- package/src/{notifications → commands/notifications}/center.tsx +7 -5
- package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
- package/src/commands/notifications/notify.tsx +158 -0
- package/src/{notifications → commands/notifications}/store.ts +10 -2
- package/src/commands/projectors.ts +5 -225
- package/src/commands/shell-bridge.ts +5 -5
- package/src/commands/shortcut-format.ts +5 -4
- package/src/common/errors.ts +3 -3
- package/src/common/use-measured-widths.ts +6 -3
- package/src/common/validate.ts +2 -2
- package/src/content/article-layout.tsx +37 -38
- package/src/content/article-model.ts +1 -84
- package/src/content/index.ts +12 -83
- package/src/content/markdown.tsx +4 -3
- package/src/content/mermaid.tsx +9 -7
- package/src/content/slug.ts +1 -16
- package/src/content/url-hardening.ts +8 -2
- package/src/controls/actions.tsx +24 -1
- package/src/controls/enum-filter.tsx +1 -1
- package/src/controls/filter-context.tsx +3 -1
- package/src/controls/filter-set.tsx +5 -7
- package/src/controls/form-layout.tsx +2 -2
- package/src/controls/glyphs.tsx +0 -10
- package/src/controls/index.ts +13 -64
- package/src/controls/multi-select-filter.tsx +5 -4
- package/src/controls/number-filter.tsx +8 -4
- package/src/controls/range-filter.tsx +5 -4
- package/src/controls/search-filter.tsx +25 -19
- package/src/controls/select-filter.tsx +5 -4
- package/src/controls/sync-button.tsx +18 -20
- package/src/controls/toggle-filter.tsx +5 -4
- package/src/controls/uncontrolled.ts +12 -0
- package/src/controls/view-tabs.tsx +3 -3
- package/src/controls-dates/date-range-picker.tsx +1 -1
- package/src/controls-dates/index.ts +0 -1
- package/src/dashboard/index.ts +7 -48
- package/src/dashboard/section.tsx +11 -40
- package/src/dashboard/stat-card.tsx +14 -16
- package/src/dashboard/widget-header.module.css +9 -7
- package/src/dev-dock.tsx +14 -27
- package/src/format/date.ts +2 -92
- package/src/format/index.ts +7 -53
- package/src/format/number.ts +3 -26
- package/src/format/shared.ts +2 -3
- package/src/forms/index.ts +0 -23
- package/src/guard/index.ts +36 -191
- package/src/guard/types.ts +6 -19
- package/src/index.ts +30 -282
- package/src/provider/create-router.tsx +138 -0
- package/src/provider/hotkeys.ts +70 -0
- package/src/provider/index.tsx +260 -230
- package/src/provider/lab-theme.ts +3 -2
- package/src/provider/route-transition.ts +199 -0
- package/src/provider/spotlight-actions.tsx +69 -0
- package/src/provider/test-router.tsx +25 -0
- package/src/query-client.ts +4 -22
- package/src/router-tanstack/index.ts +18 -112
- package/src/router-tanstack/nav.ts +28 -2
- package/src/router-tanstack/search-store.ts +9 -2
- package/src/router-tanstack/use-nav.ts +47 -13
- package/src/shell/app-mobile-nav.tsx +3 -2
- package/src/shell/app-sidebar.tsx +1 -1
- package/src/shell/aside-docking.ts +1 -1
- package/src/shell/index.tsx +61 -20
- package/src/shell/page-aside.tsx +47 -23
- package/src/shell/page-bar.tsx +3 -3
- package/src/shell/page-title.tsx +1 -1
- package/src/state.ts +11 -37
- package/src/styles.css +107 -7
- package/src/surfaces.ts +56 -151
- package/src/{data → table}/data-table-state.ts +5 -4
- package/src/{data → table}/data-table.tsx +170 -161
- package/src/table/index.ts +18 -0
- package/src/table/table-features.ts +102 -0
- package/src/telemetry.ts +110 -0
- package/src/theme/index.ts +22 -47
- package/src/theme/theme-toggle.module.css +30 -0
- package/src/theme/theme-toggle.module.css.d.ts +10 -0
- package/src/theme/theme-toggle.tsx +15 -43
- package/src/theme-lab/derive-controls.tsx +5 -3
- package/src/theme-lab/derive-state.ts +2 -1
- package/src/tokens/core.ts +1163 -0
- package/src/tokens/derive.ts +1 -1
- package/src/tokens/index.ts +14 -1181
- package/src/tokens/palette.ts +3 -7
- package/src/vite.ts +3 -3
- package/agent/templates/query-client.ts.tpl +0 -26
- package/dist/agent/adapter.d.ts +0 -150
- package/dist/agent/adapter.d.ts.map +0 -1
- package/dist/agent/adapter.js +0 -482
- package/dist/agent/use-agent-stream.d.ts +0 -35
- package/dist/agent/use-agent-stream.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.js +0 -59
- package/dist/agent-chat/composer.d.ts.map +0 -1
- package/dist/agent-chat/index.d.ts +0 -31
- package/dist/agent-chat/index.d.ts.map +0 -1
- package/dist/agent-chat/index.js +0 -19
- package/dist/agent-chat/message-affordances.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
- package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.js +0 -115
- package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.d.ts.map +0 -1
- package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.d.ts +0 -44
- package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.js +0 -153
- package/dist/agent-chat/tool-chip.d.ts.map +0 -1
- package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.d.ts +0 -75
- package/dist/charts/cursor/resolve.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.js +0 -91
- package/dist/charts/cursor/scope.d.ts +0 -20
- package/dist/charts/cursor/scope.d.ts.map +0 -1
- package/dist/charts/cursor/scope.js +0 -20
- package/dist/charts/cursor/store.d.ts +0 -35
- package/dist/charts/cursor/store.d.ts.map +0 -1
- package/dist/charts/cursor/store.js +0 -25
- package/dist/charts/cursor/touch-pin.d.ts +0 -45
- package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
- package/dist/charts/cursor/touch-pin.js +0 -79
- package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
- package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
- package/dist/charts/hooks/use-discrete-cursor.js +0 -198
- package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
- package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
- package/dist/charts/hooks/use-hysteresis.js +0 -12
- package/dist/charts/hooks/useBandPlot.d.ts +0 -145
- package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
- package/dist/charts/hooks/useBandPlot.js +0 -178
- package/dist/charts/hooks/useChartCursor.d.ts +0 -75
- package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
- package/dist/charts/hooks/useChartCursor.js +0 -200
- package/dist/charts/hooks/useChartSize.d.ts +0 -29
- package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
- package/dist/charts/hooks/useChartSize.js +0 -8
- package/dist/charts/kinds/BandStrip.d.ts +0 -132
- package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.js +0 -241
- package/dist/charts/kinds/Bars.d.ts +0 -141
- package/dist/charts/kinds/Bars.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.js +0 -343
- package/dist/charts/kinds/Donut.d.ts +0 -77
- package/dist/charts/kinds/Donut.d.ts.map +0 -1
- package/dist/charts/kinds/Donut.js +0 -245
- package/dist/charts/kinds/DualPanel.d.ts +0 -111
- package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.js +0 -471
- package/dist/charts/kinds/Heatmap.d.ts +0 -85
- package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
- package/dist/charts/kinds/Heatmap.js +0 -243
- package/dist/charts/kinds/MirroredBars.d.ts +0 -98
- package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.js +0 -292
- package/dist/charts/kinds/MultiLine.d.ts +0 -87
- package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.js +0 -176
- package/dist/charts/kinds/StackedArea.d.ts +0 -73
- package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.js +0 -135
- package/dist/charts/kinds/ZonedLine.d.ts +0 -97
- package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.js +0 -155
- package/dist/charts/kinds/band-chrome.d.ts +0 -31
- package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
- package/dist/charts/kinds/band-chrome.js +0 -71
- package/dist/charts/kinds/donut-layout.d.ts +0 -47
- package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
- package/dist/charts/kinds/donut-layout.js +0 -52
- package/dist/charts/layout/auto-margin.d.ts +0 -122
- package/dist/charts/layout/auto-margin.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.js +0 -81
- package/dist/charts/layout/end-labels.d.ts +0 -64
- package/dist/charts/layout/end-labels.d.ts.map +0 -1
- package/dist/charts/layout/end-labels.js +0 -76
- package/dist/charts/layout/log-ticks.d.ts +0 -27
- package/dist/charts/layout/log-ticks.d.ts.map +0 -1
- package/dist/charts/layout/log-ticks.js +0 -42
- package/dist/charts/primitives/AreaGradient.d.ts +0 -18
- package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
- package/dist/charts/primitives/AreaGradient.js +0 -13
- package/dist/charts/primitives/Axes.d.ts +0 -83
- package/dist/charts/primitives/Axes.d.ts.map +0 -1
- package/dist/charts/primitives/Axes.js +0 -168
- package/dist/charts/primitives/CartesianChart.d.ts +0 -257
- package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.js +0 -549
- package/dist/charts/primitives/ChartCard.d.ts +0 -66
- package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.js +0 -143
- package/dist/charts/primitives/ChartFrame.d.ts +0 -156
- package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.js +0 -241
- package/dist/charts/primitives/ChartLegend.d.ts +0 -67
- package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.js +0 -292
- package/dist/charts/primitives/ChartPending.d.ts +0 -113
- package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
- package/dist/charts/primitives/ChartPending.js +0 -117
- package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
- package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.js +0 -197
- package/dist/charts/primitives/Crosshair.d.ts +0 -26
- package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
- package/dist/charts/primitives/Crosshair.js +0 -23
- package/dist/charts/primitives/HatchPattern.d.ts +0 -31
- package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
- package/dist/charts/primitives/HatchPattern.js +0 -31
- package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
- package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
- package/dist/charts/primitives/HoverOverlay.js +0 -72
- package/dist/charts/primitives/HoverOverlay.module.css +0 -13
- package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/dist/charts/primitives/XZoneRects.d.ts +0 -54
- package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.js +0 -65
- package/dist/charts/primitives/ZoneRects.d.ts +0 -38
- package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/ZoneRects.js +0 -30
- package/dist/charts/primitives/chart-card-context.d.ts +0 -33
- package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
- package/dist/charts/primitives/chart-card-context.js +0 -18
- package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-frame-layout.js +0 -175
- package/dist/charts/primitives/chart-layout.d.ts +0 -112
- package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-layout.js +0 -175
- package/dist/charts/primitives/chart-tier.d.ts +0 -16
- package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
- package/dist/charts/primitives/chart-tier.js +0 -44
- package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
- package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
- package/dist/charts/primitives/legend-disclosure.js +0 -153
- package/dist/charts/series.d.ts +0 -189
- package/dist/charts/series.d.ts.map +0 -1
- package/dist/charts/series.js +0 -84
- package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
- package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/BarSparkline.js +0 -53
- package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
- package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/LineSparkline.js +0 -51
- package/dist/charts/sparklines/index.d.ts +0 -3
- package/dist/charts/sparklines/index.d.ts.map +0 -1
- package/dist/charts/sparklines/index.js +0 -6
- package/dist/charts/utils/domain.d.ts +0 -35
- package/dist/charts/utils/domain.d.ts.map +0 -1
- package/dist/charts/utils/domain.js +0 -12
- package/dist/charts/utils/format.d.ts +0 -8
- package/dist/charts/utils/format.d.ts.map +0 -1
- package/dist/charts/utils/format.js +0 -20
- package/dist/charts/utils/measure-text.d.ts +0 -25
- package/dist/charts/utils/measure-text.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.js +0 -64
- package/dist/charts/utils/ticks.d.ts +0 -103
- package/dist/charts/utils/ticks.d.ts.map +0 -1
- package/dist/charts/utils/ticks.js +0 -92
- package/dist/commands/overlays-mount.d.ts +0 -122
- package/dist/commands/overlays-mount.d.ts.map +0 -1
- package/dist/commands/overlays-mount.js +0 -125
- package/dist/commands/useCommandHotkeys.d.ts +0 -14
- package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
- package/dist/commands/useCommandHotkeys.js +0 -45
- package/dist/content/article-actions.d.ts +0 -39
- package/dist/content/article-actions.d.ts.map +0 -1
- package/dist/content/article-actions.js +0 -28
- package/dist/content/article-card.d.ts +0 -58
- package/dist/content/article-card.d.ts.map +0 -1
- package/dist/content/article-card.js +0 -79
- package/dist/content/article-card.module.css +0 -111
- package/dist/content/mdx.d.ts +0 -20
- package/dist/content/mdx.d.ts.map +0 -1
- package/dist/content/mdx.js +0 -64
- package/dist/controls/compare-filter.d.ts +0 -42
- package/dist/controls/compare-filter.d.ts.map +0 -1
- package/dist/controls/compare-filter.js +0 -38
- package/dist/controls/slider-control.d.ts +0 -36
- package/dist/controls/slider-control.d.ts.map +0 -1
- package/dist/controls/slider-control.js +0 -64
- package/dist/dashboard/widget-grid.d.ts +0 -27
- package/dist/dashboard/widget-grid.d.ts.map +0 -1
- package/dist/dashboard/widget-grid.js +0 -40
- package/dist/dashboard/widget-grid.module.css +0 -69
- package/dist/data/data-table-state.d.ts.map +0 -1
- package/dist/data/data-table.d.ts.map +0 -1
- package/dist/data/query-branch.d.ts.map +0 -1
- package/dist/data/table.d.ts +0 -24
- package/dist/data/table.d.ts.map +0 -1
- package/dist/data/virtual-list.d.ts +0 -133
- package/dist/data/virtual-list.d.ts.map +0 -1
- package/dist/data/virtual-list.js +0 -157
- package/dist/data/virtual.d.ts +0 -21
- package/dist/data/virtual.d.ts.map +0 -1
- package/dist/data/virtual.js +0 -4
- package/dist/forms/FormErrorSummary.d.ts +0 -30
- package/dist/forms/FormErrorSummary.d.ts.map +0 -1
- package/dist/forms/FormErrorSummary.js +0 -30
- package/dist/forms/use-field-array.d.ts +0 -60
- package/dist/forms/use-field-array.d.ts.map +0 -1
- package/dist/forms/use-field-array.js +0 -20
- package/dist/forms/use-form-draft.d.ts +0 -76
- package/dist/forms/use-form-draft.d.ts.map +0 -1
- package/dist/forms/use-form-draft.js +0 -92
- package/dist/forms/use-form-submit.d.ts +0 -88
- package/dist/forms/use-form-submit.d.ts.map +0 -1
- package/dist/forms/use-form-submit.js +0 -63
- package/dist/notifications/bell.d.ts.map +0 -1
- package/dist/notifications/center.d.ts.map +0 -1
- package/dist/notifications/define-notifications.d.ts.map +0 -1
- package/dist/notifications/index.d.ts +0 -40
- package/dist/notifications/index.d.ts.map +0 -1
- package/dist/notifications/index.js +0 -54
- package/dist/notifications/mount-guard.d.ts +0 -8
- package/dist/notifications/mount-guard.d.ts.map +0 -1
- package/dist/notifications/mount-guard.js +0 -18
- package/dist/notifications/notify.d.ts +0 -149
- package/dist/notifications/notify.d.ts.map +0 -1
- package/dist/notifications/notify.js +0 -171
- package/dist/notifications/store.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.d.ts +0 -13
- package/dist/provider/connectivity-indicator.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.js +0 -205
- package/dist/provider/connectivity-provider.d.ts +0 -7
- package/dist/provider/connectivity-provider.d.ts.map +0 -1
- package/dist/provider/connectivity-provider.js +0 -128
- package/dist/provider/connectivity-types.d.ts +0 -36
- package/dist/provider/connectivity-types.d.ts.map +0 -1
- package/dist/provider/use-connectivity.d.ts +0 -3
- package/dist/provider/use-connectivity.d.ts.map +0 -1
- package/dist/provider/use-connectivity.js +0 -14
- package/dist/query-devtools.d.ts +0 -21
- package/dist/query-devtools.d.ts.map +0 -1
- package/dist/query-devtools.js +0 -13
- package/src/agent/adapter.ts +0 -945
- package/src/agent/use-agent-stream.ts +0 -154
- package/src/agent-chat/index.ts +0 -54
- package/src/agent-chat/thread-detail-panel.tsx +0 -201
- package/src/agent-chat/thread-workspace.tsx +0 -279
- package/src/charts/cursor/resolve.ts +0 -198
- package/src/charts/cursor/scope.tsx +0 -35
- package/src/charts/cursor/store.ts +0 -58
- package/src/charts/cursor/touch-pin.ts +0 -138
- package/src/charts/hooks/use-discrete-cursor.ts +0 -335
- package/src/charts/hooks/use-hysteresis.ts +0 -26
- package/src/charts/hooks/useBandPlot.ts +0 -383
- package/src/charts/hooks/useChartCursor.ts +0 -367
- package/src/charts/hooks/useChartSize.ts +0 -35
- package/src/charts/kinds/BandStrip.tsx +0 -449
- package/src/charts/kinds/Bars.tsx +0 -589
- package/src/charts/kinds/Donut.tsx +0 -368
- package/src/charts/kinds/DualPanel.tsx +0 -712
- package/src/charts/kinds/Heatmap.tsx +0 -396
- package/src/charts/kinds/MirroredBars.tsx +0 -469
- package/src/charts/kinds/MultiLine.tsx +0 -322
- package/src/charts/kinds/StackedArea.tsx +0 -267
- package/src/charts/kinds/ZonedLine.tsx +0 -301
- package/src/charts/kinds/band-chrome.tsx +0 -91
- package/src/charts/kinds/donut-layout.ts +0 -82
- package/src/charts/layout/auto-margin.ts +0 -242
- package/src/charts/layout/end-labels.ts +0 -135
- package/src/charts/layout/log-ticks.ts +0 -90
- package/src/charts/primitives/AreaGradient.tsx +0 -26
- package/src/charts/primitives/Axes.tsx +0 -271
- package/src/charts/primitives/CartesianChart.tsx +0 -1002
- package/src/charts/primitives/ChartCard.tsx +0 -280
- package/src/charts/primitives/ChartFrame.tsx +0 -493
- package/src/charts/primitives/ChartLegend.tsx +0 -422
- package/src/charts/primitives/ChartPending.tsx +0 -243
- package/src/charts/primitives/ChartTooltip.tsx +0 -265
- package/src/charts/primitives/Crosshair.tsx +0 -43
- package/src/charts/primitives/HatchPattern.tsx +0 -55
- package/src/charts/primitives/HoverOverlay.module.css +0 -13
- package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/src/charts/primitives/HoverOverlay.tsx +0 -109
- package/src/charts/primitives/XZoneRects.tsx +0 -132
- package/src/charts/primitives/ZoneRects.tsx +0 -67
- package/src/charts/primitives/chart-card-context.ts +0 -46
- package/src/charts/primitives/chart-frame-layout.ts +0 -430
- package/src/charts/primitives/chart-layout.ts +0 -318
- package/src/charts/primitives/chart-tier.tsx +0 -76
- package/src/charts/primitives/legend-disclosure.tsx +0 -178
- package/src/charts/series.ts +0 -276
- package/src/charts/sparklines/BarSparkline.tsx +0 -94
- package/src/charts/sparklines/LineSparkline.tsx +0 -71
- package/src/charts/sparklines/index.ts +0 -2
- package/src/charts/theme.tsx +0 -53
- package/src/charts/utils/domain.ts +0 -41
- package/src/charts/utils/format.ts +0 -19
- package/src/charts/utils/measure-text.ts +0 -109
- package/src/charts/utils/ticks.ts +0 -239
- package/src/commands/overlays-mount.tsx +0 -333
- package/src/commands/useCommandHotkeys.ts +0 -114
- package/src/content/article-actions.ts +0 -72
- package/src/content/article-card.module.css +0 -111
- package/src/content/article-card.tsx +0 -174
- package/src/content/mdx.tsx +0 -127
- package/src/controls/compare-filter.tsx +0 -81
- package/src/controls/slider-control.tsx +0 -159
- package/src/dashboard/widget-grid.module.css +0 -69
- package/src/dashboard/widget-grid.tsx +0 -146
- package/src/data/table.ts +0 -39
- package/src/data/virtual-list.tsx +0 -356
- package/src/data/virtual.ts +0 -26
- package/src/forms/FormErrorSummary.tsx +0 -71
- package/src/forms/use-field-array.ts +0 -94
- package/src/forms/use-form-draft.ts +0 -262
- package/src/forms/use-form-submit.ts +0 -199
- package/src/notifications/index.ts +0 -88
- package/src/notifications/mount-guard.ts +0 -38
- package/src/notifications/notify.tsx +0 -379
- package/src/provider/connectivity-indicator.tsx +0 -267
- package/src/provider/connectivity-provider.tsx +0 -189
- package/src/provider/connectivity-types.ts +0 -42
- package/src/provider/use-connectivity.ts +0 -26
- package/src/query-devtools.tsx +0 -40
- /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
- /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
- /package/dist/{notifications → commands/notifications}/bell.js +0 -0
- /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
- /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
- /package/dist/{data → table}/data-table.module.css +0 -0
- /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
- /package/dist/{data → table}/query-branch.d.ts +0 -0
- /package/dist/{data → table}/query-branch.js +0 -0
- /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
- /package/src/{data → table}/data-table.module.css +0 -0
- /package/src/{data → table}/data-table.module.css.d.ts +0 -0
- /package/src/{data → table}/query-branch.ts +0 -0
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useAgentStream — React hook managing the full lifecycle of a streaming agent conversation turn.
|
|
3
|
-
*
|
|
4
|
-
* Accepts an injected AgentTransport and returns reactive state (parts, status, error) plus
|
|
5
|
-
* control handlers (send, stop, regenerate). AbortController integration enables clean
|
|
6
|
-
* mid-stream cancellation. SSR-safe — no window access at module or hook top level.
|
|
7
|
-
*
|
|
8
|
-
* Rules of hooks are satisfied: all hooks are called unconditionally at the top level of the
|
|
9
|
-
* returned function; no conditional hook invocations.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* import { useAgentStream, edenTransport, type AgentPart } from 'basalt-ui/agent'
|
|
13
|
-
*
|
|
14
|
-
* const transport = edenTransport<AgentPart>((input, signal) =>
|
|
15
|
-
* api.chat.post({ body: { message: input }, fetch: { signal } }),
|
|
16
|
-
* )
|
|
17
|
-
*
|
|
18
|
-
* function ChatPanel() {
|
|
19
|
-
* const { parts, status, send, stop, regenerate } = useAgentStream({ transport })
|
|
20
|
-
* return (
|
|
21
|
-
* <div>
|
|
22
|
-
* <PartList parts={parts} />
|
|
23
|
-
* {status === 'streaming' && <button onClick={stop}>Stop</button>}
|
|
24
|
-
* <button onClick={() => send('Hello')}>Send</button>
|
|
25
|
-
* </div>
|
|
26
|
-
* )
|
|
27
|
-
* }
|
|
28
|
-
*/
|
|
29
|
-
import { useCallback, useEffect, useRef, useState } from 'react'
|
|
30
|
-
import { mintThreadId, withPartIds } from './id'
|
|
31
|
-
import { isStartPart } from './parts'
|
|
32
|
-
import { mergePart } from './merge'
|
|
33
|
-
import type { PartLike } from './merge'
|
|
34
|
-
import type { AgentPart } from './parts'
|
|
35
|
-
import type { AgentTransport } from './transport'
|
|
36
|
-
|
|
37
|
-
// ── StreamStatus ──────────────────────────────────────────────────────────────
|
|
38
|
-
|
|
39
|
-
/** The lifecycle state of the current stream. */
|
|
40
|
-
export type StreamStatus = 'idle' | 'streaming' | 'done' | 'error'
|
|
41
|
-
|
|
42
|
-
// ── useAgentStream return type ────────────────────────────────────────────────
|
|
43
|
-
|
|
44
|
-
export type UseAgentStreamReturn<TPart, TInput> = {
|
|
45
|
-
/** Accumulated parts from the current (or last completed) stream. */
|
|
46
|
-
readonly parts: TPart[]
|
|
47
|
-
/** Current lifecycle status. */
|
|
48
|
-
readonly status: StreamStatus
|
|
49
|
-
/** The error thrown during the last failed stream, or undefined. */
|
|
50
|
-
readonly error: unknown
|
|
51
|
-
/**
|
|
52
|
-
* Start a new stream for the given input. Resets parts and status, aborts any in-flight stream,
|
|
53
|
-
* and accumulates new parts as they arrive.
|
|
54
|
-
*/
|
|
55
|
-
readonly send: (input: TInput) => Promise<void>
|
|
56
|
-
/** Abort the in-flight stream (no-op when idle or done). */
|
|
57
|
-
readonly stop: () => void
|
|
58
|
-
/** Re-run the last input. No-op if no input has been sent yet. */
|
|
59
|
-
readonly regenerate: () => Promise<void>
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// ── useAgentStream ────────────────────────────────────────────────────────────
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Manages a single streaming agent turn over an injected {@link AgentTransport}.
|
|
66
|
-
*
|
|
67
|
-
* @example
|
|
68
|
-
* const { parts, status, send, stop } = useAgentStream({ transport: myTransport })
|
|
69
|
-
* await send('What is the capital of France?')
|
|
70
|
-
* // parts accumulates as the stream arrives
|
|
71
|
-
* // status: 'idle' → 'streaming' → 'done' (or 'error')
|
|
72
|
-
*/
|
|
73
|
-
export function useAgentStream<TPart extends PartLike = AgentPart, TInput = string>({
|
|
74
|
-
transport,
|
|
75
|
-
}: {
|
|
76
|
-
transport: AgentTransport<TPart, TInput>
|
|
77
|
-
}): UseAgentStreamReturn<TPart, TInput> {
|
|
78
|
-
const [parts, setParts] = useState<TPart[]>([])
|
|
79
|
-
const [status, setStatus] = useState<StreamStatus>('idle')
|
|
80
|
-
const [error, setError] = useState<unknown>(undefined)
|
|
81
|
-
|
|
82
|
-
// Refs: mutable per-render state that must not trigger re-renders.
|
|
83
|
-
const controllerRef = useRef<AbortController | null>(null)
|
|
84
|
-
const lastInputRef = useRef<TInput | undefined>(undefined)
|
|
85
|
-
|
|
86
|
-
// Abort any in-flight stream on unmount to stop the async generator.
|
|
87
|
-
useEffect(
|
|
88
|
-
() => () => {
|
|
89
|
-
controllerRef.current?.abort()
|
|
90
|
-
},
|
|
91
|
-
[],
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
const send = useCallback(
|
|
95
|
-
async (input: TInput): Promise<void> => {
|
|
96
|
-
// Abort any in-flight stream.
|
|
97
|
-
controllerRef.current?.abort()
|
|
98
|
-
const controller = new AbortController()
|
|
99
|
-
controllerRef.current = controller
|
|
100
|
-
|
|
101
|
-
lastInputRef.current = input
|
|
102
|
-
setParts([])
|
|
103
|
-
setError(undefined)
|
|
104
|
-
setStatus('streaming')
|
|
105
|
-
|
|
106
|
-
// Per-send namespace: this hook has no thread/session id to key off, and each send() call
|
|
107
|
-
// fully resets `parts` anyway, so a fresh id per call is enough to keep two id-less drafts
|
|
108
|
-
// ARRIVING WITHIN THE SAME SEND from colliding on `undefined === undefined` in mergePart (the
|
|
109
|
-
// F1 bug — text→tool→text destroying each other). Not a replay mechanism — this hook has no
|
|
110
|
-
// resume() path — see withPartIds' own doc for why it can't be one anyway. Low collision
|
|
111
|
-
// cost (this hook persists nothing — `parts` is discarded on the next send()/unmount), so
|
|
112
|
-
// `mintThreadId` — never `mintMessageId` — is the right rung-3 behavior here: this must not
|
|
113
|
-
// throw on a host with no usable crypto at all.
|
|
114
|
-
const runId = mintThreadId()
|
|
115
|
-
|
|
116
|
-
try {
|
|
117
|
-
for await (const part of withPartIds(runId, transport.stream(input, controller.signal))) {
|
|
118
|
-
// Guard: if a newer send() has superseded this stream, stop updating state.
|
|
119
|
-
if (controllerRef.current !== controller) return
|
|
120
|
-
if (controller.signal.aborted) break
|
|
121
|
-
// StartPart is a no-op signal (run id + resume token), not renderable content — this
|
|
122
|
-
// hook has no persistence layer to resume across, so just skip it.
|
|
123
|
-
if (isStartPart(part)) continue
|
|
124
|
-
setParts((prev) => mergePart(prev, part))
|
|
125
|
-
}
|
|
126
|
-
// Only mark done if this stream is still the current one and wasn't aborted.
|
|
127
|
-
if (controllerRef.current === controller && !controller.signal.aborted) setStatus('done')
|
|
128
|
-
} catch (err) {
|
|
129
|
-
// Ignore abort errors — they are intentional (stop() was called or superseded).
|
|
130
|
-
if (err instanceof Error && err.name === 'AbortError') return
|
|
131
|
-
// Guard: don't corrupt state if a newer stream has taken over.
|
|
132
|
-
if (controllerRef.current !== controller) return
|
|
133
|
-
// Guard: don't overwrite a user-cancelled 'done' if the signal was aborted (e.g. stop()
|
|
134
|
-
// aborted the controller before a non-AbortError propagated from the transport).
|
|
135
|
-
if (controller.signal.aborted) return
|
|
136
|
-
setError(err)
|
|
137
|
-
setStatus('error')
|
|
138
|
-
}
|
|
139
|
-
},
|
|
140
|
-
[transport],
|
|
141
|
-
)
|
|
142
|
-
|
|
143
|
-
const stop = useCallback((): void => {
|
|
144
|
-
controllerRef.current?.abort()
|
|
145
|
-
setStatus('done')
|
|
146
|
-
}, [])
|
|
147
|
-
|
|
148
|
-
const regenerate = useCallback(async (): Promise<void> => {
|
|
149
|
-
if (lastInputRef.current === undefined) return
|
|
150
|
-
await send(lastInputRef.current)
|
|
151
|
-
}, [send])
|
|
152
|
-
|
|
153
|
-
return { parts, status, error, send, stop, regenerate }
|
|
154
|
-
}
|
package/src/agent-chat/index.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mantine-styled thread-chat components over the headless `basalt-ui/agent` layer, capped by the
|
|
3
|
-
* flagship `ThreadWorkspace` composite.
|
|
4
|
-
*
|
|
5
|
-
* This module is Mantine-coupled by design and ships its own `basalt-ui/agent-chat` subpath
|
|
6
|
-
* (also re-exported from the root entry, unchanged for existing consumers) — unlike
|
|
7
|
-
* `basalt-ui/agent`, which stays headless so it can be styled by any consumer.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* import { ThreadWorkspace } from 'basalt-ui/agent-chat'
|
|
11
|
-
* import { createThreadsStore, edenTransport, heuristicOutcome } from 'basalt-ui/agent'
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
// ── ThreadWorkspace (flagship composite) ──────────────────────────────────────
|
|
15
|
-
export { ThreadWorkspace } from './thread-workspace'
|
|
16
|
-
export type { ThreadWorkspaceProps } from './thread-workspace'
|
|
17
|
-
|
|
18
|
-
// ── ThreadFeed ────────────────────────────────────────────────────────────────
|
|
19
|
-
export { ThreadFeed } from './thread-feed'
|
|
20
|
-
export type { ThreadFeedProps } from './thread-feed'
|
|
21
|
-
|
|
22
|
-
// ── ThreadFeedRow ─────────────────────────────────────────────────────────────
|
|
23
|
-
export { ThreadFeedRow } from './thread-feed-row'
|
|
24
|
-
export type { ThreadFeedRowProps } from './thread-feed-row'
|
|
25
|
-
|
|
26
|
-
// ── Shared transcript/row contracts ───────────────────────────────────────────
|
|
27
|
-
// Type-only. Both are named in the PUBLIC props of components exported above
|
|
28
|
-
// (`ThreadTranscriptProps.affordances`, `ThreadFeedRowProps`'s height union), so a consumer that
|
|
29
|
-
// wants to hold one in a typed variable needs to be able to name it. No runtime export here — the
|
|
30
|
-
// resolution/defaults live inside the components. `RowHeightProps` (B3) is `ThreadFeedRow`'s OWN
|
|
31
|
-
// height contract — a superset of `VirtualizeProps` that also allows `height` without
|
|
32
|
-
// `virtualize` — kept alongside it for the same reason.
|
|
33
|
-
export type { MessageAffordances } from './message-affordances'
|
|
34
|
-
export type { RowHeightProps, VirtualizeOptions, VirtualizeProps } from './virtualize'
|
|
35
|
-
|
|
36
|
-
// ── ThreadOutcomeCard ─────────────────────────────────────────────────────────
|
|
37
|
-
export { ThreadOutcomeCard } from './thread-outcome-card'
|
|
38
|
-
export type { ThreadOutcomeCardProps } from './thread-outcome-card'
|
|
39
|
-
|
|
40
|
-
// ── ThreadDetailPanel ─────────────────────────────────────────────────────────
|
|
41
|
-
export { ThreadDetailPanel } from './thread-detail-panel'
|
|
42
|
-
export type { ThreadDetailPanelProps } from './thread-detail-panel'
|
|
43
|
-
|
|
44
|
-
// ── Composer ──────────────────────────────────────────────────────────────────
|
|
45
|
-
export { Composer } from './composer'
|
|
46
|
-
export type { ComposerAttachment, ComposerHandle, ComposerProps, ComposerSubmit } from './composer'
|
|
47
|
-
|
|
48
|
-
// ── threadPartRenderers + ThreadTranscript ────────────────────────────────────
|
|
49
|
-
export { threadPartRenderers, ThreadTranscript } from './thread-message'
|
|
50
|
-
export type { ThreadTranscriptProps } from './thread-message'
|
|
51
|
-
|
|
52
|
-
// ── ToolChip ──────────────────────────────────────────────────────────────────
|
|
53
|
-
export { ToolChip } from './tool-chip'
|
|
54
|
-
export type { ToolChipProps } from './tool-chip'
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ThreadDetailPanel — the right-hand pane rendering one open thread's transcript + composer.
|
|
3
|
-
*
|
|
4
|
-
* A plain pane (Box), NOT a Modal — the feed/detail split reads via the `divider` token rather
|
|
5
|
-
* than a card border (docs/DESIGN-SPEC.md §5); the composite that wires this up owns responsive
|
|
6
|
-
* collapse/layout decisions. The header shares a `layoutId` (thread.id) with `ThreadOutcomeCard`
|
|
7
|
-
* so opening a thread reads as one continuous shared-element FLIP transition rather than a swap.
|
|
8
|
-
* Pure and prop-driven: no store, no fetching — `onSend`/`onStop`/`onClose`/`onRetry` are the
|
|
9
|
-
* only seams.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* import { ThreadDetailPanel } from 'basalt-ui'
|
|
13
|
-
*
|
|
14
|
-
* <ThreadDetailPanel
|
|
15
|
-
* thread={activeThread}
|
|
16
|
-
* liveParts={liveParts}
|
|
17
|
-
* runStatus={runStatus}
|
|
18
|
-
* onSend={send}
|
|
19
|
-
* onStop={stop}
|
|
20
|
-
* onClose={() => select(null)}
|
|
21
|
-
* />
|
|
22
|
-
*/
|
|
23
|
-
import { ActionIcon, Alert, Box, Button, Divider, Flex, Stack, Text } from '@mantine/core'
|
|
24
|
-
import { useReducedMotion } from '@mantine/hooks'
|
|
25
|
-
import { motion } from 'motion/react'
|
|
26
|
-
import type { JSX } from 'react'
|
|
27
|
-
import type { AgentPart, AgentThread, StreamStatus } from '../agent'
|
|
28
|
-
import { BasaltStickToBottom } from '../agent'
|
|
29
|
-
import { cx } from '../common/props'
|
|
30
|
-
import type { BasaltProps } from '../common/props'
|
|
31
|
-
import { MOTION_SPRING } from '../common/motion'
|
|
32
|
-
import { Composer } from './composer'
|
|
33
|
-
import { ThreadTranscript } from './thread-message'
|
|
34
|
-
import { VX } from '../tokens'
|
|
35
|
-
|
|
36
|
-
function CloseGlyph(): JSX.Element {
|
|
37
|
-
return (
|
|
38
|
-
<svg width={16} height={16} viewBox="0 0 24 24" fill="none" aria-hidden>
|
|
39
|
-
<path
|
|
40
|
-
d="M18 6l-12 12M6 6l12 12"
|
|
41
|
-
stroke="currentColor"
|
|
42
|
-
strokeWidth={2}
|
|
43
|
-
strokeLinecap="round"
|
|
44
|
-
strokeLinejoin="round"
|
|
45
|
-
/>
|
|
46
|
-
</svg>
|
|
47
|
-
)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function EmptyPanel({ className, style }: BasaltProps): JSX.Element {
|
|
51
|
-
return (
|
|
52
|
-
<Box p="xl" className={cx(className)} style={{ height: '100%', ...style }}>
|
|
53
|
-
<Stack align="center" justify="center" gap={4} h="100%">
|
|
54
|
-
<Text fw={550} style={{ fontFamily: 'var(--basalt-font-head)', fontStretch: '88%' }}>
|
|
55
|
-
No thread selected
|
|
56
|
-
</Text>
|
|
57
|
-
<Text size="sm" c="dimmed" ta="center">
|
|
58
|
-
Pick a thread from the feed to see its transcript.
|
|
59
|
-
</Text>
|
|
60
|
-
</Stack>
|
|
61
|
-
</Box>
|
|
62
|
-
)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** The header label for an open thread: its resolved outcome title, else its opening prompt. */
|
|
66
|
-
function threadLabel(thread: AgentThread): string {
|
|
67
|
-
if (thread.outcome !== null && thread.outcome.title.length > 0) return thread.outcome.title
|
|
68
|
-
const firstUser = thread.messages.find((message) => message.role === 'user')
|
|
69
|
-
if (firstUser === undefined) return 'Untitled'
|
|
70
|
-
const text = firstUser.parts
|
|
71
|
-
.filter((part): part is Extract<AgentPart, { type: 'text' }> => part.type === 'text')
|
|
72
|
-
.map((part) => part.text)
|
|
73
|
-
.join('')
|
|
74
|
-
.trim()
|
|
75
|
-
return text.length > 0 ? text : 'Untitled'
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export type ThreadDetailPanelProps = BasaltProps & {
|
|
79
|
-
/** The open thread, or null when nothing is selected (renders an empty-state hint). */
|
|
80
|
-
readonly thread: AgentThread | null
|
|
81
|
-
/** The live (in-flight) assistant turn's parts for this thread, if a run is streaming. */
|
|
82
|
-
readonly liveParts?: AgentPart[]
|
|
83
|
-
/** The live run's status — gates the composer and shows the Stop action while streaming. */
|
|
84
|
-
readonly runStatus?: StreamStatus
|
|
85
|
-
readonly onSend: (text: string) => void
|
|
86
|
-
readonly onStop: () => void
|
|
87
|
-
readonly onClose: () => void
|
|
88
|
-
/**
|
|
89
|
-
* Replay the last user input on this thread. When provided, a "Retry" action appears in the
|
|
90
|
-
* failed-run alert; omit it to render the alert without a retry affordance.
|
|
91
|
-
*/
|
|
92
|
-
readonly onRetry?: () => void
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* The detail pane for one open thread: header (title + close), transcript body in an
|
|
97
|
-
* auto-scrolling container, and a footer composer (with a Stop action while streaming).
|
|
98
|
-
*
|
|
99
|
-
* @example
|
|
100
|
-
* <ThreadDetailPanel thread={thread} runStatus={runStatus} onSend={send} onStop={stop} onClose={close} />
|
|
101
|
-
*/
|
|
102
|
-
export function ThreadDetailPanel({
|
|
103
|
-
thread,
|
|
104
|
-
liveParts,
|
|
105
|
-
runStatus,
|
|
106
|
-
onSend,
|
|
107
|
-
onStop,
|
|
108
|
-
onClose,
|
|
109
|
-
onRetry,
|
|
110
|
-
className,
|
|
111
|
-
style,
|
|
112
|
-
}: ThreadDetailPanelProps): JSX.Element {
|
|
113
|
-
const reduceMotion = useReducedMotion()
|
|
114
|
-
|
|
115
|
-
if (thread === null) return <EmptyPanel className={className} style={style} />
|
|
116
|
-
|
|
117
|
-
const streaming = runStatus === 'streaming'
|
|
118
|
-
|
|
119
|
-
const panel = (
|
|
120
|
-
<Flex direction="column" h="100%" className={cx(className)} style={style}>
|
|
121
|
-
<Flex p="sm" align="center" justify="space-between">
|
|
122
|
-
<Text
|
|
123
|
-
fw={550}
|
|
124
|
-
lineClamp={1}
|
|
125
|
-
style={{
|
|
126
|
-
fontFamily: 'var(--basalt-font-head)',
|
|
127
|
-
fontSize: VX.text.md,
|
|
128
|
-
fontStretch: '88%',
|
|
129
|
-
}}
|
|
130
|
-
>
|
|
131
|
-
{threadLabel(thread)}
|
|
132
|
-
</Text>
|
|
133
|
-
<ActionIcon variant="subtle" color="gray" onClick={onClose} aria-label="Close thread">
|
|
134
|
-
<CloseGlyph />
|
|
135
|
-
</ActionIcon>
|
|
136
|
-
</Flex>
|
|
137
|
-
<Divider color="var(--vx-divider)" />
|
|
138
|
-
<Box style={{ flex: 1, minHeight: 0 }}>
|
|
139
|
-
<BasaltStickToBottom
|
|
140
|
-
style={{
|
|
141
|
-
height: '100%',
|
|
142
|
-
// theme-allow raw-scroll-container — BasaltStickToBottom owns this scroll node (see stick-to-bottom.tsx).
|
|
143
|
-
overflowY: 'auto',
|
|
144
|
-
padding: 'var(--vx-space-agent-transcript-inset)',
|
|
145
|
-
}}
|
|
146
|
-
>
|
|
147
|
-
<ThreadTranscript
|
|
148
|
-
messages={thread.messages}
|
|
149
|
-
{...(liveParts !== undefined ? { liveParts } : {})}
|
|
150
|
-
{...(runStatus !== undefined ? { liveStatus: runStatus } : {})}
|
|
151
|
-
/>
|
|
152
|
-
{thread.status === 'error' && (
|
|
153
|
-
<Alert color="red" variant="light" mt="md">
|
|
154
|
-
<Stack gap="xs" align="flex-start">
|
|
155
|
-
<Text size="sm">This run didn’t finish. Try sending the message again.</Text>
|
|
156
|
-
{onRetry !== undefined && (
|
|
157
|
-
<Button size="compact-sm" variant="light" color="red" onClick={onRetry}>
|
|
158
|
-
Retry
|
|
159
|
-
</Button>
|
|
160
|
-
)}
|
|
161
|
-
</Stack>
|
|
162
|
-
</Alert>
|
|
163
|
-
)}
|
|
164
|
-
{thread.status === 'interrupted' && (
|
|
165
|
-
<Alert color="yellow" variant="light" mt="md">
|
|
166
|
-
Interrupted — resend to continue.
|
|
167
|
-
</Alert>
|
|
168
|
-
)}
|
|
169
|
-
</BasaltStickToBottom>
|
|
170
|
-
</Box>
|
|
171
|
-
<Divider color="var(--vx-divider)" />
|
|
172
|
-
<Box p="sm">
|
|
173
|
-
<Stack gap="xs">
|
|
174
|
-
{/* `onSend` stays a plain string at this component's public seam — the payload shape is
|
|
175
|
-
unwrapped here rather than pushed onto every caller. */}
|
|
176
|
-
<Composer onSubmit={({ text }) => onSend(text)} streaming={streaming} />
|
|
177
|
-
{streaming && (
|
|
178
|
-
<Button size="compact-sm" variant="subtle" color="red" onClick={onStop}>
|
|
179
|
-
Stop
|
|
180
|
-
</Button>
|
|
181
|
-
)}
|
|
182
|
-
</Stack>
|
|
183
|
-
</Box>
|
|
184
|
-
</Flex>
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
if (reduceMotion) return panel
|
|
188
|
-
|
|
189
|
-
// Keyed by thread.id so opening/switching threads re-mounts and slides the new content in.
|
|
190
|
-
return (
|
|
191
|
-
<motion.div
|
|
192
|
-
key={thread.id}
|
|
193
|
-
initial={{ opacity: 0, x: 12 }}
|
|
194
|
-
animate={{ opacity: 1, x: 0 }}
|
|
195
|
-
transition={MOTION_SPRING}
|
|
196
|
-
style={{ height: '100%' }}
|
|
197
|
-
>
|
|
198
|
-
{panel}
|
|
199
|
-
</motion.div>
|
|
200
|
-
)
|
|
201
|
-
}
|
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ThreadWorkspace — the flagship, ready-to-use two-pane thread-chat composite.
|
|
3
|
-
*
|
|
4
|
-
* Composes `ThreadFeed` + a new-thread `Composer` (left/main pane) with `ThreadDetailPanel`
|
|
5
|
-
* (right pane) over `useAgentThreadRuns`, so a consumer wires one component instead of hand-
|
|
6
|
-
* assembling the pieces. Responsive: wide viewports show both panes side by side; narrow
|
|
7
|
-
* viewports (the `compact` size class, < 840px) show exactly one — the feed when no thread is open, a full-screen
|
|
8
|
-
* detail panel once one is.
|
|
9
|
-
*
|
|
10
|
-
* `useThreads` is a prop, not called internally, because `createThreadsStore` must be invoked
|
|
11
|
-
* ONCE at module scope (see the doctrine on `createThreadsStore` in `../agent`) — the consumer
|
|
12
|
-
* owns that module-scope call and passes the resulting hook in here.
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* import { ThreadWorkspace } from 'basalt-ui'
|
|
16
|
-
* import { createThreadsStore, edenTransport, heuristicOutcome } from 'basalt-ui/agent'
|
|
17
|
-
*
|
|
18
|
-
* // Module scope — called ONCE:
|
|
19
|
-
* const useThreads = createThreadsStore({ key: 'main-threads', version: 1 })
|
|
20
|
-
* const transport = edenTransport((input, signal) =>
|
|
21
|
-
* api.chat.post({ body: { message: input }, fetch: { signal } }),
|
|
22
|
-
* )
|
|
23
|
-
*
|
|
24
|
-
* function Inbox() {
|
|
25
|
-
* return (
|
|
26
|
-
* <ThreadWorkspace
|
|
27
|
-
* useThreads={useThreads}
|
|
28
|
-
* transport={transport}
|
|
29
|
-
* resolveOutcome={heuristicOutcome}
|
|
30
|
-
* newThreadPlaceholder="Start a new conversation…"
|
|
31
|
-
* />
|
|
32
|
-
* )
|
|
33
|
-
* }
|
|
34
|
-
*/
|
|
35
|
-
import { Box, Divider, Flex, Skeleton, Stack, Text } from '@mantine/core'
|
|
36
|
-
import type { JSX, ReactNode } from 'react'
|
|
37
|
-
import type { AgentPart, AgentTransport, OutcomeResolver, ThreadsStore } from '../agent'
|
|
38
|
-
import { useAgentThreadRuns } from '../agent'
|
|
39
|
-
import { cx } from '../common/props'
|
|
40
|
-
import type { BasaltProps, SlotStylesProps } from '../common/props'
|
|
41
|
-
import { assertRequiredProps } from '../common/validate'
|
|
42
|
-
import { useSizeClass } from '../shell/use-size-class'
|
|
43
|
-
import { VX } from '../tokens'
|
|
44
|
-
import { Composer } from './composer'
|
|
45
|
-
import { ThreadDetailPanel } from './thread-detail-panel'
|
|
46
|
-
import { ThreadFeed } from './thread-feed'
|
|
47
|
-
|
|
48
|
-
const DETAIL_PANEL_WIDTH = 'clamp(440px, 40%, 520px)'
|
|
49
|
-
|
|
50
|
-
// Static across every instance, so it stays a module-level constant rather than a per-render
|
|
51
|
-
// literal, letting the no-override case keep a stable reference.
|
|
52
|
-
const FULL_HEIGHT_STYLE = { height: '100%' } as const
|
|
53
|
-
|
|
54
|
-
/** The four boxes `ThreadWorkspace` paints: `root` is the outermost pane split, `feed` is the
|
|
55
|
-
* thread-list pane, `composer` is the new-thread composer pinned under the feed, `detail` is the
|
|
56
|
-
* right-hand (or, in the `compact` size class, full-screen) open-thread pane. */
|
|
57
|
-
export type ThreadWorkspaceSlot = 'root' | 'feed' | 'composer' | 'detail'
|
|
58
|
-
|
|
59
|
-
export type ThreadWorkspaceProps = BasaltProps &
|
|
60
|
-
SlotStylesProps<ThreadWorkspaceSlot> & {
|
|
61
|
-
/**
|
|
62
|
-
* The thread-store hook, created ONCE at module scope via `createThreadsStore` and passed in —
|
|
63
|
-
* ThreadWorkspace must not call `createThreadsStore` itself.
|
|
64
|
-
*/
|
|
65
|
-
readonly useThreads: () => ThreadsStore
|
|
66
|
-
/** The injected transport seam — one stream per `start()` call. */
|
|
67
|
-
readonly transport: AgentTransport<AgentPart, string>
|
|
68
|
-
/** Distills a finished thread into a feed-ready `AgentOutcome`. */
|
|
69
|
-
readonly resolveOutcome: OutcomeResolver<AgentPart>
|
|
70
|
-
/** Placeholder for the new-thread composer pinned under the feed. */
|
|
71
|
-
readonly newThreadPlaceholder?: string
|
|
72
|
-
/**
|
|
73
|
-
* Rendered in place of the feed once the store is hydrated and there really are no threads.
|
|
74
|
-
* Shown ONLY when `store.hydrated` is true — while an async store's initial load is still in
|
|
75
|
-
* flight, `ThreadWorkspace` holds a neutral loading state instead (see `FeedHydratingState`),
|
|
76
|
-
* so a server-backed workspace never asserts "no threads yet" before it actually knows that.
|
|
77
|
-
*/
|
|
78
|
-
readonly emptyState?: ReactNode
|
|
79
|
-
/**
|
|
80
|
-
* Rendered in place of the feed when the store's initial load has failed — `!store.hydrated &&
|
|
81
|
-
* store.error !== undefined` (see `ThreadsStore.hydrated`'s doc for the discriminant). Shown
|
|
82
|
-
* instead of `FeedHydratingState`, so a rejected `listThreads` surfaces a legible failure rather
|
|
83
|
-
* than an endless skeleton.
|
|
84
|
-
*/
|
|
85
|
-
readonly errorState?: ReactNode
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/** Default hint shown in the feed pane once hydrated with no threads (overridable via `emptyState`). */
|
|
89
|
-
function FeedEmptyState(): JSX.Element {
|
|
90
|
-
return (
|
|
91
|
-
<Stack align="center" justify="center" gap={4} h="100%" p="xl">
|
|
92
|
-
<Text fw={600} size="sm">
|
|
93
|
-
No threads yet
|
|
94
|
-
</Text>
|
|
95
|
-
<Text size="xs" c="dimmed" ta="center">
|
|
96
|
-
Send a message below to start your first thread.
|
|
97
|
-
</Text>
|
|
98
|
-
</Stack>
|
|
99
|
-
)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Neutral hold shown in the feed pane while an async store's initial `listThreads` is still in
|
|
104
|
-
* flight, has no threads to show yet, AND has not failed (`!store.hydrated && threads.length ===
|
|
105
|
-
* 0 && store.error === undefined`). Never shown for the synchronous `createThreadsStore`, whose
|
|
106
|
-
* `hydrated` is always `true` — see `ThreadsStore.hydrated`'s doc. A store that already holds
|
|
107
|
-
* cached threads while revalidating (`!hydrated` with a non-empty `threads`) skips this entirely
|
|
108
|
-
* and renders the feed normally. A failed load renders `FeedErrorState` instead of this.
|
|
109
|
-
*/
|
|
110
|
-
function FeedHydratingState(): JSX.Element {
|
|
111
|
-
return (
|
|
112
|
-
<Stack gap="sm" p="sm" data-testid="thread-workspace-hydrating">
|
|
113
|
-
<Skeleton height={54} radius="sm" />
|
|
114
|
-
<Skeleton height={54} radius="sm" />
|
|
115
|
-
<Skeleton height={54} radius="sm" />
|
|
116
|
-
</Stack>
|
|
117
|
-
)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Default failure hold shown in the feed pane when an async store's initial `listThreads` has
|
|
122
|
-
* rejected (`!store.hydrated && store.error !== undefined`), overridable via `errorState`. Never
|
|
123
|
-
* shown for the synchronous `createThreadsStore`, whose `error` is always `undefined` — see
|
|
124
|
-
* `ThreadsStore.error`'s doc.
|
|
125
|
-
*/
|
|
126
|
-
function FeedErrorState(): JSX.Element {
|
|
127
|
-
return (
|
|
128
|
-
<Stack
|
|
129
|
-
align="center"
|
|
130
|
-
justify="center"
|
|
131
|
-
gap={4}
|
|
132
|
-
h="100%"
|
|
133
|
-
p="xl"
|
|
134
|
-
data-testid="thread-workspace-error"
|
|
135
|
-
>
|
|
136
|
-
<Text fw={600} size="sm" style={{ color: VX.status.bad }}>
|
|
137
|
-
Couldn't load threads
|
|
138
|
-
</Text>
|
|
139
|
-
<Text size="xs" c="dimmed" ta="center">
|
|
140
|
-
Something went wrong loading your threads. Try refreshing the page.
|
|
141
|
-
</Text>
|
|
142
|
-
</Stack>
|
|
143
|
-
)
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* A two-pane master-detail thread workspace: a scrollable feed of threads with an anchored
|
|
148
|
-
* new-thread composer, and a detail panel for the open thread's live transcript. Collapses to a
|
|
149
|
-
* single pane in the `compact` size class (< 840px).
|
|
150
|
-
*
|
|
151
|
-
* @example
|
|
152
|
-
* <ThreadWorkspace useThreads={useThreads} transport={transport} resolveOutcome={heuristicOutcome} />
|
|
153
|
-
*/
|
|
154
|
-
export function ThreadWorkspace({
|
|
155
|
-
useThreads,
|
|
156
|
-
transport,
|
|
157
|
-
resolveOutcome,
|
|
158
|
-
newThreadPlaceholder,
|
|
159
|
-
emptyState,
|
|
160
|
-
errorState,
|
|
161
|
-
className,
|
|
162
|
-
style,
|
|
163
|
-
classNames,
|
|
164
|
-
}: ThreadWorkspaceProps): JSX.Element {
|
|
165
|
-
assertRequiredProps('ThreadWorkspace', { useThreads }, ['useThreads'])
|
|
166
|
-
const store = useThreads()
|
|
167
|
-
const runs = useAgentThreadRuns({ transport, store, resolveOutcome })
|
|
168
|
-
// Narrow = the compact size class — the same viewport axis as the shell, and SSR/first-frame
|
|
169
|
-
// correct (the provider's `sizeClassHint` is the server snapshot, no post-mount flip).
|
|
170
|
-
const narrow = useSizeClass() === 'compact'
|
|
171
|
-
|
|
172
|
-
const threads = store.threads
|
|
173
|
-
const activeThread = threads.find((thread) => thread.id === store.activeId) ?? null
|
|
174
|
-
const activeRun = store.activeId !== null ? runs.runs.get(store.activeId) : undefined
|
|
175
|
-
const liveParts = activeRun?.parts
|
|
176
|
-
|
|
177
|
-
const handleSelect = (id: string): void => {
|
|
178
|
-
store.select(id)
|
|
179
|
-
store.markRead(id)
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const handleNewThread = (text: string): void => {
|
|
183
|
-
const id = store.create()
|
|
184
|
-
store.select(id)
|
|
185
|
-
store.markRead(id)
|
|
186
|
-
runs.start(id, text)
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const handleSend = (text: string): void => {
|
|
190
|
-
if (store.activeId === null) return
|
|
191
|
-
runs.start(store.activeId, text)
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
const handleStop = (): void => {
|
|
195
|
-
if (store.activeId === null) return
|
|
196
|
-
runs.stop(store.activeId)
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
const handleRetry = (): void => {
|
|
200
|
-
if (store.activeId === null) return
|
|
201
|
-
runs.retry(store.activeId)
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// A plain pane, NOT a card — the feed's own rows carry the card idiom (docs/DESIGN-SPEC.md §5),
|
|
205
|
-
// so this pane stays flush with the page and the feed/detail split reads via the divider token.
|
|
206
|
-
const feed = (
|
|
207
|
-
<Flex
|
|
208
|
-
direction="column"
|
|
209
|
-
h="100%"
|
|
210
|
-
className={cx(classNames?.feed)}
|
|
211
|
-
style={{ overflow: 'hidden' }}
|
|
212
|
-
>
|
|
213
|
-
<Box style={{ flex: 1, minHeight: 0 }}>
|
|
214
|
-
{threads.length === 0 ? (
|
|
215
|
-
store.hydrated ? (
|
|
216
|
-
(emptyState ?? <FeedEmptyState />)
|
|
217
|
-
) : store.error !== undefined ? (
|
|
218
|
-
(errorState ?? <FeedErrorState />)
|
|
219
|
-
) : (
|
|
220
|
-
<FeedHydratingState />
|
|
221
|
-
)
|
|
222
|
-
) : (
|
|
223
|
-
<ThreadFeed threads={threads} activeId={store.activeId} onSelect={handleSelect} />
|
|
224
|
-
)}
|
|
225
|
-
</Box>
|
|
226
|
-
<Divider color="var(--vx-divider)" />
|
|
227
|
-
<Box p="sm">
|
|
228
|
-
<Composer
|
|
229
|
-
onSubmit={({ text }) => handleNewThread(text)}
|
|
230
|
-
{...(newThreadPlaceholder !== undefined ? { placeholder: newThreadPlaceholder } : {})}
|
|
231
|
-
{...(classNames?.composer !== undefined && { className: classNames.composer })}
|
|
232
|
-
/>
|
|
233
|
-
</Box>
|
|
234
|
-
</Flex>
|
|
235
|
-
)
|
|
236
|
-
|
|
237
|
-
const detail = (
|
|
238
|
-
<ThreadDetailPanel
|
|
239
|
-
thread={activeThread}
|
|
240
|
-
{...(liveParts !== undefined ? { liveParts } : {})}
|
|
241
|
-
{...(activeRun !== undefined ? { runStatus: activeRun.status } : {})}
|
|
242
|
-
onSend={handleSend}
|
|
243
|
-
onStop={handleStop}
|
|
244
|
-
onRetry={handleRetry}
|
|
245
|
-
onClose={() => store.select(null)}
|
|
246
|
-
{...(classNames?.detail !== undefined && { className: classNames.detail })}
|
|
247
|
-
/>
|
|
248
|
-
)
|
|
249
|
-
|
|
250
|
-
if (narrow) {
|
|
251
|
-
return (
|
|
252
|
-
<Box
|
|
253
|
-
className={cx(classNames?.root, className)}
|
|
254
|
-
style={style ? { ...FULL_HEIGHT_STYLE, ...style } : FULL_HEIGHT_STYLE}
|
|
255
|
-
>
|
|
256
|
-
{store.activeId !== null ? detail : feed}
|
|
257
|
-
</Box>
|
|
258
|
-
)
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
return (
|
|
262
|
-
<Flex
|
|
263
|
-
className={cx(classNames?.root, className)}
|
|
264
|
-
style={style ? { ...FULL_HEIGHT_STYLE, ...style } : FULL_HEIGHT_STYLE}
|
|
265
|
-
gap="md"
|
|
266
|
-
>
|
|
267
|
-
<Box
|
|
268
|
-
style={{
|
|
269
|
-
flex: 1,
|
|
270
|
-
minWidth: 0,
|
|
271
|
-
borderRight: '1px solid var(--vx-divider)',
|
|
272
|
-
}}
|
|
273
|
-
>
|
|
274
|
-
{feed}
|
|
275
|
-
</Box>
|
|
276
|
-
<Box style={{ width: DETAIL_PANEL_WIDTH, flexShrink: 0 }}>{detail}</Box>
|
|
277
|
-
</Flex>
|
|
278
|
-
)
|
|
279
|
-
}
|