basalt-ui 1.41.0 → 2.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/AGENTS.md +46 -43
- package/CHANGELOG.md +535 -518
- package/MIGRATING.md +945 -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 +14 -43
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/doctor-upgrade.d.ts +31 -0
- package/dist/cli/doctor-upgrade.d.ts.map +1 -0
- package/dist/cli/doctor-upgrade.js +269 -0
- package/dist/cli/doctor.d.ts +13 -29
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +51 -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 +77 -170
- 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 +14 -43
- package/src/cli/doctor-upgrade.ts +392 -0
- package/src/cli/doctor.ts +81 -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
package/src/agent/parts.ts
CHANGED
|
@@ -8,10 +8,6 @@
|
|
|
8
8
|
* but do NOT let the runtime throw, or one malformed chunk kills the whole transcript. See
|
|
9
9
|
* `mergeToolPart`'s default branch for that shape.
|
|
10
10
|
*
|
|
11
|
-
* Eden #231 doctrine: the server-side Elysia route MUST declare `: AsyncGenerator<AgentPart>`
|
|
12
|
-
* explicitly and carry NO t.Object/t.Union response schema. Validate at yield-time. See
|
|
13
|
-
* agent/rules/basalt-agent.md for the full doctrine.
|
|
14
|
-
*
|
|
15
11
|
* Part identity: every variant carries a stable `id` (see `PartBase`). Transports are permitted to
|
|
16
12
|
* yield a DRAFT — `id` omitted — via `AgentPartDraft`; the consuming hooks (or `withPartIds`)
|
|
17
13
|
* normalize a draft into a fully-identified part before it is ever accumulated. `parseAgentPart`
|
|
@@ -47,25 +43,28 @@ type PartBase = { readonly id: string }
|
|
|
47
43
|
export type StartPart = PartBase & {
|
|
48
44
|
readonly type: 'start'
|
|
49
45
|
readonly runId: string
|
|
50
|
-
readonly resumeToken?: string
|
|
46
|
+
readonly resumeToken?: string | undefined
|
|
51
47
|
}
|
|
52
48
|
|
|
53
49
|
/**
|
|
54
|
-
* A streamed text fragment from the assistant. `
|
|
55
|
-
*
|
|
56
|
-
*
|
|
50
|
+
* A streamed text fragment from the assistant. `text` is a DELTA, not the cumulative text: parts
|
|
51
|
+
* sharing an `id` are merged into one, in order. `offset` is the character position in that
|
|
52
|
+
* accumulated text where this delta starts (undefined = append at the tail, which is what a plain
|
|
53
|
+
* transport emits; `aiSdkTransport` sets it to the length already seen). The merge writes `text`
|
|
54
|
+
* over `[offset, offset + text.length)`, so replaying a whole run from `offset: 0` rebuilds the same
|
|
55
|
+
* text instead of duplicating it. An out-of-range offset is clamped, never thrown on.
|
|
57
56
|
*/
|
|
58
57
|
export type TextPart = PartBase & {
|
|
59
58
|
readonly type: 'text'
|
|
60
59
|
readonly text: string
|
|
61
|
-
readonly offset?: number
|
|
60
|
+
readonly offset?: number | undefined
|
|
62
61
|
}
|
|
63
62
|
|
|
64
63
|
/** An internal reasoning/thinking fragment (may be hidden in the UI). Same `offset` mechanism as TextPart. */
|
|
65
64
|
export type ReasoningPart = PartBase & {
|
|
66
65
|
readonly type: 'reasoning'
|
|
67
66
|
readonly text: string
|
|
68
|
-
readonly offset?: number
|
|
67
|
+
readonly offset?: number | undefined
|
|
69
68
|
}
|
|
70
69
|
|
|
71
70
|
// ── ToolCallPart — mirrors AI SDK v7's UIToolInvocation ─────────────────────
|
|
@@ -89,18 +88,18 @@ export type ReasoningPart = PartBase & {
|
|
|
89
88
|
/** The nested approval envelope — mirrors the SDK's shape verbatim, never flattened. */
|
|
90
89
|
type ToolApproval = {
|
|
91
90
|
readonly id: string
|
|
92
|
-
readonly approved?: boolean
|
|
93
|
-
readonly reason?: string
|
|
94
|
-
readonly isAutomatic?: boolean
|
|
95
|
-
readonly signature?: string
|
|
91
|
+
readonly approved?: boolean | undefined
|
|
92
|
+
readonly reason?: string | undefined
|
|
93
|
+
readonly isAutomatic?: boolean | undefined
|
|
94
|
+
readonly signature?: string | undefined
|
|
96
95
|
}
|
|
97
96
|
|
|
98
97
|
type ToolCallBase = PartBase & {
|
|
99
98
|
readonly type: 'tool'
|
|
100
99
|
readonly toolName: string
|
|
101
100
|
/** Wall-clock time from first sighting of this toolCallId to its terminal state. */
|
|
102
|
-
readonly durationMs?: number
|
|
103
|
-
readonly providerExecuted?: boolean
|
|
101
|
+
readonly durationMs?: number | undefined
|
|
102
|
+
readonly providerExecuted?: boolean | undefined
|
|
104
103
|
}
|
|
105
104
|
|
|
106
105
|
/**
|
|
@@ -134,7 +133,7 @@ type Identified = ToolCallBase & { readonly toolCallId: string }
|
|
|
134
133
|
* test that built one. A `''` toolCallId is not a value any state accepts; `parseToolCallPart`
|
|
135
134
|
* normalizes one to absent at the wire boundary, so it never reaches the type or a consumer.
|
|
136
135
|
*/
|
|
137
|
-
type MaybeIdentified = ToolCallBase & { readonly toolCallId?: string }
|
|
136
|
+
type MaybeIdentified = ToolCallBase & { readonly toolCallId?: string | undefined }
|
|
138
137
|
|
|
139
138
|
export type ToolCallPart =
|
|
140
139
|
| (Identified & { readonly state: 'input-streaming'; readonly input?: unknown })
|
|
@@ -153,8 +152,8 @@ export type ToolCallPart =
|
|
|
153
152
|
readonly state: 'output-available'
|
|
154
153
|
readonly input: unknown
|
|
155
154
|
readonly output: unknown
|
|
156
|
-
readonly preliminary?: boolean
|
|
157
|
-
readonly approval?: ToolApproval & { readonly approved?: true }
|
|
155
|
+
readonly preliminary?: boolean | undefined
|
|
156
|
+
readonly approval?: (ToolApproval & { readonly approved?: true }) | undefined
|
|
158
157
|
})
|
|
159
158
|
| (MaybeIdentified & {
|
|
160
159
|
readonly state: 'output-error'
|
|
@@ -163,7 +162,7 @@ export type ToolCallPart =
|
|
|
163
162
|
readonly errorText: string
|
|
164
163
|
/** The only place the raw, un-parsed input survives — what lets a UI render a call whose input never validated. */
|
|
165
164
|
readonly rawInput?: unknown
|
|
166
|
-
readonly approval?: ToolApproval & { readonly approved?: true }
|
|
165
|
+
readonly approval?: (ToolApproval & { readonly approved?: true }) | undefined
|
|
167
166
|
})
|
|
168
167
|
| (MaybeIdentified & {
|
|
169
168
|
readonly state: 'output-denied'
|
|
@@ -185,7 +184,7 @@ export function isToolCallSettled(part: ToolCallPart): boolean {
|
|
|
185
184
|
export type SourcePart = PartBase & {
|
|
186
185
|
readonly type: 'source'
|
|
187
186
|
readonly url: string
|
|
188
|
-
readonly title?: string
|
|
187
|
+
readonly title?: string | undefined
|
|
189
188
|
}
|
|
190
189
|
|
|
191
190
|
/** A fatal or recoverable error emitted in-stream by the agent. */
|
|
@@ -208,7 +207,9 @@ export type AgentPart = StartPart | TextPart | ReasoningPart | ToolCallPart | So
|
|
|
208
207
|
* `Drafted<AgentPart>` is `Drafted<StartPart> | Drafted<TextPart> | ...` rather than one flattened
|
|
209
208
|
* (and wrong) shape.
|
|
210
209
|
*/
|
|
211
|
-
export type Drafted<T> = T extends unknown
|
|
210
|
+
export type Drafted<T> = T extends unknown
|
|
211
|
+
? Omit<T, 'id'> & { readonly id?: string | undefined }
|
|
212
|
+
: never
|
|
212
213
|
export type AgentPartDraft = Drafted<AgentPart>
|
|
213
214
|
|
|
214
215
|
// ── parseAgentPart ───────────────────────────────────────────────────────────
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The commit side of a run: when accumulated parts reach `useAgentThreadRuns`' `runs` state.
|
|
3
|
+
* Mantine-free and React-free so it is testable on its own.
|
|
4
|
+
*/
|
|
5
|
+
import type { PartLike } from './merge'
|
|
6
|
+
import type { LiveRunStatus } from './thread'
|
|
7
|
+
|
|
8
|
+
export type RunCommitter<TPart> = {
|
|
9
|
+
/** Queue a commit; `immediate` (or `wait <= 0`) bypasses the window and drops any pending one. */
|
|
10
|
+
readonly push: (parts: TPart[], status: LiveRunStatus, immediate?: boolean) => void
|
|
11
|
+
/** Commit the pending snapshot now, if any. */
|
|
12
|
+
readonly flush: () => void
|
|
13
|
+
/** Drop the pending snapshot and its timer. */
|
|
14
|
+
readonly cancel: () => void
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Leading + trailing throttle over `runs` commits (the semantics of `useChat`'s stable
|
|
19
|
+
* `throttle`): the first push commits at once, pushes inside the window collapse into one trailing
|
|
20
|
+
* commit of the LATEST snapshot.
|
|
21
|
+
*/
|
|
22
|
+
export function createRunCommitter<TPart>(
|
|
23
|
+
wait: number,
|
|
24
|
+
commit: (parts: TPart[], status: LiveRunStatus) => void,
|
|
25
|
+
): RunCommitter<TPart> {
|
|
26
|
+
let timer: ReturnType<typeof setTimeout> | undefined
|
|
27
|
+
let lastCommitAt = Number.NEGATIVE_INFINITY
|
|
28
|
+
let pending: { parts: TPart[]; status: LiveRunStatus } | undefined
|
|
29
|
+
|
|
30
|
+
const clear = (): void => {
|
|
31
|
+
if (timer === undefined) return
|
|
32
|
+
clearTimeout(timer)
|
|
33
|
+
timer = undefined
|
|
34
|
+
}
|
|
35
|
+
const flush = (): void => {
|
|
36
|
+
clear()
|
|
37
|
+
if (pending === undefined) return
|
|
38
|
+
const { parts, status } = pending
|
|
39
|
+
pending = undefined
|
|
40
|
+
lastCommitAt = Date.now()
|
|
41
|
+
commit(parts, status)
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
push(parts, status, immediate = false) {
|
|
45
|
+
pending = { parts, status }
|
|
46
|
+
const windowOpen = timer === undefined && Date.now() - lastCommitAt >= wait
|
|
47
|
+
if (wait <= 0 || immediate || windowOpen) {
|
|
48
|
+
flush()
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
timer ??= setTimeout(flush, Math.max(0, wait - (Date.now() - lastCommitAt)))
|
|
52
|
+
},
|
|
53
|
+
flush,
|
|
54
|
+
cancel() {
|
|
55
|
+
clear()
|
|
56
|
+
pending = undefined
|
|
57
|
+
},
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** True for the parts that end `'submitted'`: model output, not the synthetic start/source/error. */
|
|
62
|
+
export function isContentPart(part: PartLike): boolean {
|
|
63
|
+
return part.type === 'text' || part.type === 'reasoning' || part.type === 'tool'
|
|
64
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The per-thread run lifecycle of `useAgentThreadRuns`, in ONE record per thread id.
|
|
3
|
+
*
|
|
4
|
+
* The hook used to keep a run's controller, live parts, "final message landed" flag and how it
|
|
5
|
+
* ended in four parallel maps, written at different places, and `runs` (React state, which only
|
|
6
|
+
* mirrors the last flushed render) was consulted for the rest. Every drift between those was a
|
|
7
|
+
* bug: `stop()` deciding from a stale `runs`, a second `stop()` appending twice. Here a run is
|
|
8
|
+
* begun, ended and swept through three functions, so the pieces change together.
|
|
9
|
+
*
|
|
10
|
+
* A record is LIVE while `ended === undefined`; `ended` is written synchronously where a run stops
|
|
11
|
+
* being driven, long before the `setRuns` it queues renders. That window is what the record
|
|
12
|
+
* covers: it outlives the run only until a render shows the outcome (`sweepFlushed`).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** The part of a rendered `runs` entry this module reads. */
|
|
16
|
+
type RenderedRun<TPart> = { readonly status: string; readonly parts: TPart[] }
|
|
17
|
+
|
|
18
|
+
export type RunEnd = 'settled' | 'failed' | 'stopped'
|
|
19
|
+
|
|
20
|
+
export type RunRecord<TPart> = {
|
|
21
|
+
readonly controller: AbortController
|
|
22
|
+
/** The unthrottled accumulator; `runs` may lag it by one throttle window. Emptied when the run ends. */
|
|
23
|
+
parts: TPart[]
|
|
24
|
+
/** The turn's terminal assistant message is in the thread. */
|
|
25
|
+
appended: boolean
|
|
26
|
+
/** `consumeAndFinalize`'s own `resolveOutcome` is in flight. */
|
|
27
|
+
resolving: boolean
|
|
28
|
+
ended: RunEnd | undefined
|
|
29
|
+
/** A newer run began on the same thread (set by `beginRun` on the record it replaces). */
|
|
30
|
+
superseded: boolean
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type RunRecords<TPart> = Map<string, RunRecord<TPart>>
|
|
34
|
+
|
|
35
|
+
/** Registers a live run for `threadId`, replacing whatever record the previous run left. */
|
|
36
|
+
export function beginRun<TPart>(
|
|
37
|
+
records: RunRecords<TPart>,
|
|
38
|
+
threadId: string,
|
|
39
|
+
controller: AbortController,
|
|
40
|
+
): RunRecord<TPart> {
|
|
41
|
+
const record: RunRecord<TPart> = {
|
|
42
|
+
controller,
|
|
43
|
+
parts: [],
|
|
44
|
+
appended: false,
|
|
45
|
+
resolving: false,
|
|
46
|
+
ended: undefined,
|
|
47
|
+
superseded: false,
|
|
48
|
+
}
|
|
49
|
+
const previous = records.get(threadId)
|
|
50
|
+
if (previous !== undefined) previous.superseded = true
|
|
51
|
+
records.set(threadId, record)
|
|
52
|
+
return record
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Marks a run as no longer driven and drops the content it held. */
|
|
56
|
+
export function endRun<TPart>(record: RunRecord<TPart>, reason: RunEnd): void {
|
|
57
|
+
record.ended = reason
|
|
58
|
+
record.parts = []
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** True while `controller`'s run is still the thread's live one. */
|
|
62
|
+
export function isLive<TPart>(
|
|
63
|
+
records: RunRecords<TPart>,
|
|
64
|
+
threadId: string,
|
|
65
|
+
controller: AbortController,
|
|
66
|
+
): boolean {
|
|
67
|
+
const record = records.get(threadId)
|
|
68
|
+
return record?.controller === controller && record.ended === undefined
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** What `stop(threadId)` must do. */
|
|
72
|
+
export type StopPlan<TPart> =
|
|
73
|
+
| { readonly kind: 'noop' }
|
|
74
|
+
/** A failed run: only its error entry goes. */
|
|
75
|
+
| { readonly kind: 'dismiss' }
|
|
76
|
+
/** A live run: abort it, persist its parts, settle the thread. */
|
|
77
|
+
| { readonly kind: 'stop'; readonly record: RunRecord<TPart>; readonly parts: TPart[] }
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* True while `threadId` has a live (not yet ended) run.
|
|
81
|
+
*/
|
|
82
|
+
export function hasLiveRun<TPart>(records: RunRecords<TPart>, threadId: string): boolean {
|
|
83
|
+
const record = records.get(threadId)
|
|
84
|
+
return record !== undefined && record.ended === undefined
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Decides `stop()` from the record, falling back to the rendered `entry` only when no record
|
|
89
|
+
* exists (an unmount re-run — StrictMode, `<Activity>` — clears records while `runs` state
|
|
90
|
+
* survives). A live `entry` with no record is a phantom nothing drives; it is settled once: the
|
|
91
|
+
* ended tombstone record this WRITES (the side effect in the name) makes a second `stop()` in the
|
|
92
|
+
* same tick a no-op.
|
|
93
|
+
*/
|
|
94
|
+
export function planStopWithTombstone<TPart>(
|
|
95
|
+
records: RunRecords<TPart>,
|
|
96
|
+
threadId: string,
|
|
97
|
+
entry: RenderedRun<TPart> | undefined,
|
|
98
|
+
): StopPlan<TPart> {
|
|
99
|
+
const record = records.get(threadId)
|
|
100
|
+
if (record !== undefined) {
|
|
101
|
+
if (record.ended === undefined) return { kind: 'stop', record, parts: record.parts }
|
|
102
|
+
return record.ended === 'failed' ? { kind: 'dismiss' } : { kind: 'noop' }
|
|
103
|
+
}
|
|
104
|
+
if (entry === undefined) return { kind: 'noop' }
|
|
105
|
+
if (entry.status === 'error') return { kind: 'dismiss' }
|
|
106
|
+
const tombstone = beginRun(records, threadId, new AbortController())
|
|
107
|
+
endRun(tombstone, 'stopped')
|
|
108
|
+
return { kind: 'stop', record: tombstone, parts: entry.parts }
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Thread ids whose failed entry `stopAll()` must dismiss: the records AND what `runs` shows. */
|
|
112
|
+
export function failedThreadIds<TPart>(
|
|
113
|
+
records: RunRecords<TPart>,
|
|
114
|
+
runs: ReadonlyMap<string, RenderedRun<TPart>>,
|
|
115
|
+
): string[] {
|
|
116
|
+
const ids = new Set<string>()
|
|
117
|
+
for (const [threadId, record] of records) if (record.ended === 'failed') ids.add(threadId)
|
|
118
|
+
for (const [threadId, entry] of runs) if (entry.status === 'error') ids.add(threadId)
|
|
119
|
+
return [...ids]
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* A failed entry was dismissed: its record has nothing left to cover. (`sweepFlushed` cannot tell
|
|
124
|
+
* "dismissed" from "not rendered yet", so the dismissal itself drops it.)
|
|
125
|
+
*/
|
|
126
|
+
export function dismissRun<TPart>(records: RunRecords<TPart>, threadId: string): void {
|
|
127
|
+
if (records.get(threadId)?.ended === 'failed') records.delete(threadId)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** True unless a newer run has taken the thread over since `record` began. */
|
|
131
|
+
export function isLatestRun<TPart>(record: RunRecord<TPart>): boolean {
|
|
132
|
+
return !record.superseded
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Drops the terminal records a render has already caught up with, so ids are not kept forever. */
|
|
136
|
+
export function sweepFlushed<TPart>(
|
|
137
|
+
records: RunRecords<TPart>,
|
|
138
|
+
runs: ReadonlyMap<string, RenderedRun<TPart>>,
|
|
139
|
+
): void {
|
|
140
|
+
for (const [threadId, record] of records) {
|
|
141
|
+
// A pending resolver still reports to its record (superseded-ness included): keep it.
|
|
142
|
+
if (record.ended === undefined || record.resolving) continue
|
|
143
|
+
const shown = runs.get(threadId)
|
|
144
|
+
const flushed = record.ended === 'failed' ? shown?.status === 'error' : shown === undefined
|
|
145
|
+
if (flushed) records.delete(threadId)
|
|
146
|
+
}
|
|
147
|
+
}
|
package/src/agent/thread.ts
CHANGED
|
@@ -1,30 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* createThreadsStore — persisted, ring-buffered multi-thread registry on createPersistedState.
|
|
3
|
-
*
|
|
4
|
-
* Mirrors createChatHistoryStore's shape but one level up: instead of a single message list,
|
|
5
|
-
* this tracks many AgentThreads (each carrying its own message list plus a distilled
|
|
6
|
-
* AgentOutcome for feed rendering). Threads are stored NEWEST-FIRST so index 0 is always the
|
|
7
|
-
* most recent. Both threads and each thread's messages are ring-buffered independently.
|
|
8
|
-
*
|
|
9
|
-
* SSR-safe: the underlying createPersistedState handles the server snapshot (returns initial).
|
|
10
|
-
* Cross-tab: the 'storage' event propagates changes to other tabs automatically.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* import { createThreadsStore } from 'basalt-ui/agent'
|
|
14
|
-
*
|
|
15
|
-
* // Call once at module scope with a stable key:
|
|
16
|
-
* const useThreads = createThreadsStore({ key: 'main-threads', version: 1 })
|
|
17
|
-
*
|
|
18
|
-
* // In a component:
|
|
19
|
-
* function ThreadFeed() {
|
|
20
|
-
* const { threads, activeId, select, create } = useThreads()
|
|
21
|
-
* // ...
|
|
22
|
-
* }
|
|
23
|
-
*/
|
|
24
|
-
import { useCallback, useRef } from 'react'
|
|
25
|
-
import { createPersistedState } from '../state'
|
|
1
|
+
/** AgentThread / ThreadsStore — the thread contract a consumer-owned store implements. */
|
|
26
2
|
import type { ChatMessage } from './history'
|
|
27
|
-
import { mintThreadId } from './id'
|
|
28
3
|
import type { AgentOutcome } from './outcome'
|
|
29
4
|
import type { AgentPart } from './parts'
|
|
30
5
|
|
|
@@ -37,9 +12,9 @@ import type { AgentPart } from './parts'
|
|
|
37
12
|
* `'pending'`/`'streaming'` when `useAgentThreadRuns` mounts with no live run for it (e.g. after a
|
|
38
13
|
* reload mid-stream) — see `useAgentThreadRuns`'s mount-reconciliation effect.
|
|
39
14
|
*
|
|
40
|
-
* This is one of THREE overlapping status-shaped unions in the agent layer:
|
|
41
|
-
* (single-turn stream lifecycle,
|
|
42
|
-
* lifecycle), and `AgentOutcome['status']` (`./outcome` — the terminal `'done' | 'attention' |
|
|
15
|
+
* This is one of THREE overlapping status-shaped unions in the agent layer: the internal
|
|
16
|
+
* `StreamStatus` (single-turn stream lifecycle, below), this `ThreadStatus`
|
|
17
|
+
* (persisted thread lifecycle), and `AgentOutcome['status']` (`./outcome` — the terminal `'done' | 'attention' |
|
|
43
18
|
* 'error'` subset of this union, once a turn has settled). Vocabulary note: `StreamStatus`'s
|
|
44
19
|
* `'idle'` (no turn in flight) corresponds to this union's `'pending'` (thread created, no turn
|
|
45
20
|
* started yet) — the literal rename is intentionally deferred, see `AgentOutcome['status']`'s doc.
|
|
@@ -76,7 +51,7 @@ export type AgentThread<TPart = AgentPart> = {
|
|
|
76
51
|
* useAgentThreadRuns to attempt resumption after a disconnected reload. Cleared once the run
|
|
77
52
|
* finalizes.
|
|
78
53
|
*/
|
|
79
|
-
readonly resumeToken?: string
|
|
54
|
+
readonly resumeToken?: string | undefined
|
|
80
55
|
/**
|
|
81
56
|
* Freeform consumer metadata (e.g. `{ source: 'sidebar' }`, `{ model: 'gpt-5' }`) — set once at
|
|
82
57
|
* `create()` time and otherwise opaque to this store. Intentionally untyped: the framework has
|
|
@@ -91,27 +66,7 @@ export type AgentThread<TPart = AgentPart> = {
|
|
|
91
66
|
* Revisit trigger: promote this to a `TMeta` generic only once a real consumer needs typed,
|
|
92
67
|
* validated meta (not just a documented convention) — don't add the generic speculatively.
|
|
93
68
|
*/
|
|
94
|
-
readonly meta?: Record<string, unknown>
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// ── createThreadsStore options ────────────────────────────────────────────────
|
|
98
|
-
|
|
99
|
-
export type ThreadsStoreOptions = {
|
|
100
|
-
/** localStorage key (namespaced as `basalt:<key>`). Stable — changes key lose history. */
|
|
101
|
-
readonly key: string
|
|
102
|
-
/** Envelope version. Increment when the AgentThread shape changes to clear old data. */
|
|
103
|
-
readonly version: number
|
|
104
|
-
/**
|
|
105
|
-
* Maximum number of threads to retain. Oldest threads (end of the newest-first array) are
|
|
106
|
-
* dropped when exceeded.
|
|
107
|
-
* @default 50
|
|
108
|
-
*/
|
|
109
|
-
readonly maxThreads?: number
|
|
110
|
-
/**
|
|
111
|
-
* Maximum number of messages to retain per thread. Oldest messages are dropped when exceeded.
|
|
112
|
-
* @default 100
|
|
113
|
-
*/
|
|
114
|
-
readonly maxMessagesPerThread?: number
|
|
69
|
+
readonly meta?: Record<string, unknown> | undefined
|
|
115
70
|
}
|
|
116
71
|
|
|
117
72
|
// ── Return type of the factory hook ──────────────────────────────────────────
|
|
@@ -124,7 +79,7 @@ export type ThreadsStore<TPart = AgentPart> = {
|
|
|
124
79
|
/** Select a thread as active (or clear the selection with null). */
|
|
125
80
|
readonly select: (id: string | null) => void
|
|
126
81
|
/** Create a new thread, prepend it, and return its id. Does not change activeId. */
|
|
127
|
-
readonly create: (opts?: { readonly meta?: Record<string, unknown> }) => string
|
|
82
|
+
readonly create: (opts?: { readonly meta?: Record<string, unknown> | undefined }) => string
|
|
128
83
|
/** Append a message to a thread. Trims to maxMessagesPerThread (ring-buffer: drops oldest). */
|
|
129
84
|
readonly appendMessage: (id: string, message: ChatMessage<TPart>) => void
|
|
130
85
|
/** Set a thread's distilled outcome. Bumps updatedAt. */
|
|
@@ -140,197 +95,35 @@ export type ThreadsStore<TPart = AgentPart> = {
|
|
|
140
95
|
/** Remove all threads and clear the active selection. */
|
|
141
96
|
readonly clear: () => void
|
|
142
97
|
/**
|
|
143
|
-
* Whether `threads` reflects the backing store yet. Always `true` for
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
* first `listThreads` SUCCEEDS. Pair it with `error` — `!hydrated && error !== undefined` is a
|
|
98
|
+
* Whether `threads` reflects the backing store yet. Always `true` for a synchronous store;
|
|
99
|
+
* meaningful only for an async, server-backed store, where it stays `false` until the first
|
|
100
|
+
* `listThreads` SUCCEEDS. Pair it with `error` — `!hydrated && error !== undefined` is a
|
|
147
101
|
* failed load, `!hydrated && error === undefined` is still loading.
|
|
148
102
|
*
|
|
149
|
-
* Gating an empty state on this is the CALLER's job when
|
|
150
|
-
*
|
|
151
|
-
* async store never flashes "no threads yet" through it before it actually knows.
|
|
103
|
+
* Gating an empty state on this is the CALLER's job when rendering `ThreadFeed`, so an async
|
|
104
|
+
* store never flashes "no threads yet" before it actually knows.
|
|
152
105
|
*/
|
|
153
106
|
readonly hydrated: boolean
|
|
154
107
|
/**
|
|
155
|
-
* The most recent persistence failure, or `undefined`. Always `undefined` for
|
|
156
|
-
* store, which has no failure the caller can act on. An async store surfaces the rejected
|
|
108
|
+
* The most recent persistence failure, or `undefined`. Always `undefined` for a synchronous
|
|
109
|
+
* local store, which has no failure the caller can act on. An async store surfaces the rejected
|
|
157
110
|
* load/write here after rolling its optimistic edit back.
|
|
158
111
|
*/
|
|
159
112
|
readonly error: unknown
|
|
160
113
|
}
|
|
161
114
|
|
|
162
|
-
// ── createThreadsStore ────────────────────────────────────────────────────────
|
|
163
|
-
|
|
164
115
|
/**
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
* stay in sync across tabs via the 'storage' event.
|
|
170
|
-
*
|
|
171
|
-
* @example
|
|
172
|
-
* // src/chat/threads.ts — ONE stable creation per key:
|
|
173
|
-
* export const useThreads = createThreadsStore({ key: 'main-threads', version: 1 })
|
|
174
|
-
*
|
|
175
|
-
* // In a component:
|
|
176
|
-
* const { threads, activeId, select, create, appendMessage } = useThreads()
|
|
177
|
-
* const id = create({ meta: { source: 'sidebar' } })
|
|
178
|
-
* appendMessage(id, { id: crypto.randomUUID(), role: 'user', parts: [...], createdAt: Date.now() })
|
|
116
|
+
* The live status of one in-flight stream, as the chat rows render it. Not exported from the `./agent`
|
|
117
|
+
* barrel (the chat UI imports it from this module); consumers derive it from `ThreadFeedRow`'s `liveStatus` prop. `'submitted'` is a turn
|
|
118
|
+
* sent but not yet producing content: the chat rows treat it as live (Stop shows, the composer is
|
|
119
|
+
* gated) exactly like `'streaming'`.
|
|
179
120
|
*/
|
|
180
|
-
export
|
|
181
|
-
opts: ThreadsStoreOptions,
|
|
182
|
-
): () => ThreadsStore<TPart> {
|
|
183
|
-
const maxThreads = opts.maxThreads ?? 50
|
|
184
|
-
const maxMessages = opts.maxMessagesPerThread ?? 100
|
|
185
|
-
|
|
186
|
-
type Persisted = { threads: AgentThread<TPart>[]; activeId: string | null }
|
|
187
|
-
|
|
188
|
-
const usePersistedThreads = createPersistedState<Persisted>({
|
|
189
|
-
key: opts.key,
|
|
190
|
-
version: opts.version,
|
|
191
|
-
initial: { threads: [], activeId: null },
|
|
192
|
-
})
|
|
193
|
-
|
|
194
|
-
return function useThreadsStore(): ThreadsStore<TPart> {
|
|
195
|
-
const [state, setState] = usePersistedThreads()
|
|
196
|
-
|
|
197
|
-
// Ref mirrors the latest committed value so that two synchronous action calls in one
|
|
198
|
-
// render cycle accumulate correctly. createPersistedState's setter is a whole-value setter
|
|
199
|
-
// (not a functional updater), so the second call would otherwise overwrite the first.
|
|
200
|
-
const ref = useRef(state)
|
|
201
|
-
ref.current = state
|
|
202
|
-
|
|
203
|
-
const commit = useCallback(
|
|
204
|
-
(next: Persisted): void => {
|
|
205
|
-
ref.current = next // sync so a second action in the same tick sees the update
|
|
206
|
-
setState(next)
|
|
207
|
-
},
|
|
208
|
-
[setState],
|
|
209
|
-
)
|
|
210
|
-
|
|
211
|
-
const select = useCallback(
|
|
212
|
-
(id: string | null): void => {
|
|
213
|
-
commit({ ...ref.current, activeId: id })
|
|
214
|
-
},
|
|
215
|
-
[commit],
|
|
216
|
-
)
|
|
217
|
-
|
|
218
|
-
const create = useCallback(
|
|
219
|
-
(createOpts?: { readonly meta?: Record<string, unknown> }): string => {
|
|
220
|
-
const id = mintThreadId()
|
|
221
|
-
const now = Date.now()
|
|
222
|
-
const thread: AgentThread<TPart> = {
|
|
223
|
-
id,
|
|
224
|
-
messages: [],
|
|
225
|
-
outcome: null,
|
|
226
|
-
status: 'pending',
|
|
227
|
-
read: false,
|
|
228
|
-
createdAt: now,
|
|
229
|
-
updatedAt: now,
|
|
230
|
-
...(createOpts?.meta !== undefined ? { meta: createOpts.meta } : {}),
|
|
231
|
-
}
|
|
232
|
-
const threads = [thread, ...ref.current.threads]
|
|
233
|
-
// Ring-buffer: drop the oldest threads (the tail) when over maxThreads.
|
|
234
|
-
const trimmed = threads.length > maxThreads ? threads.slice(0, maxThreads) : threads
|
|
235
|
-
commit({ ...ref.current, threads: trimmed })
|
|
236
|
-
return id
|
|
237
|
-
},
|
|
238
|
-
[commit],
|
|
239
|
-
)
|
|
240
|
-
|
|
241
|
-
const appendMessage = useCallback(
|
|
242
|
-
(id: string, message: ChatMessage<TPart>): void => {
|
|
243
|
-
const threads = ref.current.threads.map((thread) => {
|
|
244
|
-
if (thread.id !== id) return thread
|
|
245
|
-
const messages = [...thread.messages, message]
|
|
246
|
-
// Ring-buffer: trim to maxMessages, dropping oldest entries first.
|
|
247
|
-
const trimmed =
|
|
248
|
-
messages.length > maxMessages ? messages.slice(messages.length - maxMessages) : messages
|
|
249
|
-
return { ...thread, messages: trimmed, updatedAt: Date.now() }
|
|
250
|
-
})
|
|
251
|
-
commit({ ...ref.current, threads })
|
|
252
|
-
},
|
|
253
|
-
[commit],
|
|
254
|
-
)
|
|
255
|
-
|
|
256
|
-
const setOutcome = useCallback(
|
|
257
|
-
(id: string, outcome: AgentOutcome): void => {
|
|
258
|
-
const threads = ref.current.threads.map((thread) =>
|
|
259
|
-
thread.id === id ? { ...thread, outcome, updatedAt: Date.now() } : thread,
|
|
260
|
-
)
|
|
261
|
-
commit({ ...ref.current, threads })
|
|
262
|
-
},
|
|
263
|
-
[commit],
|
|
264
|
-
)
|
|
265
|
-
|
|
266
|
-
const setStatus = useCallback(
|
|
267
|
-
(id: string, status: ThreadStatus): void => {
|
|
268
|
-
const threads = ref.current.threads.map((thread) =>
|
|
269
|
-
thread.id === id ? { ...thread, status, updatedAt: Date.now() } : thread,
|
|
270
|
-
)
|
|
271
|
-
commit({ ...ref.current, threads })
|
|
272
|
-
},
|
|
273
|
-
[commit],
|
|
274
|
-
)
|
|
275
|
-
|
|
276
|
-
const setResumeToken = useCallback(
|
|
277
|
-
(id: string, token: string | undefined): void => {
|
|
278
|
-
const threads = ref.current.threads.map((thread) => {
|
|
279
|
-
if (thread.id !== id) return thread
|
|
280
|
-
// exactOptionalPropertyTypes: drop the key entirely to clear it rather than assigning
|
|
281
|
-
// `resumeToken: undefined` (which the optional-but-not-nullable type disallows).
|
|
282
|
-
const { resumeToken: _resumeToken, ...rest } = thread
|
|
283
|
-
return {
|
|
284
|
-
...rest,
|
|
285
|
-
...(token !== undefined ? { resumeToken: token } : {}),
|
|
286
|
-
updatedAt: Date.now(),
|
|
287
|
-
}
|
|
288
|
-
})
|
|
289
|
-
commit({ ...ref.current, threads })
|
|
290
|
-
},
|
|
291
|
-
[commit],
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
const markRead = useCallback(
|
|
295
|
-
(id: string): void => {
|
|
296
|
-
const threads = ref.current.threads.map((thread) =>
|
|
297
|
-
thread.id === id ? { ...thread, read: true } : thread,
|
|
298
|
-
)
|
|
299
|
-
commit({ ...ref.current, threads })
|
|
300
|
-
},
|
|
301
|
-
[commit],
|
|
302
|
-
)
|
|
303
|
-
|
|
304
|
-
const remove = useCallback(
|
|
305
|
-
(id: string): void => {
|
|
306
|
-
const threads = ref.current.threads.filter((thread) => thread.id !== id)
|
|
307
|
-
const activeId = ref.current.activeId === id ? null : ref.current.activeId
|
|
308
|
-
commit({ threads, activeId })
|
|
309
|
-
},
|
|
310
|
-
[commit],
|
|
311
|
-
)
|
|
121
|
+
export type StreamStatus = 'idle' | 'submitted' | 'streaming' | 'done' | 'error'
|
|
312
122
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
}, [commit])
|
|
123
|
+
/** The two states a turn is in flight in. */
|
|
124
|
+
export type LiveRunStatus = Extract<StreamStatus, 'submitted' | 'streaming'>
|
|
316
125
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
select,
|
|
321
|
-
create,
|
|
322
|
-
appendMessage,
|
|
323
|
-
setOutcome,
|
|
324
|
-
setStatus,
|
|
325
|
-
setResumeToken,
|
|
326
|
-
markRead,
|
|
327
|
-
remove,
|
|
328
|
-
clear,
|
|
329
|
-
// localStorage resolves synchronously and swallows its own quota errors, so there is never
|
|
330
|
-
// a pending load to await nor a failure a caller could act on. See ./adapter for the async
|
|
331
|
-
// store where these two carry real information.
|
|
332
|
-
hydrated: true,
|
|
333
|
-
error: undefined,
|
|
334
|
-
}
|
|
335
|
-
}
|
|
126
|
+
/** True while a turn is in flight (`'submitted'` or `'streaming'`); `'error'` and the rest are not. */
|
|
127
|
+
export function isLiveStatus(status: StreamStatus | undefined): status is LiveRunStatus {
|
|
128
|
+
return status === 'submitted' || status === 'streaming'
|
|
336
129
|
}
|