@stigmer/react 0.4.8 → 0.5.1
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/composer/ContextChip.d.ts +7 -2
- package/composer/ContextChip.d.ts.map +1 -1
- package/composer/ContextChip.js +2 -1
- package/composer/ContextChip.js.map +1 -1
- package/composer/SessionComposer.d.ts +11 -0
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +33 -4
- package/composer/SessionComposer.js.map +1 -1
- 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/environment/usePersonalEnvironment.d.ts.map +1 -1
- package/environment/usePersonalEnvironment.js +1 -0
- package/environment/usePersonalEnvironment.js.map +1 -1
- 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 +32 -12
- package/index.d.ts.map +1 -1
- package/index.js +30 -10
- 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 +33 -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/internal/useFetch.js +2 -2
- package/internal/useFetch.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 +235 -43
- 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/models/ModelRegistryContext.d.ts +2 -0
- package/models/ModelRegistryContext.d.ts.map +1 -1
- package/models/ModelRegistryContext.js +1 -0
- package/models/ModelRegistryContext.js.map +1 -1
- package/models/ModelSelector.d.ts.map +1 -1
- package/models/ModelSelector.js +2 -2
- package/models/ModelSelector.js.map +1 -1
- package/models/__tests__/useModelRegistry.test.js +4 -3
- package/models/__tests__/useModelRegistry.test.js.map +1 -1
- package/models/useModelRegistry.d.ts +2 -0
- package/models/useModelRegistry.d.ts.map +1 -1
- package/models/useModelRegistry.js +3 -2
- package/models/useModelRegistry.js.map +1 -1
- package/package.json +8 -4
- package/provider.d.ts.map +1 -1
- package/provider.js +69 -22
- package/provider.js.map +1 -1
- 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/session/__tests__/session-spec-converters.test.d.ts +2 -0
- package/session/__tests__/session-spec-converters.test.d.ts.map +1 -0
- package/session/__tests__/session-spec-converters.test.js +162 -0
- package/session/__tests__/session-spec-converters.test.js.map +1 -0
- package/session/__tests__/useNewSessionFlow.test.js +2 -2
- package/session/__tests__/useNewSessionFlow.test.js.map +1 -1
- package/session/__tests__/usePersistedModel.test.js +1 -1
- package/session/__tests__/usePersistedModel.test.js.map +1 -1
- package/session/group-sessions.d.ts +17 -0
- package/session/group-sessions.d.ts.map +1 -1
- package/session/group-sessions.js +46 -0
- package/session/group-sessions.js.map +1 -1
- package/session/index.d.ts +4 -2
- package/session/index.d.ts.map +1 -1
- package/session/index.js +2 -1
- package/session/index.js.map +1 -1
- package/session/session-spec-converters.d.ts +24 -0
- package/session/session-spec-converters.d.ts.map +1 -0
- package/session/session-spec-converters.js +72 -0
- package/session/session-spec-converters.js.map +1 -0
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +1 -56
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts +5 -0
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +20 -6
- package/session/useSessionPageFlow.js.map +1 -1
- package/session/useSessionSearch.d.ts +57 -0
- package/session/useSessionSearch.d.ts.map +1 -0
- package/session/useSessionSearch.js +94 -0
- package/session/useSessionSearch.js.map +1 -0
- 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/composer/ContextChip.tsx +20 -11
- package/src/composer/SessionComposer.tsx +52 -3
- 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/environment/usePersonalEnvironment.ts +1 -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 +275 -8
- package/src/inline-edit/InlineEditImage.tsx +208 -0
- package/src/inline-edit/InlineEditKeyValue.tsx +301 -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/internal/useFetch.ts +2 -2
- 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 +816 -155
- 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/models/ModelRegistryContext.ts +3 -0
- package/src/models/ModelSelector.tsx +25 -2
- package/src/models/__tests__/useModelRegistry.test.tsx +5 -3
- package/src/models/useModelRegistry.ts +5 -2
- package/src/provider.tsx +69 -18
- 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/session/__tests__/session-spec-converters.test.ts +185 -0
- package/src/session/__tests__/useNewSessionFlow.test.tsx +2 -2
- package/src/session/__tests__/usePersistedModel.test.tsx +1 -1
- package/src/session/group-sessions.ts +65 -0
- package/src/session/index.ts +8 -2
- package/src/session/session-spec-converters.ts +86 -0
- package/src/session/useSessionConversation.ts +5 -64
- package/src/session/useSessionPageFlow.ts +28 -7
- package/src/session/useSessionSearch.ts +149 -0
- 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,220 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { SearchResult } from "@stigmer/protos/ai/stigmer/search/v1/io_pb";
|
|
3
|
+
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// View modes
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
/** Available layout modes for the resource workbench. */
|
|
9
|
+
export type ViewMode = "table" | "cards" | "list";
|
|
10
|
+
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Status
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Resource status phases that map to `--stgm-status-*` design tokens.
|
|
17
|
+
*
|
|
18
|
+
* Each phase corresponds to a token group defined in `@stigmer/theme`
|
|
19
|
+
* (e.g. `--stgm-status-ready`, `--stgm-status-failed-subtle`).
|
|
20
|
+
*/
|
|
21
|
+
export type StatusPhase =
|
|
22
|
+
| "ready"
|
|
23
|
+
| "running"
|
|
24
|
+
| "pending"
|
|
25
|
+
| "degraded"
|
|
26
|
+
| "failed"
|
|
27
|
+
| "disabled"
|
|
28
|
+
| "draft";
|
|
29
|
+
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Column definitions
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Defines a single column in the {@link ResourceTable}.
|
|
36
|
+
*
|
|
37
|
+
* Generic over `TData` so platform builders can use richer item types
|
|
38
|
+
* beyond `SearchResult` while the Console uses `SearchResult` directly.
|
|
39
|
+
*/
|
|
40
|
+
export interface WorkbenchColumnDef<TData = SearchResult> {
|
|
41
|
+
/** Stable column identifier (used for visibility persistence and URL state). */
|
|
42
|
+
readonly id: string;
|
|
43
|
+
/** Column header label. */
|
|
44
|
+
readonly header: string;
|
|
45
|
+
/**
|
|
46
|
+
* Accessor function that extracts the cell value from a row item.
|
|
47
|
+
* Return a `ReactNode` for custom cell rendering.
|
|
48
|
+
*/
|
|
49
|
+
readonly cell: (item: TData) => ReactNode;
|
|
50
|
+
/**
|
|
51
|
+
* Whether this column is sortable. When `true`, clicking the header
|
|
52
|
+
* toggles sort direction.
|
|
53
|
+
* @default false
|
|
54
|
+
*/
|
|
55
|
+
readonly sortable?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Whether this column is visible by default.
|
|
58
|
+
* Users can toggle visibility via column preferences.
|
|
59
|
+
* @default true
|
|
60
|
+
*/
|
|
61
|
+
readonly defaultVisible?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Minimum column width in pixels. The table uses this as a CSS
|
|
64
|
+
* `min-width` to prevent content collapse.
|
|
65
|
+
*/
|
|
66
|
+
readonly minWidth?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Relative flex weight for distributing remaining horizontal space.
|
|
69
|
+
* Columns with higher weight receive more space.
|
|
70
|
+
* @default 1
|
|
71
|
+
*/
|
|
72
|
+
readonly flex?: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Filter definitions
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
|
|
79
|
+
/** Operator for a single filter expression. */
|
|
80
|
+
export type FilterOperator =
|
|
81
|
+
| "eq"
|
|
82
|
+
| "neq"
|
|
83
|
+
| "contains"
|
|
84
|
+
| "gt"
|
|
85
|
+
| "lt"
|
|
86
|
+
| "gte"
|
|
87
|
+
| "lte"
|
|
88
|
+
| "in";
|
|
89
|
+
|
|
90
|
+
/** A single active filter value applied to the collection. */
|
|
91
|
+
export interface FilterValue {
|
|
92
|
+
/** The filter definition ID this value applies to. */
|
|
93
|
+
readonly filterId: string;
|
|
94
|
+
/** Comparison operator. */
|
|
95
|
+
readonly operator: FilterOperator;
|
|
96
|
+
/**
|
|
97
|
+
* Filter value(s). A string for scalar operators, an array for `in`.
|
|
98
|
+
*/
|
|
99
|
+
readonly value: string | readonly string[];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Defines a filterable property for the {@link FilterBar}.
|
|
104
|
+
*
|
|
105
|
+
* Platform builders declare which properties are filterable and how
|
|
106
|
+
* they appear in the filter UI.
|
|
107
|
+
*/
|
|
108
|
+
export interface FilterDef {
|
|
109
|
+
/** Stable filter identifier (used in URL state serialization). */
|
|
110
|
+
readonly id: string;
|
|
111
|
+
/** Human-readable label shown in the filter picker and chips. */
|
|
112
|
+
readonly label: string;
|
|
113
|
+
/** Filter input type. */
|
|
114
|
+
readonly type: "text" | "select" | "multi-select" | "date";
|
|
115
|
+
/**
|
|
116
|
+
* Available options for `select` and `multi-select` types.
|
|
117
|
+
* Ignored for `text` and `date`.
|
|
118
|
+
*/
|
|
119
|
+
readonly options?: readonly FilterOption[];
|
|
120
|
+
/**
|
|
121
|
+
* Allowed operators. Defaults to `["eq"]` for selects,
|
|
122
|
+
* `["contains"]` for text, and `["gte", "lte"]` for dates.
|
|
123
|
+
*/
|
|
124
|
+
readonly operators?: readonly FilterOperator[];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** A selectable option within a `select` or `multi-select` filter. */
|
|
128
|
+
export interface FilterOption {
|
|
129
|
+
/** The value sent in the filter expression. */
|
|
130
|
+
readonly value: string;
|
|
131
|
+
/** Display label. */
|
|
132
|
+
readonly label: string;
|
|
133
|
+
/** Optional icon rendered before the label. */
|
|
134
|
+
readonly icon?: ReactNode;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
// Sort definitions
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
|
|
141
|
+
/** Sort direction. */
|
|
142
|
+
export type SortDirection = "asc" | "desc";
|
|
143
|
+
|
|
144
|
+
/** A single active sort applied to the collection. */
|
|
145
|
+
export interface SortValue {
|
|
146
|
+
/** Column or property ID to sort by. */
|
|
147
|
+
readonly id: string;
|
|
148
|
+
/** Sort direction. */
|
|
149
|
+
readonly direction: SortDirection;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Defines a sortable property. Used by hooks to validate incoming sort
|
|
154
|
+
* state and by the UI to render sort options in column headers and
|
|
155
|
+
* sort dropdowns.
|
|
156
|
+
*/
|
|
157
|
+
export interface SortDef {
|
|
158
|
+
/** Stable identifier matching a column ID or virtual sort key. */
|
|
159
|
+
readonly id: string;
|
|
160
|
+
/** Human-readable label (e.g. "Name", "Last updated"). */
|
|
161
|
+
readonly label: string;
|
|
162
|
+
/** Default direction when this sort is first activated. @default "asc" */
|
|
163
|
+
readonly defaultDirection?: SortDirection;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
// Actions
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
|
|
170
|
+
/** A single action available for a resource item (shown in context menus). */
|
|
171
|
+
export interface ResourceAction<TData = SearchResult> {
|
|
172
|
+
/** Stable action identifier. */
|
|
173
|
+
readonly id: string;
|
|
174
|
+
/** Display label. */
|
|
175
|
+
readonly label: string;
|
|
176
|
+
/** Icon rendered before the label. */
|
|
177
|
+
readonly icon?: ReactNode;
|
|
178
|
+
/** Keyboard shortcut hint displayed in the menu. */
|
|
179
|
+
readonly shortcut?: string;
|
|
180
|
+
/** Visual variant. @default "default" */
|
|
181
|
+
readonly variant?: "default" | "destructive";
|
|
182
|
+
/** Called when the action is selected. Receives the target item. */
|
|
183
|
+
readonly onAction: (item: TData) => void;
|
|
184
|
+
/** When `true`, the action is shown but non-interactive. */
|
|
185
|
+
readonly disabled?: boolean;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** A bulk action available when multiple items are selected. */
|
|
189
|
+
export interface BulkAction<TData = SearchResult> {
|
|
190
|
+
/** Stable action identifier. */
|
|
191
|
+
readonly id: string;
|
|
192
|
+
/** Display label (e.g. "Delete", "Change visibility"). */
|
|
193
|
+
readonly label: string;
|
|
194
|
+
/** Icon rendered before the label. */
|
|
195
|
+
readonly icon?: ReactNode;
|
|
196
|
+
/** Visual variant. @default "default" */
|
|
197
|
+
readonly variant?: "default" | "destructive";
|
|
198
|
+
/** Called with the full set of selected items. */
|
|
199
|
+
readonly onAction: (items: readonly TData[]) => void;
|
|
200
|
+
/** When `true`, the action is shown but non-interactive. */
|
|
201
|
+
readonly disabled?: boolean;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
// Workbench state (for URL sync callbacks)
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Serializable snapshot of the workbench's filter, sort, pagination,
|
|
210
|
+
* and view state. Passed to `onStateChange` so consumers can sync
|
|
211
|
+
* this state to URL search params or other persistence layers.
|
|
212
|
+
*/
|
|
213
|
+
export interface WorkbenchState {
|
|
214
|
+
readonly filters: readonly FilterValue[];
|
|
215
|
+
readonly sort: SortValue | null;
|
|
216
|
+
readonly page: number;
|
|
217
|
+
readonly pageSize: number;
|
|
218
|
+
readonly query: string;
|
|
219
|
+
readonly viewMode: ViewMode;
|
|
220
|
+
}
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { timestampDate } from "@bufbuild/protobuf/wkt";
|
|
6
|
+
import { RunnerPhase } from "@stigmer/protos/ai/stigmer/agentic/runner/v1/enum_pb";
|
|
7
|
+
import { useRunner, type UseRunnerOptions } from "./useRunner";
|
|
8
|
+
import { phaseLabel, phaseDotColor, isTransitionalPhase } from "./phase";
|
|
9
|
+
import { ErrorMessage } from "../error/ErrorMessage";
|
|
10
|
+
import { ResourceDetailShell } from "../resource-detail/ResourceDetailShell";
|
|
11
|
+
import type { DetailAction, ResourceHeaderMeta } from "../resource-detail/types";
|
|
12
|
+
import type { StatusPhase } from "../resource-workbench/types";
|
|
13
|
+
|
|
14
|
+
/** Props for {@link RunnerDetailView}. */
|
|
15
|
+
export interface RunnerDetailViewProps {
|
|
16
|
+
/** Runner ID. */
|
|
17
|
+
readonly id: string;
|
|
18
|
+
/**
|
|
19
|
+
* Called once when the runner resource has been fetched successfully.
|
|
20
|
+
* Provides the resource display name for use cases like breadcrumbs
|
|
21
|
+
* or document titles.
|
|
22
|
+
*/
|
|
23
|
+
readonly onResourceLoad?: (meta: { name: string; id: string }) => void;
|
|
24
|
+
/**
|
|
25
|
+
* Primary action rendered as a visible button in the header area.
|
|
26
|
+
*/
|
|
27
|
+
readonly primaryAction?: DetailAction;
|
|
28
|
+
/**
|
|
29
|
+
* Secondary actions rendered in the kebab overflow menu.
|
|
30
|
+
*/
|
|
31
|
+
readonly actions?: readonly DetailAction[];
|
|
32
|
+
/** Additional CSS classes for the root container. */
|
|
33
|
+
readonly className?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const TRANSITIONAL_POLL_MS = 5_000;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Operational detail view for a Runner.
|
|
40
|
+
*
|
|
41
|
+
* Fetches the runner via {@link useRunner} internally and renders its
|
|
42
|
+
* status, connection information, and machine details inside a
|
|
43
|
+
* {@link ResourceDetailShell}. Polls automatically when the runner is
|
|
44
|
+
* in a transitional phase (Starting, Pending).
|
|
45
|
+
*
|
|
46
|
+
* Handles loading, error, and not-found states automatically.
|
|
47
|
+
* Zero Console dependencies — safe for platform builder embedding.
|
|
48
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```tsx
|
|
52
|
+
* <RunnerDetailView id={runnerId} />
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export function RunnerDetailView({
|
|
56
|
+
id,
|
|
57
|
+
onResourceLoad,
|
|
58
|
+
primaryAction,
|
|
59
|
+
actions,
|
|
60
|
+
className,
|
|
61
|
+
}: RunnerDetailViewProps) {
|
|
62
|
+
const phase = useRef<RunnerPhase>(RunnerPhase.UNSPECIFIED);
|
|
63
|
+
|
|
64
|
+
const opts: UseRunnerOptions = {
|
|
65
|
+
refetchInterval: isTransitionalPhase(phase.current)
|
|
66
|
+
? TRANSITIONAL_POLL_MS
|
|
67
|
+
: false,
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const { runner, isLoading, error, refetch } = useRunner(id, opts);
|
|
71
|
+
|
|
72
|
+
if (runner?.status?.phase != null) {
|
|
73
|
+
phase.current = runner.status.phase;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const onResourceLoadRef = useRef(onResourceLoad);
|
|
77
|
+
onResourceLoadRef.current = onResourceLoad;
|
|
78
|
+
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (runner?.metadata?.name) {
|
|
81
|
+
onResourceLoadRef.current?.({
|
|
82
|
+
name: runner.metadata.name,
|
|
83
|
+
id: runner.metadata.id,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}, [runner]);
|
|
87
|
+
|
|
88
|
+
if (isLoading) return <LoadingSkeleton className={className} />;
|
|
89
|
+
if (error)
|
|
90
|
+
return <ErrorMessage error={error} retry={refetch} className={className} />;
|
|
91
|
+
if (!runner) return <NotFoundState className={className} />;
|
|
92
|
+
|
|
93
|
+
const meta = runner.metadata;
|
|
94
|
+
const status = runner.status;
|
|
95
|
+
const info = status?.connectionInfo;
|
|
96
|
+
const runnerPhase = status?.phase ?? RunnerPhase.UNSPECIFIED;
|
|
97
|
+
|
|
98
|
+
const headerMeta: ResourceHeaderMeta = {
|
|
99
|
+
name: meta?.name || meta?.id || "Unnamed Runner",
|
|
100
|
+
id: meta?.id || id,
|
|
101
|
+
org: meta?.org,
|
|
102
|
+
icon: <RunnerIcon className="size-6 text-muted-foreground" />,
|
|
103
|
+
status: phaseToStatusPhase(runnerPhase),
|
|
104
|
+
statusLabel: phaseLabel(runnerPhase),
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
return (
|
|
108
|
+
<ResourceDetailShell
|
|
109
|
+
header={headerMeta}
|
|
110
|
+
primaryAction={primaryAction}
|
|
111
|
+
actions={actions}
|
|
112
|
+
className={className}
|
|
113
|
+
>
|
|
114
|
+
<div className="flex flex-col gap-6 pt-2">
|
|
115
|
+
<StatusSection
|
|
116
|
+
phase={runnerPhase}
|
|
117
|
+
lastHeartbeat={
|
|
118
|
+
status?.lastHeartbeatAt
|
|
119
|
+
? timestampDate(status.lastHeartbeatAt)
|
|
120
|
+
: null
|
|
121
|
+
}
|
|
122
|
+
currentExecutions={status?.currentExecutions ?? 0}
|
|
123
|
+
taskQueue={status?.taskQueue}
|
|
124
|
+
/>
|
|
125
|
+
|
|
126
|
+
{info && (
|
|
127
|
+
<ConnectionInfoSection
|
|
128
|
+
hostname={info.hostname}
|
|
129
|
+
os={info.os}
|
|
130
|
+
arch={info.arch}
|
|
131
|
+
runnerVersion={info.runnerVersion}
|
|
132
|
+
/>
|
|
133
|
+
)}
|
|
134
|
+
</div>
|
|
135
|
+
</ResourceDetailShell>
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
// Phase → StatusPhase mapping
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
|
|
143
|
+
function phaseToStatusPhase(phase: RunnerPhase): StatusPhase {
|
|
144
|
+
switch (phase) {
|
|
145
|
+
case RunnerPhase.READY:
|
|
146
|
+
return "ready";
|
|
147
|
+
case RunnerPhase.BUSY:
|
|
148
|
+
return "running";
|
|
149
|
+
case RunnerPhase.STARTING:
|
|
150
|
+
case RunnerPhase.PENDING:
|
|
151
|
+
return "pending";
|
|
152
|
+
case RunnerPhase.FAILED:
|
|
153
|
+
return "failed";
|
|
154
|
+
case RunnerPhase.STOPPED:
|
|
155
|
+
return "disabled";
|
|
156
|
+
default:
|
|
157
|
+
return "draft";
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
// Sections
|
|
163
|
+
// ---------------------------------------------------------------------------
|
|
164
|
+
|
|
165
|
+
function StatusSection({
|
|
166
|
+
phase,
|
|
167
|
+
lastHeartbeat,
|
|
168
|
+
currentExecutions,
|
|
169
|
+
taskQueue,
|
|
170
|
+
}: {
|
|
171
|
+
readonly phase: RunnerPhase;
|
|
172
|
+
readonly lastHeartbeat: Date | null;
|
|
173
|
+
readonly currentExecutions: number;
|
|
174
|
+
readonly taskQueue?: string;
|
|
175
|
+
}) {
|
|
176
|
+
return (
|
|
177
|
+
<Section title="Status">
|
|
178
|
+
<div className="grid grid-cols-2 gap-4 p-4 sm:grid-cols-4">
|
|
179
|
+
<StatusItem label="Phase">
|
|
180
|
+
<div className="flex items-center gap-2">
|
|
181
|
+
<span
|
|
182
|
+
className={cn(
|
|
183
|
+
"size-2 shrink-0 rounded-full",
|
|
184
|
+
phaseDotColor(phase),
|
|
185
|
+
)}
|
|
186
|
+
aria-hidden="true"
|
|
187
|
+
/>
|
|
188
|
+
<span className="text-sm font-medium text-foreground">
|
|
189
|
+
{phaseLabel(phase)}
|
|
190
|
+
</span>
|
|
191
|
+
</div>
|
|
192
|
+
</StatusItem>
|
|
193
|
+
<StatusItem label="Executions">
|
|
194
|
+
<span className="text-sm font-medium text-foreground">
|
|
195
|
+
{currentExecutions}
|
|
196
|
+
</span>
|
|
197
|
+
</StatusItem>
|
|
198
|
+
<StatusItem label="Last heartbeat">
|
|
199
|
+
<span className="text-sm text-foreground">
|
|
200
|
+
{lastHeartbeat ? formatRelativeTime(lastHeartbeat) : "—"}
|
|
201
|
+
</span>
|
|
202
|
+
</StatusItem>
|
|
203
|
+
{taskQueue && (
|
|
204
|
+
<StatusItem label="Task queue">
|
|
205
|
+
<code className="rounded bg-muted px-1.5 py-0.5 font-mono text-xs text-foreground">
|
|
206
|
+
{taskQueue}
|
|
207
|
+
</code>
|
|
208
|
+
</StatusItem>
|
|
209
|
+
)}
|
|
210
|
+
</div>
|
|
211
|
+
</Section>
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function StatusItem({
|
|
216
|
+
label,
|
|
217
|
+
children,
|
|
218
|
+
}: {
|
|
219
|
+
readonly label: string;
|
|
220
|
+
readonly children: React.ReactNode;
|
|
221
|
+
}) {
|
|
222
|
+
return (
|
|
223
|
+
<div className="flex flex-col gap-1">
|
|
224
|
+
<span className="text-[11px] font-medium text-muted-foreground">
|
|
225
|
+
{label}
|
|
226
|
+
</span>
|
|
227
|
+
{children}
|
|
228
|
+
</div>
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function ConnectionInfoSection({
|
|
233
|
+
hostname,
|
|
234
|
+
os,
|
|
235
|
+
arch,
|
|
236
|
+
runnerVersion,
|
|
237
|
+
}: {
|
|
238
|
+
readonly hostname?: string;
|
|
239
|
+
readonly os?: string;
|
|
240
|
+
readonly arch?: string;
|
|
241
|
+
readonly runnerVersion?: string;
|
|
242
|
+
}) {
|
|
243
|
+
const osArch = os && arch ? `${os}/${arch}` : os || arch || undefined;
|
|
244
|
+
const hasAnyInfo = hostname || osArch || runnerVersion;
|
|
245
|
+
if (!hasAnyInfo) return null;
|
|
246
|
+
|
|
247
|
+
return (
|
|
248
|
+
<Section title="Machine">
|
|
249
|
+
<div className="flex flex-col divide-y divide-border">
|
|
250
|
+
{hostname && (
|
|
251
|
+
<InfoRow label="Hostname" value={hostname} />
|
|
252
|
+
)}
|
|
253
|
+
{osArch && (
|
|
254
|
+
<InfoRow label="Platform" value={osArch} mono />
|
|
255
|
+
)}
|
|
256
|
+
{runnerVersion && (
|
|
257
|
+
<InfoRow label="Runner version" value={runnerVersion} mono />
|
|
258
|
+
)}
|
|
259
|
+
</div>
|
|
260
|
+
</Section>
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function InfoRow({
|
|
265
|
+
label,
|
|
266
|
+
value,
|
|
267
|
+
mono,
|
|
268
|
+
}: {
|
|
269
|
+
readonly label: string;
|
|
270
|
+
readonly value: string;
|
|
271
|
+
readonly mono?: boolean;
|
|
272
|
+
}) {
|
|
273
|
+
return (
|
|
274
|
+
<div className="flex items-baseline justify-between px-4 py-2.5">
|
|
275
|
+
<span className="text-xs font-medium text-muted-foreground">
|
|
276
|
+
{label}
|
|
277
|
+
</span>
|
|
278
|
+
<span
|
|
279
|
+
className={cn(
|
|
280
|
+
"text-sm text-foreground",
|
|
281
|
+
mono && "font-mono text-xs",
|
|
282
|
+
)}
|
|
283
|
+
>
|
|
284
|
+
{value}
|
|
285
|
+
</span>
|
|
286
|
+
</div>
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// ---------------------------------------------------------------------------
|
|
291
|
+
// Shared layout primitives
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
|
|
294
|
+
function Section({
|
|
295
|
+
title,
|
|
296
|
+
children,
|
|
297
|
+
}: {
|
|
298
|
+
readonly title: string;
|
|
299
|
+
readonly children: React.ReactNode;
|
|
300
|
+
}) {
|
|
301
|
+
return (
|
|
302
|
+
<section>
|
|
303
|
+
<h3 className="mb-2 text-xs font-medium uppercase tracking-wider text-muted-foreground">
|
|
304
|
+
{title}
|
|
305
|
+
</h3>
|
|
306
|
+
<div className="overflow-hidden rounded-lg border border-border">
|
|
307
|
+
{children}
|
|
308
|
+
</div>
|
|
309
|
+
</section>
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// ---------------------------------------------------------------------------
|
|
314
|
+
// Non-happy states
|
|
315
|
+
// ---------------------------------------------------------------------------
|
|
316
|
+
|
|
317
|
+
function LoadingSkeleton({ className }: { readonly className?: string }) {
|
|
318
|
+
return (
|
|
319
|
+
<div
|
|
320
|
+
className={cn("flex flex-col gap-6", className)}
|
|
321
|
+
aria-busy="true"
|
|
322
|
+
aria-label="Loading runner details"
|
|
323
|
+
>
|
|
324
|
+
<div className="flex items-start gap-3">
|
|
325
|
+
<div className="mt-1 size-6 shrink-0 animate-pulse rounded bg-muted" />
|
|
326
|
+
<div className="flex-1 space-y-2">
|
|
327
|
+
<div className="h-5 w-48 animate-pulse rounded bg-muted" />
|
|
328
|
+
<div className="h-3 w-32 animate-pulse rounded bg-muted" />
|
|
329
|
+
</div>
|
|
330
|
+
</div>
|
|
331
|
+
<div className="space-y-2">
|
|
332
|
+
<div className="h-3 w-16 animate-pulse rounded bg-muted" />
|
|
333
|
+
<div
|
|
334
|
+
className="animate-pulse rounded-lg border border-border bg-muted-faint"
|
|
335
|
+
style={{ height: "96px" }}
|
|
336
|
+
/>
|
|
337
|
+
</div>
|
|
338
|
+
<div className="space-y-2">
|
|
339
|
+
<div className="h-3 w-20 animate-pulse rounded bg-muted" />
|
|
340
|
+
<div
|
|
341
|
+
className="animate-pulse rounded-lg border border-border bg-muted-faint"
|
|
342
|
+
style={{ height: "96px" }}
|
|
343
|
+
/>
|
|
344
|
+
</div>
|
|
345
|
+
</div>
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function NotFoundState({ className }: { readonly className?: string }) {
|
|
350
|
+
return (
|
|
351
|
+
<div
|
|
352
|
+
role="status"
|
|
353
|
+
className={cn(
|
|
354
|
+
"flex flex-col items-center gap-2 py-12 text-center",
|
|
355
|
+
className,
|
|
356
|
+
)}
|
|
357
|
+
>
|
|
358
|
+
<RunnerIcon className="size-10 text-muted-foreground-faint" />
|
|
359
|
+
<p className="text-sm font-medium text-muted-foreground">
|
|
360
|
+
Runner not found
|
|
361
|
+
</p>
|
|
362
|
+
<p className="text-xs text-muted-foreground-subtle">
|
|
363
|
+
This runner doesn't exist or has been removed.
|
|
364
|
+
</p>
|
|
365
|
+
</div>
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// ---------------------------------------------------------------------------
|
|
370
|
+
// Utilities
|
|
371
|
+
// ---------------------------------------------------------------------------
|
|
372
|
+
|
|
373
|
+
function formatRelativeTime(date: Date): string {
|
|
374
|
+
const now = Date.now();
|
|
375
|
+
const diffMs = now - date.getTime();
|
|
376
|
+
const diffSec = Math.floor(diffMs / 1000);
|
|
377
|
+
|
|
378
|
+
if (diffSec < 10) return "Just now";
|
|
379
|
+
if (diffSec < 60) return `${diffSec}s ago`;
|
|
380
|
+
const diffMin = Math.floor(diffSec / 60);
|
|
381
|
+
if (diffMin < 60) return `${diffMin}m ago`;
|
|
382
|
+
const diffHour = Math.floor(diffMin / 60);
|
|
383
|
+
if (diffHour < 24) return `${diffHour}h ago`;
|
|
384
|
+
return date.toLocaleDateString("en-US", {
|
|
385
|
+
month: "short",
|
|
386
|
+
day: "numeric",
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// ---------------------------------------------------------------------------
|
|
391
|
+
// Icon
|
|
392
|
+
// ---------------------------------------------------------------------------
|
|
393
|
+
|
|
394
|
+
function RunnerIcon({ className }: { readonly className?: string }) {
|
|
395
|
+
return (
|
|
396
|
+
<svg
|
|
397
|
+
className={className}
|
|
398
|
+
viewBox="0 0 16 16"
|
|
399
|
+
fill="none"
|
|
400
|
+
stroke="currentColor"
|
|
401
|
+
strokeWidth="1.5"
|
|
402
|
+
strokeLinecap="round"
|
|
403
|
+
strokeLinejoin="round"
|
|
404
|
+
aria-hidden="true"
|
|
405
|
+
>
|
|
406
|
+
<rect x="2" y="4" width="12" height="9" rx="1.5" />
|
|
407
|
+
<path d="M5 1v3M11 1v3M5 8.5h6" />
|
|
408
|
+
</svg>
|
|
409
|
+
);
|
|
410
|
+
}
|