@stigmer/react 0.4.7 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (652) hide show
  1. package/action-menu/ActionMenu.d.ts +64 -0
  2. package/action-menu/ActionMenu.d.ts.map +1 -0
  3. package/action-menu/ActionMenu.js +78 -0
  4. package/action-menu/ActionMenu.js.map +1 -0
  5. package/action-menu/index.d.ts +3 -0
  6. package/action-menu/index.d.ts.map +1 -0
  7. package/action-menu/index.js +2 -0
  8. package/action-menu/index.js.map +1 -0
  9. package/action-menu/types.d.ts +65 -0
  10. package/action-menu/types.d.ts.map +1 -0
  11. package/action-menu/types.js +2 -0
  12. package/action-menu/types.js.map +1 -0
  13. package/agent/AgentCreationWizard.d.ts +55 -0
  14. package/agent/AgentCreationWizard.d.ts.map +1 -0
  15. package/agent/AgentCreationWizard.js +115 -0
  16. package/agent/AgentCreationWizard.js.map +1 -0
  17. package/agent/AgentDetailView.d.ts +77 -9
  18. package/agent/AgentDetailView.d.ts.map +1 -1
  19. package/agent/AgentDetailView.js +265 -87
  20. package/agent/AgentDetailView.js.map +1 -1
  21. package/agent/index.d.ts +8 -0
  22. package/agent/index.d.ts.map +1 -1
  23. package/agent/index.js +4 -0
  24. package/agent/index.js.map +1 -1
  25. package/agent/internal/agentToInput.d.ts +12 -0
  26. package/agent/internal/agentToInput.d.ts.map +1 -0
  27. package/agent/internal/agentToInput.js +72 -0
  28. package/agent/internal/agentToInput.js.map +1 -0
  29. package/agent/steps/CapabilitiesStep.d.ts +16 -0
  30. package/agent/steps/CapabilitiesStep.d.ts.map +1 -0
  31. package/agent/steps/CapabilitiesStep.js +80 -0
  32. package/agent/steps/CapabilitiesStep.js.map +1 -0
  33. package/agent/steps/IdentityStep.d.ts +18 -0
  34. package/agent/steps/IdentityStep.d.ts.map +1 -0
  35. package/agent/steps/IdentityStep.js +43 -0
  36. package/agent/steps/IdentityStep.js.map +1 -0
  37. package/agent/steps/ReviewStep.d.ts +23 -0
  38. package/agent/steps/ReviewStep.d.ts.map +1 -0
  39. package/agent/steps/ReviewStep.js +73 -0
  40. package/agent/steps/ReviewStep.js.map +1 -0
  41. package/agent/steps/types.d.ts +35 -0
  42. package/agent/steps/types.d.ts.map +1 -0
  43. package/agent/steps/types.js +16 -0
  44. package/agent/steps/types.js.map +1 -0
  45. package/agent/useCreateAgent.d.ts +45 -0
  46. package/agent/useCreateAgent.d.ts.map +1 -0
  47. package/agent/useCreateAgent.js +50 -0
  48. package/agent/useCreateAgent.js.map +1 -0
  49. package/agent/useUpdateAgent.d.ts +24 -0
  50. package/agent/useUpdateAgent.d.ts.map +1 -0
  51. package/agent/useUpdateAgent.js +35 -0
  52. package/agent/useUpdateAgent.js.map +1 -0
  53. package/dependency-graph/DependencyGraph.d.ts +37 -0
  54. package/dependency-graph/DependencyGraph.d.ts.map +1 -0
  55. package/dependency-graph/DependencyGraph.js +88 -0
  56. package/dependency-graph/DependencyGraph.js.map +1 -0
  57. package/dependency-graph/DependencyTreeNode.d.ts +23 -0
  58. package/dependency-graph/DependencyTreeNode.d.ts.map +1 -0
  59. package/dependency-graph/DependencyTreeNode.js +99 -0
  60. package/dependency-graph/DependencyTreeNode.js.map +1 -0
  61. package/dependency-graph/index.d.ts +4 -0
  62. package/dependency-graph/index.d.ts.map +1 -0
  63. package/dependency-graph/index.js +5 -0
  64. package/dependency-graph/index.js.map +1 -0
  65. package/dependency-graph/types.d.ts +130 -0
  66. package/dependency-graph/types.d.ts.map +1 -0
  67. package/dependency-graph/types.js +2 -0
  68. package/dependency-graph/types.js.map +1 -0
  69. package/dependency-graph/useDependencyGraph.d.ts +27 -0
  70. package/dependency-graph/useDependencyGraph.d.ts.map +1 -0
  71. package/dependency-graph/useDependencyGraph.js +129 -0
  72. package/dependency-graph/useDependencyGraph.js.map +1 -0
  73. package/empty-state/EmptyState.d.ts +29 -0
  74. package/empty-state/EmptyState.d.ts.map +1 -0
  75. package/empty-state/EmptyState.js +45 -0
  76. package/empty-state/EmptyState.js.map +1 -0
  77. package/empty-state/index.d.ts +4 -0
  78. package/empty-state/index.d.ts.map +1 -0
  79. package/empty-state/index.js +3 -0
  80. package/empty-state/index.js.map +1 -0
  81. package/empty-state/types.d.ts +73 -0
  82. package/empty-state/types.d.ts.map +1 -0
  83. package/empty-state/types.js +2 -0
  84. package/empty-state/types.js.map +1 -0
  85. package/empty-state/useEmptyState.d.ts +18 -0
  86. package/empty-state/useEmptyState.d.ts.map +1 -0
  87. package/empty-state/useEmptyState.js +72 -0
  88. package/empty-state/useEmptyState.js.map +1 -0
  89. package/execution/MessageThread.d.ts +1 -0
  90. package/execution/MessageThread.d.ts.map +1 -1
  91. package/execution/MessageThread.js +22 -12
  92. package/execution/MessageThread.js.map +1 -1
  93. package/execution/SetupProgress.d.ts +23 -9
  94. package/execution/SetupProgress.d.ts.map +1 -1
  95. package/execution/SetupProgress.js +30 -14
  96. package/execution/SetupProgress.js.map +1 -1
  97. package/execution/__tests__/thread-keys.test.js +82 -0
  98. package/execution/__tests__/thread-keys.test.js.map +1 -1
  99. package/feedback/StigmerToaster.d.ts +18 -0
  100. package/feedback/StigmerToaster.d.ts.map +1 -0
  101. package/feedback/StigmerToaster.js +31 -0
  102. package/feedback/StigmerToaster.js.map +1 -0
  103. package/feedback/index.d.ts +4 -0
  104. package/feedback/index.d.ts.map +1 -0
  105. package/feedback/index.js +3 -0
  106. package/feedback/index.js.map +1 -0
  107. package/feedback/toast.d.ts +14 -0
  108. package/feedback/toast.d.ts.map +1 -0
  109. package/feedback/toast.js +14 -0
  110. package/feedback/toast.js.map +1 -0
  111. package/feedback/types.d.ts +4 -0
  112. package/feedback/types.d.ts.map +1 -0
  113. package/feedback/types.js +2 -0
  114. package/feedback/types.js.map +1 -0
  115. package/index.d.ts +30 -10
  116. package/index.d.ts.map +1 -1
  117. package/index.js +29 -9
  118. package/index.js.map +1 -1
  119. package/inline-edit/InlineEditImage.d.ts +20 -0
  120. package/inline-edit/InlineEditImage.d.ts.map +1 -0
  121. package/inline-edit/InlineEditImage.js +85 -0
  122. package/inline-edit/InlineEditImage.js.map +1 -0
  123. package/inline-edit/InlineEditKeyValue.d.ts +29 -0
  124. package/inline-edit/InlineEditKeyValue.d.ts.map +1 -0
  125. package/inline-edit/InlineEditKeyValue.js +67 -0
  126. package/inline-edit/InlineEditKeyValue.js.map +1 -0
  127. package/inline-edit/InlineEditResourceList.d.ts +34 -0
  128. package/inline-edit/InlineEditResourceList.d.ts.map +1 -0
  129. package/inline-edit/InlineEditResourceList.js +99 -0
  130. package/inline-edit/InlineEditResourceList.js.map +1 -0
  131. package/inline-edit/InlineEditSelect.d.ts +18 -0
  132. package/inline-edit/InlineEditSelect.d.ts.map +1 -0
  133. package/inline-edit/InlineEditSelect.js +54 -0
  134. package/inline-edit/InlineEditSelect.js.map +1 -0
  135. package/inline-edit/InlineEditText.d.ts +23 -0
  136. package/inline-edit/InlineEditText.d.ts.map +1 -0
  137. package/inline-edit/InlineEditText.js +79 -0
  138. package/inline-edit/InlineEditText.js.map +1 -0
  139. package/inline-edit/InlineEditTextarea.d.ts +22 -0
  140. package/inline-edit/InlineEditTextarea.d.ts.map +1 -0
  141. package/inline-edit/InlineEditTextarea.js +83 -0
  142. package/inline-edit/InlineEditTextarea.js.map +1 -0
  143. package/inline-edit/index.d.ts +16 -0
  144. package/inline-edit/index.d.ts.map +1 -0
  145. package/inline-edit/index.js +8 -0
  146. package/inline-edit/index.js.map +1 -0
  147. package/inline-edit/types.d.ts +42 -0
  148. package/inline-edit/types.d.ts.map +1 -0
  149. package/inline-edit/types.js +2 -0
  150. package/inline-edit/types.js.map +1 -0
  151. package/inline-edit/useInlineFieldSave.d.ts +23 -0
  152. package/inline-edit/useInlineFieldSave.d.ts.map +1 -0
  153. package/inline-edit/useInlineFieldSave.js +44 -0
  154. package/inline-edit/useInlineFieldSave.js.map +1 -0
  155. package/internal/Tabs.d.ts +4 -38
  156. package/internal/Tabs.d.ts.map +1 -1
  157. package/internal/Tabs.js +3 -62
  158. package/internal/Tabs.js.map +1 -1
  159. package/library/ImportResourceDialog.d.ts +43 -0
  160. package/library/ImportResourceDialog.d.ts.map +1 -0
  161. package/library/ImportResourceDialog.js +90 -0
  162. package/library/ImportResourceDialog.js.map +1 -0
  163. package/library/index.d.ts +7 -4
  164. package/library/index.d.ts.map +1 -1
  165. package/library/index.js +4 -2
  166. package/library/index.js.map +1 -1
  167. package/library/serialize-resource-yaml.d.ts +53 -0
  168. package/library/serialize-resource-yaml.d.ts.map +1 -1
  169. package/library/serialize-resource-yaml.js +275 -0
  170. package/library/serialize-resource-yaml.js.map +1 -1
  171. package/library/useExportResource.d.ts +56 -0
  172. package/library/useExportResource.d.ts.map +1 -0
  173. package/library/useExportResource.js +137 -0
  174. package/library/useExportResource.js.map +1 -0
  175. package/library/useImportResource.d.ts +84 -0
  176. package/library/useImportResource.d.ts.map +1 -0
  177. package/library/useImportResource.js +188 -0
  178. package/library/useImportResource.js.map +1 -0
  179. package/mcp-server/McpServerCreationWizard.d.ts +55 -0
  180. package/mcp-server/McpServerCreationWizard.d.ts.map +1 -0
  181. package/mcp-server/McpServerCreationWizard.js +121 -0
  182. package/mcp-server/McpServerCreationWizard.js.map +1 -0
  183. package/mcp-server/McpServerDetailView.d.ts +21 -1
  184. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  185. package/mcp-server/McpServerDetailView.js +113 -20
  186. package/mcp-server/McpServerDetailView.js.map +1 -1
  187. package/mcp-server/index.d.ts +8 -0
  188. package/mcp-server/index.d.ts.map +1 -1
  189. package/mcp-server/index.js +4 -0
  190. package/mcp-server/index.js.map +1 -1
  191. package/mcp-server/internal/mcpServerToInput.d.ts +12 -0
  192. package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -0
  193. package/mcp-server/internal/mcpServerToInput.js +81 -0
  194. package/mcp-server/internal/mcpServerToInput.js.map +1 -0
  195. package/mcp-server/steps/EnvironmentAuthStep.d.ts +15 -0
  196. package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -0
  197. package/mcp-server/steps/EnvironmentAuthStep.js +55 -0
  198. package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -0
  199. package/mcp-server/steps/IdentityTransportStep.d.ts +19 -0
  200. package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -0
  201. package/mcp-server/steps/IdentityTransportStep.js +73 -0
  202. package/mcp-server/steps/IdentityTransportStep.js.map +1 -0
  203. package/mcp-server/steps/ReviewStep.d.ts +23 -0
  204. package/mcp-server/steps/ReviewStep.d.ts.map +1 -0
  205. package/mcp-server/steps/ReviewStep.js +137 -0
  206. package/mcp-server/steps/ReviewStep.js.map +1 -0
  207. package/mcp-server/steps/types.d.ts +56 -0
  208. package/mcp-server/steps/types.d.ts.map +1 -0
  209. package/mcp-server/steps/types.js +27 -0
  210. package/mcp-server/steps/types.js.map +1 -0
  211. package/mcp-server/useCreateMcpServer.d.ts +45 -0
  212. package/mcp-server/useCreateMcpServer.d.ts.map +1 -0
  213. package/mcp-server/useCreateMcpServer.js +50 -0
  214. package/mcp-server/useCreateMcpServer.js.map +1 -0
  215. package/mcp-server/useUpdateMcpServer.d.ts +24 -0
  216. package/mcp-server/useUpdateMcpServer.d.ts.map +1 -0
  217. package/mcp-server/useUpdateMcpServer.js +35 -0
  218. package/mcp-server/useUpdateMcpServer.js.map +1 -0
  219. package/models/registry.d.ts +4 -1
  220. package/models/registry.d.ts.map +1 -1
  221. package/models/registry.js +6 -2
  222. package/models/registry.js.map +1 -1
  223. package/package.json +8 -4
  224. package/provider.js +1 -1
  225. package/provider.js.map +1 -1
  226. package/resource-creation/CreationPicker.d.ts +60 -0
  227. package/resource-creation/CreationPicker.d.ts.map +1 -0
  228. package/resource-creation/CreationPicker.js +74 -0
  229. package/resource-creation/CreationPicker.js.map +1 -0
  230. package/resource-creation/StepIndicator.d.ts +28 -0
  231. package/resource-creation/StepIndicator.d.ts.map +1 -0
  232. package/resource-creation/StepIndicator.js +40 -0
  233. package/resource-creation/StepIndicator.js.map +1 -0
  234. package/resource-creation/TemplateCard.d.ts +24 -0
  235. package/resource-creation/TemplateCard.d.ts.map +1 -0
  236. package/resource-creation/TemplateCard.js +68 -0
  237. package/resource-creation/TemplateCard.js.map +1 -0
  238. package/resource-creation/TemplateGallery.d.ts +43 -0
  239. package/resource-creation/TemplateGallery.d.ts.map +1 -0
  240. package/resource-creation/TemplateGallery.js +78 -0
  241. package/resource-creation/TemplateGallery.js.map +1 -0
  242. package/resource-creation/WizardNav.d.ts +31 -0
  243. package/resource-creation/WizardNav.d.ts.map +1 -0
  244. package/resource-creation/WizardNav.js +29 -0
  245. package/resource-creation/WizardNav.js.map +1 -0
  246. package/resource-creation/WizardShell.d.ts +41 -0
  247. package/resource-creation/WizardShell.d.ts.map +1 -0
  248. package/resource-creation/WizardShell.js +55 -0
  249. package/resource-creation/WizardShell.js.map +1 -0
  250. package/resource-creation/index.d.ts +21 -0
  251. package/resource-creation/index.d.ts.map +1 -0
  252. package/resource-creation/index.js +14 -0
  253. package/resource-creation/index.js.map +1 -0
  254. package/resource-creation/templates/agent-templates.d.ts +15 -0
  255. package/resource-creation/templates/agent-templates.d.ts.map +1 -0
  256. package/resource-creation/templates/agent-templates.js +148 -0
  257. package/resource-creation/templates/agent-templates.js.map +1 -0
  258. package/resource-creation/templates/index.d.ts +5 -0
  259. package/resource-creation/templates/index.d.ts.map +1 -0
  260. package/resource-creation/templates/index.js +5 -0
  261. package/resource-creation/templates/index.js.map +1 -0
  262. package/resource-creation/templates/mcp-server-templates.d.ts +15 -0
  263. package/resource-creation/templates/mcp-server-templates.d.ts.map +1 -0
  264. package/resource-creation/templates/mcp-server-templates.js +92 -0
  265. package/resource-creation/templates/mcp-server-templates.js.map +1 -0
  266. package/resource-creation/templates/types.d.ts +48 -0
  267. package/resource-creation/templates/types.d.ts.map +1 -0
  268. package/resource-creation/templates/types.js +16 -0
  269. package/resource-creation/templates/types.js.map +1 -0
  270. package/resource-creation/types.d.ts +88 -0
  271. package/resource-creation/types.d.ts.map +1 -0
  272. package/resource-creation/types.js +2 -0
  273. package/resource-creation/types.js.map +1 -0
  274. package/resource-creation/useTemplateFilter.d.ts +43 -0
  275. package/resource-creation/useTemplateFilter.d.ts.map +1 -0
  276. package/resource-creation/useTemplateFilter.js +73 -0
  277. package/resource-creation/useTemplateFilter.js.map +1 -0
  278. package/resource-creation/useWizardState.d.ts +67 -0
  279. package/resource-creation/useWizardState.d.ts.map +1 -0
  280. package/resource-creation/useWizardState.js +143 -0
  281. package/resource-creation/useWizardState.js.map +1 -0
  282. package/resource-detail/ConfirmDialog.d.ts +44 -0
  283. package/resource-detail/ConfirmDialog.d.ts.map +1 -0
  284. package/resource-detail/ConfirmDialog.js +62 -0
  285. package/resource-detail/ConfirmDialog.js.map +1 -0
  286. package/resource-detail/ResourceActionBar.d.ts +42 -0
  287. package/resource-detail/ResourceActionBar.d.ts.map +1 -0
  288. package/resource-detail/ResourceActionBar.js +64 -0
  289. package/resource-detail/ResourceActionBar.js.map +1 -0
  290. package/resource-detail/ResourceDetailShell.d.ts +36 -0
  291. package/resource-detail/ResourceDetailShell.d.ts.map +1 -0
  292. package/resource-detail/ResourceDetailShell.js +65 -0
  293. package/resource-detail/ResourceDetailShell.js.map +1 -0
  294. package/resource-detail/Section.d.ts +18 -0
  295. package/resource-detail/Section.d.ts.map +1 -0
  296. package/resource-detail/Section.js +18 -0
  297. package/resource-detail/Section.js.map +1 -0
  298. package/resource-detail/index.d.ts +15 -0
  299. package/resource-detail/index.d.ts.map +1 -0
  300. package/resource-detail/index.js +10 -0
  301. package/resource-detail/index.js.map +1 -0
  302. package/resource-detail/types.d.ts +146 -0
  303. package/resource-detail/types.d.ts.map +1 -0
  304. package/resource-detail/types.js +2 -0
  305. package/resource-detail/types.js.map +1 -0
  306. package/resource-detail/useConfirmAction.d.ts +41 -0
  307. package/resource-detail/useConfirmAction.d.ts.map +1 -0
  308. package/resource-detail/useConfirmAction.js +30 -0
  309. package/resource-detail/useConfirmAction.js.map +1 -0
  310. package/resource-detail/useCopyResource.d.ts +28 -0
  311. package/resource-detail/useCopyResource.d.ts.map +1 -0
  312. package/resource-detail/useCopyResource.js +46 -0
  313. package/resource-detail/useCopyResource.js.map +1 -0
  314. package/resource-detail/useDeleteResource.d.ts +40 -0
  315. package/resource-detail/useDeleteResource.d.ts.map +1 -0
  316. package/resource-detail/useDeleteResource.js +83 -0
  317. package/resource-detail/useDeleteResource.js.map +1 -0
  318. package/resource-detail/useDetailTabs.d.ts +46 -0
  319. package/resource-detail/useDetailTabs.d.ts.map +1 -0
  320. package/resource-detail/useDetailTabs.js +47 -0
  321. package/resource-detail/useDetailTabs.js.map +1 -0
  322. package/resource-workbench/components/BulkActionBar.d.ts +36 -0
  323. package/resource-workbench/components/BulkActionBar.d.ts.map +1 -0
  324. package/resource-workbench/components/BulkActionBar.js +35 -0
  325. package/resource-workbench/components/BulkActionBar.js.map +1 -0
  326. package/resource-workbench/components/ColumnHeader.d.ts +23 -0
  327. package/resource-workbench/components/ColumnHeader.d.ts.map +1 -0
  328. package/resource-workbench/components/ColumnHeader.js +25 -0
  329. package/resource-workbench/components/ColumnHeader.js.map +1 -0
  330. package/resource-workbench/components/FilterBar.d.ts +33 -0
  331. package/resource-workbench/components/FilterBar.d.ts.map +1 -0
  332. package/resource-workbench/components/FilterBar.js +72 -0
  333. package/resource-workbench/components/FilterBar.js.map +1 -0
  334. package/resource-workbench/components/ResourceAvatar.d.ts +29 -0
  335. package/resource-workbench/components/ResourceAvatar.d.ts.map +1 -0
  336. package/resource-workbench/components/ResourceAvatar.js +51 -0
  337. package/resource-workbench/components/ResourceAvatar.js.map +1 -0
  338. package/resource-workbench/components/ResourceCards.d.ts +39 -0
  339. package/resource-workbench/components/ResourceCards.d.ts.map +1 -0
  340. package/resource-workbench/components/ResourceCards.js +41 -0
  341. package/resource-workbench/components/ResourceCards.js.map +1 -0
  342. package/resource-workbench/components/ResourceInspector.d.ts +26 -0
  343. package/resource-workbench/components/ResourceInspector.d.ts.map +1 -0
  344. package/resource-workbench/components/ResourceInspector.js +22 -0
  345. package/resource-workbench/components/ResourceInspector.js.map +1 -0
  346. package/resource-workbench/components/ResourceList.d.ts +39 -0
  347. package/resource-workbench/components/ResourceList.d.ts.map +1 -0
  348. package/resource-workbench/components/ResourceList.js +41 -0
  349. package/resource-workbench/components/ResourceList.js.map +1 -0
  350. package/resource-workbench/components/ResourceTable.d.ts +47 -0
  351. package/resource-workbench/components/ResourceTable.d.ts.map +1 -0
  352. package/resource-workbench/components/ResourceTable.js +78 -0
  353. package/resource-workbench/components/ResourceTable.js.map +1 -0
  354. package/resource-workbench/components/ResourceWorkbench.d.ts +131 -0
  355. package/resource-workbench/components/ResourceWorkbench.d.ts.map +1 -0
  356. package/resource-workbench/components/ResourceWorkbench.js +170 -0
  357. package/resource-workbench/components/ResourceWorkbench.js.map +1 -0
  358. package/resource-workbench/components/SelectionCheckbox.d.ts +24 -0
  359. package/resource-workbench/components/SelectionCheckbox.d.ts.map +1 -0
  360. package/resource-workbench/components/SelectionCheckbox.js +16 -0
  361. package/resource-workbench/components/SelectionCheckbox.js.map +1 -0
  362. package/resource-workbench/components/StatusBadge.d.ts +31 -0
  363. package/resource-workbench/components/StatusBadge.d.ts.map +1 -0
  364. package/resource-workbench/components/StatusBadge.js +75 -0
  365. package/resource-workbench/components/StatusBadge.js.map +1 -0
  366. package/resource-workbench/components/ViewSwitcher.d.ts +21 -0
  367. package/resource-workbench/components/ViewSwitcher.d.ts.map +1 -0
  368. package/resource-workbench/components/ViewSwitcher.js +37 -0
  369. package/resource-workbench/components/ViewSwitcher.js.map +1 -0
  370. package/resource-workbench/hooks/useResourceCollection.d.ts +93 -0
  371. package/resource-workbench/hooks/useResourceCollection.d.ts.map +1 -0
  372. package/resource-workbench/hooks/useResourceCollection.js +133 -0
  373. package/resource-workbench/hooks/useResourceCollection.js.map +1 -0
  374. package/resource-workbench/hooks/useResourceFilters.d.ts +73 -0
  375. package/resource-workbench/hooks/useResourceFilters.d.ts.map +1 -0
  376. package/resource-workbench/hooks/useResourceFilters.js +105 -0
  377. package/resource-workbench/hooks/useResourceFilters.js.map +1 -0
  378. package/resource-workbench/hooks/useResourceSelection.d.ts +44 -0
  379. package/resource-workbench/hooks/useResourceSelection.d.ts.map +1 -0
  380. package/resource-workbench/hooks/useResourceSelection.js +123 -0
  381. package/resource-workbench/hooks/useResourceSelection.js.map +1 -0
  382. package/resource-workbench/hooks/useViewPreference.d.ts +32 -0
  383. package/resource-workbench/hooks/useViewPreference.d.ts.map +1 -0
  384. package/resource-workbench/hooks/useViewPreference.js +60 -0
  385. package/resource-workbench/hooks/useViewPreference.js.map +1 -0
  386. package/resource-workbench/index.d.ts +34 -0
  387. package/resource-workbench/index.d.ts.map +1 -0
  388. package/resource-workbench/index.js +19 -0
  389. package/resource-workbench/index.js.map +1 -0
  390. package/resource-workbench/types.d.ts +165 -0
  391. package/resource-workbench/types.d.ts.map +1 -0
  392. package/resource-workbench/types.js +2 -0
  393. package/resource-workbench/types.js.map +1 -0
  394. package/runner/RunnerDetailView.d.ts +44 -0
  395. package/runner/RunnerDetailView.d.ts.map +1 -0
  396. package/runner/RunnerDetailView.js +154 -0
  397. package/runner/RunnerDetailView.js.map +1 -0
  398. package/runner/RunnerListPanel.d.ts +26 -1
  399. package/runner/RunnerListPanel.d.ts.map +1 -1
  400. package/runner/RunnerListPanel.js +68 -46
  401. package/runner/RunnerListPanel.js.map +1 -1
  402. package/runner/index.d.ts +7 -1
  403. package/runner/index.d.ts.map +1 -1
  404. package/runner/index.js +3 -0
  405. package/runner/index.js.map +1 -1
  406. package/runner/shared.d.ts +31 -0
  407. package/runner/shared.d.ts.map +1 -0
  408. package/runner/shared.js +55 -0
  409. package/runner/shared.js.map +1 -0
  410. package/runner/useRunner.d.ts +37 -0
  411. package/runner/useRunner.d.ts.map +1 -0
  412. package/runner/useRunner.js +24 -0
  413. package/runner/useRunner.js.map +1 -0
  414. package/session/__tests__/group-sessions.test.js +3 -3
  415. package/session/__tests__/group-sessions.test.js.map +1 -1
  416. package/skill/SkillDetailView.d.ts +70 -7
  417. package/skill/SkillDetailView.d.ts.map +1 -1
  418. package/skill/SkillDetailView.js +107 -39
  419. package/skill/SkillDetailView.js.map +1 -1
  420. package/skill/SkillDiffDialog.d.ts +42 -0
  421. package/skill/SkillDiffDialog.d.ts.map +1 -0
  422. package/skill/SkillDiffDialog.js +72 -0
  423. package/skill/SkillDiffDialog.js.map +1 -0
  424. package/skill/SkillFileBrowser.d.ts +31 -0
  425. package/skill/SkillFileBrowser.d.ts.map +1 -0
  426. package/skill/SkillFileBrowser.js +105 -0
  427. package/skill/SkillFileBrowser.js.map +1 -0
  428. package/skill/SkillUploader.d.ts +39 -0
  429. package/skill/SkillUploader.d.ts.map +1 -0
  430. package/skill/SkillUploader.js +141 -0
  431. package/skill/SkillUploader.js.map +1 -0
  432. package/skill/index.d.ts +18 -0
  433. package/skill/index.d.ts.map +1 -1
  434. package/skill/index.js +9 -0
  435. package/skill/index.js.map +1 -1
  436. package/skill/internal/computeArtifactHash.d.ts +9 -0
  437. package/skill/internal/computeArtifactHash.d.ts.map +1 -0
  438. package/skill/internal/computeArtifactHash.js +14 -0
  439. package/skill/internal/computeArtifactHash.js.map +1 -0
  440. package/skill/internal/fetchAndUnpackArtifact.d.ts +16 -0
  441. package/skill/internal/fetchAndUnpackArtifact.d.ts.map +1 -0
  442. package/skill/internal/fetchAndUnpackArtifact.js +34 -0
  443. package/skill/internal/fetchAndUnpackArtifact.js.map +1 -0
  444. package/skill/usePushSkill.d.ts +53 -0
  445. package/skill/usePushSkill.d.ts.map +1 -0
  446. package/skill/usePushSkill.js +57 -0
  447. package/skill/usePushSkill.js.map +1 -0
  448. package/skill/useSkillArtifact.d.ts +37 -0
  449. package/skill/useSkillArtifact.d.ts.map +1 -0
  450. package/skill/useSkillArtifact.js +76 -0
  451. package/skill/useSkillArtifact.js.map +1 -0
  452. package/skill/useSkillDiff.d.ts +31 -0
  453. package/skill/useSkillDiff.d.ts.map +1 -0
  454. package/skill/useSkillDiff.js +97 -0
  455. package/skill/useSkillDiff.js.map +1 -0
  456. package/skill/useSkillDuplicateCheck.d.ts +34 -0
  457. package/skill/useSkillDuplicateCheck.d.ts.map +1 -0
  458. package/skill/useSkillDuplicateCheck.js +58 -0
  459. package/skill/useSkillDuplicateCheck.js.map +1 -0
  460. package/skill/useSkillUpload.d.ts +69 -0
  461. package/skill/useSkillUpload.d.ts.map +1 -0
  462. package/skill/useSkillUpload.js +157 -0
  463. package/skill/useSkillUpload.js.map +1 -0
  464. package/skill/useSkillVersions.d.ts +46 -0
  465. package/skill/useSkillVersions.d.ts.map +1 -0
  466. package/skill/useSkillVersions.js +104 -0
  467. package/skill/useSkillVersions.js.map +1 -0
  468. package/src/action-menu/ActionMenu.tsx +151 -0
  469. package/src/action-menu/index.ts +9 -0
  470. package/src/action-menu/types.ts +70 -0
  471. package/src/agent/AgentCreationWizard.tsx +201 -0
  472. package/src/agent/AgentDetailView.tsx +817 -321
  473. package/src/agent/index.ts +16 -0
  474. package/src/agent/internal/agentToInput.ts +95 -0
  475. package/src/agent/steps/CapabilitiesStep.tsx +363 -0
  476. package/src/agent/steps/IdentityStep.tsx +259 -0
  477. package/src/agent/steps/ReviewStep.tsx +211 -0
  478. package/src/agent/steps/types.ts +53 -0
  479. package/src/agent/useCreateAgent.ts +76 -0
  480. package/src/agent/useUpdateAgent.ts +55 -0
  481. package/src/dependency-graph/DependencyGraph.tsx +153 -0
  482. package/src/dependency-graph/DependencyTreeNode.tsx +282 -0
  483. package/src/dependency-graph/index.ts +15 -0
  484. package/src/dependency-graph/types.ts +131 -0
  485. package/src/dependency-graph/useDependencyGraph.ts +158 -0
  486. package/src/empty-state/EmptyState.tsx +90 -0
  487. package/src/empty-state/index.ts +9 -0
  488. package/src/empty-state/types.ts +81 -0
  489. package/src/empty-state/useEmptyState.ts +85 -0
  490. package/src/execution/MessageThread.tsx +26 -15
  491. package/src/execution/SetupProgress.tsx +35 -14
  492. package/src/execution/__tests__/thread-keys.test.ts +101 -0
  493. package/src/feedback/StigmerToaster.tsx +45 -0
  494. package/src/feedback/index.ts +3 -0
  495. package/src/feedback/toast.ts +13 -0
  496. package/src/feedback/types.ts +7 -0
  497. package/src/index.ts +270 -8
  498. package/src/inline-edit/InlineEditImage.tsx +208 -0
  499. package/src/inline-edit/InlineEditKeyValue.tsx +278 -0
  500. package/src/inline-edit/InlineEditResourceList.tsx +325 -0
  501. package/src/inline-edit/InlineEditSelect.tsx +150 -0
  502. package/src/inline-edit/InlineEditText.tsx +211 -0
  503. package/src/inline-edit/InlineEditTextarea.tsx +209 -0
  504. package/src/inline-edit/index.ts +28 -0
  505. package/src/inline-edit/types.ts +47 -0
  506. package/src/inline-edit/useInlineFieldSave.ts +62 -0
  507. package/src/internal/Tabs.tsx +4 -164
  508. package/src/library/ImportResourceDialog.tsx +227 -0
  509. package/src/library/index.ts +18 -8
  510. package/src/library/serialize-resource-yaml.ts +356 -0
  511. package/src/library/useExportResource.ts +183 -0
  512. package/src/library/useImportResource.ts +253 -0
  513. package/src/mcp-server/McpServerCreationWizard.tsx +206 -0
  514. package/src/mcp-server/McpServerDetailView.tsx +392 -105
  515. package/src/mcp-server/index.ts +16 -0
  516. package/src/mcp-server/internal/mcpServerToInput.ts +95 -0
  517. package/src/mcp-server/steps/EnvironmentAuthStep.tsx +462 -0
  518. package/src/mcp-server/steps/IdentityTransportStep.tsx +531 -0
  519. package/src/mcp-server/steps/ReviewStep.tsx +297 -0
  520. package/src/mcp-server/steps/types.ts +85 -0
  521. package/src/mcp-server/useCreateMcpServer.ts +76 -0
  522. package/src/mcp-server/useUpdateMcpServer.ts +55 -0
  523. package/src/models/registry.ts +10 -2
  524. package/src/provider.tsx +1 -1
  525. package/src/resource-creation/CreationPicker.tsx +292 -0
  526. package/src/resource-creation/StepIndicator.tsx +156 -0
  527. package/src/resource-creation/TemplateCard.tsx +143 -0
  528. package/src/resource-creation/TemplateGallery.tsx +222 -0
  529. package/src/resource-creation/WizardNav.tsx +163 -0
  530. package/src/resource-creation/WizardShell.tsx +124 -0
  531. package/src/resource-creation/index.ts +45 -0
  532. package/src/resource-creation/templates/agent-templates.ts +160 -0
  533. package/src/resource-creation/templates/index.ts +7 -0
  534. package/src/resource-creation/templates/mcp-server-templates.ts +106 -0
  535. package/src/resource-creation/templates/types.ts +64 -0
  536. package/src/resource-creation/types.ts +105 -0
  537. package/src/resource-creation/useTemplateFilter.ts +117 -0
  538. package/src/resource-creation/useWizardState.ts +223 -0
  539. package/src/resource-detail/ConfirmDialog.tsx +127 -0
  540. package/src/resource-detail/ResourceActionBar.tsx +157 -0
  541. package/src/resource-detail/ResourceDetailShell.tsx +184 -0
  542. package/src/resource-detail/Section.tsx +78 -0
  543. package/src/resource-detail/index.ts +34 -0
  544. package/src/resource-detail/types.ts +177 -0
  545. package/src/resource-detail/useConfirmAction.ts +70 -0
  546. package/src/resource-detail/useCopyResource.ts +74 -0
  547. package/src/resource-detail/useDeleteResource.ts +110 -0
  548. package/src/resource-detail/useDetailTabs.ts +93 -0
  549. package/src/resource-workbench/components/BulkActionBar.tsx +122 -0
  550. package/src/resource-workbench/components/ColumnHeader.tsx +105 -0
  551. package/src/resource-workbench/components/FilterBar.tsx +173 -0
  552. package/src/resource-workbench/components/ResourceAvatar.tsx +109 -0
  553. package/src/resource-workbench/components/ResourceCards.tsx +126 -0
  554. package/src/resource-workbench/components/ResourceInspector.tsx +88 -0
  555. package/src/resource-workbench/components/ResourceList.tsx +121 -0
  556. package/src/resource-workbench/components/ResourceTable.tsx +222 -0
  557. package/src/resource-workbench/components/ResourceWorkbench.tsx +695 -0
  558. package/src/resource-workbench/components/SelectionCheckbox.tsx +52 -0
  559. package/src/resource-workbench/components/StatusBadge.tsx +119 -0
  560. package/src/resource-workbench/components/ViewSwitcher.tsx +135 -0
  561. package/src/resource-workbench/hooks/useResourceCollection.ts +261 -0
  562. package/src/resource-workbench/hooks/useResourceFilters.ts +216 -0
  563. package/src/resource-workbench/hooks/useResourceSelection.ts +178 -0
  564. package/src/resource-workbench/hooks/useViewPreference.ts +75 -0
  565. package/src/resource-workbench/index.ts +73 -0
  566. package/src/resource-workbench/types.ts +220 -0
  567. package/src/runner/RunnerDetailView.tsx +410 -0
  568. package/src/runner/RunnerListPanel.tsx +126 -111
  569. package/src/runner/index.ts +13 -1
  570. package/src/runner/shared.tsx +124 -0
  571. package/src/runner/useRunner.ts +59 -0
  572. package/src/session/__tests__/group-sessions.test.ts +5 -3
  573. package/src/skill/SkillDetailView.tsx +371 -165
  574. package/src/skill/SkillDiffDialog.tsx +213 -0
  575. package/src/skill/SkillFileBrowser.tsx +289 -0
  576. package/src/skill/SkillUploader.tsx +481 -0
  577. package/src/skill/index.ts +34 -0
  578. package/src/skill/internal/computeArtifactHash.ts +13 -0
  579. package/src/skill/internal/fetchAndUnpackArtifact.ts +48 -0
  580. package/src/skill/usePushSkill.ts +101 -0
  581. package/src/skill/useSkillArtifact.ts +107 -0
  582. package/src/skill/useSkillDiff.ts +128 -0
  583. package/src/skill/useSkillDuplicateCheck.ts +92 -0
  584. package/src/skill/useSkillUpload.ts +231 -0
  585. package/src/skill/useSkillVersions.ts +165 -0
  586. package/src/styles.css +28 -0
  587. package/src/tabs/Tabs.tsx +184 -0
  588. package/src/tabs/index.ts +2 -0
  589. package/src/version-history/DiffFileList.tsx +111 -0
  590. package/src/version-history/DiffSummary.tsx +61 -0
  591. package/src/version-history/DiffViewer.tsx +163 -0
  592. package/src/version-history/MultiFileDiffView.tsx +114 -0
  593. package/src/version-history/VersionTimeline.tsx +232 -0
  594. package/src/version-history/VersionTimelineEntry.tsx +254 -0
  595. package/src/version-history/computeDiff.ts +61 -0
  596. package/src/version-history/computeMultiFileDiff.ts +97 -0
  597. package/src/version-history/index.ts +22 -0
  598. package/src/version-history/types.ts +129 -0
  599. package/styles.css +1 -1
  600. package/tabs/Tabs.d.ts +58 -0
  601. package/tabs/Tabs.d.ts.map +1 -0
  602. package/tabs/Tabs.js +80 -0
  603. package/tabs/Tabs.js.map +1 -0
  604. package/tabs/index.d.ts +3 -0
  605. package/tabs/index.d.ts.map +1 -0
  606. package/tabs/index.js +2 -0
  607. package/tabs/index.js.map +1 -0
  608. package/version-history/DiffFileList.d.ts +22 -0
  609. package/version-history/DiffFileList.d.ts.map +1 -0
  610. package/version-history/DiffFileList.js +37 -0
  611. package/version-history/DiffFileList.js.map +1 -0
  612. package/version-history/DiffSummary.d.ts +21 -0
  613. package/version-history/DiffSummary.d.ts.map +1 -0
  614. package/version-history/DiffSummary.js +16 -0
  615. package/version-history/DiffSummary.js.map +1 -0
  616. package/version-history/DiffViewer.d.ts +31 -0
  617. package/version-history/DiffViewer.d.ts.map +1 -0
  618. package/version-history/DiffViewer.js +60 -0
  619. package/version-history/DiffViewer.js.map +1 -0
  620. package/version-history/MultiFileDiffView.d.ts +30 -0
  621. package/version-history/MultiFileDiffView.d.ts.map +1 -0
  622. package/version-history/MultiFileDiffView.js +40 -0
  623. package/version-history/MultiFileDiffView.js.map +1 -0
  624. package/version-history/VersionTimeline.d.ts +29 -0
  625. package/version-history/VersionTimeline.d.ts.map +1 -0
  626. package/version-history/VersionTimeline.js +87 -0
  627. package/version-history/VersionTimeline.js.map +1 -0
  628. package/version-history/VersionTimelineEntry.d.ts +22 -0
  629. package/version-history/VersionTimelineEntry.d.ts.map +1 -0
  630. package/version-history/VersionTimelineEntry.js +98 -0
  631. package/version-history/VersionTimelineEntry.js.map +1 -0
  632. package/version-history/computeDiff.d.ts +16 -0
  633. package/version-history/computeDiff.d.ts.map +1 -0
  634. package/version-history/computeDiff.js +54 -0
  635. package/version-history/computeDiff.js.map +1 -0
  636. package/version-history/computeMultiFileDiff.d.ts +15 -0
  637. package/version-history/computeMultiFileDiff.d.ts.map +1 -0
  638. package/version-history/computeMultiFileDiff.js +83 -0
  639. package/version-history/computeMultiFileDiff.js.map +1 -0
  640. package/version-history/index.d.ts +14 -0
  641. package/version-history/index.d.ts.map +1 -0
  642. package/version-history/index.js +9 -0
  643. package/version-history/index.js.map +1 -0
  644. package/version-history/types.d.ts +106 -0
  645. package/version-history/types.d.ts.map +1 -0
  646. package/version-history/types.js +2 -0
  647. package/version-history/types.js.map +1 -0
  648. package/library/ResourceListView.d.ts +0 -174
  649. package/library/ResourceListView.d.ts.map +0 -1
  650. package/library/ResourceListView.js +0 -318
  651. package/library/ResourceListView.js.map +0 -1
  652. package/src/library/ResourceListView.tsx +0 -956
@@ -0,0 +1,158 @@
1
+ "use client";
2
+
3
+ import { useMemo } from "react";
4
+ import type {
5
+ DependencyNode,
6
+ DependencyTree,
7
+ UseDependencyGraphOptions,
8
+ UseDependencyGraphReturn,
9
+ } from "./types";
10
+
11
+ /**
12
+ * Pure transformation hook that converts an `AgentSpec` into a
13
+ * {@link DependencyTree} for rendering.
14
+ *
15
+ * No data fetching, no side effects — the tree is computed entirely
16
+ * from the spec fields already available via {@link useAgent}. The
17
+ * result is memoized and only recomputes when the spec reference
18
+ * changes.
19
+ *
20
+ * Returns `null` for `tree` when `spec` is `undefined` (loading state).
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * const { tree, isEmpty } = useDependencyGraph({
25
+ * agentName: agent.metadata.name,
26
+ * agentOrg: agent.metadata.org,
27
+ * spec: agent.spec,
28
+ * });
29
+ *
30
+ * if (!isEmpty && tree) {
31
+ * return <DependencyGraph tree={tree} onNodeClick={handleClick} />;
32
+ * }
33
+ * ```
34
+ */
35
+ export function useDependencyGraph({
36
+ agentName,
37
+ agentOrg,
38
+ spec,
39
+ }: UseDependencyGraphOptions): UseDependencyGraphReturn {
40
+ return useMemo(() => {
41
+ if (!spec) return { tree: null, isEmpty: true };
42
+
43
+ const { mcpServerUsages, skillRefs, subAgents } = spec;
44
+
45
+ const hasDeps =
46
+ mcpServerUsages.length > 0 ||
47
+ skillRefs.length > 0 ||
48
+ subAgents.length > 0;
49
+
50
+ if (!hasDeps) return { tree: null, isEmpty: true };
51
+
52
+ let nodeCount = 1; // root
53
+
54
+ const mcpNodes: DependencyNode[] = mcpServerUsages
55
+ .filter((u) => u.mcpServerRef)
56
+ .map((usage) => {
57
+ nodeCount++;
58
+ const ref = usage.mcpServerRef!;
59
+ const toolCount = usage.enabledTools.length;
60
+
61
+ return {
62
+ id: `mcp-server:${ref.slug}`,
63
+ kind: "mcp-server" as const,
64
+ label: ref.slug,
65
+ qualifiedLabel:
66
+ ref.org && ref.org !== agentOrg
67
+ ? `${ref.org}/${ref.slug}`
68
+ : undefined,
69
+ metadata: {
70
+ tools:
71
+ toolCount > 0
72
+ ? `${toolCount} ${toolCount === 1 ? "tool" : "tools"}`
73
+ : "all tools",
74
+ },
75
+ children: [],
76
+ ref: { org: ref.org || agentOrg, slug: ref.slug },
77
+ };
78
+ });
79
+
80
+ const skillNodes: DependencyNode[] = skillRefs.map((ref) => {
81
+ nodeCount++;
82
+ return {
83
+ id: `skill:${ref.slug}`,
84
+ kind: "skill" as const,
85
+ label: ref.slug,
86
+ qualifiedLabel:
87
+ ref.org && ref.org !== agentOrg
88
+ ? `${ref.org}/${ref.slug}`
89
+ : undefined,
90
+ children: [],
91
+ ref: { org: ref.org || agentOrg, slug: ref.slug },
92
+ };
93
+ });
94
+
95
+ const subAgentNodes: DependencyNode[] = subAgents.map((sa) => {
96
+ nodeCount++;
97
+
98
+ const saMcpNodes: DependencyNode[] = sa.mcpAccess.map((access) => {
99
+ nodeCount++;
100
+ const toolCount = access.enabledTools.length;
101
+ return {
102
+ id: `sub-agent:${sa.name}:mcp-server:${access.mcpServer}`,
103
+ kind: "mcp-server" as const,
104
+ label: access.mcpServer,
105
+ metadata: {
106
+ tools:
107
+ toolCount > 0
108
+ ? `${toolCount} ${toolCount === 1 ? "tool" : "tools"}`
109
+ : "all tools",
110
+ },
111
+ children: [],
112
+ ref: { org: agentOrg, slug: access.mcpServer },
113
+ };
114
+ });
115
+
116
+ const saSkillNodes: DependencyNode[] = sa.skillRefs.map((ref) => {
117
+ nodeCount++;
118
+ return {
119
+ id: `sub-agent:${sa.name}:skill:${ref.slug}`,
120
+ kind: "skill" as const,
121
+ label: ref.slug,
122
+ qualifiedLabel:
123
+ ref.org && ref.org !== agentOrg
124
+ ? `${ref.org}/${ref.slug}`
125
+ : undefined,
126
+ children: [],
127
+ ref: { org: ref.org || agentOrg, slug: ref.slug },
128
+ };
129
+ });
130
+
131
+ const metadata: Record<string, string> = {};
132
+ if (sa.modelOverride) {
133
+ metadata.model = sa.modelOverride;
134
+ }
135
+
136
+ return {
137
+ id: `sub-agent:${sa.name}`,
138
+ kind: "sub-agent" as const,
139
+ label: sa.name,
140
+ description: sa.description || undefined,
141
+ metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
142
+ children: [...saMcpNodes, ...saSkillNodes],
143
+ };
144
+ });
145
+
146
+ const root: DependencyNode = {
147
+ id: `agent:${agentName}`,
148
+ kind: "agent",
149
+ label: agentName,
150
+ children: [...mcpNodes, ...skillNodes, ...subAgentNodes],
151
+ };
152
+
153
+ return {
154
+ tree: { root, nodeCount },
155
+ isEmpty: false,
156
+ };
157
+ }, [agentName, agentOrg, spec]);
158
+ }
@@ -0,0 +1,90 @@
1
+ "use client";
2
+
3
+ import { cn } from "@stigmer/theme";
4
+ import { useEmptyState } from "./useEmptyState";
5
+ import type { EmptyStateProps } from "./types";
6
+
7
+ /**
8
+ * A semantic, accessible empty state component supporting four distinct
9
+ * variants: first-use, zero-results, permission, and error.
10
+ *
11
+ * Each variant provides appropriate default icons, copy, and ARIA roles.
12
+ * All defaults can be overridden via props. The `icon` prop accepts any
13
+ * ReactNode for full visual customization.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * <EmptyState
18
+ * variant="first-use"
19
+ * resourceLabel="agents"
20
+ * action={{ label: "Create agent", onClick: handleCreate }}
21
+ * />
22
+ * ```
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * <EmptyState
27
+ * variant="error"
28
+ * errorMessage="Network request failed"
29
+ * action={{ label: "Retry", onClick: handleRetry }}
30
+ * />
31
+ * ```
32
+ */
33
+ export function EmptyState({
34
+ variant,
35
+ resourceLabel,
36
+ icon,
37
+ title,
38
+ description,
39
+ errorMessage,
40
+ action,
41
+ children,
42
+ className,
43
+ }: EmptyStateProps) {
44
+ const resolved = useEmptyState({
45
+ variant,
46
+ resourceLabel,
47
+ title,
48
+ description,
49
+ errorMessage,
50
+ });
51
+
52
+ return (
53
+ <div
54
+ role={resolved.role}
55
+ className={cn(
56
+ "flex flex-col items-center gap-3 py-12 text-center",
57
+ className,
58
+ )}
59
+ >
60
+ <div className="text-muted-foreground-faint">
61
+ {icon ?? resolved.defaultIcon}
62
+ </div>
63
+ <div className="flex flex-col gap-1">
64
+ <p className="text-sm font-medium text-muted-foreground">
65
+ {resolved.title}
66
+ </p>
67
+ <p className="max-w-sm text-xs text-muted-foreground-subtle">
68
+ {resolved.description}
69
+ </p>
70
+ </div>
71
+ {children
72
+ ? <div className="mt-1">{children}</div>
73
+ : action && (
74
+ <button
75
+ type="button"
76
+ onClick={action.onClick}
77
+ className={cn(
78
+ "mt-1 inline-flex items-center rounded-md px-3 py-1.5 text-xs font-medium",
79
+ variant === "error"
80
+ ? "border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground"
81
+ : "bg-primary text-primary-foreground hover:bg-primary-hover",
82
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
83
+ )}
84
+ >
85
+ {action.label}
86
+ </button>
87
+ )}
88
+ </div>
89
+ );
90
+ }
@@ -0,0 +1,9 @@
1
+ export { EmptyState } from "./EmptyState";
2
+ export { useEmptyState } from "./useEmptyState";
3
+ export type {
4
+ EmptyStateVariant,
5
+ EmptyStateAction,
6
+ EmptyStateProps,
7
+ UseEmptyStateOptions,
8
+ UseEmptyStateReturn,
9
+ } from "./types";
@@ -0,0 +1,81 @@
1
+ import type { ReactNode } from "react";
2
+
3
+ /**
4
+ * Semantic variant for an empty state, each representing a distinct
5
+ * reason why no content is visible.
6
+ */
7
+ export type EmptyStateVariant =
8
+ | "first-use"
9
+ | "zero-results"
10
+ | "permission"
11
+ | "error";
12
+
13
+ /** Action rendered as a button within the empty state. */
14
+ export interface EmptyStateAction {
15
+ /** Button label. */
16
+ readonly label: string;
17
+ /** Click handler. */
18
+ readonly onClick: () => void;
19
+ }
20
+
21
+ /** Options for the {@link useEmptyState} behavior hook. */
22
+ export interface UseEmptyStateOptions {
23
+ /** The semantic reason no content is shown. */
24
+ readonly variant: EmptyStateVariant;
25
+ /**
26
+ * Human-readable label for the resource type (e.g. "agents", "skills").
27
+ * Used to generate contextual default copy.
28
+ */
29
+ readonly resourceLabel?: string;
30
+ /** Custom title override. When provided, replaces the generated default. */
31
+ readonly title?: string;
32
+ /** Custom description override. When provided, replaces the generated default. */
33
+ readonly description?: string;
34
+ /** Error message to display — relevant for the "error" variant. */
35
+ readonly errorMessage?: string;
36
+ }
37
+
38
+ /** Return value of the {@link useEmptyState} behavior hook. */
39
+ export interface UseEmptyStateReturn {
40
+ /** Resolved title text. */
41
+ readonly title: string;
42
+ /** Resolved description text. */
43
+ readonly description: string;
44
+ /** Suggested default icon for the variant (as a ReactNode). */
45
+ readonly defaultIcon: ReactNode;
46
+ /** The ARIA role appropriate for this variant. */
47
+ readonly role: "status" | "alert";
48
+ }
49
+
50
+ /** Props for the styled {@link EmptyState} component. */
51
+ export interface EmptyStateProps {
52
+ /**
53
+ * The semantic reason no content is shown.
54
+ * Determines default icon, copy, and ARIA role.
55
+ */
56
+ readonly variant: EmptyStateVariant;
57
+ /**
58
+ * Human-readable label for the resource type (e.g. "agents", "skills").
59
+ * Used to generate contextual default copy.
60
+ */
61
+ readonly resourceLabel?: string;
62
+ /** Custom icon to display. Defaults to a variant-appropriate Lucide icon. */
63
+ readonly icon?: ReactNode;
64
+ /** Custom title override. */
65
+ readonly title?: string;
66
+ /** Custom description override. */
67
+ readonly description?: string;
68
+ /** Error message — only used when variant is "error". */
69
+ readonly errorMessage?: string;
70
+ /** Primary action button. */
71
+ readonly action?: EmptyStateAction;
72
+ /**
73
+ * Custom action slot content. When provided, renders in the action
74
+ * area (centered, below the description) instead of the `action` button.
75
+ * Use this when you need full control over the CTA element — e.g. a
76
+ * `<Link>` for client-side routing or a button with an icon.
77
+ */
78
+ readonly children?: ReactNode;
79
+ /** Additional CSS classes for the root container. */
80
+ readonly className?: string;
81
+ }
@@ -0,0 +1,85 @@
1
+ import { useMemo, createElement } from "react";
2
+ import { Package, SearchX, Lock, AlertCircle } from "lucide-react";
3
+ import type { UseEmptyStateOptions, UseEmptyStateReturn } from "./types";
4
+
5
+ const ICON_CLASSES = "h-10 w-10";
6
+
7
+ function resolveDefaults(
8
+ variant: UseEmptyStateOptions["variant"],
9
+ resourceLabel: string,
10
+ ): { title: string; description: string } {
11
+ switch (variant) {
12
+ case "first-use":
13
+ return {
14
+ title: `No ${resourceLabel} yet`,
15
+ description: `Create ${resourceLabel === "agents" ? "an agent" : `a ${resourceLabel.replace(/s$/, "")}`} to get started.`,
16
+ };
17
+ case "zero-results":
18
+ return {
19
+ title: "No results found",
20
+ description: "Try adjusting your search or filters.",
21
+ };
22
+ case "permission":
23
+ return {
24
+ title: `No access to ${resourceLabel}`,
25
+ description:
26
+ "You don't have permission to view these resources. Contact your organization admin.",
27
+ };
28
+ case "error":
29
+ return {
30
+ title: "Something went wrong",
31
+ description: "We couldn't load this content. Please try again.",
32
+ };
33
+ }
34
+ }
35
+
36
+ function resolveIcon(variant: UseEmptyStateOptions["variant"]) {
37
+ switch (variant) {
38
+ case "first-use":
39
+ return createElement(Package, { className: ICON_CLASSES });
40
+ case "zero-results":
41
+ return createElement(SearchX, { className: ICON_CLASSES });
42
+ case "permission":
43
+ return createElement(Lock, { className: ICON_CLASSES });
44
+ case "error":
45
+ return createElement(AlertCircle, { className: ICON_CLASSES });
46
+ }
47
+ }
48
+
49
+ function resolveRole(
50
+ variant: UseEmptyStateOptions["variant"],
51
+ ): "status" | "alert" {
52
+ return variant === "error" ? "alert" : "status";
53
+ }
54
+
55
+ /**
56
+ * Behavior hook that resolves empty state copy, icon, and accessibility
57
+ * attributes based on the semantic variant and optional overrides.
58
+ *
59
+ * Use this hook when you want full rendering control but need the
60
+ * variant-aware logic (default copy, icons, ARIA roles).
61
+ *
62
+ * @example
63
+ * ```tsx
64
+ * const { title, description, defaultIcon, role } = useEmptyState({
65
+ * variant: "first-use",
66
+ * resourceLabel: "agents",
67
+ * });
68
+ * ```
69
+ */
70
+ export function useEmptyState(options: UseEmptyStateOptions): UseEmptyStateReturn {
71
+ const { variant, resourceLabel = "resources", title, description, errorMessage } = options;
72
+
73
+ return useMemo(() => {
74
+ const defaults = resolveDefaults(variant, resourceLabel);
75
+ return {
76
+ title: title ?? defaults.title,
77
+ description:
78
+ variant === "error" && errorMessage
79
+ ? errorMessage
80
+ : (description ?? defaults.description),
81
+ defaultIcon: resolveIcon(variant),
82
+ role: resolveRole(variant),
83
+ };
84
+ }, [variant, resourceLabel, title, description, errorMessage]);
85
+ }
@@ -129,7 +129,7 @@ export type ThreadItem =
129
129
  | { readonly kind: "sub-agent"; readonly subAgentExecution: SubAgentExecution; readonly key: string }
130
130
  | { readonly kind: "phase-badge"; readonly phase: ExecutionPhase; readonly key: string }
131
131
  | { readonly kind: "approval-request"; readonly pendingApproval: PendingApproval; readonly key: string }
132
- | { readonly kind: "setup-progress"; readonly workspaceEntries: readonly WorkspaceEntry[]; readonly serverPhase?: string; readonly key: string };
132
+ | { readonly kind: "setup-progress"; readonly workspaceEntries: readonly WorkspaceEntry[]; readonly serverPhase?: string; readonly isAwaitingResponse?: boolean; readonly key: string };
133
133
 
134
134
  function hasAiMessages(execution: AgentExecution): boolean {
135
135
  const messages = execution.status?.messages;
@@ -257,20 +257,30 @@ export function buildThreadItems(
257
257
  const lastPhase =
258
258
  lastExec?.status?.phase ?? ExecutionPhase.EXECUTION_PHASE_UNSPECIFIED;
259
259
 
260
- if (
261
- activeStreamExecution &&
262
- (lastPhase === ExecutionPhase.EXECUTION_PENDING ||
263
- lastPhase === ExecutionPhase.EXECUTION_PHASE_UNSPECIFIED) &&
264
- !hasAiMessages(activeStreamExecution)
265
- ) {
266
- const serverPhase =
267
- activeStreamExecution.status?.setupProgress?.currentPhase || undefined;
268
- items.push({
269
- kind: "setup-progress",
270
- workspaceEntries: workspaceEntries ?? [],
271
- serverPhase,
272
- key: "setup-progress",
273
- });
260
+ if (activeStreamExecution && !hasAiMessages(activeStreamExecution)) {
261
+ const isPending =
262
+ lastPhase === ExecutionPhase.EXECUTION_PENDING ||
263
+ lastPhase === ExecutionPhase.EXECUTION_PHASE_UNSPECIFIED;
264
+ const isInProgressNoMessages =
265
+ lastPhase === ExecutionPhase.EXECUTION_IN_PROGRESS;
266
+
267
+ if (isPending) {
268
+ const serverPhase =
269
+ activeStreamExecution.status?.setupProgress?.currentPhase || undefined;
270
+ items.push({
271
+ kind: "setup-progress",
272
+ workspaceEntries: workspaceEntries ?? [],
273
+ serverPhase,
274
+ key: "setup-progress",
275
+ });
276
+ } else if (isInProgressNoMessages) {
277
+ items.push({
278
+ kind: "setup-progress",
279
+ workspaceEntries: workspaceEntries ?? [],
280
+ isAwaitingResponse: true,
281
+ key: "setup-progress",
282
+ });
283
+ }
274
284
  }
275
285
 
276
286
  if (
@@ -557,6 +567,7 @@ export function ThreadItemRenderer({
557
567
  <SetupProgress
558
568
  workspaceEntries={item.workspaceEntries}
559
569
  serverPhase={item.serverPhase}
570
+ isAwaitingResponse={item.isAwaitingResponse}
560
571
  />
561
572
  );
562
573
  }
@@ -22,6 +22,13 @@ export interface SetupProgressProps {
22
22
  * step sequence derived from `workspaceEntries`.
23
23
  */
24
24
  readonly serverPhase?: string;
25
+ /**
26
+ * When `true`, the execution has moved past `PENDING` into
27
+ * `IN_PROGRESS` but the agent has not yet produced any AI messages.
28
+ * Renders a static "Thinking\u2026" label instead of the setup
29
+ * phase sequence or server-reported phase.
30
+ */
31
+ readonly isAwaitingResponse?: boolean;
25
32
  /** Additional CSS class names for the root container. */
26
33
  readonly className?: string;
27
34
  }
@@ -66,33 +73,41 @@ function buildSteps(
66
73
 
67
74
  /**
68
75
  * Animated inline indicator shown in the message thread while an
69
- * execution is in the `PENDING` phase and no AI messages have arrived.
76
+ * execution has not yet produced AI messages.
77
+ *
78
+ * Operates in three modes (highest-priority first):
70
79
  *
71
- * **Server-driven mode** — when the backend reports
72
- * `setup_progress.current_phase` through the execution stream, the
73
- * component renders the server-reported label directly.
80
+ * 1. **Awaiting response** — `isAwaitingResponse` is `true`. The
81
+ * execution has moved past `PENDING` into `IN_PROGRESS` but no AI
82
+ * messages have arrived yet. Shows a static "Thinking\u2026" label.
74
83
  *
75
- * **Timer-based fallback** — when `serverPhase` is absent (older
76
- * backends), the component cycles through contextual status messages
77
- * derived from the session configuration on a fixed interval.
84
+ * 2. **Server-driven** — `serverPhase` is non-empty. Renders the
85
+ * server-reported `setup_progress.current_phase` label directly.
86
+ *
87
+ * 3. **Timer-based fallback** — neither of the above. Cycles through
88
+ * contextual status messages derived from `workspaceEntries`.
78
89
  *
79
90
  * All visual properties flow through `--stgm-*` tokens.
80
91
  *
81
92
  * @example
82
93
  * ```tsx
83
- * // Server-driven (preferred)
94
+ * // Awaiting response (IN_PROGRESS, no messages yet)
95
+ * <SetupProgress isAwaitingResponse />
96
+ *
97
+ * // Server-driven (preferred during PENDING)
84
98
  * <SetupProgress serverPhase={execution.status?.setupProgress?.currentPhase} />
85
99
  *
86
- * // Fallback (no server phase available)
100
+ * // Timer fallback (PENDING, no server phase available)
87
101
  * <SetupProgress workspaceEntries={session.spec?.workspaceEntries} />
88
102
  * ```
89
103
  */
90
104
  export const SetupProgress = memo(function SetupProgress({
91
105
  workspaceEntries,
92
106
  serverPhase,
107
+ isAwaitingResponse,
93
108
  className,
94
109
  }: SetupProgressProps) {
95
- const useServerPhase = !!serverPhase;
110
+ const useServerPhase = !isAwaitingResponse && !!serverPhase;
96
111
 
97
112
  /* ── Timer-based fallback state ─────────────────────────────────── */
98
113
  const steps = useMemo(() => buildSteps(workspaceEntries), [workspaceEntries]);
@@ -103,7 +118,7 @@ export const SetupProgress = memo(function SetupProgress({
103
118
  }, [steps]);
104
119
 
105
120
  useEffect(() => {
106
- if (useServerPhase) return;
121
+ if (isAwaitingResponse || useServerPhase) return;
107
122
  if (stepIndex >= steps.length - 1) return;
108
123
 
109
124
  const timer = setTimeout(() => {
@@ -111,11 +126,17 @@ export const SetupProgress = memo(function SetupProgress({
111
126
  }, steps[stepIndex].durationMs);
112
127
 
113
128
  return () => clearTimeout(timer);
114
- }, [useServerPhase, stepIndex, steps]);
129
+ }, [isAwaitingResponse, useServerPhase, stepIndex, steps]);
115
130
 
116
131
  /* ── Resolve display message ────────────────────────────────────── */
117
- const currentMessage =
118
- serverPhase || steps[Math.min(stepIndex, steps.length - 1)].message;
132
+ let currentMessage: string;
133
+ if (isAwaitingResponse) {
134
+ currentMessage = "Thinking\u2026";
135
+ } else if (serverPhase) {
136
+ currentMessage = serverPhase;
137
+ } else {
138
+ currentMessage = steps[Math.min(stepIndex, steps.length - 1)].message;
139
+ }
119
140
 
120
141
  return (
121
142
  <div
@@ -406,4 +406,105 @@ describe("buildThreadItems key generation", () => {
406
406
 
407
407
  expect(items[0].key).toBe("_e0-m0");
408
408
  });
409
+
410
+ describe("setup-progress indicator lifecycle", () => {
411
+ it("shows setup-progress during PENDING with no AI messages", () => {
412
+ const exec = makeExecution({
413
+ id: "exec-pending",
414
+ specMessage: "Hello",
415
+ phase: ExecutionPhase.EXECUTION_PENDING,
416
+ });
417
+
418
+ const items = buildThreadItems([], exec, null, false, undefined);
419
+ const setupItem = items.find((i) => i.kind === "setup-progress");
420
+
421
+ expect(setupItem).toBeDefined();
422
+ expect(setupItem!.key).toBe("setup-progress");
423
+ if (setupItem?.kind === "setup-progress") {
424
+ expect(setupItem.isAwaitingResponse).toBeFalsy();
425
+ }
426
+ });
427
+
428
+ it("shows setup-progress with isAwaitingResponse during IN_PROGRESS with no AI messages", () => {
429
+ const exec = makeExecution({
430
+ id: "exec-in-progress",
431
+ specMessage: "Hello",
432
+ phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
433
+ });
434
+
435
+ const items = buildThreadItems([], exec, null, false, undefined);
436
+ const setupItem = items.find((i) => i.kind === "setup-progress");
437
+
438
+ expect(setupItem).toBeDefined();
439
+ expect(setupItem!.key).toBe("setup-progress");
440
+ if (setupItem?.kind === "setup-progress") {
441
+ expect(setupItem.isAwaitingResponse).toBe(true);
442
+ }
443
+ });
444
+
445
+ it("hides setup-progress once AI messages arrive during IN_PROGRESS", () => {
446
+ const exec = makeExecution({
447
+ id: "exec-streaming",
448
+ specMessage: "Hello",
449
+ phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
450
+ messages: [
451
+ makeMessage(MessageType.MESSAGE_AI, "Here's my response"),
452
+ ],
453
+ });
454
+
455
+ const items = buildThreadItems([], exec, null, false, undefined);
456
+ const setupItem = items.find((i) => i.kind === "setup-progress");
457
+
458
+ expect(setupItem).toBeUndefined();
459
+ });
460
+
461
+ it("hides setup-progress for terminal phases even without AI messages", () => {
462
+ const exec = makeExecution({
463
+ id: "exec-failed",
464
+ specMessage: "Hello",
465
+ phase: ExecutionPhase.EXECUTION_FAILED,
466
+ });
467
+
468
+ const items = buildThreadItems([], exec, null, false, undefined);
469
+ const setupItem = items.find((i) => i.kind === "setup-progress");
470
+
471
+ expect(setupItem).toBeUndefined();
472
+ });
473
+
474
+ it("does not show setup-progress for completed executions (not active stream)", () => {
475
+ const exec = makeExecution({
476
+ id: "exec-done",
477
+ specMessage: "Hello",
478
+ phase: ExecutionPhase.EXECUTION_PENDING,
479
+ });
480
+
481
+ const items = buildThreadItems([exec], null, null, false, undefined);
482
+ const setupItem = items.find((i) => i.kind === "setup-progress");
483
+
484
+ expect(setupItem).toBeUndefined();
485
+ });
486
+
487
+ it("preserves stable key across PENDING → IN_PROGRESS transition", () => {
488
+ const pendingExec = makeExecution({
489
+ id: "exec-transition",
490
+ specMessage: "Hello",
491
+ phase: ExecutionPhase.EXECUTION_PENDING,
492
+ });
493
+ const itemsPending = buildThreadItems([], pendingExec, null, false, undefined);
494
+
495
+ const inProgressExec = makeExecution({
496
+ id: "exec-transition",
497
+ specMessage: "Hello",
498
+ phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
499
+ });
500
+ const itemsInProgress = buildThreadItems([], inProgressExec, null, false, undefined);
501
+
502
+ const pendingSetup = itemsPending.find((i) => i.kind === "setup-progress");
503
+ const inProgressSetup = itemsInProgress.find((i) => i.kind === "setup-progress");
504
+
505
+ expect(pendingSetup).toBeDefined();
506
+ expect(inProgressSetup).toBeDefined();
507
+ expect(pendingSetup!.key).toBe(inProgressSetup!.key);
508
+ });
509
+ });
409
510
  });