@signalflare-ai/ui 0.5.0 → 1.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/CHANGELOG.md +117 -1
- package/ai/USAGE.md +64 -0
- package/ai/component-registry.json +492 -618
- package/ai/component-registry.md +167 -85
- package/ai/schemas.ts +545 -102
- package/bin/sf.js +2 -3
- package/dist/.build-complete +1 -1
- package/dist/ai/schemas.d.ts +1659 -5532
- package/dist/ai/schemas.d.ts.map +1 -1
- package/dist/{ai-actions-DG1dhDMP.js → ai-actions-DSVeQn4e.js} +1 -1
- package/dist/{ai-actions-DG1dhDMP.js.map → ai-actions-DSVeQn4e.js.map} +1 -1
- package/dist/{ai-agent-card-BbtL4NII.js → ai-agent-card-BXHwhWAU.js} +1 -1
- package/dist/{ai-agent-card-BbtL4NII.js.map → ai-agent-card-BXHwhWAU.js.map} +1 -1
- package/dist/{ai-approval-Mb7-BY6i.js → ai-approval-aa0qvjFN.js} +1 -1
- package/dist/{ai-approval-Mb7-BY6i.js.map → ai-approval-aa0qvjFN.js.map} +1 -1
- package/dist/{ai-code-block-BI_z0UVR.js → ai-code-block-BgtIxtZZ.js} +1 -1
- package/dist/{ai-code-block-BI_z0UVR.js.map → ai-code-block-BgtIxtZZ.js.map} +1 -1
- package/dist/{ai-conversation-DYtExcrw.js → ai-conversation-CArP7C8K.js} +1 -1
- package/dist/{ai-conversation-DYtExcrw.js.map → ai-conversation-CArP7C8K.js.map} +1 -1
- package/dist/{ai-info-banner-BpzauUAY.js → ai-info-banner-uFxHHwBA.js} +1 -1
- package/dist/{ai-info-banner-BpzauUAY.js.map → ai-info-banner-uFxHHwBA.js.map} +1 -1
- package/dist/{ai-message-CV8SBoHM.js → ai-message-BjnFznXy.js} +1 -1
- package/dist/{ai-message-CV8SBoHM.js.map → ai-message-BjnFznXy.js.map} +1 -1
- package/dist/{ai-mission-header-ByYkJ6YP.js → ai-mission-header-08__gULL.js} +1 -1
- package/dist/{ai-mission-header-ByYkJ6YP.js.map → ai-mission-header-08__gULL.js.map} +1 -1
- package/dist/ai-part-group-DBtgTgAn.js +277 -0
- package/dist/ai-part-group-DBtgTgAn.js.map +1 -0
- package/dist/ai-prompt-input-Dy1LfxPk.js +1541 -0
- package/dist/ai-prompt-input-Dy1LfxPk.js.map +1 -0
- package/dist/{ai-question-Dp1g9k2o.js → ai-question-CHHoDJMg.js} +1 -1
- package/dist/{ai-question-Dp1g9k2o.js.map → ai-question-CHHoDJMg.js.map} +1 -1
- package/dist/{ai-reasoning-UAmNx_LD.js → ai-reasoning-CnL6ZSr5.js} +84 -5
- package/dist/ai-reasoning-CnL6ZSr5.js.map +1 -0
- package/dist/{ai-response-BWoVsNQG.js → ai-response-BEUg3xvd.js} +13 -16
- package/dist/ai-response-BEUg3xvd.js.map +1 -0
- package/dist/{ai-shimmer-BpOmfonu.js → ai-shimmer-By5_L05p.js} +1 -1
- package/dist/{ai-shimmer-BpOmfonu.js.map → ai-shimmer-By5_L05p.js.map} +1 -1
- package/dist/{ai-status-badge-WhbKVeqn.js → ai-status-badge-BGYGWYF6.js} +1 -1
- package/dist/{ai-status-badge-WhbKVeqn.js.map → ai-status-badge-BGYGWYF6.js.map} +1 -1
- package/dist/{ai-streaming-text-ClL7FwvD.js → ai-streaming-text-CMfoThV0.js} +1 -1
- package/dist/{ai-streaming-text-ClL7FwvD.js.map → ai-streaming-text-CMfoThV0.js.map} +1 -1
- package/dist/{ai-subagent-BruGN1UE.js → ai-subagent-DcPRqkAA.js} +1 -1
- package/dist/{ai-subagent-BruGN1UE.js.map → ai-subagent-DcPRqkAA.js.map} +1 -1
- package/dist/{ai-suggestion-CNsCZj5P.js → ai-suggestion-MgeCg5Ar.js} +1 -1
- package/dist/{ai-suggestion-CNsCZj5P.js.map → ai-suggestion-MgeCg5Ar.js.map} +1 -1
- package/dist/{ai-task-list-B9CpMDYN.js → ai-task-list-Da9zIm00.js} +9 -12
- package/dist/ai-task-list-Da9zIm00.js.map +1 -0
- package/dist/{ai-timeline-Bb5ntsr3.js → ai-timeline-Cwu045IR.js} +1 -1
- package/dist/ai-timeline-Cwu045IR.js.map +1 -0
- package/dist/{ai-tool-BGH8nQ_D.js → ai-tool-Cn1O4xjP.js} +168 -11
- package/dist/ai-tool-Cn1O4xjP.js.map +1 -0
- package/dist/{ai-usage-bar-BI-p-JBk.js → ai-usage-bar-DjS12DMp.js} +1 -1
- package/dist/{ai-usage-bar-BI-p-JBk.js.map → ai-usage-bar-DjS12DMp.js.map} +1 -1
- package/dist/catalog.js +3 -3
- package/dist/catalog.js.map +1 -1
- package/dist/{chart-Bes4MN3C.js → chart-BK3sVPnD.js} +442 -248
- package/dist/chart-BK3sVPnD.js.map +1 -0
- package/dist/{checkbox-CPX7lBaU.js → checkbox-DYhUmZNw.js} +4 -4
- package/dist/checkbox-DYhUmZNw.js.map +1 -0
- package/dist/{clipboard-text-92YeCybc.js → clipboard-text-ssybngLw.js} +2 -2
- package/dist/{clipboard-text-92YeCybc.js.map → clipboard-text-ssybngLw.js.map} +1 -1
- package/dist/{code-DE1Yy1Cu.js → code-Cx-QSoOT.js} +2 -2
- package/dist/{code-DE1Yy1Cu.js.map → code-Cx-QSoOT.js.map} +1 -1
- package/dist/{combobox-B0bLdsX8.js → combobox-C0iW6a0r.js} +2 -2
- package/dist/{combobox-B0bLdsX8.js.map → combobox-C0iW6a0r.js.map} +1 -1
- package/dist/command-line/cli.js +22 -27
- package/dist/{command-palette-CBTY8EiF.js → command-palette-DGzioeki.js} +2 -2
- package/dist/command-palette-DGzioeki.js.map +1 -0
- package/dist/components/ai-actions.js +1 -1
- package/dist/components/ai-agent-card.js +1 -1
- package/dist/components/ai-approval.js +1 -1
- package/dist/components/ai-code-block.js +1 -1
- package/dist/components/ai-conversation.js +1 -1
- package/dist/components/ai-info-banner.js +1 -1
- package/dist/components/ai-message.js +1 -1
- package/dist/components/ai-mission-header.js +1 -1
- package/dist/components/ai-part-group.js +3 -0
- package/dist/components/ai-prompt-input.js +2 -2
- package/dist/components/ai-question.js +1 -1
- package/dist/components/ai-reasoning.js +1 -1
- package/dist/components/ai-response.js +1 -1
- package/dist/components/ai-shimmer.js +1 -1
- package/dist/components/ai-status-badge.js +1 -1
- package/dist/components/ai-streaming-text.js +1 -1
- package/dist/components/ai-subagent.js +1 -1
- package/dist/components/ai-suggestion.js +1 -1
- package/dist/components/ai-task-list.js +1 -1
- package/dist/components/ai-timeline.js +1 -1
- package/dist/components/ai-tool.js +1 -1
- package/dist/components/ai-usage-bar.js +1 -1
- package/dist/components/chart.js +3 -2
- package/dist/components/checkbox.js +1 -1
- package/dist/components/clipboard-text.js +1 -1
- package/dist/components/code.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/command-palette.js +1 -1
- package/dist/components/data-grid.js +1 -1
- package/dist/components/date-picker.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/filters.js +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/link.js +2 -2
- package/dist/components/link.js.map +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/radio.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/sensitive-input.js +1 -1
- package/dist/components/sidebar.js +1 -1
- package/dist/components/sparkline.js +3 -0
- package/dist/components/stat-card.js +3 -0
- package/dist/components/table.js +1 -1
- package/dist/components/text-roll.js +3 -0
- package/dist/components/theme-toggle.js +1 -1
- package/dist/components/use-agent-harness.js +1 -1
- package/dist/{data-grid-UJ9ja5cu.js → data-grid-CG76N_hK.js} +6 -6
- package/dist/data-grid-CG76N_hK.js.map +1 -0
- package/dist/{date-picker-ebekkC3R.js → date-picker-Dqg9L4xu.js} +2 -2
- package/dist/{date-picker-ebekkC3R.js.map → date-picker-Dqg9L4xu.js.map} +1 -1
- package/dist/{dist-BNlyONdD.js → dist-1-gcEL2L.js} +224 -135
- package/dist/dist-1-gcEL2L.js.map +1 -0
- package/dist/{dropdown-J5T4pHaR.js → dropdown-qnEYRFXZ.js} +2 -2
- package/dist/{dropdown-J5T4pHaR.js.map → dropdown-qnEYRFXZ.js.map} +1 -1
- package/dist/echart-DURZEyai.js +314 -0
- package/dist/echart-DURZEyai.js.map +1 -0
- package/dist/{filters-BdBogf7D.js → filters-Bw_U6ZTx.js} +5 -5
- package/dist/filters-Bw_U6ZTx.js.map +1 -0
- package/dist/flow-BRsYUCJa.js.map +1 -1
- package/dist/genui.js +2 -2
- package/dist/genui.js.map +1 -1
- package/dist/index.js +45 -42
- package/dist/index.js.map +1 -1
- package/dist/{input-BxQAnXki.js → input-DXYUjGgD.js} +2 -2
- package/dist/{input-BxQAnXki.js.map → input-DXYUjGgD.js.map} +1 -1
- package/dist/{input-Cn25I4o5.js → input-DddtBN-g.js} +2 -2
- package/dist/{input-Cn25I4o5.js.map → input-DddtBN-g.js.map} +1 -1
- package/dist/layer-card-BME0eljh.js.map +1 -1
- package/dist/{pagination-C_YqCy8l.js → pagination-BVqdlONY.js} +2 -2
- package/dist/{pagination-C_YqCy8l.js.map → pagination-BVqdlONY.js.map} +1 -1
- package/dist/primitives/otp-field.js +2 -0
- package/dist/primitives.js +1 -0
- package/dist/{radio-B7zg1wUI.js → radio-BNSwOt3B.js} +3 -3
- package/dist/radio-BNSwOt3B.js.map +1 -0
- package/dist/{select-9p721G00.js → select-1w2aebGQ.js} +2 -2
- package/dist/select-1w2aebGQ.js.map +1 -0
- package/dist/{sensitive-input-D5je2NLl.js → sensitive-input-82Cez3vj.js} +2 -2
- package/dist/{sensitive-input-D5je2NLl.js.map → sensitive-input-82Cez3vj.js.map} +1 -1
- package/dist/{sidebar-DOwBrq57.js → sidebar-CAsCmSpM.js} +3 -3
- package/dist/sidebar-CAsCmSpM.js.map +1 -0
- package/dist/sparkline-DdbeM4Ai.js +108 -0
- package/dist/sparkline-DdbeM4Ai.js.map +1 -0
- package/dist/src/blocks/agent-harness/agent-harness.d.ts +30 -9
- package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -1
- package/dist/src/blocks/agent-harness/agent-harness.stories.tsx +114 -0
- package/dist/src/blocks/agent-harness/agent-harness.tsx +144 -63
- package/dist/src/blocks/commander/commander.stories.tsx +31 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.d.ts +48 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.d.ts.map +1 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.stories.tsx +19 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.tsx +110 -0
- package/dist/src/blocks/dashboard-grid/index.d.ts +2 -0
- package/dist/src/blocks/dashboard-grid/index.d.ts.map +1 -0
- package/dist/src/blocks/delete-resource/delete-resource.stories.tsx +31 -0
- package/dist/src/blocks/map-block/map-block.stories.tsx +41 -0
- package/dist/src/blocks/metrics-overview/index.d.ts +2 -0
- package/dist/src/blocks/metrics-overview/index.d.ts.map +1 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.d.ts +67 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.d.ts.map +1 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.stories.tsx +26 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.tsx +139 -0
- package/dist/src/blocks/page-header/page-header.stories.tsx +56 -0
- package/dist/src/blocks/resource-list/resource-list.stories.tsx +31 -0
- package/dist/src/catalog/catalog.d.ts +1 -1
- package/dist/src/catalog/index.d.ts +1 -1
- package/dist/src/catalog/types.d.ts +1 -1
- package/dist/src/command-line/build-cli.d.ts +1 -1
- package/dist/src/command-line/cli.d.ts +1 -1
- package/dist/src/command-line/commands/add.d.ts +1 -1
- package/dist/src/command-line/commands/add.d.ts.map +1 -1
- package/dist/src/command-line/commands/ai.d.ts.map +1 -1
- package/dist/src/command-line/commands/blocks.d.ts +1 -1
- package/dist/src/command-line/commands/blocks.d.ts.map +1 -1
- package/dist/src/command-line/commands/doc.d.ts +1 -1
- package/dist/src/command-line/commands/doc.d.ts.map +1 -1
- package/dist/src/command-line/commands/ls.d.ts +1 -1
- package/dist/src/command-line/commands/ls.d.ts.map +1 -1
- package/dist/src/command-line/commands/migrate.d.ts +3 -3
- package/dist/src/command-line/commands/migrate.d.ts.map +1 -1
- package/dist/src/command-line/utils/config.d.ts +1 -1
- package/dist/src/command-line/utils/transformer.d.ts +1 -1
- package/dist/src/components/ai-part-group/ai-part-group.d.ts +134 -0
- package/dist/src/components/ai-part-group/ai-part-group.d.ts.map +1 -0
- package/dist/src/components/ai-part-group/index.d.ts +2 -0
- package/dist/src/components/ai-part-group/index.d.ts.map +1 -0
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +196 -7
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/controller.d.ts +41 -0
- package/dist/src/components/ai-prompt-input/controller.d.ts.map +1 -0
- package/dist/src/components/ai-prompt-input/index.d.ts +3 -1
- package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/types.d.ts +86 -0
- package/dist/src/components/ai-prompt-input/types.d.ts.map +1 -0
- package/dist/src/components/ai-reasoning/ai-reasoning.d.ts +17 -1
- package/dist/src/components/ai-reasoning/ai-reasoning.d.ts.map +1 -1
- package/dist/src/components/ai-response/ai-response.d.ts +1 -2
- package/dist/src/components/ai-response/ai-response.d.ts.map +1 -1
- package/dist/src/components/ai-task-list/ai-task-list.d.ts.map +1 -1
- package/dist/src/components/ai-tool/ai-tool.d.ts +17 -1
- package/dist/src/components/ai-tool/ai-tool.d.ts.map +1 -1
- package/dist/src/components/chart/area-chart.d.ts +69 -0
- package/dist/src/components/chart/area-chart.d.ts.map +1 -0
- package/dist/src/components/chart/bar-chart.d.ts +60 -0
- package/dist/src/components/chart/bar-chart.d.ts.map +1 -0
- package/dist/src/components/chart/color.d.ts +56 -0
- package/dist/src/components/chart/color.d.ts.map +1 -1
- package/dist/src/components/chart/echart.d.ts.map +1 -1
- package/dist/src/components/chart/index.d.ts +5 -0
- package/dist/src/components/chart/index.d.ts.map +1 -1
- package/dist/src/components/chart/pie-chart.d.ts +64 -0
- package/dist/src/components/chart/pie-chart.d.ts.map +1 -0
- package/dist/src/components/chart/scatter-chart.d.ts +57 -0
- package/dist/src/components/chart/scatter-chart.d.ts.map +1 -0
- package/dist/src/components/chart/stacked-bar-chart.d.ts +59 -0
- package/dist/src/components/chart/stacked-bar-chart.d.ts.map +1 -0
- package/dist/src/components/chart/timeseries-chart.d.ts.map +1 -1
- package/dist/src/components/code/code.d.ts +1 -1
- package/dist/src/components/command-palette/command-palette.d.ts +1 -1
- package/dist/src/components/data-grid/data-grid.d.ts.map +1 -1
- package/dist/src/components/data-grid/index.d.ts +1 -1
- package/dist/src/components/data-grid/index.d.ts.map +1 -1
- package/dist/src/components/data-grid/types.d.ts.map +1 -1
- package/dist/src/components/date-picker/date-picker.d.ts +2 -2
- package/dist/src/components/filters/filters.d.ts.map +1 -1
- package/dist/src/components/filters/helpers.d.ts.map +1 -1
- package/dist/src/components/filters/types.d.ts.map +1 -1
- package/dist/src/components/layer-card/layer-card.d.ts +1 -1
- package/dist/src/components/link/link.d.ts +2 -2
- package/dist/src/components/radio/radio.d.ts +1 -1
- package/dist/src/components/select/select.d.ts +1 -1
- package/dist/src/components/sidebar/sidebar.d.ts +2 -2
- package/dist/src/components/sparkline/index.d.ts +2 -0
- package/dist/src/components/sparkline/index.d.ts.map +1 -0
- package/dist/src/components/sparkline/sparkline.d.ts +52 -0
- package/dist/src/components/sparkline/sparkline.d.ts.map +1 -0
- package/dist/src/components/stat-card/index.d.ts +2 -0
- package/dist/src/components/{ai-loader → stat-card}/index.d.ts.map +1 -1
- package/dist/src/components/stat-card/stat-card.d.ts +80 -0
- package/dist/src/components/stat-card/stat-card.d.ts.map +1 -0
- package/dist/src/components/text-roll/index.d.ts +2 -0
- package/dist/src/components/text-roll/index.d.ts.map +1 -0
- package/dist/src/components/text-roll/text-roll.d.ts +49 -0
- package/dist/src/components/text-roll/text-roll.d.ts.map +1 -0
- package/dist/src/components/toast/toast.d.ts.map +1 -1
- package/dist/src/components/use-agent-harness/use-agent-harness.d.ts +2 -2
- package/dist/src/genui/genui.d.ts.map +1 -1
- package/dist/src/index.d.ts +5 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/primitives/index.d.ts +1 -0
- package/dist/src/primitives/index.d.ts.map +1 -1
- package/dist/src/primitives/otp-field.d.ts +13 -0
- package/dist/src/primitives/otp-field.d.ts.map +1 -0
- package/dist/src/registry/index.d.ts +1 -1
- package/dist/src/registry/types.d.ts +1 -1
- package/dist/stat-card-CEZscNh8.js +103 -0
- package/dist/stat-card-CEZscNh8.js.map +1 -0
- package/dist/styles/sf-binding.css +20 -62
- package/dist/styles/sf-standalone.css +2 -2
- package/dist/styles/shadcn.css +120 -0
- package/dist/styles/theme-blue-tint.css +98 -0
- package/dist/styles/theme-fedramp.css +3 -12
- package/dist/styles/theme-minimal.css +26 -104
- package/dist/styles/theme-sf.css +96 -114
- package/dist/{table-CIMx0Oq0.js → table-Rv4JMy0B.js} +2 -2
- package/dist/{table-CIMx0Oq0.js.map → table-Rv4JMy0B.js.map} +1 -1
- package/dist/text-roll-BZ3I1umc.js +79 -0
- package/dist/text-roll-BZ3I1umc.js.map +1 -0
- package/dist/{theme-toggle-Dpgnoj_Q.js → theme-toggle-Bhu681D7.js} +1 -1
- package/dist/{theme-toggle-Dpgnoj_Q.js.map → theme-toggle-Bhu681D7.js.map} +1 -1
- package/dist/{use-agent-harness-DZzcn96L.js → use-agent-harness-BMyF8pTq.js} +5 -5
- package/dist/use-agent-harness-BMyF8pTq.js.map +1 -0
- package/package.json +48 -19
- package/scripts/component-registry/discovery.ts +2 -2
- package/scripts/component-registry/index.ts +1 -1
- package/scripts/component-registry/props-filter.ts +1 -1
- package/scripts/component-registry/utils.ts +5 -5
- package/scripts/component-registry/variant-parser.ts +124 -19
- package/scripts/convert-demos-to-stories.ts +253 -0
- package/scripts/css-build.ts +4 -3
- package/scripts/generate-primitives.ts +11 -3
- package/scripts/theme-generator/config.ts +339 -71
- package/scripts/theme-generator/generate-css.ts +17 -3
- package/scripts/theme-generator/index.ts +3 -3
- package/scripts/theme-generator/migrate.ts +1 -1
- package/dist/ai-loader-Cr3eQkNS.js +0 -134
- package/dist/ai-loader-Cr3eQkNS.js.map +0 -1
- package/dist/ai-prompt-input-Bo1YuJly.js +0 -769
- package/dist/ai-prompt-input-Bo1YuJly.js.map +0 -1
- package/dist/ai-reasoning-UAmNx_LD.js.map +0 -1
- package/dist/ai-response-BWoVsNQG.js.map +0 -1
- package/dist/ai-task-list-B9CpMDYN.js.map +0 -1
- package/dist/ai-timeline-Bb5ntsr3.js.map +0 -1
- package/dist/ai-tool-BGH8nQ_D.js.map +0 -1
- package/dist/chart-Bes4MN3C.js.map +0 -1
- package/dist/checkbox-CPX7lBaU.js.map +0 -1
- package/dist/command-palette-CBTY8EiF.js.map +0 -1
- package/dist/components/ai-loader.js +0 -3
- package/dist/data-grid-UJ9ja5cu.js.map +0 -1
- package/dist/dist-BNlyONdD.js.map +0 -1
- package/dist/filters-BdBogf7D.js.map +0 -1
- package/dist/radio-B7zg1wUI.js.map +0 -1
- package/dist/select-9p721G00.js.map +0 -1
- package/dist/sidebar-DOwBrq57.js.map +0 -1
- package/dist/src/components/ai-loader/ai-loader.d.ts +0 -44
- package/dist/src/components/ai-loader/ai-loader.d.ts.map +0 -1
- package/dist/src/components/ai-loader/index.d.ts +0 -2
- package/dist/styles/theme-navigator.css +0 -137
- package/dist/use-agent-harness-DZzcn96L.js.map +0 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as Chart } from "./echart-DURZEyai.js";
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/sparkline/sparkline.tsx
|
|
6
|
+
/** Tailwind variant classes for Sparkline. */
|
|
7
|
+
var SF_SPARKLINE_VARIANTS = { variant: {
|
|
8
|
+
line: "",
|
|
9
|
+
area: "",
|
|
10
|
+
bars: ""
|
|
11
|
+
} };
|
|
12
|
+
/** Default variants for Sparkline. */
|
|
13
|
+
var SF_SPARKLINE_DEFAULT_VARIANTS = { variant: "line" };
|
|
14
|
+
/**
|
|
15
|
+
* Sparkline — a tiny inline chart intended for embedding in cards, tables, or
|
|
16
|
+
* row-level cells. Renders without axes, grid, or legend by default.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <Sparkline echarts={echarts} data={[1, 3, 2, 5, 4, 6]} />
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
function Sparkline({ echarts, data, color, height = 32, width = 80, variant = "line", tooltip, isDarkMode, className }) {
|
|
24
|
+
const options = useMemo(() => {
|
|
25
|
+
const normalised = typeof data[0] === "number" ? data.map((v, i) => [i, v]) : data;
|
|
26
|
+
const strokeColor = color ?? "#086FFF";
|
|
27
|
+
const common = {
|
|
28
|
+
grid: {
|
|
29
|
+
left: 0,
|
|
30
|
+
right: 0,
|
|
31
|
+
top: 2,
|
|
32
|
+
bottom: 2
|
|
33
|
+
},
|
|
34
|
+
xAxis: {
|
|
35
|
+
type: "value",
|
|
36
|
+
show: false
|
|
37
|
+
},
|
|
38
|
+
yAxis: {
|
|
39
|
+
type: "value",
|
|
40
|
+
show: false,
|
|
41
|
+
scale: true
|
|
42
|
+
},
|
|
43
|
+
tooltip: tooltip ? { trigger: "axis" } : { show: false }
|
|
44
|
+
};
|
|
45
|
+
if (variant === "bars") return {
|
|
46
|
+
...common,
|
|
47
|
+
series: [{
|
|
48
|
+
type: "bar",
|
|
49
|
+
data: normalised,
|
|
50
|
+
itemStyle: { color: strokeColor },
|
|
51
|
+
barCategoryGap: "20%"
|
|
52
|
+
}]
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
...common,
|
|
56
|
+
series: [{
|
|
57
|
+
type: "line",
|
|
58
|
+
smooth: true,
|
|
59
|
+
showSymbol: false,
|
|
60
|
+
data: normalised,
|
|
61
|
+
lineStyle: {
|
|
62
|
+
color: strokeColor,
|
|
63
|
+
width: 1.5
|
|
64
|
+
},
|
|
65
|
+
itemStyle: { color: strokeColor },
|
|
66
|
+
areaStyle: variant === "area" ? {
|
|
67
|
+
color: {
|
|
68
|
+
type: "linear",
|
|
69
|
+
x: 0,
|
|
70
|
+
y: 0,
|
|
71
|
+
x2: 0,
|
|
72
|
+
y2: 1,
|
|
73
|
+
colorStops: [{
|
|
74
|
+
offset: 0,
|
|
75
|
+
color: strokeColor
|
|
76
|
+
}, {
|
|
77
|
+
offset: 1,
|
|
78
|
+
color: "rgba(0,0,0,0)"
|
|
79
|
+
}]
|
|
80
|
+
},
|
|
81
|
+
opacity: .4
|
|
82
|
+
} : void 0
|
|
83
|
+
}]
|
|
84
|
+
};
|
|
85
|
+
}, [
|
|
86
|
+
data,
|
|
87
|
+
color,
|
|
88
|
+
variant,
|
|
89
|
+
tooltip
|
|
90
|
+
]);
|
|
91
|
+
return /* @__PURE__ */ jsx("div", {
|
|
92
|
+
style: {
|
|
93
|
+
width,
|
|
94
|
+
height
|
|
95
|
+
},
|
|
96
|
+
className,
|
|
97
|
+
children: /* @__PURE__ */ jsx(Chart, {
|
|
98
|
+
echarts,
|
|
99
|
+
options,
|
|
100
|
+
height,
|
|
101
|
+
isDarkMode
|
|
102
|
+
})
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//#endregion
|
|
106
|
+
export { SF_SPARKLINE_VARIANTS as n, Sparkline as r, SF_SPARKLINE_DEFAULT_VARIANTS as t };
|
|
107
|
+
|
|
108
|
+
//# sourceMappingURL=sparkline-DdbeM4Ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparkline-DdbeM4Ai.js","names":[],"sources":["../src/components/sparkline/sparkline.tsx"],"sourcesContent":["import type { EChartsOption } from \"echarts\";\nimport type * as echarts from \"echarts/core\";\nimport { useMemo } from \"react\";\n\nimport { Chart } from \"../chart/echart\";\n\n/** Tailwind variant classes for Sparkline. */\nexport const SF_SPARKLINE_VARIANTS = {\n variant: {\n line: \"\",\n area: \"\",\n bars: \"\",\n },\n} as const;\n\n/** Default variants for Sparkline. */\nexport const SF_SPARKLINE_DEFAULT_VARIANTS = {\n variant: \"line\",\n} as const;\n\n/** Props for `Sparkline` */\nexport interface SparklineProps {\n /**\n * The ECharts core instance imported by the consumer.\n * Passed in rather than imported directly so the consumer controls which\n * ECharts modules are bundled (tree-shaking).\n */\n echarts: typeof echarts;\n /**\n * Series data. Accepts either plain numbers (evenly spaced on the x-axis) or\n * `[x, y]` tuples when the x-axis has meaningful values.\n */\n data: number[] | [number, number][];\n /** Stroke/fill color. Defaults to the first categorical palette entry. */\n color?: string;\n /** Height of the sparkline in pixels. Defaults to `32`. */\n height?: number;\n /** Width of the sparkline in pixels. Defaults to `80`. */\n width?: number;\n /** Visual variant. Defaults to `\"line\"`. */\n variant?: \"line\" | \"area\" | \"bars\";\n /** When `true`, enables a tooltip on hover (disabled by default). */\n tooltip?: boolean;\n /** When `true`, switches ECharts to its built-in dark theme */\n isDarkMode?: boolean;\n /** Additional CSS classes applied to the chart container */\n className?: string;\n}\n\n/**\n * Sparkline — a tiny inline chart intended for embedding in cards, tables, or\n * row-level cells. Renders without axes, grid, or legend by default.\n *\n * @example\n * ```tsx\n * <Sparkline echarts={echarts} data={[1, 3, 2, 5, 4, 6]} />\n * ```\n */\nexport function Sparkline({\n echarts,\n data,\n color,\n height = 32,\n width = 80,\n variant = \"line\",\n tooltip,\n isDarkMode,\n className,\n}: SparklineProps) {\n const options = useMemo<EChartsOption>(() => {\n const normalised: [number, number][] =\n typeof data[0] === \"number\"\n ? (data as number[]).map((v, i) => [i, v])\n : (data as [number, number][]);\n\n const strokeColor = color ?? \"#086FFF\";\n\n const common = {\n grid: { left: 0, right: 0, top: 2, bottom: 2 },\n xAxis: { type: \"value\" as const, show: false },\n yAxis: { type: \"value\" as const, show: false, scale: true },\n tooltip: tooltip ? { trigger: \"axis\" as const } : { show: false },\n };\n\n if (variant === \"bars\") {\n return {\n ...common,\n series: [\n {\n type: \"bar\",\n data: normalised,\n itemStyle: { color: strokeColor },\n barCategoryGap: \"20%\",\n },\n ],\n };\n }\n\n return {\n ...common,\n series: [\n {\n type: \"line\",\n smooth: true,\n showSymbol: false,\n data: normalised,\n lineStyle: { color: strokeColor, width: 1.5 },\n itemStyle: { color: strokeColor },\n areaStyle:\n variant === \"area\"\n ? {\n color: {\n type: \"linear\" as const,\n x: 0,\n y: 0,\n x2: 0,\n y2: 1,\n colorStops: [\n { offset: 0, color: strokeColor },\n { offset: 1, color: \"rgba(0,0,0,0)\" },\n ],\n },\n opacity: 0.4,\n }\n : undefined,\n },\n ],\n };\n }, [data, color, variant, tooltip]);\n\n return (\n <div style={{ width, height }} className={className}>\n <Chart\n echarts={echarts}\n options={options}\n height={height}\n isDarkMode={isDarkMode}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;AAOA,IAAa,wBAAwB,EACnC,SAAS;CACP,MAAM;CACN,MAAM;CACN,MAAM;CACP,EACF;;AAGD,IAAa,gCAAgC,EAC3C,SAAS,QACV;;;;;;;;;;AAwCD,SAAgB,UAAU,EACxB,SACA,MACA,OACA,SAAS,IACT,QAAQ,IACR,UAAU,QACV,SACA,YACA,aACiB;CACjB,MAAM,UAAU,cAA6B;EAC3C,MAAM,aACJ,OAAO,KAAK,OAAO,WACd,KAAkB,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,GACvC;EAEP,MAAM,cAAc,SAAS;EAE7B,MAAM,SAAS;GACb,MAAM;IAAE,MAAM;IAAG,OAAO;IAAG,KAAK;IAAG,QAAQ;IAAG;GAC9C,OAAO;IAAE,MAAM;IAAkB,MAAM;IAAO;GAC9C,OAAO;IAAE,MAAM;IAAkB,MAAM;IAAO,OAAO;IAAM;GAC3D,SAAS,UAAU,EAAE,SAAS,QAAiB,GAAG,EAAE,MAAM,OAAO;GAClE;AAED,MAAI,YAAY,OACd,QAAO;GACL,GAAG;GACH,QAAQ,CACN;IACE,MAAM;IACN,MAAM;IACN,WAAW,EAAE,OAAO,aAAa;IACjC,gBAAgB;IACjB,CACF;GACF;AAGH,SAAO;GACL,GAAG;GACH,QAAQ,CACN;IACE,MAAM;IACN,QAAQ;IACR,YAAY;IACZ,MAAM;IACN,WAAW;KAAE,OAAO;KAAa,OAAO;KAAK;IAC7C,WAAW,EAAE,OAAO,aAAa;IACjC,WACE,YAAY,SACR;KACE,OAAO;MACL,MAAM;MACN,GAAG;MACH,GAAG;MACH,IAAI;MACJ,IAAI;MACJ,YAAY,CACV;OAAE,QAAQ;OAAG,OAAO;OAAa,EACjC;OAAE,QAAQ;OAAG,OAAO;OAAiB,CACtC;MACF;KACD,SAAS;KACV,GACD,KAAA;IACP,CACF;GACF;IACA;EAAC;EAAM;EAAO;EAAS;EAAQ,CAAC;AAEnC,QACE,oBAAC,OAAD;EAAK,OAAO;GAAE;GAAO;GAAQ;EAAa;YACxC,oBAAC,OAAD;GACW;GACA;GACD;GACI;GACZ,CAAA;EACE,CAAA"}
|
|
@@ -79,15 +79,14 @@ export interface AgentHarnessProps extends ComponentProps<"div"> {
|
|
|
79
79
|
*/
|
|
80
80
|
hitlPlacement?: SFAgentHarnessHitlPlacement;
|
|
81
81
|
/**
|
|
82
|
-
*
|
|
83
|
-
* @
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
*
|
|
88
|
-
* @default true
|
|
82
|
+
* Group ephemeral activity (reasoning, observations, tool calls) into a
|
|
83
|
+
* single rolling {@link AiPartGroup} per assistant message. While
|
|
84
|
+
* streaming, the group shows a persistent title row with the latest few
|
|
85
|
+
* activity rows underneath. On completion (or scroll-back), the group
|
|
86
|
+
* collapses to a single frozen summary line.
|
|
87
|
+
* @default false
|
|
89
88
|
*/
|
|
90
|
-
|
|
89
|
+
groupActivity?: boolean;
|
|
91
90
|
/**
|
|
92
91
|
* Show token usage bar above the prompt input.
|
|
93
92
|
* @default true
|
|
@@ -148,6 +147,28 @@ export interface AgentHarnessProps extends ComponentProps<"div"> {
|
|
|
148
147
|
modeId: string;
|
|
149
148
|
modeName: string;
|
|
150
149
|
}[];
|
|
150
|
+
/**
|
|
151
|
+
* Available models for the model selector in the toolbar.
|
|
152
|
+
* When provided, a model selector will be shown in the prompt input toolbar.
|
|
153
|
+
*/
|
|
154
|
+
availableModels?: {
|
|
155
|
+
value: string;
|
|
156
|
+
label?: string;
|
|
157
|
+
}[];
|
|
158
|
+
/**
|
|
159
|
+
* Rendering style for the mode picker.
|
|
160
|
+
* - `"select"` (default): compact dropdown
|
|
161
|
+
* - `"cycle"`: single click-to-cycle button
|
|
162
|
+
* @default "select"
|
|
163
|
+
*/
|
|
164
|
+
modeVariant?: "select" | "cycle";
|
|
165
|
+
/**
|
|
166
|
+
* Rendering style for the model picker.
|
|
167
|
+
* - `"select"` (default): compact dropdown
|
|
168
|
+
* - `"cycle"`: single click-to-cycle button
|
|
169
|
+
* @default "select"
|
|
170
|
+
*/
|
|
171
|
+
modelVariant?: "select" | "cycle";
|
|
151
172
|
}
|
|
152
173
|
/**
|
|
153
174
|
* `AgentHarness` — a full-chrome agent chat UI block.
|
|
@@ -168,7 +189,7 @@ export interface AgentHarnessProps extends ComponentProps<"div"> {
|
|
|
168
189
|
* }
|
|
169
190
|
* ```
|
|
170
191
|
*/
|
|
171
|
-
export declare function AgentHarness({ adapter, state: controlledState, onSendMessage, onApproveToolCall, onAnswerQuestion, onApprovePlan, onAbort, hitlPlacement,
|
|
192
|
+
export declare function AgentHarness({ adapter, state: controlledState, onSendMessage, onApproveToolCall, onAnswerQuestion, onApprovePlan, onAbort, hitlPlacement, groupActivity, showUsage, showTaskList, placeholder, header, footer, emptyState, renderSubmit, suggestions, onSuggestionClick, allowAttachments, allowSpeech, availableModes, availableModels, modeVariant, modelVariant, className, ...props }: AgentHarnessProps): import("react/jsx-runtime").JSX.Element;
|
|
172
193
|
export declare namespace AgentHarness {
|
|
173
194
|
var displayName: string;
|
|
174
195
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-harness.d.ts","sourceRoot":"","sources":["../../../../src/blocks/agent-harness/agent-harness.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,EAElB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EAChB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-harness.d.ts","sourceRoot":"","sources":["../../../../src/blocks/agent-harness/agent-harness.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
AgentHarness,
|
|
6
|
+
type HarnessAdapter,
|
|
7
|
+
type HarnessEvent,
|
|
8
|
+
} from "./agent-harness";
|
|
9
|
+
|
|
10
|
+
function createMockAdapter(): HarnessAdapter {
|
|
11
|
+
const listeners = new Set<(event: HarnessEvent) => void>();
|
|
12
|
+
|
|
13
|
+
return {
|
|
14
|
+
subscribe(listener) {
|
|
15
|
+
listeners.add(listener);
|
|
16
|
+
return () => listeners.delete(listener);
|
|
17
|
+
},
|
|
18
|
+
async sendMessage({ content }) {
|
|
19
|
+
const id = crypto.randomUUID();
|
|
20
|
+
listeners.forEach((listener) =>
|
|
21
|
+
listener({
|
|
22
|
+
type: "message_start",
|
|
23
|
+
messageId: id,
|
|
24
|
+
role: "assistant",
|
|
25
|
+
} as HarnessEvent)
|
|
26
|
+
);
|
|
27
|
+
listeners.forEach((listener) =>
|
|
28
|
+
listener({
|
|
29
|
+
type: "message_update",
|
|
30
|
+
messageId: id,
|
|
31
|
+
contentDelta: `You said: ${content}`,
|
|
32
|
+
} as HarnessEvent)
|
|
33
|
+
);
|
|
34
|
+
listeners.forEach((listener) =>
|
|
35
|
+
listener({ type: "message_end", messageId: id } as HarnessEvent)
|
|
36
|
+
);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function AgentHarnessFullStory() {
|
|
42
|
+
const [adapter] = useState(() => createMockAdapter());
|
|
43
|
+
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
adapter.sendMessage({ content: "Build an AI agent dashboard" });
|
|
46
|
+
}, [adapter]);
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<div style={{ height: 560 }}>
|
|
50
|
+
<AgentHarness
|
|
51
|
+
adapter={adapter}
|
|
52
|
+
hitlPlacement="inline"
|
|
53
|
+
showMode
|
|
54
|
+
showModel
|
|
55
|
+
showUsage
|
|
56
|
+
showTaskList
|
|
57
|
+
placeholder="Type a message…"
|
|
58
|
+
suggestions={[
|
|
59
|
+
"Refactor the auth module",
|
|
60
|
+
"Explain the JWT flow",
|
|
61
|
+
"Add refresh token rotation",
|
|
62
|
+
]}
|
|
63
|
+
footer="AI can make mistakes. Review changes before applying."
|
|
64
|
+
/>
|
|
65
|
+
</div>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function AgentHarnessMinimalStory() {
|
|
70
|
+
const [adapter] = useState(() => createMockAdapter());
|
|
71
|
+
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
adapter.sendMessage({ content: "Hello" });
|
|
74
|
+
}, [adapter]);
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<div style={{ height: 400 }}>
|
|
78
|
+
<AgentHarness
|
|
79
|
+
adapter={adapter}
|
|
80
|
+
hitlPlacement="inline"
|
|
81
|
+
showMode={false}
|
|
82
|
+
showModel={false}
|
|
83
|
+
showUsage={false}
|
|
84
|
+
showTaskList={false}
|
|
85
|
+
placeholder="Send a message…"
|
|
86
|
+
emptyState={
|
|
87
|
+
<div className="flex flex-col items-center gap-2">
|
|
88
|
+
<span className="text-3xl">🤖</span>
|
|
89
|
+
<p className="text-sm text-sf-subtle">Ready when you are.</p>
|
|
90
|
+
</div>
|
|
91
|
+
}
|
|
92
|
+
/>
|
|
93
|
+
</div>
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const meta: Meta<any> = {
|
|
98
|
+
title: "Blocks/AgentHarness",
|
|
99
|
+
parameters: {
|
|
100
|
+
layout: "padded",
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export default meta;
|
|
105
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
106
|
+
type Story = StoryObj<any>;
|
|
107
|
+
|
|
108
|
+
export const Full: Story = {
|
|
109
|
+
render: () => <AgentHarnessFullStory />,
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
export const Minimal: Story = {
|
|
113
|
+
render: () => <AgentHarnessMinimalStory />,
|
|
114
|
+
};
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
useAgentHarness,
|
|
32
32
|
} from "../../components/use-agent-harness";
|
|
33
33
|
import {
|
|
34
|
+
AiPartGroup,
|
|
34
35
|
AiApproval,
|
|
35
36
|
AiConversation,
|
|
36
37
|
AiConversationScrollButton,
|
|
@@ -45,13 +46,17 @@ import {
|
|
|
45
46
|
AiResponse,
|
|
46
47
|
AiSubagent,
|
|
47
48
|
AiTaskList,
|
|
49
|
+
AiToolCall,
|
|
48
50
|
AiToolCallGroup,
|
|
49
51
|
AiUsageBar,
|
|
50
52
|
Button,
|
|
51
53
|
PromptInput,
|
|
52
54
|
PromptInputAttachButton,
|
|
53
55
|
PromptInputBackLayer,
|
|
54
|
-
|
|
56
|
+
PromptInputModeCycle,
|
|
57
|
+
PromptInputModeSelect,
|
|
58
|
+
PromptInputModelCycle,
|
|
59
|
+
PromptInputModelSelect,
|
|
55
60
|
PromptInputSpeechButton,
|
|
56
61
|
PromptInputSubmit,
|
|
57
62
|
PromptInputTextarea,
|
|
@@ -160,15 +165,14 @@ export interface AgentHarnessProps extends ComponentProps<"div"> {
|
|
|
160
165
|
*/
|
|
161
166
|
hitlPlacement?: SFAgentHarnessHitlPlacement;
|
|
162
167
|
/**
|
|
163
|
-
*
|
|
164
|
-
* @
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
*
|
|
169
|
-
* @default true
|
|
168
|
+
* Group ephemeral activity (reasoning, observations, tool calls) into a
|
|
169
|
+
* single rolling {@link AiPartGroup} per assistant message. While
|
|
170
|
+
* streaming, the group shows a persistent title row with the latest few
|
|
171
|
+
* activity rows underneath. On completion (or scroll-back), the group
|
|
172
|
+
* collapses to a single frozen summary line.
|
|
173
|
+
* @default false
|
|
170
174
|
*/
|
|
171
|
-
|
|
175
|
+
groupActivity?: boolean;
|
|
172
176
|
/**
|
|
173
177
|
* Show token usage bar above the prompt input.
|
|
174
178
|
* @default true
|
|
@@ -226,16 +230,29 @@ export interface AgentHarnessProps extends ComponentProps<"div"> {
|
|
|
226
230
|
* When provided, a mode selector will be shown in the prompt input toolbar.
|
|
227
231
|
*/
|
|
228
232
|
availableModes?: { modeId: string; modeName: string }[];
|
|
233
|
+
/**
|
|
234
|
+
* Available models for the model selector in the toolbar.
|
|
235
|
+
* When provided, a model selector will be shown in the prompt input toolbar.
|
|
236
|
+
*/
|
|
237
|
+
availableModels?: { value: string; label?: string }[];
|
|
238
|
+
/**
|
|
239
|
+
* Rendering style for the mode picker.
|
|
240
|
+
* - `"select"` (default): compact dropdown
|
|
241
|
+
* - `"cycle"`: single click-to-cycle button
|
|
242
|
+
* @default "select"
|
|
243
|
+
*/
|
|
244
|
+
modeVariant?: "select" | "cycle";
|
|
245
|
+
/**
|
|
246
|
+
* Rendering style for the model picker.
|
|
247
|
+
* - `"select"` (default): compact dropdown
|
|
248
|
+
* - `"cycle"`: single click-to-cycle button
|
|
249
|
+
* @default "select"
|
|
250
|
+
*/
|
|
251
|
+
modelVariant?: "select" | "cycle";
|
|
229
252
|
}
|
|
230
253
|
|
|
231
254
|
// ─── Internal helpers ─────────────────────────────────────────────────────────
|
|
232
255
|
|
|
233
|
-
function getModelDisplayName(modelId?: string, modelName?: string): string {
|
|
234
|
-
if (modelName) return modelName;
|
|
235
|
-
if (!modelId) return "";
|
|
236
|
-
return modelId.split("/").pop() ?? modelId;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
256
|
/** Render a single OM activity as an AiReasoning with the right icon/label. */
|
|
240
257
|
function OmActivityView({ activity }: { activity: AgentOMActivity }) {
|
|
241
258
|
const isObservation = activity.type === "observation";
|
|
@@ -407,6 +424,7 @@ function AssistantMessageBody({
|
|
|
407
424
|
message,
|
|
408
425
|
harnessState,
|
|
409
426
|
hitlPlacement,
|
|
427
|
+
groupActivity = false,
|
|
410
428
|
onApprove,
|
|
411
429
|
onReject,
|
|
412
430
|
onAnswer,
|
|
@@ -416,6 +434,7 @@ function AssistantMessageBody({
|
|
|
416
434
|
message: AgentMessage;
|
|
417
435
|
harnessState: AgentHarnessState;
|
|
418
436
|
hitlPlacement: SFAgentHarnessHitlPlacement;
|
|
437
|
+
groupActivity?: boolean;
|
|
419
438
|
onApprove: () => void;
|
|
420
439
|
onReject: () => void;
|
|
421
440
|
onAnswer: (questionId: string, answer: string) => void;
|
|
@@ -453,25 +472,77 @@ function AssistantMessageBody({
|
|
|
453
472
|
|
|
454
473
|
const showInlineHitl = hitlPlacement === "inline" || hitlPlacement === "both";
|
|
455
474
|
|
|
475
|
+
// Top-level tool call parts (no subagent)
|
|
476
|
+
const topLevelToolCalls = message.toolCallIds
|
|
477
|
+
.map((id) => harnessState.toolCalls[id])
|
|
478
|
+
.filter((tc) => tc != null);
|
|
479
|
+
|
|
480
|
+
const hasActivity =
|
|
481
|
+
thinkingBlocks.length > 0 ||
|
|
482
|
+
omActivities.length > 0 ||
|
|
483
|
+
topLevelToolCalls.length > 0;
|
|
484
|
+
|
|
456
485
|
return (
|
|
457
486
|
<div className="flex flex-col gap-2">
|
|
458
|
-
{
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
487
|
+
{groupActivity && hasActivity ? (
|
|
488
|
+
<AiPartGroup
|
|
489
|
+
complete={!message.isStreaming}
|
|
490
|
+
groupKey={`${message.id}:activity`}
|
|
491
|
+
max={3}
|
|
492
|
+
>
|
|
493
|
+
{thinkingBlocks.map((t) => (
|
|
494
|
+
<AiReasoning
|
|
495
|
+
key={t.id}
|
|
496
|
+
part={{ text: t.text }}
|
|
497
|
+
isStreaming={t.isStreaming}
|
|
498
|
+
variant="ephemeral"
|
|
499
|
+
/>
|
|
500
|
+
))}
|
|
501
|
+
{omActivities.map((a) => (
|
|
502
|
+
<AiReasoning
|
|
503
|
+
key={a.id}
|
|
504
|
+
part={{ text: a.text || a.type }}
|
|
505
|
+
isStreaming={a.status === "streaming"}
|
|
506
|
+
variant="ephemeral"
|
|
507
|
+
/>
|
|
508
|
+
))}
|
|
509
|
+
{topLevelToolCalls.map((tc) => (
|
|
510
|
+
<AiToolCall
|
|
511
|
+
key={tc.id}
|
|
512
|
+
part={{
|
|
513
|
+
toolCallId: tc.id,
|
|
514
|
+
toolName: tc.toolName,
|
|
515
|
+
state: tc.state,
|
|
516
|
+
input: tc.input,
|
|
517
|
+
output: tc.output,
|
|
518
|
+
errorText: tc.errorText,
|
|
519
|
+
}}
|
|
520
|
+
duration={tc.durationMs}
|
|
521
|
+
variant="ephemeral"
|
|
522
|
+
/>
|
|
523
|
+
))}
|
|
524
|
+
</AiPartGroup>
|
|
525
|
+
) : (
|
|
526
|
+
<>
|
|
527
|
+
{/* Thinking / reasoning blocks */}
|
|
528
|
+
{thinkingBlocks.map((t) => (
|
|
529
|
+
<AiReasoning
|
|
530
|
+
key={t.id}
|
|
531
|
+
part={{ text: t.text }}
|
|
532
|
+
isStreaming={t.isStreaming}
|
|
533
|
+
icon={SparkleIcon}
|
|
534
|
+
label="Reasoning"
|
|
535
|
+
streamingLabel="Thinking..."
|
|
536
|
+
variant="default"
|
|
537
|
+
/>
|
|
538
|
+
))}
|
|
539
|
+
|
|
540
|
+
{/* OM activities (observations / reflections) */}
|
|
541
|
+
{omActivities.map((a) => (
|
|
542
|
+
<OmActivityView key={a.id} activity={a} />
|
|
543
|
+
))}
|
|
544
|
+
</>
|
|
545
|
+
)}
|
|
475
546
|
|
|
476
547
|
{/* Response text */}
|
|
477
548
|
{message.content && (
|
|
@@ -480,8 +551,8 @@ function AssistantMessageBody({
|
|
|
480
551
|
</AiResponse>
|
|
481
552
|
)}
|
|
482
553
|
|
|
483
|
-
{/* Tool calls (top-level, no subagent) */}
|
|
484
|
-
{message.toolCallIds.length > 0 && (
|
|
554
|
+
{/* Tool calls (top-level, no subagent) — only when not grouped */}
|
|
555
|
+
{!groupActivity && message.toolCallIds.length > 0 && (
|
|
485
556
|
<ToolCallsView
|
|
486
557
|
toolCallIds={message.toolCallIds}
|
|
487
558
|
toolCalls={harnessState.toolCalls}
|
|
@@ -636,8 +707,7 @@ export function AgentHarness({
|
|
|
636
707
|
onApprovePlan,
|
|
637
708
|
onAbort,
|
|
638
709
|
hitlPlacement = SF_AGENT_HARNESS_DEFAULT_VARIANTS.hitlPlacement,
|
|
639
|
-
|
|
640
|
-
showModel = true,
|
|
710
|
+
groupActivity = false,
|
|
641
711
|
showUsage = true,
|
|
642
712
|
showTaskList = true,
|
|
643
713
|
placeholder = "Ask anything...",
|
|
@@ -650,6 +720,9 @@ export function AgentHarness({
|
|
|
650
720
|
allowAttachments = false,
|
|
651
721
|
allowSpeech = false,
|
|
652
722
|
availableModes,
|
|
723
|
+
availableModels,
|
|
724
|
+
modeVariant = "select",
|
|
725
|
+
modelVariant = "select",
|
|
653
726
|
className,
|
|
654
727
|
...props
|
|
655
728
|
}: AgentHarnessProps) {
|
|
@@ -881,6 +954,7 @@ export function AgentHarness({
|
|
|
881
954
|
message={msg}
|
|
882
955
|
harnessState={state}
|
|
883
956
|
hitlPlacement={hitlPlacement}
|
|
957
|
+
groupActivity={groupActivity}
|
|
884
958
|
onApprove={handleApprove}
|
|
885
959
|
onReject={handleReject}
|
|
886
960
|
onAnswer={handleAnswer}
|
|
@@ -1047,33 +1121,40 @@ export function AgentHarness({
|
|
|
1047
1121
|
<PromptInputTools>
|
|
1048
1122
|
{allowAttachments && <PromptInputAttachButton />}
|
|
1049
1123
|
{allowSpeech && <PromptInputSpeechButton />}
|
|
1050
|
-
{availableModes &&
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
{
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1124
|
+
{availableModes &&
|
|
1125
|
+
availableModes.length > 0 &&
|
|
1126
|
+
(modeVariant === "cycle" ? (
|
|
1127
|
+
<PromptInputModeCycle
|
|
1128
|
+
options={availableModes.map((m) => ({
|
|
1129
|
+
value: m.modeId,
|
|
1130
|
+
label: m.modeName,
|
|
1131
|
+
}))}
|
|
1132
|
+
value={state.modeId}
|
|
1133
|
+
onChange={selectMode}
|
|
1134
|
+
/>
|
|
1135
|
+
) : (
|
|
1136
|
+
<PromptInputModeSelect
|
|
1137
|
+
options={availableModes.map((m) => ({
|
|
1138
|
+
value: m.modeId,
|
|
1139
|
+
label: m.modeName,
|
|
1140
|
+
}))}
|
|
1141
|
+
value={state.modeId}
|
|
1142
|
+
onChange={selectMode}
|
|
1143
|
+
/>
|
|
1144
|
+
))}
|
|
1145
|
+
{availableModels &&
|
|
1146
|
+
availableModels.length > 0 &&
|
|
1147
|
+
(modelVariant === "cycle" ? (
|
|
1148
|
+
<PromptInputModelCycle
|
|
1149
|
+
options={availableModels}
|
|
1150
|
+
value={state.modelId}
|
|
1151
|
+
/>
|
|
1152
|
+
) : (
|
|
1153
|
+
<PromptInputModelSelect
|
|
1154
|
+
options={availableModels}
|
|
1155
|
+
value={state.modelId}
|
|
1156
|
+
/>
|
|
1157
|
+
))}
|
|
1077
1158
|
</PromptInputTools>
|
|
1078
1159
|
{renderSubmit ? (
|
|
1079
1160
|
renderSubmit(state)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
CommanderFullDemo as Demo_CommanderFullDemo,
|
|
5
|
+
CommanderTimelineOnlyDemo as Demo_CommanderTimelineOnlyDemo,
|
|
6
|
+
CommanderCardsOnlyDemo as Demo_CommanderCardsOnlyDemo,
|
|
7
|
+
} from "../../../../docs/src/components/demos/CommanderDemo";
|
|
8
|
+
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
const meta: Meta<any> = {
|
|
11
|
+
title: "Blocks/Commander",
|
|
12
|
+
parameters: {
|
|
13
|
+
layout: "padded",
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default meta;
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
+
type Story = StoryObj<any>;
|
|
20
|
+
|
|
21
|
+
export const Full: Story = {
|
|
22
|
+
render: () => <Demo_CommanderFullDemo />,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const TimelineOnly: Story = {
|
|
26
|
+
render: () => <Demo_CommanderTimelineOnlyDemo />,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const CardsOnly: Story = {
|
|
30
|
+
render: () => <Demo_CommanderCardsOnlyDemo />,
|
|
31
|
+
};
|