@signalflare-ai/ui 0.5.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 +96 -0
- package/README.md +527 -0
- package/ai/USAGE.md +200 -0
- package/ai/component-registry.json +7103 -0
- package/ai/component-registry.md +3046 -0
- package/ai/schemas.ts +1230 -0
- package/bin/intent.js +23 -0
- package/bin/sf.js +34 -0
- package/dist/.build-complete +1 -0
- package/dist/ai/schemas.d.ts +7056 -0
- package/dist/ai/schemas.d.ts.map +1 -0
- package/dist/ai-actions-DG1dhDMP.js +57 -0
- package/dist/ai-actions-DG1dhDMP.js.map +1 -0
- package/dist/ai-agent-card-BbtL4NII.js +171 -0
- package/dist/ai-agent-card-BbtL4NII.js.map +1 -0
- package/dist/ai-approval-Mb7-BY6i.js +184 -0
- package/dist/ai-approval-Mb7-BY6i.js.map +1 -0
- package/dist/ai-code-block-BI_z0UVR.js +110 -0
- package/dist/ai-code-block-BI_z0UVR.js.map +1 -0
- package/dist/ai-conversation-DYtExcrw.js +184 -0
- package/dist/ai-conversation-DYtExcrw.js.map +1 -0
- package/dist/ai-info-banner-BpzauUAY.js +76 -0
- package/dist/ai-info-banner-BpzauUAY.js.map +1 -0
- package/dist/ai-loader-Cr3eQkNS.js +134 -0
- package/dist/ai-loader-Cr3eQkNS.js.map +1 -0
- package/dist/ai-message-CV8SBoHM.js +286 -0
- package/dist/ai-message-CV8SBoHM.js.map +1 -0
- package/dist/ai-mission-header-ByYkJ6YP.js +171 -0
- package/dist/ai-mission-header-ByYkJ6YP.js.map +1 -0
- package/dist/ai-prompt-input-Bo1YuJly.js +769 -0
- package/dist/ai-prompt-input-Bo1YuJly.js.map +1 -0
- package/dist/ai-question-Dp1g9k2o.js +149 -0
- package/dist/ai-question-Dp1g9k2o.js.map +1 -0
- package/dist/ai-reasoning-UAmNx_LD.js +270 -0
- package/dist/ai-reasoning-UAmNx_LD.js.map +1 -0
- package/dist/ai-response-BWoVsNQG.js +42 -0
- package/dist/ai-response-BWoVsNQG.js.map +1 -0
- package/dist/ai-shimmer-BpOmfonu.js +43 -0
- package/dist/ai-shimmer-BpOmfonu.js.map +1 -0
- package/dist/ai-status-badge-WhbKVeqn.js +63 -0
- package/dist/ai-status-badge-WhbKVeqn.js.map +1 -0
- package/dist/ai-streaming-text-ClL7FwvD.js +81 -0
- package/dist/ai-streaming-text-ClL7FwvD.js.map +1 -0
- package/dist/ai-subagent-BruGN1UE.js +133 -0
- package/dist/ai-subagent-BruGN1UE.js.map +1 -0
- package/dist/ai-suggestion-CNsCZj5P.js +55 -0
- package/dist/ai-suggestion-CNsCZj5P.js.map +1 -0
- package/dist/ai-task-list-B9CpMDYN.js +120 -0
- package/dist/ai-task-list-B9CpMDYN.js.map +1 -0
- package/dist/ai-timeline-Bb5ntsr3.js +373 -0
- package/dist/ai-timeline-Bb5ntsr3.js.map +1 -0
- package/dist/ai-tool-BGH8nQ_D.js +437 -0
- package/dist/ai-tool-BGH8nQ_D.js.map +1 -0
- package/dist/ai-usage-bar-BI-p-JBk.js +70 -0
- package/dist/ai-usage-bar-BI-p-JBk.js.map +1 -0
- package/dist/badge-D_eaA6wv.js +128 -0
- package/dist/badge-D_eaA6wv.js.map +1 -0
- package/dist/banner-B_6oBrsu.js +54 -0
- package/dist/banner-B_6oBrsu.js.map +1 -0
- package/dist/breadcrumbs-BlmeYfgq.js +128 -0
- package/dist/breadcrumbs-BlmeYfgq.js.map +1 -0
- package/dist/button-De0267YU.js +170 -0
- package/dist/button-De0267YU.js.map +1 -0
- package/dist/catalog.js +506 -0
- package/dist/catalog.js.map +1 -0
- package/dist/chart-Bes4MN3C.js +618 -0
- package/dist/chart-Bes4MN3C.js.map +1 -0
- package/dist/checkbox-CPX7lBaU.js +153 -0
- package/dist/checkbox-CPX7lBaU.js.map +1 -0
- package/dist/clipboard-text-92YeCybc.js +176 -0
- package/dist/clipboard-text-92YeCybc.js.map +1 -0
- package/dist/cn-YROP2_ox.js +25 -0
- package/dist/cn-YROP2_ox.js.map +1 -0
- package/dist/code-DE1Yy1Cu.js +97 -0
- package/dist/code-DE1Yy1Cu.js.map +1 -0
- package/dist/collapsible-DWsXeXmS.js +72 -0
- package/dist/collapsible-DWsXeXmS.js.map +1 -0
- package/dist/combobox-B0bLdsX8.js +197 -0
- package/dist/combobox-B0bLdsX8.js.map +1 -0
- package/dist/command-line/cli.js +823 -0
- package/dist/command-palette-CBTY8EiF.js +484 -0
- package/dist/command-palette-CBTY8EiF.js.map +1 -0
- package/dist/components/ai-actions.js +3 -0
- package/dist/components/ai-agent-card.js +3 -0
- package/dist/components/ai-approval.js +3 -0
- package/dist/components/ai-code-block.js +3 -0
- package/dist/components/ai-conversation.js +3 -0
- package/dist/components/ai-info-banner.js +3 -0
- package/dist/components/ai-loader.js +3 -0
- package/dist/components/ai-message.js +3 -0
- package/dist/components/ai-mission-header.js +3 -0
- package/dist/components/ai-prompt-input.js +3 -0
- package/dist/components/ai-question.js +3 -0
- package/dist/components/ai-reasoning.js +3 -0
- package/dist/components/ai-response.js +3 -0
- package/dist/components/ai-shimmer.js +3 -0
- package/dist/components/ai-status-badge.js +3 -0
- package/dist/components/ai-streaming-text.js +3 -0
- package/dist/components/ai-subagent.js +3 -0
- package/dist/components/ai-suggestion.js +3 -0
- package/dist/components/ai-task-list.js +3 -0
- package/dist/components/ai-timeline.js +3 -0
- package/dist/components/ai-tool.js +3 -0
- package/dist/components/ai-usage-bar.js +3 -0
- package/dist/components/badge.js +3 -0
- package/dist/components/banner.js +3 -0
- package/dist/components/breadcrumbs.js +3 -0
- package/dist/components/button.js +3 -0
- package/dist/components/chart.js +3 -0
- package/dist/components/checkbox.js +3 -0
- package/dist/components/clipboard-text.js +3 -0
- package/dist/components/code.js +3 -0
- package/dist/components/collapsible.js +3 -0
- package/dist/components/combobox.js +3 -0
- package/dist/components/command-palette.js +3 -0
- package/dist/components/data-grid.js +3 -0
- package/dist/components/date-picker.js +3 -0
- package/dist/components/date-range-picker.js +3 -0
- package/dist/components/dialog.js +3 -0
- package/dist/components/dropdown.js +3 -0
- package/dist/components/empty.js +3 -0
- package/dist/components/field.js +3 -0
- package/dist/components/filters.js +3 -0
- package/dist/components/flow.js +3 -0
- package/dist/components/grid.js +3 -0
- package/dist/components/input.js +4 -0
- package/dist/components/label.js +3 -0
- package/dist/components/layer-card.js +3 -0
- package/dist/components/link.js +92 -0
- package/dist/components/link.js.map +1 -0
- package/dist/components/loader.js +4 -0
- package/dist/components/menubar.js +3 -0
- package/dist/components/meter.js +3 -0
- package/dist/components/pagination.js +3 -0
- package/dist/components/popover.js +3 -0
- package/dist/components/radio.js +3 -0
- package/dist/components/select.js +3 -0
- package/dist/components/sensitive-input.js +3 -0
- package/dist/components/sidebar.js +3 -0
- package/dist/components/signalflare-ai-logo.js +3 -0
- package/dist/components/surface.js +3 -0
- package/dist/components/switch.js +3 -0
- package/dist/components/table.js +3 -0
- package/dist/components/tabs.js +3 -0
- package/dist/components/text.js +3 -0
- package/dist/components/theme-toggle.js +3 -0
- package/dist/components/toast.js +3 -0
- package/dist/components/tooltip.js +3 -0
- package/dist/components/use-agent-harness.js +3 -0
- package/dist/data-grid-UJ9ja5cu.js +305 -0
- package/dist/data-grid-UJ9ja5cu.js.map +1 -0
- package/dist/date-picker-ebekkC3R.js +57 -0
- package/dist/date-picker-ebekkC3R.js.map +1 -0
- package/dist/date-range-picker-D75LLINc.js +347 -0
- package/dist/date-range-picker-D75LLINc.js.map +1 -0
- package/dist/dialog-CyHEQXEY.js +104 -0
- package/dist/dialog-CyHEQXEY.js.map +1 -0
- package/dist/dist-BNlyONdD.js +3546 -0
- package/dist/dist-BNlyONdD.js.map +1 -0
- package/dist/dropdown-J5T4pHaR.js +202 -0
- package/dist/dropdown-J5T4pHaR.js.map +1 -0
- package/dist/empty-D2TypIId.js +90 -0
- package/dist/empty-D2TypIId.js.map +1 -0
- package/dist/favicon.svg +4 -0
- package/dist/field-Y_UK1_Cg.js +57 -0
- package/dist/field-Y_UK1_Cg.js.map +1 -0
- package/dist/filters-BdBogf7D.js +682 -0
- package/dist/filters-BdBogf7D.js.map +1 -0
- package/dist/flow-BRsYUCJa.js +741 -0
- package/dist/flow-BRsYUCJa.js.map +1 -0
- package/dist/genui.js +40 -0
- package/dist/genui.js.map +1 -0
- package/dist/grid-qUAN9hFx.js +119 -0
- package/dist/grid-qUAN9hFx.js.map +1 -0
- package/dist/highlight-to-react-ClEfL81q.js +57 -0
- package/dist/highlight-to-react-ClEfL81q.js.map +1 -0
- package/dist/index.js +215 -0
- package/dist/index.js.map +1 -0
- package/dist/input-BxQAnXki.js +81 -0
- package/dist/input-BxQAnXki.js.map +1 -0
- package/dist/input-Cn25I4o5.js +121 -0
- package/dist/input-Cn25I4o5.js.map +1 -0
- package/dist/label-QtJxtJ4u.js +70 -0
- package/dist/label-QtJxtJ4u.js.map +1 -0
- package/dist/layer-card-BME0eljh.js +44 -0
- package/dist/layer-card-BME0eljh.js.map +1 -0
- package/dist/link-provider-BUZKXaNE.js +25 -0
- package/dist/link-provider-BUZKXaNE.js.map +1 -0
- package/dist/loader-DAcc-Uag.js +84 -0
- package/dist/loader-DAcc-Uag.js.map +1 -0
- package/dist/logo.svg +1 -0
- package/dist/menubar-C8NzAjfd.js +102 -0
- package/dist/menubar-C8NzAjfd.js.map +1 -0
- package/dist/meter-CpmTenEr.js +37 -0
- package/dist/meter-CpmTenEr.js.map +1 -0
- package/dist/pagination-C_YqCy8l.js +117 -0
- package/dist/pagination-C_YqCy8l.js.map +1 -0
- package/dist/popover-BRQZ2b6z.js +147 -0
- package/dist/popover-BRQZ2b6z.js.map +1 -0
- package/dist/primitives/accordion.js +2 -0
- package/dist/primitives/alert-dialog.js +2 -0
- package/dist/primitives/autocomplete.js +2 -0
- package/dist/primitives/avatar.js +2 -0
- package/dist/primitives/button.js +2 -0
- package/dist/primitives/checkbox-group.js +2 -0
- package/dist/primitives/checkbox.js +2 -0
- package/dist/primitives/collapsible.js +2 -0
- package/dist/primitives/combobox.js +2 -0
- package/dist/primitives/context-menu.js +2 -0
- package/dist/primitives/csp-provider.js +2 -0
- package/dist/primitives/dialog.js +2 -0
- package/dist/primitives/direction-provider.js +2 -0
- package/dist/primitives/drawer.js +2 -0
- package/dist/primitives/field.js +2 -0
- package/dist/primitives/fieldset.js +2 -0
- package/dist/primitives/form.js +2 -0
- package/dist/primitives/input.js +2 -0
- package/dist/primitives/menu.js +2 -0
- package/dist/primitives/menubar.js +2 -0
- package/dist/primitives/meter.js +2 -0
- package/dist/primitives/navigation-menu.js +2 -0
- package/dist/primitives/number-field.js +2 -0
- package/dist/primitives/popover.js +2 -0
- package/dist/primitives/preview-card.js +2 -0
- package/dist/primitives/progress.js +2 -0
- package/dist/primitives/radio-group.js +2 -0
- package/dist/primitives/radio.js +2 -0
- package/dist/primitives/scroll-area.js +2 -0
- package/dist/primitives/select.js +2 -0
- package/dist/primitives/separator.js +2 -0
- package/dist/primitives/slider.js +2 -0
- package/dist/primitives/switch.js +2 -0
- package/dist/primitives/tabs.js +2 -0
- package/dist/primitives/toast.js +2 -0
- package/dist/primitives/toggle-group.js +2 -0
- package/dist/primitives/toggle.js +2 -0
- package/dist/primitives/toolbar.js +2 -0
- package/dist/primitives/tooltip.js +2 -0
- package/dist/primitives.js +40 -0
- package/dist/radio-B7zg1wUI.js +101 -0
- package/dist/radio-B7zg1wUI.js.map +1 -0
- package/dist/registry.js +1 -0
- package/dist/select-9p721G00.js +95 -0
- package/dist/select-9p721G00.js.map +1 -0
- package/dist/sensitive-input-D5je2NLl.js +248 -0
- package/dist/sensitive-input-D5je2NLl.js.map +1 -0
- package/dist/sidebar-DOwBrq57.js +964 -0
- package/dist/sidebar-DOwBrq57.js.map +1 -0
- package/dist/signalflare-ai-logo-DDhxMJD6.js +260 -0
- package/dist/signalflare-ai-logo-DDhxMJD6.js.map +1 -0
- package/dist/skeleton-line-Do3UmGk9.js +36 -0
- package/dist/skeleton-line-Do3UmGk9.js.map +1 -0
- package/dist/src/blocks/agent-harness/agent-harness.d.ts +177 -0
- package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -0
- package/dist/src/blocks/agent-harness/agent-harness.tsx +1122 -0
- package/dist/src/blocks/agent-harness/index.d.ts +2 -0
- package/dist/src/blocks/agent-harness/index.d.ts.map +1 -0
- package/dist/src/blocks/commander/commander.d.ts +101 -0
- package/dist/src/blocks/commander/commander.d.ts.map +1 -0
- package/dist/src/blocks/commander/commander.tsx +477 -0
- package/dist/src/blocks/commander/index.d.ts +2 -0
- package/dist/src/blocks/commander/index.d.ts.map +1 -0
- package/dist/src/blocks/delete-resource/delete-resource.d.ts +46 -0
- package/dist/src/blocks/delete-resource/delete-resource.d.ts.map +1 -0
- package/dist/src/blocks/delete-resource/delete-resource.tsx +214 -0
- package/dist/src/blocks/delete-resource/index.d.ts +2 -0
- package/dist/src/blocks/delete-resource/index.d.ts.map +1 -0
- package/dist/src/blocks/map-block/index.d.ts +2 -0
- package/dist/src/blocks/map-block/index.d.ts.map +1 -0
- package/dist/src/blocks/map-block/map-block.d.ts +79 -0
- package/dist/src/blocks/map-block/map-block.d.ts.map +1 -0
- package/dist/src/blocks/map-block/map-block.tsx +522 -0
- package/dist/src/blocks/page-header/index.d.ts +2 -0
- package/dist/src/blocks/page-header/index.d.ts.map +1 -0
- package/dist/src/blocks/page-header/page-header.d.ts +38 -0
- package/dist/src/blocks/page-header/page-header.d.ts.map +1 -0
- package/dist/src/blocks/page-header/page-header.tsx +96 -0
- package/dist/src/blocks/resource-list/index.d.ts +2 -0
- package/dist/src/blocks/resource-list/index.d.ts.map +1 -0
- package/dist/src/blocks/resource-list/resource-list.d.ts +18 -0
- package/dist/src/blocks/resource-list/resource-list.d.ts.map +1 -0
- package/dist/src/blocks/resource-list/resource-list.test.tsx +27 -0
- package/dist/src/blocks/resource-list/resource-list.tsx +65 -0
- package/dist/src/catalog/catalog.d.ts +75 -0
- package/dist/src/catalog/catalog.d.ts.map +1 -0
- package/dist/src/catalog/data.d.ts +44 -0
- package/dist/src/catalog/data.d.ts.map +1 -0
- package/dist/src/catalog/index.d.ts +35 -0
- package/dist/src/catalog/index.d.ts.map +1 -0
- package/dist/src/catalog/sf-components.d.ts +8 -0
- package/dist/src/catalog/sf-components.d.ts.map +1 -0
- package/dist/src/catalog/sf-registry.d.ts +4 -0
- package/dist/src/catalog/sf-registry.d.ts.map +1 -0
- package/dist/src/catalog/types.d.ts +226 -0
- package/dist/src/catalog/types.d.ts.map +1 -0
- package/dist/src/catalog/visibility.d.ts +37 -0
- package/dist/src/catalog/visibility.d.ts.map +1 -0
- package/dist/src/command-line/build-cli.d.ts +7 -0
- package/dist/src/command-line/build-cli.d.ts.map +1 -0
- package/dist/src/command-line/cli.d.ts +13 -0
- package/dist/src/command-line/cli.d.ts.map +1 -0
- package/dist/src/command-line/commands/add.d.ts +10 -0
- package/dist/src/command-line/commands/add.d.ts.map +1 -0
- package/dist/src/command-line/commands/ai.d.ts +10 -0
- package/dist/src/command-line/commands/ai.d.ts.map +1 -0
- package/dist/src/command-line/commands/blocks.d.ts +10 -0
- package/dist/src/command-line/commands/blocks.d.ts.map +1 -0
- package/dist/src/command-line/commands/doc.d.ts +14 -0
- package/dist/src/command-line/commands/doc.d.ts.map +1 -0
- package/dist/src/command-line/commands/init.d.ts +18 -0
- package/dist/src/command-line/commands/init.d.ts.map +1 -0
- package/dist/src/command-line/commands/ls.d.ts +10 -0
- package/dist/src/command-line/commands/ls.d.ts.map +1 -0
- package/dist/src/command-line/commands/migrate.d.ts +10 -0
- package/dist/src/command-line/commands/migrate.d.ts.map +1 -0
- package/dist/src/command-line/utils/config.d.ts +42 -0
- package/dist/src/command-line/utils/config.d.ts.map +1 -0
- package/dist/src/command-line/utils/transformer.d.ts +21 -0
- package/dist/src/command-line/utils/transformer.d.ts.map +1 -0
- package/dist/src/components/ai-actions/ai-actions.d.ts +35 -0
- package/dist/src/components/ai-actions/ai-actions.d.ts.map +1 -0
- package/dist/src/components/ai-actions/index.d.ts +2 -0
- package/dist/src/components/ai-actions/index.d.ts.map +1 -0
- package/dist/src/components/ai-agent-card/ai-agent-card.d.ts +82 -0
- package/dist/src/components/ai-agent-card/ai-agent-card.d.ts.map +1 -0
- package/dist/src/components/ai-agent-card/index.d.ts +2 -0
- package/dist/src/components/ai-agent-card/index.d.ts.map +1 -0
- package/dist/src/components/ai-approval/ai-approval.d.ts +102 -0
- package/dist/src/components/ai-approval/ai-approval.d.ts.map +1 -0
- package/dist/src/components/ai-approval/index.d.ts +2 -0
- package/dist/src/components/ai-approval/index.d.ts.map +1 -0
- package/dist/src/components/ai-code-block/ai-code-block.d.ts +48 -0
- package/dist/src/components/ai-code-block/ai-code-block.d.ts.map +1 -0
- package/dist/src/components/ai-code-block/index.d.ts +2 -0
- package/dist/src/components/ai-code-block/index.d.ts.map +1 -0
- package/dist/src/components/ai-conversation/ai-conversation.d.ts +125 -0
- package/dist/src/components/ai-conversation/ai-conversation.d.ts.map +1 -0
- package/dist/src/components/ai-conversation/index.d.ts +2 -0
- package/dist/src/components/ai-conversation/index.d.ts.map +1 -0
- package/dist/src/components/ai-info-banner/ai-info-banner.d.ts +55 -0
- package/dist/src/components/ai-info-banner/ai-info-banner.d.ts.map +1 -0
- package/dist/src/components/ai-info-banner/index.d.ts +2 -0
- package/dist/src/components/ai-info-banner/index.d.ts.map +1 -0
- package/dist/src/components/ai-loader/ai-loader.d.ts +44 -0
- package/dist/src/components/ai-loader/ai-loader.d.ts.map +1 -0
- package/dist/src/components/ai-loader/index.d.ts +2 -0
- package/dist/src/components/ai-loader/index.d.ts.map +1 -0
- package/dist/src/components/ai-message/ai-message.d.ts +97 -0
- package/dist/src/components/ai-message/ai-message.d.ts.map +1 -0
- package/dist/src/components/ai-message/index.d.ts +2 -0
- package/dist/src/components/ai-message/index.d.ts.map +1 -0
- package/dist/src/components/ai-mission-header/ai-mission-header.d.ts +62 -0
- package/dist/src/components/ai-mission-header/ai-mission-header.d.ts.map +1 -0
- package/dist/src/components/ai-mission-header/index.d.ts +2 -0
- package/dist/src/components/ai-mission-header/index.d.ts.map +1 -0
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +260 -0
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -0
- package/dist/src/components/ai-prompt-input/index.d.ts +2 -0
- package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -0
- package/dist/src/components/ai-question/ai-question.d.ts +73 -0
- package/dist/src/components/ai-question/ai-question.d.ts.map +1 -0
- package/dist/src/components/ai-question/index.d.ts +2 -0
- package/dist/src/components/ai-question/index.d.ts.map +1 -0
- package/dist/src/components/ai-reasoning/ai-reasoning.d.ts +107 -0
- package/dist/src/components/ai-reasoning/ai-reasoning.d.ts.map +1 -0
- package/dist/src/components/ai-reasoning/index.d.ts +2 -0
- package/dist/src/components/ai-reasoning/index.d.ts.map +1 -0
- package/dist/src/components/ai-response/ai-response.d.ts +26 -0
- package/dist/src/components/ai-response/ai-response.d.ts.map +1 -0
- package/dist/src/components/ai-response/index.d.ts +2 -0
- package/dist/src/components/ai-response/index.d.ts.map +1 -0
- package/dist/src/components/ai-shimmer/ai-shimmer.d.ts +29 -0
- package/dist/src/components/ai-shimmer/ai-shimmer.d.ts.map +1 -0
- package/dist/src/components/ai-shimmer/index.d.ts +2 -0
- package/dist/src/components/ai-shimmer/index.d.ts.map +1 -0
- package/dist/src/components/ai-status-badge/ai-status-badge.d.ts +46 -0
- package/dist/src/components/ai-status-badge/ai-status-badge.d.ts.map +1 -0
- package/dist/src/components/ai-status-badge/index.d.ts +2 -0
- package/dist/src/components/ai-status-badge/index.d.ts.map +1 -0
- package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts +27 -0
- package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts.map +1 -0
- package/dist/src/components/ai-streaming-text/index.d.ts +2 -0
- package/dist/src/components/ai-streaming-text/index.d.ts.map +1 -0
- package/dist/src/components/ai-subagent/ai-subagent.d.ts +74 -0
- package/dist/src/components/ai-subagent/ai-subagent.d.ts.map +1 -0
- package/dist/src/components/ai-subagent/index.d.ts +2 -0
- package/dist/src/components/ai-subagent/index.d.ts.map +1 -0
- package/dist/src/components/ai-suggestion/ai-suggestion.d.ts +40 -0
- package/dist/src/components/ai-suggestion/ai-suggestion.d.ts.map +1 -0
- package/dist/src/components/ai-suggestion/index.d.ts +2 -0
- package/dist/src/components/ai-suggestion/index.d.ts.map +1 -0
- package/dist/src/components/ai-task-list/ai-task-list.d.ts +61 -0
- package/dist/src/components/ai-task-list/ai-task-list.d.ts.map +1 -0
- package/dist/src/components/ai-task-list/index.d.ts +2 -0
- package/dist/src/components/ai-task-list/index.d.ts.map +1 -0
- package/dist/src/components/ai-timeline/ai-timeline.d.ts +130 -0
- package/dist/src/components/ai-timeline/ai-timeline.d.ts.map +1 -0
- package/dist/src/components/ai-timeline/index.d.ts +2 -0
- package/dist/src/components/ai-timeline/index.d.ts.map +1 -0
- package/dist/src/components/ai-tool/ai-tool.d.ts +138 -0
- package/dist/src/components/ai-tool/ai-tool.d.ts.map +1 -0
- package/dist/src/components/ai-tool/index.d.ts +2 -0
- package/dist/src/components/ai-tool/index.d.ts.map +1 -0
- package/dist/src/components/ai-usage-bar/ai-usage-bar.d.ts +38 -0
- package/dist/src/components/ai-usage-bar/ai-usage-bar.d.ts.map +1 -0
- package/dist/src/components/ai-usage-bar/index.d.ts +2 -0
- package/dist/src/components/ai-usage-bar/index.d.ts.map +1 -0
- package/dist/src/components/badge/badge.d.ts +129 -0
- package/dist/src/components/badge/badge.d.ts.map +1 -0
- package/dist/src/components/badge/index.d.ts +2 -0
- package/dist/src/components/badge/index.d.ts.map +1 -0
- package/dist/src/components/banner/banner.d.ts +80 -0
- package/dist/src/components/banner/banner.d.ts.map +1 -0
- package/dist/src/components/banner/index.d.ts +2 -0
- package/dist/src/components/banner/index.d.ts.map +1 -0
- package/dist/src/components/breadcrumbs/breadcrumbs.d.ts +78 -0
- package/dist/src/components/breadcrumbs/breadcrumbs.d.ts.map +1 -0
- package/dist/src/components/breadcrumbs/index.d.ts +2 -0
- package/dist/src/components/breadcrumbs/index.d.ts.map +1 -0
- package/dist/src/components/button/button.d.ts +212 -0
- package/dist/src/components/button/button.d.ts.map +1 -0
- package/dist/src/components/button/index.d.ts +2 -0
- package/dist/src/components/button/index.d.ts.map +1 -0
- package/dist/src/components/chart/color.d.ts +98 -0
- package/dist/src/components/chart/color.d.ts.map +1 -0
- package/dist/src/components/chart/echart.d.ts +135 -0
- package/dist/src/components/chart/echart.d.ts.map +1 -0
- package/dist/src/components/chart/index.d.ts +5 -0
- package/dist/src/components/chart/index.d.ts.map +1 -0
- package/dist/src/components/chart/legend.d.ts +42 -0
- package/dist/src/components/chart/legend.d.ts.map +1 -0
- package/dist/src/components/chart/timeseries-chart.d.ts +119 -0
- package/dist/src/components/chart/timeseries-chart.d.ts.map +1 -0
- package/dist/src/components/checkbox/checkbox.d.ts +174 -0
- package/dist/src/components/checkbox/checkbox.d.ts.map +1 -0
- package/dist/src/components/checkbox/index.d.ts +2 -0
- package/dist/src/components/checkbox/index.d.ts.map +1 -0
- package/dist/src/components/clipboard-text/clipboard-text.d.ts +86 -0
- package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -0
- package/dist/src/components/clipboard-text/index.d.ts +2 -0
- package/dist/src/components/clipboard-text/index.d.ts.map +1 -0
- package/dist/src/components/code/code.d.ts +165 -0
- package/dist/src/components/code/code.d.ts.map +1 -0
- package/dist/src/components/code/index.d.ts +4 -0
- package/dist/src/components/code/index.d.ts.map +1 -0
- package/dist/src/components/collapsible/collapsible.d.ts +72 -0
- package/dist/src/components/collapsible/collapsible.d.ts.map +1 -0
- package/dist/src/components/collapsible/index.d.ts +2 -0
- package/dist/src/components/collapsible/index.d.ts.map +1 -0
- package/dist/src/components/combobox/combobox.d.ts +188 -0
- package/dist/src/components/combobox/combobox.d.ts.map +1 -0
- package/dist/src/components/combobox/index.d.ts +2 -0
- package/dist/src/components/combobox/index.d.ts.map +1 -0
- package/dist/src/components/command-palette/command-palette.d.ts +260 -0
- package/dist/src/components/command-palette/command-palette.d.ts.map +1 -0
- package/dist/src/components/command-palette/index.d.ts +3 -0
- package/dist/src/components/command-palette/index.d.ts.map +1 -0
- package/dist/src/components/command-palette/types.d.ts +149 -0
- package/dist/src/components/command-palette/types.d.ts.map +1 -0
- package/dist/src/components/data-grid/data-grid.d.ts +78 -0
- package/dist/src/components/data-grid/data-grid.d.ts.map +1 -0
- package/dist/src/components/data-grid/index.d.ts +3 -0
- package/dist/src/components/data-grid/index.d.ts.map +1 -0
- package/dist/src/components/data-grid/types.d.ts +236 -0
- package/dist/src/components/data-grid/types.d.ts.map +1 -0
- package/dist/src/components/date-picker/date-picker.d.ts +65 -0
- package/dist/src/components/date-picker/date-picker.d.ts.map +1 -0
- package/dist/src/components/date-picker/index.d.ts +4 -0
- package/dist/src/components/date-picker/index.d.ts.map +1 -0
- package/dist/src/components/date-range-picker/date-range-picker.d.ts +125 -0
- package/dist/src/components/date-range-picker/date-range-picker.d.ts.map +1 -0
- package/dist/src/components/date-range-picker/index.d.ts +5 -0
- package/dist/src/components/date-range-picker/index.d.ts.map +1 -0
- package/dist/src/components/dialog/dialog.d.ts +189 -0
- package/dist/src/components/dialog/dialog.d.ts.map +1 -0
- package/dist/src/components/dialog/index.d.ts +2 -0
- package/dist/src/components/dialog/index.d.ts.map +1 -0
- package/dist/src/components/dropdown/dropdown.d.ts +91 -0
- package/dist/src/components/dropdown/dropdown.d.ts.map +1 -0
- package/dist/src/components/dropdown/index.d.ts +2 -0
- package/dist/src/components/dropdown/index.d.ts.map +1 -0
- package/dist/src/components/empty/empty.d.ts +69 -0
- package/dist/src/components/empty/empty.d.ts.map +1 -0
- package/dist/src/components/empty/index.d.ts +2 -0
- package/dist/src/components/empty/index.d.ts.map +1 -0
- package/dist/src/components/field/field.d.ts +68 -0
- package/dist/src/components/field/field.d.ts.map +1 -0
- package/dist/src/components/field/index.d.ts +2 -0
- package/dist/src/components/field/index.d.ts.map +1 -0
- package/dist/src/components/filters/filters.d.ts +54 -0
- package/dist/src/components/filters/filters.d.ts.map +1 -0
- package/dist/src/components/filters/helpers.d.ts +56 -0
- package/dist/src/components/filters/helpers.d.ts.map +1 -0
- package/dist/src/components/filters/index.d.ts +3 -0
- package/dist/src/components/filters/index.d.ts.map +1 -0
- package/dist/src/components/filters/types.d.ts +148 -0
- package/dist/src/components/filters/types.d.ts.map +1 -0
- package/dist/src/components/flow/connectors.d.ts +35 -0
- package/dist/src/components/flow/connectors.d.ts.map +1 -0
- package/dist/src/components/flow/diagram.d.ts +62 -0
- package/dist/src/components/flow/diagram.d.ts.map +1 -0
- package/dist/src/components/flow/index.d.ts +26 -0
- package/dist/src/components/flow/index.d.ts.map +1 -0
- package/dist/src/components/flow/node.d.ts +52 -0
- package/dist/src/components/flow/node.d.ts.map +1 -0
- package/dist/src/components/flow/parallel.d.ts +5 -0
- package/dist/src/components/flow/parallel.d.ts.map +1 -0
- package/dist/src/components/flow/use-children.d.ts +69 -0
- package/dist/src/components/flow/use-children.d.ts.map +1 -0
- package/dist/src/components/grid/grid.d.ts +135 -0
- package/dist/src/components/grid/grid.d.ts.map +1 -0
- package/dist/src/components/grid/index.d.ts +2 -0
- package/dist/src/components/grid/index.d.ts.map +1 -0
- package/dist/src/components/input/index.d.ts +4 -0
- package/dist/src/components/input/index.d.ts.map +1 -0
- package/dist/src/components/input/input-area.d.ts +65 -0
- package/dist/src/components/input/input-area.d.ts.map +1 -0
- package/dist/src/components/input/input-group.d.ts +39 -0
- package/dist/src/components/input/input-group.d.ts.map +1 -0
- package/dist/src/components/input/input.d.ts +172 -0
- package/dist/src/components/input/input.d.ts.map +1 -0
- package/dist/src/components/label/index.d.ts +2 -0
- package/dist/src/components/label/index.d.ts.map +1 -0
- package/dist/src/components/label/label.d.ts +67 -0
- package/dist/src/components/label/label.d.ts.map +1 -0
- package/dist/src/components/layer-card/index.d.ts +2 -0
- package/dist/src/components/layer-card/index.d.ts.map +1 -0
- package/dist/src/components/layer-card/layer-card.d.ts +29 -0
- package/dist/src/components/layer-card/layer-card.d.ts.map +1 -0
- package/dist/src/components/link/index.d.ts +2 -0
- package/dist/src/components/link/index.d.ts.map +1 -0
- package/dist/src/components/link/link.d.ts +55 -0
- package/dist/src/components/link/link.d.ts.map +1 -0
- package/dist/src/components/loader/index.d.ts +3 -0
- package/dist/src/components/loader/index.d.ts.map +1 -0
- package/dist/src/components/loader/loader.d.ts +65 -0
- package/dist/src/components/loader/loader.d.ts.map +1 -0
- package/dist/src/components/loader/skeleton-line.d.ts +10 -0
- package/dist/src/components/loader/skeleton-line.d.ts.map +1 -0
- package/dist/src/components/menubar/index.d.ts +3 -0
- package/dist/src/components/menubar/index.d.ts.map +1 -0
- package/dist/src/components/menubar/menubar.d.ts +66 -0
- package/dist/src/components/menubar/menubar.d.ts.map +1 -0
- package/dist/src/components/menubar/use-menu-navigation.d.ts +8 -0
- package/dist/src/components/menubar/use-menu-navigation.d.ts.map +1 -0
- package/dist/src/components/meter/index.d.ts +2 -0
- package/dist/src/components/meter/index.d.ts.map +1 -0
- package/dist/src/components/meter/meter.d.ts +44 -0
- package/dist/src/components/meter/meter.d.ts.map +1 -0
- package/dist/src/components/pagination/index.d.ts +2 -0
- package/dist/src/components/pagination/index.d.ts.map +1 -0
- package/dist/src/components/pagination/pagination.d.ts +60 -0
- package/dist/src/components/pagination/pagination.d.ts.map +1 -0
- package/dist/src/components/popover/index.d.ts +3 -0
- package/dist/src/components/popover/index.d.ts.map +1 -0
- package/dist/src/components/popover/popover.d.ts +138 -0
- package/dist/src/components/popover/popover.d.ts.map +1 -0
- package/dist/src/components/radio/index.d.ts +2 -0
- package/dist/src/components/radio/index.d.ts.map +1 -0
- package/dist/src/components/radio/radio.d.ts +163 -0
- package/dist/src/components/radio/radio.d.ts.map +1 -0
- package/dist/src/components/select/index.d.ts +2 -0
- package/dist/src/components/select/index.d.ts.map +1 -0
- package/dist/src/components/select/select.d.ts +150 -0
- package/dist/src/components/select/select.d.ts.map +1 -0
- package/dist/src/components/sensitive-input/index.d.ts +2 -0
- package/dist/src/components/sensitive-input/index.d.ts.map +1 -0
- package/dist/src/components/sensitive-input/sensitive-input.d.ts +94 -0
- package/dist/src/components/sensitive-input/sensitive-input.d.ts.map +1 -0
- package/dist/src/components/sidebar/index.d.ts +2 -0
- package/dist/src/components/sidebar/index.d.ts.map +1 -0
- package/dist/src/components/sidebar/sidebar.d.ts +556 -0
- package/dist/src/components/sidebar/sidebar.d.ts.map +1 -0
- package/dist/src/components/signalflare-ai-logo/index.d.ts +2 -0
- package/dist/src/components/signalflare-ai-logo/index.d.ts.map +1 -0
- package/dist/src/components/signalflare-ai-logo/signalflare-ai-logo.d.ts +171 -0
- package/dist/src/components/signalflare-ai-logo/signalflare-ai-logo.d.ts.map +1 -0
- package/dist/src/components/surface/index.d.ts +2 -0
- package/dist/src/components/surface/index.d.ts.map +1 -0
- package/dist/src/components/surface/surface.d.ts +60 -0
- package/dist/src/components/surface/surface.d.ts.map +1 -0
- package/dist/src/components/switch/index.d.ts +2 -0
- package/dist/src/components/switch/index.d.ts.map +1 -0
- package/dist/src/components/switch/switch.d.ts +169 -0
- package/dist/src/components/switch/switch.d.ts.map +1 -0
- package/dist/src/components/table/index.d.ts +2 -0
- package/dist/src/components/table/index.d.ts.map +1 -0
- package/dist/src/components/table/table.d.ts +89 -0
- package/dist/src/components/table/table.d.ts.map +1 -0
- package/dist/src/components/tabs/index.d.ts +3 -0
- package/dist/src/components/tabs/index.d.ts.map +1 -0
- package/dist/src/components/tabs/tabs.d.ts +105 -0
- package/dist/src/components/tabs/tabs.d.ts.map +1 -0
- package/dist/src/components/text/index.d.ts +2 -0
- package/dist/src/components/text/index.d.ts.map +1 -0
- package/dist/src/components/text/text.d.ts +181 -0
- package/dist/src/components/text/text.d.ts.map +1 -0
- package/dist/src/components/theme-toggle/index.d.ts +2 -0
- package/dist/src/components/theme-toggle/index.d.ts.map +1 -0
- package/dist/src/components/theme-toggle/theme-toggle.d.ts +68 -0
- package/dist/src/components/theme-toggle/theme-toggle.d.ts.map +1 -0
- package/dist/src/components/toast/index.d.ts +5 -0
- package/dist/src/components/toast/index.d.ts.map +1 -0
- package/dist/src/components/toast/toast.d.ts +152 -0
- package/dist/src/components/toast/toast.d.ts.map +1 -0
- package/dist/src/components/tooltip/index.d.ts +2 -0
- package/dist/src/components/tooltip/index.d.ts.map +1 -0
- package/dist/src/components/tooltip/tooltip.d.ts +82 -0
- package/dist/src/components/tooltip/tooltip.d.ts.map +1 -0
- package/dist/src/components/use-agent-harness/index.d.ts +2 -0
- package/dist/src/components/use-agent-harness/index.d.ts.map +1 -0
- package/dist/src/components/use-agent-harness/use-agent-harness.d.ts +642 -0
- package/dist/src/components/use-agent-harness/use-agent-harness.d.ts.map +1 -0
- package/dist/src/genui/genui.d.ts +17 -0
- package/dist/src/genui/genui.d.ts.map +1 -0
- package/dist/src/genui/index.d.ts +19 -0
- package/dist/src/genui/index.d.ts.map +1 -0
- package/dist/src/index.d.ts +102 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/lib/utils.d.ts +2 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/primitives/accordion.d.ts +13 -0
- package/dist/src/primitives/accordion.d.ts.map +1 -0
- package/dist/src/primitives/alert-dialog.d.ts +13 -0
- package/dist/src/primitives/alert-dialog.d.ts.map +1 -0
- package/dist/src/primitives/autocomplete.d.ts +13 -0
- package/dist/src/primitives/autocomplete.d.ts.map +1 -0
- package/dist/src/primitives/avatar.d.ts +13 -0
- package/dist/src/primitives/avatar.d.ts.map +1 -0
- package/dist/src/primitives/button.d.ts +13 -0
- package/dist/src/primitives/button.d.ts.map +1 -0
- package/dist/src/primitives/checkbox-group.d.ts +13 -0
- package/dist/src/primitives/checkbox-group.d.ts.map +1 -0
- package/dist/src/primitives/checkbox.d.ts +13 -0
- package/dist/src/primitives/checkbox.d.ts.map +1 -0
- package/dist/src/primitives/collapsible.d.ts +13 -0
- package/dist/src/primitives/collapsible.d.ts.map +1 -0
- package/dist/src/primitives/combobox.d.ts +13 -0
- package/dist/src/primitives/combobox.d.ts.map +1 -0
- package/dist/src/primitives/context-menu.d.ts +13 -0
- package/dist/src/primitives/context-menu.d.ts.map +1 -0
- package/dist/src/primitives/csp-provider.d.ts +13 -0
- package/dist/src/primitives/csp-provider.d.ts.map +1 -0
- package/dist/src/primitives/dialog.d.ts +13 -0
- package/dist/src/primitives/dialog.d.ts.map +1 -0
- package/dist/src/primitives/direction-provider.d.ts +13 -0
- package/dist/src/primitives/direction-provider.d.ts.map +1 -0
- package/dist/src/primitives/drawer.d.ts +13 -0
- package/dist/src/primitives/drawer.d.ts.map +1 -0
- package/dist/src/primitives/field.d.ts +13 -0
- package/dist/src/primitives/field.d.ts.map +1 -0
- package/dist/src/primitives/fieldset.d.ts +13 -0
- package/dist/src/primitives/fieldset.d.ts.map +1 -0
- package/dist/src/primitives/form.d.ts +13 -0
- package/dist/src/primitives/form.d.ts.map +1 -0
- package/dist/src/primitives/index.d.ts +54 -0
- package/dist/src/primitives/index.d.ts.map +1 -0
- package/dist/src/primitives/input.d.ts +13 -0
- package/dist/src/primitives/input.d.ts.map +1 -0
- package/dist/src/primitives/menu.d.ts +13 -0
- package/dist/src/primitives/menu.d.ts.map +1 -0
- package/dist/src/primitives/menubar.d.ts +13 -0
- package/dist/src/primitives/menubar.d.ts.map +1 -0
- package/dist/src/primitives/meter.d.ts +13 -0
- package/dist/src/primitives/meter.d.ts.map +1 -0
- package/dist/src/primitives/navigation-menu.d.ts +13 -0
- package/dist/src/primitives/navigation-menu.d.ts.map +1 -0
- package/dist/src/primitives/number-field.d.ts +13 -0
- package/dist/src/primitives/number-field.d.ts.map +1 -0
- package/dist/src/primitives/popover.d.ts +13 -0
- package/dist/src/primitives/popover.d.ts.map +1 -0
- package/dist/src/primitives/preview-card.d.ts +13 -0
- package/dist/src/primitives/preview-card.d.ts.map +1 -0
- package/dist/src/primitives/progress.d.ts +13 -0
- package/dist/src/primitives/progress.d.ts.map +1 -0
- package/dist/src/primitives/radio-group.d.ts +13 -0
- package/dist/src/primitives/radio-group.d.ts.map +1 -0
- package/dist/src/primitives/radio.d.ts +13 -0
- package/dist/src/primitives/radio.d.ts.map +1 -0
- package/dist/src/primitives/scroll-area.d.ts +13 -0
- package/dist/src/primitives/scroll-area.d.ts.map +1 -0
- package/dist/src/primitives/select.d.ts +13 -0
- package/dist/src/primitives/select.d.ts.map +1 -0
- package/dist/src/primitives/separator.d.ts +13 -0
- package/dist/src/primitives/separator.d.ts.map +1 -0
- package/dist/src/primitives/slider.d.ts +13 -0
- package/dist/src/primitives/slider.d.ts.map +1 -0
- package/dist/src/primitives/switch.d.ts +13 -0
- package/dist/src/primitives/switch.d.ts.map +1 -0
- package/dist/src/primitives/tabs.d.ts +13 -0
- package/dist/src/primitives/tabs.d.ts.map +1 -0
- package/dist/src/primitives/toast.d.ts +13 -0
- package/dist/src/primitives/toast.d.ts.map +1 -0
- package/dist/src/primitives/toggle-group.d.ts +13 -0
- package/dist/src/primitives/toggle-group.d.ts.map +1 -0
- package/dist/src/primitives/toggle.d.ts +13 -0
- package/dist/src/primitives/toggle.d.ts.map +1 -0
- package/dist/src/primitives/toolbar.d.ts +13 -0
- package/dist/src/primitives/toolbar.d.ts.map +1 -0
- package/dist/src/primitives/tooltip.d.ts +13 -0
- package/dist/src/primitives/tooltip.d.ts.map +1 -0
- package/dist/src/registry/index.d.ts +8 -0
- package/dist/src/registry/index.d.ts.map +1 -0
- package/dist/src/registry/types.d.ts +191 -0
- package/dist/src/registry/types.d.ts.map +1 -0
- package/dist/src/utils/cn.d.ts +4 -0
- package/dist/src/utils/cn.d.ts.map +1 -0
- package/dist/src/utils/highlight-to-react.d.ts +12 -0
- package/dist/src/utils/highlight-to-react.d.ts.map +1 -0
- package/dist/src/utils/index.d.ts +3 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/link-provider.d.ts +12 -0
- package/dist/src/utils/link-provider.d.ts.map +1 -0
- package/dist/src/utils/prop-examples.d.ts +36 -0
- package/dist/src/utils/prop-examples.d.ts.map +1 -0
- package/dist/styles/sf-binding.css +255 -0
- package/dist/styles/sf-standalone.css +2 -0
- package/dist/styles/sf.css +596 -0
- package/dist/styles/theme-fedramp.css +22 -0
- package/dist/styles/theme-minimal.css +127 -0
- package/dist/styles/theme-navigator.css +137 -0
- package/dist/styles/theme-sf.css +191 -0
- package/dist/surface-BduI7Ehl.js +18 -0
- package/dist/surface-BduI7Ehl.js.map +1 -0
- package/dist/switch-CzZBRBL7.js +169 -0
- package/dist/switch-CzZBRBL7.js.map +1 -0
- package/dist/table-CIMx0Oq0.js +200 -0
- package/dist/table-CIMx0Oq0.js.map +1 -0
- package/dist/tabs-1cHrYoel.js +54 -0
- package/dist/tabs-1cHrYoel.js.map +1 -0
- package/dist/text-KJmGkwnf.js +103 -0
- package/dist/text-KJmGkwnf.js.map +1 -0
- package/dist/theme-toggle-Dpgnoj_Q.js +129 -0
- package/dist/theme-toggle-Dpgnoj_Q.js.map +1 -0
- package/dist/toast-Nw28a5Cx.js +161 -0
- package/dist/toast-Nw28a5Cx.js.map +1 -0
- package/dist/tooltip-Cb7QW-7H.js +79 -0
- package/dist/tooltip-Cb7QW-7H.js.map +1 -0
- package/dist/use-agent-harness-DZzcn96L.js +929 -0
- package/dist/use-agent-harness-DZzcn96L.js.map +1 -0
- package/dist/utils.js +4 -0
- package/package.json +620 -0
- package/scripts/component-registry/cache.ts +124 -0
- package/scripts/component-registry/discovery.ts +464 -0
- package/scripts/component-registry/example-cleanup.ts +168 -0
- package/scripts/component-registry/index.test.ts +678 -0
- package/scripts/component-registry/index.ts +931 -0
- package/scripts/component-registry/markdown-generator.ts +222 -0
- package/scripts/component-registry/metadata.ts +653 -0
- package/scripts/component-registry/props-filter.ts +313 -0
- package/scripts/component-registry/schema-generator.ts +332 -0
- package/scripts/component-registry/sub-components.ts +350 -0
- package/scripts/component-registry/types.ts +156 -0
- package/scripts/component-registry/utils.ts +280 -0
- package/scripts/component-registry/variant-parser.ts +262 -0
- package/scripts/css-build.ts +117 -0
- package/scripts/generate-primitives.ts +178 -0
- package/scripts/theme-generator/config.ts +538 -0
- package/scripts/theme-generator/generate-css.ts +256 -0
- package/scripts/theme-generator/index.ts +161 -0
- package/scripts/theme-generator/migrate.ts +584 -0
- package/scripts/theme-generator/types.ts +86 -0
- package/skills/component-selection/SKILL.md +64 -0
- package/skills/installing-blocks/SKILL.md +47 -0
- package/skills/theming-and-tokens/SKILL.md +62 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as cn } from "./cn-YROP2_ox.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { CheckCircleIcon, CircleDashedIcon, CircleNotchIcon, XCircleIcon } from "@phosphor-icons/react";
|
|
5
|
+
//#region src/components/ai-task-list/ai-task-list.tsx
|
|
6
|
+
var SF_AI_TASK_LIST_VARIANTS = {};
|
|
7
|
+
var SF_AI_TASK_LIST_DEFAULT_VARIANTS = {};
|
|
8
|
+
var STATUS_CONFIG = {
|
|
9
|
+
pending: {
|
|
10
|
+
icon: CircleDashedIcon,
|
|
11
|
+
className: "text-sf-subtle/60",
|
|
12
|
+
textClassName: "text-sf-subtle"
|
|
13
|
+
},
|
|
14
|
+
in_progress: {
|
|
15
|
+
icon: CircleNotchIcon,
|
|
16
|
+
className: "text-sf-brand animate-spin",
|
|
17
|
+
textClassName: "text-sf-default"
|
|
18
|
+
},
|
|
19
|
+
completed: {
|
|
20
|
+
icon: CheckCircleIcon,
|
|
21
|
+
className: "text-sf-success/60",
|
|
22
|
+
textClassName: "text-sf-subtle/60 line-through"
|
|
23
|
+
},
|
|
24
|
+
cancelled: {
|
|
25
|
+
icon: XCircleIcon,
|
|
26
|
+
className: "text-sf-subtle/40",
|
|
27
|
+
textClassName: "text-sf-subtle/40 line-through"
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var PRIORITY_DOT = {
|
|
31
|
+
high: "bg-sf-danger",
|
|
32
|
+
medium: "bg-sf-warning",
|
|
33
|
+
low: "bg-sf-subtle"
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Single task item with status icon, content, and optional priority dot.
|
|
37
|
+
*/
|
|
38
|
+
function AiTaskListItem({ task, className, ...props }) {
|
|
39
|
+
const config = STATUS_CONFIG[task.status];
|
|
40
|
+
const StatusIcon = config.icon;
|
|
41
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
42
|
+
className: cn("flex items-start gap-2 py-1", className),
|
|
43
|
+
...props,
|
|
44
|
+
children: [
|
|
45
|
+
/* @__PURE__ */ jsx(StatusIcon, { className: cn("mt-0.5 size-3.5 shrink-0", config.className) }),
|
|
46
|
+
/* @__PURE__ */ jsx("span", {
|
|
47
|
+
className: cn("min-w-0 grow text-sm", config.textClassName),
|
|
48
|
+
children: task.content
|
|
49
|
+
}),
|
|
50
|
+
task.priority && /* @__PURE__ */ jsx("span", {
|
|
51
|
+
className: cn("mt-2 size-1 shrink-0 rounded-full", PRIORITY_DOT[task.priority]),
|
|
52
|
+
title: `${task.priority} priority`
|
|
53
|
+
})
|
|
54
|
+
]
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
AiTaskListItem.displayName = "AiTaskListItem";
|
|
58
|
+
/**
|
|
59
|
+
* Task progress list. Renders structured tasks from the harness `task_write`
|
|
60
|
+
* tool. Typically rendered inside the `PromptInputBackLayer` or inline in
|
|
61
|
+
* conversation.
|
|
62
|
+
*
|
|
63
|
+
* Maps to harness event: `task_updated`.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```tsx
|
|
67
|
+
* <AiTaskList
|
|
68
|
+
* title="Current tasks"
|
|
69
|
+
* tasks={[
|
|
70
|
+
* { id: "1", content: "Read config file", status: "completed", priority: "high" },
|
|
71
|
+
* { id: "2", content: "Run migrations", status: "in_progress", priority: "high" },
|
|
72
|
+
* { id: "3", content: "Seed database", status: "pending", priority: "medium" },
|
|
73
|
+
* ]}
|
|
74
|
+
* />
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
function AiTaskList({ tasks, title, icon, showProgress = true, children, className, ...props }) {
|
|
78
|
+
const completed = tasks.filter((t) => t.status === "completed").length;
|
|
79
|
+
const total = tasks.filter((t) => t.status !== "cancelled").length;
|
|
80
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
81
|
+
className: cn("flex flex-col gap-1", className),
|
|
82
|
+
...props,
|
|
83
|
+
children: [
|
|
84
|
+
(title || showProgress) && /* @__PURE__ */ jsxs("div", {
|
|
85
|
+
className: "flex items-center justify-between gap-2 pb-0.5",
|
|
86
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
87
|
+
className: "flex items-center gap-1.5",
|
|
88
|
+
children: [icon && /* @__PURE__ */ jsx(icon, { className: "size-3.5 text-sf-subtle" }), title && /* @__PURE__ */ jsx("span", {
|
|
89
|
+
className: "text-sm text-sf-subtle",
|
|
90
|
+
children: title
|
|
91
|
+
})]
|
|
92
|
+
}), showProgress && total > 0 && /* @__PURE__ */ jsxs("span", {
|
|
93
|
+
className: "text-xs tabular-nums text-sf-subtle/60",
|
|
94
|
+
children: [
|
|
95
|
+
completed,
|
|
96
|
+
"/",
|
|
97
|
+
total
|
|
98
|
+
]
|
|
99
|
+
})]
|
|
100
|
+
}),
|
|
101
|
+
/* @__PURE__ */ jsx("div", {
|
|
102
|
+
className: "flex flex-col",
|
|
103
|
+
children: tasks.map((task) => /* @__PURE__ */ jsx(AiTaskListItem, { task }, task.id))
|
|
104
|
+
}),
|
|
105
|
+
showProgress && total > 0 && /* @__PURE__ */ jsx("div", {
|
|
106
|
+
className: "mt-1 h-0.5 overflow-hidden rounded-full bg-sf-tint",
|
|
107
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
108
|
+
className: "h-full rounded-full bg-sf-brand/60 transition-[width] duration-300 ease-out",
|
|
109
|
+
style: { width: `${completed / total * 100}%` }
|
|
110
|
+
})
|
|
111
|
+
}),
|
|
112
|
+
children
|
|
113
|
+
]
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
AiTaskList.displayName = "AiTaskList";
|
|
117
|
+
//#endregion
|
|
118
|
+
export { SF_AI_TASK_LIST_VARIANTS as i, AiTaskListItem as n, SF_AI_TASK_LIST_DEFAULT_VARIANTS as r, AiTaskList as t };
|
|
119
|
+
|
|
120
|
+
//# sourceMappingURL=ai-task-list-B9CpMDYN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-task-list-B9CpMDYN.js","names":[],"sources":["../src/components/ai-task-list/ai-task-list.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n CheckCircleIcon,\n CircleDashedIcon,\n CircleNotchIcon,\n XCircleIcon,\n} from \"@phosphor-icons/react\";\nimport type { ElementType, HTMLAttributes, ReactNode } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_TASK_LIST_VARIANTS = {} as const;\nexport const SF_AI_TASK_LIST_DEFAULT_VARIANTS = {} as const;\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type AiTaskStatus =\n | \"pending\"\n | \"in_progress\"\n | \"completed\"\n | \"cancelled\";\n\nexport type AiTaskPriority = \"high\" | \"medium\" | \"low\";\n\nexport type AiTaskItem = {\n /** Unique task identifier. */\n id: string;\n /** Task description. */\n content: string;\n /** Current status. */\n status: AiTaskStatus;\n /** Priority level. */\n priority?: AiTaskPriority;\n};\n\nexport type AiTaskListProps = Omit<HTMLAttributes<HTMLDivElement>, \"title\"> & {\n /** List of tasks. */\n tasks: AiTaskItem[];\n /** Optional title above the task list. */\n title?: string;\n /** Custom icon for the title area. */\n icon?: ElementType;\n /** Show a progress summary (e.g. \"3 / 7 done\"). Default: `true`. */\n showProgress?: boolean;\n /** Content rendered below the task list. */\n children?: ReactNode;\n};\n\nexport type AiTaskListItemProps = HTMLAttributes<HTMLDivElement> & {\n task: AiTaskItem;\n};\n\n// ─── Status config ────────────────────────────────────────────────────────────\n\nconst STATUS_CONFIG: Record<\n AiTaskStatus,\n { icon: ElementType; className: string; textClassName: string }\n> = {\n pending: {\n icon: CircleDashedIcon,\n className: \"text-sf-subtle/60\",\n textClassName: \"text-sf-subtle\",\n },\n in_progress: {\n icon: CircleNotchIcon,\n className: \"text-sf-brand animate-spin\",\n textClassName: \"text-sf-default\",\n },\n completed: {\n icon: CheckCircleIcon,\n className: \"text-sf-success/60\",\n textClassName: \"text-sf-subtle/60 line-through\",\n },\n cancelled: {\n icon: XCircleIcon,\n className: \"text-sf-subtle/40\",\n textClassName: \"text-sf-subtle/40 line-through\",\n },\n};\n\nconst PRIORITY_DOT: Record<AiTaskPriority, string> = {\n high: \"bg-sf-danger\",\n medium: \"bg-sf-warning\",\n low: \"bg-sf-subtle\",\n};\n\n// ─── AiTaskListItem ──────────────────────────────────────────────────────────\n\n/**\n * Single task item with status icon, content, and optional priority dot.\n */\nexport function AiTaskListItem({\n task,\n className,\n ...props\n}: AiTaskListItemProps) {\n const config = STATUS_CONFIG[task.status];\n const StatusIcon = config.icon;\n\n return (\n <div className={cn(\"flex items-start gap-2 py-1\", className)} {...props}>\n <StatusIcon\n className={cn(\"mt-0.5 size-3.5 shrink-0\", config.className)}\n />\n <span className={cn(\"min-w-0 grow text-sm\", config.textClassName)}>\n {task.content}\n </span>\n {task.priority && (\n <span\n className={cn(\n \"mt-2 size-1 shrink-0 rounded-full\",\n PRIORITY_DOT[task.priority]\n )}\n title={`${task.priority} priority`}\n />\n )}\n </div>\n );\n}\n\nAiTaskListItem.displayName = \"AiTaskListItem\";\n\n// ─── AiTaskList ──────────────────────────────────────────────────────────────\n\n/**\n * Task progress list. Renders structured tasks from the harness `task_write`\n * tool. Typically rendered inside the `PromptInputBackLayer` or inline in\n * conversation.\n *\n * Maps to harness event: `task_updated`.\n *\n * @example\n * ```tsx\n * <AiTaskList\n * title=\"Current tasks\"\n * tasks={[\n * { id: \"1\", content: \"Read config file\", status: \"completed\", priority: \"high\" },\n * { id: \"2\", content: \"Run migrations\", status: \"in_progress\", priority: \"high\" },\n * { id: \"3\", content: \"Seed database\", status: \"pending\", priority: \"medium\" },\n * ]}\n * />\n * ```\n */\nexport function AiTaskList({\n tasks,\n title,\n icon,\n showProgress = true,\n children,\n className,\n ...props\n}: AiTaskListProps) {\n const completed = tasks.filter((t) => t.status === \"completed\").length;\n const total = tasks.filter((t) => t.status !== \"cancelled\").length;\n\n return (\n <div className={cn(\"flex flex-col gap-1\", className)} {...props}>\n {/* Header */}\n {(title || showProgress) && (\n <div className=\"flex items-center justify-between gap-2 pb-0.5\">\n <div className=\"flex items-center gap-1.5\">\n {icon &&\n (() => {\n const Icon = icon;\n return <Icon className=\"size-3.5 text-sf-subtle\" />;\n })()}\n {title && <span className=\"text-sm text-sf-subtle\">{title}</span>}\n </div>\n {showProgress && total > 0 && (\n <span className=\"text-xs tabular-nums text-sf-subtle/60\">\n {completed}/{total}\n </span>\n )}\n </div>\n )}\n\n {/* Tasks */}\n <div className=\"flex flex-col\">\n {tasks.map((task) => (\n <AiTaskListItem key={task.id} task={task} />\n ))}\n </div>\n\n {/* Progress bar */}\n {showProgress && total > 0 && (\n <div className=\"mt-1 h-0.5 overflow-hidden rounded-full bg-sf-tint\">\n <div\n className=\"h-full rounded-full bg-sf-brand/60 transition-[width] duration-300 ease-out\"\n style={{ width: `${(completed / total) * 100}%` }}\n />\n </div>\n )}\n\n {children}\n </div>\n );\n}\n\nAiTaskList.displayName = \"AiTaskList\";\n"],"mappings":";;;;;AAcA,IAAa,2BAA2B,EAAE;AAC1C,IAAa,mCAAmC,EAAE;AA0ClD,IAAM,gBAGF;CACF,SAAS;EACP,MAAM;EACN,WAAW;EACX,eAAe;EAChB;CACD,aAAa;EACX,MAAM;EACN,WAAW;EACX,eAAe;EAChB;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,eAAe;EAChB;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,eAAe;EAChB;CACF;AAED,IAAM,eAA+C;CACnD,MAAM;CACN,QAAQ;CACR,KAAK;CACN;;;;AAOD,SAAgB,eAAe,EAC7B,MACA,WACA,GAAG,SACmB;CACtB,MAAM,SAAS,cAAc,KAAK;CAClC,MAAM,aAAa,OAAO;AAE1B,QACE,qBAAC,OAAD;EAAK,WAAW,GAAG,+BAA+B,UAAU;EAAE,GAAI;YAAlE;GACE,oBAAC,YAAD,EACE,WAAW,GAAG,4BAA4B,OAAO,UAAU,EAC3D,CAAA;GACF,oBAAC,QAAD;IAAM,WAAW,GAAG,wBAAwB,OAAO,cAAc;cAC9D,KAAK;IACD,CAAA;GACN,KAAK,YACJ,oBAAC,QAAD;IACE,WAAW,GACT,qCACA,aAAa,KAAK,UACnB;IACD,OAAO,GAAG,KAAK,SAAS;IACxB,CAAA;GAEA;;;AAIV,eAAe,cAAc;;;;;;;;;;;;;;;;;;;;AAuB7B,SAAgB,WAAW,EACzB,OACA,OACA,MACA,eAAe,MACf,UACA,WACA,GAAG,SACe;CAClB,MAAM,YAAY,MAAM,QAAQ,MAAM,EAAE,WAAW,YAAY,CAAC;CAChE,MAAM,QAAQ,MAAM,QAAQ,MAAM,EAAE,WAAW,YAAY,CAAC;AAE5D,QACE,qBAAC,OAAD;EAAK,WAAW,GAAG,uBAAuB,UAAU;EAAE,GAAI;YAA1D;IAEI,SAAS,iBACT,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACG,QAGU,oBADM,MACN,EAAM,WAAU,2BAA4B,CAAA,EAEtD,SAAS,oBAAC,QAAD;MAAM,WAAU;gBAA0B;MAAa,CAAA,CAC7D;QACL,gBAAgB,QAAQ,KACvB,qBAAC,QAAD;KAAM,WAAU;eAAhB;MACG;MAAU;MAAE;MACR;OAEL;;GAIR,oBAAC,OAAD;IAAK,WAAU;cACZ,MAAM,KAAK,SACV,oBAAC,gBAAD,EAAoC,MAAQ,EAAvB,KAAK,GAAkB,CAC5C;IACE,CAAA;GAGL,gBAAgB,QAAQ,KACvB,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,OAAD;KACE,WAAU;KACV,OAAO,EAAE,OAAO,GAAI,YAAY,QAAS,IAAI,IAAI;KACjD,CAAA;IACE,CAAA;GAGP;GACG;;;AAIV,WAAW,cAAc"}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as cn } from "./cn-YROP2_ox.js";
|
|
3
|
+
import { forwardRef, useCallback, useMemo, useRef, useState } from "react";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { BrainIcon, CaretDownIcon, CheckCircleIcon, CircleDashedIcon, CodeIcon, LightningIcon, MagnifyingGlassIcon, RobotIcon, ShieldWarningIcon, SpinnerGapIcon, WrenchIcon, XCircleIcon } from "@phosphor-icons/react";
|
|
6
|
+
//#region src/components/ai-timeline/ai-timeline.tsx
|
|
7
|
+
var SF_AI_TIMELINE_VARIANTS = { density: {
|
|
8
|
+
comfortable: {
|
|
9
|
+
classes: "",
|
|
10
|
+
description: "Taller lanes with more padding"
|
|
11
|
+
},
|
|
12
|
+
compact: {
|
|
13
|
+
classes: "",
|
|
14
|
+
description: "Tight lanes for dense views"
|
|
15
|
+
}
|
|
16
|
+
} };
|
|
17
|
+
var SF_AI_TIMELINE_DEFAULT_VARIANTS = { density: "comfortable" };
|
|
18
|
+
var AGENT_ICONS = {
|
|
19
|
+
explore: MagnifyingGlassIcon,
|
|
20
|
+
search: MagnifyingGlassIcon,
|
|
21
|
+
execute: CodeIcon,
|
|
22
|
+
code: CodeIcon,
|
|
23
|
+
plan: BrainIcon,
|
|
24
|
+
think: BrainIcon,
|
|
25
|
+
tool: WrenchIcon,
|
|
26
|
+
build: WrenchIcon,
|
|
27
|
+
main: LightningIcon
|
|
28
|
+
};
|
|
29
|
+
function getAgentIcon(agentType, customIcon) {
|
|
30
|
+
if (customIcon) return customIcon;
|
|
31
|
+
if (agentType) {
|
|
32
|
+
const lower = agentType.toLowerCase();
|
|
33
|
+
for (const [key, icon] of Object.entries(AGENT_ICONS)) if (lower.includes(key)) return icon;
|
|
34
|
+
}
|
|
35
|
+
return RobotIcon;
|
|
36
|
+
}
|
|
37
|
+
function getModelShort(modelId) {
|
|
38
|
+
if (!modelId) return "";
|
|
39
|
+
return modelId.split("/").pop()?.replace(/^claude-/, "").replace(/-\d+$/, "") ?? "";
|
|
40
|
+
}
|
|
41
|
+
function formatMs(ms) {
|
|
42
|
+
const s = Math.round(ms / 100) / 10;
|
|
43
|
+
if (s < 60) return `${s}s`;
|
|
44
|
+
return `${Math.floor(s / 60)}m ${Math.round(s % 60)}s`;
|
|
45
|
+
}
|
|
46
|
+
var BLOCK_COLORS = {
|
|
47
|
+
running: "bg-sf-brand text-sf-inverse",
|
|
48
|
+
tool_call: "bg-sf-warning text-sf-inverse",
|
|
49
|
+
waiting: "bg-sf-fill text-sf-subtle",
|
|
50
|
+
approval: "bg-sf-info text-sf-inverse",
|
|
51
|
+
completed: "bg-sf-brand/60 text-sf-inverse",
|
|
52
|
+
error: "bg-sf-danger text-sf-inverse"
|
|
53
|
+
};
|
|
54
|
+
var BLOCK_HOVER = "hover:brightness-110 hover:shadow-sm";
|
|
55
|
+
function BlockIcon({ type }) {
|
|
56
|
+
switch (type) {
|
|
57
|
+
case "running": return /* @__PURE__ */ jsx(SpinnerGapIcon, {
|
|
58
|
+
size: 8,
|
|
59
|
+
className: "animate-spin"
|
|
60
|
+
});
|
|
61
|
+
case "tool_call": return /* @__PURE__ */ jsx(WrenchIcon, { size: 8 });
|
|
62
|
+
case "approval": return /* @__PURE__ */ jsx(ShieldWarningIcon, { size: 8 });
|
|
63
|
+
case "completed": return /* @__PURE__ */ jsx(CheckCircleIcon, { size: 8 });
|
|
64
|
+
case "error": return /* @__PURE__ */ jsx(XCircleIcon, { size: 8 });
|
|
65
|
+
default: return /* @__PURE__ */ jsx(CircleDashedIcon, { size: 8 });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function TimelineBlockSegment({ block, timeOrigin, nowMs, pxPerMs, laneHeight, onBlockClick, rowIndex = 0, rowCount = 1 }) {
|
|
69
|
+
const left = Math.max(0, (block.startMs - timeOrigin) * pxPerMs);
|
|
70
|
+
const end = block.endMs ?? nowMs;
|
|
71
|
+
const width = Math.max(4, (end - block.startMs) * pxPerMs);
|
|
72
|
+
const durationMs = end - block.startMs;
|
|
73
|
+
const MIN_LABEL_PX = 40;
|
|
74
|
+
const roundedClass = width < 20 ? "rounded-none" : width < 40 ? "rounded-sm" : "rounded-md";
|
|
75
|
+
const blockHeight = laneHeight - 8;
|
|
76
|
+
const innerPadding = 2;
|
|
77
|
+
const rowHeight = (blockHeight - innerPadding * 2) / rowCount;
|
|
78
|
+
const topOffset = innerPadding + rowIndex * rowHeight;
|
|
79
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
80
|
+
type: "button",
|
|
81
|
+
"aria-label": block.label ?? block.type,
|
|
82
|
+
title: block.description ?? block.label,
|
|
83
|
+
onClick: onBlockClick ? () => onBlockClick(block) : void 0,
|
|
84
|
+
className: cn("group absolute transition-[width] duration-150", roundedClass, BLOCK_COLORS[block.type], onBlockClick ? BLOCK_HOVER : "cursor-default", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sf-ring", "flex items-center gap-1 overflow-hidden px-1.5"),
|
|
85
|
+
style: {
|
|
86
|
+
left,
|
|
87
|
+
width,
|
|
88
|
+
height: rowHeight - 1,
|
|
89
|
+
top: topOffset
|
|
90
|
+
},
|
|
91
|
+
children: [
|
|
92
|
+
/* @__PURE__ */ jsx(BlockIcon, { type: block.type }),
|
|
93
|
+
width >= MIN_LABEL_PX && block.label && /* @__PURE__ */ jsx("span", {
|
|
94
|
+
className: "truncate text-[9px] font-medium leading-none",
|
|
95
|
+
children: block.label
|
|
96
|
+
}),
|
|
97
|
+
width >= MIN_LABEL_PX && /* @__PURE__ */ jsx("span", {
|
|
98
|
+
className: "ml-auto shrink-0 text-[8px] opacity-70",
|
|
99
|
+
children: formatMs(durationMs)
|
|
100
|
+
})
|
|
101
|
+
]
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Calculate row assignments for blocks to avoid overlap.
|
|
106
|
+
* Returns arrays of blocks grouped by row, where no blocks in a row overlap in time.
|
|
107
|
+
*/
|
|
108
|
+
function computeBlockRows(blocks) {
|
|
109
|
+
if (blocks.length === 0) return [];
|
|
110
|
+
const sorted = [...blocks].sort((a, b) => a.startMs - b.startMs);
|
|
111
|
+
const rows = [];
|
|
112
|
+
for (const block of sorted) {
|
|
113
|
+
let placed = false;
|
|
114
|
+
for (const row of rows) if (!row.some((existing) => block.startMs < (existing.endMs ?? Infinity) && (block.endMs ?? Infinity) > existing.startMs)) {
|
|
115
|
+
row.push(block);
|
|
116
|
+
placed = true;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
if (!placed) rows.push([block]);
|
|
120
|
+
}
|
|
121
|
+
return rows;
|
|
122
|
+
}
|
|
123
|
+
var LANE_HEIGHT_COMFORTABLE = 40;
|
|
124
|
+
var LANE_HEIGHT_COMPACT = 28;
|
|
125
|
+
var LABEL_WIDTH = 128;
|
|
126
|
+
/**
|
|
127
|
+
* `AiTimelineLane` — a single horizontal swim lane within an `AiTimeline`.
|
|
128
|
+
*
|
|
129
|
+
* Shows one agent's activity as colored blocks on a time axis. Blocks
|
|
130
|
+
* represent periods of activity: running, tool calls, waiting, etc.
|
|
131
|
+
*
|
|
132
|
+
* Consumed by `AiTimeline` — pass lanes as children.
|
|
133
|
+
*/
|
|
134
|
+
var AiTimelineLane = forwardRef(({ label, agentType, modelId, status = "idle", blocks, timeOrigin, nowMs, pxPerMs, defaultExpanded = false, onBlockClick, icon, density = "comfortable", className, ...props }, ref) => {
|
|
135
|
+
const [expanded, setExpanded] = useState(defaultExpanded);
|
|
136
|
+
const Icon = getAgentIcon(agentType, icon);
|
|
137
|
+
const modelShort = getModelShort(modelId);
|
|
138
|
+
const blockRows = useMemo(() => computeBlockRows(blocks), [blocks]);
|
|
139
|
+
const rowCount = blockRows.length;
|
|
140
|
+
const baseLaneH = density === "compact" ? LANE_HEIGHT_COMPACT : LANE_HEIGHT_COMFORTABLE;
|
|
141
|
+
const laneH = rowCount > 1 ? baseLaneH * rowCount : baseLaneH;
|
|
142
|
+
const maxEnd = useMemo(() => {
|
|
143
|
+
if (!blocks.length) return timeOrigin;
|
|
144
|
+
return Math.max(...blocks.map((b) => b.endMs ?? nowMs));
|
|
145
|
+
}, [
|
|
146
|
+
blocks,
|
|
147
|
+
timeOrigin,
|
|
148
|
+
nowMs
|
|
149
|
+
]);
|
|
150
|
+
const totalWidth = Math.max(0, (maxEnd - timeOrigin) * pxPerMs);
|
|
151
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
152
|
+
ref,
|
|
153
|
+
className: cn("border-b border-sf-line last:border-b-0", className),
|
|
154
|
+
...props,
|
|
155
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
156
|
+
className: "flex",
|
|
157
|
+
style: { height: laneH },
|
|
158
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
159
|
+
className: "flex shrink-0 items-center gap-2 border-r border-sf-line bg-sf-base px-3",
|
|
160
|
+
style: { width: LABEL_WIDTH },
|
|
161
|
+
children: [
|
|
162
|
+
blocks.some((b) => b.detail) && /* @__PURE__ */ jsx("button", {
|
|
163
|
+
type: "button",
|
|
164
|
+
"aria-label": expanded ? "Collapse lane" : "Expand lane",
|
|
165
|
+
onClick: () => setExpanded((v) => !v),
|
|
166
|
+
className: "shrink-0 text-sf-subtle hover:text-sf-default focus-visible:outline-none",
|
|
167
|
+
children: /* @__PURE__ */ jsx(CaretDownIcon, {
|
|
168
|
+
size: 10,
|
|
169
|
+
className: cn("transition-transform", expanded && "rotate-180")
|
|
170
|
+
})
|
|
171
|
+
}),
|
|
172
|
+
/* @__PURE__ */ jsx("div", {
|
|
173
|
+
className: cn("flex shrink-0 items-center justify-center rounded", density === "compact" ? "size-5" : "size-6", status === "running" ? "text-sf-brand" : status === "completed" ? "text-sf-success" : status === "error" ? "text-sf-danger" : "text-sf-subtle"),
|
|
174
|
+
children: status === "running" ? /* @__PURE__ */ jsx(SpinnerGapIcon, {
|
|
175
|
+
size: density === "compact" ? 12 : 14,
|
|
176
|
+
className: "animate-spin"
|
|
177
|
+
}) : /* @__PURE__ */ jsx(Icon, { size: density === "compact" ? 12 : 14 })
|
|
178
|
+
}),
|
|
179
|
+
/* @__PURE__ */ jsxs("div", {
|
|
180
|
+
className: "min-w-0 flex-1",
|
|
181
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
182
|
+
className: cn("truncate font-medium text-sf-default", density === "compact" ? "text-[10px]" : "text-xs"),
|
|
183
|
+
children: label
|
|
184
|
+
}), modelShort && density === "comfortable" && /* @__PURE__ */ jsx("div", {
|
|
185
|
+
className: "truncate font-mono text-[9px] text-sf-inactive",
|
|
186
|
+
children: modelShort
|
|
187
|
+
})]
|
|
188
|
+
})
|
|
189
|
+
]
|
|
190
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
191
|
+
className: "relative flex-1 overflow-hidden",
|
|
192
|
+
style: { minWidth: totalWidth },
|
|
193
|
+
children: blockRows.map((row, rowIndex) => row.map((block) => /* @__PURE__ */ jsx(TimelineBlockSegment, {
|
|
194
|
+
block,
|
|
195
|
+
timeOrigin,
|
|
196
|
+
nowMs,
|
|
197
|
+
pxPerMs,
|
|
198
|
+
laneHeight: laneH,
|
|
199
|
+
onBlockClick,
|
|
200
|
+
rowIndex,
|
|
201
|
+
rowCount
|
|
202
|
+
}, block.id)))
|
|
203
|
+
})]
|
|
204
|
+
}), expanded && blocks.filter((b) => b.detail).map((block) => /* @__PURE__ */ jsxs("div", {
|
|
205
|
+
className: "ml-[128px] border-t border-sf-line/50 bg-sf-recessed px-3 py-2",
|
|
206
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
207
|
+
className: "mb-1 flex items-center gap-1.5",
|
|
208
|
+
children: [
|
|
209
|
+
/* @__PURE__ */ jsx("span", { className: cn("size-1.5 rounded-full", BLOCK_COLORS[block.type].split(" ")[0]) }),
|
|
210
|
+
/* @__PURE__ */ jsx("span", {
|
|
211
|
+
className: "text-[10px] font-medium text-sf-strong",
|
|
212
|
+
children: block.label ?? block.type
|
|
213
|
+
}),
|
|
214
|
+
block.endMs && /* @__PURE__ */ jsx("span", {
|
|
215
|
+
className: "text-[10px] text-sf-subtle",
|
|
216
|
+
children: formatMs(block.endMs - block.startMs)
|
|
217
|
+
})
|
|
218
|
+
]
|
|
219
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
220
|
+
className: "text-xs text-sf-subtle",
|
|
221
|
+
children: block.detail
|
|
222
|
+
})]
|
|
223
|
+
}, `detail-${block.id}`))]
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
AiTimelineLane.displayName = "AiTimelineLane";
|
|
227
|
+
var TIME_AXIS_HEIGHT = 24;
|
|
228
|
+
/** Format elapsed time for tick labels — shows seconds with 1 decimal when under 1 minute */
|
|
229
|
+
function formatElapsed(ms) {
|
|
230
|
+
if (ms < 6e4) {
|
|
231
|
+
const s = Math.round(ms / 100) / 10;
|
|
232
|
+
return `${s.toFixed(s % 1 === 0 ? 0 : 1)}s`;
|
|
233
|
+
}
|
|
234
|
+
const m = Math.floor(ms / 6e4);
|
|
235
|
+
const s = Math.round(ms % 6e4 / 1e3);
|
|
236
|
+
return s > 0 ? `${m}m ${s}s` : `${m}m`;
|
|
237
|
+
}
|
|
238
|
+
/** Generate time axis tick marks spaced appropriately for the zoom level. */
|
|
239
|
+
function generateTicks(originMs, nowMs, pxPerMs, totalWidth) {
|
|
240
|
+
const durationMs = nowMs - originMs;
|
|
241
|
+
const tickIntervalMs = (() => {
|
|
242
|
+
const pxPerSec = pxPerMs * 1e3;
|
|
243
|
+
if (pxPerSec >= 100) return 1e3;
|
|
244
|
+
if (pxPerSec >= 30) return 5e3;
|
|
245
|
+
if (pxPerSec >= 10) return 1e4;
|
|
246
|
+
if (pxPerSec >= 5) return 3e4;
|
|
247
|
+
return 6e4;
|
|
248
|
+
})();
|
|
249
|
+
const ticks = [];
|
|
250
|
+
const firstTick = Math.ceil(originMs / tickIntervalMs) * tickIntervalMs;
|
|
251
|
+
for (let t = firstTick; t <= originMs + durationMs; t += tickIntervalMs) {
|
|
252
|
+
const elapsed = t - originMs;
|
|
253
|
+
const x = elapsed * pxPerMs;
|
|
254
|
+
if (x > totalWidth) break;
|
|
255
|
+
const label = formatElapsed(elapsed);
|
|
256
|
+
ticks.push({
|
|
257
|
+
label,
|
|
258
|
+
x
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
return ticks;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* `AiTimeline` — horizontal swim-lane timeline for commander-level orchestration.
|
|
265
|
+
*
|
|
266
|
+
* Displays multiple `AiTimelineLane` children on a shared time axis. Supports
|
|
267
|
+
* live updating (a "now" marker follows the live edge), panning, and zoom via
|
|
268
|
+
* `pixelsPerSecond`.
|
|
269
|
+
*
|
|
270
|
+
* @example
|
|
271
|
+
* ```tsx
|
|
272
|
+
* <AiTimeline
|
|
273
|
+
* timeOrigin={state.missionStartedAt}
|
|
274
|
+
* pixelsPerSecond={30}
|
|
275
|
+
* showNowMarker
|
|
276
|
+
* >
|
|
277
|
+
* <AiTimelineLane
|
|
278
|
+
* label="Main"
|
|
279
|
+
* blocks={mainLaneBlocks}
|
|
280
|
+
* timeOrigin={timeOrigin}
|
|
281
|
+
* nowMs={Date.now()}
|
|
282
|
+
* pxPerMs={pxPerMs}
|
|
283
|
+
* />
|
|
284
|
+
* <AiTimelineLane label="Explore" blocks={exploreBlocks} ... />
|
|
285
|
+
* </AiTimeline>
|
|
286
|
+
* ```
|
|
287
|
+
*/
|
|
288
|
+
var AiTimeline = forwardRef(({ timeOrigin, pixelsPerSecond = 30, showNowMarker = true, nowMs: nowMsProp, density: _density = SF_AI_TIMELINE_DEFAULT_VARIANTS.density, className, children, ...props }, ref) => {
|
|
289
|
+
const nowMs = nowMsProp ?? Date.now();
|
|
290
|
+
const origin = timeOrigin ?? nowMs;
|
|
291
|
+
const pxPerMs = pixelsPerSecond / 1e3;
|
|
292
|
+
const totalDurationMs = nowMs - origin;
|
|
293
|
+
const totalWidth = Math.max(400, totalDurationMs * pxPerMs + 120);
|
|
294
|
+
const nowX = totalDurationMs * pxPerMs;
|
|
295
|
+
const ticks = useMemo(() => generateTicks(origin, nowMs, pxPerMs, totalWidth), [
|
|
296
|
+
origin,
|
|
297
|
+
Math.floor(nowMs / 2e3),
|
|
298
|
+
pxPerMs,
|
|
299
|
+
totalWidth
|
|
300
|
+
]);
|
|
301
|
+
const scrollRef = useRef(null);
|
|
302
|
+
const scrollToNow = useCallback(() => {
|
|
303
|
+
const el = scrollRef.current;
|
|
304
|
+
if (!el) return;
|
|
305
|
+
const targetScroll = LABEL_WIDTH + nowX - el.clientWidth * .85;
|
|
306
|
+
el.scrollLeft = Math.max(0, targetScroll);
|
|
307
|
+
}, [nowX]);
|
|
308
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
309
|
+
ref,
|
|
310
|
+
className: cn("relative overflow-hidden rounded-lg border border-sf-line bg-sf-base", className),
|
|
311
|
+
...props,
|
|
312
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
313
|
+
ref: scrollRef,
|
|
314
|
+
className: "overflow-x-auto",
|
|
315
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
316
|
+
style: { minWidth: LABEL_WIDTH + totalWidth },
|
|
317
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
318
|
+
className: "flex border-b border-sf-line",
|
|
319
|
+
style: { height: TIME_AXIS_HEIGHT },
|
|
320
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
321
|
+
className: "shrink-0 border-r border-sf-line bg-sf-elevated px-3",
|
|
322
|
+
style: { width: LABEL_WIDTH },
|
|
323
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
324
|
+
className: "text-[10px] font-medium uppercase tracking-wider text-sf-subtle",
|
|
325
|
+
children: "Time"
|
|
326
|
+
})
|
|
327
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
328
|
+
className: "relative flex-1 bg-sf-recessed",
|
|
329
|
+
style: { minWidth: totalWidth },
|
|
330
|
+
children: [ticks.map((tick) => /* @__PURE__ */ jsxs("div", {
|
|
331
|
+
className: "absolute top-0 flex flex-col items-center",
|
|
332
|
+
style: { left: tick.x },
|
|
333
|
+
children: [/* @__PURE__ */ jsx("div", { className: "h-2 w-px bg-sf-line" }), /* @__PURE__ */ jsxs("span", {
|
|
334
|
+
className: "mt-0.5 font-mono text-[9px] text-sf-inactive",
|
|
335
|
+
children: ["+", tick.label]
|
|
336
|
+
})]
|
|
337
|
+
}, tick.x)), showNowMarker && /* @__PURE__ */ jsxs("div", {
|
|
338
|
+
className: "absolute top-0 flex flex-col items-center",
|
|
339
|
+
style: { left: nowX },
|
|
340
|
+
children: [/* @__PURE__ */ jsx("div", { className: "h-2 w-px bg-sf-brand" }), /* @__PURE__ */ jsx("span", {
|
|
341
|
+
className: "mt-0.5 font-mono text-[9px] font-medium text-sf-brand",
|
|
342
|
+
children: "now"
|
|
343
|
+
})]
|
|
344
|
+
})]
|
|
345
|
+
})]
|
|
346
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
347
|
+
className: "relative",
|
|
348
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
349
|
+
className: "pointer-events-none absolute inset-0 ml-[128px]",
|
|
350
|
+
children: [ticks.map((tick) => /* @__PURE__ */ jsx("div", {
|
|
351
|
+
className: "absolute top-0 h-full w-px bg-sf-line/50",
|
|
352
|
+
style: { left: tick.x }
|
|
353
|
+
}, `grid-${tick.x}`)), showNowMarker && /* @__PURE__ */ jsx("div", {
|
|
354
|
+
className: "absolute top-0 h-full w-px bg-sf-brand/30",
|
|
355
|
+
style: { left: nowX }
|
|
356
|
+
})]
|
|
357
|
+
}), children]
|
|
358
|
+
})]
|
|
359
|
+
})
|
|
360
|
+
}), showNowMarker && /* @__PURE__ */ jsx("button", {
|
|
361
|
+
type: "button",
|
|
362
|
+
"aria-label": "Scroll to now",
|
|
363
|
+
onClick: scrollToNow,
|
|
364
|
+
className: cn("absolute right-2 top-1 rounded px-1.5 py-0.5 text-[9px] font-medium", "bg-sf-brand/10 text-sf-brand hover:bg-sf-brand/20 transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sf-ring"),
|
|
365
|
+
children: "→ now"
|
|
366
|
+
})]
|
|
367
|
+
});
|
|
368
|
+
});
|
|
369
|
+
AiTimeline.displayName = "AiTimeline";
|
|
370
|
+
//#endregion
|
|
371
|
+
export { SF_AI_TIMELINE_VARIANTS as i, AiTimelineLane as n, SF_AI_TIMELINE_DEFAULT_VARIANTS as r, AiTimeline as t };
|
|
372
|
+
|
|
373
|
+
//# sourceMappingURL=ai-timeline-Bb5ntsr3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-timeline-Bb5ntsr3.js","names":[],"sources":["../src/components/ai-timeline/ai-timeline.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n BrainIcon,\n CaretDownIcon,\n CheckCircleIcon,\n CircleDashedIcon,\n CodeIcon,\n LightningIcon,\n MagnifyingGlassIcon,\n RobotIcon,\n ShieldWarningIcon,\n SpinnerGapIcon,\n WrenchIcon,\n XCircleIcon,\n} from \"@phosphor-icons/react\";\nimport type { ComponentProps, ElementType, ReactNode } from \"react\";\nimport { forwardRef, useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_TIMELINE_VARIANTS = {\n density: {\n comfortable: { classes: \"\", description: \"Taller lanes with more padding\" },\n compact: { classes: \"\", description: \"Tight lanes for dense views\" },\n },\n} as const;\n\nexport const SF_AI_TIMELINE_DEFAULT_VARIANTS = {\n density: \"comfortable\",\n} as const;\n\nexport type SFAiTimelineDensity = keyof typeof SF_AI_TIMELINE_VARIANTS.density;\n\n// ─── Block types ─────────────────────────────────────────────────────────────\n\n/** Visual type of a timeline block — controls color and icon. */\nexport type AiTimelineBlockType =\n | \"running\" // brand blue — agent actively generating\n | \"tool_call\" // amber — executing a tool\n | \"waiting\" // gray — idle/blocked\n | \"approval\" // purple — waiting for human approval\n | \"completed\" // green — successfully finished\n | \"error\"; // red — failed\n\n/** A colored segment on a lane representing a period of activity. */\nexport interface AiTimelineBlock {\n /** Unique ID for this block. */\n id: string;\n /** Visual type (controls color). */\n type: AiTimelineBlockType;\n /** Wall-clock ms when this activity started. */\n startMs: number;\n /**\n * Wall-clock ms when this activity ended.\n * Undefined means still active — the block extends to \"now\".\n */\n endMs?: number;\n /** Short label shown inside the block when space allows. */\n label?: string;\n /** Longer description shown in the expanded detail panel. */\n description?: string;\n /** Extra detail content shown when the block is expanded. */\n detail?: ReactNode;\n}\n\n// ─── Lane props ───────────────────────────────────────────────────────────────\n\nexport type AiTimelineLaneProps = Omit<ComponentProps<\"div\">, \"children\"> & {\n /** Lane label (agent name). */\n label: string;\n /** Agent type string for icon selection. */\n agentType?: string;\n /** Model ID shown as a subtle badge. */\n modelId?: string;\n /** Current lane status — controls the label icon. */\n status?: \"idle\" | \"running\" | \"completed\" | \"error\";\n /** Ordered activity blocks for this lane. */\n blocks: AiTimelineBlock[];\n /** Timeline origin (ms) — same as AiTimeline timeOrigin. */\n timeOrigin: number;\n /** Current \"now\" timestamp (ms) for live blocks. */\n nowMs: number;\n /** Pixels per millisecond (zoom level). */\n pxPerMs: number;\n /** Whether the lane is expanded to show block details. */\n defaultExpanded?: boolean;\n /** Callback when a block is clicked. */\n onBlockClick?: (block: AiTimelineBlock) => void;\n /** Custom icon override. */\n icon?: ElementType;\n /** Lane height variant. */\n density?: SFAiTimelineDensity;\n};\n\n// ─── Timeline props ───────────────────────────────────────────────────────────\n\nexport type AiTimelineProps = Omit<ComponentProps<\"div\">, \"children\"> & {\n /**\n * Wall-clock ms for the timeline origin (t=0).\n * Defaults to the startMs of the first block across all lanes.\n */\n timeOrigin?: number;\n /**\n * Pixels per second of elapsed time.\n * Controls horizontal zoom level.\n * @default 30\n */\n pixelsPerSecond?: number;\n /**\n * Whether to show a pulsing \"now\" marker at the live edge.\n * @default true\n */\n showNowMarker?: boolean;\n /**\n * Current timestamp in ms. Used to render the \"now\" marker and open-ended\n * block widths. Pass a stable `useState` value to prevent hydration shifts.\n * When omitted, `Date.now()` is called at render time (fine for live views\n * driven by a ticking parent, not suitable for SSR).\n */\n nowMs?: number;\n /** Lane density variant. @default \"comfortable\" */\n density?: SFAiTimelineDensity;\n /** Children should be `AiTimelineLane` components. */\n children?: ReactNode;\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst AGENT_ICONS: Record<string, ElementType> = {\n explore: MagnifyingGlassIcon,\n search: MagnifyingGlassIcon,\n execute: CodeIcon,\n code: CodeIcon,\n plan: BrainIcon,\n think: BrainIcon,\n tool: WrenchIcon,\n build: WrenchIcon,\n main: LightningIcon,\n};\n\nfunction getAgentIcon(\n agentType?: string,\n customIcon?: ElementType\n): ElementType {\n if (customIcon) return customIcon;\n if (agentType) {\n const lower = agentType.toLowerCase();\n for (const [key, icon] of Object.entries(AGENT_ICONS)) {\n if (lower.includes(key)) return icon;\n }\n }\n return RobotIcon;\n}\n\nfunction getModelShort(modelId?: string) {\n if (!modelId) return \"\";\n return (\n modelId\n .split(\"/\")\n .pop()\n ?.replace(/^claude-/, \"\")\n .replace(/-\\d+$/, \"\") ?? \"\"\n );\n}\n\nfunction formatMs(ms: number) {\n const s = Math.round(ms / 100) / 10;\n if (s < 60) return `${s}s`;\n return `${Math.floor(s / 60)}m ${Math.round(s % 60)}s`;\n}\n\n// Block colors — all semantic SF tokens, no raw Tailwind colors\nconst BLOCK_COLORS: Record<AiTimelineBlockType, string> = {\n running: \"bg-sf-brand text-sf-inverse\",\n tool_call: \"bg-sf-warning text-sf-inverse\",\n waiting: \"bg-sf-fill text-sf-subtle\",\n approval: \"bg-sf-info text-sf-inverse\",\n completed: \"bg-sf-brand/60 text-sf-inverse\",\n error: \"bg-sf-danger text-sf-inverse\",\n};\n\n// Hover is a uniform subtle brightness lift — no per-type color shifting\nconst BLOCK_HOVER = \"hover:brightness-110 hover:shadow-sm\";\n\nfunction BlockIcon({ type }: { type: AiTimelineBlockType }) {\n switch (type) {\n case \"running\":\n return <SpinnerGapIcon size={8} className=\"animate-spin\" />;\n case \"tool_call\":\n return <WrenchIcon size={8} />;\n case \"approval\":\n return <ShieldWarningIcon size={8} />;\n case \"completed\":\n return <CheckCircleIcon size={8} />;\n case \"error\":\n return <XCircleIcon size={8} />;\n default:\n return <CircleDashedIcon size={8} />;\n }\n}\n\n// ─── AiTimelineBlock (rendered) ───────────────────────────────────────────────\n\nfunction TimelineBlockSegment({\n block,\n timeOrigin,\n nowMs,\n pxPerMs,\n laneHeight,\n onBlockClick,\n rowIndex = 0,\n rowCount = 1,\n}: {\n block: AiTimelineBlock;\n timeOrigin: number;\n nowMs: number;\n pxPerMs: number;\n laneHeight: number;\n onBlockClick?: (block: AiTimelineBlock) => void;\n rowIndex?: number;\n rowCount?: number;\n}) {\n const left = Math.max(0, (block.startMs - timeOrigin) * pxPerMs);\n const end = block.endMs ?? nowMs;\n const width = Math.max(4, (end - block.startMs) * pxPerMs);\n const durationMs = end - block.startMs;\n\n const MIN_LABEL_PX = 40;\n // Short blocks get sharp corners to avoid weird rounded look when overlaid\n const isShort = width < 20;\n const roundedClass = isShort\n ? \"rounded-none\"\n : width < 40\n ? \"rounded-sm\"\n : \"rounded-md\";\n\n // Calculate vertical position for overlapping blocks\n // Blocks that overlap in time stack vertically, centered within the lane\n const blockHeight = laneHeight - 8;\n const innerPadding = 2;\n const availableHeight = blockHeight - innerPadding * 2;\n const rowHeight = availableHeight / rowCount;\n const topOffset = innerPadding + rowIndex * rowHeight;\n\n return (\n <button\n type=\"button\"\n aria-label={block.label ?? block.type}\n title={block.description ?? block.label}\n onClick={onBlockClick ? () => onBlockClick(block) : undefined}\n className={cn(\n \"group absolute transition-[width] duration-150\",\n roundedClass,\n BLOCK_COLORS[block.type],\n onBlockClick ? BLOCK_HOVER : \"cursor-default\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sf-ring\",\n \"flex items-center gap-1 overflow-hidden px-1.5\"\n )}\n style={{\n left,\n width,\n height: rowHeight - 1,\n top: topOffset,\n }}\n >\n <BlockIcon type={block.type} />\n {width >= MIN_LABEL_PX && block.label && (\n <span className=\"truncate text-[9px] font-medium leading-none\">\n {block.label}\n </span>\n )}\n {width >= MIN_LABEL_PX && (\n <span className=\"ml-auto shrink-0 text-[8px] opacity-70\">\n {formatMs(durationMs)}\n </span>\n )}\n </button>\n );\n}\n\n/**\n * Calculate row assignments for blocks to avoid overlap.\n * Returns arrays of blocks grouped by row, where no blocks in a row overlap in time.\n */\nfunction computeBlockRows(blocks: AiTimelineBlock[]): AiTimelineBlock[][] {\n if (blocks.length === 0) return [];\n\n // Sort blocks by start time\n const sorted = [...blocks].sort((a, b) => a.startMs - b.startMs);\n const rows: AiTimelineBlock[][] = [];\n\n for (const block of sorted) {\n // Find the first row where this block doesn't overlap with any existing block\n let placed = false;\n for (const row of rows) {\n const overlaps = row.some(\n (existing) =>\n block.startMs < (existing.endMs ?? Infinity) &&\n (block.endMs ?? Infinity) > existing.startMs\n );\n if (!overlaps) {\n row.push(block);\n placed = true;\n break;\n }\n }\n if (!placed) {\n // Start a new row\n rows.push([block]);\n }\n }\n\n return rows;\n}\n\n// ─── AiTimelineLane ───────────────────────────────────────────────────────────\n\nconst LANE_HEIGHT_COMFORTABLE = 40;\nconst LANE_HEIGHT_COMPACT = 28;\nconst LABEL_WIDTH = 128;\n\n/**\n * `AiTimelineLane` — a single horizontal swim lane within an `AiTimeline`.\n *\n * Shows one agent's activity as colored blocks on a time axis. Blocks\n * represent periods of activity: running, tool calls, waiting, etc.\n *\n * Consumed by `AiTimeline` — pass lanes as children.\n */\nexport const AiTimelineLane = forwardRef<HTMLDivElement, AiTimelineLaneProps>(\n (\n {\n label,\n agentType,\n modelId,\n status = \"idle\",\n blocks,\n timeOrigin,\n nowMs,\n pxPerMs,\n defaultExpanded = false,\n onBlockClick,\n icon,\n density = \"comfortable\",\n className,\n ...props\n },\n ref\n ) => {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const Icon = getAgentIcon(agentType, icon);\n const modelShort = getModelShort(modelId);\n\n // Compute block rows to handle overlapping blocks\n const blockRows = useMemo(() => computeBlockRows(blocks), [blocks]);\n const rowCount = blockRows.length;\n\n // Lane height scales with number of rows for overlapping blocks\n const baseLaneH =\n density === \"compact\" ? LANE_HEIGHT_COMPACT : LANE_HEIGHT_COMFORTABLE;\n const laneH = rowCount > 1 ? baseLaneH * rowCount : baseLaneH;\n\n // Total timeline width needed for this lane\n const maxEnd = useMemo(() => {\n if (!blocks.length) return timeOrigin;\n return Math.max(...blocks.map((b) => b.endMs ?? nowMs));\n }, [blocks, timeOrigin, nowMs]);\n\n const totalWidth = Math.max(0, (maxEnd - timeOrigin) * pxPerMs);\n\n return (\n <div\n ref={ref}\n className={cn(\"border-b border-sf-line last:border-b-0\", className)}\n {...props}\n >\n {/* Lane row */}\n <div className=\"flex\" style={{ height: laneH }}>\n {/* Label sidebar */}\n <div\n className=\"flex shrink-0 items-center gap-2 border-r border-sf-line bg-sf-base px-3\"\n style={{ width: LABEL_WIDTH }}\n >\n {/* Expand toggle (only when there are expandable blocks) */}\n {blocks.some((b) => b.detail) && (\n <button\n type=\"button\"\n aria-label={expanded ? \"Collapse lane\" : \"Expand lane\"}\n onClick={() => setExpanded((v) => !v)}\n className=\"shrink-0 text-sf-subtle hover:text-sf-default focus-visible:outline-none\"\n >\n <CaretDownIcon\n size={10}\n className={cn(\n \"transition-transform\",\n expanded && \"rotate-180\"\n )}\n />\n </button>\n )}\n\n {/* Agent icon */}\n <div\n className={cn(\n \"flex shrink-0 items-center justify-center rounded\",\n density === \"compact\" ? \"size-5\" : \"size-6\",\n status === \"running\"\n ? \"text-sf-brand\"\n : status === \"completed\"\n ? \"text-sf-success\"\n : status === \"error\"\n ? \"text-sf-danger\"\n : \"text-sf-subtle\"\n )}\n >\n {status === \"running\" ? (\n <SpinnerGapIcon\n size={density === \"compact\" ? 12 : 14}\n className=\"animate-spin\"\n />\n ) : (\n <Icon size={density === \"compact\" ? 12 : 14} />\n )}\n </div>\n\n {/* Name + model */}\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"truncate font-medium text-sf-default\",\n density === \"compact\" ? \"text-[10px]\" : \"text-xs\"\n )}\n >\n {label}\n </div>\n {modelShort && density === \"comfortable\" && (\n <div className=\"truncate font-mono text-[9px] text-sf-inactive\">\n {modelShort}\n </div>\n )}\n </div>\n </div>\n\n {/* Blocks area */}\n <div\n className=\"relative flex-1 overflow-hidden\"\n style={{ minWidth: totalWidth }}\n >\n {blockRows.map((row, rowIndex) =>\n row.map((block) => (\n <TimelineBlockSegment\n key={block.id}\n block={block}\n timeOrigin={timeOrigin}\n nowMs={nowMs}\n pxPerMs={pxPerMs}\n laneHeight={laneH}\n onBlockClick={onBlockClick}\n rowIndex={rowIndex}\n rowCount={rowCount}\n />\n ))\n )}\n </div>\n </div>\n\n {/* Expanded detail rows */}\n {expanded &&\n blocks\n .filter((b) => b.detail)\n .map((block) => (\n <div\n key={`detail-${block.id}`}\n className=\"ml-[128px] border-t border-sf-line/50 bg-sf-recessed px-3 py-2\"\n >\n <div className=\"mb-1 flex items-center gap-1.5\">\n <span\n className={cn(\n \"size-1.5 rounded-full\",\n BLOCK_COLORS[block.type].split(\" \")[0]\n )}\n />\n <span className=\"text-[10px] font-medium text-sf-strong\">\n {block.label ?? block.type}\n </span>\n {block.endMs && (\n <span className=\"text-[10px] text-sf-subtle\">\n {formatMs(block.endMs - block.startMs)}\n </span>\n )}\n </div>\n <div className=\"text-xs text-sf-subtle\">{block.detail}</div>\n </div>\n ))}\n </div>\n );\n }\n);\n\nAiTimelineLane.displayName = \"AiTimelineLane\";\n\n// ─── AiTimeline ───────────────────────────────────────────────────────────────\n\nconst TIME_AXIS_HEIGHT = 24;\n\n/** Format elapsed time for tick labels — shows seconds with 1 decimal when under 1 minute */\nfunction formatElapsed(ms: number): string {\n if (ms < 60_000) {\n const s = Math.round(ms / 100) / 10;\n return `${s.toFixed(s % 1 === 0 ? 0 : 1)}s`;\n }\n const m = Math.floor(ms / 60_000);\n const s = Math.round((ms % 60_000) / 1000);\n return s > 0 ? `${m}m ${s}s` : `${m}m`;\n}\n\n/** Generate time axis tick marks spaced appropriately for the zoom level. */\nfunction generateTicks(\n originMs: number,\n nowMs: number,\n pxPerMs: number,\n totalWidth: number\n): Array<{ label: string; sublabel?: string; x: number }> {\n const durationMs = nowMs - originMs;\n const tickIntervalMs = (() => {\n const pxPerSec = pxPerMs * 1000;\n if (pxPerSec >= 100) return 1000; // 1s ticks\n if (pxPerSec >= 30) return 5000; // 5s ticks\n if (pxPerSec >= 10) return 10_000; // 10s ticks\n if (pxPerSec >= 5) return 30_000; // 30s ticks\n return 60_000; // 1min ticks\n })();\n\n const ticks: Array<{ label: string; sublabel?: string; x: number }> = [];\n const firstTick = Math.ceil(originMs / tickIntervalMs) * tickIntervalMs;\n\n for (let t = firstTick; t <= originMs + durationMs; t += tickIntervalMs) {\n const elapsed = t - originMs;\n const x = elapsed * pxPerMs;\n if (x > totalWidth) break;\n const label = formatElapsed(elapsed);\n ticks.push({ label, x });\n }\n return ticks;\n}\n\n/**\n * `AiTimeline` — horizontal swim-lane timeline for commander-level orchestration.\n *\n * Displays multiple `AiTimelineLane` children on a shared time axis. Supports\n * live updating (a \"now\" marker follows the live edge), panning, and zoom via\n * `pixelsPerSecond`.\n *\n * @example\n * ```tsx\n * <AiTimeline\n * timeOrigin={state.missionStartedAt}\n * pixelsPerSecond={30}\n * showNowMarker\n * >\n * <AiTimelineLane\n * label=\"Main\"\n * blocks={mainLaneBlocks}\n * timeOrigin={timeOrigin}\n * nowMs={Date.now()}\n * pxPerMs={pxPerMs}\n * />\n * <AiTimelineLane label=\"Explore\" blocks={exploreBlocks} ... />\n * </AiTimeline>\n * ```\n */\nexport const AiTimeline = forwardRef<HTMLDivElement, AiTimelineProps>(\n (\n {\n timeOrigin,\n pixelsPerSecond = 30,\n showNowMarker = true,\n nowMs: nowMsProp,\n density: _density = SF_AI_TIMELINE_DEFAULT_VARIANTS.density,\n className,\n children,\n ...props\n },\n ref\n ) => {\n // Use the provided stable nowMs, or fall back to Date.now().\n // For SSR-safe demos, always pass a stable useState value as nowMs.\n const nowMs = nowMsProp ?? Date.now();\n const origin = timeOrigin ?? nowMs;\n const pxPerMs = pixelsPerSecond / 1000;\n const totalDurationMs = nowMs - origin;\n const totalWidth = Math.max(400, totalDurationMs * pxPerMs + 120);\n const nowX = totalDurationMs * pxPerMs;\n\n const ticks = useMemo(\n () => generateTicks(origin, nowMs, pxPerMs, totalWidth),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [origin, Math.floor(nowMs / 2000), pxPerMs, totalWidth]\n );\n\n const scrollRef = useRef<HTMLDivElement>(null);\n\n // Scroll to keep the now-marker in view\n const scrollToNow = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const targetScroll = LABEL_WIDTH + nowX - el.clientWidth * 0.85;\n el.scrollLeft = Math.max(0, targetScroll);\n }, [nowX]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"relative overflow-hidden rounded-lg border border-sf-line bg-sf-base\",\n className\n )}\n {...props}\n >\n {/* Scrollable horizontal container */}\n <div ref={scrollRef} className=\"overflow-x-auto\">\n <div style={{ minWidth: LABEL_WIDTH + totalWidth }}>\n {/* Time axis */}\n <div\n className=\"flex border-b border-sf-line\"\n style={{ height: TIME_AXIS_HEIGHT }}\n >\n {/* Label column spacer */}\n <div\n className=\"shrink-0 border-r border-sf-line bg-sf-elevated px-3\"\n style={{ width: LABEL_WIDTH }}\n >\n <span className=\"text-[10px] font-medium uppercase tracking-wider text-sf-subtle\">\n Time\n </span>\n </div>\n {/* Axis ticks */}\n <div\n className=\"relative flex-1 bg-sf-recessed\"\n style={{ minWidth: totalWidth }}\n >\n {ticks.map((tick) => (\n <div\n key={tick.x}\n className=\"absolute top-0 flex flex-col items-center\"\n style={{ left: tick.x }}\n >\n <div className=\"h-2 w-px bg-sf-line\" />\n <span className=\"mt-0.5 font-mono text-[9px] text-sf-inactive\">\n +{tick.label}\n </span>\n </div>\n ))}\n\n {/* Now marker line */}\n {showNowMarker && (\n <div\n className=\"absolute top-0 flex flex-col items-center\"\n style={{ left: nowX }}\n >\n <div className=\"h-2 w-px bg-sf-brand\" />\n <span className=\"mt-0.5 font-mono text-[9px] font-medium text-sf-brand\">\n now\n </span>\n </div>\n )}\n </div>\n </div>\n\n {/* Lanes — pass timeOrigin/nowMs/pxPerMs via context-like clone or expect them as props */}\n <div className=\"relative\">\n {/* Vertical grid lines at tick positions */}\n <div className=\"pointer-events-none absolute inset-0 ml-[128px]\">\n {ticks.map((tick) => (\n <div\n key={`grid-${tick.x}`}\n className=\"absolute top-0 h-full w-px bg-sf-line/50\"\n style={{ left: tick.x }}\n />\n ))}\n {/* Now marker vertical line */}\n {showNowMarker && (\n <div\n className=\"absolute top-0 h-full w-px bg-sf-brand/30\"\n style={{ left: nowX }}\n />\n )}\n </div>\n\n {children}\n </div>\n </div>\n </div>\n\n {/* Scroll-to-now button */}\n {showNowMarker && (\n <button\n type=\"button\"\n aria-label=\"Scroll to now\"\n onClick={scrollToNow}\n className={cn(\n \"absolute right-2 top-1 rounded px-1.5 py-0.5 text-[9px] font-medium\",\n \"bg-sf-brand/10 text-sf-brand hover:bg-sf-brand/20 transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sf-ring\"\n )}\n >\n → now\n </button>\n )}\n </div>\n );\n }\n);\n\nAiTimeline.displayName = \"AiTimeline\";\n"],"mappings":"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"}
|