@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.
- package/action-menu/ActionMenu.d.ts +64 -0
- package/action-menu/ActionMenu.d.ts.map +1 -0
- package/action-menu/ActionMenu.js +78 -0
- package/action-menu/ActionMenu.js.map +1 -0
- package/action-menu/index.d.ts +3 -0
- package/action-menu/index.d.ts.map +1 -0
- package/action-menu/index.js +2 -0
- package/action-menu/index.js.map +1 -0
- package/action-menu/types.d.ts +65 -0
- package/action-menu/types.d.ts.map +1 -0
- package/action-menu/types.js +2 -0
- package/action-menu/types.js.map +1 -0
- package/agent/AgentCreationWizard.d.ts +55 -0
- package/agent/AgentCreationWizard.d.ts.map +1 -0
- package/agent/AgentCreationWizard.js +115 -0
- package/agent/AgentCreationWizard.js.map +1 -0
- package/agent/AgentDetailView.d.ts +77 -9
- package/agent/AgentDetailView.d.ts.map +1 -1
- package/agent/AgentDetailView.js +265 -87
- package/agent/AgentDetailView.js.map +1 -1
- package/agent/index.d.ts +8 -0
- package/agent/index.d.ts.map +1 -1
- package/agent/index.js +4 -0
- package/agent/index.js.map +1 -1
- package/agent/internal/agentToInput.d.ts +12 -0
- package/agent/internal/agentToInput.d.ts.map +1 -0
- package/agent/internal/agentToInput.js +72 -0
- package/agent/internal/agentToInput.js.map +1 -0
- package/agent/steps/CapabilitiesStep.d.ts +16 -0
- package/agent/steps/CapabilitiesStep.d.ts.map +1 -0
- package/agent/steps/CapabilitiesStep.js +80 -0
- package/agent/steps/CapabilitiesStep.js.map +1 -0
- package/agent/steps/IdentityStep.d.ts +18 -0
- package/agent/steps/IdentityStep.d.ts.map +1 -0
- package/agent/steps/IdentityStep.js +43 -0
- package/agent/steps/IdentityStep.js.map +1 -0
- package/agent/steps/ReviewStep.d.ts +23 -0
- package/agent/steps/ReviewStep.d.ts.map +1 -0
- package/agent/steps/ReviewStep.js +73 -0
- package/agent/steps/ReviewStep.js.map +1 -0
- package/agent/steps/types.d.ts +35 -0
- package/agent/steps/types.d.ts.map +1 -0
- package/agent/steps/types.js +16 -0
- package/agent/steps/types.js.map +1 -0
- package/agent/useCreateAgent.d.ts +45 -0
- package/agent/useCreateAgent.d.ts.map +1 -0
- package/agent/useCreateAgent.js +50 -0
- package/agent/useCreateAgent.js.map +1 -0
- package/agent/useUpdateAgent.d.ts +24 -0
- package/agent/useUpdateAgent.d.ts.map +1 -0
- package/agent/useUpdateAgent.js +35 -0
- package/agent/useUpdateAgent.js.map +1 -0
- package/dependency-graph/DependencyGraph.d.ts +37 -0
- package/dependency-graph/DependencyGraph.d.ts.map +1 -0
- package/dependency-graph/DependencyGraph.js +88 -0
- package/dependency-graph/DependencyGraph.js.map +1 -0
- package/dependency-graph/DependencyTreeNode.d.ts +23 -0
- package/dependency-graph/DependencyTreeNode.d.ts.map +1 -0
- package/dependency-graph/DependencyTreeNode.js +99 -0
- package/dependency-graph/DependencyTreeNode.js.map +1 -0
- package/dependency-graph/index.d.ts +4 -0
- package/dependency-graph/index.d.ts.map +1 -0
- package/dependency-graph/index.js +5 -0
- package/dependency-graph/index.js.map +1 -0
- package/dependency-graph/types.d.ts +130 -0
- package/dependency-graph/types.d.ts.map +1 -0
- package/dependency-graph/types.js +2 -0
- package/dependency-graph/types.js.map +1 -0
- package/dependency-graph/useDependencyGraph.d.ts +27 -0
- package/dependency-graph/useDependencyGraph.d.ts.map +1 -0
- package/dependency-graph/useDependencyGraph.js +129 -0
- package/dependency-graph/useDependencyGraph.js.map +1 -0
- package/empty-state/EmptyState.d.ts +29 -0
- package/empty-state/EmptyState.d.ts.map +1 -0
- package/empty-state/EmptyState.js +45 -0
- package/empty-state/EmptyState.js.map +1 -0
- package/empty-state/index.d.ts +4 -0
- package/empty-state/index.d.ts.map +1 -0
- package/empty-state/index.js +3 -0
- package/empty-state/index.js.map +1 -0
- package/empty-state/types.d.ts +73 -0
- package/empty-state/types.d.ts.map +1 -0
- package/empty-state/types.js +2 -0
- package/empty-state/types.js.map +1 -0
- package/empty-state/useEmptyState.d.ts +18 -0
- package/empty-state/useEmptyState.d.ts.map +1 -0
- package/empty-state/useEmptyState.js +72 -0
- package/empty-state/useEmptyState.js.map +1 -0
- package/feedback/StigmerToaster.d.ts +18 -0
- package/feedback/StigmerToaster.d.ts.map +1 -0
- package/feedback/StigmerToaster.js +31 -0
- package/feedback/StigmerToaster.js.map +1 -0
- package/feedback/index.d.ts +4 -0
- package/feedback/index.d.ts.map +1 -0
- package/feedback/index.js +3 -0
- package/feedback/index.js.map +1 -0
- package/feedback/toast.d.ts +14 -0
- package/feedback/toast.d.ts.map +1 -0
- package/feedback/toast.js +14 -0
- package/feedback/toast.js.map +1 -0
- package/feedback/types.d.ts +4 -0
- package/feedback/types.d.ts.map +1 -0
- package/feedback/types.js +2 -0
- package/feedback/types.js.map +1 -0
- package/index.d.ts +30 -10
- package/index.d.ts.map +1 -1
- package/index.js +29 -9
- package/index.js.map +1 -1
- package/inline-edit/InlineEditImage.d.ts +20 -0
- package/inline-edit/InlineEditImage.d.ts.map +1 -0
- package/inline-edit/InlineEditImage.js +85 -0
- package/inline-edit/InlineEditImage.js.map +1 -0
- package/inline-edit/InlineEditKeyValue.d.ts +29 -0
- package/inline-edit/InlineEditKeyValue.d.ts.map +1 -0
- package/inline-edit/InlineEditKeyValue.js +67 -0
- package/inline-edit/InlineEditKeyValue.js.map +1 -0
- package/inline-edit/InlineEditResourceList.d.ts +34 -0
- package/inline-edit/InlineEditResourceList.d.ts.map +1 -0
- package/inline-edit/InlineEditResourceList.js +99 -0
- package/inline-edit/InlineEditResourceList.js.map +1 -0
- package/inline-edit/InlineEditSelect.d.ts +18 -0
- package/inline-edit/InlineEditSelect.d.ts.map +1 -0
- package/inline-edit/InlineEditSelect.js +54 -0
- package/inline-edit/InlineEditSelect.js.map +1 -0
- package/inline-edit/InlineEditText.d.ts +23 -0
- package/inline-edit/InlineEditText.d.ts.map +1 -0
- package/inline-edit/InlineEditText.js +79 -0
- package/inline-edit/InlineEditText.js.map +1 -0
- package/inline-edit/InlineEditTextarea.d.ts +22 -0
- package/inline-edit/InlineEditTextarea.d.ts.map +1 -0
- package/inline-edit/InlineEditTextarea.js +83 -0
- package/inline-edit/InlineEditTextarea.js.map +1 -0
- package/inline-edit/index.d.ts +16 -0
- package/inline-edit/index.d.ts.map +1 -0
- package/inline-edit/index.js +8 -0
- package/inline-edit/index.js.map +1 -0
- package/inline-edit/types.d.ts +42 -0
- package/inline-edit/types.d.ts.map +1 -0
- package/inline-edit/types.js +2 -0
- package/inline-edit/types.js.map +1 -0
- package/inline-edit/useInlineFieldSave.d.ts +23 -0
- package/inline-edit/useInlineFieldSave.d.ts.map +1 -0
- package/inline-edit/useInlineFieldSave.js +44 -0
- package/inline-edit/useInlineFieldSave.js.map +1 -0
- package/internal/Tabs.d.ts +4 -38
- package/internal/Tabs.d.ts.map +1 -1
- package/internal/Tabs.js +3 -62
- package/internal/Tabs.js.map +1 -1
- package/library/ImportResourceDialog.d.ts +43 -0
- package/library/ImportResourceDialog.d.ts.map +1 -0
- package/library/ImportResourceDialog.js +90 -0
- package/library/ImportResourceDialog.js.map +1 -0
- package/library/index.d.ts +7 -4
- package/library/index.d.ts.map +1 -1
- package/library/index.js +4 -2
- package/library/index.js.map +1 -1
- package/library/serialize-resource-yaml.d.ts +53 -0
- package/library/serialize-resource-yaml.d.ts.map +1 -1
- package/library/serialize-resource-yaml.js +275 -0
- package/library/serialize-resource-yaml.js.map +1 -1
- package/library/useExportResource.d.ts +56 -0
- package/library/useExportResource.d.ts.map +1 -0
- package/library/useExportResource.js +137 -0
- package/library/useExportResource.js.map +1 -0
- package/library/useImportResource.d.ts +84 -0
- package/library/useImportResource.d.ts.map +1 -0
- package/library/useImportResource.js +188 -0
- package/library/useImportResource.js.map +1 -0
- package/mcp-server/McpServerCreationWizard.d.ts +55 -0
- package/mcp-server/McpServerCreationWizard.d.ts.map +1 -0
- package/mcp-server/McpServerCreationWizard.js +121 -0
- package/mcp-server/McpServerCreationWizard.js.map +1 -0
- package/mcp-server/McpServerDetailView.d.ts +21 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +113 -20
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/index.d.ts +8 -0
- package/mcp-server/index.d.ts.map +1 -1
- package/mcp-server/index.js +4 -0
- package/mcp-server/index.js.map +1 -1
- package/mcp-server/internal/mcpServerToInput.d.ts +12 -0
- package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -0
- package/mcp-server/internal/mcpServerToInput.js +81 -0
- package/mcp-server/internal/mcpServerToInput.js.map +1 -0
- package/mcp-server/steps/EnvironmentAuthStep.d.ts +15 -0
- package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -0
- package/mcp-server/steps/EnvironmentAuthStep.js +55 -0
- package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -0
- package/mcp-server/steps/IdentityTransportStep.d.ts +19 -0
- package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -0
- package/mcp-server/steps/IdentityTransportStep.js +73 -0
- package/mcp-server/steps/IdentityTransportStep.js.map +1 -0
- package/mcp-server/steps/ReviewStep.d.ts +23 -0
- package/mcp-server/steps/ReviewStep.d.ts.map +1 -0
- package/mcp-server/steps/ReviewStep.js +137 -0
- package/mcp-server/steps/ReviewStep.js.map +1 -0
- package/mcp-server/steps/types.d.ts +56 -0
- package/mcp-server/steps/types.d.ts.map +1 -0
- package/mcp-server/steps/types.js +27 -0
- package/mcp-server/steps/types.js.map +1 -0
- package/mcp-server/useCreateMcpServer.d.ts +45 -0
- package/mcp-server/useCreateMcpServer.d.ts.map +1 -0
- package/mcp-server/useCreateMcpServer.js +50 -0
- package/mcp-server/useCreateMcpServer.js.map +1 -0
- package/mcp-server/useUpdateMcpServer.d.ts +24 -0
- package/mcp-server/useUpdateMcpServer.d.ts.map +1 -0
- package/mcp-server/useUpdateMcpServer.js +35 -0
- package/mcp-server/useUpdateMcpServer.js.map +1 -0
- package/package.json +8 -4
- package/resource-creation/CreationPicker.d.ts +60 -0
- package/resource-creation/CreationPicker.d.ts.map +1 -0
- package/resource-creation/CreationPicker.js +74 -0
- package/resource-creation/CreationPicker.js.map +1 -0
- package/resource-creation/StepIndicator.d.ts +28 -0
- package/resource-creation/StepIndicator.d.ts.map +1 -0
- package/resource-creation/StepIndicator.js +40 -0
- package/resource-creation/StepIndicator.js.map +1 -0
- package/resource-creation/TemplateCard.d.ts +24 -0
- package/resource-creation/TemplateCard.d.ts.map +1 -0
- package/resource-creation/TemplateCard.js +68 -0
- package/resource-creation/TemplateCard.js.map +1 -0
- package/resource-creation/TemplateGallery.d.ts +43 -0
- package/resource-creation/TemplateGallery.d.ts.map +1 -0
- package/resource-creation/TemplateGallery.js +78 -0
- package/resource-creation/TemplateGallery.js.map +1 -0
- package/resource-creation/WizardNav.d.ts +31 -0
- package/resource-creation/WizardNav.d.ts.map +1 -0
- package/resource-creation/WizardNav.js +29 -0
- package/resource-creation/WizardNav.js.map +1 -0
- package/resource-creation/WizardShell.d.ts +41 -0
- package/resource-creation/WizardShell.d.ts.map +1 -0
- package/resource-creation/WizardShell.js +55 -0
- package/resource-creation/WizardShell.js.map +1 -0
- package/resource-creation/index.d.ts +21 -0
- package/resource-creation/index.d.ts.map +1 -0
- package/resource-creation/index.js +14 -0
- package/resource-creation/index.js.map +1 -0
- package/resource-creation/templates/agent-templates.d.ts +15 -0
- package/resource-creation/templates/agent-templates.d.ts.map +1 -0
- package/resource-creation/templates/agent-templates.js +148 -0
- package/resource-creation/templates/agent-templates.js.map +1 -0
- package/resource-creation/templates/index.d.ts +5 -0
- package/resource-creation/templates/index.d.ts.map +1 -0
- package/resource-creation/templates/index.js +5 -0
- package/resource-creation/templates/index.js.map +1 -0
- package/resource-creation/templates/mcp-server-templates.d.ts +15 -0
- package/resource-creation/templates/mcp-server-templates.d.ts.map +1 -0
- package/resource-creation/templates/mcp-server-templates.js +92 -0
- package/resource-creation/templates/mcp-server-templates.js.map +1 -0
- package/resource-creation/templates/types.d.ts +48 -0
- package/resource-creation/templates/types.d.ts.map +1 -0
- package/resource-creation/templates/types.js +16 -0
- package/resource-creation/templates/types.js.map +1 -0
- package/resource-creation/types.d.ts +88 -0
- package/resource-creation/types.d.ts.map +1 -0
- package/resource-creation/types.js +2 -0
- package/resource-creation/types.js.map +1 -0
- package/resource-creation/useTemplateFilter.d.ts +43 -0
- package/resource-creation/useTemplateFilter.d.ts.map +1 -0
- package/resource-creation/useTemplateFilter.js +73 -0
- package/resource-creation/useTemplateFilter.js.map +1 -0
- package/resource-creation/useWizardState.d.ts +67 -0
- package/resource-creation/useWizardState.d.ts.map +1 -0
- package/resource-creation/useWizardState.js +143 -0
- package/resource-creation/useWizardState.js.map +1 -0
- package/resource-detail/ConfirmDialog.d.ts +44 -0
- package/resource-detail/ConfirmDialog.d.ts.map +1 -0
- package/resource-detail/ConfirmDialog.js +62 -0
- package/resource-detail/ConfirmDialog.js.map +1 -0
- package/resource-detail/ResourceActionBar.d.ts +42 -0
- package/resource-detail/ResourceActionBar.d.ts.map +1 -0
- package/resource-detail/ResourceActionBar.js +64 -0
- package/resource-detail/ResourceActionBar.js.map +1 -0
- package/resource-detail/ResourceDetailShell.d.ts +36 -0
- package/resource-detail/ResourceDetailShell.d.ts.map +1 -0
- package/resource-detail/ResourceDetailShell.js +65 -0
- package/resource-detail/ResourceDetailShell.js.map +1 -0
- package/resource-detail/Section.d.ts +18 -0
- package/resource-detail/Section.d.ts.map +1 -0
- package/resource-detail/Section.js +18 -0
- package/resource-detail/Section.js.map +1 -0
- package/resource-detail/index.d.ts +15 -0
- package/resource-detail/index.d.ts.map +1 -0
- package/resource-detail/index.js +10 -0
- package/resource-detail/index.js.map +1 -0
- package/resource-detail/types.d.ts +146 -0
- package/resource-detail/types.d.ts.map +1 -0
- package/resource-detail/types.js +2 -0
- package/resource-detail/types.js.map +1 -0
- package/resource-detail/useConfirmAction.d.ts +41 -0
- package/resource-detail/useConfirmAction.d.ts.map +1 -0
- package/resource-detail/useConfirmAction.js +30 -0
- package/resource-detail/useConfirmAction.js.map +1 -0
- package/resource-detail/useCopyResource.d.ts +28 -0
- package/resource-detail/useCopyResource.d.ts.map +1 -0
- package/resource-detail/useCopyResource.js +46 -0
- package/resource-detail/useCopyResource.js.map +1 -0
- package/resource-detail/useDeleteResource.d.ts +40 -0
- package/resource-detail/useDeleteResource.d.ts.map +1 -0
- package/resource-detail/useDeleteResource.js +83 -0
- package/resource-detail/useDeleteResource.js.map +1 -0
- package/resource-detail/useDetailTabs.d.ts +46 -0
- package/resource-detail/useDetailTabs.d.ts.map +1 -0
- package/resource-detail/useDetailTabs.js +47 -0
- package/resource-detail/useDetailTabs.js.map +1 -0
- package/resource-workbench/components/BulkActionBar.d.ts +36 -0
- package/resource-workbench/components/BulkActionBar.d.ts.map +1 -0
- package/resource-workbench/components/BulkActionBar.js +35 -0
- package/resource-workbench/components/BulkActionBar.js.map +1 -0
- package/resource-workbench/components/ColumnHeader.d.ts +23 -0
- package/resource-workbench/components/ColumnHeader.d.ts.map +1 -0
- package/resource-workbench/components/ColumnHeader.js +25 -0
- package/resource-workbench/components/ColumnHeader.js.map +1 -0
- package/resource-workbench/components/FilterBar.d.ts +33 -0
- package/resource-workbench/components/FilterBar.d.ts.map +1 -0
- package/resource-workbench/components/FilterBar.js +72 -0
- package/resource-workbench/components/FilterBar.js.map +1 -0
- package/resource-workbench/components/ResourceAvatar.d.ts +29 -0
- package/resource-workbench/components/ResourceAvatar.d.ts.map +1 -0
- package/resource-workbench/components/ResourceAvatar.js +51 -0
- package/resource-workbench/components/ResourceAvatar.js.map +1 -0
- package/resource-workbench/components/ResourceCards.d.ts +39 -0
- package/resource-workbench/components/ResourceCards.d.ts.map +1 -0
- package/resource-workbench/components/ResourceCards.js +41 -0
- package/resource-workbench/components/ResourceCards.js.map +1 -0
- package/resource-workbench/components/ResourceInspector.d.ts +26 -0
- package/resource-workbench/components/ResourceInspector.d.ts.map +1 -0
- package/resource-workbench/components/ResourceInspector.js +22 -0
- package/resource-workbench/components/ResourceInspector.js.map +1 -0
- package/resource-workbench/components/ResourceList.d.ts +39 -0
- package/resource-workbench/components/ResourceList.d.ts.map +1 -0
- package/resource-workbench/components/ResourceList.js +41 -0
- package/resource-workbench/components/ResourceList.js.map +1 -0
- package/resource-workbench/components/ResourceTable.d.ts +47 -0
- package/resource-workbench/components/ResourceTable.d.ts.map +1 -0
- package/resource-workbench/components/ResourceTable.js +78 -0
- package/resource-workbench/components/ResourceTable.js.map +1 -0
- package/resource-workbench/components/ResourceWorkbench.d.ts +131 -0
- package/resource-workbench/components/ResourceWorkbench.d.ts.map +1 -0
- package/resource-workbench/components/ResourceWorkbench.js +170 -0
- package/resource-workbench/components/ResourceWorkbench.js.map +1 -0
- package/resource-workbench/components/SelectionCheckbox.d.ts +24 -0
- package/resource-workbench/components/SelectionCheckbox.d.ts.map +1 -0
- package/resource-workbench/components/SelectionCheckbox.js +16 -0
- package/resource-workbench/components/SelectionCheckbox.js.map +1 -0
- package/resource-workbench/components/StatusBadge.d.ts +31 -0
- package/resource-workbench/components/StatusBadge.d.ts.map +1 -0
- package/resource-workbench/components/StatusBadge.js +75 -0
- package/resource-workbench/components/StatusBadge.js.map +1 -0
- package/resource-workbench/components/ViewSwitcher.d.ts +21 -0
- package/resource-workbench/components/ViewSwitcher.d.ts.map +1 -0
- package/resource-workbench/components/ViewSwitcher.js +37 -0
- package/resource-workbench/components/ViewSwitcher.js.map +1 -0
- package/resource-workbench/hooks/useResourceCollection.d.ts +93 -0
- package/resource-workbench/hooks/useResourceCollection.d.ts.map +1 -0
- package/resource-workbench/hooks/useResourceCollection.js +133 -0
- package/resource-workbench/hooks/useResourceCollection.js.map +1 -0
- package/resource-workbench/hooks/useResourceFilters.d.ts +73 -0
- package/resource-workbench/hooks/useResourceFilters.d.ts.map +1 -0
- package/resource-workbench/hooks/useResourceFilters.js +105 -0
- package/resource-workbench/hooks/useResourceFilters.js.map +1 -0
- package/resource-workbench/hooks/useResourceSelection.d.ts +44 -0
- package/resource-workbench/hooks/useResourceSelection.d.ts.map +1 -0
- package/resource-workbench/hooks/useResourceSelection.js +123 -0
- package/resource-workbench/hooks/useResourceSelection.js.map +1 -0
- package/resource-workbench/hooks/useViewPreference.d.ts +32 -0
- package/resource-workbench/hooks/useViewPreference.d.ts.map +1 -0
- package/resource-workbench/hooks/useViewPreference.js +60 -0
- package/resource-workbench/hooks/useViewPreference.js.map +1 -0
- package/resource-workbench/index.d.ts +34 -0
- package/resource-workbench/index.d.ts.map +1 -0
- package/resource-workbench/index.js +19 -0
- package/resource-workbench/index.js.map +1 -0
- package/resource-workbench/types.d.ts +165 -0
- package/resource-workbench/types.d.ts.map +1 -0
- package/resource-workbench/types.js +2 -0
- package/resource-workbench/types.js.map +1 -0
- package/runner/RunnerDetailView.d.ts +44 -0
- package/runner/RunnerDetailView.d.ts.map +1 -0
- package/runner/RunnerDetailView.js +154 -0
- package/runner/RunnerDetailView.js.map +1 -0
- package/runner/RunnerListPanel.d.ts +26 -1
- package/runner/RunnerListPanel.d.ts.map +1 -1
- package/runner/RunnerListPanel.js +68 -46
- package/runner/RunnerListPanel.js.map +1 -1
- package/runner/index.d.ts +7 -1
- package/runner/index.d.ts.map +1 -1
- package/runner/index.js +3 -0
- package/runner/index.js.map +1 -1
- package/runner/shared.d.ts +31 -0
- package/runner/shared.d.ts.map +1 -0
- package/runner/shared.js +55 -0
- package/runner/shared.js.map +1 -0
- package/runner/useRunner.d.ts +37 -0
- package/runner/useRunner.d.ts.map +1 -0
- package/runner/useRunner.js +24 -0
- package/runner/useRunner.js.map +1 -0
- package/session/__tests__/group-sessions.test.js +3 -3
- package/session/__tests__/group-sessions.test.js.map +1 -1
- package/skill/SkillDetailView.d.ts +70 -7
- package/skill/SkillDetailView.d.ts.map +1 -1
- package/skill/SkillDetailView.js +107 -39
- package/skill/SkillDetailView.js.map +1 -1
- package/skill/SkillDiffDialog.d.ts +42 -0
- package/skill/SkillDiffDialog.d.ts.map +1 -0
- package/skill/SkillDiffDialog.js +72 -0
- package/skill/SkillDiffDialog.js.map +1 -0
- package/skill/SkillFileBrowser.d.ts +31 -0
- package/skill/SkillFileBrowser.d.ts.map +1 -0
- package/skill/SkillFileBrowser.js +105 -0
- package/skill/SkillFileBrowser.js.map +1 -0
- package/skill/SkillUploader.d.ts +39 -0
- package/skill/SkillUploader.d.ts.map +1 -0
- package/skill/SkillUploader.js +141 -0
- package/skill/SkillUploader.js.map +1 -0
- package/skill/index.d.ts +18 -0
- package/skill/index.d.ts.map +1 -1
- package/skill/index.js +9 -0
- package/skill/index.js.map +1 -1
- package/skill/internal/computeArtifactHash.d.ts +9 -0
- package/skill/internal/computeArtifactHash.d.ts.map +1 -0
- package/skill/internal/computeArtifactHash.js +14 -0
- package/skill/internal/computeArtifactHash.js.map +1 -0
- package/skill/internal/fetchAndUnpackArtifact.d.ts +16 -0
- package/skill/internal/fetchAndUnpackArtifact.d.ts.map +1 -0
- package/skill/internal/fetchAndUnpackArtifact.js +34 -0
- package/skill/internal/fetchAndUnpackArtifact.js.map +1 -0
- package/skill/usePushSkill.d.ts +53 -0
- package/skill/usePushSkill.d.ts.map +1 -0
- package/skill/usePushSkill.js +57 -0
- package/skill/usePushSkill.js.map +1 -0
- package/skill/useSkillArtifact.d.ts +37 -0
- package/skill/useSkillArtifact.d.ts.map +1 -0
- package/skill/useSkillArtifact.js +76 -0
- package/skill/useSkillArtifact.js.map +1 -0
- package/skill/useSkillDiff.d.ts +31 -0
- package/skill/useSkillDiff.d.ts.map +1 -0
- package/skill/useSkillDiff.js +97 -0
- package/skill/useSkillDiff.js.map +1 -0
- package/skill/useSkillDuplicateCheck.d.ts +34 -0
- package/skill/useSkillDuplicateCheck.d.ts.map +1 -0
- package/skill/useSkillDuplicateCheck.js +58 -0
- package/skill/useSkillDuplicateCheck.js.map +1 -0
- package/skill/useSkillUpload.d.ts +69 -0
- package/skill/useSkillUpload.d.ts.map +1 -0
- package/skill/useSkillUpload.js +157 -0
- package/skill/useSkillUpload.js.map +1 -0
- package/skill/useSkillVersions.d.ts +46 -0
- package/skill/useSkillVersions.d.ts.map +1 -0
- package/skill/useSkillVersions.js +104 -0
- package/skill/useSkillVersions.js.map +1 -0
- package/src/action-menu/ActionMenu.tsx +151 -0
- package/src/action-menu/index.ts +9 -0
- package/src/action-menu/types.ts +70 -0
- package/src/agent/AgentCreationWizard.tsx +201 -0
- package/src/agent/AgentDetailView.tsx +817 -321
- package/src/agent/index.ts +16 -0
- package/src/agent/internal/agentToInput.ts +95 -0
- package/src/agent/steps/CapabilitiesStep.tsx +363 -0
- package/src/agent/steps/IdentityStep.tsx +259 -0
- package/src/agent/steps/ReviewStep.tsx +211 -0
- package/src/agent/steps/types.ts +53 -0
- package/src/agent/useCreateAgent.ts +76 -0
- package/src/agent/useUpdateAgent.ts +55 -0
- package/src/dependency-graph/DependencyGraph.tsx +153 -0
- package/src/dependency-graph/DependencyTreeNode.tsx +282 -0
- package/src/dependency-graph/index.ts +15 -0
- package/src/dependency-graph/types.ts +131 -0
- package/src/dependency-graph/useDependencyGraph.ts +158 -0
- package/src/empty-state/EmptyState.tsx +90 -0
- package/src/empty-state/index.ts +9 -0
- package/src/empty-state/types.ts +81 -0
- package/src/empty-state/useEmptyState.ts +85 -0
- package/src/feedback/StigmerToaster.tsx +45 -0
- package/src/feedback/index.ts +3 -0
- package/src/feedback/toast.ts +13 -0
- package/src/feedback/types.ts +7 -0
- package/src/index.ts +270 -8
- package/src/inline-edit/InlineEditImage.tsx +208 -0
- package/src/inline-edit/InlineEditKeyValue.tsx +278 -0
- package/src/inline-edit/InlineEditResourceList.tsx +325 -0
- package/src/inline-edit/InlineEditSelect.tsx +150 -0
- package/src/inline-edit/InlineEditText.tsx +211 -0
- package/src/inline-edit/InlineEditTextarea.tsx +209 -0
- package/src/inline-edit/index.ts +28 -0
- package/src/inline-edit/types.ts +47 -0
- package/src/inline-edit/useInlineFieldSave.ts +62 -0
- package/src/internal/Tabs.tsx +4 -164
- package/src/library/ImportResourceDialog.tsx +227 -0
- package/src/library/index.ts +18 -8
- package/src/library/serialize-resource-yaml.ts +356 -0
- package/src/library/useExportResource.ts +183 -0
- package/src/library/useImportResource.ts +253 -0
- package/src/mcp-server/McpServerCreationWizard.tsx +206 -0
- package/src/mcp-server/McpServerDetailView.tsx +392 -105
- package/src/mcp-server/index.ts +16 -0
- package/src/mcp-server/internal/mcpServerToInput.ts +95 -0
- package/src/mcp-server/steps/EnvironmentAuthStep.tsx +462 -0
- package/src/mcp-server/steps/IdentityTransportStep.tsx +531 -0
- package/src/mcp-server/steps/ReviewStep.tsx +297 -0
- package/src/mcp-server/steps/types.ts +85 -0
- package/src/mcp-server/useCreateMcpServer.ts +76 -0
- package/src/mcp-server/useUpdateMcpServer.ts +55 -0
- package/src/resource-creation/CreationPicker.tsx +292 -0
- package/src/resource-creation/StepIndicator.tsx +156 -0
- package/src/resource-creation/TemplateCard.tsx +143 -0
- package/src/resource-creation/TemplateGallery.tsx +222 -0
- package/src/resource-creation/WizardNav.tsx +163 -0
- package/src/resource-creation/WizardShell.tsx +124 -0
- package/src/resource-creation/index.ts +45 -0
- package/src/resource-creation/templates/agent-templates.ts +160 -0
- package/src/resource-creation/templates/index.ts +7 -0
- package/src/resource-creation/templates/mcp-server-templates.ts +106 -0
- package/src/resource-creation/templates/types.ts +64 -0
- package/src/resource-creation/types.ts +105 -0
- package/src/resource-creation/useTemplateFilter.ts +117 -0
- package/src/resource-creation/useWizardState.ts +223 -0
- package/src/resource-detail/ConfirmDialog.tsx +127 -0
- package/src/resource-detail/ResourceActionBar.tsx +157 -0
- package/src/resource-detail/ResourceDetailShell.tsx +184 -0
- package/src/resource-detail/Section.tsx +78 -0
- package/src/resource-detail/index.ts +34 -0
- package/src/resource-detail/types.ts +177 -0
- package/src/resource-detail/useConfirmAction.ts +70 -0
- package/src/resource-detail/useCopyResource.ts +74 -0
- package/src/resource-detail/useDeleteResource.ts +110 -0
- package/src/resource-detail/useDetailTabs.ts +93 -0
- package/src/resource-workbench/components/BulkActionBar.tsx +122 -0
- package/src/resource-workbench/components/ColumnHeader.tsx +105 -0
- package/src/resource-workbench/components/FilterBar.tsx +173 -0
- package/src/resource-workbench/components/ResourceAvatar.tsx +109 -0
- package/src/resource-workbench/components/ResourceCards.tsx +126 -0
- package/src/resource-workbench/components/ResourceInspector.tsx +88 -0
- package/src/resource-workbench/components/ResourceList.tsx +121 -0
- package/src/resource-workbench/components/ResourceTable.tsx +222 -0
- package/src/resource-workbench/components/ResourceWorkbench.tsx +695 -0
- package/src/resource-workbench/components/SelectionCheckbox.tsx +52 -0
- package/src/resource-workbench/components/StatusBadge.tsx +119 -0
- package/src/resource-workbench/components/ViewSwitcher.tsx +135 -0
- package/src/resource-workbench/hooks/useResourceCollection.ts +261 -0
- package/src/resource-workbench/hooks/useResourceFilters.ts +216 -0
- package/src/resource-workbench/hooks/useResourceSelection.ts +178 -0
- package/src/resource-workbench/hooks/useViewPreference.ts +75 -0
- package/src/resource-workbench/index.ts +73 -0
- package/src/resource-workbench/types.ts +220 -0
- package/src/runner/RunnerDetailView.tsx +410 -0
- package/src/runner/RunnerListPanel.tsx +126 -111
- package/src/runner/index.ts +13 -1
- package/src/runner/shared.tsx +124 -0
- package/src/runner/useRunner.ts +59 -0
- package/src/session/__tests__/group-sessions.test.ts +5 -3
- package/src/skill/SkillDetailView.tsx +371 -165
- package/src/skill/SkillDiffDialog.tsx +213 -0
- package/src/skill/SkillFileBrowser.tsx +289 -0
- package/src/skill/SkillUploader.tsx +481 -0
- package/src/skill/index.ts +34 -0
- package/src/skill/internal/computeArtifactHash.ts +13 -0
- package/src/skill/internal/fetchAndUnpackArtifact.ts +48 -0
- package/src/skill/usePushSkill.ts +101 -0
- package/src/skill/useSkillArtifact.ts +107 -0
- package/src/skill/useSkillDiff.ts +128 -0
- package/src/skill/useSkillDuplicateCheck.ts +92 -0
- package/src/skill/useSkillUpload.ts +231 -0
- package/src/skill/useSkillVersions.ts +165 -0
- package/src/styles.css +28 -0
- package/src/tabs/Tabs.tsx +184 -0
- package/src/tabs/index.ts +2 -0
- package/src/version-history/DiffFileList.tsx +111 -0
- package/src/version-history/DiffSummary.tsx +61 -0
- package/src/version-history/DiffViewer.tsx +163 -0
- package/src/version-history/MultiFileDiffView.tsx +114 -0
- package/src/version-history/VersionTimeline.tsx +232 -0
- package/src/version-history/VersionTimelineEntry.tsx +254 -0
- package/src/version-history/computeDiff.ts +61 -0
- package/src/version-history/computeMultiFileDiff.ts +97 -0
- package/src/version-history/index.ts +22 -0
- package/src/version-history/types.ts +129 -0
- package/styles.css +1 -1
- package/tabs/Tabs.d.ts +58 -0
- package/tabs/Tabs.d.ts.map +1 -0
- package/tabs/Tabs.js +80 -0
- package/tabs/Tabs.js.map +1 -0
- package/tabs/index.d.ts +3 -0
- package/tabs/index.d.ts.map +1 -0
- package/tabs/index.js +2 -0
- package/tabs/index.js.map +1 -0
- package/version-history/DiffFileList.d.ts +22 -0
- package/version-history/DiffFileList.d.ts.map +1 -0
- package/version-history/DiffFileList.js +37 -0
- package/version-history/DiffFileList.js.map +1 -0
- package/version-history/DiffSummary.d.ts +21 -0
- package/version-history/DiffSummary.d.ts.map +1 -0
- package/version-history/DiffSummary.js +16 -0
- package/version-history/DiffSummary.js.map +1 -0
- package/version-history/DiffViewer.d.ts +31 -0
- package/version-history/DiffViewer.d.ts.map +1 -0
- package/version-history/DiffViewer.js +60 -0
- package/version-history/DiffViewer.js.map +1 -0
- package/version-history/MultiFileDiffView.d.ts +30 -0
- package/version-history/MultiFileDiffView.d.ts.map +1 -0
- package/version-history/MultiFileDiffView.js +40 -0
- package/version-history/MultiFileDiffView.js.map +1 -0
- package/version-history/VersionTimeline.d.ts +29 -0
- package/version-history/VersionTimeline.d.ts.map +1 -0
- package/version-history/VersionTimeline.js +87 -0
- package/version-history/VersionTimeline.js.map +1 -0
- package/version-history/VersionTimelineEntry.d.ts +22 -0
- package/version-history/VersionTimelineEntry.d.ts.map +1 -0
- package/version-history/VersionTimelineEntry.js +98 -0
- package/version-history/VersionTimelineEntry.js.map +1 -0
- package/version-history/computeDiff.d.ts +16 -0
- package/version-history/computeDiff.d.ts.map +1 -0
- package/version-history/computeDiff.js +54 -0
- package/version-history/computeDiff.js.map +1 -0
- package/version-history/computeMultiFileDiff.d.ts +15 -0
- package/version-history/computeMultiFileDiff.d.ts.map +1 -0
- package/version-history/computeMultiFileDiff.js +83 -0
- package/version-history/computeMultiFileDiff.js.map +1 -0
- package/version-history/index.d.ts +14 -0
- package/version-history/index.d.ts.map +1 -0
- package/version-history/index.js +9 -0
- package/version-history/index.js.map +1 -0
- package/version-history/types.d.ts +106 -0
- package/version-history/types.d.ts.map +1 -0
- package/version-history/types.js +2 -0
- package/version-history/types.js.map +1 -0
- package/library/ResourceListView.d.ts +0 -174
- package/library/ResourceListView.d.ts.map +0 -1
- package/library/ResourceListView.js +0 -318
- package/library/ResourceListView.js.map +0 -1
- 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'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
|
+
}
|
package/src/skill/index.ts
CHANGED
|
@@ -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
|
+
}
|