@signalflare-ai/ui 1.1.0 → 1.3.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 +102 -5
- package/README.md +1 -1
- package/ai/component-registry.json +531 -79
- package/ai/component-registry.md +4067 -6
- package/ai/schemas.ts +6 -1
- package/dist/.build-complete +1 -1
- package/dist/ai/schemas.d.ts +76 -58
- package/dist/ai/schemas.d.ts.map +1 -1
- package/dist/{ai-actions-DSVeQn4e.js → ai-actions-CBfz5XEf.js} +4 -4
- package/dist/{ai-actions-DSVeQn4e.js.map → ai-actions-CBfz5XEf.js.map} +1 -1
- package/dist/{ai-agent-card-BXHwhWAU.js → ai-agent-card-CByAUe0q.js} +3 -3
- package/dist/ai-agent-card-CByAUe0q.js.map +1 -0
- package/dist/{ai-approval-aa0qvjFN.js → ai-approval-Ci8N70a7.js} +4 -3
- package/dist/{ai-approval-aa0qvjFN.js.map → ai-approval-Ci8N70a7.js.map} +1 -1
- package/dist/{ai-code-block-BgtIxtZZ.js → ai-code-block-P9TJHvaC.js} +37 -39
- package/dist/ai-code-block-P9TJHvaC.js.map +1 -0
- package/dist/ai-conversation-Qslfdi1t.js +228 -0
- package/dist/ai-conversation-Qslfdi1t.js.map +1 -0
- package/dist/{ai-info-banner-uFxHHwBA.js → ai-info-banner-B_9vtGK3.js} +8 -4
- package/dist/ai-info-banner-B_9vtGK3.js.map +1 -0
- package/dist/{ai-message-BjnFznXy.js → ai-message-Ci3gwM7G.js} +29 -10
- package/dist/ai-message-Ci3gwM7G.js.map +1 -0
- package/dist/{ai-mission-header-08__gULL.js → ai-mission-header-CaBc19-t.js} +2 -2
- package/dist/{ai-mission-header-08__gULL.js.map → ai-mission-header-CaBc19-t.js.map} +1 -1
- package/dist/{ai-part-group-DBtgTgAn.js → ai-part-group-Dx1Mr92B.js} +5 -4
- package/dist/ai-part-group-Dx1Mr92B.js.map +1 -0
- package/dist/{ai-prompt-input-CuluUzpf.js → ai-prompt-input-Bm4XoSj2.js} +44 -55
- package/dist/ai-prompt-input-Bm4XoSj2.js.map +1 -0
- package/dist/{ai-question-CHHoDJMg.js → ai-question-OyJovxGe.js} +4 -3
- package/dist/{ai-question-CHHoDJMg.js.map → ai-question-OyJovxGe.js.map} +1 -1
- package/dist/{ai-reasoning-CnL6ZSr5.js → ai-reasoning-BLfBXx3F.js} +9 -5
- package/dist/ai-reasoning-BLfBXx3F.js.map +1 -0
- package/dist/{ai-response-BEUg3xvd.js → ai-response-hbVCZJmo.js} +9 -4
- package/dist/ai-response-hbVCZJmo.js.map +1 -0
- package/dist/{ai-shimmer-By5_L05p.js → ai-shimmer-BamNMNK3.js} +2 -2
- package/dist/{ai-shimmer-By5_L05p.js.map → ai-shimmer-BamNMNK3.js.map} +1 -1
- package/dist/{ai-status-badge-BGYGWYF6.js → ai-status-badge-BZLczdkI.js} +2 -2
- package/dist/{ai-status-badge-BGYGWYF6.js.map → ai-status-badge-BZLczdkI.js.map} +1 -1
- package/dist/{ai-streaming-text-CMfoThV0.js → ai-streaming-text-DgYu64UH.js} +44 -16
- package/dist/ai-streaming-text-DgYu64UH.js.map +1 -0
- package/dist/{ai-subagent-DcPRqkAA.js → ai-subagent-p97AI1h9.js} +14 -6
- package/dist/ai-subagent-p97AI1h9.js.map +1 -0
- package/dist/{ai-suggestion-MgeCg5Ar.js → ai-suggestion-Bj6vF7CT.js} +3 -3
- package/dist/{ai-suggestion-MgeCg5Ar.js.map → ai-suggestion-Bj6vF7CT.js.map} +1 -1
- package/dist/{ai-task-list-Da9zIm00.js → ai-task-list-C_UQYpk9.js} +15 -6
- package/dist/ai-task-list-C_UQYpk9.js.map +1 -0
- package/dist/{ai-timeline-Cwu045IR.js → ai-timeline-CePL1LOU.js} +3 -3
- package/dist/ai-timeline-CePL1LOU.js.map +1 -0
- package/dist/{ai-tool-Cn1O4xjP.js → ai-tool-CfRcwmHT.js} +35 -16
- package/dist/ai-tool-CfRcwmHT.js.map +1 -0
- package/dist/{ai-usage-bar-DjS12DMp.js → ai-usage-bar-45pVRCGA.js} +2 -2
- package/dist/{ai-usage-bar-DjS12DMp.js.map → ai-usage-bar-45pVRCGA.js.map} +1 -1
- package/dist/{badge-D_eaA6wv.js → badge-Beb-6uut.js} +5 -5
- package/dist/{badge-D_eaA6wv.js.map → badge-Beb-6uut.js.map} +1 -1
- package/dist/{banner-B_6oBrsu.js → banner-CCEksxPg.js} +8 -3
- package/dist/banner-CCEksxPg.js.map +1 -0
- package/dist/{breadcrumbs-BlmeYfgq.js → breadcrumbs-HiTmgaZ4.js} +5 -5
- package/dist/{breadcrumbs-BlmeYfgq.js.map → breadcrumbs-HiTmgaZ4.js.map} +1 -1
- package/dist/{button-De0267YU.js → button-BHOgXJRU.js} +4 -4
- package/dist/{button-De0267YU.js.map → button-BHOgXJRU.js.map} +1 -1
- package/dist/catalog.js +1 -1
- package/dist/catalog.js.map +1 -1
- package/dist/{chart-BK3sVPnD.js → chart-B9FfZdKs.js} +7 -7
- package/dist/chart-B9FfZdKs.js.map +1 -0
- package/dist/{checkbox-DYhUmZNw.js → checkbox-Cy_OCyay.js} +3 -3
- package/dist/{checkbox-DYhUmZNw.js.map → checkbox-Cy_OCyay.js.map} +1 -1
- package/dist/{clipboard-text-ssybngLw.js → clipboard-text-CKSvNp9L.js} +6 -5
- package/dist/clipboard-text-CKSvNp9L.js.map +1 -0
- package/dist/{cn-YROP2_ox.js → cn-CmAOpn49.js} +2 -2
- package/dist/{cn-YROP2_ox.js.map → cn-CmAOpn49.js.map} +1 -1
- package/dist/{code-Cx-QSoOT.js → code-JsQz-0G_.js} +4 -4
- package/dist/{code-Cx-QSoOT.js.map → code-JsQz-0G_.js.map} +1 -1
- package/dist/{collapsible-DWsXeXmS.js → collapsible-1kOZ-89L.js} +2 -2
- package/dist/{collapsible-DWsXeXmS.js.map → collapsible-1kOZ-89L.js.map} +1 -1
- package/dist/{combobox-C0iW6a0r.js → combobox-CQwDmqgA.js} +4 -4
- package/dist/{combobox-C0iW6a0r.js.map → combobox-CQwDmqgA.js.map} +1 -1
- package/dist/command-line/cli.js +3 -3
- package/dist/{command-palette-DGzioeki.js → command-palette-Bkuv3e6o.js} +20 -5
- package/dist/command-palette-Bkuv3e6o.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 +2 -2
- 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 +1 -1
- package/dist/components/ai-prompt-input.js +1 -1
- 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 +2 -2
- 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/badge.js +1 -1
- package/dist/components/banner.js +1 -1
- package/dist/components/breadcrumbs.js +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/chart.js +2 -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/collapsible.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/date-range-picker.js +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/empty.js +1 -1
- package/dist/components/field.js +1 -1
- package/dist/components/filters.js +1 -1
- package/dist/components/flow.js +1 -1
- package/dist/components/grid.js +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/label.js +1 -1
- package/dist/components/layer-card.js +1 -1
- package/dist/components/link.js +3 -3
- package/dist/components/link.js.map +1 -1
- package/dist/components/loader.js +2 -2
- package/dist/components/menubar.js +1 -1
- package/dist/components/meter.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/popover.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/signalflare-ai-logo.js +1 -1
- package/dist/components/sparkline.js +1 -1
- package/dist/components/stat-card.js +1 -1
- package/dist/components/surface.js +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/text-roll.js +1 -1
- package/dist/components/text.js +1 -1
- package/dist/components/theme-toggle.js +1 -1
- package/dist/components/toast.js +1 -1
- package/dist/components/tooltip.js +1 -1
- package/dist/components/use-agent-harness.js +1 -1
- package/dist/{data-grid-CG76N_hK.js → data-grid-DDSFMHud.js} +136 -53
- package/dist/data-grid-DDSFMHud.js.map +1 -0
- package/dist/{date-picker-Dqg9L4xu.js → date-picker-O34AqG3f.js} +2 -2
- package/dist/{date-picker-Dqg9L4xu.js.map → date-picker-O34AqG3f.js.map} +1 -1
- package/dist/{date-range-picker-D75LLINc.js → date-range-picker-YKYvum_r.js} +29 -39
- package/dist/{date-range-picker-D75LLINc.js.map → date-range-picker-YKYvum_r.js.map} +1 -1
- package/dist/{dialog-CyHEQXEY.js → dialog-DYqu4aDO.js} +3 -3
- package/dist/{dialog-CyHEQXEY.js.map → dialog-DYqu4aDO.js.map} +1 -1
- package/dist/{dist-1-gcEL2L.js → dist-6AtBsaJE.js} +153 -47
- package/dist/dist-6AtBsaJE.js.map +1 -0
- package/dist/{dropdown-qnEYRFXZ.js → dropdown-XzbnRLYR.js} +15 -5
- package/dist/dropdown-XzbnRLYR.js.map +1 -0
- package/dist/{echart-DURZEyai.js → echart-DGBIVAv1.js} +23 -57
- package/dist/{echart-DURZEyai.js.map → echart-DGBIVAv1.js.map} +1 -1
- package/dist/{empty-D2TypIId.js → empty-C1tAkawe.js} +12 -7
- package/dist/empty-C1tAkawe.js.map +1 -0
- package/dist/{field-Y_UK1_Cg.js → field-DBpFzzBS.js} +3 -3
- package/dist/{field-Y_UK1_Cg.js.map → field-DBpFzzBS.js.map} +1 -1
- package/dist/{filters-Bw_U6ZTx.js → filters-SmEl93za.js} +10 -10
- package/dist/filters-SmEl93za.js.map +1 -0
- package/dist/{flow-BRsYUCJa.js → flow-BLzgbq1T.js} +6 -6
- package/dist/flow-BLzgbq1T.js.map +1 -0
- package/dist/genui.js +2 -2
- package/dist/genui.js.map +1 -1
- package/dist/{grid-qUAN9hFx.js → grid-CifjQL-5.js} +2 -2
- package/dist/{grid-qUAN9hFx.js.map → grid-CifjQL-5.js.map} +1 -1
- package/dist/{highlight-to-react-ClEfL81q.js → highlight-to-react-DN9dUCS2.js} +9 -15
- package/dist/highlight-to-react-DN9dUCS2.js.map +1 -0
- package/dist/index.js +72 -72
- package/dist/index.js.map +1 -1
- package/dist/{input-DddtBN-g.js → input-COmx2M_R.js} +5 -5
- package/dist/{input-DddtBN-g.js.map → input-COmx2M_R.js.map} +1 -1
- package/dist/{input-DXYUjGgD.js → input-GkfMQZC_.js} +3 -3
- package/dist/{input-DXYUjGgD.js.map → input-GkfMQZC_.js.map} +1 -1
- package/dist/{label-QtJxtJ4u.js → label-CiGZ464N.js} +3 -3
- package/dist/{label-QtJxtJ4u.js.map → label-CiGZ464N.js.map} +1 -1
- package/dist/{layer-card-BME0eljh.js → layer-card-8l8GuLQr.js} +2 -2
- package/dist/{layer-card-BME0eljh.js.map → layer-card-8l8GuLQr.js.map} +1 -1
- package/dist/layout-CWBE0qwx.js +6207 -0
- package/dist/layout-CWBE0qwx.js.map +1 -0
- package/dist/{link-provider-BUZKXaNE.js → link-provider-BSn8YJon.js} +2 -2
- package/dist/link-provider-BSn8YJon.js.map +1 -0
- package/dist/{loader-DAcc-Uag.js → loader-BEMz8pJO.js} +1 -1
- package/dist/{loader-DAcc-Uag.js.map → loader-BEMz8pJO.js.map} +1 -1
- package/dist/measured-text-CXkdw9Yr.js +305 -0
- package/dist/measured-text-CXkdw9Yr.js.map +1 -0
- package/dist/{menubar-C8NzAjfd.js → menubar-CoOr4ocj.js} +3 -3
- package/dist/{menubar-C8NzAjfd.js.map → menubar-CoOr4ocj.js.map} +1 -1
- package/dist/{meter-CpmTenEr.js → meter-Pf_VOl59.js} +2 -2
- package/dist/{meter-CpmTenEr.js.map → meter-Pf_VOl59.js.map} +1 -1
- package/dist/{pagination-BVqdlONY.js → pagination-DSY279Ta.js} +2 -2
- package/dist/{pagination-BVqdlONY.js.map → pagination-DSY279Ta.js.map} +1 -1
- package/dist/{popover-BRQZ2b6z.js → popover-BY-e9co1.js} +2 -2
- package/dist/{popover-BRQZ2b6z.js.map → popover-BY-e9co1.js.map} +1 -1
- package/dist/{radio-BNSwOt3B.js → radio-DZwL13j0.js} +2 -2
- package/dist/{radio-BNSwOt3B.js.map → radio-DZwL13j0.js.map} +1 -1
- package/dist/{select-1w2aebGQ.js → select-BFifYqHA.js} +6 -6
- package/dist/{select-1w2aebGQ.js.map → select-BFifYqHA.js.map} +1 -1
- package/dist/{sensitive-input-82Cez3vj.js → sensitive-input-DHLZcM73.js} +4 -4
- package/dist/{sensitive-input-82Cez3vj.js.map → sensitive-input-DHLZcM73.js.map} +1 -1
- package/dist/{sidebar-CAsCmSpM.js → sidebar-odGsdvG4.js} +6 -7
- package/dist/sidebar-odGsdvG4.js.map +1 -0
- package/dist/{signalflare-ai-logo-DDhxMJD6.js → signalflare-ai-logo-CNaDT_w8.js} +2 -2
- package/dist/{signalflare-ai-logo-DDhxMJD6.js.map → signalflare-ai-logo-CNaDT_w8.js.map} +1 -1
- package/dist/{skeleton-line-Do3UmGk9.js → skeleton-line-CxxYVTO2.js} +2 -2
- package/dist/{skeleton-line-Do3UmGk9.js.map → skeleton-line-CxxYVTO2.js.map} +1 -1
- package/dist/{sparkline-DdbeM4Ai.js → sparkline-BQ-4j2W2.js} +2 -2
- package/dist/{sparkline-DdbeM4Ai.js.map → sparkline-BQ-4j2W2.js.map} +1 -1
- package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -1
- package/dist/src/blocks/agent-harness/agent-harness.tsx +40 -16
- package/dist/src/blocks/commander/commander.tsx +15 -15
- package/dist/src/blocks/map-block/map-block.d.ts.map +1 -1
- package/dist/src/blocks/map-block/map-block.tsx +11 -7
- package/dist/src/components/ai-approval/ai-approval.d.ts.map +1 -1
- package/dist/src/components/ai-code-block/ai-code-block.d.ts +14 -13
- package/dist/src/components/ai-code-block/ai-code-block.d.ts.map +1 -1
- package/dist/src/components/ai-conversation/ai-conversation.d.ts +69 -37
- package/dist/src/components/ai-conversation/ai-conversation.d.ts.map +1 -1
- package/dist/src/components/ai-conversation/index.d.ts +2 -1
- package/dist/src/components/ai-conversation/index.d.ts.map +1 -1
- package/dist/src/components/ai-conversation/measurement-constants.d.ts +30 -0
- package/dist/src/components/ai-conversation/measurement-constants.d.ts.map +1 -0
- package/dist/src/components/ai-info-banner/ai-info-banner.d.ts.map +1 -1
- package/dist/src/components/ai-message/ai-message.d.ts +3 -0
- package/dist/src/components/ai-message/ai-message.d.ts.map +1 -1
- package/dist/src/components/ai-part-group/ai-part-group.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +13 -3
- 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.map +1 -1
- package/dist/src/components/ai-prompt-input/index.d.ts +1 -1
- package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/types.d.ts.map +1 -1
- package/dist/src/components/ai-question/ai-question.d.ts.map +1 -1
- package/dist/src/components/ai-reasoning/ai-reasoning.d.ts.map +1 -1
- package/dist/src/components/ai-response/ai-response.d.ts +12 -1
- package/dist/src/components/ai-response/ai-response.d.ts.map +1 -1
- 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 -1
- package/dist/src/components/ai-streaming-text/index.d.ts +1 -1
- package/dist/src/components/ai-streaming-text/index.d.ts.map +1 -1
- package/dist/src/components/ai-subagent/ai-subagent.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.map +1 -1
- package/dist/src/components/banner/banner.d.ts.map +1 -1
- package/dist/src/components/chart/echart.d.ts.map +1 -1
- package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -1
- package/dist/src/components/data-grid/data-grid.d.ts +2 -1
- package/dist/src/components/data-grid/data-grid.d.ts.map +1 -1
- package/dist/src/components/data-grid/features.d.ts +20 -0
- package/dist/src/components/data-grid/features.d.ts.map +1 -0
- package/dist/src/components/data-grid/types.d.ts +38 -7
- package/dist/src/components/data-grid/types.d.ts.map +1 -1
- package/dist/src/components/empty/empty.d.ts.map +1 -1
- package/dist/src/components/filters/filters.d.ts.map +1 -1
- package/dist/src/components/flow/use-children.d.ts +1 -1
- package/dist/src/components/link/link.d.ts.map +1 -1
- package/dist/src/components/sidebar/sidebar.d.ts +1 -1
- package/dist/src/components/signalflare-ai-logo/signalflare-ai-logo.d.ts.map +1 -1
- package/dist/src/components/stat-card/stat-card.d.ts +5 -0
- package/dist/src/components/stat-card/stat-card.d.ts.map +1 -1
- package/dist/src/components/text/text.d.ts +36 -1
- package/dist/src/components/text/text.d.ts.map +1 -1
- package/dist/src/components/text-roll/text-roll.d.ts.map +1 -1
- package/dist/src/components/theme-toggle/theme-toggle.d.ts.map +1 -1
- package/dist/src/components/toast/toast.d.ts.map +1 -1
- package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/utils/highlight-to-react.d.ts.map +1 -1
- package/dist/src/utils/index.d.ts +2 -0
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/measured-text.d.ts +40 -0
- package/dist/src/utils/measured-text.d.ts.map +1 -0
- package/dist/src/utils/use-measured-text.d.ts +59 -0
- package/dist/src/utils/use-measured-text.d.ts.map +1 -0
- package/dist/{stat-card-CEZscNh8.js → stat-card-Bspk4XFr.js} +30 -12
- package/dist/stat-card-Bspk4XFr.js.map +1 -0
- package/dist/styles/sf-binding.css +1 -1
- package/dist/styles/sf-standalone.css +2 -2
- package/dist/styles/shadcn.css +1 -1
- package/dist/styles/theme-minimal.css +9 -9
- package/dist/styles/theme-sf.css +14 -20
- package/dist/styles/theme-vesper.css +91 -0
- package/dist/{surface-BduI7Ehl.js → surface-CWdSFVUx.js} +3 -3
- package/dist/{surface-BduI7Ehl.js.map → surface-CWdSFVUx.js.map} +1 -1
- package/dist/{switch-CzZBRBL7.js → switch-TA4cByCJ.js} +5 -5
- package/dist/switch-TA4cByCJ.js.map +1 -0
- package/dist/{table-Rv4JMy0B.js → table-BM8JBGBs.js} +3 -3
- package/dist/{table-Rv4JMy0B.js.map → table-BM8JBGBs.js.map} +1 -1
- package/dist/{tabs-1cHrYoel.js → tabs-bnH2vGLv.js} +2 -2
- package/dist/{tabs-1cHrYoel.js.map → tabs-bnH2vGLv.js.map} +1 -1
- package/dist/{text-KJmGkwnf.js → text-iQ0YUFNg.js} +27 -6
- package/dist/text-iQ0YUFNg.js.map +1 -0
- package/dist/{text-roll-BZ3I1umc.js → text-roll-C3U2jd2u.js} +5 -2
- package/dist/text-roll-C3U2jd2u.js.map +1 -0
- package/dist/{theme-toggle-Bhu681D7.js → theme-toggle-BTVxD-fD.js} +10 -9
- package/dist/theme-toggle-BTVxD-fD.js.map +1 -0
- package/dist/{toast-Nw28a5Cx.js → toast-CgZVaAkw.js} +3 -3
- package/dist/{toast-Nw28a5Cx.js.map → toast-CgZVaAkw.js.map} +1 -1
- package/dist/{tooltip-Cb7QW-7H.js → tooltip-uobk6Oh-.js} +9 -3
- package/dist/tooltip-uobk6Oh-.js.map +1 -0
- package/dist/{use-agent-harness-BMyF8pTq.js → use-agent-harness-Dl8w6X5O.js} +3 -3
- package/dist/{use-agent-harness-BMyF8pTq.js.map → use-agent-harness-Dl8w6X5O.js.map} +1 -1
- package/dist/utils.js +4 -3
- package/package.json +27 -24
- package/scripts/component-registry/discovery.ts +11 -10
- package/scripts/component-registry/example-cleanup.ts +8 -8
- package/scripts/component-registry/index.ts +6 -6
- package/scripts/component-registry/schema-generator.ts +1 -1
- package/scripts/component-registry/sub-components.ts +35 -23
- package/scripts/component-registry/utils.ts +11 -11
- package/scripts/component-registry/variant-parser.ts +17 -15
- package/scripts/convert-demos-to-stories.ts +5 -5
- package/scripts/css-build.ts +1 -1
- package/scripts/theme-generator/config.ts +28 -146
- package/scripts/theme-generator/generate-css.ts +1 -2
- package/scripts/theme-generator/index.ts +0 -1
- package/scripts/theme-generator/migrate.ts +3 -3
- package/dist/ai-agent-card-BXHwhWAU.js.map +0 -1
- package/dist/ai-code-block-BgtIxtZZ.js.map +0 -1
- package/dist/ai-conversation-CArP7C8K.js +0 -184
- package/dist/ai-conversation-CArP7C8K.js.map +0 -1
- package/dist/ai-info-banner-uFxHHwBA.js.map +0 -1
- package/dist/ai-message-BjnFznXy.js.map +0 -1
- package/dist/ai-part-group-DBtgTgAn.js.map +0 -1
- package/dist/ai-prompt-input-CuluUzpf.js.map +0 -1
- package/dist/ai-reasoning-CnL6ZSr5.js.map +0 -1
- package/dist/ai-response-BEUg3xvd.js.map +0 -1
- package/dist/ai-streaming-text-CMfoThV0.js.map +0 -1
- package/dist/ai-subagent-DcPRqkAA.js.map +0 -1
- package/dist/ai-task-list-Da9zIm00.js.map +0 -1
- package/dist/ai-timeline-Cwu045IR.js.map +0 -1
- package/dist/ai-tool-Cn1O4xjP.js.map +0 -1
- package/dist/banner-B_6oBrsu.js.map +0 -1
- package/dist/chart-BK3sVPnD.js.map +0 -1
- package/dist/clipboard-text-ssybngLw.js.map +0 -1
- package/dist/command-palette-DGzioeki.js.map +0 -1
- package/dist/data-grid-CG76N_hK.js.map +0 -1
- package/dist/dist-1-gcEL2L.js.map +0 -1
- package/dist/dropdown-qnEYRFXZ.js.map +0 -1
- package/dist/empty-D2TypIId.js.map +0 -1
- package/dist/filters-Bw_U6ZTx.js.map +0 -1
- package/dist/flow-BRsYUCJa.js.map +0 -1
- package/dist/highlight-to-react-ClEfL81q.js.map +0 -1
- package/dist/link-provider-BUZKXaNE.js.map +0 -1
- package/dist/sidebar-CAsCmSpM.js.map +0 -1
- package/dist/stat-card-CEZscNh8.js.map +0 -1
- package/dist/styles/theme-blue-tint.css +0 -98
- package/dist/switch-CzZBRBL7.js.map +0 -1
- package/dist/text-KJmGkwnf.js.map +0 -1
- package/dist/text-roll-BZ3I1umc.js.map +0 -1
- package/dist/theme-toggle-Bhu681D7.js.map +0 -1
- package/dist/tooltip-Cb7QW-7H.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as cn } from "./cn-
|
|
3
|
-
import { t as Tooltip } from "./tooltip-
|
|
4
|
-
import { t as Button } from "./button-
|
|
2
|
+
import { t as cn } from "./cn-CmAOpn49.js";
|
|
3
|
+
import { t as Tooltip } from "./tooltip-uobk6Oh-.js";
|
|
4
|
+
import { t as Button } from "./button-BHOgXJRU.js";
|
|
5
5
|
import { useEffect, useState } from "react";
|
|
6
6
|
import { jsx } from "react/jsx-runtime";
|
|
7
7
|
import { MoonIcon, SunIcon } from "@phosphor-icons/react";
|
|
@@ -22,6 +22,11 @@ var SF_THEME_TOGGLE_VARIANTS = { mode: {
|
|
|
22
22
|
} };
|
|
23
23
|
var SF_THEME_TOGGLE_DEFAULT_VARIANTS = { mode: "system" };
|
|
24
24
|
var STORAGE_KEY = "theme";
|
|
25
|
+
var DEFAULT_CYCLE = [
|
|
26
|
+
"light",
|
|
27
|
+
"dark",
|
|
28
|
+
"system"
|
|
29
|
+
];
|
|
25
30
|
function getSystemTheme() {
|
|
26
31
|
if (typeof window === "undefined") return "light";
|
|
27
32
|
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
@@ -65,11 +70,7 @@ function getStoredThemeMode() {
|
|
|
65
70
|
* <ThemeToggle cycle={["light", "dark"]} />
|
|
66
71
|
* ```
|
|
67
72
|
*/
|
|
68
|
-
function ThemeToggle({ className, mode: controlledMode, onModeChange, cycle =
|
|
69
|
-
"light",
|
|
70
|
-
"dark",
|
|
71
|
-
"system"
|
|
72
|
-
], tooltip = true }) {
|
|
73
|
+
function ThemeToggle({ className, mode: controlledMode, onModeChange, cycle = DEFAULT_CYCLE, tooltip = true }) {
|
|
73
74
|
const isControlled = controlledMode !== void 0;
|
|
74
75
|
const [internalMode, setInternalMode] = useState("system");
|
|
75
76
|
const [mounted, setMounted] = useState(false);
|
|
@@ -126,4 +127,4 @@ function ThemeToggle({ className, mode: controlledMode, onModeChange, cycle = [
|
|
|
126
127
|
//#endregion
|
|
127
128
|
export { getStoredThemeMode as i, SF_THEME_TOGGLE_VARIANTS as n, ThemeToggle as r, SF_THEME_TOGGLE_DEFAULT_VARIANTS as t };
|
|
128
129
|
|
|
129
|
-
//# sourceMappingURL=theme-toggle-
|
|
130
|
+
//# sourceMappingURL=theme-toggle-BTVxD-fD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-toggle-BTVxD-fD.js","names":[],"sources":["../src/components/theme-toggle/theme-toggle.tsx"],"sourcesContent":["\"use client\";\n\nimport { MoonIcon, SunIcon } from \"@phosphor-icons/react\";\nimport { useEffect, useState } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../button\";\nimport { Tooltip } from \"../tooltip\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type SFThemeMode = \"light\" | \"dark\" | \"system\";\n\nexport const SF_THEME_TOGGLE_VARIANTS = {\n mode: {\n light: { classes: \"\", description: \"Light mode\" },\n dark: { classes: \"\", description: \"Dark mode\" },\n system: { classes: \"\", description: \"Follow system preference\" },\n },\n} as const;\n\nexport const SF_THEME_TOGGLE_DEFAULT_VARIANTS = {\n mode: \"system\",\n} as const;\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst STORAGE_KEY = \"theme\";\nconst DEFAULT_CYCLE: SFThemeMode[] = [\"light\", \"dark\", \"system\"];\n\nfunction getSystemTheme(): \"light\" | \"dark\" {\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\nfunction resolveMode(mode: SFThemeMode): \"light\" | \"dark\" {\n return mode === \"system\" ? getSystemTheme() : mode;\n}\n\nfunction applyTheme(mode: SFThemeMode) {\n const resolved = resolveMode(mode);\n document.documentElement.dataset.mode = resolved;\n if (mode === \"system\") {\n localStorage.removeItem(STORAGE_KEY);\n } else {\n localStorage.setItem(STORAGE_KEY, mode);\n }\n}\n\n/**\n * Read the current persisted mode preference from localStorage.\n * Returns \"system\" if nothing is stored.\n */\nexport function getStoredThemeMode(): SFThemeMode {\n if (typeof window === \"undefined\") return \"system\";\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored === \"light\" || stored === \"dark\") return stored;\n return \"system\";\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport interface ThemeToggleProps {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /**\n * Controlled mode. When provided the component acts as a controlled input —\n * pair with `onModeChange`.\n */\n mode?: SFThemeMode;\n /**\n * Called when the user cycles to a new mode.\n * Receives the new mode value.\n */\n onModeChange?: (mode: SFThemeMode) => void;\n /**\n * Cycle order for clicking. Defaults to `[\"light\", \"dark\", \"system\"]`.\n * Remove `\"system\"` to limit to a simple light/dark toggle.\n */\n cycle?: SFThemeMode[];\n /** Show a tooltip labelling the current action. Defaults to true. */\n tooltip?: boolean;\n}\n\n/**\n * Theme toggle button. Cycles through light → dark → system (follows OS) modes.\n *\n * Reads from and writes to `localStorage` under the key `\"theme\"`. When set to\n * `\"system\"` the key is removed so the OS preference takes over automatically.\n * Applies the resolved mode to `document.documentElement.dataset.mode`.\n *\n * @example\n * ```tsx\n * // Simple uncontrolled — manages localStorage automatically\n * <ThemeToggle />\n *\n * // Controlled\n * const [mode, setMode] = useState<SFThemeMode>(\"system\");\n * <ThemeToggle mode={mode} onModeChange={setMode} />\n *\n * // Light/dark only (no system option)\n * <ThemeToggle cycle={[\"light\", \"dark\"]} />\n * ```\n */\nexport function ThemeToggle({\n className,\n mode: controlledMode,\n onModeChange,\n cycle = DEFAULT_CYCLE,\n tooltip = true,\n}: ThemeToggleProps) {\n const isControlled = controlledMode !== undefined;\n\n const [internalMode, setInternalMode] = useState<SFThemeMode>(\"system\");\n const [mounted, setMounted] = useState(false);\n\n // Hydrate from localStorage on mount\n useEffect(() => {\n setMounted(true);\n if (!isControlled) {\n setInternalMode(getStoredThemeMode());\n }\n }, [isControlled]);\n\n // Keep in sync if system preference changes while in \"system\" mode\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const activeMode = isControlled ? controlledMode : internalMode;\n if (activeMode !== \"system\") return;\n\n const handler = () => applyTheme(\"system\");\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, [isControlled, controlledMode, internalMode]);\n\n const activeMode = isControlled ? (controlledMode ?? \"system\") : internalMode;\n const resolvedActive = resolveMode(activeMode);\n\n const handleClick = () => {\n const idx = cycle.indexOf(activeMode);\n const next = cycle[(idx + 1) % cycle.length] ?? cycle[0] ?? \"system\";\n applyTheme(next);\n if (!isControlled) setInternalMode(next);\n onModeChange?.(next);\n };\n\n const tooltipLabel =\n activeMode === \"light\"\n ? \"Switch to dark mode\"\n : activeMode === \"dark\"\n ? \"Use system theme\"\n : \"Switch to light mode\";\n\n // SSR / pre-mount: render a stable placeholder to avoid hydration mismatch\n if (!mounted) {\n return (\n <Button\n aria-label=\"Toggle theme\"\n className={cn(\"text-sf-subtle\", className)}\n shape=\"square\"\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <SunIcon className=\"size-4\" />\n </Button>\n );\n }\n\n const button = (\n <Button\n aria-label={tooltipLabel}\n className={cn(\"text-sf-subtle hover:text-sf-default\", className)}\n onClick={handleClick}\n shape=\"square\"\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n {resolvedActive === \"dark\" ? (\n <MoonIcon className=\"size-4\" />\n ) : (\n <SunIcon className=\"size-4\" />\n )}\n </Button>\n );\n\n if (!tooltip) return button;\n\n return <Tooltip content={tooltipLabel}>{button}</Tooltip>;\n}\n"],"mappings":";;;;;;;;AAaA,IAAa,2BAA2B,EACtC,MAAM;CACJ,OAAO;EAAE,SAAS;EAAI,aAAa;CAAa;CAChD,MAAM;EAAE,SAAS;EAAI,aAAa;CAAY;CAC9C,QAAQ;EAAE,SAAS;EAAI,aAAa;CAA2B;AACjE,EACF;AAEA,IAAa,mCAAmC,EAC9C,MAAM,SACR;AAIA,IAAM,cAAc;AACpB,IAAM,gBAA+B;CAAC;CAAS;CAAQ;AAAQ;AAE/D,SAAS,iBAAmC;CAC1C,IAAI,OAAO,WAAW,aAAa,OAAO;CAC1C,OAAO,OAAO,WAAW,8BAA8B,EAAE,UACrD,SACA;AACN;AAEA,SAAS,YAAY,MAAqC;CACxD,OAAO,SAAS,WAAW,eAAe,IAAI;AAChD;AAEA,SAAS,WAAW,MAAmB;CACrC,MAAM,WAAW,YAAY,IAAI;CACjC,SAAS,gBAAgB,QAAQ,OAAO;CACxC,IAAI,SAAS,UACX,aAAa,WAAW,WAAW;MAEnC,aAAa,QAAQ,aAAa,IAAI;AAE1C;;;;;AAMA,SAAgB,qBAAkC;CAChD,IAAI,OAAO,WAAW,aAAa,OAAO;CAC1C,MAAM,SAAS,aAAa,QAAQ,WAAW;CAC/C,IAAI,WAAW,WAAW,WAAW,QAAQ,OAAO;CACpD,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;AA8CA,SAAgB,YAAY,EAC1B,WACA,MAAM,gBACN,cACA,QAAQ,eACR,UAAU,QACS;CACnB,MAAM,eAAe,mBAAmB,KAAA;CAExC,MAAM,CAAC,cAAc,mBAAmB,SAAsB,QAAQ;CACtE,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAG5C,gBAAgB;EACd,WAAW,IAAI;EACf,IAAI,CAAC,cACH,gBAAgB,mBAAmB,CAAC;CAExC,GAAG,CAAC,YAAY,CAAC;CAGjB,gBAAgB;EACd,IAAI,OAAO,WAAW,aAAa;EACnC,MAAM,KAAK,OAAO,WAAW,8BAA8B;EAE3D,KADmB,eAAe,iBAAiB,kBAChC,UAAU;EAE7B,MAAM,gBAAgB,WAAW,QAAQ;EACzC,GAAG,iBAAiB,UAAU,OAAO;EACrC,aAAa,GAAG,oBAAoB,UAAU,OAAO;CACvD,GAAG;EAAC;EAAc;EAAgB;CAAY,CAAC;CAE/C,MAAM,aAAa,eAAgB,kBAAkB,WAAY;CACjE,MAAM,iBAAiB,YAAY,UAAU;CAE7C,MAAM,oBAAoB;EAExB,MAAM,OAAO,OADD,MAAM,QAAQ,UACN,IAAM,KAAK,MAAM,WAAW,MAAM,MAAM;EAC5D,WAAW,IAAI;EACf,IAAI,CAAC,cAAc,gBAAgB,IAAI;EACvC,eAAe,IAAI;CACrB;CAEA,MAAM,eACJ,eAAe,UACX,wBACA,eAAe,SACb,qBACA;CAGR,IAAI,CAAC,SACH,OACE,oBAAC,QAAD;EACE,cAAW;EACX,WAAW,GAAG,kBAAkB,SAAS;EACzC,OAAM;EACN,MAAK;EACL,MAAK;EACL,SAAQ;YAER,oBAAC,SAAD,EAAS,WAAU,SAAU,CAAA;CACvB,CAAA;CAIZ,MAAM,SACJ,oBAAC,QAAD;EACE,cAAY;EACZ,WAAW,GAAG,wCAAwC,SAAS;EAC/D,SAAS;EACT,OAAM;EACN,MAAK;EACL,MAAK;EACL,SAAQ;YAEP,mBAAmB,SAClB,oBAAC,UAAD,EAAU,WAAU,SAAU,CAAA,IAE9B,oBAAC,SAAD,EAAS,WAAU,SAAU,CAAA;CAEzB,CAAA;CAGV,IAAI,CAAC,SAAS,OAAO;CAErB,OAAO,oBAAC,SAAD;EAAS,SAAS;YAAe;CAAgB,CAAA;AAC1D"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as cn } from "./cn-
|
|
3
|
-
import { t as Button } from "./button-
|
|
2
|
+
import { t as cn } from "./cn-CmAOpn49.js";
|
|
3
|
+
import { t as Button } from "./button-BHOgXJRU.js";
|
|
4
4
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
5
|
import { Toast, Toast as Toast$1 } from "@base-ui/react/toast";
|
|
6
6
|
import { WarningIcon, WarningOctagonIcon } from "@phosphor-icons/react/dist/ssr";
|
|
@@ -158,4 +158,4 @@ function XIcon(props) {
|
|
|
158
158
|
//#endregion
|
|
159
159
|
export { useSFToastManager as a, createSFToastManager as i, ToastProvider as n, Toasty as r, Toast$1 as t };
|
|
160
160
|
|
|
161
|
-
//# sourceMappingURL=toast-
|
|
161
|
+
//# sourceMappingURL=toast-CgZVaAkw.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast-Nw28a5Cx.js","names":[],"sources":["../src/components/toast/toast.tsx"],"sourcesContent":["import {\n Toast,\n ToastManagerAddOptions,\n ToastObject,\n} from \"@base-ui/react/toast\";\nimport {\n WarningIcon,\n WarningOctagonIcon,\n} from \"@phosphor-icons/react/dist/ssr\";\nimport type React from \"react\";\n\nimport { Button, ButtonProps } from \"../../components/button\";\nimport { cn } from \"../../utils/cn\";\n\n/**\n * Toast styling configuration for Figma plugin consumption.\n * Toast has no user-facing variants but documents the styling structure.\n */\nexport const SF_TOAST_VARIANTS = {\n root: {\n classes:\n \"rounded-lg border border-sf-fill bg-sf-control p-4 shadow-lg text-sf-default\",\n description: \"Toast container with background, border, and shadow\",\n },\n title: {\n classes: \"text-[0.975rem] leading-5 font-medium text-sf-default\",\n description: \"Toast title with primary text color\",\n },\n description: {\n classes: \"text-[0.925rem] leading-5 text-sf-subtle\",\n description: \"Toast description with muted text color\",\n },\n close: {\n classes:\n \"absolute top-2 right-2 flex h-5 w-5 items-center justify-center rounded border-none bg-transparent text-sf-subtle hover:bg-sf-fill-hover hover:text-sf-strong\",\n description: \"Close button with X icon\",\n },\n variant: {\n default: {\n classes: \"border-sf-fill bg-sf-control\",\n description: \"Default toast style\",\n },\n error: {\n classes:\n \"border-sf-fill bg-sf-control [&_[data-toast-icon]]:text-[light-dark(var(--color-red-600),var(--color-red-400))] [&_[data-toast-title]]:text-[light-dark(var(--color-red-600),var(--color-red-400))]\",\n description: \"Error toast for critical issues\",\n icon: WarningOctagonIcon,\n },\n warning: {\n classes:\n \"border-sf-fill bg-sf-control [&_[data-toast-icon]]:text-[light-dark(var(--color-amber-700),var(--color-amber-500))] [&_[data-toast-title]]:text-[light-dark(var(--color-amber-700),var(--color-amber-500))]\",\n description: \"Warning toast for cautionary messages\",\n icon: WarningIcon,\n },\n },\n} as const;\n\nexport const SF_TOAST_DEFAULT_VARIANTS = {\n variant: \"default\",\n} as const;\n\n/**\n * Toast styling configuration for Figma plugin consumption.\n * Provides structured metadata for generating Toast components in Figma.\n */\nexport const SF_TOAST_STYLING = {\n container: {\n width: 300,\n padding: 16,\n borderRadius: 8,\n background: \"color-secondary\",\n border: \"color-color\",\n shadow: \"shadow-lg\",\n gap: 4,\n },\n title: {\n fontSize: 16,\n fontWeight: 500,\n color: \"text-color-surface\",\n },\n description: {\n fontSize: 15,\n fontWeight: 400,\n color: \"text-color-muted\",\n },\n closeButton: {\n size: 20,\n iconSize: 16,\n iconName: \"ph-x\",\n iconColor: \"text-color-muted\",\n hoverBackground: \"color-color-2\",\n hoverColor: \"text-color-label\",\n borderRadius: 4,\n },\n} as const;\n\n// Derived types from SF_TOAST_VARIANTS\nexport type SFToastVariant = keyof typeof SF_TOAST_VARIANTS.variant;\n\nexport interface SFToastVariantsProps {\n variant?: SFToastVariant;\n}\n\nexport function toastVariants({\n variant = SF_TOAST_DEFAULT_VARIANTS.variant,\n}: SFToastVariantsProps = {}) {\n return cn(\n // Base styles for toast root\n \"rounded-xl border bg-clip-padding p-4 shadow-lg\",\n // Apply variant styles from SF_TOAST_VARIANTS\n SF_TOAST_VARIANTS.variant[variant].classes\n );\n}\n\n/**\n * Toasty component props.\n *\n * Wrap your app with `<Toasty>` to enable toast notifications.\n * Use `Toast.useToastManager().notify(…)` to create toasts.\n *\n * @example\n * ```tsx\n * // 1. Wrap your app\n * <Toasty>\n * <App />\n * </Toasty>\n *\n * // 2. Show a toast from any child component\n * const toasts = Toast.useToastManager();\n * toasts.notify({ title: \"Saved\", description: \"Changes saved successfully.\" });\n * ```\n */\nexport interface ToastyProps extends SFToastVariantsProps {\n /** Application content. Toasts render via a portal above this. */\n children: React.ReactNode;\n}\n\ntype SFToastOptionsBase = {\n variant?: SFToastVariant;\n content?: React.ReactNode;\n actions?: Array<ButtonProps>;\n};\n\nexport type SFToastOptions<Data extends object> = ToastObject<Data> &\n SFToastOptionsBase;\n\nexport type SFToastManagerAddOptions<Data extends object> =\n ToastManagerAddOptions<Data> & SFToastOptionsBase;\n\nfunction wrapManagerMethods<\n T extends { add: Function; update: Function; promise: Function },\n>(manager: T) {\n return {\n ...manager,\n\n add: (options: SFToastManagerAddOptions<any>) => {\n return manager.add({\n ...options,\n });\n },\n\n update: (id: string, options: Partial<SFToastManagerAddOptions<any>>) => {\n return manager.update(id, {\n ...options,\n });\n },\n\n promise: <T,>(\n promise: Promise<T>,\n options: {\n loading: SFToastManagerAddOptions<any>;\n success:\n | SFToastManagerAddOptions<any>\n | ((data: T) => SFToastManagerAddOptions<any>);\n error:\n | SFToastManagerAddOptions<any>\n | ((error: Error) => SFToastManagerAddOptions<any>);\n }\n ) => {\n return manager.promise(promise, {\n loading: { ...options.loading },\n success:\n typeof options.success === \"function\"\n ? (data: T) => ({\n ...(\n options.success as (data: T) => SFToastManagerAddOptions<any>\n )(data),\n })\n : { ...options.success },\n error:\n typeof options.error === \"function\"\n ? (error: Error) => ({\n ...(\n options.error as (\n error: Error\n ) => SFToastManagerAddOptions<any>\n )(error),\n })\n : { ...options.error },\n });\n },\n };\n}\n\nexport const useSFToastManager = () => {\n const manager = Toast.useToastManager();\n return {\n ...wrapManagerMethods(manager),\n toasts: manager.toasts as Array<SFToastOptions<any>>,\n };\n};\n\nexport const createSFToastManager = () => {\n return wrapManagerMethods(Toast.createToastManager());\n};\n\n/**\n * Toasty — toast notification provider and viewport.\n *\n * Renders a `Toast.Provider` with a fixed-position viewport in the bottom-right corner.\n * Toasts stack with smooth enter/exit animations, swipe-to-dismiss, and expand-on-hover.\n *\n * Built on `@base-ui/react/toast`.\n *\n * @example\n * ```tsx\n * <Toasty>\n * <App />\n * </Toasty>\n * ```\n */\nexport function Toasty({ children }: ToastyProps) {\n return (\n <Toast.Provider>\n {children}\n <Toast.Portal>\n <Toast.Viewport className=\"fixed top-auto right-4 bottom-4 z-10 mx-auto flex w-[calc(100%-2rem)] sm:right-8 sm:bottom-8 sm:w-[340px]\">\n <ToastList />\n </Toast.Viewport>\n </Toast.Portal>\n </Toast.Provider>\n );\n}\n\n/** Alias for Toasty — provided for discoverability when migrating from other libraries */\nexport const ToastProvider = Toasty;\n\nfunction ToastList() {\n const { toasts } = useSFToastManager();\n return toasts.map((toast) => (\n <Toast.Root\n key={toast.id}\n toast={toast}\n className={cn(\n \"absolute right-0 bottom-0 left-auto z-[calc(1000-var(--toast-index))] mr-0 h-[var(--height)] w-full origin-bottom select-none\",\n toastVariants({ variant: toast.variant }),\n \"[--gap:0.75rem] [--height:var(--toast-frontmost-height,var(--toast-height))] [--offset-y:calc(var(--toast-offset-y)*-1+calc(var(--toast-index)*var(--gap)*-1)+var(--toast-swipe-movement-y))] [--peek:0.75rem] [--scale:calc(max(0,1-(var(--toast-index)*0.1)))] [--shrink:calc(1-var(--scale))]\",\n \"[transform:translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)-(var(--toast-index)*var(--peek))-(var(--shrink)*var(--height))))_scale(var(--scale))] [transition:transform_0.5s_cubic-bezier(0.22,1,0.36,1),opacity_0.5s,height_0.15s]\",\n \"after:absolute after:top-full after:left-0 after:h-[calc(var(--gap)+1px)] after:w-full after:content-['']\",\n \"data-[ending-style]:opacity-0 data-[expanded]:h-[var(--toast-height)] data-[expanded]:[transform:translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--offset-y)))] data-[limited]:opacity-0 data-[starting-style]:[transform:translateY(150%)]\",\n \"data-[ending-style]:data-[swipe-direction=down]:[transform:translateY(calc(var(--toast-swipe-movement-y)+150%))] data-[expanded]:data-[ending-style]:data-[swipe-direction=down]:[transform:translateY(calc(var(--toast-swipe-movement-y)+150%))]\",\n \"data-[ending-style]:data-[swipe-direction=left]:[transform:translateX(calc(var(--toast-swipe-movement-x)-150%))_translateY(var(--offset-y))] data-[expanded]:data-[ending-style]:data-[swipe-direction=left]:[transform:translateX(calc(var(--toast-swipe-movement-x)-150%))_translateY(var(--offset-y))]\",\n \"data-[ending-style]:data-[swipe-direction=right]:[transform:translateX(calc(var(--toast-swipe-movement-x)+150%))_translateY(var(--offset-y))] data-[expanded]:data-[ending-style]:data-[swipe-direction=right]:[transform:translateX(calc(var(--toast-swipe-movement-x)+150%))_translateY(var(--offset-y))]\",\n \"data-[ending-style]:data-[swipe-direction=up]:[transform:translateY(calc(var(--toast-swipe-movement-y)-150%))] data-[expanded]:data-[ending-style]:data-[swipe-direction=up]:[transform:translateY(calc(var(--toast-swipe-movement-y)-150%))]\",\n \"[&[data-ending-style]:not([data-limited]):not([data-swipe-direction])]:[transform:translateY(150%)]\"\n )}\n >\n <div className=\"absolute inset-0 rounded-[11px] bg-sf-control/90\"></div>\n <Toast.Content className=\"isolate flex flex-col gap-1 transition-opacity [transition-duration:250ms] data-[behind]:pointer-events-none data-[behind]:opacity-0 data-[expanded]:pointer-events-auto data-[expanded]:opacity-100\">\n {toast.content ?? (\n <>\n <div className=\"flex items-start gap-2\">\n <ToastIcon variant={toast.variant} />\n <div className=\"flex flex-col gap-1 overflow-hidden\">\n <Toast.Title\n data-toast-title\n className=\"text-[0.975rem] leading-5 font-medium text-sf-default\"\n />\n <Toast.Description className=\"text-[0.925rem] leading-5 text-sf-subtle\" />\n\n {!!toast.actions && (\n <div className=\"mt-2 flex min-w-0 flex-nowrap gap-2 overflow-x-auto p-px\">\n {toast.actions.map((actionProps, idx) => (\n <Button key={idx} {...actionProps} />\n ))}\n </div>\n )}\n </div>\n </div>\n </>\n )}\n <Toast.Close\n className=\"absolute top-2 right-2 flex h-4 w-4 items-center justify-center rounded border-none bg-transparent text-current/50 hover:bg-sf-contrast/10 hover:text-current\"\n aria-label=\"Close\"\n >\n <XIcon className=\"h-3 w-3\" />\n </Toast.Close>\n </Toast.Content>\n </Toast.Root>\n ));\n}\n\nfunction ToastIcon({ variant }: { variant?: SFToastVariant }) {\n if (!variant || variant === \"default\") return null;\n const variantConfig = SF_TOAST_VARIANTS.variant[variant];\n if (!(\"icon\" in variantConfig)) return null;\n const Icon = variantConfig.icon;\n return (\n <Icon data-toast-icon className=\"mt-0.5 h-4 w-4 shrink-0\" weight=\"fill\" />\n );\n}\n\nfunction XIcon(props: React.ComponentProps<\"svg\">) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"toast-CgZVaAkw.js","names":[],"sources":["../src/components/toast/toast.tsx"],"sourcesContent":["import {\n Toast,\n ToastManagerAddOptions,\n ToastObject,\n} from \"@base-ui/react/toast\";\nimport {\n WarningIcon,\n WarningOctagonIcon,\n} from \"@phosphor-icons/react/dist/ssr\";\nimport type React from \"react\";\n\nimport { Button, ButtonProps } from \"../../components/button\";\nimport { cn } from \"../../utils/cn\";\n\n/**\n * Toast styling configuration for Figma plugin consumption.\n * Toast has no user-facing variants but documents the styling structure.\n */\nexport const SF_TOAST_VARIANTS = {\n root: {\n classes:\n \"rounded-lg border border-sf-fill bg-sf-control p-4 shadow-lg text-sf-default\",\n description: \"Toast container with background, border, and shadow\",\n },\n title: {\n classes: \"text-[0.975rem] leading-5 font-medium text-sf-default\",\n description: \"Toast title with primary text color\",\n },\n description: {\n classes: \"text-[0.925rem] leading-5 text-sf-subtle\",\n description: \"Toast description with muted text color\",\n },\n close: {\n classes:\n \"absolute top-2 right-2 flex h-5 w-5 items-center justify-center rounded border-none bg-transparent text-sf-subtle hover:bg-sf-fill-hover hover:text-sf-strong\",\n description: \"Close button with X icon\",\n },\n variant: {\n default: {\n classes: \"border-sf-fill bg-sf-control\",\n description: \"Default toast style\",\n },\n error: {\n classes:\n \"border-sf-fill bg-sf-control [&_[data-toast-icon]]:text-[light-dark(var(--color-red-600),var(--color-red-400))] [&_[data-toast-title]]:text-[light-dark(var(--color-red-600),var(--color-red-400))]\",\n description: \"Error toast for critical issues\",\n icon: WarningOctagonIcon,\n },\n warning: {\n classes:\n \"border-sf-fill bg-sf-control [&_[data-toast-icon]]:text-[light-dark(var(--color-amber-700),var(--color-amber-500))] [&_[data-toast-title]]:text-[light-dark(var(--color-amber-700),var(--color-amber-500))]\",\n description: \"Warning toast for cautionary messages\",\n icon: WarningIcon,\n },\n },\n} as const;\n\nexport const SF_TOAST_DEFAULT_VARIANTS = {\n variant: \"default\",\n} as const;\n\n/**\n * Toast styling configuration for Figma plugin consumption.\n * Provides structured metadata for generating Toast components in Figma.\n */\nexport const SF_TOAST_STYLING = {\n container: {\n width: 300,\n padding: 16,\n borderRadius: 8,\n background: \"color-secondary\",\n border: \"color-color\",\n shadow: \"shadow-lg\",\n gap: 4,\n },\n title: {\n fontSize: 16,\n fontWeight: 500,\n color: \"text-color-surface\",\n },\n description: {\n fontSize: 15,\n fontWeight: 400,\n color: \"text-color-muted\",\n },\n closeButton: {\n size: 20,\n iconSize: 16,\n iconName: \"ph-x\",\n iconColor: \"text-color-muted\",\n hoverBackground: \"color-color-2\",\n hoverColor: \"text-color-label\",\n borderRadius: 4,\n },\n} as const;\n\n// Derived types from SF_TOAST_VARIANTS\nexport type SFToastVariant = keyof typeof SF_TOAST_VARIANTS.variant;\n\nexport interface SFToastVariantsProps {\n variant?: SFToastVariant;\n}\n\nexport function toastVariants({\n variant = SF_TOAST_DEFAULT_VARIANTS.variant,\n}: SFToastVariantsProps = {}) {\n return cn(\n // Base styles for toast root\n \"rounded-xl border bg-clip-padding p-4 shadow-lg\",\n // Apply variant styles from SF_TOAST_VARIANTS\n SF_TOAST_VARIANTS.variant[variant].classes\n );\n}\n\n/**\n * Toasty component props.\n *\n * Wrap your app with `<Toasty>` to enable toast notifications.\n * Use `Toast.useToastManager().notify(…)` to create toasts.\n *\n * @example\n * ```tsx\n * // 1. Wrap your app\n * <Toasty>\n * <App />\n * </Toasty>\n *\n * // 2. Show a toast from any child component\n * const toasts = Toast.useToastManager();\n * toasts.notify({ title: \"Saved\", description: \"Changes saved successfully.\" });\n * ```\n */\nexport interface ToastyProps extends SFToastVariantsProps {\n /** Application content. Toasts render via a portal above this. */\n children: React.ReactNode;\n}\n\ntype SFToastOptionsBase = {\n variant?: SFToastVariant;\n content?: React.ReactNode;\n actions?: Array<ButtonProps>;\n};\n\nexport type SFToastOptions<Data extends object> = ToastObject<Data> &\n SFToastOptionsBase;\n\nexport type SFToastManagerAddOptions<Data extends object> =\n ToastManagerAddOptions<Data> & SFToastOptionsBase;\n\nfunction wrapManagerMethods<\n T extends { add: Function; update: Function; promise: Function },\n>(manager: T) {\n return {\n ...manager,\n\n add: (options: SFToastManagerAddOptions<any>) => {\n return manager.add({\n ...options,\n });\n },\n\n update: (id: string, options: Partial<SFToastManagerAddOptions<any>>) => {\n return manager.update(id, {\n ...options,\n });\n },\n\n promise: <T,>(\n promise: Promise<T>,\n options: {\n loading: SFToastManagerAddOptions<any>;\n success:\n | SFToastManagerAddOptions<any>\n | ((data: T) => SFToastManagerAddOptions<any>);\n error:\n | SFToastManagerAddOptions<any>\n | ((error: Error) => SFToastManagerAddOptions<any>);\n }\n ) => {\n return manager.promise(promise, {\n loading: { ...options.loading },\n success:\n typeof options.success === \"function\"\n ? (data: T) => ({\n ...(\n options.success as (data: T) => SFToastManagerAddOptions<any>\n )(data),\n })\n : { ...options.success },\n error:\n typeof options.error === \"function\"\n ? (error: Error) => ({\n ...(\n options.error as (\n error: Error\n ) => SFToastManagerAddOptions<any>\n )(error),\n })\n : { ...options.error },\n });\n },\n };\n}\n\nexport const useSFToastManager = () => {\n const manager = Toast.useToastManager();\n return {\n ...wrapManagerMethods(manager),\n toasts: manager.toasts as Array<SFToastOptions<any>>,\n };\n};\n\nexport const createSFToastManager = () => {\n return wrapManagerMethods(Toast.createToastManager());\n};\n\n/**\n * Toasty — toast notification provider and viewport.\n *\n * Renders a `Toast.Provider` with a fixed-position viewport in the bottom-right corner.\n * Toasts stack with smooth enter/exit animations, swipe-to-dismiss, and expand-on-hover.\n *\n * Built on `@base-ui/react/toast`.\n *\n * @example\n * ```tsx\n * <Toasty>\n * <App />\n * </Toasty>\n * ```\n */\nexport function Toasty({ children }: ToastyProps) {\n return (\n <Toast.Provider>\n {children}\n <Toast.Portal>\n <Toast.Viewport className=\"fixed top-auto right-4 bottom-4 z-10 mx-auto flex w-[calc(100%-2rem)] sm:right-8 sm:bottom-8 sm:w-[340px]\">\n <ToastList />\n </Toast.Viewport>\n </Toast.Portal>\n </Toast.Provider>\n );\n}\n\n/** Alias for Toasty — provided for discoverability when migrating from other libraries */\nexport const ToastProvider = Toasty;\n\nfunction ToastList() {\n const { toasts } = useSFToastManager();\n return toasts.map((toast) => (\n <Toast.Root\n key={toast.id}\n toast={toast}\n className={cn(\n \"absolute right-0 bottom-0 left-auto z-[calc(1000-var(--toast-index))] mr-0 h-[var(--height)] w-full origin-bottom select-none\",\n toastVariants({ variant: toast.variant }),\n \"[--gap:0.75rem] [--height:var(--toast-frontmost-height,var(--toast-height))] [--offset-y:calc(var(--toast-offset-y)*-1+calc(var(--toast-index)*var(--gap)*-1)+var(--toast-swipe-movement-y))] [--peek:0.75rem] [--scale:calc(max(0,1-(var(--toast-index)*0.1)))] [--shrink:calc(1-var(--scale))]\",\n \"[transform:translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)-(var(--toast-index)*var(--peek))-(var(--shrink)*var(--height))))_scale(var(--scale))] [transition:transform_0.5s_cubic-bezier(0.22,1,0.36,1),opacity_0.5s,height_0.15s]\",\n \"after:absolute after:top-full after:left-0 after:h-[calc(var(--gap)+1px)] after:w-full after:content-['']\",\n \"data-[ending-style]:opacity-0 data-[expanded]:h-[var(--toast-height)] data-[expanded]:[transform:translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--offset-y)))] data-[limited]:opacity-0 data-[starting-style]:[transform:translateY(150%)]\",\n \"data-[ending-style]:data-[swipe-direction=down]:[transform:translateY(calc(var(--toast-swipe-movement-y)+150%))] data-[expanded]:data-[ending-style]:data-[swipe-direction=down]:[transform:translateY(calc(var(--toast-swipe-movement-y)+150%))]\",\n \"data-[ending-style]:data-[swipe-direction=left]:[transform:translateX(calc(var(--toast-swipe-movement-x)-150%))_translateY(var(--offset-y))] data-[expanded]:data-[ending-style]:data-[swipe-direction=left]:[transform:translateX(calc(var(--toast-swipe-movement-x)-150%))_translateY(var(--offset-y))]\",\n \"data-[ending-style]:data-[swipe-direction=right]:[transform:translateX(calc(var(--toast-swipe-movement-x)+150%))_translateY(var(--offset-y))] data-[expanded]:data-[ending-style]:data-[swipe-direction=right]:[transform:translateX(calc(var(--toast-swipe-movement-x)+150%))_translateY(var(--offset-y))]\",\n \"data-[ending-style]:data-[swipe-direction=up]:[transform:translateY(calc(var(--toast-swipe-movement-y)-150%))] data-[expanded]:data-[ending-style]:data-[swipe-direction=up]:[transform:translateY(calc(var(--toast-swipe-movement-y)-150%))]\",\n \"[&[data-ending-style]:not([data-limited]):not([data-swipe-direction])]:[transform:translateY(150%)]\"\n )}\n >\n <div className=\"absolute inset-0 rounded-[11px] bg-sf-control/90\"></div>\n <Toast.Content className=\"isolate flex flex-col gap-1 transition-opacity [transition-duration:250ms] data-[behind]:pointer-events-none data-[behind]:opacity-0 data-[expanded]:pointer-events-auto data-[expanded]:opacity-100\">\n {toast.content ?? (\n <>\n <div className=\"flex items-start gap-2\">\n <ToastIcon variant={toast.variant} />\n <div className=\"flex flex-col gap-1 overflow-hidden\">\n <Toast.Title\n data-toast-title\n className=\"text-[0.975rem] leading-5 font-medium text-sf-default\"\n />\n <Toast.Description className=\"text-[0.925rem] leading-5 text-sf-subtle\" />\n\n {!!toast.actions && (\n <div className=\"mt-2 flex min-w-0 flex-nowrap gap-2 overflow-x-auto p-px\">\n {toast.actions.map((actionProps, idx) => (\n <Button key={idx} {...actionProps} />\n ))}\n </div>\n )}\n </div>\n </div>\n </>\n )}\n <Toast.Close\n className=\"absolute top-2 right-2 flex h-4 w-4 items-center justify-center rounded border-none bg-transparent text-current/50 hover:bg-sf-contrast/10 hover:text-current\"\n aria-label=\"Close\"\n >\n <XIcon className=\"h-3 w-3\" />\n </Toast.Close>\n </Toast.Content>\n </Toast.Root>\n ));\n}\n\nfunction ToastIcon({ variant }: { variant?: SFToastVariant }) {\n if (!variant || variant === \"default\") return null;\n const variantConfig = SF_TOAST_VARIANTS.variant[variant];\n if (!(\"icon\" in variantConfig)) return null;\n const Icon = variantConfig.icon;\n return (\n <Icon data-toast-icon className=\"mt-0.5 h-4 w-4 shrink-0\" weight=\"fill\" />\n );\n}\n\nfunction XIcon(props: React.ComponentProps<\"svg\">) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as cn } from "./cn-
|
|
2
|
+
import { t as cn } from "./cn-CmAOpn49.js";
|
|
3
|
+
import { t as Text } from "./text-iQ0YUFNg.js";
|
|
3
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
5
|
import { Tooltip } from "@base-ui/react/tooltip";
|
|
5
6
|
//#region src/components/tooltip/tooltip.tsx
|
|
@@ -30,7 +31,12 @@ function Tooltip$1({ content, children, align, side, className, ...props }) {
|
|
|
30
31
|
children: [/* @__PURE__ */ jsx(Tooltip.Arrow, {
|
|
31
32
|
className: cn("flex", "data-[side=bottom]:top-[-8px]", "data-[side=left]:right-[-13px] data-[side=left]:rotate-90", "data-[side=right]:left-[-13px] data-[side=right]:-rotate-90", "data-[side=top]:bottom-[-8px] data-[side=top]:rotate-180"),
|
|
32
33
|
children: /* @__PURE__ */ jsx(ArrowSvg, {})
|
|
33
|
-
}), content
|
|
34
|
+
}), typeof content === "string" ? /* @__PURE__ */ jsx(Text, {
|
|
35
|
+
size: "sm",
|
|
36
|
+
wrap: "shrink",
|
|
37
|
+
as: "span",
|
|
38
|
+
children: content
|
|
39
|
+
}) : content]
|
|
34
40
|
})
|
|
35
41
|
}) })]
|
|
36
42
|
});
|
|
@@ -76,4 +82,4 @@ function ArrowSvg(props) {
|
|
|
76
82
|
//#endregion
|
|
77
83
|
export { TooltipProvider as n, Tooltip$1 as t };
|
|
78
84
|
|
|
79
|
-
//# sourceMappingURL=tooltip-
|
|
85
|
+
//# sourceMappingURL=tooltip-uobk6Oh-.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-uobk6Oh-.js","names":[],"sources":["../src/components/tooltip/tooltip.tsx"],"sourcesContent":["import { Tooltip as TooltipBase } from \"@base-ui/react/tooltip\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { Text } from \"../text\";\n\n/** Tooltip side variant definitions mapping positions to their Tailwind classes. */\nexport const SF_TOOLTIP_VARIANTS = {\n side: {\n top: {\n classes: \"\",\n description: \"Tooltip appears above the trigger\",\n },\n bottom: {\n classes: \"\",\n description: \"Tooltip appears below the trigger\",\n },\n left: {\n classes: \"\",\n description: \"Tooltip appears to the left of the trigger\",\n },\n right: {\n classes: \"\",\n description: \"Tooltip appears to the right of the trigger\",\n },\n },\n} as const;\n\nexport const SF_TOOLTIP_DEFAULT_VARIANTS = {\n side: \"top\",\n} as const;\n\n// Derived types from SF_TOOLTIP_VARIANTS\nexport type SFTooltipSide = keyof typeof SF_TOOLTIP_VARIANTS.side;\n\nexport interface SFTooltipVariantsProps {\n /**\n * Preferred side of the trigger to render the tooltip.\n * - `\"top\"` — Tooltip appears above the trigger\n * - `\"bottom\"` — Tooltip appears below the trigger\n * - `\"left\"` — Tooltip appears to the left of the trigger\n * - `\"right\"` — Tooltip appears to the right of the trigger\n * @default \"top\"\n */\n side?: SFTooltipSide;\n}\n\nexport function tooltipVariants({\n side = SF_TOOLTIP_DEFAULT_VARIANTS.side,\n}: SFTooltipVariantsProps = {}) {\n return cn(\n // Base styles\n \"flex origin-[var(--transform-origin)] flex-col rounded-md bg-sf-elevated px-2.5 py-1.5 text-sm text-sf-default\",\n \"shadow-lg shadow-sf-tip-shadow outline outline-1 outline-sf-fill\",\n \"transition-[transform,opacity] duration-150\",\n \"data-[starting-style]:scale-90 data-[starting-style]:opacity-0\",\n \"data-[ending-style]:scale-90 data-[ending-style]:opacity-0\",\n \"data-[instant]:duration-0\",\n // Apply side-specific styles (currently none, but extensible)\n SF_TOOLTIP_VARIANTS.side[side].classes\n );\n}\n\nexport const TooltipProvider = TooltipBase.Provider;\n\ntype BaseTooltipProps = ComponentPropsWithoutRef<typeof TooltipBase.Root>;\n\ntype TriggerProps = ComponentPropsWithoutRef<typeof TooltipBase.Trigger>;\n\n/** Alignment options for tooltip positioning. Source: PositionerProps[\"align\"] */\ntype TooltipAlign = \"start\" | \"center\" | \"end\";\n\n/**\n * Tooltip component props.\n *\n * @example\n * ```tsx\n * <TooltipProvider>\n * <Tooltip content=\"Add new item\">\n * <Button shape=\"square\" icon={PlusIcon} />\n * </Tooltip>\n * </TooltipProvider>\n * ```\n */\nexport type TooltipProps = BaseTooltipProps &\n SFTooltipVariantsProps & {\n /**\n * Alignment on the axis perpendicular to `side`.\n * - `\"start\"` — Align to the start edge\n * - `\"center\"` — Center-aligned\n * - `\"end\"` — Align to the end edge\n */\n align?: TooltipAlign;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Content to display inside the tooltip popup. */\n content: ReactNode;\n };\n\n/**\n * Accessible popup that shows additional information on hover/focus.\n * Wrap your app or section with `<TooltipProvider>` to enable delay grouping.\n *\n * @example\n * ```tsx\n * <Tooltip content=\"Save changes\">\n * <Button variant=\"primary\">Save</Button>\n * </Tooltip>\n * ```\n */\nexport function Tooltip({\n content,\n children,\n align,\n side,\n className,\n ...props\n}: TooltipProps) {\n return (\n <TooltipBase.Root {...props}>\n <TooltipBase.Trigger\n className={className}\n render={children as TriggerProps[\"render\"]}\n />\n <TooltipBase.Portal>\n <TooltipBase.Positioner align={align} side={side} sideOffset={10}>\n <TooltipBase.Popup\n className={cn(\n \"flex origin-[var(--transform-origin)] flex-col rounded-md bg-sf-elevated px-2.5 py-1.5 text-sm text-sf-default\",\n \"shadow-lg shadow-sf-tip-shadow outline outline-sf-fill\",\n \"transition-[transform,opacity] duration-150\",\n \"data-[starting-style]:scale-90 data-[starting-style]:opacity-0\",\n \"data-[ending-style]:scale-90 data-[ending-style]:opacity-0\",\n \"data-[instant]:duration-0\",\n \"sf-tooltip-popup\"\n )}\n >\n <TooltipBase.Arrow\n className={cn(\n \"flex\",\n \"data-[side=bottom]:top-[-8px]\",\n \"data-[side=left]:right-[-13px] data-[side=left]:rotate-90\",\n \"data-[side=right]:left-[-13px] data-[side=right]:-rotate-90\",\n \"data-[side=top]:bottom-[-8px] data-[side=top]:rotate-180\"\n )}\n >\n <ArrowSvg />\n </TooltipBase.Arrow>\n {typeof content === \"string\" ? (\n <Text size=\"sm\" wrap=\"shrink\" as=\"span\">\n {content}\n </Text>\n ) : (\n content\n )}\n </TooltipBase.Popup>\n </TooltipBase.Positioner>\n </TooltipBase.Portal>\n </TooltipBase.Root>\n );\n}\n\n/**\n * Arrow SVG with three paths for proper border rendering in both light and dark modes.\n * This approach matches Base UI's tooltip implementation.\n *\n * The three paths are:\n * 1. ArrowFill - The main arrow body, matches tooltip background\n * 2. ArrowOuterStroke - Border visible in light mode only (transparent in dark)\n * 3. ArrowInnerStroke - Border visible in dark mode only (transparent in light)\n *\n * This is necessary because the outer and inner stroke paths have different geometries,\n * and using both ensures the arrow border aligns perfectly with the tooltip's outline\n * in both color modes.\n *\n * @see https://base-ui.com/react/components/tooltip\n */\nfunction ArrowSvg(props: React.ComponentProps<\"svg\">) {\n return (\n <svg width=\"20\" height=\"10\" viewBox=\"0 0 20 10\" fill=\"none\" {...props}>\n <path\n d=\"M9.66437 2.60207L4.80758 6.97318C4.07308 7.63423 3.11989 8 2.13172 8H0V10H20V8H18.5349C17.5468 8 16.5936 7.63423 15.8591 6.97318L11.0023 2.60207C10.622 2.2598 10.0447 2.25979 9.66437 2.60207Z\"\n className=\"fill-sf-elevated\"\n />\n <path\n d=\"M8.99542 1.85876C9.75604 1.17425 10.9106 1.17422 11.6713 1.85878L16.5281 6.22989C17.0789 6.72568 17.7938 7.00001 18.5349 7.00001L15.89 7L11.0023 2.60207C10.622 2.2598 10.0447 2.2598 9.66436 2.60207L4.77734 7L2.13171 7.00001C2.87284 7.00001 3.58774 6.72568 4.13861 6.22989L8.99542 1.85876Z\"\n className=\"fill-sf-tip-shadow\"\n />\n <path\n d=\"M10.3333 3.34539L5.47654 7.71648C4.55842 8.54279 3.36693 9 2.13172 9H0V8H2.13172C3.11989 8 4.07308 7.63423 4.80758 6.97318L9.66437 2.60207C10.0447 2.25979 10.622 2.2598 11.0023 2.60207L15.8591 6.97318C16.5936 7.63423 17.5468 8 18.5349 8H20V9H18.5349C17.2998 9 16.1083 8.54278 15.1901 7.71648L10.3333 3.34539Z\"\n className=\"fill-sf-tip-stroke\"\n />\n </svg>\n );\n}\n"],"mappings":";;;;;;AA+DA,IAAa,kBAAkB,QAAY;;;;;;;;;;;;AA+C3C,SAAgB,UAAQ,EACtB,SACA,UACA,OACA,MACA,WACA,GAAG,SACY;CACf,OACE,qBAAC,QAAY,MAAb;EAAkB,GAAI;YAAtB,CACE,oBAAC,QAAY,SAAb;GACa;GACX,QAAQ;EACT,CAAA,GACD,oBAAC,QAAY,QAAb,EAAA,UACE,oBAAC,QAAY,YAAb;GAA+B;GAAa;GAAM,YAAY;aAC5D,qBAAC,QAAY,OAAb;IACE,WAAW,GACT,kHACA,0DACA,+CACA,kEACA,8DACA,6BACA,kBACF;cATF,CAWE,oBAAC,QAAY,OAAb;KACE,WAAW,GACT,QACA,iCACA,6DACA,+DACA,0DACF;eAEA,oBAAC,UAAD,CAAW,CAAA;IACM,CAAA,GAClB,OAAO,YAAY,WAClB,oBAAC,MAAD;KAAM,MAAK;KAAK,MAAK;KAAS,IAAG;eAC9B;IACG,CAAA,IAEN,OAEe;;EACG,CAAA,EACN,CAAA,CACJ;;AAEtB;;;;;;;;;;;;;;;;AAiBA,SAAS,SAAS,OAAoC;CACpD,OACE,qBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,GAAI;YAAhE;GACE,oBAAC,QAAD;IACE,GAAE;IACF,WAAU;GACX,CAAA;GACD,oBAAC,QAAD;IACE,GAAE;IACF,WAAU;GACX,CAAA;GACD,oBAAC,QAAD;IACE,GAAE;IACF,WAAU;GACX,CAAA;EACE;;AAET"}
|
|
@@ -193,7 +193,7 @@ function agentHarnessReducer(state, action) {
|
|
|
193
193
|
...state,
|
|
194
194
|
timeline
|
|
195
195
|
};
|
|
196
|
-
const newContent = event.content
|
|
196
|
+
const newContent = event.content === void 0 ? existing.content + event.delta : event.content;
|
|
197
197
|
return {
|
|
198
198
|
...state,
|
|
199
199
|
timeline,
|
|
@@ -627,7 +627,7 @@ function agentHarnessReducer(state, action) {
|
|
|
627
627
|
...state,
|
|
628
628
|
timeline
|
|
629
629
|
};
|
|
630
|
-
const newText = event.content
|
|
630
|
+
const newText = event.content === void 0 ? existing.text + event.delta : event.content;
|
|
631
631
|
return {
|
|
632
632
|
...state,
|
|
633
633
|
timeline,
|
|
@@ -926,4 +926,4 @@ function useAgentHarness({ adapter }) {
|
|
|
926
926
|
//#endregion
|
|
927
927
|
export { useAgentHarness as a, fromMastraHarness as i, SF_USE_AGENT_HARNESS_VARIANTS as n, createAgentHarnessState as r, SF_USE_AGENT_HARNESS_DEFAULT_VARIANTS as t };
|
|
928
928
|
|
|
929
|
-
//# sourceMappingURL=use-agent-harness-
|
|
929
|
+
//# sourceMappingURL=use-agent-harness-Dl8w6X5O.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-agent-harness-BMyF8pTq.js","names":[],"sources":["../src/components/use-agent-harness/use-agent-harness.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useReducer, useRef } from \"react\";\n\n// ─── Variants (required by SignalFlare conventions) ───────────────────────────────────\n\nexport const SF_USE_AGENT_HARNESS_VARIANTS = {} as const;\nexport const SF_USE_AGENT_HARNESS_DEFAULT_VARIANTS = {} as const;\n\n// ─── Harness Event Types ──────────────────────────────────────────────────────\n\n/** All event types emitted by a Mastra Harness instance. */\nexport type HarnessEventType =\n | \"mode_changed\"\n | \"model_changed\"\n | \"thread_changed\"\n | \"thread_created\"\n | \"thread_deleted\"\n | \"state_changed\"\n | \"agent_start\"\n | \"agent_end\"\n | \"message_start\"\n | \"message_update\"\n | \"message_end\"\n | \"tool_start\"\n | \"tool_approval_required\"\n | \"tool_update\"\n | \"tool_end\"\n | \"tool_input_start\"\n | \"tool_input_delta\"\n | \"tool_input_end\"\n | \"usage_update\"\n | \"error\"\n | \"info\"\n | \"follow_up_queued\"\n | \"workspace_status_changed\"\n | \"workspace_ready\"\n | \"workspace_error\"\n | \"om_status\"\n | \"om_observation_start\"\n | \"om_observation_end\"\n | \"om_reflection_start\"\n | \"om_reflection_end\"\n | \"ask_question\"\n | \"question_answered\"\n | \"plan_approval_required\"\n | \"plan_approved\"\n | \"subagent_start\"\n | \"subagent_text_delta\"\n | \"subagent_tool_start\"\n | \"subagent_tool_end\"\n | \"subagent_end\"\n | \"subagent_model_changed\"\n | \"task_updated\"\n | \"thinking_start\"\n | \"thinking_delta\"\n | \"thinking_end\";\n\n/** Base shape of all harness events. */\nexport interface HarnessEventBase {\n type: HarnessEventType;\n}\n\nexport interface HarnessModeChangedEvent extends HarnessEventBase {\n type: \"mode_changed\";\n modeId: string;\n modeName: string;\n}\n\nexport interface HarnessModelChangedEvent extends HarnessEventBase {\n type: \"model_changed\";\n modelId: string;\n modelName?: string;\n}\n\nexport interface HarnessThreadChangedEvent extends HarnessEventBase {\n type: \"thread_changed\";\n threadId: string;\n}\n\nexport interface HarnessThreadCreatedEvent extends HarnessEventBase {\n type: \"thread_created\";\n threadId: string;\n}\n\nexport interface HarnessThreadDeletedEvent extends HarnessEventBase {\n type: \"thread_deleted\";\n threadId: string;\n}\n\nexport interface HarnessStateChangedEvent extends HarnessEventBase {\n type: \"state_changed\";\n state: Record<string, unknown>;\n changedKeys: string[];\n}\n\nexport interface HarnessAgentStartEvent extends HarnessEventBase {\n type: \"agent_start\";\n}\n\nexport interface HarnessAgentEndEvent extends HarnessEventBase {\n type: \"agent_end\";\n}\n\nexport interface HarnessMessageStartEvent extends HarnessEventBase {\n type: \"message_start\";\n messageId: string;\n role: \"assistant\" | \"user\" | \"system\";\n}\n\nexport interface HarnessMessageUpdateEvent extends HarnessEventBase {\n type: \"message_update\";\n messageId: string;\n delta: string;\n content?: string;\n}\n\nexport interface HarnessMessageEndEvent extends HarnessEventBase {\n type: \"message_end\";\n messageId: string;\n content: string;\n}\n\nexport interface HarnessToolStartEvent extends HarnessEventBase {\n type: \"tool_start\";\n toolCallId: string;\n toolName: string;\n messageId?: string;\n subagentId?: string;\n}\n\nexport interface HarnessToolApprovalRequiredEvent extends HarnessEventBase {\n type: \"tool_approval_required\";\n toolCallId: string;\n toolName: string;\n input?: unknown;\n messageId?: string;\n}\n\nexport interface HarnessToolUpdateEvent extends HarnessEventBase {\n type: \"tool_update\";\n toolCallId: string;\n summary?: string;\n progress?: number;\n}\n\nexport interface HarnessToolEndEvent extends HarnessEventBase {\n type: \"tool_end\";\n toolCallId: string;\n output?: unknown;\n error?: string;\n durationMs?: number;\n}\n\nexport interface HarnessToolInputStartEvent extends HarnessEventBase {\n type: \"tool_input_start\";\n toolCallId: string;\n}\n\nexport interface HarnessToolInputDeltaEvent extends HarnessEventBase {\n type: \"tool_input_delta\";\n toolCallId: string;\n delta: string;\n}\n\nexport interface HarnessToolInputEndEvent extends HarnessEventBase {\n type: \"tool_input_end\";\n toolCallId: string;\n input: unknown;\n}\n\nexport interface HarnessUsageUpdateEvent extends HarnessEventBase {\n type: \"usage_update\";\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cost?: number;\n modelId?: string;\n}\n\nexport interface HarnessErrorEvent extends HarnessEventBase {\n type: \"error\";\n error: string | Error;\n messageId?: string;\n}\n\nexport interface HarnessInfoEvent extends HarnessEventBase {\n type: \"info\";\n message: string;\n}\n\nexport interface HarnessFollowUpQueuedEvent extends HarnessEventBase {\n type: \"follow_up_queued\";\n content: string;\n}\n\nexport interface HarnessWorkspaceStatusChangedEvent extends HarnessEventBase {\n type: \"workspace_status_changed\";\n status: string;\n}\n\nexport interface HarnessWorkspaceReadyEvent extends HarnessEventBase {\n type: \"workspace_ready\";\n}\n\nexport interface HarnessWorkspaceErrorEvent extends HarnessEventBase {\n type: \"workspace_error\";\n error: string | Error;\n}\n\nexport interface HarnessOMStatusEvent extends HarnessEventBase {\n type: \"om_status\";\n generationCount?: number;\n observationTokenCount?: number;\n activeObservations?: number;\n}\n\nexport interface HarnessOMObservationStartEvent extends HarnessEventBase {\n type: \"om_observation_start\";\n observationId?: string;\n}\n\nexport interface HarnessOMObservationEndEvent extends HarnessEventBase {\n type: \"om_observation_end\";\n observationId?: string;\n text?: string;\n durationMs?: number;\n}\n\nexport interface HarnessOMReflectionStartEvent extends HarnessEventBase {\n type: \"om_reflection_start\";\n}\n\nexport interface HarnessOMReflectionEndEvent extends HarnessEventBase {\n type: \"om_reflection_end\";\n text?: string;\n durationMs?: number;\n}\n\nexport interface HarnessAskQuestionEvent extends HarnessEventBase {\n type: \"ask_question\";\n questionId: string;\n question: string;\n header?: string;\n options?: Array<{ label: string; description?: string }>;\n multiple?: boolean;\n allowCustom?: boolean;\n}\n\nexport interface HarnessQuestionAnsweredEvent extends HarnessEventBase {\n type: \"question_answered\";\n questionId: string;\n answer: string;\n}\n\nexport interface HarnessPlanApprovalRequiredEvent extends HarnessEventBase {\n type: \"plan_approval_required\";\n planId: string;\n title: string;\n description?: string;\n steps?: Array<{ id: string; label: string; description?: string }>;\n}\n\nexport interface HarnessPlanApprovedEvent extends HarnessEventBase {\n type: \"plan_approved\";\n planId: string;\n}\n\nexport interface HarnessSubagentStartEvent extends HarnessEventBase {\n type: \"subagent_start\";\n subagentId: string;\n agentType?: string;\n name?: string;\n modelId?: string;\n parentMessageId?: string;\n}\n\nexport interface HarnessSubagentTextDeltaEvent extends HarnessEventBase {\n type: \"subagent_text_delta\";\n subagentId: string;\n delta: string;\n}\n\nexport interface HarnessSubagentToolStartEvent extends HarnessEventBase {\n type: \"subagent_tool_start\";\n subagentId: string;\n toolCallId: string;\n toolName: string;\n}\n\nexport interface HarnessSubagentToolEndEvent extends HarnessEventBase {\n type: \"subagent_tool_end\";\n subagentId: string;\n toolCallId: string;\n output?: unknown;\n error?: string;\n durationMs?: number;\n}\n\nexport interface HarnessSubagentEndEvent extends HarnessEventBase {\n type: \"subagent_end\";\n subagentId: string;\n error?: string;\n durationMs?: number;\n}\n\nexport interface HarnessSubagentModelChangedEvent extends HarnessEventBase {\n type: \"subagent_model_changed\";\n subagentId?: string;\n modelId: string;\n agentType?: string;\n}\n\nexport interface HarnessTaskUpdatedEvent extends HarnessEventBase {\n type: \"task_updated\";\n tasks: Array<{\n id: string;\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\" | \"cancelled\";\n priority?: \"high\" | \"medium\" | \"low\";\n }>;\n title?: string;\n}\n\n/** Emitted when the model begins a thinking/reasoning block. */\nexport interface HarnessThinkingStartEvent extends HarnessEventBase {\n type: \"thinking_start\";\n thinkingId: string;\n messageId: string;\n}\n\n/** Emitted for each incremental chunk of thinking text. */\nexport interface HarnessThinkingDeltaEvent extends HarnessEventBase {\n type: \"thinking_delta\";\n thinkingId: string;\n messageId: string;\n /** Incremental text to append. */\n delta: string;\n /** Full text so far (if available). */\n content?: string;\n}\n\n/** Emitted when a thinking block is complete. */\nexport interface HarnessThinkingEndEvent extends HarnessEventBase {\n type: \"thinking_end\";\n thinkingId: string;\n messageId: string;\n /** Final accumulated thinking text. */\n content: string;\n}\n\n/** Union of all typed harness events. */\nexport type HarnessEvent =\n | HarnessModeChangedEvent\n | HarnessModelChangedEvent\n | HarnessThreadChangedEvent\n | HarnessThreadCreatedEvent\n | HarnessThreadDeletedEvent\n | HarnessStateChangedEvent\n | HarnessAgentStartEvent\n | HarnessAgentEndEvent\n | HarnessMessageStartEvent\n | HarnessMessageUpdateEvent\n | HarnessMessageEndEvent\n | HarnessToolStartEvent\n | HarnessToolApprovalRequiredEvent\n | HarnessToolUpdateEvent\n | HarnessToolEndEvent\n | HarnessToolInputStartEvent\n | HarnessToolInputDeltaEvent\n | HarnessToolInputEndEvent\n | HarnessUsageUpdateEvent\n | HarnessErrorEvent\n | HarnessInfoEvent\n | HarnessFollowUpQueuedEvent\n | HarnessWorkspaceStatusChangedEvent\n | HarnessWorkspaceReadyEvent\n | HarnessWorkspaceErrorEvent\n | HarnessOMStatusEvent\n | HarnessOMObservationStartEvent\n | HarnessOMObservationEndEvent\n | HarnessOMReflectionStartEvent\n | HarnessOMReflectionEndEvent\n | HarnessAskQuestionEvent\n | HarnessQuestionAnsweredEvent\n | HarnessPlanApprovalRequiredEvent\n | HarnessPlanApprovedEvent\n | HarnessSubagentStartEvent\n | HarnessSubagentTextDeltaEvent\n | HarnessSubagentToolStartEvent\n | HarnessSubagentToolEndEvent\n | HarnessSubagentEndEvent\n | HarnessSubagentModelChangedEvent\n | HarnessTaskUpdatedEvent\n | HarnessThinkingStartEvent\n | HarnessThinkingDeltaEvent\n | HarnessThinkingEndEvent;\n\n// ─── Adapter Interface ────────────────────────────────────────────────────────\n\n/**\n * Minimal adapter interface for driving the AgentHarness UI.\n * Implement this to connect any event source — Mastra Harness, mock, replay, etc.\n */\nexport interface HarnessAdapter {\n /** Register an event listener. Returns an unsubscribe function. */\n subscribe: (listener: (event: HarnessEvent) => void) => () => void;\n /** Send a user message. */\n sendMessage: (params: {\n content: string;\n files?: Array<{ url: string; mediaType: string; filename: string }>;\n }) => void | Promise<void>;\n /** Respond to a pending tool approval. */\n respondToToolApproval?: (params: {\n decision: \"approve\" | \"decline\";\n }) => void | Promise<void>;\n /** Respond to a pending question. */\n respondToQuestion?: (params: {\n questionId: string;\n answer: string;\n }) => void | Promise<void>;\n /** Respond to a pending plan approval. */\n respondToPlanApproval?: (params: {\n planId: string;\n response: { action: \"approved\" | \"rejected\"; feedback?: string };\n }) => void | Promise<void>;\n /** Abort any in-progress generation. */\n abort?: () => void;\n /** Steer the agent mid-stream. */\n steer?: (params: { content: string }) => void;\n /** Select a mode. */\n selectMode?: (params: { modeId: string }) => void | Promise<void>;\n}\n\n/**\n * Create a HarnessAdapter from a real Mastra Harness instance.\n * The Mastra harness type is not imported to avoid a hard dependency.\n */\n// ─── Mastra → SignalFlare event translation ───────────────────────────────────────────\n\n/** Mastra's HarnessMessage content part (subset we care about). */\ntype MastraContentPart =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; thinking: string }\n | { type: \"tool_call\"; id: string; name: string; args: unknown }\n | { type: string; [key: string]: unknown };\n\n/** Mastra's HarnessMessage shape (from @mastra/core). */\ninterface MastraHarnessMessage {\n id: string;\n role: \"user\" | \"assistant\" | \"system\";\n content: MastraContentPart[];\n createdAt: Date;\n stopReason?: \"complete\" | \"tool_use\" | \"aborted\" | \"error\";\n}\n\n/** Mastra's raw HarnessEvent union (only the fields we translate). */\ntype MastraHarnessEvent =\n | { type: \"message_start\"; message: MastraHarnessMessage }\n | { type: \"message_update\"; message: MastraHarnessMessage }\n | { type: \"message_end\"; message: MastraHarnessMessage }\n | { type: string; [key: string]: unknown };\n\n/**\n * Translate a Mastra HarnessEvent into one or more SignalFlare HarnessEvents.\n *\n * Mastra sends full HarnessMessage objects on message_update/end, while SignalFlare\n * expects incremental deltas + separate thinking events. This function\n * bridges the gap.\n */\nfunction translateMastraEvent(\n mastraEvent: MastraHarnessEvent,\n prevMessages: Map<string, MastraHarnessMessage>\n): HarnessEvent[] {\n const out: HarnessEvent[] = [];\n\n if (\n mastraEvent.type === \"message_start\" ||\n mastraEvent.type === \"message_update\" ||\n mastraEvent.type === \"message_end\"\n ) {\n // TypeScript needs an explicit cast here because the catch-all arm in\n // MastraHarnessEvent doesn't carry `.message`. We've already narrowed via type.\n const msg = (\n mastraEvent as {\n type: \"message_start\" | \"message_update\" | \"message_end\";\n message: MastraHarnessMessage;\n }\n ).message;\n const prev = prevMessages.get(msg.id);\n\n if (mastraEvent.type === \"message_start\") {\n out.push({ type: \"message_start\", messageId: msg.id, role: msg.role });\n }\n\n // Extract text and thinking parts from content array\n const textParts = msg.content.filter(\n (p): p is { type: \"text\"; text: string } => p.type === \"text\"\n );\n const thinkingParts = msg.content.filter(\n (p): p is { type: \"thinking\"; thinking: string } => p.type === \"thinking\"\n );\n\n const fullText = textParts.map((p) => p.text).join(\"\");\n const prevText = prev\n ? prev.content\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : \"\";\n\n // Emit thinking blocks — each thinking part gets its own thinking_start/end\n // We compare against previous to only emit new/changed thinking blocks\n const prevThinking = prev\n ? prev.content.filter(\n (p): p is { type: \"thinking\"; thinking: string } =>\n p.type === \"thinking\"\n )\n : [];\n\n thinkingParts.forEach((part, i) => {\n const thinkingId = `${msg.id}-thinking-${i}`;\n const prevPart = prevThinking[i];\n if (!prevPart) {\n // New thinking block\n out.push({ type: \"thinking_start\", thinkingId, messageId: msg.id });\n if (part.thinking) {\n out.push({\n type: \"thinking_delta\",\n thinkingId,\n messageId: msg.id,\n delta: part.thinking,\n content: part.thinking,\n });\n }\n } else if (part.thinking !== prevPart.thinking) {\n // Updated thinking block — emit delta\n const delta = part.thinking.slice(prevPart.thinking.length);\n if (delta) {\n out.push({\n type: \"thinking_delta\",\n thinkingId,\n messageId: msg.id,\n delta,\n content: part.thinking,\n });\n }\n }\n });\n\n // Emit text delta if content changed\n if (fullText !== prevText && mastraEvent.type !== \"message_start\") {\n const delta = fullText.slice(prevText.length);\n out.push({\n type: \"message_update\",\n messageId: msg.id,\n delta,\n content: fullText,\n });\n }\n\n if (mastraEvent.type === \"message_end\") {\n // Finalize all thinking blocks\n thinkingParts.forEach((part, i) => {\n out.push({\n type: \"thinking_end\",\n thinkingId: `${msg.id}-thinking-${i}`,\n messageId: msg.id,\n content: part.thinking,\n });\n });\n out.push({ type: \"message_end\", messageId: msg.id, content: fullText });\n }\n\n prevMessages.set(msg.id, msg);\n return out;\n }\n\n // Pass through all other events as-is (they match SignalFlare's shape)\n return [mastraEvent as unknown as HarnessEvent];\n}\n\n/**\n * Wrap a Mastra `Harness` instance as a SignalFlare `HarnessAdapter`.\n *\n * Translates Mastra's event format (full `HarnessMessage` objects on\n * `message_update`) into SignalFlare's incremental event protocol, and extracts\n * `thinking` content parts into `thinking_start/delta/end` events so the\n * `AgentHarness` block can render them as collapsible reasoning blocks.\n */\nexport function fromMastraHarness(harness: {\n subscribe: (listener: (event: MastraHarnessEvent) => void) => () => void;\n sendMessage: (params: { content: string }) => void | Promise<void>;\n respondToToolApproval?: (params: {\n decision: \"approve\" | \"decline\";\n }) => void | Promise<void>;\n respondToQuestion?: (params: {\n questionId: string;\n answer: string;\n }) => void | Promise<void>;\n respondToPlanApproval?: (params: {\n planId: string;\n response: { action: \"approved\" | \"rejected\"; feedback?: string };\n }) => void | Promise<void>;\n abort?: () => void;\n steer?: (params: { content: string }) => void;\n selectMode?: (params: { modeId: string }) => void | Promise<void>;\n}): HarnessAdapter {\n return {\n subscribe(listener: (event: HarnessEvent) => void) {\n // Per-subscription message state for delta tracking\n const prevMessages = new Map<string, MastraHarnessMessage>();\n return harness.subscribe((mastraEvent) => {\n const translated = translateMastraEvent(mastraEvent, prevMessages);\n for (const ev of translated) listener(ev);\n });\n },\n sendMessage: harness.sendMessage.bind(harness),\n respondToToolApproval: harness.respondToToolApproval?.bind(harness),\n respondToQuestion: harness.respondToQuestion?.bind(harness),\n respondToPlanApproval: harness.respondToPlanApproval?.bind(harness),\n abort: harness.abort?.bind(harness),\n steer: harness.steer\n ? (params: { content: string }) => harness.steer!(params)\n : undefined,\n selectMode: harness.selectMode\n ? (params: { modeId: string }) => harness.selectMode!(params)\n : undefined,\n };\n}\n\n// ─── State Types ──────────────────────────────────────────────────────────────\n\n/** A single message in the conversation. */\nexport interface AgentMessage {\n id: string;\n role: \"user\" | \"assistant\" | \"system\";\n /** Accumulated text content. */\n content: string;\n /** Whether this message is currently streaming. */\n isStreaming: boolean;\n /** Tool calls attached to this message. */\n toolCallIds: string[];\n /** Subagent IDs spawned during this message. */\n subagentIds: string[];\n /** Thinking block IDs attached to this message (in order). */\n thinkingIds: string[];\n /** Whether this message has an active OM observation. */\n hasOMActivity: boolean;\n /** Whether this message has an approval request. */\n approvalMessageId?: string;\n /** Whether this message has a question. */\n questionId?: string;\n /** Whether this message has a plan approval. */\n planId?: string;\n}\n\n/** A model thinking/reasoning block attached to a message. */\nexport interface AgentThinking {\n id: string;\n /** Parent message ID. */\n messageId: string;\n /** Accumulated thinking text. */\n text: string;\n /** Whether this block is still streaming. */\n isStreaming: boolean;\n}\n\n/** Normalized tool call state. */\nexport interface AgentToolCall {\n id: string;\n toolName: string;\n /** Parent message ID (undefined if inside a subagent). */\n messageId?: string;\n /** Parent subagent ID (undefined if top-level). */\n subagentId?: string;\n state:\n | \"input-streaming\"\n | \"input-available\"\n | \"approval-requested\"\n | \"approval-responded\"\n | \"output-available\"\n | \"output-error\"\n | \"output-denied\";\n input?: unknown;\n inputBuffer?: string;\n output?: unknown;\n errorText?: string;\n summary?: string;\n durationMs?: number;\n approvalState?: \"awaiting\" | \"approved\" | \"declined\";\n /** Wall-clock ms when this tool call started. */\n startedAt?: number;\n /** Wall-clock ms when this tool call ended. */\n endedAt?: number;\n}\n\n/** Normalized subagent state. */\nexport interface AgentSubagent {\n id: string;\n agentType?: string;\n name?: string;\n modelId?: string;\n status: \"running\" | \"completed\" | \"error\";\n /** Accumulated text deltas. */\n content: string;\n /** Tool call IDs inside this subagent. */\n toolCallIds: string[];\n /** Parent message ID. */\n messageId?: string;\n durationMs?: number;\n error?: string;\n /** Wall-clock ms when this subagent started. */\n startedAt?: number;\n /** Wall-clock ms when this subagent ended. */\n endedAt?: number;\n}\n\n/** Observational memory activity item. */\nexport interface AgentOMActivity {\n id: string;\n type: \"observation\" | \"reflection\";\n status: \"streaming\" | \"completed\";\n text?: string;\n durationMs?: number;\n /** Which message this OM activity is attached to. */\n messageId?: string;\n}\n\n/** A pending question. */\nexport interface AgentQuestion {\n questionId: string;\n question: string;\n header?: string;\n options?: Array<{ label: string; description?: string }>;\n multiple?: boolean;\n allowCustom?: boolean;\n status: \"pending\" | \"answered\";\n answeredWith?: string;\n}\n\n/** A pending plan approval. */\nexport interface AgentPlanApproval {\n planId: string;\n title: string;\n description?: string;\n steps?: Array<{ id: string; label: string; description?: string }>;\n status: \"pending\" | \"approved\" | \"rejected\";\n}\n\n/** Task list state. */\nexport interface AgentTaskList {\n title?: string;\n tasks: Array<{\n id: string;\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\" | \"cancelled\";\n priority?: \"high\" | \"medium\" | \"low\";\n }>;\n}\n\n/** Usage/token stats. */\nexport interface AgentUsage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cost?: number;\n modelId?: string;\n}\n\n/** A notice/banner in the conversation. */\nexport interface AgentNotice {\n id: string;\n level: \"info\" | \"error\" | \"change\";\n message: string;\n /** Attach to a message ID for inline rendering, or undefined for standalone. */\n messageId?: string;\n}\n\n/** Full normalized harness UI state. */\nexport interface AgentHarnessState {\n /** Ordered list of message IDs. */\n messageIds: string[];\n /** Message map. */\n messages: Record<string, AgentMessage>;\n /** Tool call map. */\n toolCalls: Record<string, AgentToolCall>;\n /** Subagent map. */\n subagents: Record<string, AgentSubagent>;\n /** OM activity map. */\n omActivities: Record<string, AgentOMActivity>;\n /** Model thinking/reasoning blocks map. */\n thinkings: Record<string, AgentThinking>;\n /** Question map (by questionId). */\n questions: Record<string, AgentQuestion>;\n /** Plan approval map (by planId). */\n planApprovals: Record<string, AgentPlanApproval>;\n /** Notices/banners (inline in conversation). */\n notices: AgentNotice[];\n /** Current task list. */\n taskList: AgentTaskList | null;\n /** Token usage. */\n usage: AgentUsage | null;\n /** Whether the agent is currently running. */\n isRunning: boolean;\n /** Active mode. */\n modeId?: string;\n modeName?: string;\n /** Active model. */\n modelId?: string;\n modelName?: string;\n /** Active thread. */\n threadId?: string;\n /** Active pending tool approval (toolCallId). */\n pendingToolApprovalId?: string;\n /** Active pending question ID. */\n pendingQuestionId?: string;\n /** Active pending plan ID. */\n pendingPlanId?: string;\n /** Whether a workspace error is active. */\n workspaceError?: string;\n /**\n * Wall-clock ms when agent_start fired. Used by Commander timeline.\n * Resets on agent_start; cleared on RESET.\n */\n missionStartedAt?: number;\n /** Wall-clock ms when agent_end fired for the last run. */\n missionEndedAt?: number;\n /**\n * Ordered log of every event with its wall-clock timestamp.\n * Used by the Commander timeline to position blocks accurately.\n * Not rendered by AgentHarness — Commander reads it directly.\n */\n timeline: TimestampedHarnessEvent[];\n}\n\n/** A harness event stamped with the wall-clock time it was received. */\nexport interface TimestampedHarnessEvent {\n event: HarnessEvent;\n /** Date.now() at the moment the event was dispatched into the reducer. */\n timestamp: number;\n}\n\n// ─── Reducer ──────────────────────────────────────────────────────────────────\n\nconst initialState: AgentHarnessState = {\n messageIds: [],\n messages: {},\n toolCalls: {},\n subagents: {},\n omActivities: {},\n thinkings: {},\n questions: {},\n planApprovals: {},\n notices: [],\n taskList: null,\n usage: null,\n isRunning: false,\n timeline: [],\n};\n\n/**\n * Create an empty `AgentHarnessState` with optional partial overrides.\n *\n * Use this when operating in controlled mode — build or derive your own state\n * that conforms to `AgentHarnessState` and pass it directly to `<AgentHarness state={...} />`.\n *\n * @example\n * ```ts\n * const [state, setState] = useState(() => createAgentHarnessState());\n * ```\n */\nexport function createAgentHarnessState(\n partial?: Partial<AgentHarnessState>\n): AgentHarnessState {\n return { ...initialState, ...partial };\n}\n\nlet _noticeCounter = 0;\nfunction nextNoticeId() {\n return `notice-${++_noticeCounter}`;\n}\n\nfunction getErrorString(error: string | Error): string {\n return typeof error === \"string\" ? error : error.message;\n}\n\ntype AgentHarnessAction =\n | { type: \"EVENT\"; event: HarnessEvent; timestamp: number }\n | { type: \"RESET\" };\n\nfunction agentHarnessReducer(\n state: AgentHarnessState,\n action: AgentHarnessAction\n): AgentHarnessState {\n if (action.type === \"RESET\") return { ...initialState };\n\n const { event, timestamp } = action;\n\n // Append every event to the timeline log\n const timeline: TimestampedHarnessEvent[] = [\n ...state.timeline,\n { event, timestamp },\n ];\n\n switch (event.type) {\n // ── Agent lifecycle ─────────────────────────────────────────────────────\n case \"agent_start\":\n return {\n ...state,\n timeline,\n isRunning: true,\n missionStartedAt: state.missionStartedAt ?? timestamp,\n };\n\n case \"agent_end\":\n return {\n ...state,\n timeline,\n isRunning: false,\n missionEndedAt: timestamp,\n };\n\n // ── Message lifecycle ───────────────────────────────────────────────────\n case \"message_start\": {\n const msg: AgentMessage = {\n id: event.messageId,\n role: event.role,\n content: \"\",\n isStreaming: event.role === \"assistant\",\n toolCallIds: [],\n subagentIds: [],\n thinkingIds: [],\n hasOMActivity: false,\n };\n return {\n ...state,\n timeline,\n messageIds: [...state.messageIds, event.messageId],\n messages: { ...state.messages, [event.messageId]: msg },\n };\n }\n\n case \"message_update\": {\n const existing = state.messages[event.messageId];\n if (!existing) return { ...state, timeline };\n const newContent =\n event.content !== undefined\n ? event.content\n : existing.content + event.delta;\n return {\n ...state,\n timeline,\n messages: {\n ...state.messages,\n [event.messageId]: { ...existing, content: newContent },\n },\n };\n }\n\n case \"message_end\": {\n const existing = state.messages[event.messageId];\n if (!existing) return { ...state, timeline };\n return {\n ...state,\n timeline,\n messages: {\n ...state.messages,\n [event.messageId]: {\n ...existing,\n content: event.content,\n isStreaming: false,\n },\n },\n };\n }\n\n // ── Tool calls ──────────────────────────────────────────────────────────\n case \"tool_start\": {\n const toolCall: AgentToolCall = {\n id: event.toolCallId,\n toolName: event.toolName,\n messageId: event.messageId,\n subagentId: event.subagentId,\n state: \"input-streaming\",\n inputBuffer: \"\",\n startedAt: timestamp,\n };\n const updatedMessages = event.messageId\n ? {\n ...state.messages,\n [event.messageId]: {\n ...state.messages[event.messageId],\n toolCallIds: [\n ...(state.messages[event.messageId]?.toolCallIds ?? []),\n event.toolCallId,\n ],\n },\n }\n : state.messages;\n const updatedSubagents =\n event.subagentId && state.subagents[event.subagentId]\n ? {\n ...state.subagents,\n [event.subagentId]: {\n ...state.subagents[event.subagentId],\n toolCallIds: [\n ...state.subagents[event.subagentId].toolCallIds,\n event.toolCallId,\n ],\n },\n }\n : state.subagents;\n return {\n ...state,\n timeline,\n messages: updatedMessages,\n subagents: updatedSubagents,\n toolCalls: { ...state.toolCalls, [event.toolCallId]: toolCall },\n };\n }\n\n case \"tool_input_start\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n return {\n ...state,\n timeline,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n state: \"input-streaming\",\n inputBuffer: \"\",\n },\n },\n };\n }\n\n case \"tool_input_delta\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n return {\n ...state,\n timeline,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n inputBuffer: (tc.inputBuffer ?? \"\") + event.delta,\n },\n },\n };\n }\n\n case \"tool_input_end\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n return {\n ...state,\n timeline,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n state: \"input-available\",\n input: event.input,\n inputBuffer: undefined,\n },\n },\n };\n }\n\n case \"tool_approval_required\": {\n const tc = state.toolCalls[event.toolCallId] ?? {\n id: event.toolCallId,\n toolName: event.toolName,\n messageId: event.messageId,\n state: \"approval-requested\" as const,\n toolCallIds: [],\n startedAt: timestamp,\n };\n return {\n ...state,\n timeline,\n pendingToolApprovalId: event.toolCallId,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n state: \"approval-requested\",\n input: event.input ?? tc.input,\n approvalState: \"awaiting\",\n },\n },\n };\n }\n\n case \"tool_update\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n return {\n ...state,\n timeline,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: { ...tc, summary: event.summary ?? tc.summary },\n },\n };\n }\n\n case \"tool_end\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n const pendingApprovalId =\n state.pendingToolApprovalId === event.toolCallId\n ? undefined\n : state.pendingToolApprovalId;\n return {\n ...state,\n timeline,\n pendingToolApprovalId: pendingApprovalId,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n state: event.error ? \"output-error\" : \"output-available\",\n output: event.output,\n errorText: event.error,\n durationMs: event.durationMs,\n endedAt: timestamp,\n },\n },\n };\n }\n\n // ── Subagents ───────────────────────────────────────────────────────────\n case \"subagent_start\": {\n const subagent: AgentSubagent = {\n id: event.subagentId,\n agentType: event.agentType,\n name: event.name,\n modelId: event.modelId,\n status: \"running\",\n content: \"\",\n toolCallIds: [],\n messageId: event.parentMessageId,\n startedAt: timestamp,\n };\n const updatedMessages = event.parentMessageId\n ? {\n ...state.messages,\n [event.parentMessageId]: {\n ...state.messages[event.parentMessageId],\n subagentIds: [\n ...(state.messages[event.parentMessageId]?.subagentIds ?? []),\n event.subagentId,\n ],\n },\n }\n : state.messages;\n return {\n ...state,\n timeline,\n messages: updatedMessages,\n subagents: { ...state.subagents, [event.subagentId]: subagent },\n };\n }\n\n case \"subagent_text_delta\": {\n const sa = state.subagents[event.subagentId];\n if (!sa) return { ...state, timeline };\n return {\n ...state,\n timeline,\n subagents: {\n ...state.subagents,\n [event.subagentId]: { ...sa, content: sa.content + event.delta },\n },\n };\n }\n\n case \"subagent_tool_start\": {\n const tc: AgentToolCall = {\n id: event.toolCallId,\n toolName: event.toolName,\n subagentId: event.subagentId,\n state: \"input-streaming\",\n inputBuffer: \"\",\n startedAt: timestamp,\n };\n const sa = state.subagents[event.subagentId];\n const updatedSubagents = sa\n ? {\n ...state.subagents,\n [event.subagentId]: {\n ...sa,\n toolCallIds: [...sa.toolCallIds, event.toolCallId],\n },\n }\n : state.subagents;\n return {\n ...state,\n timeline,\n subagents: updatedSubagents,\n toolCalls: { ...state.toolCalls, [event.toolCallId]: tc },\n };\n }\n\n case \"subagent_tool_end\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n return {\n ...state,\n timeline,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n state: event.error ? \"output-error\" : \"output-available\",\n output: event.output,\n errorText: event.error,\n durationMs: event.durationMs,\n endedAt: timestamp,\n },\n },\n };\n }\n\n case \"subagent_end\": {\n const sa = state.subagents[event.subagentId];\n if (!sa) return { ...state, timeline };\n return {\n ...state,\n timeline,\n subagents: {\n ...state.subagents,\n [event.subagentId]: {\n ...sa,\n status: event.error ? \"error\" : \"completed\",\n error: event.error,\n durationMs: event.durationMs,\n endedAt: timestamp,\n },\n },\n };\n }\n\n case \"subagent_model_changed\": {\n if (event.subagentId) {\n const sa = state.subagents[event.subagentId];\n if (!sa) return { ...state, timeline };\n return {\n ...state,\n timeline,\n subagents: {\n ...state.subagents,\n [event.subagentId]: { ...sa, modelId: event.modelId },\n },\n };\n }\n return { ...state, timeline };\n }\n\n // ── Observational Memory ────────────────────────────────────────────────\n case \"om_observation_start\": {\n const id = event.observationId ?? `om-obs-${Date.now()}`;\n const activity: AgentOMActivity = {\n id,\n type: \"observation\",\n status: \"streaming\",\n messageId: state.messageIds[state.messageIds.length - 1],\n };\n return {\n ...state,\n timeline,\n omActivities: { ...state.omActivities, [id]: activity },\n };\n }\n\n case \"om_observation_end\": {\n const id =\n event.observationId ??\n Object.keys(state.omActivities).find(\n (k) =>\n state.omActivities[k].type === \"observation\" &&\n state.omActivities[k].status === \"streaming\"\n );\n if (!id) return { ...state, timeline };\n return {\n ...state,\n timeline,\n omActivities: {\n ...state.omActivities,\n [id]: {\n ...state.omActivities[id],\n status: \"completed\",\n text: event.text,\n durationMs: event.durationMs,\n },\n },\n };\n }\n\n case \"om_reflection_start\": {\n const id = `om-ref-${Date.now()}`;\n const activity: AgentOMActivity = {\n id,\n type: \"reflection\",\n status: \"streaming\",\n messageId: state.messageIds[state.messageIds.length - 1],\n };\n return {\n ...state,\n timeline,\n omActivities: { ...state.omActivities, [id]: activity },\n };\n }\n\n case \"om_reflection_end\": {\n const id = Object.keys(state.omActivities).find(\n (k) =>\n state.omActivities[k].type === \"reflection\" &&\n state.omActivities[k].status === \"streaming\"\n );\n if (!id) return { ...state, timeline };\n return {\n ...state,\n timeline,\n omActivities: {\n ...state.omActivities,\n [id]: {\n ...state.omActivities[id],\n status: \"completed\",\n text: event.text,\n durationMs: event.durationMs,\n },\n },\n };\n }\n\n // ── Thinking / Reasoning ────────────────────────────────────────────────\n case \"thinking_start\": {\n const thinking: AgentThinking = {\n id: event.thinkingId,\n messageId: event.messageId,\n text: \"\",\n isStreaming: true,\n };\n const existingMsg = state.messages[event.messageId];\n return {\n ...state,\n timeline,\n thinkings: { ...state.thinkings, [event.thinkingId]: thinking },\n messages: existingMsg\n ? {\n ...state.messages,\n [event.messageId]: {\n ...existingMsg,\n thinkingIds: [...existingMsg.thinkingIds, event.thinkingId],\n },\n }\n : state.messages,\n };\n }\n\n case \"thinking_delta\": {\n const existing = state.thinkings[event.thinkingId];\n if (!existing) return { ...state, timeline };\n const newText =\n event.content !== undefined\n ? event.content\n : existing.text + event.delta;\n return {\n ...state,\n timeline,\n thinkings: {\n ...state.thinkings,\n [event.thinkingId]: { ...existing, text: newText },\n },\n };\n }\n\n case \"thinking_end\": {\n const existing = state.thinkings[event.thinkingId];\n if (!existing) return { ...state, timeline };\n return {\n ...state,\n timeline,\n thinkings: {\n ...state.thinkings,\n [event.thinkingId]: {\n ...existing,\n text: event.content,\n isStreaming: false,\n },\n },\n };\n }\n\n // ── Questions + Plans ───────────────────────────────────────────────────\n case \"ask_question\": {\n const q: AgentQuestion = {\n questionId: event.questionId,\n question: event.question,\n header: event.header,\n options: event.options,\n multiple: event.multiple,\n allowCustom: event.allowCustom,\n status: \"pending\",\n };\n // Associate the question with the last message so it renders on the right message\n const lastMsgId = state.messageIds[state.messageIds.length - 1];\n const updatedMessages = lastMsgId\n ? {\n ...state.messages,\n [lastMsgId]: {\n ...state.messages[lastMsgId],\n questionId: event.questionId,\n },\n }\n : state.messages;\n return {\n ...state,\n timeline,\n pendingQuestionId: event.questionId,\n questions: { ...state.questions, [event.questionId]: q },\n messages: updatedMessages,\n };\n }\n\n case \"question_answered\": {\n const q = state.questions[event.questionId];\n if (!q) return { ...state, timeline };\n return {\n ...state,\n timeline,\n pendingQuestionId:\n state.pendingQuestionId === event.questionId\n ? undefined\n : state.pendingQuestionId,\n questions: {\n ...state.questions,\n [event.questionId]: {\n ...q,\n status: \"answered\",\n answeredWith: event.answer,\n },\n },\n };\n }\n\n case \"plan_approval_required\": {\n const p: AgentPlanApproval = {\n planId: event.planId,\n title: event.title,\n description: event.description,\n steps: event.steps,\n status: \"pending\",\n };\n // Associate the plan with the last message so it renders on the right message\n const lastMsgId = state.messageIds[state.messageIds.length - 1];\n const updatedMessages = lastMsgId\n ? {\n ...state.messages,\n [lastMsgId]: { ...state.messages[lastMsgId], planId: event.planId },\n }\n : state.messages;\n return {\n ...state,\n timeline,\n pendingPlanId: event.planId,\n planApprovals: { ...state.planApprovals, [event.planId]: p },\n messages: updatedMessages,\n };\n }\n\n case \"plan_approved\": {\n const p = state.planApprovals[event.planId];\n if (!p) return { ...state, timeline };\n return {\n ...state,\n timeline,\n pendingPlanId:\n state.pendingPlanId === event.planId\n ? undefined\n : state.pendingPlanId,\n planApprovals: {\n ...state.planApprovals,\n [event.planId]: { ...p, status: \"approved\" },\n },\n };\n }\n\n // ── Tasks ───────────────────────────────────────────────────────────────\n case \"task_updated\":\n return {\n ...state,\n timeline,\n taskList: { tasks: event.tasks, title: event.title },\n };\n\n // ── Usage ───────────────────────────────────────────────────────────────\n case \"usage_update\":\n return {\n ...state,\n timeline,\n usage: {\n inputTokens: event.inputTokens,\n outputTokens: event.outputTokens,\n totalTokens: event.totalTokens,\n cost: event.cost,\n modelId: event.modelId,\n },\n };\n\n // ── Notices ─────────────────────────────────────────────────────────────\n case \"error\": {\n const notice: AgentNotice = {\n id: nextNoticeId(),\n level: \"error\",\n message: getErrorString(event.error),\n messageId: event.messageId,\n };\n return { ...state, timeline, notices: [...state.notices, notice] };\n }\n\n case \"info\": {\n const notice: AgentNotice = {\n id: nextNoticeId(),\n level: \"info\",\n message: event.message,\n };\n return { ...state, timeline, notices: [...state.notices, notice] };\n }\n\n case \"follow_up_queued\": {\n const notice: AgentNotice = {\n id: nextNoticeId(),\n level: \"info\",\n message: `Follow-up queued: ${event.content}`,\n };\n return { ...state, timeline, notices: [...state.notices, notice] };\n }\n\n case \"workspace_error\":\n return {\n ...state,\n timeline,\n workspaceError: getErrorString(event.error),\n };\n\n case \"workspace_ready\":\n return { ...state, timeline, workspaceError: undefined };\n\n case \"workspace_status_changed\": {\n const notice: AgentNotice = {\n id: nextNoticeId(),\n level: \"info\",\n message: `Workspace: ${event.status}`,\n };\n return { ...state, timeline, notices: [...state.notices, notice] };\n }\n\n case \"mode_changed\":\n return {\n ...state,\n timeline,\n modeId: event.modeId,\n modeName: event.modeName,\n };\n\n case \"model_changed\":\n return {\n ...state,\n timeline,\n modelId: event.modelId,\n modelName: event.modelName,\n };\n\n case \"thread_changed\":\n return { ...initialState, threadId: event.threadId, timeline };\n\n case \"thread_created\":\n case \"thread_deleted\":\n case \"state_changed\":\n case \"om_status\":\n return { ...state, timeline };\n\n default:\n return { ...state, timeline };\n }\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\nexport interface UseAgentHarnessOptions {\n /** The harness adapter to subscribe to. Pass `null` to skip subscription. */\n adapter: HarnessAdapter | null;\n}\n\nexport interface UseAgentHarnessReturn {\n /** Full normalized harness UI state. */\n state: AgentHarnessState;\n /** Send a user message. */\n sendMessage: (params: {\n content: string;\n files?: Array<{ url: string; mediaType: string; filename: string }>;\n }) => Promise<void>;\n /** Respond to a pending tool approval. */\n respondToToolApproval: (decision: \"approve\" | \"decline\") => Promise<void>;\n /** Respond to a pending question. */\n respondToQuestion: (questionId: string, answer: string) => Promise<void>;\n /** Respond to a pending plan approval. */\n respondToPlanApproval: (\n planId: string,\n response: { action: \"approved\" | \"rejected\"; feedback?: string }\n ) => Promise<void>;\n /** Abort any in-progress generation. */\n abort: () => void;\n /** Steer the agent mid-stream. */\n steer: (content: string) => void;\n /** Select a mode. */\n selectMode: (modeId: string) => Promise<void>;\n /** Reset the state (e.g. after a thread switch). */\n reset: () => void;\n}\n\n/**\n * `useAgentHarness` — headless state hook for the AgentHarness UI.\n *\n * Subscribes to a `HarnessAdapter` and reduces all events into a single\n * normalized `AgentHarnessState` object that the `AgentHarness` block\n * (or any custom UI) can render from.\n *\n * @example\n * ```tsx\n * const adapter = fromMastraHarness(harness);\n * const { state, sendMessage, abort } = useAgentHarness({ adapter });\n * ```\n */\nexport function useAgentHarness({\n adapter,\n}: UseAgentHarnessOptions): UseAgentHarnessReturn {\n const [state, dispatch] = useReducer(agentHarnessReducer, initialState);\n\n // Keep a stable ref to the adapter so callbacks below don't stale-close\n const adapterRef = useRef<HarnessAdapter | null>(adapter);\n adapterRef.current = adapter;\n\n // Subscribe to harness events — stamp each with Date.now() for timeline\n useEffect(() => {\n if (!adapter) return;\n const unsubscribe = adapter.subscribe((event) => {\n dispatch({ type: \"EVENT\", event, timestamp: Date.now() });\n });\n return unsubscribe;\n }, [adapter]);\n\n const sendMessage = useCallback(\n async (params: {\n content: string;\n files?: Array<{ url: string; mediaType: string; filename: string }>;\n }) => {\n await adapterRef.current?.sendMessage(params);\n },\n []\n );\n\n const respondToToolApproval = useCallback(\n async (decision: \"approve\" | \"decline\") => {\n await adapterRef.current?.respondToToolApproval?.({ decision });\n },\n []\n );\n\n const respondToQuestion = useCallback(\n async (questionId: string, answer: string) => {\n await adapterRef.current?.respondToQuestion?.({ questionId, answer });\n },\n []\n );\n\n const respondToPlanApproval = useCallback(\n async (\n planId: string,\n response: { action: \"approved\" | \"rejected\"; feedback?: string }\n ) => {\n await adapterRef.current?.respondToPlanApproval?.({ planId, response });\n },\n []\n );\n\n const abort = useCallback(() => {\n adapterRef.current?.abort?.();\n }, []);\n\n const steer = useCallback((content: string) => {\n adapterRef.current?.steer?.({ content });\n }, []);\n\n const selectMode = useCallback(async (modeId: string) => {\n await adapterRef.current?.selectMode?.({ modeId });\n }, []);\n\n const reset = useCallback(() => {\n dispatch({ type: \"RESET\" });\n }, []);\n\n return {\n state,\n sendMessage,\n respondToToolApproval,\n respondToQuestion,\n respondToPlanApproval,\n abort,\n steer,\n selectMode,\n reset,\n };\n}\n"],"mappings":";;;AAMA,IAAa,gCAAgC,EAAE;AAC/C,IAAa,wCAAwC,EAAE;;;;;;;;AA+cvD,SAAS,qBACP,aACA,cACgB;CAChB,MAAM,MAAsB,EAAE;AAE9B,KACE,YAAY,SAAS,mBACrB,YAAY,SAAS,oBACrB,YAAY,SAAS,eACrB;EAGA,MAAM,MACJ,YAIA;EACF,MAAM,OAAO,aAAa,IAAI,IAAI,GAAG;AAErC,MAAI,YAAY,SAAS,gBACvB,KAAI,KAAK;GAAE,MAAM;GAAiB,WAAW,IAAI;GAAI,MAAM,IAAI;GAAM,CAAC;EAIxE,MAAM,YAAY,IAAI,QAAQ,QAC3B,MAA2C,EAAE,SAAS,OACxD;EACD,MAAM,gBAAgB,IAAI,QAAQ,QAC/B,MAAmD,EAAE,SAAS,WAChE;EAED,MAAM,WAAW,UAAU,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG;EACtD,MAAM,WAAW,OACb,KAAK,QACF,QAAQ,MAA2C,EAAE,SAAS,OAAO,CACrE,KAAK,MAAM,EAAE,KAAK,CAClB,KAAK,GAAG,GACX;EAIJ,MAAM,eAAe,OACjB,KAAK,QAAQ,QACV,MACC,EAAE,SAAS,WACd,GACD,EAAE;AAEN,gBAAc,SAAS,MAAM,MAAM;GACjC,MAAM,aAAa,GAAG,IAAI,GAAG,YAAY;GACzC,MAAM,WAAW,aAAa;AAC9B,OAAI,CAAC,UAAU;AAEb,QAAI,KAAK;KAAE,MAAM;KAAkB;KAAY,WAAW,IAAI;KAAI,CAAC;AACnE,QAAI,KAAK,SACP,KAAI,KAAK;KACP,MAAM;KACN;KACA,WAAW,IAAI;KACf,OAAO,KAAK;KACZ,SAAS,KAAK;KACf,CAAC;cAEK,KAAK,aAAa,SAAS,UAAU;IAE9C,MAAM,QAAQ,KAAK,SAAS,MAAM,SAAS,SAAS,OAAO;AAC3D,QAAI,MACF,KAAI,KAAK;KACP,MAAM;KACN;KACA,WAAW,IAAI;KACf;KACA,SAAS,KAAK;KACf,CAAC;;IAGN;AAGF,MAAI,aAAa,YAAY,YAAY,SAAS,iBAAiB;GACjE,MAAM,QAAQ,SAAS,MAAM,SAAS,OAAO;AAC7C,OAAI,KAAK;IACP,MAAM;IACN,WAAW,IAAI;IACf;IACA,SAAS;IACV,CAAC;;AAGJ,MAAI,YAAY,SAAS,eAAe;AAEtC,iBAAc,SAAS,MAAM,MAAM;AACjC,QAAI,KAAK;KACP,MAAM;KACN,YAAY,GAAG,IAAI,GAAG,YAAY;KAClC,WAAW,IAAI;KACf,SAAS,KAAK;KACf,CAAC;KACF;AACF,OAAI,KAAK;IAAE,MAAM;IAAe,WAAW,IAAI;IAAI,SAAS;IAAU,CAAC;;AAGzE,eAAa,IAAI,IAAI,IAAI,IAAI;AAC7B,SAAO;;AAIT,QAAO,CAAC,YAAuC;;;;;;;;;;AAWjD,SAAgB,kBAAkB,SAiBf;AACjB,QAAO;EACL,UAAU,UAAyC;GAEjD,MAAM,+BAAe,IAAI,KAAmC;AAC5D,UAAO,QAAQ,WAAW,gBAAgB;IACxC,MAAM,aAAa,qBAAqB,aAAa,aAAa;AAClE,SAAK,MAAM,MAAM,WAAY,UAAS,GAAG;KACzC;;EAEJ,aAAa,QAAQ,YAAY,KAAK,QAAQ;EAC9C,uBAAuB,QAAQ,uBAAuB,KAAK,QAAQ;EACnE,mBAAmB,QAAQ,mBAAmB,KAAK,QAAQ;EAC3D,uBAAuB,QAAQ,uBAAuB,KAAK,QAAQ;EACnE,OAAO,QAAQ,OAAO,KAAK,QAAQ;EACnC,OAAO,QAAQ,SACV,WAAgC,QAAQ,MAAO,OAAO,GACvD,KAAA;EACJ,YAAY,QAAQ,cACf,WAA+B,QAAQ,WAAY,OAAO,GAC3D,KAAA;EACL;;AAyNH,IAAM,eAAkC;CACtC,YAAY,EAAE;CACd,UAAU,EAAE;CACZ,WAAW,EAAE;CACb,WAAW,EAAE;CACb,cAAc,EAAE;CAChB,WAAW,EAAE;CACb,WAAW,EAAE;CACb,eAAe,EAAE;CACjB,SAAS,EAAE;CACX,UAAU;CACV,OAAO;CACP,WAAW;CACX,UAAU,EAAE;CACb;;;;;;;;;;;;AAaD,SAAgB,wBACd,SACmB;AACnB,QAAO;EAAE,GAAG;EAAc,GAAG;EAAS;;AAGxC,IAAI,iBAAiB;AACrB,SAAS,eAAe;AACtB,QAAO,UAAU,EAAE;;AAGrB,SAAS,eAAe,OAA+B;AACrD,QAAO,OAAO,UAAU,WAAW,QAAQ,MAAM;;AAOnD,SAAS,oBACP,OACA,QACmB;AACnB,KAAI,OAAO,SAAS,QAAS,QAAO,EAAE,GAAG,cAAc;CAEvD,MAAM,EAAE,OAAO,cAAc;CAG7B,MAAM,WAAsC,CAC1C,GAAG,MAAM,UACT;EAAE;EAAO;EAAW,CACrB;AAED,SAAQ,MAAM,MAAd;EAEE,KAAK,cACH,QAAO;GACL,GAAG;GACH;GACA,WAAW;GACX,kBAAkB,MAAM,oBAAoB;GAC7C;EAEH,KAAK,YACH,QAAO;GACL,GAAG;GACH;GACA,WAAW;GACX,gBAAgB;GACjB;EAGH,KAAK,iBAAiB;GACpB,MAAM,MAAoB;IACxB,IAAI,MAAM;IACV,MAAM,MAAM;IACZ,SAAS;IACT,aAAa,MAAM,SAAS;IAC5B,aAAa,EAAE;IACf,aAAa,EAAE;IACf,aAAa,EAAE;IACf,eAAe;IAChB;AACD,UAAO;IACL,GAAG;IACH;IACA,YAAY,CAAC,GAAG,MAAM,YAAY,MAAM,UAAU;IAClD,UAAU;KAAE,GAAG,MAAM;MAAW,MAAM,YAAY;KAAK;IACxD;;EAGH,KAAK,kBAAkB;GACrB,MAAM,WAAW,MAAM,SAAS,MAAM;AACtC,OAAI,CAAC,SAAU,QAAO;IAAE,GAAG;IAAO;IAAU;GAC5C,MAAM,aACJ,MAAM,YAAY,KAAA,IACd,MAAM,UACN,SAAS,UAAU,MAAM;AAC/B,UAAO;IACL,GAAG;IACH;IACA,UAAU;KACR,GAAG,MAAM;MACR,MAAM,YAAY;MAAE,GAAG;MAAU,SAAS;MAAY;KACxD;IACF;;EAGH,KAAK,eAAe;GAClB,MAAM,WAAW,MAAM,SAAS,MAAM;AACtC,OAAI,CAAC,SAAU,QAAO;IAAE,GAAG;IAAO;IAAU;AAC5C,UAAO;IACL,GAAG;IACH;IACA,UAAU;KACR,GAAG,MAAM;MACR,MAAM,YAAY;MACjB,GAAG;MACH,SAAS,MAAM;MACf,aAAa;MACd;KACF;IACF;;EAIH,KAAK,cAAc;GACjB,MAAM,WAA0B;IAC9B,IAAI,MAAM;IACV,UAAU,MAAM;IAChB,WAAW,MAAM;IACjB,YAAY,MAAM;IAClB,OAAO;IACP,aAAa;IACb,WAAW;IACZ;GACD,MAAM,kBAAkB,MAAM,YAC1B;IACE,GAAG,MAAM;KACR,MAAM,YAAY;KACjB,GAAG,MAAM,SAAS,MAAM;KACxB,aAAa,CACX,GAAI,MAAM,SAAS,MAAM,YAAY,eAAe,EAAE,EACtD,MAAM,WACP;KACF;IACF,GACD,MAAM;GACV,MAAM,mBACJ,MAAM,cAAc,MAAM,UAAU,MAAM,cACtC;IACE,GAAG,MAAM;KACR,MAAM,aAAa;KAClB,GAAG,MAAM,UAAU,MAAM;KACzB,aAAa,CACX,GAAG,MAAM,UAAU,MAAM,YAAY,aACrC,MAAM,WACP;KACF;IACF,GACD,MAAM;AACZ,UAAO;IACL,GAAG;IACH;IACA,UAAU;IACV,WAAW;IACX,WAAW;KAAE,GAAG,MAAM;MAAY,MAAM,aAAa;KAAU;IAChE;;EAGH,KAAK,oBAAoB;GACvB,MAAM,KAAK,MAAM,UAAU,MAAM;AACjC,OAAI,CAAC,GAAI,QAAO;IAAE,GAAG;IAAO;IAAU;AACtC,UAAO;IACL,GAAG;IACH;IACA,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAClB,GAAG;MACH,OAAO;MACP,aAAa;MACd;KACF;IACF;;EAGH,KAAK,oBAAoB;GACvB,MAAM,KAAK,MAAM,UAAU,MAAM;AACjC,OAAI,CAAC,GAAI,QAAO;IAAE,GAAG;IAAO;IAAU;AACtC,UAAO;IACL,GAAG;IACH;IACA,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAClB,GAAG;MACH,cAAc,GAAG,eAAe,MAAM,MAAM;MAC7C;KACF;IACF;;EAGH,KAAK,kBAAkB;GACrB,MAAM,KAAK,MAAM,UAAU,MAAM;AACjC,OAAI,CAAC,GAAI,QAAO;IAAE,GAAG;IAAO;IAAU;AACtC,UAAO;IACL,GAAG;IACH;IACA,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAClB,GAAG;MACH,OAAO;MACP,OAAO,MAAM;MACb,aAAa,KAAA;MACd;KACF;IACF;;EAGH,KAAK,0BAA0B;GAC7B,MAAM,KAAK,MAAM,UAAU,MAAM,eAAe;IAC9C,IAAI,MAAM;IACV,UAAU,MAAM;IAChB,WAAW,MAAM;IACjB,OAAO;IACP,aAAa,EAAE;IACf,WAAW;IACZ;AACD,UAAO;IACL,GAAG;IACH;IACA,uBAAuB,MAAM;IAC7B,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAClB,GAAG;MACH,OAAO;MACP,OAAO,MAAM,SAAS,GAAG;MACzB,eAAe;MAChB;KACF;IACF;;EAGH,KAAK,eAAe;GAClB,MAAM,KAAK,MAAM,UAAU,MAAM;AACjC,OAAI,CAAC,GAAI,QAAO;IAAE,GAAG;IAAO;IAAU;AACtC,UAAO;IACL,GAAG;IACH;IACA,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAAE,GAAG;MAAI,SAAS,MAAM,WAAW,GAAG;MAAS;KACpE;IACF;;EAGH,KAAK,YAAY;GACf,MAAM,KAAK,MAAM,UAAU,MAAM;AACjC,OAAI,CAAC,GAAI,QAAO;IAAE,GAAG;IAAO;IAAU;GACtC,MAAM,oBACJ,MAAM,0BAA0B,MAAM,aAClC,KAAA,IACA,MAAM;AACZ,UAAO;IACL,GAAG;IACH;IACA,uBAAuB;IACvB,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAClB,GAAG;MACH,OAAO,MAAM,QAAQ,iBAAiB;MACtC,QAAQ,MAAM;MACd,WAAW,MAAM;MACjB,YAAY,MAAM;MAClB,SAAS;MACV;KACF;IACF;;EAIH,KAAK,kBAAkB;GACrB,MAAM,WAA0B;IAC9B,IAAI,MAAM;IACV,WAAW,MAAM;IACjB,MAAM,MAAM;IACZ,SAAS,MAAM;IACf,QAAQ;IACR,SAAS;IACT,aAAa,EAAE;IACf,WAAW,MAAM;IACjB,WAAW;IACZ;GACD,MAAM,kBAAkB,MAAM,kBAC1B;IACE,GAAG,MAAM;KACR,MAAM,kBAAkB;KACvB,GAAG,MAAM,SAAS,MAAM;KACxB,aAAa,CACX,GAAI,MAAM,SAAS,MAAM,kBAAkB,eAAe,EAAE,EAC5D,MAAM,WACP;KACF;IACF,GACD,MAAM;AACV,UAAO;IACL,GAAG;IACH;IACA,UAAU;IACV,WAAW;KAAE,GAAG,MAAM;MAAY,MAAM,aAAa;KAAU;IAChE;;EAGH,KAAK,uBAAuB;GAC1B,MAAM,KAAK,MAAM,UAAU,MAAM;AACjC,OAAI,CAAC,GAAI,QAAO;IAAE,GAAG;IAAO;IAAU;AACtC,UAAO;IACL,GAAG;IACH;IACA,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAAE,GAAG;MAAI,SAAS,GAAG,UAAU,MAAM;MAAO;KACjE;IACF;;EAGH,KAAK,uBAAuB;GAC1B,MAAM,KAAoB;IACxB,IAAI,MAAM;IACV,UAAU,MAAM;IAChB,YAAY,MAAM;IAClB,OAAO;IACP,aAAa;IACb,WAAW;IACZ;GACD,MAAM,KAAK,MAAM,UAAU,MAAM;GACjC,MAAM,mBAAmB,KACrB;IACE,GAAG,MAAM;KACR,MAAM,aAAa;KAClB,GAAG;KACH,aAAa,CAAC,GAAG,GAAG,aAAa,MAAM,WAAW;KACnD;IACF,GACD,MAAM;AACV,UAAO;IACL,GAAG;IACH;IACA,WAAW;IACX,WAAW;KAAE,GAAG,MAAM;MAAY,MAAM,aAAa;KAAI;IAC1D;;EAGH,KAAK,qBAAqB;GACxB,MAAM,KAAK,MAAM,UAAU,MAAM;AACjC,OAAI,CAAC,GAAI,QAAO;IAAE,GAAG;IAAO;IAAU;AACtC,UAAO;IACL,GAAG;IACH;IACA,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAClB,GAAG;MACH,OAAO,MAAM,QAAQ,iBAAiB;MACtC,QAAQ,MAAM;MACd,WAAW,MAAM;MACjB,YAAY,MAAM;MAClB,SAAS;MACV;KACF;IACF;;EAGH,KAAK,gBAAgB;GACnB,MAAM,KAAK,MAAM,UAAU,MAAM;AACjC,OAAI,CAAC,GAAI,QAAO;IAAE,GAAG;IAAO;IAAU;AACtC,UAAO;IACL,GAAG;IACH;IACA,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAClB,GAAG;MACH,QAAQ,MAAM,QAAQ,UAAU;MAChC,OAAO,MAAM;MACb,YAAY,MAAM;MAClB,SAAS;MACV;KACF;IACF;;EAGH,KAAK;AACH,OAAI,MAAM,YAAY;IACpB,MAAM,KAAK,MAAM,UAAU,MAAM;AACjC,QAAI,CAAC,GAAI,QAAO;KAAE,GAAG;KAAO;KAAU;AACtC,WAAO;KACL,GAAG;KACH;KACA,WAAW;MACT,GAAG,MAAM;OACR,MAAM,aAAa;OAAE,GAAG;OAAI,SAAS,MAAM;OAAS;MACtD;KACF;;AAEH,UAAO;IAAE,GAAG;IAAO;IAAU;EAI/B,KAAK,wBAAwB;GAC3B,MAAM,KAAK,MAAM,iBAAiB,UAAU,KAAK,KAAK;GACtD,MAAM,WAA4B;IAChC;IACA,MAAM;IACN,QAAQ;IACR,WAAW,MAAM,WAAW,MAAM,WAAW,SAAS;IACvD;AACD,UAAO;IACL,GAAG;IACH;IACA,cAAc;KAAE,GAAG,MAAM;MAAe,KAAK;KAAU;IACxD;;EAGH,KAAK,sBAAsB;GACzB,MAAM,KACJ,MAAM,iBACN,OAAO,KAAK,MAAM,aAAa,CAAC,MAC7B,MACC,MAAM,aAAa,GAAG,SAAS,iBAC/B,MAAM,aAAa,GAAG,WAAW,YACpC;AACH,OAAI,CAAC,GAAI,QAAO;IAAE,GAAG;IAAO;IAAU;AACtC,UAAO;IACL,GAAG;IACH;IACA,cAAc;KACZ,GAAG,MAAM;MACR,KAAK;MACJ,GAAG,MAAM,aAAa;MACtB,QAAQ;MACR,MAAM,MAAM;MACZ,YAAY,MAAM;MACnB;KACF;IACF;;EAGH,KAAK,uBAAuB;GAC1B,MAAM,KAAK,UAAU,KAAK,KAAK;GAC/B,MAAM,WAA4B;IAChC;IACA,MAAM;IACN,QAAQ;IACR,WAAW,MAAM,WAAW,MAAM,WAAW,SAAS;IACvD;AACD,UAAO;IACL,GAAG;IACH;IACA,cAAc;KAAE,GAAG,MAAM;MAAe,KAAK;KAAU;IACxD;;EAGH,KAAK,qBAAqB;GACxB,MAAM,KAAK,OAAO,KAAK,MAAM,aAAa,CAAC,MACxC,MACC,MAAM,aAAa,GAAG,SAAS,gBAC/B,MAAM,aAAa,GAAG,WAAW,YACpC;AACD,OAAI,CAAC,GAAI,QAAO;IAAE,GAAG;IAAO;IAAU;AACtC,UAAO;IACL,GAAG;IACH;IACA,cAAc;KACZ,GAAG,MAAM;MACR,KAAK;MACJ,GAAG,MAAM,aAAa;MACtB,QAAQ;MACR,MAAM,MAAM;MACZ,YAAY,MAAM;MACnB;KACF;IACF;;EAIH,KAAK,kBAAkB;GACrB,MAAM,WAA0B;IAC9B,IAAI,MAAM;IACV,WAAW,MAAM;IACjB,MAAM;IACN,aAAa;IACd;GACD,MAAM,cAAc,MAAM,SAAS,MAAM;AACzC,UAAO;IACL,GAAG;IACH;IACA,WAAW;KAAE,GAAG,MAAM;MAAY,MAAM,aAAa;KAAU;IAC/D,UAAU,cACN;KACE,GAAG,MAAM;MACR,MAAM,YAAY;MACjB,GAAG;MACH,aAAa,CAAC,GAAG,YAAY,aAAa,MAAM,WAAW;MAC5D;KACF,GACD,MAAM;IACX;;EAGH,KAAK,kBAAkB;GACrB,MAAM,WAAW,MAAM,UAAU,MAAM;AACvC,OAAI,CAAC,SAAU,QAAO;IAAE,GAAG;IAAO;IAAU;GAC5C,MAAM,UACJ,MAAM,YAAY,KAAA,IACd,MAAM,UACN,SAAS,OAAO,MAAM;AAC5B,UAAO;IACL,GAAG;IACH;IACA,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAAE,GAAG;MAAU,MAAM;MAAS;KACnD;IACF;;EAGH,KAAK,gBAAgB;GACnB,MAAM,WAAW,MAAM,UAAU,MAAM;AACvC,OAAI,CAAC,SAAU,QAAO;IAAE,GAAG;IAAO;IAAU;AAC5C,UAAO;IACL,GAAG;IACH;IACA,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAClB,GAAG;MACH,MAAM,MAAM;MACZ,aAAa;MACd;KACF;IACF;;EAIH,KAAK,gBAAgB;GACnB,MAAM,IAAmB;IACvB,YAAY,MAAM;IAClB,UAAU,MAAM;IAChB,QAAQ,MAAM;IACd,SAAS,MAAM;IACf,UAAU,MAAM;IAChB,aAAa,MAAM;IACnB,QAAQ;IACT;GAED,MAAM,YAAY,MAAM,WAAW,MAAM,WAAW,SAAS;GAC7D,MAAM,kBAAkB,YACpB;IACE,GAAG,MAAM;KACR,YAAY;KACX,GAAG,MAAM,SAAS;KAClB,YAAY,MAAM;KACnB;IACF,GACD,MAAM;AACV,UAAO;IACL,GAAG;IACH;IACA,mBAAmB,MAAM;IACzB,WAAW;KAAE,GAAG,MAAM;MAAY,MAAM,aAAa;KAAG;IACxD,UAAU;IACX;;EAGH,KAAK,qBAAqB;GACxB,MAAM,IAAI,MAAM,UAAU,MAAM;AAChC,OAAI,CAAC,EAAG,QAAO;IAAE,GAAG;IAAO;IAAU;AACrC,UAAO;IACL,GAAG;IACH;IACA,mBACE,MAAM,sBAAsB,MAAM,aAC9B,KAAA,IACA,MAAM;IACZ,WAAW;KACT,GAAG,MAAM;MACR,MAAM,aAAa;MAClB,GAAG;MACH,QAAQ;MACR,cAAc,MAAM;MACrB;KACF;IACF;;EAGH,KAAK,0BAA0B;GAC7B,MAAM,IAAuB;IAC3B,QAAQ,MAAM;IACd,OAAO,MAAM;IACb,aAAa,MAAM;IACnB,OAAO,MAAM;IACb,QAAQ;IACT;GAED,MAAM,YAAY,MAAM,WAAW,MAAM,WAAW,SAAS;GAC7D,MAAM,kBAAkB,YACpB;IACE,GAAG,MAAM;KACR,YAAY;KAAE,GAAG,MAAM,SAAS;KAAY,QAAQ,MAAM;KAAQ;IACpE,GACD,MAAM;AACV,UAAO;IACL,GAAG;IACH;IACA,eAAe,MAAM;IACrB,eAAe;KAAE,GAAG,MAAM;MAAgB,MAAM,SAAS;KAAG;IAC5D,UAAU;IACX;;EAGH,KAAK,iBAAiB;GACpB,MAAM,IAAI,MAAM,cAAc,MAAM;AACpC,OAAI,CAAC,EAAG,QAAO;IAAE,GAAG;IAAO;IAAU;AACrC,UAAO;IACL,GAAG;IACH;IACA,eACE,MAAM,kBAAkB,MAAM,SAC1B,KAAA,IACA,MAAM;IACZ,eAAe;KACb,GAAG,MAAM;MACR,MAAM,SAAS;MAAE,GAAG;MAAG,QAAQ;MAAY;KAC7C;IACF;;EAIH,KAAK,eACH,QAAO;GACL,GAAG;GACH;GACA,UAAU;IAAE,OAAO,MAAM;IAAO,OAAO,MAAM;IAAO;GACrD;EAGH,KAAK,eACH,QAAO;GACL,GAAG;GACH;GACA,OAAO;IACL,aAAa,MAAM;IACnB,cAAc,MAAM;IACpB,aAAa,MAAM;IACnB,MAAM,MAAM;IACZ,SAAS,MAAM;IAChB;GACF;EAGH,KAAK,SAAS;GACZ,MAAM,SAAsB;IAC1B,IAAI,cAAc;IAClB,OAAO;IACP,SAAS,eAAe,MAAM,MAAM;IACpC,WAAW,MAAM;IAClB;AACD,UAAO;IAAE,GAAG;IAAO;IAAU,SAAS,CAAC,GAAG,MAAM,SAAS,OAAO;IAAE;;EAGpE,KAAK,QAAQ;GACX,MAAM,SAAsB;IAC1B,IAAI,cAAc;IAClB,OAAO;IACP,SAAS,MAAM;IAChB;AACD,UAAO;IAAE,GAAG;IAAO;IAAU,SAAS,CAAC,GAAG,MAAM,SAAS,OAAO;IAAE;;EAGpE,KAAK,oBAAoB;GACvB,MAAM,SAAsB;IAC1B,IAAI,cAAc;IAClB,OAAO;IACP,SAAS,qBAAqB,MAAM;IACrC;AACD,UAAO;IAAE,GAAG;IAAO;IAAU,SAAS,CAAC,GAAG,MAAM,SAAS,OAAO;IAAE;;EAGpE,KAAK,kBACH,QAAO;GACL,GAAG;GACH;GACA,gBAAgB,eAAe,MAAM,MAAM;GAC5C;EAEH,KAAK,kBACH,QAAO;GAAE,GAAG;GAAO;GAAU,gBAAgB,KAAA;GAAW;EAE1D,KAAK,4BAA4B;GAC/B,MAAM,SAAsB;IAC1B,IAAI,cAAc;IAClB,OAAO;IACP,SAAS,cAAc,MAAM;IAC9B;AACD,UAAO;IAAE,GAAG;IAAO;IAAU,SAAS,CAAC,GAAG,MAAM,SAAS,OAAO;IAAE;;EAGpE,KAAK,eACH,QAAO;GACL,GAAG;GACH;GACA,QAAQ,MAAM;GACd,UAAU,MAAM;GACjB;EAEH,KAAK,gBACH,QAAO;GACL,GAAG;GACH;GACA,SAAS,MAAM;GACf,WAAW,MAAM;GAClB;EAEH,KAAK,iBACH,QAAO;GAAE,GAAG;GAAc,UAAU,MAAM;GAAU;GAAU;EAEhE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YACH,QAAO;GAAE,GAAG;GAAO;GAAU;EAE/B,QACE,QAAO;GAAE,GAAG;GAAO;GAAU;;;;;;;;;;;;;;;;AAmDnC,SAAgB,gBAAgB,EAC9B,WACgD;CAChD,MAAM,CAAC,OAAO,YAAY,WAAW,qBAAqB,aAAa;CAGvE,MAAM,aAAa,OAA8B,QAAQ;AACzD,YAAW,UAAU;AAGrB,iBAAgB;AACd,MAAI,CAAC,QAAS;AAId,SAHoB,QAAQ,WAAW,UAAU;AAC/C,YAAS;IAAE,MAAM;IAAS;IAAO,WAAW,KAAK,KAAK;IAAE,CAAC;IACzD;IAED,CAAC,QAAQ,CAAC;AAoDb,QAAO;EACL;EACA,aApDkB,YAClB,OAAO,WAGD;AACJ,SAAM,WAAW,SAAS,YAAY,OAAO;KAE/C,EAAE,CACH;EA6CC,uBA3C4B,YAC5B,OAAO,aAAoC;AACzC,SAAM,WAAW,SAAS,wBAAwB,EAAE,UAAU,CAAC;KAEjE,EAAE,CACH;EAuCC,mBArCwB,YACxB,OAAO,YAAoB,WAAmB;AAC5C,SAAM,WAAW,SAAS,oBAAoB;IAAE;IAAY;IAAQ,CAAC;KAEvE,EAAE,CACH;EAiCC,uBA/B4B,YAC5B,OACE,QACA,aACG;AACH,SAAM,WAAW,SAAS,wBAAwB;IAAE;IAAQ;IAAU,CAAC;KAEzE,EAAE,CACH;EAwBC,OAtBY,kBAAkB;AAC9B,cAAW,SAAS,SAAS;KAC5B,EAAE,CAAC;EAqBJ,OAnBY,aAAa,YAAoB;AAC7C,cAAW,SAAS,QAAQ,EAAE,SAAS,CAAC;KACvC,EAAE,CAAC;EAkBJ,YAhBiB,YAAY,OAAO,WAAmB;AACvD,SAAM,WAAW,SAAS,aAAa,EAAE,QAAQ,CAAC;KACjD,EAAE,CAAC;EAeJ,OAbY,kBAAkB;AAC9B,YAAS,EAAE,MAAM,SAAS,CAAC;KAC1B,EAAE,CAAC;EAYL"}
|
|
1
|
+
{"version":3,"file":"use-agent-harness-Dl8w6X5O.js","names":[],"sources":["../src/components/use-agent-harness/use-agent-harness.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useReducer, useRef } from \"react\";\n\n// ─── Variants (required by SignalFlare conventions) ───────────────────────────────────\n\nexport const SF_USE_AGENT_HARNESS_VARIANTS = {} as const;\nexport const SF_USE_AGENT_HARNESS_DEFAULT_VARIANTS = {} as const;\n\n// ─── Harness Event Types ──────────────────────────────────────────────────────\n\n/** All event types emitted by a Mastra Harness instance. */\nexport type HarnessEventType =\n | \"mode_changed\"\n | \"model_changed\"\n | \"thread_changed\"\n | \"thread_created\"\n | \"thread_deleted\"\n | \"state_changed\"\n | \"agent_start\"\n | \"agent_end\"\n | \"message_start\"\n | \"message_update\"\n | \"message_end\"\n | \"tool_start\"\n | \"tool_approval_required\"\n | \"tool_update\"\n | \"tool_end\"\n | \"tool_input_start\"\n | \"tool_input_delta\"\n | \"tool_input_end\"\n | \"usage_update\"\n | \"error\"\n | \"info\"\n | \"follow_up_queued\"\n | \"workspace_status_changed\"\n | \"workspace_ready\"\n | \"workspace_error\"\n | \"om_status\"\n | \"om_observation_start\"\n | \"om_observation_end\"\n | \"om_reflection_start\"\n | \"om_reflection_end\"\n | \"ask_question\"\n | \"question_answered\"\n | \"plan_approval_required\"\n | \"plan_approved\"\n | \"subagent_start\"\n | \"subagent_text_delta\"\n | \"subagent_tool_start\"\n | \"subagent_tool_end\"\n | \"subagent_end\"\n | \"subagent_model_changed\"\n | \"task_updated\"\n | \"thinking_start\"\n | \"thinking_delta\"\n | \"thinking_end\";\n\n/** Base shape of all harness events. */\nexport interface HarnessEventBase {\n type: HarnessEventType;\n}\n\nexport interface HarnessModeChangedEvent extends HarnessEventBase {\n type: \"mode_changed\";\n modeId: string;\n modeName: string;\n}\n\nexport interface HarnessModelChangedEvent extends HarnessEventBase {\n type: \"model_changed\";\n modelId: string;\n modelName?: string;\n}\n\nexport interface HarnessThreadChangedEvent extends HarnessEventBase {\n type: \"thread_changed\";\n threadId: string;\n}\n\nexport interface HarnessThreadCreatedEvent extends HarnessEventBase {\n type: \"thread_created\";\n threadId: string;\n}\n\nexport interface HarnessThreadDeletedEvent extends HarnessEventBase {\n type: \"thread_deleted\";\n threadId: string;\n}\n\nexport interface HarnessStateChangedEvent extends HarnessEventBase {\n type: \"state_changed\";\n state: Record<string, unknown>;\n changedKeys: string[];\n}\n\nexport interface HarnessAgentStartEvent extends HarnessEventBase {\n type: \"agent_start\";\n}\n\nexport interface HarnessAgentEndEvent extends HarnessEventBase {\n type: \"agent_end\";\n}\n\nexport interface HarnessMessageStartEvent extends HarnessEventBase {\n type: \"message_start\";\n messageId: string;\n role: \"assistant\" | \"user\" | \"system\";\n}\n\nexport interface HarnessMessageUpdateEvent extends HarnessEventBase {\n type: \"message_update\";\n messageId: string;\n delta: string;\n content?: string;\n}\n\nexport interface HarnessMessageEndEvent extends HarnessEventBase {\n type: \"message_end\";\n messageId: string;\n content: string;\n}\n\nexport interface HarnessToolStartEvent extends HarnessEventBase {\n type: \"tool_start\";\n toolCallId: string;\n toolName: string;\n messageId?: string;\n subagentId?: string;\n}\n\nexport interface HarnessToolApprovalRequiredEvent extends HarnessEventBase {\n type: \"tool_approval_required\";\n toolCallId: string;\n toolName: string;\n input?: unknown;\n messageId?: string;\n}\n\nexport interface HarnessToolUpdateEvent extends HarnessEventBase {\n type: \"tool_update\";\n toolCallId: string;\n summary?: string;\n progress?: number;\n}\n\nexport interface HarnessToolEndEvent extends HarnessEventBase {\n type: \"tool_end\";\n toolCallId: string;\n output?: unknown;\n error?: string;\n durationMs?: number;\n}\n\nexport interface HarnessToolInputStartEvent extends HarnessEventBase {\n type: \"tool_input_start\";\n toolCallId: string;\n}\n\nexport interface HarnessToolInputDeltaEvent extends HarnessEventBase {\n type: \"tool_input_delta\";\n toolCallId: string;\n delta: string;\n}\n\nexport interface HarnessToolInputEndEvent extends HarnessEventBase {\n type: \"tool_input_end\";\n toolCallId: string;\n input: unknown;\n}\n\nexport interface HarnessUsageUpdateEvent extends HarnessEventBase {\n type: \"usage_update\";\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cost?: number;\n modelId?: string;\n}\n\nexport interface HarnessErrorEvent extends HarnessEventBase {\n type: \"error\";\n error: string | Error;\n messageId?: string;\n}\n\nexport interface HarnessInfoEvent extends HarnessEventBase {\n type: \"info\";\n message: string;\n}\n\nexport interface HarnessFollowUpQueuedEvent extends HarnessEventBase {\n type: \"follow_up_queued\";\n content: string;\n}\n\nexport interface HarnessWorkspaceStatusChangedEvent extends HarnessEventBase {\n type: \"workspace_status_changed\";\n status: string;\n}\n\nexport interface HarnessWorkspaceReadyEvent extends HarnessEventBase {\n type: \"workspace_ready\";\n}\n\nexport interface HarnessWorkspaceErrorEvent extends HarnessEventBase {\n type: \"workspace_error\";\n error: string | Error;\n}\n\nexport interface HarnessOMStatusEvent extends HarnessEventBase {\n type: \"om_status\";\n generationCount?: number;\n observationTokenCount?: number;\n activeObservations?: number;\n}\n\nexport interface HarnessOMObservationStartEvent extends HarnessEventBase {\n type: \"om_observation_start\";\n observationId?: string;\n}\n\nexport interface HarnessOMObservationEndEvent extends HarnessEventBase {\n type: \"om_observation_end\";\n observationId?: string;\n text?: string;\n durationMs?: number;\n}\n\nexport interface HarnessOMReflectionStartEvent extends HarnessEventBase {\n type: \"om_reflection_start\";\n}\n\nexport interface HarnessOMReflectionEndEvent extends HarnessEventBase {\n type: \"om_reflection_end\";\n text?: string;\n durationMs?: number;\n}\n\nexport interface HarnessAskQuestionEvent extends HarnessEventBase {\n type: \"ask_question\";\n questionId: string;\n question: string;\n header?: string;\n options?: Array<{ label: string; description?: string }>;\n multiple?: boolean;\n allowCustom?: boolean;\n}\n\nexport interface HarnessQuestionAnsweredEvent extends HarnessEventBase {\n type: \"question_answered\";\n questionId: string;\n answer: string;\n}\n\nexport interface HarnessPlanApprovalRequiredEvent extends HarnessEventBase {\n type: \"plan_approval_required\";\n planId: string;\n title: string;\n description?: string;\n steps?: Array<{ id: string; label: string; description?: string }>;\n}\n\nexport interface HarnessPlanApprovedEvent extends HarnessEventBase {\n type: \"plan_approved\";\n planId: string;\n}\n\nexport interface HarnessSubagentStartEvent extends HarnessEventBase {\n type: \"subagent_start\";\n subagentId: string;\n agentType?: string;\n name?: string;\n modelId?: string;\n parentMessageId?: string;\n}\n\nexport interface HarnessSubagentTextDeltaEvent extends HarnessEventBase {\n type: \"subagent_text_delta\";\n subagentId: string;\n delta: string;\n}\n\nexport interface HarnessSubagentToolStartEvent extends HarnessEventBase {\n type: \"subagent_tool_start\";\n subagentId: string;\n toolCallId: string;\n toolName: string;\n}\n\nexport interface HarnessSubagentToolEndEvent extends HarnessEventBase {\n type: \"subagent_tool_end\";\n subagentId: string;\n toolCallId: string;\n output?: unknown;\n error?: string;\n durationMs?: number;\n}\n\nexport interface HarnessSubagentEndEvent extends HarnessEventBase {\n type: \"subagent_end\";\n subagentId: string;\n error?: string;\n durationMs?: number;\n}\n\nexport interface HarnessSubagentModelChangedEvent extends HarnessEventBase {\n type: \"subagent_model_changed\";\n subagentId?: string;\n modelId: string;\n agentType?: string;\n}\n\nexport interface HarnessTaskUpdatedEvent extends HarnessEventBase {\n type: \"task_updated\";\n tasks: Array<{\n id: string;\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\" | \"cancelled\";\n priority?: \"high\" | \"medium\" | \"low\";\n }>;\n title?: string;\n}\n\n/** Emitted when the model begins a thinking/reasoning block. */\nexport interface HarnessThinkingStartEvent extends HarnessEventBase {\n type: \"thinking_start\";\n thinkingId: string;\n messageId: string;\n}\n\n/** Emitted for each incremental chunk of thinking text. */\nexport interface HarnessThinkingDeltaEvent extends HarnessEventBase {\n type: \"thinking_delta\";\n thinkingId: string;\n messageId: string;\n /** Incremental text to append. */\n delta: string;\n /** Full text so far (if available). */\n content?: string;\n}\n\n/** Emitted when a thinking block is complete. */\nexport interface HarnessThinkingEndEvent extends HarnessEventBase {\n type: \"thinking_end\";\n thinkingId: string;\n messageId: string;\n /** Final accumulated thinking text. */\n content: string;\n}\n\n/** Union of all typed harness events. */\nexport type HarnessEvent =\n | HarnessModeChangedEvent\n | HarnessModelChangedEvent\n | HarnessThreadChangedEvent\n | HarnessThreadCreatedEvent\n | HarnessThreadDeletedEvent\n | HarnessStateChangedEvent\n | HarnessAgentStartEvent\n | HarnessAgentEndEvent\n | HarnessMessageStartEvent\n | HarnessMessageUpdateEvent\n | HarnessMessageEndEvent\n | HarnessToolStartEvent\n | HarnessToolApprovalRequiredEvent\n | HarnessToolUpdateEvent\n | HarnessToolEndEvent\n | HarnessToolInputStartEvent\n | HarnessToolInputDeltaEvent\n | HarnessToolInputEndEvent\n | HarnessUsageUpdateEvent\n | HarnessErrorEvent\n | HarnessInfoEvent\n | HarnessFollowUpQueuedEvent\n | HarnessWorkspaceStatusChangedEvent\n | HarnessWorkspaceReadyEvent\n | HarnessWorkspaceErrorEvent\n | HarnessOMStatusEvent\n | HarnessOMObservationStartEvent\n | HarnessOMObservationEndEvent\n | HarnessOMReflectionStartEvent\n | HarnessOMReflectionEndEvent\n | HarnessAskQuestionEvent\n | HarnessQuestionAnsweredEvent\n | HarnessPlanApprovalRequiredEvent\n | HarnessPlanApprovedEvent\n | HarnessSubagentStartEvent\n | HarnessSubagentTextDeltaEvent\n | HarnessSubagentToolStartEvent\n | HarnessSubagentToolEndEvent\n | HarnessSubagentEndEvent\n | HarnessSubagentModelChangedEvent\n | HarnessTaskUpdatedEvent\n | HarnessThinkingStartEvent\n | HarnessThinkingDeltaEvent\n | HarnessThinkingEndEvent;\n\n// ─── Adapter Interface ────────────────────────────────────────────────────────\n\n/**\n * Minimal adapter interface for driving the AgentHarness UI.\n * Implement this to connect any event source — Mastra Harness, mock, replay, etc.\n */\nexport interface HarnessAdapter {\n /** Register an event listener. Returns an unsubscribe function. */\n subscribe: (listener: (event: HarnessEvent) => void) => () => void;\n /** Send a user message. */\n sendMessage: (params: {\n content: string;\n files?: Array<{ url: string; mediaType: string; filename: string }>;\n }) => void | Promise<void>;\n /** Respond to a pending tool approval. */\n respondToToolApproval?: (params: {\n decision: \"approve\" | \"decline\";\n }) => void | Promise<void>;\n /** Respond to a pending question. */\n respondToQuestion?: (params: {\n questionId: string;\n answer: string;\n }) => void | Promise<void>;\n /** Respond to a pending plan approval. */\n respondToPlanApproval?: (params: {\n planId: string;\n response: { action: \"approved\" | \"rejected\"; feedback?: string };\n }) => void | Promise<void>;\n /** Abort any in-progress generation. */\n abort?: () => void;\n /** Steer the agent mid-stream. */\n steer?: (params: { content: string }) => void;\n /** Select a mode. */\n selectMode?: (params: { modeId: string }) => void | Promise<void>;\n}\n\n/**\n * Create a HarnessAdapter from a real Mastra Harness instance.\n * The Mastra harness type is not imported to avoid a hard dependency.\n */\n// ─── Mastra → SignalFlare event translation ───────────────────────────────────────────\n\n/** Mastra's HarnessMessage content part (subset we care about). */\ntype MastraContentPart =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; thinking: string }\n | { type: \"tool_call\"; id: string; name: string; args: unknown }\n | { type: string; [key: string]: unknown };\n\n/** Mastra's HarnessMessage shape (from @mastra/core). */\ninterface MastraHarnessMessage {\n id: string;\n role: \"user\" | \"assistant\" | \"system\";\n content: MastraContentPart[];\n createdAt: Date;\n stopReason?: \"complete\" | \"tool_use\" | \"aborted\" | \"error\";\n}\n\n/** Mastra's raw HarnessEvent union (only the fields we translate). */\ntype MastraHarnessEvent =\n | { type: \"message_start\"; message: MastraHarnessMessage }\n | { type: \"message_update\"; message: MastraHarnessMessage }\n | { type: \"message_end\"; message: MastraHarnessMessage }\n | { type: string; [key: string]: unknown };\n\n/**\n * Translate a Mastra HarnessEvent into one or more SignalFlare HarnessEvents.\n *\n * Mastra sends full HarnessMessage objects on message_update/end, while SignalFlare\n * expects incremental deltas + separate thinking events. This function\n * bridges the gap.\n */\nfunction translateMastraEvent(\n mastraEvent: MastraHarnessEvent,\n prevMessages: Map<string, MastraHarnessMessage>\n): HarnessEvent[] {\n const out: HarnessEvent[] = [];\n\n if (\n mastraEvent.type === \"message_start\" ||\n mastraEvent.type === \"message_update\" ||\n mastraEvent.type === \"message_end\"\n ) {\n // TypeScript needs an explicit cast here because the catch-all arm in\n // MastraHarnessEvent doesn't carry `.message`. We've already narrowed via type.\n const msg = (\n mastraEvent as {\n type: \"message_start\" | \"message_update\" | \"message_end\";\n message: MastraHarnessMessage;\n }\n ).message;\n const prev = prevMessages.get(msg.id);\n\n if (mastraEvent.type === \"message_start\") {\n out.push({ type: \"message_start\", messageId: msg.id, role: msg.role });\n }\n\n // Extract text and thinking parts from content array\n const textParts = msg.content.filter(\n (p): p is { type: \"text\"; text: string } => p.type === \"text\"\n );\n const thinkingParts = msg.content.filter(\n (p): p is { type: \"thinking\"; thinking: string } => p.type === \"thinking\"\n );\n\n const fullText = textParts.map((p) => p.text).join(\"\");\n const prevText = prev\n ? prev.content\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : \"\";\n\n // Emit thinking blocks — each thinking part gets its own thinking_start/end\n // We compare against previous to only emit new/changed thinking blocks\n const prevThinking = prev\n ? prev.content.filter(\n (p): p is { type: \"thinking\"; thinking: string } =>\n p.type === \"thinking\"\n )\n : [];\n\n thinkingParts.forEach((part, i) => {\n const thinkingId = `${msg.id}-thinking-${i}`;\n const prevPart = prevThinking[i];\n if (!prevPart) {\n // New thinking block\n out.push({ type: \"thinking_start\", thinkingId, messageId: msg.id });\n if (part.thinking) {\n out.push({\n type: \"thinking_delta\",\n thinkingId,\n messageId: msg.id,\n delta: part.thinking,\n content: part.thinking,\n });\n }\n } else if (part.thinking !== prevPart.thinking) {\n // Updated thinking block — emit delta\n const delta = part.thinking.slice(prevPart.thinking.length);\n if (delta) {\n out.push({\n type: \"thinking_delta\",\n thinkingId,\n messageId: msg.id,\n delta,\n content: part.thinking,\n });\n }\n }\n });\n\n // Emit text delta if content changed\n if (fullText !== prevText && mastraEvent.type !== \"message_start\") {\n const delta = fullText.slice(prevText.length);\n out.push({\n type: \"message_update\",\n messageId: msg.id,\n delta,\n content: fullText,\n });\n }\n\n if (mastraEvent.type === \"message_end\") {\n // Finalize all thinking blocks\n thinkingParts.forEach((part, i) => {\n out.push({\n type: \"thinking_end\",\n thinkingId: `${msg.id}-thinking-${i}`,\n messageId: msg.id,\n content: part.thinking,\n });\n });\n out.push({ type: \"message_end\", messageId: msg.id, content: fullText });\n }\n\n prevMessages.set(msg.id, msg);\n return out;\n }\n\n // Pass through all other events as-is (they match SignalFlare's shape)\n return [mastraEvent as unknown as HarnessEvent];\n}\n\n/**\n * Wrap a Mastra `Harness` instance as a SignalFlare `HarnessAdapter`.\n *\n * Translates Mastra's event format (full `HarnessMessage` objects on\n * `message_update`) into SignalFlare's incremental event protocol, and extracts\n * `thinking` content parts into `thinking_start/delta/end` events so the\n * `AgentHarness` block can render them as collapsible reasoning blocks.\n */\nexport function fromMastraHarness(harness: {\n subscribe: (listener: (event: MastraHarnessEvent) => void) => () => void;\n sendMessage: (params: { content: string }) => void | Promise<void>;\n respondToToolApproval?: (params: {\n decision: \"approve\" | \"decline\";\n }) => void | Promise<void>;\n respondToQuestion?: (params: {\n questionId: string;\n answer: string;\n }) => void | Promise<void>;\n respondToPlanApproval?: (params: {\n planId: string;\n response: { action: \"approved\" | \"rejected\"; feedback?: string };\n }) => void | Promise<void>;\n abort?: () => void;\n steer?: (params: { content: string }) => void;\n selectMode?: (params: { modeId: string }) => void | Promise<void>;\n}): HarnessAdapter {\n return {\n subscribe(listener: (event: HarnessEvent) => void) {\n // Per-subscription message state for delta tracking\n const prevMessages = new Map<string, MastraHarnessMessage>();\n return harness.subscribe((mastraEvent) => {\n const translated = translateMastraEvent(mastraEvent, prevMessages);\n for (const ev of translated) listener(ev);\n });\n },\n sendMessage: harness.sendMessage.bind(harness),\n respondToToolApproval: harness.respondToToolApproval?.bind(harness),\n respondToQuestion: harness.respondToQuestion?.bind(harness),\n respondToPlanApproval: harness.respondToPlanApproval?.bind(harness),\n abort: harness.abort?.bind(harness),\n steer: harness.steer\n ? (params: { content: string }) => harness.steer!(params)\n : undefined,\n selectMode: harness.selectMode\n ? (params: { modeId: string }) => harness.selectMode!(params)\n : undefined,\n };\n}\n\n// ─── State Types ──────────────────────────────────────────────────────────────\n\n/** A single message in the conversation. */\nexport interface AgentMessage {\n id: string;\n role: \"user\" | \"assistant\" | \"system\";\n /** Accumulated text content. */\n content: string;\n /** Whether this message is currently streaming. */\n isStreaming: boolean;\n /** Tool calls attached to this message. */\n toolCallIds: string[];\n /** Subagent IDs spawned during this message. */\n subagentIds: string[];\n /** Thinking block IDs attached to this message (in order). */\n thinkingIds: string[];\n /** Whether this message has an active OM observation. */\n hasOMActivity: boolean;\n /** Whether this message has an approval request. */\n approvalMessageId?: string;\n /** Whether this message has a question. */\n questionId?: string;\n /** Whether this message has a plan approval. */\n planId?: string;\n}\n\n/** A model thinking/reasoning block attached to a message. */\nexport interface AgentThinking {\n id: string;\n /** Parent message ID. */\n messageId: string;\n /** Accumulated thinking text. */\n text: string;\n /** Whether this block is still streaming. */\n isStreaming: boolean;\n}\n\n/** Normalized tool call state. */\nexport interface AgentToolCall {\n id: string;\n toolName: string;\n /** Parent message ID (undefined if inside a subagent). */\n messageId?: string;\n /** Parent subagent ID (undefined if top-level). */\n subagentId?: string;\n state:\n | \"input-streaming\"\n | \"input-available\"\n | \"approval-requested\"\n | \"approval-responded\"\n | \"output-available\"\n | \"output-error\"\n | \"output-denied\";\n input?: unknown;\n inputBuffer?: string;\n output?: unknown;\n errorText?: string;\n summary?: string;\n durationMs?: number;\n approvalState?: \"awaiting\" | \"approved\" | \"declined\";\n /** Wall-clock ms when this tool call started. */\n startedAt?: number;\n /** Wall-clock ms when this tool call ended. */\n endedAt?: number;\n}\n\n/** Normalized subagent state. */\nexport interface AgentSubagent {\n id: string;\n agentType?: string;\n name?: string;\n modelId?: string;\n status: \"running\" | \"completed\" | \"error\";\n /** Accumulated text deltas. */\n content: string;\n /** Tool call IDs inside this subagent. */\n toolCallIds: string[];\n /** Parent message ID. */\n messageId?: string;\n durationMs?: number;\n error?: string;\n /** Wall-clock ms when this subagent started. */\n startedAt?: number;\n /** Wall-clock ms when this subagent ended. */\n endedAt?: number;\n}\n\n/** Observational memory activity item. */\nexport interface AgentOMActivity {\n id: string;\n type: \"observation\" | \"reflection\";\n status: \"streaming\" | \"completed\";\n text?: string;\n durationMs?: number;\n /** Which message this OM activity is attached to. */\n messageId?: string;\n}\n\n/** A pending question. */\nexport interface AgentQuestion {\n questionId: string;\n question: string;\n header?: string;\n options?: Array<{ label: string; description?: string }>;\n multiple?: boolean;\n allowCustom?: boolean;\n status: \"pending\" | \"answered\";\n answeredWith?: string;\n}\n\n/** A pending plan approval. */\nexport interface AgentPlanApproval {\n planId: string;\n title: string;\n description?: string;\n steps?: Array<{ id: string; label: string; description?: string }>;\n status: \"pending\" | \"approved\" | \"rejected\";\n}\n\n/** Task list state. */\nexport interface AgentTaskList {\n title?: string;\n tasks: Array<{\n id: string;\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\" | \"cancelled\";\n priority?: \"high\" | \"medium\" | \"low\";\n }>;\n}\n\n/** Usage/token stats. */\nexport interface AgentUsage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cost?: number;\n modelId?: string;\n}\n\n/** A notice/banner in the conversation. */\nexport interface AgentNotice {\n id: string;\n level: \"info\" | \"error\" | \"change\";\n message: string;\n /** Attach to a message ID for inline rendering, or undefined for standalone. */\n messageId?: string;\n}\n\n/** Full normalized harness UI state. */\nexport interface AgentHarnessState {\n /** Ordered list of message IDs. */\n messageIds: string[];\n /** Message map. */\n messages: Record<string, AgentMessage>;\n /** Tool call map. */\n toolCalls: Record<string, AgentToolCall>;\n /** Subagent map. */\n subagents: Record<string, AgentSubagent>;\n /** OM activity map. */\n omActivities: Record<string, AgentOMActivity>;\n /** Model thinking/reasoning blocks map. */\n thinkings: Record<string, AgentThinking>;\n /** Question map (by questionId). */\n questions: Record<string, AgentQuestion>;\n /** Plan approval map (by planId). */\n planApprovals: Record<string, AgentPlanApproval>;\n /** Notices/banners (inline in conversation). */\n notices: AgentNotice[];\n /** Current task list. */\n taskList: AgentTaskList | null;\n /** Token usage. */\n usage: AgentUsage | null;\n /** Whether the agent is currently running. */\n isRunning: boolean;\n /** Active mode. */\n modeId?: string;\n modeName?: string;\n /** Active model. */\n modelId?: string;\n modelName?: string;\n /** Active thread. */\n threadId?: string;\n /** Active pending tool approval (toolCallId). */\n pendingToolApprovalId?: string;\n /** Active pending question ID. */\n pendingQuestionId?: string;\n /** Active pending plan ID. */\n pendingPlanId?: string;\n /** Whether a workspace error is active. */\n workspaceError?: string;\n /**\n * Wall-clock ms when agent_start fired. Used by Commander timeline.\n * Resets on agent_start; cleared on RESET.\n */\n missionStartedAt?: number;\n /** Wall-clock ms when agent_end fired for the last run. */\n missionEndedAt?: number;\n /**\n * Ordered log of every event with its wall-clock timestamp.\n * Used by the Commander timeline to position blocks accurately.\n * Not rendered by AgentHarness — Commander reads it directly.\n */\n timeline: TimestampedHarnessEvent[];\n}\n\n/** A harness event stamped with the wall-clock time it was received. */\nexport interface TimestampedHarnessEvent {\n event: HarnessEvent;\n /** Date.now() at the moment the event was dispatched into the reducer. */\n timestamp: number;\n}\n\n// ─── Reducer ──────────────────────────────────────────────────────────────────\n\nconst initialState: AgentHarnessState = {\n messageIds: [],\n messages: {},\n toolCalls: {},\n subagents: {},\n omActivities: {},\n thinkings: {},\n questions: {},\n planApprovals: {},\n notices: [],\n taskList: null,\n usage: null,\n isRunning: false,\n timeline: [],\n};\n\n/**\n * Create an empty `AgentHarnessState` with optional partial overrides.\n *\n * Use this when operating in controlled mode — build or derive your own state\n * that conforms to `AgentHarnessState` and pass it directly to `<AgentHarness state={...} />`.\n *\n * @example\n * ```ts\n * const [state, setState] = useState(() => createAgentHarnessState());\n * ```\n */\nexport function createAgentHarnessState(\n partial?: Partial<AgentHarnessState>\n): AgentHarnessState {\n return { ...initialState, ...partial };\n}\n\nlet _noticeCounter = 0;\nfunction nextNoticeId() {\n return `notice-${++_noticeCounter}`;\n}\n\nfunction getErrorString(error: string | Error): string {\n return typeof error === \"string\" ? error : error.message;\n}\n\ntype AgentHarnessAction =\n | { type: \"EVENT\"; event: HarnessEvent; timestamp: number }\n | { type: \"RESET\" };\n\nfunction agentHarnessReducer(\n state: AgentHarnessState,\n action: AgentHarnessAction\n): AgentHarnessState {\n if (action.type === \"RESET\") return { ...initialState };\n\n const { event, timestamp } = action;\n\n // Append every event to the timeline log\n const timeline: TimestampedHarnessEvent[] = [\n ...state.timeline,\n { event, timestamp },\n ];\n\n switch (event.type) {\n // ── Agent lifecycle ─────────────────────────────────────────────────────\n case \"agent_start\":\n return {\n ...state,\n timeline,\n isRunning: true,\n missionStartedAt: state.missionStartedAt ?? timestamp,\n };\n\n case \"agent_end\":\n return {\n ...state,\n timeline,\n isRunning: false,\n missionEndedAt: timestamp,\n };\n\n // ── Message lifecycle ───────────────────────────────────────────────────\n case \"message_start\": {\n const msg: AgentMessage = {\n id: event.messageId,\n role: event.role,\n content: \"\",\n isStreaming: event.role === \"assistant\",\n toolCallIds: [],\n subagentIds: [],\n thinkingIds: [],\n hasOMActivity: false,\n };\n return {\n ...state,\n timeline,\n messageIds: [...state.messageIds, event.messageId],\n messages: { ...state.messages, [event.messageId]: msg },\n };\n }\n\n case \"message_update\": {\n const existing = state.messages[event.messageId];\n if (!existing) return { ...state, timeline };\n const newContent =\n event.content === undefined\n ? existing.content + event.delta\n : event.content;\n return {\n ...state,\n timeline,\n messages: {\n ...state.messages,\n [event.messageId]: { ...existing, content: newContent },\n },\n };\n }\n\n case \"message_end\": {\n const existing = state.messages[event.messageId];\n if (!existing) return { ...state, timeline };\n return {\n ...state,\n timeline,\n messages: {\n ...state.messages,\n [event.messageId]: {\n ...existing,\n content: event.content,\n isStreaming: false,\n },\n },\n };\n }\n\n // ── Tool calls ──────────────────────────────────────────────────────────\n case \"tool_start\": {\n const toolCall: AgentToolCall = {\n id: event.toolCallId,\n toolName: event.toolName,\n messageId: event.messageId,\n subagentId: event.subagentId,\n state: \"input-streaming\",\n inputBuffer: \"\",\n startedAt: timestamp,\n };\n const updatedMessages = event.messageId\n ? {\n ...state.messages,\n [event.messageId]: {\n ...state.messages[event.messageId],\n toolCallIds: [\n ...(state.messages[event.messageId]?.toolCallIds ?? []),\n event.toolCallId,\n ],\n },\n }\n : state.messages;\n const updatedSubagents =\n event.subagentId && state.subagents[event.subagentId]\n ? {\n ...state.subagents,\n [event.subagentId]: {\n ...state.subagents[event.subagentId],\n toolCallIds: [\n ...state.subagents[event.subagentId].toolCallIds,\n event.toolCallId,\n ],\n },\n }\n : state.subagents;\n return {\n ...state,\n timeline,\n messages: updatedMessages,\n subagents: updatedSubagents,\n toolCalls: { ...state.toolCalls, [event.toolCallId]: toolCall },\n };\n }\n\n case \"tool_input_start\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n return {\n ...state,\n timeline,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n state: \"input-streaming\",\n inputBuffer: \"\",\n },\n },\n };\n }\n\n case \"tool_input_delta\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n return {\n ...state,\n timeline,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n inputBuffer: (tc.inputBuffer ?? \"\") + event.delta,\n },\n },\n };\n }\n\n case \"tool_input_end\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n return {\n ...state,\n timeline,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n state: \"input-available\",\n input: event.input,\n inputBuffer: undefined,\n },\n },\n };\n }\n\n case \"tool_approval_required\": {\n const tc = state.toolCalls[event.toolCallId] ?? {\n id: event.toolCallId,\n toolName: event.toolName,\n messageId: event.messageId,\n state: \"approval-requested\" as const,\n toolCallIds: [],\n startedAt: timestamp,\n };\n return {\n ...state,\n timeline,\n pendingToolApprovalId: event.toolCallId,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n state: \"approval-requested\",\n input: event.input ?? tc.input,\n approvalState: \"awaiting\",\n },\n },\n };\n }\n\n case \"tool_update\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n return {\n ...state,\n timeline,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: { ...tc, summary: event.summary ?? tc.summary },\n },\n };\n }\n\n case \"tool_end\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n const pendingApprovalId =\n state.pendingToolApprovalId === event.toolCallId\n ? undefined\n : state.pendingToolApprovalId;\n return {\n ...state,\n timeline,\n pendingToolApprovalId: pendingApprovalId,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n state: event.error ? \"output-error\" : \"output-available\",\n output: event.output,\n errorText: event.error,\n durationMs: event.durationMs,\n endedAt: timestamp,\n },\n },\n };\n }\n\n // ── Subagents ───────────────────────────────────────────────────────────\n case \"subagent_start\": {\n const subagent: AgentSubagent = {\n id: event.subagentId,\n agentType: event.agentType,\n name: event.name,\n modelId: event.modelId,\n status: \"running\",\n content: \"\",\n toolCallIds: [],\n messageId: event.parentMessageId,\n startedAt: timestamp,\n };\n const updatedMessages = event.parentMessageId\n ? {\n ...state.messages,\n [event.parentMessageId]: {\n ...state.messages[event.parentMessageId],\n subagentIds: [\n ...(state.messages[event.parentMessageId]?.subagentIds ?? []),\n event.subagentId,\n ],\n },\n }\n : state.messages;\n return {\n ...state,\n timeline,\n messages: updatedMessages,\n subagents: { ...state.subagents, [event.subagentId]: subagent },\n };\n }\n\n case \"subagent_text_delta\": {\n const sa = state.subagents[event.subagentId];\n if (!sa) return { ...state, timeline };\n return {\n ...state,\n timeline,\n subagents: {\n ...state.subagents,\n [event.subagentId]: { ...sa, content: sa.content + event.delta },\n },\n };\n }\n\n case \"subagent_tool_start\": {\n const tc: AgentToolCall = {\n id: event.toolCallId,\n toolName: event.toolName,\n subagentId: event.subagentId,\n state: \"input-streaming\",\n inputBuffer: \"\",\n startedAt: timestamp,\n };\n const sa = state.subagents[event.subagentId];\n const updatedSubagents = sa\n ? {\n ...state.subagents,\n [event.subagentId]: {\n ...sa,\n toolCallIds: [...sa.toolCallIds, event.toolCallId],\n },\n }\n : state.subagents;\n return {\n ...state,\n timeline,\n subagents: updatedSubagents,\n toolCalls: { ...state.toolCalls, [event.toolCallId]: tc },\n };\n }\n\n case \"subagent_tool_end\": {\n const tc = state.toolCalls[event.toolCallId];\n if (!tc) return { ...state, timeline };\n return {\n ...state,\n timeline,\n toolCalls: {\n ...state.toolCalls,\n [event.toolCallId]: {\n ...tc,\n state: event.error ? \"output-error\" : \"output-available\",\n output: event.output,\n errorText: event.error,\n durationMs: event.durationMs,\n endedAt: timestamp,\n },\n },\n };\n }\n\n case \"subagent_end\": {\n const sa = state.subagents[event.subagentId];\n if (!sa) return { ...state, timeline };\n return {\n ...state,\n timeline,\n subagents: {\n ...state.subagents,\n [event.subagentId]: {\n ...sa,\n status: event.error ? \"error\" : \"completed\",\n error: event.error,\n durationMs: event.durationMs,\n endedAt: timestamp,\n },\n },\n };\n }\n\n case \"subagent_model_changed\": {\n if (event.subagentId) {\n const sa = state.subagents[event.subagentId];\n if (!sa) return { ...state, timeline };\n return {\n ...state,\n timeline,\n subagents: {\n ...state.subagents,\n [event.subagentId]: { ...sa, modelId: event.modelId },\n },\n };\n }\n return { ...state, timeline };\n }\n\n // ── Observational Memory ────────────────────────────────────────────────\n case \"om_observation_start\": {\n const id = event.observationId ?? `om-obs-${Date.now()}`;\n const activity: AgentOMActivity = {\n id,\n type: \"observation\",\n status: \"streaming\",\n messageId: state.messageIds[state.messageIds.length - 1],\n };\n return {\n ...state,\n timeline,\n omActivities: { ...state.omActivities, [id]: activity },\n };\n }\n\n case \"om_observation_end\": {\n const id =\n event.observationId ??\n Object.keys(state.omActivities).find(\n (k) =>\n state.omActivities[k].type === \"observation\" &&\n state.omActivities[k].status === \"streaming\"\n );\n if (!id) return { ...state, timeline };\n return {\n ...state,\n timeline,\n omActivities: {\n ...state.omActivities,\n [id]: {\n ...state.omActivities[id],\n status: \"completed\",\n text: event.text,\n durationMs: event.durationMs,\n },\n },\n };\n }\n\n case \"om_reflection_start\": {\n const id = `om-ref-${Date.now()}`;\n const activity: AgentOMActivity = {\n id,\n type: \"reflection\",\n status: \"streaming\",\n messageId: state.messageIds[state.messageIds.length - 1],\n };\n return {\n ...state,\n timeline,\n omActivities: { ...state.omActivities, [id]: activity },\n };\n }\n\n case \"om_reflection_end\": {\n const id = Object.keys(state.omActivities).find(\n (k) =>\n state.omActivities[k].type === \"reflection\" &&\n state.omActivities[k].status === \"streaming\"\n );\n if (!id) return { ...state, timeline };\n return {\n ...state,\n timeline,\n omActivities: {\n ...state.omActivities,\n [id]: {\n ...state.omActivities[id],\n status: \"completed\",\n text: event.text,\n durationMs: event.durationMs,\n },\n },\n };\n }\n\n // ── Thinking / Reasoning ────────────────────────────────────────────────\n case \"thinking_start\": {\n const thinking: AgentThinking = {\n id: event.thinkingId,\n messageId: event.messageId,\n text: \"\",\n isStreaming: true,\n };\n const existingMsg = state.messages[event.messageId];\n return {\n ...state,\n timeline,\n thinkings: { ...state.thinkings, [event.thinkingId]: thinking },\n messages: existingMsg\n ? {\n ...state.messages,\n [event.messageId]: {\n ...existingMsg,\n thinkingIds: [...existingMsg.thinkingIds, event.thinkingId],\n },\n }\n : state.messages,\n };\n }\n\n case \"thinking_delta\": {\n const existing = state.thinkings[event.thinkingId];\n if (!existing) return { ...state, timeline };\n const newText =\n event.content === undefined\n ? existing.text + event.delta\n : event.content;\n return {\n ...state,\n timeline,\n thinkings: {\n ...state.thinkings,\n [event.thinkingId]: { ...existing, text: newText },\n },\n };\n }\n\n case \"thinking_end\": {\n const existing = state.thinkings[event.thinkingId];\n if (!existing) return { ...state, timeline };\n return {\n ...state,\n timeline,\n thinkings: {\n ...state.thinkings,\n [event.thinkingId]: {\n ...existing,\n text: event.content,\n isStreaming: false,\n },\n },\n };\n }\n\n // ── Questions + Plans ───────────────────────────────────────────────────\n case \"ask_question\": {\n const q: AgentQuestion = {\n questionId: event.questionId,\n question: event.question,\n header: event.header,\n options: event.options,\n multiple: event.multiple,\n allowCustom: event.allowCustom,\n status: \"pending\",\n };\n // Associate the question with the last message so it renders on the right message\n const lastMsgId = state.messageIds[state.messageIds.length - 1];\n const updatedMessages = lastMsgId\n ? {\n ...state.messages,\n [lastMsgId]: {\n ...state.messages[lastMsgId],\n questionId: event.questionId,\n },\n }\n : state.messages;\n return {\n ...state,\n timeline,\n pendingQuestionId: event.questionId,\n questions: { ...state.questions, [event.questionId]: q },\n messages: updatedMessages,\n };\n }\n\n case \"question_answered\": {\n const q = state.questions[event.questionId];\n if (!q) return { ...state, timeline };\n return {\n ...state,\n timeline,\n pendingQuestionId:\n state.pendingQuestionId === event.questionId\n ? undefined\n : state.pendingQuestionId,\n questions: {\n ...state.questions,\n [event.questionId]: {\n ...q,\n status: \"answered\",\n answeredWith: event.answer,\n },\n },\n };\n }\n\n case \"plan_approval_required\": {\n const p: AgentPlanApproval = {\n planId: event.planId,\n title: event.title,\n description: event.description,\n steps: event.steps,\n status: \"pending\",\n };\n // Associate the plan with the last message so it renders on the right message\n const lastMsgId = state.messageIds[state.messageIds.length - 1];\n const updatedMessages = lastMsgId\n ? {\n ...state.messages,\n [lastMsgId]: { ...state.messages[lastMsgId], planId: event.planId },\n }\n : state.messages;\n return {\n ...state,\n timeline,\n pendingPlanId: event.planId,\n planApprovals: { ...state.planApprovals, [event.planId]: p },\n messages: updatedMessages,\n };\n }\n\n case \"plan_approved\": {\n const p = state.planApprovals[event.planId];\n if (!p) return { ...state, timeline };\n return {\n ...state,\n timeline,\n pendingPlanId:\n state.pendingPlanId === event.planId\n ? undefined\n : state.pendingPlanId,\n planApprovals: {\n ...state.planApprovals,\n [event.planId]: { ...p, status: \"approved\" },\n },\n };\n }\n\n // ── Tasks ───────────────────────────────────────────────────────────────\n case \"task_updated\":\n return {\n ...state,\n timeline,\n taskList: { tasks: event.tasks, title: event.title },\n };\n\n // ── Usage ───────────────────────────────────────────────────────────────\n case \"usage_update\":\n return {\n ...state,\n timeline,\n usage: {\n inputTokens: event.inputTokens,\n outputTokens: event.outputTokens,\n totalTokens: event.totalTokens,\n cost: event.cost,\n modelId: event.modelId,\n },\n };\n\n // ── Notices ─────────────────────────────────────────────────────────────\n case \"error\": {\n const notice: AgentNotice = {\n id: nextNoticeId(),\n level: \"error\",\n message: getErrorString(event.error),\n messageId: event.messageId,\n };\n return { ...state, timeline, notices: [...state.notices, notice] };\n }\n\n case \"info\": {\n const notice: AgentNotice = {\n id: nextNoticeId(),\n level: \"info\",\n message: event.message,\n };\n return { ...state, timeline, notices: [...state.notices, notice] };\n }\n\n case \"follow_up_queued\": {\n const notice: AgentNotice = {\n id: nextNoticeId(),\n level: \"info\",\n message: `Follow-up queued: ${event.content}`,\n };\n return { ...state, timeline, notices: [...state.notices, notice] };\n }\n\n case \"workspace_error\":\n return {\n ...state,\n timeline,\n workspaceError: getErrorString(event.error),\n };\n\n case \"workspace_ready\":\n return { ...state, timeline, workspaceError: undefined };\n\n case \"workspace_status_changed\": {\n const notice: AgentNotice = {\n id: nextNoticeId(),\n level: \"info\",\n message: `Workspace: ${event.status}`,\n };\n return { ...state, timeline, notices: [...state.notices, notice] };\n }\n\n case \"mode_changed\":\n return {\n ...state,\n timeline,\n modeId: event.modeId,\n modeName: event.modeName,\n };\n\n case \"model_changed\":\n return {\n ...state,\n timeline,\n modelId: event.modelId,\n modelName: event.modelName,\n };\n\n case \"thread_changed\":\n return { ...initialState, threadId: event.threadId, timeline };\n\n case \"thread_created\":\n case \"thread_deleted\":\n case \"state_changed\":\n case \"om_status\":\n return { ...state, timeline };\n\n default:\n return { ...state, timeline };\n }\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\nexport interface UseAgentHarnessOptions {\n /** The harness adapter to subscribe to. Pass `null` to skip subscription. */\n adapter: HarnessAdapter | null;\n}\n\nexport interface UseAgentHarnessReturn {\n /** Full normalized harness UI state. */\n state: AgentHarnessState;\n /** Send a user message. */\n sendMessage: (params: {\n content: string;\n files?: Array<{ url: string; mediaType: string; filename: string }>;\n }) => Promise<void>;\n /** Respond to a pending tool approval. */\n respondToToolApproval: (decision: \"approve\" | \"decline\") => Promise<void>;\n /** Respond to a pending question. */\n respondToQuestion: (questionId: string, answer: string) => Promise<void>;\n /** Respond to a pending plan approval. */\n respondToPlanApproval: (\n planId: string,\n response: { action: \"approved\" | \"rejected\"; feedback?: string }\n ) => Promise<void>;\n /** Abort any in-progress generation. */\n abort: () => void;\n /** Steer the agent mid-stream. */\n steer: (content: string) => void;\n /** Select a mode. */\n selectMode: (modeId: string) => Promise<void>;\n /** Reset the state (e.g. after a thread switch). */\n reset: () => void;\n}\n\n/**\n * `useAgentHarness` — headless state hook for the AgentHarness UI.\n *\n * Subscribes to a `HarnessAdapter` and reduces all events into a single\n * normalized `AgentHarnessState` object that the `AgentHarness` block\n * (or any custom UI) can render from.\n *\n * @example\n * ```tsx\n * const adapter = fromMastraHarness(harness);\n * const { state, sendMessage, abort } = useAgentHarness({ adapter });\n * ```\n */\nexport function useAgentHarness({\n adapter,\n}: UseAgentHarnessOptions): UseAgentHarnessReturn {\n const [state, dispatch] = useReducer(agentHarnessReducer, initialState);\n\n // Keep a stable ref to the adapter so callbacks below don't stale-close\n const adapterRef = useRef<HarnessAdapter | null>(adapter);\n adapterRef.current = adapter;\n\n // Subscribe to harness events — stamp each with Date.now() for timeline\n useEffect(() => {\n if (!adapter) return;\n const unsubscribe = adapter.subscribe((event) => {\n dispatch({ type: \"EVENT\", event, timestamp: Date.now() });\n });\n return unsubscribe;\n }, [adapter]);\n\n const sendMessage = useCallback(\n async (params: {\n content: string;\n files?: Array<{ url: string; mediaType: string; filename: string }>;\n }) => {\n await adapterRef.current?.sendMessage(params);\n },\n []\n );\n\n const respondToToolApproval = useCallback(\n async (decision: \"approve\" | \"decline\") => {\n await adapterRef.current?.respondToToolApproval?.({ decision });\n },\n []\n );\n\n const respondToQuestion = useCallback(\n async (questionId: string, answer: string) => {\n await adapterRef.current?.respondToQuestion?.({ questionId, answer });\n },\n []\n );\n\n const respondToPlanApproval = useCallback(\n async (\n planId: string,\n response: { action: \"approved\" | \"rejected\"; feedback?: string }\n ) => {\n await adapterRef.current?.respondToPlanApproval?.({ planId, response });\n },\n []\n );\n\n const abort = useCallback(() => {\n adapterRef.current?.abort?.();\n }, []);\n\n const steer = useCallback((content: string) => {\n adapterRef.current?.steer?.({ content });\n }, []);\n\n const selectMode = useCallback(async (modeId: string) => {\n await adapterRef.current?.selectMode?.({ modeId });\n }, []);\n\n const reset = useCallback(() => {\n dispatch({ type: \"RESET\" });\n }, []);\n\n return {\n state,\n sendMessage,\n respondToToolApproval,\n respondToQuestion,\n respondToPlanApproval,\n abort,\n steer,\n selectMode,\n reset,\n };\n}\n"],"mappings":"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"}
|
package/dist/utils.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { n as safeRandomId, t as cn } from "./cn-
|
|
3
|
-
import { n as useLinkComponent, t as LinkProvider } from "./link-provider-
|
|
4
|
-
|
|
2
|
+
import { n as safeRandomId, t as cn } from "./cn-CmAOpn49.js";
|
|
3
|
+
import { n as useLinkComponent, t as LinkProvider } from "./link-provider-BSn8YJon.js";
|
|
4
|
+
import { n as useMeasuredText, t as MeasuredText } from "./measured-text-CXkdw9Yr.js";
|
|
5
|
+
export { LinkProvider, MeasuredText, cn, safeRandomId, useLinkComponent, useMeasuredText };
|