@signalflare-ai/ui 0.5.0 → 1.0.0

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