@stigmer/react 0.4.8 → 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 (631) 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/feedback/StigmerToaster.d.ts +18 -0
  90. package/feedback/StigmerToaster.d.ts.map +1 -0
  91. package/feedback/StigmerToaster.js +31 -0
  92. package/feedback/StigmerToaster.js.map +1 -0
  93. package/feedback/index.d.ts +4 -0
  94. package/feedback/index.d.ts.map +1 -0
  95. package/feedback/index.js +3 -0
  96. package/feedback/index.js.map +1 -0
  97. package/feedback/toast.d.ts +14 -0
  98. package/feedback/toast.d.ts.map +1 -0
  99. package/feedback/toast.js +14 -0
  100. package/feedback/toast.js.map +1 -0
  101. package/feedback/types.d.ts +4 -0
  102. package/feedback/types.d.ts.map +1 -0
  103. package/feedback/types.js +2 -0
  104. package/feedback/types.js.map +1 -0
  105. package/index.d.ts +30 -10
  106. package/index.d.ts.map +1 -1
  107. package/index.js +29 -9
  108. package/index.js.map +1 -1
  109. package/inline-edit/InlineEditImage.d.ts +20 -0
  110. package/inline-edit/InlineEditImage.d.ts.map +1 -0
  111. package/inline-edit/InlineEditImage.js +85 -0
  112. package/inline-edit/InlineEditImage.js.map +1 -0
  113. package/inline-edit/InlineEditKeyValue.d.ts +29 -0
  114. package/inline-edit/InlineEditKeyValue.d.ts.map +1 -0
  115. package/inline-edit/InlineEditKeyValue.js +67 -0
  116. package/inline-edit/InlineEditKeyValue.js.map +1 -0
  117. package/inline-edit/InlineEditResourceList.d.ts +34 -0
  118. package/inline-edit/InlineEditResourceList.d.ts.map +1 -0
  119. package/inline-edit/InlineEditResourceList.js +99 -0
  120. package/inline-edit/InlineEditResourceList.js.map +1 -0
  121. package/inline-edit/InlineEditSelect.d.ts +18 -0
  122. package/inline-edit/InlineEditSelect.d.ts.map +1 -0
  123. package/inline-edit/InlineEditSelect.js +54 -0
  124. package/inline-edit/InlineEditSelect.js.map +1 -0
  125. package/inline-edit/InlineEditText.d.ts +23 -0
  126. package/inline-edit/InlineEditText.d.ts.map +1 -0
  127. package/inline-edit/InlineEditText.js +79 -0
  128. package/inline-edit/InlineEditText.js.map +1 -0
  129. package/inline-edit/InlineEditTextarea.d.ts +22 -0
  130. package/inline-edit/InlineEditTextarea.d.ts.map +1 -0
  131. package/inline-edit/InlineEditTextarea.js +83 -0
  132. package/inline-edit/InlineEditTextarea.js.map +1 -0
  133. package/inline-edit/index.d.ts +16 -0
  134. package/inline-edit/index.d.ts.map +1 -0
  135. package/inline-edit/index.js +8 -0
  136. package/inline-edit/index.js.map +1 -0
  137. package/inline-edit/types.d.ts +42 -0
  138. package/inline-edit/types.d.ts.map +1 -0
  139. package/inline-edit/types.js +2 -0
  140. package/inline-edit/types.js.map +1 -0
  141. package/inline-edit/useInlineFieldSave.d.ts +23 -0
  142. package/inline-edit/useInlineFieldSave.d.ts.map +1 -0
  143. package/inline-edit/useInlineFieldSave.js +44 -0
  144. package/inline-edit/useInlineFieldSave.js.map +1 -0
  145. package/internal/Tabs.d.ts +4 -38
  146. package/internal/Tabs.d.ts.map +1 -1
  147. package/internal/Tabs.js +3 -62
  148. package/internal/Tabs.js.map +1 -1
  149. package/library/ImportResourceDialog.d.ts +43 -0
  150. package/library/ImportResourceDialog.d.ts.map +1 -0
  151. package/library/ImportResourceDialog.js +90 -0
  152. package/library/ImportResourceDialog.js.map +1 -0
  153. package/library/index.d.ts +7 -4
  154. package/library/index.d.ts.map +1 -1
  155. package/library/index.js +4 -2
  156. package/library/index.js.map +1 -1
  157. package/library/serialize-resource-yaml.d.ts +53 -0
  158. package/library/serialize-resource-yaml.d.ts.map +1 -1
  159. package/library/serialize-resource-yaml.js +275 -0
  160. package/library/serialize-resource-yaml.js.map +1 -1
  161. package/library/useExportResource.d.ts +56 -0
  162. package/library/useExportResource.d.ts.map +1 -0
  163. package/library/useExportResource.js +137 -0
  164. package/library/useExportResource.js.map +1 -0
  165. package/library/useImportResource.d.ts +84 -0
  166. package/library/useImportResource.d.ts.map +1 -0
  167. package/library/useImportResource.js +188 -0
  168. package/library/useImportResource.js.map +1 -0
  169. package/mcp-server/McpServerCreationWizard.d.ts +55 -0
  170. package/mcp-server/McpServerCreationWizard.d.ts.map +1 -0
  171. package/mcp-server/McpServerCreationWizard.js +121 -0
  172. package/mcp-server/McpServerCreationWizard.js.map +1 -0
  173. package/mcp-server/McpServerDetailView.d.ts +21 -1
  174. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  175. package/mcp-server/McpServerDetailView.js +113 -20
  176. package/mcp-server/McpServerDetailView.js.map +1 -1
  177. package/mcp-server/index.d.ts +8 -0
  178. package/mcp-server/index.d.ts.map +1 -1
  179. package/mcp-server/index.js +4 -0
  180. package/mcp-server/index.js.map +1 -1
  181. package/mcp-server/internal/mcpServerToInput.d.ts +12 -0
  182. package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -0
  183. package/mcp-server/internal/mcpServerToInput.js +81 -0
  184. package/mcp-server/internal/mcpServerToInput.js.map +1 -0
  185. package/mcp-server/steps/EnvironmentAuthStep.d.ts +15 -0
  186. package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -0
  187. package/mcp-server/steps/EnvironmentAuthStep.js +55 -0
  188. package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -0
  189. package/mcp-server/steps/IdentityTransportStep.d.ts +19 -0
  190. package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -0
  191. package/mcp-server/steps/IdentityTransportStep.js +73 -0
  192. package/mcp-server/steps/IdentityTransportStep.js.map +1 -0
  193. package/mcp-server/steps/ReviewStep.d.ts +23 -0
  194. package/mcp-server/steps/ReviewStep.d.ts.map +1 -0
  195. package/mcp-server/steps/ReviewStep.js +137 -0
  196. package/mcp-server/steps/ReviewStep.js.map +1 -0
  197. package/mcp-server/steps/types.d.ts +56 -0
  198. package/mcp-server/steps/types.d.ts.map +1 -0
  199. package/mcp-server/steps/types.js +27 -0
  200. package/mcp-server/steps/types.js.map +1 -0
  201. package/mcp-server/useCreateMcpServer.d.ts +45 -0
  202. package/mcp-server/useCreateMcpServer.d.ts.map +1 -0
  203. package/mcp-server/useCreateMcpServer.js +50 -0
  204. package/mcp-server/useCreateMcpServer.js.map +1 -0
  205. package/mcp-server/useUpdateMcpServer.d.ts +24 -0
  206. package/mcp-server/useUpdateMcpServer.d.ts.map +1 -0
  207. package/mcp-server/useUpdateMcpServer.js +35 -0
  208. package/mcp-server/useUpdateMcpServer.js.map +1 -0
  209. package/package.json +8 -4
  210. package/resource-creation/CreationPicker.d.ts +60 -0
  211. package/resource-creation/CreationPicker.d.ts.map +1 -0
  212. package/resource-creation/CreationPicker.js +74 -0
  213. package/resource-creation/CreationPicker.js.map +1 -0
  214. package/resource-creation/StepIndicator.d.ts +28 -0
  215. package/resource-creation/StepIndicator.d.ts.map +1 -0
  216. package/resource-creation/StepIndicator.js +40 -0
  217. package/resource-creation/StepIndicator.js.map +1 -0
  218. package/resource-creation/TemplateCard.d.ts +24 -0
  219. package/resource-creation/TemplateCard.d.ts.map +1 -0
  220. package/resource-creation/TemplateCard.js +68 -0
  221. package/resource-creation/TemplateCard.js.map +1 -0
  222. package/resource-creation/TemplateGallery.d.ts +43 -0
  223. package/resource-creation/TemplateGallery.d.ts.map +1 -0
  224. package/resource-creation/TemplateGallery.js +78 -0
  225. package/resource-creation/TemplateGallery.js.map +1 -0
  226. package/resource-creation/WizardNav.d.ts +31 -0
  227. package/resource-creation/WizardNav.d.ts.map +1 -0
  228. package/resource-creation/WizardNav.js +29 -0
  229. package/resource-creation/WizardNav.js.map +1 -0
  230. package/resource-creation/WizardShell.d.ts +41 -0
  231. package/resource-creation/WizardShell.d.ts.map +1 -0
  232. package/resource-creation/WizardShell.js +55 -0
  233. package/resource-creation/WizardShell.js.map +1 -0
  234. package/resource-creation/index.d.ts +21 -0
  235. package/resource-creation/index.d.ts.map +1 -0
  236. package/resource-creation/index.js +14 -0
  237. package/resource-creation/index.js.map +1 -0
  238. package/resource-creation/templates/agent-templates.d.ts +15 -0
  239. package/resource-creation/templates/agent-templates.d.ts.map +1 -0
  240. package/resource-creation/templates/agent-templates.js +148 -0
  241. package/resource-creation/templates/agent-templates.js.map +1 -0
  242. package/resource-creation/templates/index.d.ts +5 -0
  243. package/resource-creation/templates/index.d.ts.map +1 -0
  244. package/resource-creation/templates/index.js +5 -0
  245. package/resource-creation/templates/index.js.map +1 -0
  246. package/resource-creation/templates/mcp-server-templates.d.ts +15 -0
  247. package/resource-creation/templates/mcp-server-templates.d.ts.map +1 -0
  248. package/resource-creation/templates/mcp-server-templates.js +92 -0
  249. package/resource-creation/templates/mcp-server-templates.js.map +1 -0
  250. package/resource-creation/templates/types.d.ts +48 -0
  251. package/resource-creation/templates/types.d.ts.map +1 -0
  252. package/resource-creation/templates/types.js +16 -0
  253. package/resource-creation/templates/types.js.map +1 -0
  254. package/resource-creation/types.d.ts +88 -0
  255. package/resource-creation/types.d.ts.map +1 -0
  256. package/resource-creation/types.js +2 -0
  257. package/resource-creation/types.js.map +1 -0
  258. package/resource-creation/useTemplateFilter.d.ts +43 -0
  259. package/resource-creation/useTemplateFilter.d.ts.map +1 -0
  260. package/resource-creation/useTemplateFilter.js +73 -0
  261. package/resource-creation/useTemplateFilter.js.map +1 -0
  262. package/resource-creation/useWizardState.d.ts +67 -0
  263. package/resource-creation/useWizardState.d.ts.map +1 -0
  264. package/resource-creation/useWizardState.js +143 -0
  265. package/resource-creation/useWizardState.js.map +1 -0
  266. package/resource-detail/ConfirmDialog.d.ts +44 -0
  267. package/resource-detail/ConfirmDialog.d.ts.map +1 -0
  268. package/resource-detail/ConfirmDialog.js +62 -0
  269. package/resource-detail/ConfirmDialog.js.map +1 -0
  270. package/resource-detail/ResourceActionBar.d.ts +42 -0
  271. package/resource-detail/ResourceActionBar.d.ts.map +1 -0
  272. package/resource-detail/ResourceActionBar.js +64 -0
  273. package/resource-detail/ResourceActionBar.js.map +1 -0
  274. package/resource-detail/ResourceDetailShell.d.ts +36 -0
  275. package/resource-detail/ResourceDetailShell.d.ts.map +1 -0
  276. package/resource-detail/ResourceDetailShell.js +65 -0
  277. package/resource-detail/ResourceDetailShell.js.map +1 -0
  278. package/resource-detail/Section.d.ts +18 -0
  279. package/resource-detail/Section.d.ts.map +1 -0
  280. package/resource-detail/Section.js +18 -0
  281. package/resource-detail/Section.js.map +1 -0
  282. package/resource-detail/index.d.ts +15 -0
  283. package/resource-detail/index.d.ts.map +1 -0
  284. package/resource-detail/index.js +10 -0
  285. package/resource-detail/index.js.map +1 -0
  286. package/resource-detail/types.d.ts +146 -0
  287. package/resource-detail/types.d.ts.map +1 -0
  288. package/resource-detail/types.js +2 -0
  289. package/resource-detail/types.js.map +1 -0
  290. package/resource-detail/useConfirmAction.d.ts +41 -0
  291. package/resource-detail/useConfirmAction.d.ts.map +1 -0
  292. package/resource-detail/useConfirmAction.js +30 -0
  293. package/resource-detail/useConfirmAction.js.map +1 -0
  294. package/resource-detail/useCopyResource.d.ts +28 -0
  295. package/resource-detail/useCopyResource.d.ts.map +1 -0
  296. package/resource-detail/useCopyResource.js +46 -0
  297. package/resource-detail/useCopyResource.js.map +1 -0
  298. package/resource-detail/useDeleteResource.d.ts +40 -0
  299. package/resource-detail/useDeleteResource.d.ts.map +1 -0
  300. package/resource-detail/useDeleteResource.js +83 -0
  301. package/resource-detail/useDeleteResource.js.map +1 -0
  302. package/resource-detail/useDetailTabs.d.ts +46 -0
  303. package/resource-detail/useDetailTabs.d.ts.map +1 -0
  304. package/resource-detail/useDetailTabs.js +47 -0
  305. package/resource-detail/useDetailTabs.js.map +1 -0
  306. package/resource-workbench/components/BulkActionBar.d.ts +36 -0
  307. package/resource-workbench/components/BulkActionBar.d.ts.map +1 -0
  308. package/resource-workbench/components/BulkActionBar.js +35 -0
  309. package/resource-workbench/components/BulkActionBar.js.map +1 -0
  310. package/resource-workbench/components/ColumnHeader.d.ts +23 -0
  311. package/resource-workbench/components/ColumnHeader.d.ts.map +1 -0
  312. package/resource-workbench/components/ColumnHeader.js +25 -0
  313. package/resource-workbench/components/ColumnHeader.js.map +1 -0
  314. package/resource-workbench/components/FilterBar.d.ts +33 -0
  315. package/resource-workbench/components/FilterBar.d.ts.map +1 -0
  316. package/resource-workbench/components/FilterBar.js +72 -0
  317. package/resource-workbench/components/FilterBar.js.map +1 -0
  318. package/resource-workbench/components/ResourceAvatar.d.ts +29 -0
  319. package/resource-workbench/components/ResourceAvatar.d.ts.map +1 -0
  320. package/resource-workbench/components/ResourceAvatar.js +51 -0
  321. package/resource-workbench/components/ResourceAvatar.js.map +1 -0
  322. package/resource-workbench/components/ResourceCards.d.ts +39 -0
  323. package/resource-workbench/components/ResourceCards.d.ts.map +1 -0
  324. package/resource-workbench/components/ResourceCards.js +41 -0
  325. package/resource-workbench/components/ResourceCards.js.map +1 -0
  326. package/resource-workbench/components/ResourceInspector.d.ts +26 -0
  327. package/resource-workbench/components/ResourceInspector.d.ts.map +1 -0
  328. package/resource-workbench/components/ResourceInspector.js +22 -0
  329. package/resource-workbench/components/ResourceInspector.js.map +1 -0
  330. package/resource-workbench/components/ResourceList.d.ts +39 -0
  331. package/resource-workbench/components/ResourceList.d.ts.map +1 -0
  332. package/resource-workbench/components/ResourceList.js +41 -0
  333. package/resource-workbench/components/ResourceList.js.map +1 -0
  334. package/resource-workbench/components/ResourceTable.d.ts +47 -0
  335. package/resource-workbench/components/ResourceTable.d.ts.map +1 -0
  336. package/resource-workbench/components/ResourceTable.js +78 -0
  337. package/resource-workbench/components/ResourceTable.js.map +1 -0
  338. package/resource-workbench/components/ResourceWorkbench.d.ts +131 -0
  339. package/resource-workbench/components/ResourceWorkbench.d.ts.map +1 -0
  340. package/resource-workbench/components/ResourceWorkbench.js +170 -0
  341. package/resource-workbench/components/ResourceWorkbench.js.map +1 -0
  342. package/resource-workbench/components/SelectionCheckbox.d.ts +24 -0
  343. package/resource-workbench/components/SelectionCheckbox.d.ts.map +1 -0
  344. package/resource-workbench/components/SelectionCheckbox.js +16 -0
  345. package/resource-workbench/components/SelectionCheckbox.js.map +1 -0
  346. package/resource-workbench/components/StatusBadge.d.ts +31 -0
  347. package/resource-workbench/components/StatusBadge.d.ts.map +1 -0
  348. package/resource-workbench/components/StatusBadge.js +75 -0
  349. package/resource-workbench/components/StatusBadge.js.map +1 -0
  350. package/resource-workbench/components/ViewSwitcher.d.ts +21 -0
  351. package/resource-workbench/components/ViewSwitcher.d.ts.map +1 -0
  352. package/resource-workbench/components/ViewSwitcher.js +37 -0
  353. package/resource-workbench/components/ViewSwitcher.js.map +1 -0
  354. package/resource-workbench/hooks/useResourceCollection.d.ts +93 -0
  355. package/resource-workbench/hooks/useResourceCollection.d.ts.map +1 -0
  356. package/resource-workbench/hooks/useResourceCollection.js +133 -0
  357. package/resource-workbench/hooks/useResourceCollection.js.map +1 -0
  358. package/resource-workbench/hooks/useResourceFilters.d.ts +73 -0
  359. package/resource-workbench/hooks/useResourceFilters.d.ts.map +1 -0
  360. package/resource-workbench/hooks/useResourceFilters.js +105 -0
  361. package/resource-workbench/hooks/useResourceFilters.js.map +1 -0
  362. package/resource-workbench/hooks/useResourceSelection.d.ts +44 -0
  363. package/resource-workbench/hooks/useResourceSelection.d.ts.map +1 -0
  364. package/resource-workbench/hooks/useResourceSelection.js +123 -0
  365. package/resource-workbench/hooks/useResourceSelection.js.map +1 -0
  366. package/resource-workbench/hooks/useViewPreference.d.ts +32 -0
  367. package/resource-workbench/hooks/useViewPreference.d.ts.map +1 -0
  368. package/resource-workbench/hooks/useViewPreference.js +60 -0
  369. package/resource-workbench/hooks/useViewPreference.js.map +1 -0
  370. package/resource-workbench/index.d.ts +34 -0
  371. package/resource-workbench/index.d.ts.map +1 -0
  372. package/resource-workbench/index.js +19 -0
  373. package/resource-workbench/index.js.map +1 -0
  374. package/resource-workbench/types.d.ts +165 -0
  375. package/resource-workbench/types.d.ts.map +1 -0
  376. package/resource-workbench/types.js +2 -0
  377. package/resource-workbench/types.js.map +1 -0
  378. package/runner/RunnerDetailView.d.ts +44 -0
  379. package/runner/RunnerDetailView.d.ts.map +1 -0
  380. package/runner/RunnerDetailView.js +154 -0
  381. package/runner/RunnerDetailView.js.map +1 -0
  382. package/runner/RunnerListPanel.d.ts +26 -1
  383. package/runner/RunnerListPanel.d.ts.map +1 -1
  384. package/runner/RunnerListPanel.js +68 -46
  385. package/runner/RunnerListPanel.js.map +1 -1
  386. package/runner/index.d.ts +7 -1
  387. package/runner/index.d.ts.map +1 -1
  388. package/runner/index.js +3 -0
  389. package/runner/index.js.map +1 -1
  390. package/runner/shared.d.ts +31 -0
  391. package/runner/shared.d.ts.map +1 -0
  392. package/runner/shared.js +55 -0
  393. package/runner/shared.js.map +1 -0
  394. package/runner/useRunner.d.ts +37 -0
  395. package/runner/useRunner.d.ts.map +1 -0
  396. package/runner/useRunner.js +24 -0
  397. package/runner/useRunner.js.map +1 -0
  398. package/session/__tests__/group-sessions.test.js +3 -3
  399. package/session/__tests__/group-sessions.test.js.map +1 -1
  400. package/skill/SkillDetailView.d.ts +70 -7
  401. package/skill/SkillDetailView.d.ts.map +1 -1
  402. package/skill/SkillDetailView.js +107 -39
  403. package/skill/SkillDetailView.js.map +1 -1
  404. package/skill/SkillDiffDialog.d.ts +42 -0
  405. package/skill/SkillDiffDialog.d.ts.map +1 -0
  406. package/skill/SkillDiffDialog.js +72 -0
  407. package/skill/SkillDiffDialog.js.map +1 -0
  408. package/skill/SkillFileBrowser.d.ts +31 -0
  409. package/skill/SkillFileBrowser.d.ts.map +1 -0
  410. package/skill/SkillFileBrowser.js +105 -0
  411. package/skill/SkillFileBrowser.js.map +1 -0
  412. package/skill/SkillUploader.d.ts +39 -0
  413. package/skill/SkillUploader.d.ts.map +1 -0
  414. package/skill/SkillUploader.js +141 -0
  415. package/skill/SkillUploader.js.map +1 -0
  416. package/skill/index.d.ts +18 -0
  417. package/skill/index.d.ts.map +1 -1
  418. package/skill/index.js +9 -0
  419. package/skill/index.js.map +1 -1
  420. package/skill/internal/computeArtifactHash.d.ts +9 -0
  421. package/skill/internal/computeArtifactHash.d.ts.map +1 -0
  422. package/skill/internal/computeArtifactHash.js +14 -0
  423. package/skill/internal/computeArtifactHash.js.map +1 -0
  424. package/skill/internal/fetchAndUnpackArtifact.d.ts +16 -0
  425. package/skill/internal/fetchAndUnpackArtifact.d.ts.map +1 -0
  426. package/skill/internal/fetchAndUnpackArtifact.js +34 -0
  427. package/skill/internal/fetchAndUnpackArtifact.js.map +1 -0
  428. package/skill/usePushSkill.d.ts +53 -0
  429. package/skill/usePushSkill.d.ts.map +1 -0
  430. package/skill/usePushSkill.js +57 -0
  431. package/skill/usePushSkill.js.map +1 -0
  432. package/skill/useSkillArtifact.d.ts +37 -0
  433. package/skill/useSkillArtifact.d.ts.map +1 -0
  434. package/skill/useSkillArtifact.js +76 -0
  435. package/skill/useSkillArtifact.js.map +1 -0
  436. package/skill/useSkillDiff.d.ts +31 -0
  437. package/skill/useSkillDiff.d.ts.map +1 -0
  438. package/skill/useSkillDiff.js +97 -0
  439. package/skill/useSkillDiff.js.map +1 -0
  440. package/skill/useSkillDuplicateCheck.d.ts +34 -0
  441. package/skill/useSkillDuplicateCheck.d.ts.map +1 -0
  442. package/skill/useSkillDuplicateCheck.js +58 -0
  443. package/skill/useSkillDuplicateCheck.js.map +1 -0
  444. package/skill/useSkillUpload.d.ts +69 -0
  445. package/skill/useSkillUpload.d.ts.map +1 -0
  446. package/skill/useSkillUpload.js +157 -0
  447. package/skill/useSkillUpload.js.map +1 -0
  448. package/skill/useSkillVersions.d.ts +46 -0
  449. package/skill/useSkillVersions.d.ts.map +1 -0
  450. package/skill/useSkillVersions.js +104 -0
  451. package/skill/useSkillVersions.js.map +1 -0
  452. package/src/action-menu/ActionMenu.tsx +151 -0
  453. package/src/action-menu/index.ts +9 -0
  454. package/src/action-menu/types.ts +70 -0
  455. package/src/agent/AgentCreationWizard.tsx +201 -0
  456. package/src/agent/AgentDetailView.tsx +817 -321
  457. package/src/agent/index.ts +16 -0
  458. package/src/agent/internal/agentToInput.ts +95 -0
  459. package/src/agent/steps/CapabilitiesStep.tsx +363 -0
  460. package/src/agent/steps/IdentityStep.tsx +259 -0
  461. package/src/agent/steps/ReviewStep.tsx +211 -0
  462. package/src/agent/steps/types.ts +53 -0
  463. package/src/agent/useCreateAgent.ts +76 -0
  464. package/src/agent/useUpdateAgent.ts +55 -0
  465. package/src/dependency-graph/DependencyGraph.tsx +153 -0
  466. package/src/dependency-graph/DependencyTreeNode.tsx +282 -0
  467. package/src/dependency-graph/index.ts +15 -0
  468. package/src/dependency-graph/types.ts +131 -0
  469. package/src/dependency-graph/useDependencyGraph.ts +158 -0
  470. package/src/empty-state/EmptyState.tsx +90 -0
  471. package/src/empty-state/index.ts +9 -0
  472. package/src/empty-state/types.ts +81 -0
  473. package/src/empty-state/useEmptyState.ts +85 -0
  474. package/src/feedback/StigmerToaster.tsx +45 -0
  475. package/src/feedback/index.ts +3 -0
  476. package/src/feedback/toast.ts +13 -0
  477. package/src/feedback/types.ts +7 -0
  478. package/src/index.ts +270 -8
  479. package/src/inline-edit/InlineEditImage.tsx +208 -0
  480. package/src/inline-edit/InlineEditKeyValue.tsx +278 -0
  481. package/src/inline-edit/InlineEditResourceList.tsx +325 -0
  482. package/src/inline-edit/InlineEditSelect.tsx +150 -0
  483. package/src/inline-edit/InlineEditText.tsx +211 -0
  484. package/src/inline-edit/InlineEditTextarea.tsx +209 -0
  485. package/src/inline-edit/index.ts +28 -0
  486. package/src/inline-edit/types.ts +47 -0
  487. package/src/inline-edit/useInlineFieldSave.ts +62 -0
  488. package/src/internal/Tabs.tsx +4 -164
  489. package/src/library/ImportResourceDialog.tsx +227 -0
  490. package/src/library/index.ts +18 -8
  491. package/src/library/serialize-resource-yaml.ts +356 -0
  492. package/src/library/useExportResource.ts +183 -0
  493. package/src/library/useImportResource.ts +253 -0
  494. package/src/mcp-server/McpServerCreationWizard.tsx +206 -0
  495. package/src/mcp-server/McpServerDetailView.tsx +392 -105
  496. package/src/mcp-server/index.ts +16 -0
  497. package/src/mcp-server/internal/mcpServerToInput.ts +95 -0
  498. package/src/mcp-server/steps/EnvironmentAuthStep.tsx +462 -0
  499. package/src/mcp-server/steps/IdentityTransportStep.tsx +531 -0
  500. package/src/mcp-server/steps/ReviewStep.tsx +297 -0
  501. package/src/mcp-server/steps/types.ts +85 -0
  502. package/src/mcp-server/useCreateMcpServer.ts +76 -0
  503. package/src/mcp-server/useUpdateMcpServer.ts +55 -0
  504. package/src/resource-creation/CreationPicker.tsx +292 -0
  505. package/src/resource-creation/StepIndicator.tsx +156 -0
  506. package/src/resource-creation/TemplateCard.tsx +143 -0
  507. package/src/resource-creation/TemplateGallery.tsx +222 -0
  508. package/src/resource-creation/WizardNav.tsx +163 -0
  509. package/src/resource-creation/WizardShell.tsx +124 -0
  510. package/src/resource-creation/index.ts +45 -0
  511. package/src/resource-creation/templates/agent-templates.ts +160 -0
  512. package/src/resource-creation/templates/index.ts +7 -0
  513. package/src/resource-creation/templates/mcp-server-templates.ts +106 -0
  514. package/src/resource-creation/templates/types.ts +64 -0
  515. package/src/resource-creation/types.ts +105 -0
  516. package/src/resource-creation/useTemplateFilter.ts +117 -0
  517. package/src/resource-creation/useWizardState.ts +223 -0
  518. package/src/resource-detail/ConfirmDialog.tsx +127 -0
  519. package/src/resource-detail/ResourceActionBar.tsx +157 -0
  520. package/src/resource-detail/ResourceDetailShell.tsx +184 -0
  521. package/src/resource-detail/Section.tsx +78 -0
  522. package/src/resource-detail/index.ts +34 -0
  523. package/src/resource-detail/types.ts +177 -0
  524. package/src/resource-detail/useConfirmAction.ts +70 -0
  525. package/src/resource-detail/useCopyResource.ts +74 -0
  526. package/src/resource-detail/useDeleteResource.ts +110 -0
  527. package/src/resource-detail/useDetailTabs.ts +93 -0
  528. package/src/resource-workbench/components/BulkActionBar.tsx +122 -0
  529. package/src/resource-workbench/components/ColumnHeader.tsx +105 -0
  530. package/src/resource-workbench/components/FilterBar.tsx +173 -0
  531. package/src/resource-workbench/components/ResourceAvatar.tsx +109 -0
  532. package/src/resource-workbench/components/ResourceCards.tsx +126 -0
  533. package/src/resource-workbench/components/ResourceInspector.tsx +88 -0
  534. package/src/resource-workbench/components/ResourceList.tsx +121 -0
  535. package/src/resource-workbench/components/ResourceTable.tsx +222 -0
  536. package/src/resource-workbench/components/ResourceWorkbench.tsx +695 -0
  537. package/src/resource-workbench/components/SelectionCheckbox.tsx +52 -0
  538. package/src/resource-workbench/components/StatusBadge.tsx +119 -0
  539. package/src/resource-workbench/components/ViewSwitcher.tsx +135 -0
  540. package/src/resource-workbench/hooks/useResourceCollection.ts +261 -0
  541. package/src/resource-workbench/hooks/useResourceFilters.ts +216 -0
  542. package/src/resource-workbench/hooks/useResourceSelection.ts +178 -0
  543. package/src/resource-workbench/hooks/useViewPreference.ts +75 -0
  544. package/src/resource-workbench/index.ts +73 -0
  545. package/src/resource-workbench/types.ts +220 -0
  546. package/src/runner/RunnerDetailView.tsx +410 -0
  547. package/src/runner/RunnerListPanel.tsx +126 -111
  548. package/src/runner/index.ts +13 -1
  549. package/src/runner/shared.tsx +124 -0
  550. package/src/runner/useRunner.ts +59 -0
  551. package/src/session/__tests__/group-sessions.test.ts +5 -3
  552. package/src/skill/SkillDetailView.tsx +371 -165
  553. package/src/skill/SkillDiffDialog.tsx +213 -0
  554. package/src/skill/SkillFileBrowser.tsx +289 -0
  555. package/src/skill/SkillUploader.tsx +481 -0
  556. package/src/skill/index.ts +34 -0
  557. package/src/skill/internal/computeArtifactHash.ts +13 -0
  558. package/src/skill/internal/fetchAndUnpackArtifact.ts +48 -0
  559. package/src/skill/usePushSkill.ts +101 -0
  560. package/src/skill/useSkillArtifact.ts +107 -0
  561. package/src/skill/useSkillDiff.ts +128 -0
  562. package/src/skill/useSkillDuplicateCheck.ts +92 -0
  563. package/src/skill/useSkillUpload.ts +231 -0
  564. package/src/skill/useSkillVersions.ts +165 -0
  565. package/src/styles.css +28 -0
  566. package/src/tabs/Tabs.tsx +184 -0
  567. package/src/tabs/index.ts +2 -0
  568. package/src/version-history/DiffFileList.tsx +111 -0
  569. package/src/version-history/DiffSummary.tsx +61 -0
  570. package/src/version-history/DiffViewer.tsx +163 -0
  571. package/src/version-history/MultiFileDiffView.tsx +114 -0
  572. package/src/version-history/VersionTimeline.tsx +232 -0
  573. package/src/version-history/VersionTimelineEntry.tsx +254 -0
  574. package/src/version-history/computeDiff.ts +61 -0
  575. package/src/version-history/computeMultiFileDiff.ts +97 -0
  576. package/src/version-history/index.ts +22 -0
  577. package/src/version-history/types.ts +129 -0
  578. package/styles.css +1 -1
  579. package/tabs/Tabs.d.ts +58 -0
  580. package/tabs/Tabs.d.ts.map +1 -0
  581. package/tabs/Tabs.js +80 -0
  582. package/tabs/Tabs.js.map +1 -0
  583. package/tabs/index.d.ts +3 -0
  584. package/tabs/index.d.ts.map +1 -0
  585. package/tabs/index.js +2 -0
  586. package/tabs/index.js.map +1 -0
  587. package/version-history/DiffFileList.d.ts +22 -0
  588. package/version-history/DiffFileList.d.ts.map +1 -0
  589. package/version-history/DiffFileList.js +37 -0
  590. package/version-history/DiffFileList.js.map +1 -0
  591. package/version-history/DiffSummary.d.ts +21 -0
  592. package/version-history/DiffSummary.d.ts.map +1 -0
  593. package/version-history/DiffSummary.js +16 -0
  594. package/version-history/DiffSummary.js.map +1 -0
  595. package/version-history/DiffViewer.d.ts +31 -0
  596. package/version-history/DiffViewer.d.ts.map +1 -0
  597. package/version-history/DiffViewer.js +60 -0
  598. package/version-history/DiffViewer.js.map +1 -0
  599. package/version-history/MultiFileDiffView.d.ts +30 -0
  600. package/version-history/MultiFileDiffView.d.ts.map +1 -0
  601. package/version-history/MultiFileDiffView.js +40 -0
  602. package/version-history/MultiFileDiffView.js.map +1 -0
  603. package/version-history/VersionTimeline.d.ts +29 -0
  604. package/version-history/VersionTimeline.d.ts.map +1 -0
  605. package/version-history/VersionTimeline.js +87 -0
  606. package/version-history/VersionTimeline.js.map +1 -0
  607. package/version-history/VersionTimelineEntry.d.ts +22 -0
  608. package/version-history/VersionTimelineEntry.d.ts.map +1 -0
  609. package/version-history/VersionTimelineEntry.js +98 -0
  610. package/version-history/VersionTimelineEntry.js.map +1 -0
  611. package/version-history/computeDiff.d.ts +16 -0
  612. package/version-history/computeDiff.d.ts.map +1 -0
  613. package/version-history/computeDiff.js +54 -0
  614. package/version-history/computeDiff.js.map +1 -0
  615. package/version-history/computeMultiFileDiff.d.ts +15 -0
  616. package/version-history/computeMultiFileDiff.d.ts.map +1 -0
  617. package/version-history/computeMultiFileDiff.js +83 -0
  618. package/version-history/computeMultiFileDiff.js.map +1 -0
  619. package/version-history/index.d.ts +14 -0
  620. package/version-history/index.d.ts.map +1 -0
  621. package/version-history/index.js +9 -0
  622. package/version-history/index.js.map +1 -0
  623. package/version-history/types.d.ts +106 -0
  624. package/version-history/types.d.ts.map +1 -0
  625. package/version-history/types.js +2 -0
  626. package/version-history/types.js.map +1 -0
  627. package/library/ResourceListView.d.ts +0 -174
  628. package/library/ResourceListView.d.ts.map +0 -1
  629. package/library/ResourceListView.js +0 -318
  630. package/library/ResourceListView.js.map +0 -1
  631. package/src/library/ResourceListView.tsx +0 -956
@@ -0,0 +1,481 @@
1
+ "use client";
2
+
3
+ import { type DragEvent, useCallback, useEffect, useRef, useState } from "react";
4
+ import Markdown from "react-markdown";
5
+ import { cn } from "@stigmer/theme";
6
+ import type { Skill } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/api_pb";
7
+ import { MARKDOWN_COMPONENTS, REMARK_PLUGINS, stripFrontmatter } from "../internal/markdown-components";
8
+ import { useSkillUpload } from "./useSkillUpload";
9
+ import { usePushSkill } from "./usePushSkill";
10
+ import { useSkillDuplicateCheck } from "./useSkillDuplicateCheck";
11
+
12
+ // ---------------------------------------------------------------------------
13
+ // Public types
14
+ // ---------------------------------------------------------------------------
15
+
16
+ /** Props for {@link SkillUploader}. */
17
+ export interface SkillUploaderProps {
18
+ /** Organization that will own the uploaded skill. */
19
+ readonly org: string;
20
+ /** Optional version tag for the push (e.g. "stable"). */
21
+ readonly tag?: string;
22
+ /** Called after a successful push with the persisted skill resource. */
23
+ readonly onComplete?: (skill: Skill) => void;
24
+ /** Called when the user cancels the upload flow. */
25
+ readonly onCancel?: () => void;
26
+ /** Additional CSS classes for the root container. */
27
+ readonly className?: string;
28
+ }
29
+
30
+ // ---------------------------------------------------------------------------
31
+ // Main component
32
+ // ---------------------------------------------------------------------------
33
+
34
+ /**
35
+ * Skill package upload component with validation and preview.
36
+ *
37
+ * Two-phase flow:
38
+ * 1. **Drop zone** — User drags/drops or clicks to select a .zip file
39
+ * 2. **Preview + confirm** — Validated package summary, file listing,
40
+ * rendered SKILL.md preview, and push button
41
+ *
42
+ * Validates the uploaded ZIP against the Anthropic Agent Skills spec:
43
+ * must contain SKILL.md with valid YAML frontmatter (name, description).
44
+ *
45
+ * Zero Console dependencies — safe for platform builder embedding.
46
+ * All visual properties flow through `--stgm-*` design tokens.
47
+ *
48
+ * @example
49
+ * ```tsx
50
+ * <SkillUploader
51
+ * org="acme"
52
+ * onComplete={(skill) => router.push(`/library/skills/${skill.metadata?.org}/${skill.metadata?.slug}`)}
53
+ * onCancel={() => router.back()}
54
+ * />
55
+ * ```
56
+ */
57
+ export function SkillUploader({
58
+ org,
59
+ tag,
60
+ onComplete,
61
+ onCancel,
62
+ className,
63
+ }: SkillUploaderProps) {
64
+ const upload = useSkillUpload();
65
+ const { push, isPushing, error: pushError, clearError } = usePushSkill();
66
+ const dupCheck = useSkillDuplicateCheck();
67
+
68
+ const handleFileProcessed = useCallback(
69
+ async (file: File) => {
70
+ dupCheck.reset();
71
+ await upload.processFile(file);
72
+ },
73
+ [upload, dupCheck],
74
+ );
75
+
76
+ useEffect(() => {
77
+ if (upload.preview && upload.artifact) {
78
+ const slug = normalizeToSlug(upload.preview.name);
79
+ dupCheck.check({ org, slug, artifactBytes: upload.artifact });
80
+ }
81
+ }, [upload.preview, upload.artifact, org]);
82
+
83
+ const handlePush = useCallback(async () => {
84
+ if (!upload.artifact) return;
85
+ clearError();
86
+
87
+ try {
88
+ const skill = await push({ org, artifact: upload.artifact, tag });
89
+ onComplete?.(skill);
90
+ } catch {
91
+ // Error captured in usePushSkill state
92
+ }
93
+ }, [upload.artifact, clearError, push, org, tag, onComplete]);
94
+
95
+ const handleReset = useCallback(() => {
96
+ upload.reset();
97
+ dupCheck.reset();
98
+ }, [upload, dupCheck]);
99
+
100
+ return (
101
+ <div className={cn("flex flex-col gap-0 rounded-lg border border-border bg-card", className)}>
102
+ {upload.preview ? (
103
+ <PreviewPhase
104
+ preview={upload.preview}
105
+ isPushing={isPushing}
106
+ pushError={pushError}
107
+ onPush={handlePush}
108
+ onReset={handleReset}
109
+ onCancel={onCancel}
110
+ isDuplicate={dupCheck.isDuplicate}
111
+ isCheckingDuplicate={dupCheck.isChecking}
112
+ />
113
+ ) : (
114
+ <DropZonePhase
115
+ onFile={handleFileProcessed}
116
+ isProcessing={upload.isProcessing}
117
+ validationError={upload.validationError}
118
+ onCancel={onCancel}
119
+ />
120
+ )}
121
+ </div>
122
+ );
123
+ }
124
+
125
+ // ---------------------------------------------------------------------------
126
+ // Phase 1: Drop Zone
127
+ // ---------------------------------------------------------------------------
128
+
129
+ function DropZonePhase({
130
+ onFile,
131
+ isProcessing,
132
+ validationError,
133
+ onCancel,
134
+ }: {
135
+ readonly onFile: (file: File) => Promise<void>;
136
+ readonly isProcessing: boolean;
137
+ readonly validationError: string | null;
138
+ readonly onCancel?: () => void;
139
+ }) {
140
+ const [isDragOver, setIsDragOver] = useState(false);
141
+ const inputRef = useRef<HTMLInputElement>(null);
142
+
143
+ const handleDragOver = useCallback((e: DragEvent) => {
144
+ e.preventDefault();
145
+ e.stopPropagation();
146
+ setIsDragOver(true);
147
+ }, []);
148
+
149
+ const handleDragLeave = useCallback((e: DragEvent) => {
150
+ e.preventDefault();
151
+ e.stopPropagation();
152
+ setIsDragOver(false);
153
+ }, []);
154
+
155
+ const handleDrop = useCallback(
156
+ (e: DragEvent) => {
157
+ e.preventDefault();
158
+ e.stopPropagation();
159
+ setIsDragOver(false);
160
+
161
+ const file = e.dataTransfer.files[0];
162
+ if (file) onFile(file);
163
+ },
164
+ [onFile],
165
+ );
166
+
167
+ const handleClick = useCallback(() => {
168
+ inputRef.current?.click();
169
+ }, []);
170
+
171
+ const handleFileChange = useCallback(
172
+ (e: React.ChangeEvent<HTMLInputElement>) => {
173
+ const file = e.target.files?.[0];
174
+ if (file) onFile(file);
175
+ if (inputRef.current) inputRef.current.value = "";
176
+ },
177
+ [onFile],
178
+ );
179
+
180
+ return (
181
+ <div className="flex flex-col">
182
+ <div
183
+ role="button"
184
+ tabIndex={0}
185
+ aria-label="Upload skill package"
186
+ onDragOver={handleDragOver}
187
+ onDragLeave={handleDragLeave}
188
+ onDrop={handleDrop}
189
+ onClick={handleClick}
190
+ onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") handleClick(); }}
191
+ className={cn(
192
+ "flex flex-col items-center justify-center gap-3 rounded-lg border-2 border-dashed p-12 transition-colors cursor-pointer",
193
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
194
+ isDragOver
195
+ ? "border-primary bg-muted-subtle"
196
+ : "border-border hover:border-muted-foreground hover:bg-muted-subtle",
197
+ isProcessing && "pointer-events-none opacity-60",
198
+ )}
199
+ >
200
+ <UploadIcon className={cn("size-10 text-muted-foreground", isDragOver && "text-primary")} />
201
+
202
+ {isProcessing ? (
203
+ <p className="text-sm font-medium text-foreground">Processing...</p>
204
+ ) : (
205
+ <>
206
+ <p className="text-sm font-medium text-foreground">
207
+ Drop your skill package here
208
+ </p>
209
+ <p className="text-xs text-muted-foreground">
210
+ or click to browse
211
+ </p>
212
+ </>
213
+ )}
214
+
215
+ <p className="mt-2 text-[10px] text-muted-foreground-subtle">
216
+ Accepts .zip files following the Anthropic Agent Skills format
217
+ </p>
218
+
219
+ <input
220
+ ref={inputRef}
221
+ type="file"
222
+ accept=".zip"
223
+ onChange={handleFileChange}
224
+ className="hidden"
225
+ aria-hidden="true"
226
+ />
227
+ </div>
228
+
229
+ {validationError && (
230
+ <div className="px-4 py-3">
231
+ <p className="text-sm text-destructive" role="alert">
232
+ {validationError}
233
+ </p>
234
+ </div>
235
+ )}
236
+
237
+ {onCancel && (
238
+ <div className="flex justify-end border-t border-border px-4 py-3">
239
+ <button
240
+ type="button"
241
+ onClick={onCancel}
242
+ className={cn(
243
+ "rounded-md px-3 py-1.5 text-sm font-medium text-muted-foreground",
244
+ "hover:text-foreground hover:bg-muted",
245
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
246
+ "transition-colors",
247
+ )}
248
+ >
249
+ Cancel
250
+ </button>
251
+ </div>
252
+ )}
253
+ </div>
254
+ );
255
+ }
256
+
257
+ // ---------------------------------------------------------------------------
258
+ // Phase 2: Preview + Confirm
259
+ // ---------------------------------------------------------------------------
260
+
261
+ function PreviewPhase({
262
+ preview,
263
+ isPushing,
264
+ pushError,
265
+ onPush,
266
+ onReset,
267
+ onCancel,
268
+ isDuplicate,
269
+ isCheckingDuplicate,
270
+ }: {
271
+ readonly preview: NonNullable<ReturnType<typeof useSkillUpload>["preview"]>;
272
+ readonly isPushing: boolean;
273
+ readonly pushError: Error | null;
274
+ readonly onPush: () => void;
275
+ readonly onReset: () => void;
276
+ readonly onCancel?: () => void;
277
+ readonly isDuplicate?: boolean;
278
+ readonly isCheckingDuplicate?: boolean;
279
+ }) {
280
+ const strippedContent = stripFrontmatter(preview.skillMdContent);
281
+
282
+ return (
283
+ <div className="flex flex-col">
284
+ {/* Header */}
285
+ <div className="border-b border-border px-4 py-3">
286
+ <h3 className="text-sm font-medium text-foreground">
287
+ Skill Package Preview
288
+ </h3>
289
+ </div>
290
+
291
+ {/* Metadata */}
292
+ <div className="flex flex-col gap-2 border-b border-border px-4 py-3">
293
+ <div className="flex items-baseline gap-2">
294
+ <span className="text-xs font-medium text-muted-foreground w-20 shrink-0">Name</span>
295
+ <span className="text-sm font-medium text-foreground font-mono">{preview.name}</span>
296
+ </div>
297
+ {preview.description && (
298
+ <div className="flex items-baseline gap-2">
299
+ <span className="text-xs font-medium text-muted-foreground w-20 shrink-0">Description</span>
300
+ <span className="text-sm text-foreground">{preview.description}</span>
301
+ </div>
302
+ )}
303
+ </div>
304
+
305
+ {/* File list */}
306
+ <div className="border-b border-border px-4 py-3">
307
+ <div className="mb-2 flex items-baseline justify-between">
308
+ <span className="text-xs font-medium text-muted-foreground">
309
+ Files ({preview.files.filter((f) => !f.isDirectory).length})
310
+ </span>
311
+ <span className="text-[10px] text-muted-foreground-subtle">
312
+ {formatBytes(preview.totalSize)} total
313
+ </span>
314
+ </div>
315
+ <div className="rounded-md border border-border overflow-hidden">
316
+ <table className="w-full text-xs">
317
+ <tbody>
318
+ {preview.files
319
+ .filter((f) => !f.isDirectory)
320
+ .map((file) => (
321
+ <tr key={file.path} className="border-b border-border last:border-b-0">
322
+ <td className="px-3 py-1.5 font-mono text-foreground">{file.path}</td>
323
+ <td className="px-3 py-1.5 text-right text-muted-foreground tabular-nums">
324
+ {formatBytes(file.size)}
325
+ </td>
326
+ </tr>
327
+ ))}
328
+ </tbody>
329
+ </table>
330
+ </div>
331
+ </div>
332
+
333
+ {/* SKILL.md preview */}
334
+ {strippedContent && (
335
+ <div className="border-b border-border px-4 py-3">
336
+ <span className="mb-2 block text-xs font-medium text-muted-foreground">
337
+ SKILL.md Preview
338
+ </span>
339
+ <div className="max-h-[240px] overflow-y-auto rounded-md border border-border p-3">
340
+ <Markdown remarkPlugins={REMARK_PLUGINS} components={MARKDOWN_COMPONENTS}>
341
+ {strippedContent}
342
+ </Markdown>
343
+ </div>
344
+ </div>
345
+ )}
346
+
347
+ {/* Duplicate warning */}
348
+ {isDuplicate && (
349
+ <div className="flex items-start gap-2.5 border-b border-amber-500/20 bg-amber-500/5 px-4 py-3" role="alert">
350
+ <WarningIcon className="mt-0.5 size-4 shrink-0 text-amber-600 dark:text-amber-400" />
351
+ <div className="min-w-0 flex-1">
352
+ <p className="text-sm font-medium text-amber-700 dark:text-amber-300">
353
+ No changes detected
354
+ </p>
355
+ <p className="mt-0.5 text-xs text-amber-600 dark:text-amber-400">
356
+ This skill&apos;s content is identical to the current version. Pushing will create a new version record with the same content.
357
+ </p>
358
+ </div>
359
+ </div>
360
+ )}
361
+
362
+ {isCheckingDuplicate && (
363
+ <div className="flex items-center gap-2 border-b border-border px-4 py-2">
364
+ <Spinner />
365
+ <span className="text-xs text-muted-foreground">Checking for changes...</span>
366
+ </div>
367
+ )}
368
+
369
+ {/* Error */}
370
+ {pushError && (
371
+ <div className="px-4 py-2">
372
+ <p className="text-sm text-destructive" role="alert">
373
+ {pushError.message}
374
+ </p>
375
+ </div>
376
+ )}
377
+
378
+ {/* Footer actions */}
379
+ <div className="flex items-center justify-between px-4 py-3">
380
+ <button
381
+ type="button"
382
+ onClick={onReset}
383
+ className={cn(
384
+ "rounded-md px-3 py-1.5 text-sm font-medium text-muted-foreground",
385
+ "hover:text-foreground hover:bg-muted",
386
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
387
+ "transition-colors",
388
+ )}
389
+ >
390
+ Choose Different File
391
+ </button>
392
+
393
+ <div className="flex items-center gap-2">
394
+ {onCancel && (
395
+ <button
396
+ type="button"
397
+ onClick={onCancel}
398
+ className={cn(
399
+ "rounded-md px-3 py-1.5 text-sm font-medium text-muted-foreground",
400
+ "hover:text-foreground hover:bg-muted",
401
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
402
+ "transition-colors",
403
+ )}
404
+ >
405
+ Cancel
406
+ </button>
407
+ )}
408
+ <button
409
+ type="button"
410
+ onClick={onPush}
411
+ disabled={isPushing}
412
+ className={cn(
413
+ "rounded-md bg-primary px-4 py-1.5 text-sm font-medium text-primary-foreground",
414
+ "hover:bg-primary-hover",
415
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
416
+ "disabled:opacity-50 disabled:cursor-not-allowed",
417
+ "transition-colors",
418
+ )}
419
+ >
420
+ {isPushing ? "Pushing..." : isDuplicate ? "Push Anyway" : "Push Skill"}
421
+ </button>
422
+ </div>
423
+ </div>
424
+ </div>
425
+ );
426
+ }
427
+
428
+ // ---------------------------------------------------------------------------
429
+ // Utilities
430
+ // ---------------------------------------------------------------------------
431
+
432
+ function normalizeToSlug(name: string): string {
433
+ return name.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
434
+ }
435
+
436
+ function formatBytes(bytes: number): string {
437
+ if (bytes < 1024) return `${bytes} B`;
438
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
439
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
440
+ }
441
+
442
+ // ---------------------------------------------------------------------------
443
+ // Icons
444
+ // ---------------------------------------------------------------------------
445
+
446
+ function WarningIcon({ className }: { readonly className?: string }) {
447
+ return (
448
+ <svg className={className} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
449
+ <path d="M8 1.5 1 14h14L8 1.5Z" />
450
+ <path d="M8 6v3.5" />
451
+ <circle cx="8" cy="11.5" r="0.5" fill="currentColor" stroke="none" />
452
+ </svg>
453
+ );
454
+ }
455
+
456
+ function Spinner() {
457
+ return (
458
+ <svg width="14" height="14" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" className="animate-spin" aria-hidden="true">
459
+ <path d="M8 2a6 6 0 1 0 6 6" />
460
+ </svg>
461
+ );
462
+ }
463
+
464
+ function UploadIcon({ className }: { readonly className?: string }) {
465
+ return (
466
+ <svg
467
+ className={className}
468
+ viewBox="0 0 24 24"
469
+ fill="none"
470
+ stroke="currentColor"
471
+ strokeWidth="1.5"
472
+ strokeLinecap="round"
473
+ strokeLinejoin="round"
474
+ aria-hidden="true"
475
+ >
476
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
477
+ <polyline points="17 8 12 3 7 8" />
478
+ <line x1="12" y1="3" x2="12" y2="15" />
479
+ </svg>
480
+ );
481
+ }
@@ -24,3 +24,37 @@ export type { SkillPickerProps } from "./SkillPicker";
24
24
 
25
25
  export { SkillDetailView } from "./SkillDetailView";
26
26
  export type { SkillDetailViewProps } from "./SkillDetailView";
27
+
28
+ export { usePushSkill } from "./usePushSkill";
29
+ export type { PushSkillInput, UsePushSkillReturn } from "./usePushSkill";
30
+
31
+ export { useSkillUpload } from "./useSkillUpload";
32
+ export type {
33
+ SkillUploadPreview,
34
+ SkillFileEntry,
35
+ UseSkillUploadReturn,
36
+ } from "./useSkillUpload";
37
+
38
+ export { useSkillArtifact } from "./useSkillArtifact";
39
+ export type { UseSkillArtifactReturn } from "./useSkillArtifact";
40
+
41
+ export { SkillUploader } from "./SkillUploader";
42
+ export type { SkillUploaderProps } from "./SkillUploader";
43
+
44
+ export { SkillFileBrowser } from "./SkillFileBrowser";
45
+ export type { SkillFileBrowserProps } from "./SkillFileBrowser";
46
+
47
+ export { useSkillVersions } from "./useSkillVersions";
48
+ export type { UseSkillVersionsReturn } from "./useSkillVersions";
49
+
50
+ export { useSkillDiff } from "./useSkillDiff";
51
+ export type { UseSkillDiffReturn } from "./useSkillDiff";
52
+
53
+ export { SkillDiffDialog } from "./SkillDiffDialog";
54
+ export type {
55
+ SkillDiffDialogProps,
56
+ SkillDiffDialogState,
57
+ } from "./SkillDiffDialog";
58
+
59
+ export { useSkillDuplicateCheck } from "./useSkillDuplicateCheck";
60
+ export type { UseSkillDuplicateCheckReturn } from "./useSkillDuplicateCheck";
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Computes a SHA-256 hex digest of the given bytes using Web Crypto.
3
+ *
4
+ * Returns the same 64-character lowercase hex string that the backend
5
+ * produces for `SkillStatus.versionHash`, enabling client-side
6
+ * duplicate detection before pushing.
7
+ */
8
+ export async function computeArtifactHash(bytes: Uint8Array): Promise<string> {
9
+ const digest = await crypto.subtle.digest("SHA-256", bytes as unknown as ArrayBuffer);
10
+ return Array.from(new Uint8Array(digest))
11
+ .map((b) => b.toString(16).padStart(2, "0"))
12
+ .join("");
13
+ }
@@ -0,0 +1,48 @@
1
+ import { create } from "@bufbuild/protobuf";
2
+ import { GetArtifactRequestSchema } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/io_pb";
3
+ import type { Stigmer } from "@stigmer/sdk";
4
+ import type { SkillFileEntry } from "../useSkillUpload";
5
+
6
+ /** Unpacked artifact: file entries for browsing + content map for reading. */
7
+ export interface UnpackedArtifact {
8
+ readonly files: SkillFileEntry[];
9
+ readonly contentMap: ReadonlyMap<string, string>;
10
+ }
11
+
12
+ /**
13
+ * Fetch a skill artifact by storage key, unzip it, and return the file listing
14
+ * with a content map. Shared by `useSkillArtifact` (single-version browser)
15
+ * and `useSkillDiff` (two-version comparison).
16
+ *
17
+ * Throws on network or decompression errors — callers handle error state.
18
+ */
19
+ export async function fetchAndUnpackArtifact(
20
+ stigmer: Stigmer,
21
+ artifactStorageKey: string,
22
+ ): Promise<UnpackedArtifact> {
23
+ const request = create(GetArtifactRequestSchema, { artifactStorageKey });
24
+ const response = await stigmer.skill.getArtifact(request);
25
+
26
+ const { unzipSync, strFromU8 } = await import("fflate");
27
+ const unzipped = unzipSync(response.artifact);
28
+
29
+ const entries = Object.entries(unzipped);
30
+ const files: SkillFileEntry[] = entries.map(([path, data]) => ({
31
+ path,
32
+ size: data.length,
33
+ isDirectory: data.length === 0 && path.endsWith("/"),
34
+ }));
35
+
36
+ const contentMap = new Map<string, string>();
37
+ for (const [path, data] of entries) {
38
+ if (!path.endsWith("/") && data.length > 0) {
39
+ try {
40
+ contentMap.set(path, strFromU8(data));
41
+ } catch {
42
+ contentMap.set(path, "[Binary content]");
43
+ }
44
+ }
45
+ }
46
+
47
+ return { files, contentMap };
48
+ }
@@ -0,0 +1,101 @@
1
+ "use client";
2
+
3
+ import { useCallback, useState } from "react";
4
+ import { create } from "@bufbuild/protobuf";
5
+ import type { Skill } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/api_pb";
6
+ import { PushSkillRequestSchema } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/io_pb";
7
+ import { useStigmer } from "../hooks";
8
+ import { toError } from "../internal/toError";
9
+
10
+ // ---------------------------------------------------------------------------
11
+ // Public types
12
+ // ---------------------------------------------------------------------------
13
+
14
+ /** Input for pushing a skill artifact (ZIP package). */
15
+ export interface PushSkillInput {
16
+ /** Organization that will own the skill. */
17
+ readonly org: string;
18
+ /** Raw ZIP bytes of the skill package (must contain SKILL.md at root). */
19
+ readonly artifact: Uint8Array;
20
+ /** Optional version tag (e.g. "stable", "v1.0"). */
21
+ readonly tag?: string;
22
+ }
23
+
24
+ /** Return value of {@link usePushSkill}. */
25
+ export interface UsePushSkillReturn {
26
+ /**
27
+ * Push a skill artifact ZIP to the server.
28
+ *
29
+ * The caller is responsible for providing a valid ZIP containing
30
+ * a SKILL.md with proper YAML frontmatter. Use {@link useSkillUpload}
31
+ * to validate the ZIP before pushing.
32
+ *
33
+ * Resolves with the server-persisted `Skill` resource including
34
+ * populated metadata (id, slug, version hash).
35
+ */
36
+ readonly push: (input: PushSkillInput) => Promise<Skill>;
37
+ /** `true` while the push request is in flight. */
38
+ readonly isPushing: boolean;
39
+ /** Error from the last failed push, or `null` when healthy. */
40
+ readonly error: Error | null;
41
+ /** Reset `error` to `null`. */
42
+ readonly clearError: () => void;
43
+ }
44
+
45
+ // ---------------------------------------------------------------------------
46
+ // Hook implementation
47
+ // ---------------------------------------------------------------------------
48
+
49
+ /**
50
+ * Mutation hook that pushes a skill artifact ZIP to the server.
51
+ *
52
+ * Accepts raw ZIP bytes and calls `stigmer.skill.push()` directly.
53
+ * The ZIP must contain a valid SKILL.md with YAML frontmatter — use
54
+ * {@link useSkillUpload} to validate before pushing.
55
+ *
56
+ * Follows the established SDK mutation hook pattern: `isPushing` flag,
57
+ * `error` state, `clearError` reset, result returned from the promise.
58
+ *
59
+ * @example
60
+ * ```tsx
61
+ * const { push, isPushing, error } = usePushSkill();
62
+ * const upload = useSkillUpload();
63
+ *
64
+ * // After upload.processFile(file) succeeds:
65
+ * if (upload.artifact) {
66
+ * const skill = await push({ org: "acme", artifact: upload.artifact });
67
+ * }
68
+ * ```
69
+ */
70
+ export function usePushSkill(): UsePushSkillReturn {
71
+ const stigmer = useStigmer();
72
+ const [isPushing, setIsPushing] = useState(false);
73
+ const [error, setError] = useState<Error | null>(null);
74
+
75
+ const clearError = useCallback(() => setError(null), []);
76
+
77
+ const push = useCallback(
78
+ async (input: PushSkillInput): Promise<Skill> => {
79
+ setIsPushing(true);
80
+ setError(null);
81
+
82
+ try {
83
+ const request = create(PushSkillRequestSchema, {
84
+ org: input.org,
85
+ artifact: input.artifact,
86
+ tag: input.tag ?? "",
87
+ });
88
+
89
+ return await stigmer.skill.push(request);
90
+ } catch (err) {
91
+ setError(toError(err));
92
+ throw err;
93
+ } finally {
94
+ setIsPushing(false);
95
+ }
96
+ },
97
+ [stigmer],
98
+ );
99
+
100
+ return { push, isPushing, error, clearError };
101
+ }