@stigmer/react 0.5.0 → 1.0.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/activity/group-activity.d.ts +13 -0
- package/activity/group-activity.d.ts.map +1 -0
- package/activity/group-activity.js +54 -0
- package/activity/group-activity.js.map +1 -0
- package/activity/index.d.ts +4 -0
- package/activity/index.d.ts.map +1 -0
- package/activity/index.js +3 -0
- package/activity/index.js.map +1 -0
- package/activity/types.d.ts +34 -0
- package/activity/types.d.ts.map +1 -0
- package/activity/types.js +2 -0
- package/activity/types.js.map +1 -0
- package/activity/useRecentActivity.d.ts +35 -0
- package/activity/useRecentActivity.d.ts.map +1 -0
- package/activity/useRecentActivity.js +73 -0
- package/activity/useRecentActivity.js.map +1 -0
- package/agent/AgentPicker.d.ts.map +1 -1
- package/agent/AgentPicker.js +4 -2
- package/agent/AgentPicker.js.map +1 -1
- package/billing/BillingSection.d.ts.map +1 -1
- package/billing/BillingSection.js +1 -1
- package/billing/BillingSection.js.map +1 -1
- package/composer/ComposerToolbar.d.ts +5 -1
- package/composer/ComposerToolbar.d.ts.map +1 -1
- package/composer/ComposerToolbar.js +4 -3
- package/composer/ComposerToolbar.js.map +1 -1
- 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/InteractionModePicker.d.ts +40 -0
- package/composer/InteractionModePicker.d.ts.map +1 -0
- package/composer/InteractionModePicker.js +76 -0
- package/composer/InteractionModePicker.js.map +1 -0
- package/composer/SessionComposer.d.ts +64 -64
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +52 -11
- package/composer/SessionComposer.js.map +1 -1
- package/composer/__tests__/SessionComposer-memo.test.js +10 -5
- package/composer/__tests__/SessionComposer-memo.test.js.map +1 -1
- package/composer/index.d.ts +3 -1
- package/composer/index.d.ts.map +1 -1
- package/composer/index.js +1 -0
- package/composer/index.js.map +1 -1
- package/dashboard/DashboardFailedRuns.d.ts +19 -0
- package/dashboard/DashboardFailedRuns.d.ts.map +1 -0
- package/dashboard/DashboardFailedRuns.js +35 -0
- package/dashboard/DashboardFailedRuns.js.map +1 -0
- package/dashboard/DashboardKPICards.d.ts +19 -0
- package/dashboard/DashboardKPICards.d.ts.map +1 -0
- package/dashboard/DashboardKPICards.js +80 -0
- package/dashboard/DashboardKPICards.js.map +1 -0
- package/dashboard/OperationalDashboard.d.ts +37 -0
- package/dashboard/OperationalDashboard.d.ts.map +1 -0
- package/dashboard/OperationalDashboard.js +48 -0
- package/dashboard/OperationalDashboard.js.map +1 -0
- package/dashboard/index.d.ts +8 -0
- package/dashboard/index.d.ts.map +1 -0
- package/dashboard/index.js +9 -0
- package/dashboard/index.js.map +1 -0
- package/dashboard/types.d.ts +49 -0
- package/dashboard/types.d.ts.map +1 -0
- package/dashboard/types.js +2 -0
- package/dashboard/types.js.map +1 -0
- package/dashboard/useAgentExecutionSummary.d.ts +33 -0
- package/dashboard/useAgentExecutionSummary.d.ts.map +1 -0
- package/dashboard/useAgentExecutionSummary.js +32 -0
- package/dashboard/useAgentExecutionSummary.js.map +1 -0
- package/dashboard/useDashboardFailedRuns.d.ts +18 -0
- package/dashboard/useDashboardFailedRuns.d.ts.map +1 -0
- package/dashboard/useDashboardFailedRuns.js +86 -0
- package/dashboard/useDashboardFailedRuns.js.map +1 -0
- package/dashboard/useDashboardSummary.d.ts +32 -0
- package/dashboard/useDashboardSummary.d.ts.map +1 -0
- package/dashboard/useDashboardSummary.js +67 -0
- package/dashboard/useDashboardSummary.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/execution/ContextGauge.d.ts +45 -0
- package/execution/ContextGauge.d.ts.map +1 -0
- package/execution/ContextGauge.js +82 -0
- package/execution/ContextGauge.js.map +1 -0
- package/execution/InteractionModeBadge.d.ts +24 -0
- package/execution/InteractionModeBadge.d.ts.map +1 -0
- package/execution/InteractionModeBadge.js +29 -0
- package/execution/InteractionModeBadge.js.map +1 -0
- package/execution/MessageThread.d.ts +33 -3
- package/execution/MessageThread.d.ts.map +1 -1
- package/execution/MessageThread.js +51 -9
- package/execution/MessageThread.js.map +1 -1
- package/execution/PlanCompletionCard.d.ts +23 -0
- package/execution/PlanCompletionCard.d.ts.map +1 -0
- package/execution/PlanCompletionCard.js +28 -0
- package/execution/PlanCompletionCard.js.map +1 -0
- package/execution/SummarizationBadge.d.ts +30 -0
- package/execution/SummarizationBadge.d.ts.map +1 -0
- package/execution/SummarizationBadge.js +61 -0
- package/execution/SummarizationBadge.js.map +1 -0
- package/execution/SummarizationCard.d.ts +27 -0
- package/execution/SummarizationCard.d.ts.map +1 -0
- package/execution/SummarizationCard.js +47 -0
- package/execution/SummarizationCard.js.map +1 -0
- package/execution/__tests__/PlanCompletionCard.test.d.ts +2 -0
- package/execution/__tests__/PlanCompletionCard.test.d.ts.map +1 -0
- package/execution/__tests__/PlanCompletionCard.test.js +53 -0
- package/execution/__tests__/PlanCompletionCard.test.js.map +1 -0
- package/execution/__tests__/buildThreadItems-plan-completion.test.d.ts +2 -0
- package/execution/__tests__/buildThreadItems-plan-completion.test.d.ts.map +1 -0
- package/execution/__tests__/buildThreadItems-plan-completion.test.js +137 -0
- package/execution/__tests__/buildThreadItems-plan-completion.test.js.map +1 -0
- package/execution/__tests__/useContextWindow.test.d.ts +2 -0
- package/execution/__tests__/useContextWindow.test.d.ts.map +1 -0
- package/execution/__tests__/useContextWindow.test.js +121 -0
- package/execution/__tests__/useContextWindow.test.js.map +1 -0
- package/execution/index.d.ts +12 -0
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +6 -0
- package/execution/index.js.map +1 -1
- package/execution/useContextWindow.d.ts +71 -0
- package/execution/useContextWindow.d.ts.map +1 -0
- package/execution/useContextWindow.js +91 -0
- package/execution/useContextWindow.js.map +1 -0
- package/execution/useCreateAgentExecution.d.ts +9 -0
- package/execution/useCreateAgentExecution.d.ts.map +1 -1
- package/execution/useCreateAgentExecution.js +15 -3
- package/execution/useCreateAgentExecution.js.map +1 -1
- package/index.d.ts +11 -6
- package/index.d.ts.map +1 -1
- package/index.js +13 -3
- package/index.js.map +1 -1
- package/inline-edit/InlineEditKeyValue.d.ts +5 -1
- package/inline-edit/InlineEditKeyValue.d.ts.map +1 -1
- package/inline-edit/InlineEditKeyValue.js +3 -3
- package/inline-edit/InlineEditKeyValue.js.map +1 -1
- package/internal/VirtualizedThread.d.ts +2 -1
- package/internal/VirtualizedThread.d.ts.map +1 -1
- package/internal/VirtualizedThread.js +3 -2
- package/internal/VirtualizedThread.js.map +1 -1
- package/internal/store/index.d.ts +1 -0
- package/internal/store/index.d.ts.map +1 -1
- package/internal/store/index.js +1 -0
- package/internal/store/index.js.map +1 -1
- package/internal/store/workflow-execution-event-store.d.ts +92 -0
- package/internal/store/workflow-execution-event-store.d.ts.map +1 -0
- package/internal/store/workflow-execution-event-store.js +298 -0
- package/internal/store/workflow-execution-event-store.js.map +1 -0
- package/internal/useFetch.js +2 -2
- package/internal/useFetch.js.map +1 -1
- package/library/ScopeToggle.d.ts +13 -9
- package/library/ScopeToggle.d.ts.map +1 -1
- package/library/ScopeToggle.js +43 -22
- package/library/ScopeToggle.js.map +1 -1
- package/library/VisibilityToggle.js +14 -5
- package/library/VisibilityToggle.js.map +1 -1
- package/library/index.d.ts +1 -0
- package/library/index.d.ts.map +1 -1
- package/library/index.js +1 -0
- package/library/index.js.map +1 -1
- package/library/useExportResource.d.ts +3 -2
- package/library/useExportResource.d.ts.map +1 -1
- package/library/useExportResource.js +11 -6
- package/library/useExportResource.js.map +1 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +169 -58
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/McpServerPicker.d.ts.map +1 -1
- package/mcp-server/McpServerPicker.js +4 -2
- package/mcp-server/McpServerPicker.js.map +1 -1
- 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 +16 -5
- package/provider.d.ts.map +1 -1
- package/provider.js +232 -22
- package/provider.js.map +1 -1
- package/resource-detail/ResourceDetailShell.d.ts +1 -1
- package/resource-detail/ResourceDetailShell.d.ts.map +1 -1
- package/resource-detail/ResourceDetailShell.js +6 -6
- package/resource-detail/ResourceDetailShell.js.map +1 -1
- package/resource-detail/types.d.ts +23 -0
- package/resource-detail/types.d.ts.map +1 -1
- package/resource-detail/useDeleteResource.d.ts +1 -1
- package/resource-detail/useDeleteResource.d.ts.map +1 -1
- package/resource-detail/useDeleteResource.js +5 -0
- package/resource-detail/useDeleteResource.js.map +1 -1
- package/resource-workbench/components/ResourceWorkbench.d.ts.map +1 -1
- package/resource-workbench/components/ResourceWorkbench.js +2 -1
- package/resource-workbench/components/ResourceWorkbench.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/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +1 -0
- package/session/useNewSessionFlow.js.map +1 -1
- package/session/useSessionConversation.d.ts +7 -0
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +2 -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 +21 -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/session/useSessionUsage.d.ts.map +1 -1
- package/session/useSessionUsage.js +65 -4
- package/session/useSessionUsage.js.map +1 -1
- package/settings/UsageSection.d.ts.map +1 -1
- package/settings/UsageSection.js +1 -4
- package/settings/UsageSection.js.map +1 -1
- package/skill/SkillPicker.d.ts.map +1 -1
- package/skill/SkillPicker.js +4 -2
- package/skill/SkillPicker.js.map +1 -1
- package/src/activity/group-activity.ts +65 -0
- package/src/activity/index.ts +13 -0
- package/src/activity/types.ts +35 -0
- package/src/activity/useRecentActivity.ts +131 -0
- package/src/agent/AgentPicker.tsx +6 -1
- package/src/billing/BillingSection.tsx +3 -2
- package/src/composer/ComposerToolbar.tsx +19 -1
- package/src/composer/ContextChip.tsx +20 -11
- package/src/composer/InteractionModePicker.tsx +189 -0
- package/src/composer/SessionComposer.tsx +137 -11
- package/src/composer/__tests__/SessionComposer-memo.test.ts +11 -6
- package/src/composer/index.ts +7 -0
- package/src/dashboard/DashboardFailedRuns.tsx +109 -0
- package/src/dashboard/DashboardKPICards.tsx +128 -0
- package/src/dashboard/OperationalDashboard.tsx +96 -0
- package/src/dashboard/index.ts +37 -0
- package/src/dashboard/types.ts +50 -0
- package/src/dashboard/useAgentExecutionSummary.ts +71 -0
- package/src/dashboard/useDashboardFailedRuns.ts +122 -0
- package/src/dashboard/useDashboardSummary.ts +109 -0
- package/src/environment/usePersonalEnvironment.ts +1 -0
- package/src/execution/ContextGauge.tsx +243 -0
- package/src/execution/InteractionModeBadge.tsx +70 -0
- package/src/execution/MessageThread.tsx +88 -3
- package/src/execution/PlanCompletionCard.tsx +105 -0
- package/src/execution/SummarizationBadge.tsx +188 -0
- package/src/execution/SummarizationCard.tsx +126 -0
- package/src/execution/__tests__/PlanCompletionCard.test.tsx +67 -0
- package/src/execution/__tests__/buildThreadItems-plan-completion.test.ts +197 -0
- package/src/execution/__tests__/useContextWindow.test.ts +167 -0
- package/src/execution/index.ts +22 -0
- package/src/execution/useContextWindow.ts +148 -0
- package/src/execution/useCreateAgentExecution.ts +26 -3
- package/src/index.ts +227 -0
- package/src/inline-edit/InlineEditKeyValue.tsx +23 -0
- package/src/internal/VirtualizedThread.tsx +4 -1
- package/src/internal/store/index.ts +6 -0
- package/src/internal/store/workflow-execution-event-store.ts +391 -0
- package/src/internal/useFetch.ts +2 -2
- package/src/library/ScopeToggle.tsx +88 -20
- package/src/library/VisibilityToggle.tsx +54 -13
- package/src/library/index.ts +2 -0
- package/src/library/useExportResource.ts +12 -9
- package/src/mcp-server/McpServerDetailView.tsx +509 -203
- package/src/mcp-server/McpServerPicker.tsx +6 -1
- 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 +264 -26
- package/src/resource-detail/ResourceDetailShell.tsx +21 -4
- package/src/resource-detail/types.ts +25 -0
- package/src/resource-detail/useDeleteResource.ts +6 -1
- package/src/resource-workbench/components/ResourceWorkbench.tsx +4 -0
- 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/useNewSessionFlow.ts +1 -0
- package/src/session/useSessionConversation.ts +13 -64
- package/src/session/useSessionPageFlow.ts +29 -7
- package/src/session/useSessionSearch.ts +149 -0
- package/src/session/useSessionUsage.ts +72 -4
- package/src/settings/UsageSection.tsx +1 -9
- package/src/skill/SkillPicker.tsx +6 -1
- package/src/workflow/ApprovalFormBuilder.tsx +1017 -0
- package/src/workflow/BranchConditionBuilder.tsx +451 -0
- package/src/workflow/CanvasActionsContext.ts +12 -0
- package/src/workflow/CanvasContextMenu.tsx +364 -0
- package/src/workflow/CanvasTaskNode.tsx +372 -0
- package/src/workflow/CanvasTransitionEdge.tsx +122 -0
- package/src/workflow/CostByWorkflowChart.tsx +120 -0
- package/src/workflow/ExecutionSummaryWidget.tsx +194 -0
- package/src/workflow/ExecutionTrendChart.tsx +157 -0
- package/src/workflow/FailedRunsWidget.tsx +109 -0
- package/src/workflow/PendingApprovalsWidget.tsx +115 -0
- package/src/workflow/TaskConfigForm.tsx +618 -0
- package/src/workflow/TaskKindRegistryContext.ts +36 -0
- package/src/workflow/TaskPickerPopover.tsx +326 -0
- package/src/workflow/WorkflowArchitectDialog.tsx +505 -0
- package/src/workflow/WorkflowCanvasEditor.tsx +651 -0
- package/src/workflow/WorkflowCanvasInner.tsx +160 -0
- package/src/workflow/WorkflowDashboard.tsx +124 -0
- package/src/workflow/WorkflowDetailView.tsx +527 -0
- package/src/workflow/WorkflowEditorView.tsx +547 -0
- package/src/workflow/WorkflowExecutionApprovalCard.tsx +129 -0
- package/src/workflow/WorkflowExecutionArtifactPanel.tsx +112 -0
- package/src/workflow/WorkflowExecutionCostPanel.tsx +131 -0
- package/src/workflow/WorkflowExecutionHeader.tsx +194 -0
- package/src/workflow/WorkflowExecutionPhaseBadge.tsx +188 -0
- package/src/workflow/WorkflowExecutionTaskPanel.tsx +135 -0
- package/src/workflow/WorkflowExecutionTimeline.tsx +118 -0
- package/src/workflow/WorkflowExecutionTimelineEvent.tsx +488 -0
- package/src/workflow/WorkflowExecutionViewer.tsx +248 -0
- package/src/workflow/WorkflowInspectorPanel.tsx +568 -0
- package/src/workflow/WorkflowRefinePanel.tsx +411 -0
- package/src/workflow/WorkflowRepairCard.tsx +433 -0
- package/src/workflow/WorkflowRunDialog.tsx +220 -0
- package/src/workflow/WorkflowRunForm.tsx +245 -0
- package/src/workflow/WorkflowTaskList.tsx +177 -0
- package/src/workflow/WorkflowTaskPalette.tsx +248 -0
- package/src/workflow/WorkflowTopologyGraph.tsx +250 -0
- package/src/workflow/WorkflowYamlEditor.tsx +271 -0
- package/src/workflow/__tests__/starter-workflow-yaml.test.ts +57 -0
- package/src/workflow/canvas-constants.ts +87 -0
- package/src/workflow/canvas-icons.tsx +36 -0
- package/src/workflow/extract-workflow-yaml.ts +87 -0
- package/src/workflow/graph-commands.ts +675 -0
- package/src/workflow/index.ts +375 -0
- package/src/workflow/serialize-workflow-yaml.ts +546 -0
- package/src/workflow/starter-workflow-yaml.ts +29 -0
- package/src/workflow/types.ts +99 -0
- package/src/workflow/useCanvasKeyboardShortcuts.ts +134 -0
- package/src/workflow/useDiagnoseExecutionFlow.ts +378 -0
- package/src/workflow/useGraphHistory.ts +138 -0
- package/src/workflow/usePendingApprovals.ts +89 -0
- package/src/workflow/useRefineWorkflowFlow.ts +321 -0
- package/src/workflow/useResolveAgentExecutionSession.ts +57 -0
- package/src/workflow/useRunWorkflowFlow.ts +235 -0
- package/src/workflow/useTaskKindRegistry.ts +135 -0
- package/src/workflow/useWorkflow.ts +78 -0
- package/src/workflow/useWorkflowArchitectFlow.ts +303 -0
- package/src/workflow/useWorkflowCanvas.ts +882 -0
- package/src/workflow/useWorkflowCount.ts +66 -0
- package/src/workflow/useWorkflowDashboardSummary.ts +71 -0
- package/src/workflow/useWorkflowEditor.ts +106 -0
- package/src/workflow/useWorkflowExecution.ts +67 -0
- package/src/workflow/useWorkflowExecutionActions.ts +179 -0
- package/src/workflow/useWorkflowExecutionArtifacts.ts +57 -0
- package/src/workflow/useWorkflowExecutionEventLog.ts +111 -0
- package/src/workflow/useWorkflowExecutionEventStream.ts +244 -0
- package/src/workflow/useWorkflowExecutionList.ts +121 -0
- package/src/workflow/useWorkflowInstances.ts +62 -0
- package/src/workflow/useWorkflowList.ts +79 -0
- package/src/workflow/useWorkflowSave.ts +84 -0
- package/src/workflow/useWorkflowTopology.ts +229 -0
- package/src/workflow/useWorkflowValidation.ts +329 -0
- package/src/workflow/useWorkflowYaml.ts +49 -0
- package/src/workflow/workflow-graph-conversions.ts +796 -0
- package/src/workflow/workflow-graph-model.ts +83 -0
- package/src/workflow/workflow-yaml-diff.ts +132 -0
- package/styles.css +1 -1
- package/workflow/ApprovalFormBuilder.d.ts +24 -0
- package/workflow/ApprovalFormBuilder.d.ts.map +1 -0
- package/workflow/ApprovalFormBuilder.js +347 -0
- package/workflow/ApprovalFormBuilder.js.map +1 -0
- package/workflow/BranchConditionBuilder.d.ts +29 -0
- package/workflow/BranchConditionBuilder.d.ts.map +1 -0
- package/workflow/BranchConditionBuilder.js +170 -0
- package/workflow/BranchConditionBuilder.js.map +1 -0
- package/workflow/CanvasActionsContext.d.ts +8 -0
- package/workflow/CanvasActionsContext.d.ts.map +1 -0
- package/workflow/CanvasActionsContext.js +4 -0
- package/workflow/CanvasActionsContext.js.map +1 -0
- package/workflow/CanvasContextMenu.d.ts +59 -0
- package/workflow/CanvasContextMenu.d.ts.map +1 -0
- package/workflow/CanvasContextMenu.js +98 -0
- package/workflow/CanvasContextMenu.js.map +1 -0
- package/workflow/CanvasTaskNode.d.ts +21 -0
- package/workflow/CanvasTaskNode.d.ts.map +1 -0
- package/workflow/CanvasTaskNode.js +125 -0
- package/workflow/CanvasTaskNode.js.map +1 -0
- package/workflow/CanvasTransitionEdge.d.ts +24 -0
- package/workflow/CanvasTransitionEdge.d.ts.map +1 -0
- package/workflow/CanvasTransitionEdge.js +50 -0
- package/workflow/CanvasTransitionEdge.js.map +1 -0
- package/workflow/CostByWorkflowChart.d.ts +15 -0
- package/workflow/CostByWorkflowChart.d.ts.map +1 -0
- package/workflow/CostByWorkflowChart.js +45 -0
- package/workflow/CostByWorkflowChart.js.map +1 -0
- package/workflow/ExecutionSummaryWidget.d.ts +16 -0
- package/workflow/ExecutionSummaryWidget.d.ts.map +1 -0
- package/workflow/ExecutionSummaryWidget.js +93 -0
- package/workflow/ExecutionSummaryWidget.js.map +1 -0
- package/workflow/ExecutionTrendChart.d.ts +14 -0
- package/workflow/ExecutionTrendChart.d.ts.map +1 -0
- package/workflow/ExecutionTrendChart.js +67 -0
- package/workflow/ExecutionTrendChart.js.map +1 -0
- package/workflow/FailedRunsWidget.d.ts +19 -0
- package/workflow/FailedRunsWidget.d.ts.map +1 -0
- package/workflow/FailedRunsWidget.js +37 -0
- package/workflow/FailedRunsWidget.js.map +1 -0
- package/workflow/PendingApprovalsWidget.d.ts +19 -0
- package/workflow/PendingApprovalsWidget.d.ts.map +1 -0
- package/workflow/PendingApprovalsWidget.js +35 -0
- package/workflow/PendingApprovalsWidget.js.map +1 -0
- package/workflow/TaskConfigForm.d.ts +29 -0
- package/workflow/TaskConfigForm.d.ts.map +1 -0
- package/workflow/TaskConfigForm.js +230 -0
- package/workflow/TaskConfigForm.js.map +1 -0
- package/workflow/TaskKindRegistryContext.d.ts +24 -0
- package/workflow/TaskKindRegistryContext.d.ts.map +1 -0
- package/workflow/TaskKindRegistryContext.js +25 -0
- package/workflow/TaskKindRegistryContext.js.map +1 -0
- package/workflow/TaskPickerPopover.d.ts +33 -0
- package/workflow/TaskPickerPopover.d.ts.map +1 -0
- package/workflow/TaskPickerPopover.js +110 -0
- package/workflow/TaskPickerPopover.js.map +1 -0
- package/workflow/WorkflowArchitectDialog.d.ts +48 -0
- package/workflow/WorkflowArchitectDialog.d.ts.map +1 -0
- package/workflow/WorkflowArchitectDialog.js +129 -0
- package/workflow/WorkflowArchitectDialog.js.map +1 -0
- package/workflow/WorkflowCanvasEditor.d.ts +38 -0
- package/workflow/WorkflowCanvasEditor.d.ts.map +1 -0
- package/workflow/WorkflowCanvasEditor.js +287 -0
- package/workflow/WorkflowCanvasEditor.js.map +1 -0
- package/workflow/WorkflowCanvasInner.d.ts +32 -0
- package/workflow/WorkflowCanvasInner.d.ts.map +1 -0
- package/workflow/WorkflowCanvasInner.js +49 -0
- package/workflow/WorkflowCanvasInner.js.map +1 -0
- package/workflow/WorkflowDashboard.d.ts +35 -0
- package/workflow/WorkflowDashboard.d.ts.map +1 -0
- package/workflow/WorkflowDashboard.js +59 -0
- package/workflow/WorkflowDashboard.js.map +1 -0
- package/workflow/WorkflowDetailView.d.ts +63 -0
- package/workflow/WorkflowDetailView.d.ts.map +1 -0
- package/workflow/WorkflowDetailView.js +202 -0
- package/workflow/WorkflowDetailView.js.map +1 -0
- package/workflow/WorkflowEditorView.d.ts +43 -0
- package/workflow/WorkflowEditorView.d.ts.map +1 -0
- package/workflow/WorkflowEditorView.js +165 -0
- package/workflow/WorkflowEditorView.js.map +1 -0
- package/workflow/WorkflowExecutionApprovalCard.d.ts +27 -0
- package/workflow/WorkflowExecutionApprovalCard.d.ts.map +1 -0
- package/workflow/WorkflowExecutionApprovalCard.js +32 -0
- package/workflow/WorkflowExecutionApprovalCard.js.map +1 -0
- package/workflow/WorkflowExecutionArtifactPanel.d.ts +15 -0
- package/workflow/WorkflowExecutionArtifactPanel.d.ts.map +1 -0
- package/workflow/WorkflowExecutionArtifactPanel.js +53 -0
- package/workflow/WorkflowExecutionArtifactPanel.js.map +1 -0
- package/workflow/WorkflowExecutionCostPanel.d.ts +18 -0
- package/workflow/WorkflowExecutionCostPanel.d.ts.map +1 -0
- package/workflow/WorkflowExecutionCostPanel.js +44 -0
- package/workflow/WorkflowExecutionCostPanel.js.map +1 -0
- package/workflow/WorkflowExecutionHeader.d.ts +26 -0
- package/workflow/WorkflowExecutionHeader.d.ts.map +1 -0
- package/workflow/WorkflowExecutionHeader.js +68 -0
- package/workflow/WorkflowExecutionHeader.js.map +1 -0
- package/workflow/WorkflowExecutionPhaseBadge.d.ts +23 -0
- package/workflow/WorkflowExecutionPhaseBadge.d.ts.map +1 -0
- package/workflow/WorkflowExecutionPhaseBadge.js +99 -0
- package/workflow/WorkflowExecutionPhaseBadge.js.map +1 -0
- package/workflow/WorkflowExecutionTaskPanel.d.ts +24 -0
- package/workflow/WorkflowExecutionTaskPanel.d.ts.map +1 -0
- package/workflow/WorkflowExecutionTaskPanel.js +59 -0
- package/workflow/WorkflowExecutionTaskPanel.js.map +1 -0
- package/workflow/WorkflowExecutionTimeline.d.ts +27 -0
- package/workflow/WorkflowExecutionTimeline.d.ts.map +1 -0
- package/workflow/WorkflowExecutionTimeline.js +51 -0
- package/workflow/WorkflowExecutionTimeline.js.map +1 -0
- package/workflow/WorkflowExecutionTimelineEvent.d.ts +18 -0
- package/workflow/WorkflowExecutionTimelineEvent.d.ts.map +1 -0
- package/workflow/WorkflowExecutionTimelineEvent.js +210 -0
- package/workflow/WorkflowExecutionTimelineEvent.js.map +1 -0
- package/workflow/WorkflowExecutionViewer.d.ts +45 -0
- package/workflow/WorkflowExecutionViewer.d.ts.map +1 -0
- package/workflow/WorkflowExecutionViewer.js +75 -0
- package/workflow/WorkflowExecutionViewer.js.map +1 -0
- package/workflow/WorkflowInspectorPanel.d.ts +46 -0
- package/workflow/WorkflowInspectorPanel.d.ts.map +1 -0
- package/workflow/WorkflowInspectorPanel.js +152 -0
- package/workflow/WorkflowInspectorPanel.js.map +1 -0
- package/workflow/WorkflowRefinePanel.d.ts +30 -0
- package/workflow/WorkflowRefinePanel.d.ts.map +1 -0
- package/workflow/WorkflowRefinePanel.js +107 -0
- package/workflow/WorkflowRefinePanel.js.map +1 -0
- package/workflow/WorkflowRepairCard.d.ts +35 -0
- package/workflow/WorkflowRepairCard.d.ts.map +1 -0
- package/workflow/WorkflowRepairCard.js +113 -0
- package/workflow/WorkflowRepairCard.js.map +1 -0
- package/workflow/WorkflowRunDialog.d.ts +51 -0
- package/workflow/WorkflowRunDialog.d.ts.map +1 -0
- package/workflow/WorkflowRunDialog.js +75 -0
- package/workflow/WorkflowRunDialog.js.map +1 -0
- package/workflow/WorkflowRunForm.d.ts +62 -0
- package/workflow/WorkflowRunForm.d.ts.map +1 -0
- package/workflow/WorkflowRunForm.js +64 -0
- package/workflow/WorkflowRunForm.js.map +1 -0
- package/workflow/WorkflowTaskList.d.ts +25 -0
- package/workflow/WorkflowTaskList.d.ts.map +1 -0
- package/workflow/WorkflowTaskList.js +89 -0
- package/workflow/WorkflowTaskList.js.map +1 -0
- package/workflow/WorkflowTaskPalette.d.ts +22 -0
- package/workflow/WorkflowTaskPalette.d.ts.map +1 -0
- package/workflow/WorkflowTaskPalette.js +83 -0
- package/workflow/WorkflowTaskPalette.js.map +1 -0
- package/workflow/WorkflowTopologyGraph.d.ts +22 -0
- package/workflow/WorkflowTopologyGraph.d.ts.map +1 -0
- package/workflow/WorkflowTopologyGraph.js +123 -0
- package/workflow/WorkflowTopologyGraph.js.map +1 -0
- package/workflow/WorkflowYamlEditor.d.ts +43 -0
- package/workflow/WorkflowYamlEditor.d.ts.map +1 -0
- package/workflow/WorkflowYamlEditor.js +215 -0
- package/workflow/WorkflowYamlEditor.js.map +1 -0
- package/workflow/__tests__/starter-workflow-yaml.test.d.ts +2 -0
- package/workflow/__tests__/starter-workflow-yaml.test.d.ts.map +1 -0
- package/workflow/__tests__/starter-workflow-yaml.test.js +44 -0
- package/workflow/__tests__/starter-workflow-yaml.test.js.map +1 -0
- package/workflow/canvas-constants.d.ts +56 -0
- package/workflow/canvas-constants.d.ts.map +1 -0
- package/workflow/canvas-constants.js +74 -0
- package/workflow/canvas-constants.js.map +1 -0
- package/workflow/canvas-icons.d.ts +13 -0
- package/workflow/canvas-icons.d.ts.map +1 -0
- package/workflow/canvas-icons.js +21 -0
- package/workflow/canvas-icons.js.map +1 -0
- package/workflow/extract-workflow-yaml.d.ts +22 -0
- package/workflow/extract-workflow-yaml.d.ts.map +1 -0
- package/workflow/extract-workflow-yaml.js +63 -0
- package/workflow/extract-workflow-yaml.js.map +1 -0
- package/workflow/graph-commands.d.ts +209 -0
- package/workflow/graph-commands.d.ts.map +1 -0
- package/workflow/graph-commands.js +516 -0
- package/workflow/graph-commands.js.map +1 -0
- package/workflow/index.d.ts +66 -0
- package/workflow/index.d.ts.map +1 -0
- package/workflow/index.js +88 -0
- package/workflow/index.js.map +1 -0
- package/workflow/serialize-workflow-yaml.d.ts +39 -0
- package/workflow/serialize-workflow-yaml.d.ts.map +1 -0
- package/workflow/serialize-workflow-yaml.js +413 -0
- package/workflow/serialize-workflow-yaml.js.map +1 -0
- package/workflow/starter-workflow-yaml.d.ts +12 -0
- package/workflow/starter-workflow-yaml.d.ts.map +1 -0
- package/workflow/starter-workflow-yaml.js +30 -0
- package/workflow/starter-workflow-yaml.js.map +1 -0
- package/workflow/types.d.ts +80 -0
- package/workflow/types.d.ts.map +1 -0
- package/workflow/types.js +2 -0
- package/workflow/types.js.map +1 -0
- package/workflow/useCanvasKeyboardShortcuts.d.ts +34 -0
- package/workflow/useCanvasKeyboardShortcuts.d.ts.map +1 -0
- package/workflow/useCanvasKeyboardShortcuts.js +108 -0
- package/workflow/useCanvasKeyboardShortcuts.js.map +1 -0
- package/workflow/useDiagnoseExecutionFlow.d.ts +87 -0
- package/workflow/useDiagnoseExecutionFlow.d.ts.map +1 -0
- package/workflow/useDiagnoseExecutionFlow.js +257 -0
- package/workflow/useDiagnoseExecutionFlow.js.map +1 -0
- package/workflow/useGraphHistory.d.ts +28 -0
- package/workflow/useGraphHistory.d.ts.map +1 -0
- package/workflow/useGraphHistory.js +106 -0
- package/workflow/useGraphHistory.js.map +1 -0
- package/workflow/usePendingApprovals.d.ts +35 -0
- package/workflow/usePendingApprovals.d.ts.map +1 -0
- package/workflow/usePendingApprovals.js +50 -0
- package/workflow/usePendingApprovals.js.map +1 -0
- package/workflow/useRefineWorkflowFlow.d.ts +75 -0
- package/workflow/useRefineWorkflowFlow.d.ts.map +1 -0
- package/workflow/useRefineWorkflowFlow.js +216 -0
- package/workflow/useRefineWorkflowFlow.js.map +1 -0
- package/workflow/useResolveAgentExecutionSession.d.ts +33 -0
- package/workflow/useResolveAgentExecutionSession.d.ts.map +1 -0
- package/workflow/useResolveAgentExecutionSession.js +37 -0
- package/workflow/useResolveAgentExecutionSession.js.map +1 -0
- package/workflow/useRunWorkflowFlow.d.ts +82 -0
- package/workflow/useRunWorkflowFlow.d.ts.map +1 -0
- package/workflow/useRunWorkflowFlow.js +145 -0
- package/workflow/useRunWorkflowFlow.js.map +1 -0
- package/workflow/useTaskKindRegistry.d.ts +96 -0
- package/workflow/useTaskKindRegistry.d.ts.map +1 -0
- package/workflow/useTaskKindRegistry.js +75 -0
- package/workflow/useTaskKindRegistry.js.map +1 -0
- package/workflow/useWorkflow.d.ts +47 -0
- package/workflow/useWorkflow.d.ts.map +1 -0
- package/workflow/useWorkflow.js +53 -0
- package/workflow/useWorkflow.js.map +1 -0
- package/workflow/useWorkflowArchitectFlow.d.ts +96 -0
- package/workflow/useWorkflowArchitectFlow.d.ts.map +1 -0
- package/workflow/useWorkflowArchitectFlow.js +179 -0
- package/workflow/useWorkflowArchitectFlow.js.map +1 -0
- package/workflow/useWorkflowCanvas.d.ts +66 -0
- package/workflow/useWorkflowCanvas.d.ts.map +1 -0
- package/workflow/useWorkflowCanvas.js +628 -0
- package/workflow/useWorkflowCanvas.js.map +1 -0
- package/workflow/useWorkflowCount.d.ts +47 -0
- package/workflow/useWorkflowCount.d.ts.map +1 -0
- package/workflow/useWorkflowCount.js +26 -0
- package/workflow/useWorkflowCount.js.map +1 -0
- package/workflow/useWorkflowDashboardSummary.d.ts +34 -0
- package/workflow/useWorkflowDashboardSummary.d.ts.map +1 -0
- package/workflow/useWorkflowDashboardSummary.js +33 -0
- package/workflow/useWorkflowDashboardSummary.js.map +1 -0
- package/workflow/useWorkflowEditor.d.ts +45 -0
- package/workflow/useWorkflowEditor.d.ts.map +1 -0
- package/workflow/useWorkflowEditor.js +52 -0
- package/workflow/useWorkflowEditor.js.map +1 -0
- package/workflow/useWorkflowExecution.d.ts +37 -0
- package/workflow/useWorkflowExecution.d.ts.map +1 -0
- package/workflow/useWorkflowExecution.js +43 -0
- package/workflow/useWorkflowExecution.js.map +1 -0
- package/workflow/useWorkflowExecutionActions.d.ts +41 -0
- package/workflow/useWorkflowExecutionActions.d.ts.map +1 -0
- package/workflow/useWorkflowExecutionActions.js +86 -0
- package/workflow/useWorkflowExecutionActions.js.map +1 -0
- package/workflow/useWorkflowExecutionArtifacts.d.ts +26 -0
- package/workflow/useWorkflowExecutionArtifacts.d.ts.map +1 -0
- package/workflow/useWorkflowExecutionArtifacts.js +29 -0
- package/workflow/useWorkflowExecutionArtifacts.js.map +1 -0
- package/workflow/useWorkflowExecutionEventLog.d.ts +47 -0
- package/workflow/useWorkflowExecutionEventLog.d.ts.map +1 -0
- package/workflow/useWorkflowExecutionEventLog.js +59 -0
- package/workflow/useWorkflowExecutionEventLog.js.map +1 -0
- package/workflow/useWorkflowExecutionEventStream.d.ts +61 -0
- package/workflow/useWorkflowExecutionEventStream.d.ts.map +1 -0
- package/workflow/useWorkflowExecutionEventStream.js +161 -0
- package/workflow/useWorkflowExecutionEventStream.js.map +1 -0
- package/workflow/useWorkflowExecutionList.d.ts +49 -0
- package/workflow/useWorkflowExecutionList.d.ts.map +1 -0
- package/workflow/useWorkflowExecutionList.js +65 -0
- package/workflow/useWorkflowExecutionList.js.map +1 -0
- package/workflow/useWorkflowInstances.d.ts +30 -0
- package/workflow/useWorkflowInstances.d.ts.map +1 -0
- package/workflow/useWorkflowInstances.js +33 -0
- package/workflow/useWorkflowInstances.js.map +1 -0
- package/workflow/useWorkflowList.d.ts +57 -0
- package/workflow/useWorkflowList.d.ts.map +1 -0
- package/workflow/useWorkflowList.js +29 -0
- package/workflow/useWorkflowList.js.map +1 -0
- package/workflow/useWorkflowSave.d.ts +25 -0
- package/workflow/useWorkflowSave.d.ts.map +1 -0
- package/workflow/useWorkflowSave.js +61 -0
- package/workflow/useWorkflowSave.js.map +1 -0
- package/workflow/useWorkflowTopology.d.ts +40 -0
- package/workflow/useWorkflowTopology.d.ts.map +1 -0
- package/workflow/useWorkflowTopology.js +163 -0
- package/workflow/useWorkflowTopology.js.map +1 -0
- package/workflow/useWorkflowValidation.d.ts +27 -0
- package/workflow/useWorkflowValidation.d.ts.map +1 -0
- package/workflow/useWorkflowValidation.js +253 -0
- package/workflow/useWorkflowValidation.js.map +1 -0
- package/workflow/useWorkflowYaml.d.ts +26 -0
- package/workflow/useWorkflowYaml.d.ts.map +1 -0
- package/workflow/useWorkflowYaml.js +26 -0
- package/workflow/useWorkflowYaml.js.map +1 -0
- package/workflow/workflow-graph-conversions.d.ts +70 -0
- package/workflow/workflow-graph-conversions.d.ts.map +1 -0
- package/workflow/workflow-graph-conversions.js +634 -0
- package/workflow/workflow-graph-conversions.js.map +1 -0
- package/workflow/workflow-graph-model.d.ts +83 -0
- package/workflow/workflow-graph-model.d.ts.map +1 -0
- package/workflow/workflow-graph-model.js +5 -0
- package/workflow/workflow-graph-model.js.map +1 -0
- package/workflow/workflow-yaml-diff.d.ts +24 -0
- package/workflow/workflow-yaml-diff.d.ts.map +1 -0
- package/workflow/workflow-yaml-diff.js +96 -0
- package/workflow/workflow-yaml-diff.js.map +1 -0
|
@@ -21,6 +21,8 @@ import { ScrollFade } from "../internal/ScrollFade";
|
|
|
21
21
|
import { McpServerConfigPanel } from "./McpServerConfigPanel";
|
|
22
22
|
import type { McpServerSetupEntry } from "./mcpServerSetupReducer";
|
|
23
23
|
import { useMcpServerOAuthConnect } from "./useMcpServerOAuthConnect";
|
|
24
|
+
import { ScopeToggle } from "../library/ScopeToggle";
|
|
25
|
+
import type { ResourceListScope } from "../search";
|
|
24
26
|
|
|
25
27
|
// ---------------------------------------------------------------------------
|
|
26
28
|
// Setup integration props
|
|
@@ -263,8 +265,9 @@ export function McpServerPicker({
|
|
|
263
265
|
const instanceId = useId();
|
|
264
266
|
const listId = `${instanceId}-list`;
|
|
265
267
|
|
|
268
|
+
const [activeScope, setActiveScope] = useState<ResourceListScope>(scope ?? "org");
|
|
266
269
|
const { results, isLoading, error, query, setQuery } =
|
|
267
|
-
useMcpServerSearch(org, { scope });
|
|
270
|
+
useMcpServerSearch(org, { scope: activeScope });
|
|
268
271
|
const oauth = useMcpServerOAuthConnect();
|
|
269
272
|
|
|
270
273
|
const [focusIndex, setFocusIndex] = useState(-1);
|
|
@@ -580,6 +583,8 @@ export function McpServerPicker({
|
|
|
580
583
|
autoFocus
|
|
581
584
|
/>
|
|
582
585
|
|
|
586
|
+
<ScopeToggle value={activeScope} onChange={setActiveScope} disabled={disabled} />
|
|
587
|
+
|
|
583
588
|
{error && <p className="text-xs text-destructive">{error.message}</p>}
|
|
584
589
|
|
|
585
590
|
{/* Scrollable results list */}
|
|
@@ -8,6 +8,8 @@ export interface ModelRegistryState {
|
|
|
8
8
|
readonly models: readonly ModelInfo[];
|
|
9
9
|
readonly isLoading: boolean;
|
|
10
10
|
readonly error: Error | null;
|
|
11
|
+
/** Retry fetching the model registry. No-op while a fetch is in flight. */
|
|
12
|
+
readonly refetch: () => void;
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
/**
|
|
@@ -21,6 +23,7 @@ export const ModelRegistryContext = createContext<ModelRegistryState>({
|
|
|
21
23
|
models: [],
|
|
22
24
|
isLoading: true,
|
|
23
25
|
error: null,
|
|
26
|
+
refetch: () => {},
|
|
24
27
|
});
|
|
25
28
|
|
|
26
29
|
/**
|
|
@@ -119,7 +119,7 @@ export function ModelSelector({
|
|
|
119
119
|
}
|
|
120
120
|
}, [initialHarness, isHarnessLocked]);
|
|
121
121
|
|
|
122
|
-
const { models, featured, defaultModel, getModel, byProvider } = useModelRegistry(
|
|
122
|
+
const { models, featured, defaultModel, getModel, byProvider, isLoading, error, refetch } = useModelRegistry(
|
|
123
123
|
{ harness: activeHarness },
|
|
124
124
|
);
|
|
125
125
|
|
|
@@ -393,7 +393,30 @@ export function ModelSelector({
|
|
|
393
393
|
aria-label="Available models"
|
|
394
394
|
className="max-h-72 overflow-y-auto p-1"
|
|
395
395
|
>
|
|
396
|
-
{visibleModels.length === 0 && (
|
|
396
|
+
{visibleModels.length === 0 && isLoading && (
|
|
397
|
+
<div className="flex items-center justify-center gap-2 px-2 py-3">
|
|
398
|
+
<div className="size-3 animate-spin rounded-full border border-muted border-t-primary" />
|
|
399
|
+
<span className="text-xs text-muted-foreground">Loading models…</span>
|
|
400
|
+
</div>
|
|
401
|
+
)}
|
|
402
|
+
|
|
403
|
+
{visibleModels.length === 0 && !isLoading && error != null && (
|
|
404
|
+
<div className="flex flex-col items-center gap-1.5 px-2 py-3">
|
|
405
|
+
<span className="text-xs text-muted-foreground">Failed to load models</span>
|
|
406
|
+
<button
|
|
407
|
+
type="button"
|
|
408
|
+
className={cn(
|
|
409
|
+
"rounded-md border border-border bg-background px-2.5 py-1 text-xs text-foreground",
|
|
410
|
+
"hover:bg-accent-hover transition-colors cursor-pointer",
|
|
411
|
+
)}
|
|
412
|
+
onClick={refetch}
|
|
413
|
+
>
|
|
414
|
+
Retry
|
|
415
|
+
</button>
|
|
416
|
+
</div>
|
|
417
|
+
)}
|
|
418
|
+
|
|
419
|
+
{visibleModels.length === 0 && !isLoading && error == null && (
|
|
397
420
|
<div className="px-2 py-3 text-center text-xs text-muted-foreground">
|
|
398
421
|
No models found
|
|
399
422
|
</div>
|
|
@@ -90,8 +90,10 @@ const TEST_REGISTRY_JSON = {
|
|
|
90
90
|
|
|
91
91
|
const TEST_MODELS: readonly ModelInfo[] = parseRegistryJson(TEST_REGISTRY_JSON);
|
|
92
92
|
|
|
93
|
+
const noopRefetch = () => {};
|
|
94
|
+
|
|
93
95
|
function createWrapper(models: readonly ModelInfo[] = TEST_MODELS) {
|
|
94
|
-
const state: ModelRegistryState = { models, isLoading: false, error: null };
|
|
96
|
+
const state: ModelRegistryState = { models, isLoading: false, error: null, refetch: noopRefetch };
|
|
95
97
|
return function Wrapper({ children }: { children: ReactNode }) {
|
|
96
98
|
return (
|
|
97
99
|
<ModelRegistryContext.Provider value={state}>
|
|
@@ -285,7 +287,7 @@ describe("useModelRegistry", () => {
|
|
|
285
287
|
|
|
286
288
|
describe("loading state", () => {
|
|
287
289
|
it("exposes isLoading from context", () => {
|
|
288
|
-
const loadingState: ModelRegistryState = { models: [], isLoading: true, error: null };
|
|
290
|
+
const loadingState: ModelRegistryState = { models: [], isLoading: true, error: null, refetch: noopRefetch };
|
|
289
291
|
const wrapper = ({ children }: { children: ReactNode }) => (
|
|
290
292
|
<ModelRegistryContext.Provider value={loadingState}>
|
|
291
293
|
{children}
|
|
@@ -298,7 +300,7 @@ describe("useModelRegistry", () => {
|
|
|
298
300
|
|
|
299
301
|
it("exposes error from context", () => {
|
|
300
302
|
const err = new Error("fetch failed");
|
|
301
|
-
const errorState: ModelRegistryState = { models: [], isLoading: false, error: err };
|
|
303
|
+
const errorState: ModelRegistryState = { models: [], isLoading: false, error: err, refetch: noopRefetch };
|
|
302
304
|
const wrapper = ({ children }: { children: ReactNode }) => (
|
|
303
305
|
<ModelRegistryContext.Provider value={errorState}>
|
|
304
306
|
{children}
|
|
@@ -55,6 +55,8 @@ export interface UseModelRegistryReturn {
|
|
|
55
55
|
readonly isLoading: boolean;
|
|
56
56
|
/** Non-null if the API fetch failed. Models will be empty in this case. */
|
|
57
57
|
readonly error: Error | null;
|
|
58
|
+
/** Retry fetching the model registry. No-op while a fetch is in flight. */
|
|
59
|
+
readonly refetch: () => void;
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
/**
|
|
@@ -85,7 +87,7 @@ export interface UseModelRegistryReturn {
|
|
|
85
87
|
*/
|
|
86
88
|
export function useModelRegistry(options?: UseModelRegistryOptions): UseModelRegistryReturn {
|
|
87
89
|
const harness = options?.harness;
|
|
88
|
-
const { models: allModels, isLoading, error } = useModelRegistryContext();
|
|
90
|
+
const { models: allModels, isLoading, error, refetch } = useModelRegistryContext();
|
|
89
91
|
|
|
90
92
|
return useMemo(() => {
|
|
91
93
|
const isUnified = harness === undefined;
|
|
@@ -143,6 +145,7 @@ export function useModelRegistry(options?: UseModelRegistryOptions): UseModelReg
|
|
|
143
145
|
getByKey: (key: string) => byCompoundKey.get(key),
|
|
144
146
|
isLoading,
|
|
145
147
|
error,
|
|
148
|
+
refetch,
|
|
146
149
|
};
|
|
147
|
-
}, [harness, allModels, isLoading, error]);
|
|
150
|
+
}, [harness, allModels, isLoading, error, refetch]);
|
|
148
151
|
}
|
package/src/provider.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useEffect, useRef, useState, type ReactNode } from "react";
|
|
3
|
+
import { useCallback, useEffect, useRef, useState, type ReactNode } from "react";
|
|
4
4
|
import type { Stigmer, DeploymentMode } from "@stigmer/sdk";
|
|
5
5
|
import { cn, resolvePresetClass } from "@stigmer/theme";
|
|
6
6
|
import type { ThemePresetId } from "@stigmer/theme";
|
|
@@ -12,6 +12,9 @@ import { PortalContainerContext } from "./portal-container";
|
|
|
12
12
|
import { ModelRegistryContext } from "./models/ModelRegistryContext";
|
|
13
13
|
import type { ModelRegistryState } from "./models/ModelRegistryContext";
|
|
14
14
|
import { fetchModelRegistry } from "./models/registry";
|
|
15
|
+
import { TaskKindRegistryContext } from "./workflow/TaskKindRegistryContext";
|
|
16
|
+
import type { TaskKindRegistryState } from "./workflow/TaskKindRegistryContext";
|
|
17
|
+
import type { TaskKindDescriptor } from "./workflow/types";
|
|
15
18
|
|
|
16
19
|
/** Props for {@link StigmerProvider}. */
|
|
17
20
|
export interface StigmerProviderProps {
|
|
@@ -130,20 +133,23 @@ export function StigmerProvider({
|
|
|
130
133
|
|
|
131
134
|
const portalContainer = usePortalContainer(resolvedMode, presetClass);
|
|
132
135
|
const registryState = useModelRegistryFetch(client);
|
|
136
|
+
const taskKindRegistryState = useTaskKindRegistryFetch(client);
|
|
133
137
|
|
|
134
138
|
return (
|
|
135
139
|
<StigmerContext.Provider value={client}>
|
|
136
140
|
<DeploymentModeContext.Provider value={deploymentMode}>
|
|
137
141
|
<ColorModeContext.Provider value={resolvedMode}>
|
|
138
142
|
<ModelRegistryContext.Provider value={registryState}>
|
|
139
|
-
<
|
|
140
|
-
<
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
143
|
+
<TaskKindRegistryContext.Provider value={taskKindRegistryState}>
|
|
144
|
+
<PortalContainerContext.Provider value={portalContainer}>
|
|
145
|
+
<div
|
|
146
|
+
className={cn("stgm", presetClass, className)}
|
|
147
|
+
data-stgm-color-mode={resolvedMode}
|
|
148
|
+
>
|
|
149
|
+
{children}
|
|
150
|
+
</div>
|
|
151
|
+
</PortalContainerContext.Provider>
|
|
152
|
+
</TaskKindRegistryContext.Provider>
|
|
147
153
|
</ModelRegistryContext.Provider>
|
|
148
154
|
</ColorModeContext.Provider>
|
|
149
155
|
</DeploymentModeContext.Provider>
|
|
@@ -151,15 +157,23 @@ export function StigmerProvider({
|
|
|
151
157
|
);
|
|
152
158
|
}
|
|
153
159
|
|
|
160
|
+
const RETRY_DELAYS_MS = [1_000, 2_000, 4_000];
|
|
161
|
+
const TOKEN_POLL_INTERVAL_MS = 500;
|
|
162
|
+
const TOKEN_POLL_MAX_MS = 10_000;
|
|
163
|
+
|
|
154
164
|
/**
|
|
155
|
-
* Fetches the model registry from the authenticated API
|
|
156
|
-
*
|
|
165
|
+
* Fetches the model registry from the authenticated API and caches
|
|
166
|
+
* the result for the lifetime of the provider.
|
|
157
167
|
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
168
|
+
* Handles the auth race condition where `StigmerProvider` mounts before
|
|
169
|
+
* PKCE authentication is established (e.g. desktop release builds with
|
|
170
|
+
* a fresh localStorage). When the initial token is `null`, polls for
|
|
171
|
+
* a valid token before giving up. Retries on transient failures with
|
|
172
|
+
* exponential backoff. Exposes `refetch` for manual retry from the UI.
|
|
160
173
|
*/
|
|
161
174
|
function useModelRegistryFetch(client: Stigmer): ModelRegistryState {
|
|
162
|
-
const [
|
|
175
|
+
const [version, setVersion] = useState(0);
|
|
176
|
+
const [state, setState] = useState<Omit<ModelRegistryState, "refetch">>({
|
|
163
177
|
models: [],
|
|
164
178
|
isLoading: true,
|
|
165
179
|
error: null,
|
|
@@ -168,31 +182,255 @@ function useModelRegistryFetch(client: Stigmer): ModelRegistryState {
|
|
|
168
182
|
const clientRef = useRef(client);
|
|
169
183
|
clientRef.current = client;
|
|
170
184
|
|
|
171
|
-
|
|
172
|
-
let cancelled = false;
|
|
185
|
+
const fetchAttemptRef = useRef(0);
|
|
173
186
|
|
|
187
|
+
const doFetch = useCallback(async (signal: AbortSignal) => {
|
|
174
188
|
const c = clientRef.current;
|
|
175
|
-
c.getAuthCredential()
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
189
|
+
let token = await c.getAuthCredential();
|
|
190
|
+
|
|
191
|
+
if (!token) {
|
|
192
|
+
const start = Date.now();
|
|
193
|
+
while (!token && Date.now() - start < TOKEN_POLL_MAX_MS) {
|
|
194
|
+
if (signal.aborted) return;
|
|
195
|
+
await new Promise((r) => setTimeout(r, TOKEN_POLL_INTERVAL_MS));
|
|
196
|
+
if (signal.aborted) return;
|
|
197
|
+
token = await c.getAuthCredential();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return fetchModelRegistry(c.baseUrl, token, c.fetch);
|
|
202
|
+
}, []);
|
|
203
|
+
|
|
204
|
+
useEffect(() => {
|
|
205
|
+
const controller = new AbortController();
|
|
206
|
+
const { signal } = controller;
|
|
207
|
+
|
|
208
|
+
fetchAttemptRef.current = 0;
|
|
209
|
+
|
|
210
|
+
const attempt = async () => {
|
|
211
|
+
if (signal.aborted) return;
|
|
212
|
+
|
|
213
|
+
setState((prev) => (prev.isLoading ? prev : { ...prev, isLoading: true }));
|
|
214
|
+
|
|
215
|
+
try {
|
|
216
|
+
const models = await doFetch(signal);
|
|
217
|
+
if (!signal.aborted && models) {
|
|
179
218
|
setState({ models, isLoading: false, error: null });
|
|
219
|
+
fetchAttemptRef.current = 0;
|
|
180
220
|
}
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
|
|
221
|
+
} catch (err: unknown) {
|
|
222
|
+
if (signal.aborted) return;
|
|
223
|
+
|
|
224
|
+
const retryIdx = fetchAttemptRef.current;
|
|
225
|
+
fetchAttemptRef.current = retryIdx + 1;
|
|
226
|
+
|
|
227
|
+
if (retryIdx < RETRY_DELAYS_MS.length) {
|
|
228
|
+
setTimeout(() => { if (!signal.aborted) attempt(); }, RETRY_DELAYS_MS[retryIdx]);
|
|
229
|
+
} else {
|
|
184
230
|
setState({
|
|
185
231
|
models: [],
|
|
186
232
|
isLoading: false,
|
|
187
233
|
error: err instanceof Error ? err : new Error(String(err)),
|
|
188
234
|
});
|
|
189
235
|
}
|
|
190
|
-
}
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
attempt();
|
|
240
|
+
|
|
241
|
+
return () => { controller.abort(); };
|
|
242
|
+
}, [doFetch, version]);
|
|
243
|
+
|
|
244
|
+
const refetch = useCallback(() => {
|
|
245
|
+
setState((prev) => {
|
|
246
|
+
if (prev.isLoading) return prev;
|
|
247
|
+
return { ...prev, isLoading: true, error: null };
|
|
248
|
+
});
|
|
249
|
+
setVersion((v) => v + 1);
|
|
250
|
+
}, []);
|
|
251
|
+
|
|
252
|
+
return { ...state, refetch };
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// ---------------------------------------------------------------------------
|
|
256
|
+
// Task Kind Registry fetch
|
|
257
|
+
// ---------------------------------------------------------------------------
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Fetch the task kind registry from the authenticated API endpoint.
|
|
261
|
+
*
|
|
262
|
+
* The endpoint returns `{ version, generatedAt, descriptors: [...] }`.
|
|
263
|
+
* Each descriptor maps directly to the `TaskKindDescriptor` interface
|
|
264
|
+
* used by the React SDK's task palette, inspector, and YAML validation.
|
|
265
|
+
*/
|
|
266
|
+
async function fetchTaskKindRegistry(
|
|
267
|
+
apiUrl: string,
|
|
268
|
+
token: string | null,
|
|
269
|
+
customFetch?: typeof globalThis.fetch,
|
|
270
|
+
): Promise<TaskKindDescriptor[]> {
|
|
271
|
+
const doFetch = customFetch ?? globalThis.fetch;
|
|
272
|
+
const headers: Record<string, string> = {};
|
|
273
|
+
if (token) {
|
|
274
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
275
|
+
}
|
|
276
|
+
const res = await doFetch(`${apiUrl}/v1/proxy/task-kind-registry`, { headers });
|
|
277
|
+
if (!res.ok) throw new Error(`Task kind registry fetch failed: ${res.status}`);
|
|
278
|
+
const data: unknown = await res.json();
|
|
279
|
+
return parseTaskKindRegistryJson(data);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const VALID_CATEGORIES = new Set([
|
|
283
|
+
"control_flow", "invocation", "ai", "data", "governance", "event", "unspecified",
|
|
284
|
+
]);
|
|
285
|
+
|
|
286
|
+
const VALID_FIELD_TYPES = new Set([
|
|
287
|
+
"string", "int32", "float", "bool", "enum", "struct", "repeated", "map", "message",
|
|
288
|
+
]);
|
|
289
|
+
|
|
290
|
+
function parseTaskKindRegistryJson(data: unknown): TaskKindDescriptor[] {
|
|
291
|
+
if (!data || typeof data !== "object") return [];
|
|
292
|
+
const descriptors = (data as Record<string, unknown>).descriptors;
|
|
293
|
+
if (!Array.isArray(descriptors)) return [];
|
|
294
|
+
|
|
295
|
+
return descriptors
|
|
296
|
+
.filter((d): d is Record<string, unknown> =>
|
|
297
|
+
d != null && typeof d === "object" && typeof (d as Record<string, unknown>).kind === "string",
|
|
298
|
+
)
|
|
299
|
+
.map((d) => ({
|
|
300
|
+
kind: d.kind as string,
|
|
301
|
+
displayName: (d.displayName as string) ?? "",
|
|
302
|
+
description: (d.description as string) ?? "",
|
|
303
|
+
category: VALID_CATEGORIES.has(d.category as string)
|
|
304
|
+
? (d.category as TaskKindDescriptor["category"])
|
|
305
|
+
: "unspecified",
|
|
306
|
+
icon: (d.icon as string) ?? "",
|
|
307
|
+
configProtoType: (d.configProtoType as string) ?? "",
|
|
308
|
+
fields: Array.isArray(d.fields)
|
|
309
|
+
? (d.fields as Record<string, unknown>[]).map((f) => ({
|
|
310
|
+
name: (f.name as string) ?? "",
|
|
311
|
+
displayName: (f.displayName as string) ?? "",
|
|
312
|
+
description: (f.description as string) ?? "",
|
|
313
|
+
type: VALID_FIELD_TYPES.has(f.type as string)
|
|
314
|
+
? (f.type as TaskKindDescriptor["fields"][number]["type"])
|
|
315
|
+
: ("string" as const),
|
|
316
|
+
required: f.required === true,
|
|
317
|
+
isExpression: f.isExpression === true ? true : undefined,
|
|
318
|
+
defaultValue: typeof f.defaultValue === "string" ? f.defaultValue : undefined,
|
|
319
|
+
enumValues: Array.isArray(f.enumValues) ? (f.enumValues as string[]) : undefined,
|
|
320
|
+
groupId: typeof f.groupId === "string" ? f.groupId : undefined,
|
|
321
|
+
fieldNumber: typeof f.fieldNumber === "number" ? f.fieldNumber : 0,
|
|
322
|
+
elementType: typeof f.elementType === "string" ? f.elementType : undefined,
|
|
323
|
+
validationHints: Array.isArray(f.validationHints) ? (f.validationHints as string[]) : undefined,
|
|
324
|
+
}))
|
|
325
|
+
: [],
|
|
326
|
+
fieldGroups: Array.isArray(d.fieldGroups)
|
|
327
|
+
? (d.fieldGroups as Record<string, unknown>[]).map((g) => ({
|
|
328
|
+
id: (g.id as string) ?? "",
|
|
329
|
+
displayName: (g.displayName as string) ?? "",
|
|
330
|
+
description: typeof g.description === "string" ? g.description : undefined,
|
|
331
|
+
}))
|
|
332
|
+
: [],
|
|
333
|
+
configJsonSchema:
|
|
334
|
+
d.configJsonSchema != null && typeof d.configJsonSchema === "object"
|
|
335
|
+
? (d.configJsonSchema as Record<string, unknown>)
|
|
336
|
+
: {},
|
|
337
|
+
outputJsonSchema:
|
|
338
|
+
d.outputJsonSchema != null && typeof d.outputJsonSchema === "object"
|
|
339
|
+
? (d.outputJsonSchema as Record<string, unknown>)
|
|
340
|
+
: undefined,
|
|
341
|
+
yamlExamples: Array.isArray(d.yamlExamples) ? (d.yamlExamples as string[]) : undefined,
|
|
342
|
+
documentationUrl: (d.documentationUrl as string) ?? "",
|
|
343
|
+
isAiNative: d.isAiNative === true,
|
|
344
|
+
requiresExternalService: d.requiresExternalService === true,
|
|
345
|
+
}));
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Fetches the task kind registry from the authenticated API and caches
|
|
350
|
+
* the result for the lifetime of the provider.
|
|
351
|
+
*
|
|
352
|
+
* Follows the same pattern as {@link useModelRegistryFetch}: auth token
|
|
353
|
+
* polling, exponential backoff retries, and `refetch` for manual retry.
|
|
354
|
+
*/
|
|
355
|
+
function useTaskKindRegistryFetch(client: Stigmer): TaskKindRegistryState {
|
|
356
|
+
const [version, setVersion] = useState(0);
|
|
357
|
+
const [state, setState] = useState<Omit<TaskKindRegistryState, "refetch">>({
|
|
358
|
+
descriptors: [],
|
|
359
|
+
isLoading: true,
|
|
360
|
+
error: null,
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
const clientRef = useRef(client);
|
|
364
|
+
clientRef.current = client;
|
|
365
|
+
|
|
366
|
+
const fetchAttemptRef = useRef(0);
|
|
367
|
+
|
|
368
|
+
const doFetch = useCallback(async (signal: AbortSignal) => {
|
|
369
|
+
const c = clientRef.current;
|
|
370
|
+
let token = await c.getAuthCredential();
|
|
371
|
+
|
|
372
|
+
if (!token) {
|
|
373
|
+
const start = Date.now();
|
|
374
|
+
while (!token && Date.now() - start < TOKEN_POLL_MAX_MS) {
|
|
375
|
+
if (signal.aborted) return;
|
|
376
|
+
await new Promise((r) => setTimeout(r, TOKEN_POLL_INTERVAL_MS));
|
|
377
|
+
if (signal.aborted) return;
|
|
378
|
+
token = await c.getAuthCredential();
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
return fetchTaskKindRegistry(c.baseUrl, token, c.fetch);
|
|
383
|
+
}, []);
|
|
384
|
+
|
|
385
|
+
useEffect(() => {
|
|
386
|
+
const controller = new AbortController();
|
|
387
|
+
const { signal } = controller;
|
|
388
|
+
|
|
389
|
+
fetchAttemptRef.current = 0;
|
|
390
|
+
|
|
391
|
+
const attempt = async () => {
|
|
392
|
+
if (signal.aborted) return;
|
|
393
|
+
|
|
394
|
+
setState((prev) => (prev.isLoading ? prev : { ...prev, isLoading: true }));
|
|
395
|
+
|
|
396
|
+
try {
|
|
397
|
+
const descriptors = await doFetch(signal);
|
|
398
|
+
if (!signal.aborted && descriptors) {
|
|
399
|
+
setState({ descriptors, isLoading: false, error: null });
|
|
400
|
+
fetchAttemptRef.current = 0;
|
|
401
|
+
}
|
|
402
|
+
} catch (err: unknown) {
|
|
403
|
+
if (signal.aborted) return;
|
|
404
|
+
|
|
405
|
+
const retryIdx = fetchAttemptRef.current;
|
|
406
|
+
fetchAttemptRef.current = retryIdx + 1;
|
|
407
|
+
|
|
408
|
+
if (retryIdx < RETRY_DELAYS_MS.length) {
|
|
409
|
+
setTimeout(() => { if (!signal.aborted) attempt(); }, RETRY_DELAYS_MS[retryIdx]);
|
|
410
|
+
} else {
|
|
411
|
+
setState({
|
|
412
|
+
descriptors: [],
|
|
413
|
+
isLoading: false,
|
|
414
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
attempt();
|
|
421
|
+
|
|
422
|
+
return () => { controller.abort(); };
|
|
423
|
+
}, [doFetch, version]);
|
|
191
424
|
|
|
192
|
-
|
|
425
|
+
const refetch = useCallback(() => {
|
|
426
|
+
setState((prev) => {
|
|
427
|
+
if (prev.isLoading) return prev;
|
|
428
|
+
return { ...prev, isLoading: true, error: null };
|
|
429
|
+
});
|
|
430
|
+
setVersion((v) => v + 1);
|
|
193
431
|
}, []);
|
|
194
432
|
|
|
195
|
-
return state;
|
|
433
|
+
return { ...state, refetch };
|
|
196
434
|
}
|
|
197
435
|
|
|
198
436
|
/**
|
|
@@ -42,6 +42,8 @@ import type { ResourceDetailShellProps } from "./types";
|
|
|
42
42
|
export function ResourceDetailShell({
|
|
43
43
|
header,
|
|
44
44
|
visibilityControl,
|
|
45
|
+
headerMetaExtra,
|
|
46
|
+
headerBanner,
|
|
45
47
|
primaryAction,
|
|
46
48
|
actions,
|
|
47
49
|
tabs,
|
|
@@ -55,11 +57,14 @@ export function ResourceDetailShell({
|
|
|
55
57
|
|
|
56
58
|
return (
|
|
57
59
|
<div className={cn("flex flex-col gap-6", className)}>
|
|
60
|
+
{headerBanner}
|
|
61
|
+
|
|
58
62
|
{/* Header + Action bar row */}
|
|
59
63
|
<div className="flex items-start justify-between gap-4">
|
|
60
64
|
<Header
|
|
61
65
|
header={header}
|
|
62
66
|
visibilityControl={visibilityControl}
|
|
67
|
+
metaExtra={headerMetaExtra}
|
|
63
68
|
/>
|
|
64
69
|
<ResourceActionBar
|
|
65
70
|
primaryAction={primaryAction}
|
|
@@ -92,14 +97,18 @@ export function ResourceDetailShell({
|
|
|
92
97
|
function Header({
|
|
93
98
|
header,
|
|
94
99
|
visibilityControl,
|
|
100
|
+
metaExtra,
|
|
95
101
|
}: {
|
|
96
102
|
readonly header: ResourceDetailShellProps["header"];
|
|
97
103
|
readonly visibilityControl?: ResourceDetailShellProps["visibilityControl"];
|
|
104
|
+
readonly metaExtra?: ResourceDetailShellProps["headerMetaExtra"];
|
|
98
105
|
}) {
|
|
99
106
|
const {
|
|
100
107
|
name,
|
|
108
|
+
nameElement,
|
|
101
109
|
org,
|
|
102
110
|
slug,
|
|
111
|
+
qualifiedSlug,
|
|
103
112
|
description,
|
|
104
113
|
iconUrl,
|
|
105
114
|
icon,
|
|
@@ -109,7 +118,7 @@ function Header({
|
|
|
109
118
|
statusLabel,
|
|
110
119
|
} = header;
|
|
111
120
|
|
|
112
|
-
const showSlug = slug && slug !== name;
|
|
121
|
+
const showSlug = slug && slug !== name && !qualifiedSlug;
|
|
113
122
|
|
|
114
123
|
return (
|
|
115
124
|
<div className="flex min-w-0 items-start gap-3">
|
|
@@ -124,9 +133,11 @@ function Header({
|
|
|
124
133
|
) : null}
|
|
125
134
|
<div className="min-w-0 flex-1">
|
|
126
135
|
<div className="flex items-center gap-2">
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
136
|
+
{nameElement ?? (
|
|
137
|
+
<h2 className="truncate text-lg font-semibold text-foreground">
|
|
138
|
+
{name}
|
|
139
|
+
</h2>
|
|
140
|
+
)}
|
|
130
141
|
{showSlug && (
|
|
131
142
|
<code className="shrink-0 rounded bg-muted px-1.5 py-0.5 text-xs font-medium text-muted-foreground">
|
|
132
143
|
{slug}
|
|
@@ -140,8 +151,14 @@ function Header({
|
|
|
140
151
|
)}
|
|
141
152
|
{visibilityControl}
|
|
142
153
|
</div>
|
|
154
|
+
{qualifiedSlug && (
|
|
155
|
+
<span className="mt-0.5 block truncate font-mono text-xs text-muted-foreground">
|
|
156
|
+
{qualifiedSlug}
|
|
157
|
+
</span>
|
|
158
|
+
)}
|
|
143
159
|
<div className="mt-0.5 flex flex-wrap items-center gap-x-1.5 text-xs text-muted-foreground">
|
|
144
160
|
{org && <span>{org}</span>}
|
|
161
|
+
{metaExtra}
|
|
145
162
|
{createdAt && (
|
|
146
163
|
<>
|
|
147
164
|
<Dot />
|
|
@@ -84,12 +84,23 @@ export interface DetailAction {
|
|
|
84
84
|
export interface ResourceHeaderMeta {
|
|
85
85
|
/** Display name of the resource. */
|
|
86
86
|
readonly name: string;
|
|
87
|
+
/**
|
|
88
|
+
* Custom element for the name area. When provided, replaces the
|
|
89
|
+
* default `<h2>` rendering — useful for inline-editable names.
|
|
90
|
+
*/
|
|
91
|
+
readonly nameElement?: ReactNode;
|
|
87
92
|
/** Resource ID (opaque string). */
|
|
88
93
|
readonly id: string;
|
|
89
94
|
/** Organization slug that owns the resource. */
|
|
90
95
|
readonly org?: string;
|
|
91
96
|
/** URL-friendly slug. */
|
|
92
97
|
readonly slug?: string;
|
|
98
|
+
/**
|
|
99
|
+
* Qualified path shown as a monospace line below the title
|
|
100
|
+
* (e.g., `"acme/my-server"`). When provided, renders beneath the
|
|
101
|
+
* title row — unlike `slug` which appears as a chip beside the name.
|
|
102
|
+
*/
|
|
103
|
+
readonly qualifiedSlug?: string;
|
|
93
104
|
/** Resource description. */
|
|
94
105
|
readonly description?: string;
|
|
95
106
|
/** Optional icon URL (e.g. agent icon). */
|
|
@@ -145,6 +156,20 @@ export interface ResourceDetailShellProps {
|
|
|
145
156
|
*/
|
|
146
157
|
readonly visibilityControl?: ReactNode;
|
|
147
158
|
|
|
159
|
+
/**
|
|
160
|
+
* Additional content rendered in the header's metadata line
|
|
161
|
+
* (between org and timestamps). Use for resource-specific
|
|
162
|
+
* indicators like validation state or discovery timestamps.
|
|
163
|
+
*/
|
|
164
|
+
readonly headerMetaExtra?: ReactNode;
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Banner content rendered above the header row.
|
|
168
|
+
* Use for validation warnings or other full-width alerts
|
|
169
|
+
* that should appear before the resource title.
|
|
170
|
+
*/
|
|
171
|
+
readonly headerBanner?: ReactNode;
|
|
172
|
+
|
|
148
173
|
/**
|
|
149
174
|
* Primary action rendered as a visible button in the header area.
|
|
150
175
|
* Use for the most common action (e.g. "Edit" for agents).
|
|
@@ -6,7 +6,7 @@ import { toError } from "../internal/toError";
|
|
|
6
6
|
import { toast } from "../feedback/toast";
|
|
7
7
|
|
|
8
8
|
/** Resource types that support deletion from detail pages. */
|
|
9
|
-
export type DeletableResourceKind = "agent" | "skill" | "mcpServer" | "runner";
|
|
9
|
+
export type DeletableResourceKind = "agent" | "skill" | "mcpServer" | "runner" | "workflow";
|
|
10
10
|
|
|
11
11
|
export interface UseDeleteResourceReturn {
|
|
12
12
|
/**
|
|
@@ -74,6 +74,9 @@ export function useDeleteResource(
|
|
|
74
74
|
case "runner":
|
|
75
75
|
await stigmer.runner.delete(resourceId);
|
|
76
76
|
break;
|
|
77
|
+
case "workflow":
|
|
78
|
+
await stigmer.workflow.delete(resourceId);
|
|
79
|
+
break;
|
|
77
80
|
}
|
|
78
81
|
toast.success(
|
|
79
82
|
resourceName
|
|
@@ -106,5 +109,7 @@ function kindLabel(kind: DeletableResourceKind): string {
|
|
|
106
109
|
return "MCP server";
|
|
107
110
|
case "runner":
|
|
108
111
|
return "runner";
|
|
112
|
+
case "workflow":
|
|
113
|
+
return "workflow";
|
|
109
114
|
}
|
|
110
115
|
}
|
|
@@ -26,6 +26,7 @@ import { BulkActionBar } from "./BulkActionBar";
|
|
|
26
26
|
import { ResourceInspector } from "./ResourceInspector";
|
|
27
27
|
import { EmptyState } from "../../empty-state";
|
|
28
28
|
import { ResourceAvatar } from "./ResourceAvatar";
|
|
29
|
+
import { ScopeToggle } from "../../library/ScopeToggle";
|
|
29
30
|
|
|
30
31
|
// ---------------------------------------------------------------------------
|
|
31
32
|
// Props
|
|
@@ -306,6 +307,9 @@ export function ResourceWorkbench<TData = SearchResult>({
|
|
|
306
307
|
)}
|
|
307
308
|
/>
|
|
308
309
|
</div>
|
|
310
|
+
{onScopeChange && (
|
|
311
|
+
<ScopeToggle value={controlledScope} onChange={onScopeChange} />
|
|
312
|
+
)}
|
|
309
313
|
{viewModes.length > 1 && (
|
|
310
314
|
<ViewSwitcher
|
|
311
315
|
value={viewMode}
|