@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
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useEffect, useRef } from "react";
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import Markdown from "react-markdown";
5
5
  import { cn } from "@stigmer/theme";
6
6
  import { timestampDate } from "@bufbuild/protobuf/wkt";
@@ -9,9 +9,24 @@ import type { GitProvenance } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/
9
9
  import { SkillState } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/status_pb";
10
10
  import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
11
11
  import { useSkill } from "./useSkill";
12
+ import { SkillFileBrowser } from "./SkillFileBrowser";
12
13
  import { ErrorMessage } from "../error/ErrorMessage";
13
14
  import { VisibilityToggle } from "../library/VisibilityToggle";
14
15
  import { MARKDOWN_COMPONENTS, REMARK_PLUGINS, stripFrontmatter } from "../internal/markdown-components";
16
+ import { ResourceDetailShell } from "../resource-detail/ResourceDetailShell";
17
+ import { Section } from "../resource-detail/Section";
18
+ import { useDetailTabs } from "../resource-detail/useDetailTabs";
19
+ import type { AdditionalTab, DetailAction, ResourceHeaderMeta } from "../resource-detail/types";
20
+ import { InlineEditText } from "../inline-edit/InlineEditText";
21
+ import { InlineEditTextarea } from "../inline-edit/InlineEditTextarea";
22
+ import type { TabItem } from "../tabs/Tabs";
23
+ import type { StatusPhase } from "../resource-workbench/types";
24
+ import { useSkillVersions } from "./useSkillVersions";
25
+ import { VersionTimeline } from "../version-history/VersionTimeline";
26
+ import { SkillDiffDialog, type SkillDiffDialogState } from "./SkillDiffDialog";
27
+
28
+ const CONTENT_TAB: TabItem = { id: "content", label: "Content" };
29
+ const VERSIONS_TAB: TabItem = { id: "versions", label: "Versions" };
15
30
 
16
31
  /** Props for {@link SkillDetailView}. */
17
32
  export interface SkillDetailViewProps {
@@ -39,21 +54,82 @@ export interface SkillDetailViewProps {
39
54
  readonly onVisibilityChange?: (v: ApiResourceVisibility) => void;
40
55
  /** `true` while a visibility update RPC is in flight. */
41
56
  readonly isVisibilityPending?: boolean;
57
+ /**
58
+ * Primary action rendered as a visible button in the header area.
59
+ */
60
+ readonly primaryAction?: DetailAction;
61
+ /**
62
+ * Secondary actions rendered in the kebab overflow menu.
63
+ */
64
+ readonly actions?: readonly DetailAction[];
65
+ /**
66
+ * Additional tabs to render alongside the built-in "Content" tab.
67
+ * When provided (with at least one entry), a tab bar appears.
68
+ * When omitted or empty, no tab bar is shown (single-tab suppression).
69
+ *
70
+ * Each entry provides both the tab metadata and the content to render.
71
+ * The SDK manages the tab switching logic internally.
72
+ *
73
+ * @example
74
+ * ```tsx
75
+ * <SkillDetailView
76
+ * org="acme"
77
+ * slug="code-style-guide"
78
+ * additionalTabs={[
79
+ * { id: "versions", label: "Versions", content: <VersionTimeline /> },
80
+ * ]}
81
+ * />
82
+ * ```
83
+ */
84
+ readonly additionalTabs?: readonly AdditionalTab[];
85
+ /**
86
+ * Controlled active tab ID. When provided together with `onTabChange`,
87
+ * the component operates in controlled mode — the consumer owns tab state.
88
+ * When omitted, the component manages its own internal tab state.
89
+ */
90
+ readonly activeTab?: string;
91
+ /**
92
+ * Controlled tab change handler. When provided together with `activeTab`,
93
+ * the component operates in controlled mode.
94
+ */
95
+ readonly onTabChange?: (tabId: string) => void;
96
+ /**
97
+ * Default active tab ID when in uncontrolled mode.
98
+ * @default "content"
99
+ */
100
+ readonly defaultTab?: string;
101
+ /**
102
+ * Called when the user selects a version in the Versions tab timeline.
103
+ * Provides the version hash for use cases like navigation to a
104
+ * version-specific detail view or triggering a diff comparison.
105
+ */
106
+ readonly onVersionSelect?: (versionHash: string) => void;
107
+ /**
108
+ * When `true`, metadata fields (description, tag) become click-to-edit.
109
+ * Skill content (SKILL.md / artifact) is NOT editable inline — use the upload flow.
110
+ * @default false
111
+ */
112
+ readonly editable?: boolean;
113
+ /**
114
+ * Called after a successful inline field save with the updated skill.
115
+ * Consumers can use this to refresh breadcrumbs, sync URL state, etc.
116
+ */
117
+ readonly onResourceUpdated?: (skill: Skill) => void;
42
118
  /** Additional CSS classes for the root container. */
43
119
  readonly className?: string;
44
120
  }
45
121
 
46
122
  /**
47
- * Read-only detail view for a Skill knowledge package.
123
+ * Operational detail hub for a Skill knowledge package.
48
124
  *
49
125
  * Fetches the skill via {@link useSkill} internally and renders its
50
- * full content in structured sections: header, SKILL.md content
51
- * (rendered as formatted markdown), and version/provenance info.
52
- * Sections with no data are omitted entirely.
126
+ * content inside a {@link ResourceDetailShell}: a standardized header
127
+ * with action bar, the SKILL.md content with a source/rendered toggle,
128
+ * and version/provenance information.
53
129
  *
54
130
  * The SKILL.md content is the primary value of this view — it IS the
55
- * skill. The markdown is rendered using the same styled component
56
- * overrides used across all SDK markdown surfaces.
131
+ * skill. Users can toggle between rendered markdown and raw source
132
+ * (like GitHub's Preview/Code toggle).
57
133
  *
58
134
  * Handles loading, error, and not-found states automatically.
59
135
  * Zero Console dependencies — safe for platform builder embedding.
@@ -78,9 +154,61 @@ export function SkillDetailView({
78
154
  onResourceLoad,
79
155
  onVisibilityChange,
80
156
  isVisibilityPending,
157
+ primaryAction,
158
+ actions,
159
+ additionalTabs,
160
+ activeTab,
161
+ onTabChange,
162
+ defaultTab,
163
+ onVersionSelect,
164
+ editable = false,
165
+ onResourceUpdated,
81
166
  className,
82
167
  }: SkillDetailViewProps) {
83
168
  const { skill, isLoading, error, refetch } = useSkill(org, slug, version);
169
+ const { versions, isEmpty: noVersions, getArtifactKey } = useSkillVersions(org, slug);
170
+ const [diffState, setDiffState] = useState<SkillDiffDialogState | null>(null);
171
+
172
+ const builtInTabs = useMemo<readonly TabItem[]>(
173
+ () => (noVersions ? [CONTENT_TAB] : [CONTENT_TAB, VERSIONS_TAB]),
174
+ [noVersions],
175
+ );
176
+
177
+ const {
178
+ effectiveTabs,
179
+ effectiveActiveTab,
180
+ effectiveOnTabChange,
181
+ activeAdditionalTab,
182
+ } = useDetailTabs({
183
+ builtInTabs,
184
+ additionalTabs,
185
+ activeTab,
186
+ onTabChange,
187
+ defaultTab,
188
+ });
189
+
190
+ const handleVersionSelect = useCallback(
191
+ (id: string) => onVersionSelect?.(id),
192
+ [onVersionSelect],
193
+ );
194
+
195
+ const handleCompare = useCallback(
196
+ (fromId: string, toId: string) => {
197
+ const fromKey = getArtifactKey(fromId);
198
+ const toKey = getArtifactKey(toId);
199
+ if (!fromKey || !toKey) return;
200
+
201
+ setDiffState({
202
+ fromArtifactKey: fromKey,
203
+ toArtifactKey: toKey,
204
+ fromLabel: fromId.slice(0, 12),
205
+ toLabel: toId.slice(0, 12),
206
+ });
207
+ },
208
+ [getArtifactKey],
209
+ );
210
+
211
+ const closeDiff = useCallback(() => setDiffState(null), []);
84
212
 
85
213
  const onResourceLoadRef = useRef(onResourceLoad);
86
214
  onResourceLoadRef.current = onResourceLoad;
@@ -96,164 +224,270 @@ export function SkillDetailView({
96
224
  return <ErrorMessage error={error} retry={refetch} className={className} />;
97
225
  if (!skill) return <NotFoundState className={className} />;
98
226
 
227
+ const meta = skill.metadata;
99
228
  const spec = skill.spec;
100
229
  const status = skill.status;
101
230
  const specAudit = status?.audit?.specAudit;
102
231
 
103
- return (
104
- <div className={cn("flex flex-col gap-6", className)}>
105
- <Header
106
- skill={skill}
107
- createdAt={
108
- specAudit?.createdAt ? timestampDate(specAudit.createdAt) : null
109
- }
110
- updatedAt={
111
- specAudit?.updatedAt ? timestampDate(specAudit.updatedAt) : null
112
- }
232
+ const headerMeta: ResourceHeaderMeta = {
233
+ name: meta?.name || meta?.slug || "Untitled",
234
+ id: meta?.id || "",
235
+ org: meta?.org,
236
+ slug: meta?.slug,
237
+ description: undefined,
238
+ icon: <SkillIcon className="size-6 text-muted-foreground" />,
239
+ createdAt: specAudit?.createdAt ? timestampDate(specAudit.createdAt) : null,
240
+ updatedAt: specAudit?.updatedAt ? timestampDate(specAudit.updatedAt) : null,
241
+ status: status ? skillStateToPhase(status.state) : undefined,
242
+ statusLabel: status ? skillStateLabel(status.state) : undefined,
243
+ };
244
+
245
+ const isPublic = meta?.visibility === ApiResourceVisibility.visibility_public;
246
+ const visibilityControl =
247
+ onVisibilityChange && meta ? (
248
+ <VisibilityToggle
249
+ visibility={meta.visibility}
113
250
  onVisibilityChange={onVisibilityChange}
114
- isVisibilityPending={isVisibilityPending}
251
+ isPending={isVisibilityPending}
115
252
  />
253
+ ) : isPublic ? (
254
+ <span className="shrink-0 rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground">
255
+ Public
256
+ </span>
257
+ ) : undefined;
258
+
259
+ let tabContent: React.ReactNode;
260
+ if (activeAdditionalTab) {
261
+ tabContent = activeAdditionalTab.content;
262
+ } else if (effectiveActiveTab === "versions" && versions.length > 0) {
263
+ tabContent = (
264
+ <VersionTimeline
265
+ entries={versions}
266
+ onEntrySelect={handleVersionSelect}
267
+ onCompare={handleCompare}
268
+ />
269
+ );
270
+ } else {
271
+ tabContent = (
272
+ <SkillOverview
273
+ spec={spec}
274
+ status={status}
275
+ editable={editable}
276
+ />
277
+ );
278
+ }
116
279
 
117
- {spec?.skillMd && (
118
- <SkillContentSection content={spec.skillMd} />
119
- )}
120
-
121
- {status && (status.versionHash || status.gitProvenance) && (
122
- <VersionSection
123
- versionHash={status.versionHash}
124
- gitProvenance={status.gitProvenance}
125
- />
126
- )}
127
- </div>
280
+ return (
281
+ <>
282
+ <ResourceDetailShell
283
+ header={headerMeta}
284
+ visibilityControl={visibilityControl}
285
+ primaryAction={primaryAction}
286
+ actions={actions}
287
+ tabs={effectiveTabs}
288
+ activeTab={effectiveTabs ? effectiveActiveTab : undefined}
289
+ onTabChange={effectiveTabs ? effectiveOnTabChange : undefined}
290
+ tabsAriaLabel="Skill detail sections"
291
+ className={className}
292
+ >
293
+ {tabContent}
294
+ </ResourceDetailShell>
295
+ <SkillDiffDialog state={diffState} onClose={closeDiff} />
296
+ </>
128
297
  );
129
298
  }
130
299
 
131
300
  // ---------------------------------------------------------------------------
132
- // Internal section components
301
+ // Overview content — the skill's built-in "Content" tab
133
302
  // ---------------------------------------------------------------------------
134
303
 
135
- function Header({
136
- skill,
137
- createdAt,
138
- updatedAt,
139
- onVisibilityChange,
140
- isVisibilityPending,
304
+ function SkillOverview({
305
+ spec,
306
+ status,
307
+ editable,
141
308
  }: {
142
- readonly skill: Skill;
143
- readonly createdAt: Date | null;
144
- readonly updatedAt: Date | null;
145
- readonly onVisibilityChange?: (v: ApiResourceVisibility) => void;
146
- readonly isVisibilityPending?: boolean;
309
+ readonly spec: NonNullable<Skill["spec"]> | undefined;
310
+ readonly status: Skill["status"] | undefined;
311
+ readonly editable?: boolean;
147
312
  }) {
148
- const meta = skill.metadata;
149
- const spec = skill.spec;
150
- const status = skill.status;
151
- const displayName = meta?.name || meta?.slug || "Untitled";
152
- const isPublic =
153
- meta?.visibility === ApiResourceVisibility.visibility_public;
154
-
155
313
  return (
156
- <div className="flex items-start gap-3">
157
- <SkillIcon className="mt-1 size-6 shrink-0 text-muted-foreground" />
158
- <div className="min-w-0 flex-1">
159
- <div className="flex items-center gap-2">
160
- <h2 className="truncate text-lg font-semibold text-foreground">
161
- {displayName}
162
- </h2>
163
- {onVisibilityChange && meta ? (
164
- <VisibilityToggle
165
- visibility={meta.visibility}
166
- onVisibilityChange={onVisibilityChange}
167
- isPending={isVisibilityPending}
168
- />
314
+ <div className="flex flex-col gap-6">
315
+ {(editable || spec?.description) && (
316
+ <Section title="Description">
317
+ {editable ? (
318
+ <div className="max-h-20 overflow-y-auto p-3">
319
+ <InlineEditTextarea
320
+ value={spec?.description || ""}
321
+ onSave={async () => false}
322
+ isSaving={false}
323
+ placeholder="Add a description"
324
+ minRows={2}
325
+ disabled
326
+ />
327
+ </div>
169
328
  ) : (
170
- isPublic && (
171
- <span className="shrink-0 rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground">
172
- Public
173
- </span>
174
- )
329
+ <div className="p-3">
330
+ <pre className="whitespace-pre-wrap break-words text-sm text-foreground font-sans">
331
+ {spec?.description}
332
+ </pre>
333
+ </div>
175
334
  )}
176
- </div>
177
- <div className="mt-0.5 flex flex-wrap items-center gap-x-1.5 text-xs text-muted-foreground">
178
- {meta?.org && <span>{meta.org}</span>}
179
- {spec?.tag && (
180
- <>
181
- <Dot />
182
- <span className="rounded bg-muted px-1.5 py-0.5 font-mono text-[10px] font-medium">
183
- {spec.tag}
335
+ </Section>
336
+ )}
337
+
338
+ {(editable || spec?.tag) && (
339
+ <Section title="Tag">
340
+ {editable ? (
341
+ <div className="p-3">
342
+ <InlineEditText
343
+ value={spec?.tag || ""}
344
+ onSave={async () => false}
345
+ isSaving={false}
346
+ placeholder="Add a tag (e.g. stable, latest)"
347
+ disabled
348
+ />
349
+ </div>
350
+ ) : (
351
+ <div className="flex items-center gap-2 px-3 py-2.5">
352
+ <span className="rounded bg-muted px-1.5 py-0.5 font-mono text-xs font-medium text-foreground">
353
+ {spec?.tag}
184
354
  </span>
185
- </>
355
+ </div>
186
356
  )}
187
- {status && <SkillStateBadge state={status.state} />}
188
- {createdAt && (
189
- <>
190
- <Dot />
191
- <span>Created {formatDate(createdAt)}</span>
192
- </>
193
- )}
194
- {updatedAt && (
195
- <>
196
- <Dot />
197
- <span>Updated {formatDate(updatedAt)}</span>
198
- </>
199
- )}
200
- </div>
201
- {spec?.description && (
202
- <p className="mt-2 text-sm text-muted-foreground">
203
- {spec.description}
204
- </p>
205
- )}
206
- </div>
357
+ </Section>
358
+ )}
359
+
360
+ {status?.artifactStorageKey ? (
361
+ <SkillFileBrowser artifactStorageKey={status.artifactStorageKey} />
362
+ ) : spec?.skillMd ? (
363
+ <SkillContentSection content={spec.skillMd} />
364
+ ) : null}
365
+
366
+ {status && (status.versionHash || status.gitProvenance) && (
367
+ <VersionSection
368
+ versionHash={status.versionHash}
369
+ gitProvenance={status.gitProvenance}
370
+ />
371
+ )}
207
372
  </div>
208
373
  );
209
374
  }
210
375
 
211
- function SkillStateBadge({ state }: { readonly state: SkillState }) {
376
+ // ---------------------------------------------------------------------------
377
+ // Skill state → StatusPhase mapping
378
+ // ---------------------------------------------------------------------------
379
+
380
+ function skillStateToPhase(state: SkillState): StatusPhase | undefined {
212
381
  switch (state) {
213
382
  case SkillState.READY:
214
- return (
215
- <>
216
- <Dot />
217
- <span className="inline-flex items-center gap-1 text-emerald-600 dark:text-emerald-400">
218
- <CheckIcon className="size-3" />
219
- Ready
220
- </span>
221
- </>
222
- );
383
+ return "ready";
384
+ case SkillState.FAILED:
385
+ return "failed";
386
+ case SkillState.UPLOADING:
387
+ return "pending";
388
+ default:
389
+ return undefined;
390
+ }
391
+ }
392
+
393
+ function skillStateLabel(state: SkillState): string | undefined {
394
+ switch (state) {
395
+ case SkillState.READY:
396
+ return "Ready";
223
397
  case SkillState.FAILED:
224
- return (
225
- <>
226
- <Dot />
227
- <span className="text-destructive">Failed</span>
228
- </>
229
- );
398
+ return "Failed";
230
399
  case SkillState.UPLOADING:
231
- return (
232
- <>
233
- <Dot />
234
- <span className="text-amber-600 dark:text-amber-400">Uploading</span>
235
- </>
236
- );
400
+ return "Uploading";
237
401
  default:
238
- return null;
402
+ return undefined;
239
403
  }
240
404
  }
241
405
 
406
+ // ---------------------------------------------------------------------------
407
+ // Content section with source/rendered toggle
408
+ // ---------------------------------------------------------------------------
409
+
410
+ type ContentViewMode = "rendered" | "source";
411
+
242
412
  function SkillContentSection({ content }: { readonly content: string }) {
413
+ const [viewMode, setViewMode] = useState<ContentViewMode>("rendered");
414
+
243
415
  return (
244
- <Section title="Skill Content">
245
- <div className="p-4">
246
- <Markdown
247
- remarkPlugins={REMARK_PLUGINS}
248
- components={MARKDOWN_COMPONENTS}
249
- >
250
- {stripFrontmatter(content)}
251
- </Markdown>
252
- </div>
253
- </Section>
416
+ <SkillSection
417
+ title="Skill Content"
418
+ trailing={
419
+ <ContentViewToggle value={viewMode} onChange={setViewMode} />
420
+ }
421
+ >
422
+ {viewMode === "rendered" ? (
423
+ <div className="p-4">
424
+ <Markdown
425
+ remarkPlugins={REMARK_PLUGINS}
426
+ components={MARKDOWN_COMPONENTS}
427
+ >
428
+ {stripFrontmatter(content)}
429
+ </Markdown>
430
+ </div>
431
+ ) : (
432
+ <pre className="overflow-x-auto p-4 font-mono text-sm leading-relaxed text-foreground">
433
+ {content}
434
+ </pre>
435
+ )}
436
+ </SkillSection>
437
+ );
438
+ }
439
+
440
+ function ContentViewToggle({
441
+ value,
442
+ onChange,
443
+ }: {
444
+ readonly value: ContentViewMode;
445
+ readonly onChange: (mode: ContentViewMode) => void;
446
+ }) {
447
+ return (
448
+ <div
449
+ role="radiogroup"
450
+ aria-label="Content view mode"
451
+ className="inline-flex rounded-md border border-input text-[11px]"
452
+ >
453
+ <button
454
+ type="button"
455
+ role="radio"
456
+ aria-checked={value === "rendered"}
457
+ onClick={() => onChange("rendered")}
458
+ className={cn(
459
+ "rounded-l-md px-2 py-0.5 font-medium transition-colors",
460
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
461
+ value === "rendered"
462
+ ? "bg-muted text-foreground"
463
+ : "text-muted-foreground hover:text-foreground",
464
+ )}
465
+ >
466
+ Preview
467
+ </button>
468
+ <button
469
+ type="button"
470
+ role="radio"
471
+ aria-checked={value === "source"}
472
+ onClick={() => onChange("source")}
473
+ className={cn(
474
+ "rounded-r-md border-l border-input px-2 py-0.5 font-medium transition-colors",
475
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
476
+ value === "source"
477
+ ? "bg-muted text-foreground"
478
+ : "text-muted-foreground hover:text-foreground",
479
+ )}
480
+ >
481
+ Source
482
+ </button>
483
+ </div>
254
484
  );
255
485
  }
256
486
 
487
+ // ---------------------------------------------------------------------------
488
+ // Version section
489
+ // ---------------------------------------------------------------------------
490
+
257
491
  function VersionSection({
258
492
  versionHash,
259
493
  gitProvenance,
@@ -347,18 +581,23 @@ function GitProvenanceDisplay({
347
581
  // Shared layout primitives
348
582
  // ---------------------------------------------------------------------------
349
583
 
350
- function Section({
584
+ function SkillSection({
351
585
  title,
586
+ trailing,
352
587
  children,
353
588
  }: {
354
589
  readonly title: string;
590
+ readonly trailing?: React.ReactNode;
355
591
  readonly children: React.ReactNode;
356
592
  }) {
357
593
  return (
358
594
  <section>
359
- <h3 className="mb-2 text-xs font-medium uppercase tracking-wider text-muted-foreground">
360
- {title}
361
- </h3>
595
+ <div className="mb-2 flex items-center justify-between">
596
+ <h3 className="text-xs font-medium uppercase tracking-wider text-muted-foreground">
597
+ {title}
598
+ </h3>
599
+ {trailing}
600
+ </div>
362
601
  <div className="overflow-hidden rounded-lg border border-border">
363
602
  {children}
364
603
  </div>
@@ -366,14 +605,6 @@ function Section({
366
605
  );
367
606
  }
368
607
 
369
- function Dot() {
370
- return (
371
- <span className="shrink-0" aria-hidden="true">
372
- {"\u00B7"}
373
- </span>
374
- );
375
- }
376
-
377
608
  // ---------------------------------------------------------------------------
378
609
  // Non-happy states
379
610
  // ---------------------------------------------------------------------------
@@ -435,14 +666,6 @@ function NotFoundState({ className }: { readonly className?: string }) {
435
666
  // Utilities
436
667
  // ---------------------------------------------------------------------------
437
668
 
438
- function formatDate(date: Date): string {
439
- return date.toLocaleDateString("en-US", {
440
- month: "short",
441
- day: "numeric",
442
- year: "numeric",
443
- });
444
- }
445
-
446
669
  function normalizeGitUrl(url: string): string | null {
447
670
  if (!url) return null;
448
671
  const cleaned = url.replace(/\.git$/, "");
@@ -485,20 +708,3 @@ function SkillIcon({ className }: { readonly className?: string }) {
485
708
  </svg>
486
709
  );
487
710
  }
488
-
489
- function CheckIcon({ className }: { readonly className?: string }) {
490
- return (
491
- <svg
492
- className={className}
493
- viewBox="0 0 16 16"
494
- fill="none"
495
- stroke="currentColor"
496
- strokeWidth="2"
497
- strokeLinecap="round"
498
- strokeLinejoin="round"
499
- aria-hidden="true"
500
- >
501
- <path d="m3 8.5 3.5 3.5 6.5-8" />
502
- </svg>
503
- );
504
- }