@stigmer/react 0.5.1 → 1.0.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/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/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 +53 -64
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +20 -8
- 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/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 +9 -4
- package/index.d.ts.map +1 -1
- package/index.js +12 -2
- package/index.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/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 +25 -13
- 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/package.json +16 -5
- package/provider.d.ts.map +1 -1
- package/provider.js +164 -1
- 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/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 +1 -0
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +1 -0
- package/session/useSessionPageFlow.js.map +1 -1
- 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/InteractionModePicker.tsx +189 -0
- package/src/composer/SessionComposer.tsx +85 -8
- 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/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 +222 -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/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 +80 -148
- package/src/mcp-server/McpServerPicker.tsx +6 -1
- package/src/provider.tsx +195 -8
- 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/useNewSessionFlow.ts +1 -0
- package/src/session/useSessionConversation.ts +8 -0
- package/src/session/useSessionPageFlow.ts +1 -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
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useId } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import type { EnvVarDeclaration } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/spec_pb";
|
|
6
|
+
import type { WorkflowInstance } from "@stigmer/protos/ai/stigmer/agentic/workflowinstance/v1/api_pb";
|
|
7
|
+
import type { RunWorkflowFieldErrors } from "./useRunWorkflowFlow";
|
|
8
|
+
|
|
9
|
+
/** Props for {@link WorkflowRunForm}. */
|
|
10
|
+
export interface WorkflowRunFormProps {
|
|
11
|
+
/** Current trigger message value. */
|
|
12
|
+
readonly triggerMessage: string;
|
|
13
|
+
/** Called when the trigger message changes. */
|
|
14
|
+
readonly onTriggerMessageChange: (value: string) => void;
|
|
15
|
+
|
|
16
|
+
/** Declared environment variables from the workflow spec. */
|
|
17
|
+
readonly envDeclarations: Record<string, EnvVarDeclaration>;
|
|
18
|
+
/** Current runtime env var overrides (keyed by variable name). */
|
|
19
|
+
readonly runtimeEnv: Record<string, string>;
|
|
20
|
+
/** Called when a single env var value changes. */
|
|
21
|
+
readonly onEnvVarChange: (key: string, value: string) => void;
|
|
22
|
+
|
|
23
|
+
/** Available workflow instances for the selector. */
|
|
24
|
+
readonly instances: readonly WorkflowInstance[];
|
|
25
|
+
/** Currently selected instance ID, or `null` for server-resolved default. */
|
|
26
|
+
readonly selectedInstanceId: string | null;
|
|
27
|
+
/** Called when the selected instance changes. */
|
|
28
|
+
readonly onInstanceChange: (id: string | null) => void;
|
|
29
|
+
|
|
30
|
+
/** Field-level validation errors keyed by field name. */
|
|
31
|
+
readonly errors: RunWorkflowFieldErrors;
|
|
32
|
+
|
|
33
|
+
/** When `true`, all fields are disabled (during submission). */
|
|
34
|
+
readonly disabled?: boolean;
|
|
35
|
+
/** Additional CSS classes for the root container. */
|
|
36
|
+
readonly className?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const INPUT_CLASSES = cn(
|
|
40
|
+
"w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-sm text-foreground",
|
|
41
|
+
"placeholder:text-muted-foreground",
|
|
42
|
+
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
43
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Form fields for running a workflow execution.
|
|
48
|
+
*
|
|
49
|
+
* Renders a trigger message textarea, auto-generated environment
|
|
50
|
+
* variable fields from the workflow's `spec.env` declarations, and
|
|
51
|
+
* an instance selector (hidden when 0-1 instances exist).
|
|
52
|
+
*
|
|
53
|
+
* This component is presentational — it does not manage state or
|
|
54
|
+
* submit. Pair with {@link useRunWorkflowFlow} for the full
|
|
55
|
+
* behavior, or wire the props manually for custom integrations.
|
|
56
|
+
*
|
|
57
|
+
* All visuals flow through `--stgm-*` design tokens. Zero Console
|
|
58
|
+
* dependencies — safe for platform builder embedding.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```tsx
|
|
62
|
+
* const flow = useRunWorkflowFlow({ ... });
|
|
63
|
+
*
|
|
64
|
+
* <WorkflowRunForm
|
|
65
|
+
* triggerMessage={flow.triggerMessage}
|
|
66
|
+
* onTriggerMessageChange={flow.setTriggerMessage}
|
|
67
|
+
* envDeclarations={flow.envDeclarations}
|
|
68
|
+
* runtimeEnv={flow.runtimeEnv}
|
|
69
|
+
* onEnvVarChange={flow.setEnvVar}
|
|
70
|
+
* instances={instances}
|
|
71
|
+
* selectedInstanceId={flow.selectedInstanceId}
|
|
72
|
+
* onInstanceChange={flow.setSelectedInstanceId}
|
|
73
|
+
* errors={flow.fieldErrors}
|
|
74
|
+
* disabled={flow.isSubmitting}
|
|
75
|
+
* />
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export function WorkflowRunForm({
|
|
79
|
+
triggerMessage,
|
|
80
|
+
onTriggerMessageChange,
|
|
81
|
+
envDeclarations,
|
|
82
|
+
runtimeEnv,
|
|
83
|
+
onEnvVarChange,
|
|
84
|
+
instances,
|
|
85
|
+
selectedInstanceId,
|
|
86
|
+
onInstanceChange,
|
|
87
|
+
errors,
|
|
88
|
+
disabled,
|
|
89
|
+
className,
|
|
90
|
+
}: WorkflowRunFormProps) {
|
|
91
|
+
const formId = useId();
|
|
92
|
+
const envEntries = Object.entries(envDeclarations);
|
|
93
|
+
const showInstanceSelector = instances.length > 1;
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
<div className={cn("flex flex-col gap-4", className)}>
|
|
97
|
+
{/* Trigger message */}
|
|
98
|
+
<FieldGroup>
|
|
99
|
+
<FieldLabel htmlFor={`${formId}-trigger`}>Input Message</FieldLabel>
|
|
100
|
+
<textarea
|
|
101
|
+
id={`${formId}-trigger`}
|
|
102
|
+
value={triggerMessage}
|
|
103
|
+
onChange={(e) => onTriggerMessageChange(e.target.value)}
|
|
104
|
+
placeholder="Optional message or JSON payload to trigger the workflow"
|
|
105
|
+
disabled={disabled}
|
|
106
|
+
rows={3}
|
|
107
|
+
className={cn(INPUT_CLASSES, "resize-y")}
|
|
108
|
+
/>
|
|
109
|
+
<FieldHint>
|
|
110
|
+
Accessible in the workflow as{" "}
|
|
111
|
+
<code className="text-[0.7rem]">
|
|
112
|
+
{"{{workflow.input.trigger_message}}"}
|
|
113
|
+
</code>
|
|
114
|
+
</FieldHint>
|
|
115
|
+
</FieldGroup>
|
|
116
|
+
|
|
117
|
+
{/* Instance selector (only when multiple instances exist) */}
|
|
118
|
+
{showInstanceSelector && (
|
|
119
|
+
<FieldGroup>
|
|
120
|
+
<FieldLabel htmlFor={`${formId}-instance`}>Instance</FieldLabel>
|
|
121
|
+
<select
|
|
122
|
+
id={`${formId}-instance`}
|
|
123
|
+
value={selectedInstanceId ?? ""}
|
|
124
|
+
onChange={(e) =>
|
|
125
|
+
onInstanceChange(e.target.value || null)
|
|
126
|
+
}
|
|
127
|
+
disabled={disabled}
|
|
128
|
+
className={INPUT_CLASSES}
|
|
129
|
+
>
|
|
130
|
+
<option value="">Default instance (auto)</option>
|
|
131
|
+
{instances.map((inst) => (
|
|
132
|
+
<option key={inst.metadata?.id} value={inst.metadata?.id ?? ""}>
|
|
133
|
+
{inst.metadata?.name || inst.metadata?.slug || inst.metadata?.id}
|
|
134
|
+
</option>
|
|
135
|
+
))}
|
|
136
|
+
</select>
|
|
137
|
+
</FieldGroup>
|
|
138
|
+
)}
|
|
139
|
+
|
|
140
|
+
{/* Environment variables */}
|
|
141
|
+
{envEntries.length > 0 && (
|
|
142
|
+
<div className="flex flex-col gap-3">
|
|
143
|
+
<h4 className="text-xs font-medium text-muted-foreground">
|
|
144
|
+
Environment Variables
|
|
145
|
+
</h4>
|
|
146
|
+
{envEntries.map(([key, decl]) => {
|
|
147
|
+
const fieldId = `${formId}-env-${key}`;
|
|
148
|
+
const fieldError = errors[key];
|
|
149
|
+
return (
|
|
150
|
+
<FieldGroup key={key}>
|
|
151
|
+
<FieldLabel htmlFor={fieldId}>
|
|
152
|
+
<code className="text-xs">{key}</code>
|
|
153
|
+
{!decl.optional && (
|
|
154
|
+
<span
|
|
155
|
+
className="ml-1 text-destructive"
|
|
156
|
+
aria-label="required"
|
|
157
|
+
>
|
|
158
|
+
*
|
|
159
|
+
</span>
|
|
160
|
+
)}
|
|
161
|
+
</FieldLabel>
|
|
162
|
+
<input
|
|
163
|
+
id={fieldId}
|
|
164
|
+
type={decl.isSecret ? "password" : "text"}
|
|
165
|
+
value={runtimeEnv[key] ?? ""}
|
|
166
|
+
onChange={(e) => onEnvVarChange(key, e.target.value)}
|
|
167
|
+
placeholder={
|
|
168
|
+
decl.optional ? "Optional" : "Required"
|
|
169
|
+
}
|
|
170
|
+
disabled={disabled}
|
|
171
|
+
aria-invalid={!!fieldError}
|
|
172
|
+
aria-describedby={
|
|
173
|
+
fieldError
|
|
174
|
+
? `${fieldId}-error`
|
|
175
|
+
: decl.description
|
|
176
|
+
? `${fieldId}-desc`
|
|
177
|
+
: undefined
|
|
178
|
+
}
|
|
179
|
+
className={cn(
|
|
180
|
+
INPUT_CLASSES,
|
|
181
|
+
fieldError && "border-destructive focus-visible:ring-destructive",
|
|
182
|
+
)}
|
|
183
|
+
/>
|
|
184
|
+
{decl.description && !fieldError && (
|
|
185
|
+
<FieldHint id={`${fieldId}-desc`}>
|
|
186
|
+
{decl.description}
|
|
187
|
+
</FieldHint>
|
|
188
|
+
)}
|
|
189
|
+
{fieldError && (
|
|
190
|
+
<p
|
|
191
|
+
id={`${fieldId}-error`}
|
|
192
|
+
className="text-[0.7rem] text-destructive"
|
|
193
|
+
role="alert"
|
|
194
|
+
>
|
|
195
|
+
{fieldError}
|
|
196
|
+
</p>
|
|
197
|
+
)}
|
|
198
|
+
</FieldGroup>
|
|
199
|
+
);
|
|
200
|
+
})}
|
|
201
|
+
</div>
|
|
202
|
+
)}
|
|
203
|
+
</div>
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
// Shared form primitives (internal to this file)
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
|
|
211
|
+
function FieldGroup({
|
|
212
|
+
children,
|
|
213
|
+
}: {
|
|
214
|
+
readonly children: React.ReactNode;
|
|
215
|
+
}) {
|
|
216
|
+
return <div className="flex flex-col gap-1">{children}</div>;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function FieldLabel({
|
|
220
|
+
htmlFor,
|
|
221
|
+
children,
|
|
222
|
+
}: {
|
|
223
|
+
readonly htmlFor: string;
|
|
224
|
+
readonly children: React.ReactNode;
|
|
225
|
+
}) {
|
|
226
|
+
return (
|
|
227
|
+
<label htmlFor={htmlFor} className="text-xs font-medium text-foreground">
|
|
228
|
+
{children}
|
|
229
|
+
</label>
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function FieldHint({
|
|
234
|
+
id,
|
|
235
|
+
children,
|
|
236
|
+
}: {
|
|
237
|
+
readonly id?: string;
|
|
238
|
+
readonly children: React.ReactNode;
|
|
239
|
+
}) {
|
|
240
|
+
return (
|
|
241
|
+
<p id={id} className="text-[0.7rem] text-muted-foreground">
|
|
242
|
+
{children}
|
|
243
|
+
</p>
|
|
244
|
+
);
|
|
245
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { memo, useMemo } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { WorkflowTaskKind } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/enum_pb";
|
|
6
|
+
import type { WorkflowTask } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/spec_pb";
|
|
7
|
+
import { useTaskKindRegistryContext } from "./TaskKindRegistryContext";
|
|
8
|
+
|
|
9
|
+
/** Props for {@link WorkflowTaskList}. */
|
|
10
|
+
export interface WorkflowTaskListProps {
|
|
11
|
+
/** Tasks from the workflow spec. */
|
|
12
|
+
readonly tasks: readonly WorkflowTask[];
|
|
13
|
+
/** Additional CSS class names for the root container. */
|
|
14
|
+
readonly className?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const TASK_KIND_LABELS: ReadonlyMap<WorkflowTaskKind, string> = new Map([
|
|
18
|
+
[WorkflowTaskKind.set_vars, "Set Variables"],
|
|
19
|
+
[WorkflowTaskKind.http_call, "HTTP Call"],
|
|
20
|
+
[WorkflowTaskKind.grpc_call, "gRPC Call"],
|
|
21
|
+
[WorkflowTaskKind.activity_call, "Activity Call"],
|
|
22
|
+
[WorkflowTaskKind.switch_case, "Switch"],
|
|
23
|
+
[WorkflowTaskKind.for_each, "For Each"],
|
|
24
|
+
[WorkflowTaskKind.fork, "Fork"],
|
|
25
|
+
[WorkflowTaskKind.try_catch, "Try/Catch"],
|
|
26
|
+
[WorkflowTaskKind.listen, "Listen"],
|
|
27
|
+
[WorkflowTaskKind.wait, "Wait"],
|
|
28
|
+
[WorkflowTaskKind.raise_error, "Raise Error"],
|
|
29
|
+
[WorkflowTaskKind.run_workflow, "Run Workflow"],
|
|
30
|
+
[WorkflowTaskKind.agent_call, "Agent Call"],
|
|
31
|
+
[WorkflowTaskKind.llm_call, "LLM Call"],
|
|
32
|
+
[WorkflowTaskKind.transform, "Transform"],
|
|
33
|
+
[WorkflowTaskKind.human_input, "Human Input"],
|
|
34
|
+
[WorkflowTaskKind.validate, "Validate"],
|
|
35
|
+
[WorkflowTaskKind.emit_event, "Emit Event"],
|
|
36
|
+
[WorkflowTaskKind.notification, "Notification"],
|
|
37
|
+
[WorkflowTaskKind.eval, "Evaluate (LLM Judge)"],
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Compact list of tasks in a workflow specification.
|
|
42
|
+
*
|
|
43
|
+
* Renders each task as a row with a kind icon (from the TaskKindRegistry),
|
|
44
|
+
* task name, kind label, and a sequential connector line indicating flow
|
|
45
|
+
* order. When the registry is loading, kind icons are omitted gracefully.
|
|
46
|
+
*
|
|
47
|
+
* Zero Console dependencies — safe for platform builder embedding.
|
|
48
|
+
* All visual properties flow through `--stgm-*` tokens.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```tsx
|
|
52
|
+
* <WorkflowTaskList tasks={workflow.spec?.tasks ?? []} />
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export const WorkflowTaskList = memo(function WorkflowTaskList({
|
|
56
|
+
tasks,
|
|
57
|
+
className,
|
|
58
|
+
}: WorkflowTaskListProps) {
|
|
59
|
+
const { descriptors } = useTaskKindRegistryContext();
|
|
60
|
+
|
|
61
|
+
const kindIconMap = useMemo(() => {
|
|
62
|
+
const map = new Map<string, string>();
|
|
63
|
+
for (const d of descriptors) {
|
|
64
|
+
map.set(d.kind, d.icon);
|
|
65
|
+
}
|
|
66
|
+
return map;
|
|
67
|
+
}, [descriptors]);
|
|
68
|
+
|
|
69
|
+
if (tasks.length === 0) {
|
|
70
|
+
return (
|
|
71
|
+
<div className={cn("py-8 text-center text-sm text-muted-foreground", className)}>
|
|
72
|
+
No tasks defined
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<div className={cn("flex flex-col", className)}>
|
|
79
|
+
{tasks.map((task, idx) => {
|
|
80
|
+
const kindLabel = TASK_KIND_LABELS.get(task.kind) ?? formatKindName(task.kind);
|
|
81
|
+
const iconName = kindIconMap.get(kindEnumToString(task.kind));
|
|
82
|
+
const isLast = idx === tasks.length - 1;
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div key={task.name} className="flex items-stretch gap-3">
|
|
86
|
+
{/* Vertical connector line */}
|
|
87
|
+
<div className="flex w-5 flex-col items-center">
|
|
88
|
+
<div
|
|
89
|
+
className={cn(
|
|
90
|
+
"flex size-5 shrink-0 items-center justify-center rounded-full border border-border bg-background text-[10px] font-medium text-muted-foreground",
|
|
91
|
+
)}
|
|
92
|
+
>
|
|
93
|
+
{idx + 1}
|
|
94
|
+
</div>
|
|
95
|
+
{!isLast && (
|
|
96
|
+
<div className="w-px flex-1 bg-border" />
|
|
97
|
+
)}
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
{/* Task content */}
|
|
101
|
+
<div className="flex min-w-0 flex-1 items-center gap-2 pb-3 pt-0.5">
|
|
102
|
+
{iconName && (
|
|
103
|
+
<TaskKindIcon iconName={iconName} className="size-4 shrink-0 text-muted-foreground" />
|
|
104
|
+
)}
|
|
105
|
+
<span className="truncate text-sm font-medium text-foreground">
|
|
106
|
+
{task.name}
|
|
107
|
+
</span>
|
|
108
|
+
<span className="shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground">
|
|
109
|
+
{kindLabel}
|
|
110
|
+
</span>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
);
|
|
114
|
+
})}
|
|
115
|
+
</div>
|
|
116
|
+
);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Maps a WorkflowTaskKind enum value to its string representation
|
|
121
|
+
* matching the TaskKindDescriptor's `kind` field.
|
|
122
|
+
*/
|
|
123
|
+
function kindEnumToString(kind: WorkflowTaskKind): string {
|
|
124
|
+
const entry = Object.entries(WorkflowTaskKind).find(
|
|
125
|
+
([, v]) => v === kind && typeof v === "number",
|
|
126
|
+
);
|
|
127
|
+
return entry?.[0] ?? "";
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function formatKindName(kind: WorkflowTaskKind): string {
|
|
131
|
+
const str = kindEnumToString(kind);
|
|
132
|
+
return str
|
|
133
|
+
.split("_")
|
|
134
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
135
|
+
.join(" ");
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Renders a task kind icon by name. Uses simple SVG placeholders --
|
|
140
|
+
* the full Lucide icon set is intentionally avoided in the SDK to
|
|
141
|
+
* keep the bundle size minimal (DD-004).
|
|
142
|
+
*/
|
|
143
|
+
function TaskKindIcon({
|
|
144
|
+
iconName,
|
|
145
|
+
className,
|
|
146
|
+
}: {
|
|
147
|
+
readonly iconName: string;
|
|
148
|
+
readonly className?: string;
|
|
149
|
+
}) {
|
|
150
|
+
return (
|
|
151
|
+
<span
|
|
152
|
+
className={cn("inline-flex items-center justify-center", className)}
|
|
153
|
+
title={iconName}
|
|
154
|
+
aria-hidden="true"
|
|
155
|
+
>
|
|
156
|
+
<TaskDotIcon />
|
|
157
|
+
</span>
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function TaskDotIcon() {
|
|
162
|
+
return (
|
|
163
|
+
<svg
|
|
164
|
+
width="16"
|
|
165
|
+
height="16"
|
|
166
|
+
viewBox="0 0 16 16"
|
|
167
|
+
fill="none"
|
|
168
|
+
stroke="currentColor"
|
|
169
|
+
strokeWidth="1.5"
|
|
170
|
+
strokeLinecap="round"
|
|
171
|
+
strokeLinejoin="round"
|
|
172
|
+
>
|
|
173
|
+
<circle cx="8" cy="8" r="3" />
|
|
174
|
+
<path d="M8 2v3M8 11v3M2 8h3M11 8h3" />
|
|
175
|
+
</svg>
|
|
176
|
+
);
|
|
177
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { memo, useState, useCallback, useMemo } from "react";
|
|
4
|
+
import type { DragEvent } from "react";
|
|
5
|
+
import { cn } from "@stigmer/theme";
|
|
6
|
+
import { useTaskKindRegistry } from "./useTaskKindRegistry";
|
|
7
|
+
import type { TaskKindDescriptor, TaskKindCategory } from "./types";
|
|
8
|
+
import { CATEGORY_COLORS, CATEGORY_DISPLAY_NAMES, CATEGORY_ORDER } from "./canvas-constants";
|
|
9
|
+
|
|
10
|
+
/** MIME type for the drag transfer carrying the task kind identifier. */
|
|
11
|
+
export const TASK_KIND_DRAG_MIME = "application/stigmer-task-kind";
|
|
12
|
+
|
|
13
|
+
/** Props for {@link WorkflowTaskPalette}. */
|
|
14
|
+
export interface WorkflowTaskPaletteProps {
|
|
15
|
+
/** Additional CSS class names for the root container. */
|
|
16
|
+
readonly className?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Categorized sidebar listing all available workflow task kinds.
|
|
21
|
+
*
|
|
22
|
+
* Each task kind entry is draggable. The drop target (the canvas)
|
|
23
|
+
* reads the task kind from the drag transfer data using
|
|
24
|
+
* {@link TASK_KIND_DRAG_MIME} and creates a new node.
|
|
25
|
+
*
|
|
26
|
+
* Self-contained SDK component (DD-001, AD-T15-B2-005): depends only
|
|
27
|
+
* on `useTaskKindRegistry()` and `--stgm-*` theme tokens. No canvas
|
|
28
|
+
* or React Flow dependency.
|
|
29
|
+
*
|
|
30
|
+
* @since T15 Batch 2 (Node Authoring)
|
|
31
|
+
*/
|
|
32
|
+
export const WorkflowTaskPalette = memo(function WorkflowTaskPalette({
|
|
33
|
+
className,
|
|
34
|
+
}: WorkflowTaskPaletteProps) {
|
|
35
|
+
const { categories, isLoading, error, refetch } = useTaskKindRegistry();
|
|
36
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
37
|
+
const [collapsedCategories, setCollapsedCategories] = useState<Set<string>>(
|
|
38
|
+
new Set(),
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const handleSearchChange = useCallback(
|
|
42
|
+
(e: React.ChangeEvent<HTMLInputElement>) => {
|
|
43
|
+
setSearchQuery(e.target.value);
|
|
44
|
+
},
|
|
45
|
+
[],
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const toggleCategory = useCallback((category: string) => {
|
|
49
|
+
setCollapsedCategories((prev) => {
|
|
50
|
+
const next = new Set(prev);
|
|
51
|
+
if (next.has(category)) {
|
|
52
|
+
next.delete(category);
|
|
53
|
+
} else {
|
|
54
|
+
next.add(category);
|
|
55
|
+
}
|
|
56
|
+
return next;
|
|
57
|
+
});
|
|
58
|
+
}, []);
|
|
59
|
+
|
|
60
|
+
const filteredCategories = useMemo(() => {
|
|
61
|
+
const query = searchQuery.toLowerCase().trim();
|
|
62
|
+
const result: Array<{
|
|
63
|
+
category: TaskKindCategory;
|
|
64
|
+
descriptors: readonly TaskKindDescriptor[];
|
|
65
|
+
}> = [];
|
|
66
|
+
|
|
67
|
+
for (const cat of CATEGORY_ORDER) {
|
|
68
|
+
const descriptors = categories.get(cat);
|
|
69
|
+
if (!descriptors || descriptors.length === 0) continue;
|
|
70
|
+
|
|
71
|
+
const filtered = query
|
|
72
|
+
? descriptors.filter(
|
|
73
|
+
(d) =>
|
|
74
|
+
d.displayName.toLowerCase().includes(query) ||
|
|
75
|
+
d.description.toLowerCase().includes(query),
|
|
76
|
+
)
|
|
77
|
+
: descriptors;
|
|
78
|
+
|
|
79
|
+
if (filtered.length > 0) {
|
|
80
|
+
result.push({ category: cat, descriptors: filtered });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return result;
|
|
85
|
+
}, [categories, searchQuery]);
|
|
86
|
+
|
|
87
|
+
if (isLoading) {
|
|
88
|
+
return (
|
|
89
|
+
<div className={cn("stgm flex w-60 flex-col gap-3 border-r border-[var(--stgm-border-prominent,#d4d4d8)] bg-[var(--stgm-card,var(--stgm-background,#fff))] p-3", className)}>
|
|
90
|
+
{Array.from({ length: 4 }).map((_, i) => (
|
|
91
|
+
<div key={i} className="space-y-2">
|
|
92
|
+
<div className="h-4 w-20 animate-pulse rounded bg-[var(--stgm-muted,#f5f5f5)]" />
|
|
93
|
+
<div className="h-10 w-full animate-pulse rounded bg-[var(--stgm-muted,#f5f5f5)]" />
|
|
94
|
+
<div className="h-10 w-full animate-pulse rounded bg-[var(--stgm-muted,#f5f5f5)]" />
|
|
95
|
+
</div>
|
|
96
|
+
))}
|
|
97
|
+
</div>
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (error) {
|
|
102
|
+
return (
|
|
103
|
+
<div className={cn("stgm flex w-60 flex-col items-center justify-center gap-2 border-r border-[var(--stgm-border-prominent,#d4d4d8)] bg-[var(--stgm-card,var(--stgm-background,#fff))] p-4", className)}>
|
|
104
|
+
<span className="text-xs text-[var(--stgm-destructive,#ef4444)]">
|
|
105
|
+
Failed to load task types
|
|
106
|
+
</span>
|
|
107
|
+
<button
|
|
108
|
+
type="button"
|
|
109
|
+
onClick={refetch}
|
|
110
|
+
className="rounded border border-[var(--stgm-border-prominent,#d4d4d8)] bg-[var(--stgm-card,var(--stgm-background,#fff))] px-2 py-1 text-xs text-[var(--stgm-foreground,#1a1a2e)] hover:bg-[var(--stgm-muted,#f5f5f5)]"
|
|
111
|
+
>
|
|
112
|
+
Retry
|
|
113
|
+
</button>
|
|
114
|
+
</div>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return (
|
|
119
|
+
<div
|
|
120
|
+
className={cn(
|
|
121
|
+
"stgm flex w-60 shrink-0 flex-col border-r border-[var(--stgm-border-prominent,#d4d4d8)] bg-[var(--stgm-card,var(--stgm-background,#fff))]",
|
|
122
|
+
className,
|
|
123
|
+
)}
|
|
124
|
+
>
|
|
125
|
+
<div className="border-b border-[var(--stgm-border-prominent,#d4d4d8)] p-2">
|
|
126
|
+
<input
|
|
127
|
+
type="search"
|
|
128
|
+
placeholder="Search tasks…"
|
|
129
|
+
value={searchQuery}
|
|
130
|
+
onChange={handleSearchChange}
|
|
131
|
+
className="w-full rounded border border-[var(--stgm-border-prominent,#d4d4d8)] bg-[var(--stgm-input-bg,var(--stgm-background,#fff))] px-2 py-1.5 text-xs text-[var(--stgm-foreground,#1a1a2e)] placeholder:text-[var(--stgm-muted-foreground,#737373)] outline-none focus:ring-1 focus:ring-[var(--stgm-ring,#3b82f6)]"
|
|
132
|
+
aria-label="Search task types"
|
|
133
|
+
/>
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
<div className="flex-1 overflow-y-auto p-2">
|
|
137
|
+
{filteredCategories.length === 0 ? (
|
|
138
|
+
<div className="py-6 text-center text-xs text-[var(--stgm-muted-foreground,#737373)]">
|
|
139
|
+
{searchQuery ? "No matching tasks" : "No task types available"}
|
|
140
|
+
</div>
|
|
141
|
+
) : (
|
|
142
|
+
filteredCategories.map(({ category, descriptors }) => (
|
|
143
|
+
<PaletteCategory
|
|
144
|
+
key={category}
|
|
145
|
+
category={category}
|
|
146
|
+
descriptors={descriptors}
|
|
147
|
+
isCollapsed={collapsedCategories.has(category)}
|
|
148
|
+
onToggle={toggleCategory}
|
|
149
|
+
/>
|
|
150
|
+
))
|
|
151
|
+
)}
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
// PaletteCategory
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
|
|
161
|
+
function PaletteCategory({
|
|
162
|
+
category,
|
|
163
|
+
descriptors,
|
|
164
|
+
isCollapsed,
|
|
165
|
+
onToggle,
|
|
166
|
+
}: {
|
|
167
|
+
category: TaskKindCategory;
|
|
168
|
+
descriptors: readonly TaskKindDescriptor[];
|
|
169
|
+
isCollapsed: boolean;
|
|
170
|
+
onToggle: (category: string) => void;
|
|
171
|
+
}) {
|
|
172
|
+
const categoryColor = CATEGORY_COLORS[category] ?? CATEGORY_COLORS.unspecified;
|
|
173
|
+
|
|
174
|
+
return (
|
|
175
|
+
<div className="mb-2">
|
|
176
|
+
<button
|
|
177
|
+
type="button"
|
|
178
|
+
onClick={() => onToggle(category)}
|
|
179
|
+
className="flex w-full items-center gap-1.5 rounded px-1 py-1 text-left text-[11px] font-semibold uppercase tracking-wider text-[var(--stgm-muted-foreground,#737373)] hover:bg-[var(--stgm-muted,#f5f5f5)]"
|
|
180
|
+
aria-expanded={!isCollapsed}
|
|
181
|
+
>
|
|
182
|
+
<span
|
|
183
|
+
className="inline-block h-2 w-2 rounded-full"
|
|
184
|
+
style={{ backgroundColor: categoryColor }}
|
|
185
|
+
aria-hidden="true"
|
|
186
|
+
/>
|
|
187
|
+
{CATEGORY_DISPLAY_NAMES[category]}
|
|
188
|
+
<span className="ml-auto text-[10px]">{isCollapsed ? "+" : "\u2212"}</span>
|
|
189
|
+
</button>
|
|
190
|
+
|
|
191
|
+
{!isCollapsed && (
|
|
192
|
+
<div className="mt-0.5 space-y-0.5" role="listbox" aria-label={CATEGORY_DISPLAY_NAMES[category]}>
|
|
193
|
+
{descriptors.map((descriptor) => (
|
|
194
|
+
<PaletteItem
|
|
195
|
+
key={descriptor.kind}
|
|
196
|
+
descriptor={descriptor}
|
|
197
|
+
categoryColor={categoryColor}
|
|
198
|
+
/>
|
|
199
|
+
))}
|
|
200
|
+
</div>
|
|
201
|
+
)}
|
|
202
|
+
</div>
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// PaletteItem
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
|
|
210
|
+
function PaletteItem({
|
|
211
|
+
descriptor,
|
|
212
|
+
categoryColor,
|
|
213
|
+
}: {
|
|
214
|
+
descriptor: TaskKindDescriptor;
|
|
215
|
+
categoryColor: string;
|
|
216
|
+
}) {
|
|
217
|
+
const handleDragStart = useCallback(
|
|
218
|
+
(e: DragEvent<HTMLDivElement>) => {
|
|
219
|
+
e.dataTransfer.setData(TASK_KIND_DRAG_MIME, descriptor.kind);
|
|
220
|
+
e.dataTransfer.effectAllowed = "move";
|
|
221
|
+
},
|
|
222
|
+
[descriptor.kind],
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
return (
|
|
226
|
+
<div
|
|
227
|
+
draggable
|
|
228
|
+
onDragStart={handleDragStart}
|
|
229
|
+
className="flex cursor-grab items-start gap-2 rounded border border-[var(--stgm-border-prominent,#d4d4d8)] bg-[var(--stgm-background,#fff)] px-2 py-1.5 transition-colors hover:bg-[var(--stgm-muted,#f5f5f5)] active:cursor-grabbing"
|
|
230
|
+
role="option"
|
|
231
|
+
aria-label={`Drag to add ${descriptor.displayName} task`}
|
|
232
|
+
>
|
|
233
|
+
<span
|
|
234
|
+
className="mt-0.5 inline-block h-2.5 w-0.5 shrink-0 rounded-full"
|
|
235
|
+
style={{ backgroundColor: categoryColor }}
|
|
236
|
+
aria-hidden="true"
|
|
237
|
+
/>
|
|
238
|
+
<div className="min-w-0 flex-1">
|
|
239
|
+
<div className="truncate text-xs font-medium text-[var(--stgm-foreground,#1a1a2e)]">
|
|
240
|
+
{descriptor.displayName}
|
|
241
|
+
</div>
|
|
242
|
+
<div className="truncate text-[10px] leading-tight text-[var(--stgm-muted-foreground,#737373)]">
|
|
243
|
+
{descriptor.description}
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
);
|
|
248
|
+
}
|