@invect/ui 0.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/LICENSE +21 -0
- package/README.md +77 -0
- package/dist/Invect-CWpIwZ5F.js +92738 -0
- package/dist/Invect.d.ts +25 -0
- package/dist/InvectShell.d.ts +14 -0
- package/dist/api/agent-tools.api.d.ts +1 -0
- package/dist/api/client.d.ts +207 -0
- package/dist/api/credentials.api.d.ts +47 -0
- package/dist/api/executions.api.d.ts +43 -0
- package/dist/api/flows.api.d.ts +100 -0
- package/dist/api/index.d.ts +9 -0
- package/dist/api/node-data.api.d.ts +66 -0
- package/dist/api/query-keys.d.ts +22 -0
- package/dist/api/triggers.api.d.ts +44 -0
- package/dist/api/types.d.ts +147 -0
- package/dist/api/use-flow-run-stream.d.ts +12 -0
- package/dist/assets/invect-branding.d.ts +4 -0
- package/dist/assets/provider-icons/index.d.ts +8 -0
- package/dist/babel-C9OtljFZ.js +9721 -0
- package/dist/components/PageLayout.d.ts +17 -0
- package/dist/components/chat/ChatInput.d.ts +17 -0
- package/dist/components/chat/ChatMessageList.d.ts +14 -0
- package/dist/components/chat/ChatModelSelector.d.ts +11 -0
- package/dist/components/chat/ChatPanel.d.ts +19 -0
- package/dist/components/chat/ChatPromptOverlay.d.ts +13 -0
- package/dist/components/chat/ChatProviderSelector.d.ts +9 -0
- package/dist/components/chat/ChatSettingsPanel.d.ts +11 -0
- package/dist/components/chat/InlineCredentialSetup.d.ts +9 -0
- package/dist/components/chat/MarkdownRenderer.d.ts +7 -0
- package/dist/components/chat/chat-memory.d.ts +21 -0
- package/dist/components/chat/chat.store.d.ts +416 -0
- package/dist/components/chat/index.d.ts +5 -0
- package/dist/components/chat/use-chat.d.ts +28 -0
- package/dist/components/credentials/CreateCredentialModal.d.ts +13 -0
- package/dist/components/credentials/CredentialDetailDialog.d.ts +17 -0
- package/dist/components/credentials/EditCredentialModal.d.ts +11 -0
- package/dist/components/credentials/OAuth2ConnectButton.d.ts +38 -0
- package/dist/components/credentials/OAuth2ProviderSelector.d.ts +15 -0
- package/dist/components/credentials/credential-utils.d.ts +12 -0
- package/dist/components/credentials/index.d.ts +9 -0
- package/dist/components/dashboard/FailedRunsAlert.d.ts +3 -0
- package/dist/components/dashboard/FlowCard.d.ts +7 -0
- package/dist/components/dashboard/RecentActivityTable.d.ts +9 -0
- package/dist/components/dashboard/StatCard.d.ts +10 -0
- package/dist/components/dashboard/index.d.ts +5 -0
- package/dist/components/dashboard/status-helpers.d.ts +5 -0
- package/dist/components/flow-editor/ActionsSidebar.d.ts +2 -0
- package/dist/components/flow-editor/FlowEditor.d.ts +21 -0
- package/dist/components/flow-editor/FlowHeader.d.ts +9 -0
- package/dist/components/flow-editor/FlowLayout.d.ts +24 -0
- package/dist/components/flow-editor/ModeSwitcher.d.ts +7 -0
- package/dist/components/flow-editor/NodeSidebar.d.ts +24 -0
- package/dist/components/flow-editor/RunControls.d.ts +12 -0
- package/dist/components/flow-editor/ToolConfigPanel.d.ts +16 -0
- package/dist/components/flow-editor/ValidationPanel.d.ts +5 -0
- package/dist/components/flow-editor/flow-editor.store.d.ts +1 -0
- package/dist/components/flow-editor/index.d.ts +6 -0
- package/dist/components/flow-editor/inline-edit.d.ts +10 -0
- package/dist/components/flow-editor/node-config-panel/ConfigFieldWithTemplate.d.ts +26 -0
- package/dist/components/flow-editor/node-config-panel/CredentialCombobox.d.ts +21 -0
- package/dist/components/flow-editor/node-config-panel/CredentialsSection.d.ts +19 -0
- package/dist/components/flow-editor/node-config-panel/DroppableInput.d.ts +20 -0
- package/dist/components/flow-editor/node-config-panel/DynamicSelectField.d.ts +22 -0
- package/dist/components/flow-editor/node-config-panel/JsonPreviewPanel.d.ts +25 -0
- package/dist/components/flow-editor/node-config-panel/NodeConfigPanel.d.ts +14 -0
- package/dist/components/flow-editor/node-config-panel/NodeConfigPanelHeader.d.ts +15 -0
- package/dist/components/flow-editor/node-config-panel/ParametersSection.d.ts +16 -0
- package/dist/components/flow-editor/node-config-panel/SearchableSelectField.d.ts +17 -0
- package/dist/components/flow-editor/node-config-panel/SwitchCasesField.d.ts +18 -0
- package/dist/components/flow-editor/node-config-panel/hooks/index.d.ts +2 -0
- package/dist/components/flow-editor/node-config-panel/hooks/use-node-config-panel-state.d.ts +24 -0
- package/dist/components/flow-editor/node-config-panel/hooks/use-node-execution.d.ts +46 -0
- package/dist/components/flow-editor/node-config-panel/hooks/use-upstream-slots.d.ts +16 -0
- package/dist/components/flow-editor/node-config-panel/panels/AgentToolsPanel.d.ts +18 -0
- package/dist/components/flow-editor/node-config-panel/panels/ConfigurationPanel.d.ts +49 -0
- package/dist/components/flow-editor/node-config-panel/panels/DataMapperPane.d.ts +40 -0
- package/dist/components/flow-editor/node-config-panel/panels/InputPanel.d.ts +49 -0
- package/dist/components/flow-editor/node-config-panel/panels/OutputPanel.d.ts +7 -0
- package/dist/components/flow-editor/node-config-panel/panels/index.d.ts +4 -0
- package/dist/components/flow-editor/node-config-panel/types.d.ts +19 -0
- package/dist/components/flow-editor/node-config-panel/use-node-config-panel-store.d.ts +49 -0
- package/dist/components/flow-editor/node-config-panel/use-node-config-state.d.ts +26 -0
- package/dist/components/flow-editor/node-config-panel/use-run-node.d.ts +16 -0
- package/dist/components/flow-editor/node-config-panel/utils.d.ts +9 -0
- package/dist/components/flow-editor/serialize-to-sdk.d.ts +20 -0
- package/dist/components/flow-editor/toolbar-context.d.ts +2 -0
- package/dist/components/flow-editor/use-copy-paste.d.ts +7 -0
- package/dist/components/flow-editor/use-copy-paste.types.d.ts +38 -0
- package/dist/components/flow-editor/use-flow-editor.d.ts +44 -0
- package/dist/components/flow-runs-table/FlowRunsTable.d.ts +6 -0
- package/dist/components/flow-runs-table/index.d.ts +1 -0
- package/dist/components/flow-viewer/FlowRunsView.d.ts +7 -0
- package/dist/components/flow-viewer/FlowStatusView.d.ts +21 -0
- package/dist/components/flow-viewer/RunSelector.d.ts +13 -0
- package/dist/components/flow-viewer/RunsSidebar.d.ts +14 -0
- package/dist/components/flow-viewer/agent-tool-executions-list.d.ts +7 -0
- package/dist/components/flow-viewer/index.d.ts +1 -0
- package/dist/components/flow-viewer/logs-panel.d.ts +18 -0
- package/dist/components/flow-viewer/use-execution-log-data.d.ts +113 -0
- package/dist/components/graph/BatchFlowEdge.d.ts +33 -0
- package/dist/components/graph/LayoutSelector.d.ts +9 -0
- package/dist/components/graph/index.d.ts +47 -0
- package/dist/components/graph/styleUtils.d.ts +124 -0
- package/dist/components/nodes/AgentConfigPanel.d.ts +24 -0
- package/dist/components/nodes/AgentNode.d.ts +8 -0
- package/dist/components/nodes/AgentToolsBox.d.ts +41 -0
- package/dist/components/nodes/NodeAppendix.d.ts +19 -0
- package/dist/components/nodes/NodeStatusIndicator.d.ts +30 -0
- package/dist/components/nodes/NodeViewContext.d.ts +18 -0
- package/dist/components/nodes/ToolParamField.d.ts +28 -0
- package/dist/components/nodes/ToolSelectorModal.d.ts +80 -0
- package/dist/components/nodes/ToolSelectorParts.d.ts +30 -0
- package/dist/components/nodes/UniversalNode.d.ts +2 -0
- package/dist/components/nodes/createContextAwareNodes.d.ts +6 -0
- package/dist/components/nodes/index.d.ts +22 -0
- package/dist/components/nodes/nodeRegistry.d.ts +13 -0
- package/dist/components/nodes/withNodeContext.d.ts +7 -0
- package/dist/components/shared/InvectLoader.d.ts +8 -0
- package/dist/components/shared/InvectLogo.d.ts +9 -0
- package/dist/components/shared/ProviderIcon.d.ts +23 -0
- package/dist/components/side-menu/side-menu.d.ts +4 -0
- package/dist/components/sidebar/BaseSidebar.d.ts +17 -0
- package/dist/components/sidebar/index.d.ts +1 -0
- package/dist/components/triggers/CronPreview.d.ts +12 -0
- package/dist/components/triggers/index.d.ts +1 -0
- package/dist/components/ui/alert-dialog.d.ts +18 -0
- package/dist/components/ui/badge.d.ts +9 -0
- package/dist/components/ui/button.d.ts +13 -0
- package/dist/components/ui/card.d.ts +9 -0
- package/dist/components/ui/codemirror-js-editor.d.ts +25 -0
- package/dist/components/ui/codemirror-json-editor.d.ts +18 -0
- package/dist/components/ui/codemirror-nunjucks-editor.d.ts +13 -0
- package/dist/components/ui/codemirror-vscode-theme.d.ts +24 -0
- package/dist/components/ui/collapsible.d.ts +6 -0
- package/dist/components/ui/command.d.ts +18 -0
- package/dist/components/ui/dialog.d.ts +18 -0
- package/dist/components/ui/dropdown-menu.d.ts +25 -0
- package/dist/components/ui/empty-state.d.ts +21 -0
- package/dist/components/ui/input.d.ts +3 -0
- package/dist/components/ui/label.d.ts +4 -0
- package/dist/components/ui/popover.d.ts +10 -0
- package/dist/components/ui/resizable.d.ts +8 -0
- package/dist/components/ui/scroll-area.d.ts +5 -0
- package/dist/components/ui/select.d.ts +18 -0
- package/dist/components/ui/separator.d.ts +4 -0
- package/dist/components/ui/slider.d.ts +4 -0
- package/dist/components/ui/switch.d.ts +3 -0
- package/dist/components/ui/table.d.ts +10 -0
- package/dist/components/ui/textarea.d.ts +3 -0
- package/dist/components/ui/tooltip.d.ts +7 -0
- package/dist/components/ui/tree-view.d.ts +107 -0
- package/dist/contexts/AgentToolCallbacksContext.d.ts +23 -0
- package/dist/contexts/ApiContext.d.ts +11 -0
- package/dist/contexts/FlowDataContext.d.ts +9 -0
- package/dist/contexts/NodeRegistryContext.d.ts +14 -0
- package/dist/contexts/PluginRegistryContext.d.ts +39 -0
- package/dist/contexts/ThemeProvider.d.ts +18 -0
- package/dist/contexts/ValidationContext.d.ts +22 -0
- package/dist/demo/DemoInvect.d.ts +11 -0
- package/dist/demo/FlowViewer.d.ts +31 -0
- package/dist/demo/demo-api-client.d.ts +33 -0
- package/dist/demo/index.d.ts +6 -0
- package/dist/demo/sample-data.d.ts +1538 -0
- package/dist/demo.d.ts +2 -0
- package/dist/demo.js +2774 -0
- package/dist/estree-ClbRfS-1.js +7076 -0
- package/dist/fonts/geist-cyrillic-wght-normal.woff2 +0 -0
- package/dist/fonts/geist-latin-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/geist-latin-wght-normal.woff2 +0 -0
- package/dist/fonts/iosevka-latin-400-normal.woff2 +0 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/use-document-title.d.ts +1 -0
- package/dist/hooks/use-flow-data.d.ts +22 -0
- package/dist/hooks/use-invect-portal-class.d.ts +21 -0
- package/dist/hooks/useFlowEditorStore.d.ts +1 -0
- package/dist/index.css +3 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +717 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/prettier.d.ts +13 -0
- package/dist/routes/all-flow-runs.d.ts +5 -0
- package/dist/routes/credentials.d.ts +5 -0
- package/dist/routes/flow-route-layout.d.ts +19 -0
- package/dist/routes/flow-runs.d.ts +5 -0
- package/dist/routes/flow.d.ts +5 -0
- package/dist/routes/home.d.ts +5 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/standalone-C3Df7W52.js +3463 -0
- package/dist/stores/executionViewStore.d.ts +64 -0
- package/dist/stores/flow-editor.store.d.ts +137 -0
- package/dist/stores/flowEditorStore.d.ts +1 -0
- package/dist/stores/index.d.ts +2 -0
- package/dist/stores/uiStore.d.ts +45 -0
- package/dist/types/agent-tools.types.d.ts +53 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/node-definition.types.d.ts +85 -0
- package/dist/types/plugin.types.d.ts +100 -0
- package/dist/utils/credentialBranding.d.ts +8 -0
- package/dist/utils/credentialFiltering.d.ts +20 -0
- package/dist/utils/flowTransformations.d.ts +16 -0
- package/dist/utils/layoutUtils.d.ts +23 -0
- package/dist/utils/nodeReferenceUtils.d.ts +37 -0
- package/dist/vendor.d.ts +5 -0
- package/package.json +130 -0
- package/src/.DS_Store +0 -0
- package/src/Invect.tsx +229 -0
- package/src/InvectShell.tsx +55 -0
- package/src/api/agent-tools.api.ts +23 -0
- package/src/api/client.ts +899 -0
- package/src/api/credentials.api.ts +197 -0
- package/src/api/executions.api.ts +228 -0
- package/src/api/flows.api.ts +195 -0
- package/src/api/index.ts +17 -0
- package/src/api/node-data.api.ts +167 -0
- package/src/api/query-keys.ts +44 -0
- package/src/api/triggers.api.ts +120 -0
- package/src/api/types.ts +212 -0
- package/src/api/use-flow-run-stream.ts +206 -0
- package/src/app.css +560 -0
- package/src/assets/.DS_Store +0 -0
- package/src/assets/favicon.ico +0 -0
- package/src/assets/fonts/geist-cyrillic-wght-normal.woff2 +0 -0
- package/src/assets/fonts/geist-latin-ext-wght-normal.woff2 +0 -0
- package/src/assets/fonts/geist-latin-wght-normal.woff2 +0 -0
- package/src/assets/fonts/iosevka-latin-400-normal.woff2 +0 -0
- package/src/assets/invect-branding.ts +51 -0
- package/src/assets/provider-icons/anthropic.svg +1 -0
- package/src/assets/provider-icons/anthropic_light.svg +1 -0
- package/src/assets/provider-icons/github.svg +1 -0
- package/src/assets/provider-icons/github_light.svg +1 -0
- package/src/assets/provider-icons/gmail.svg +1 -0
- package/src/assets/provider-icons/google_calendar.svg +1 -0
- package/src/assets/provider-icons/google_docs.svg +1 -0
- package/src/assets/provider-icons/google_drive.svg +1 -0
- package/src/assets/provider-icons/google_sheets.svg +1 -0
- package/src/assets/provider-icons/index.ts +55 -0
- package/src/assets/provider-icons/linear.svg +1 -0
- package/src/assets/provider-icons/openai.svg +1 -0
- package/src/assets/provider-icons/postgres.svg +1 -0
- package/src/assets/provider-icons/slack.svg +1 -0
- package/src/assets/small-loader-dark.svg +22 -0
- package/src/assets/small-loader-light.svg +22 -0
- package/src/assets/small.svg +7 -0
- package/src/components/.DS_Store +0 -0
- package/src/components/PageLayout.tsx +55 -0
- package/src/components/chat/ChatInput.tsx +115 -0
- package/src/components/chat/ChatMessageList.tsx +788 -0
- package/src/components/chat/ChatModelSelector.tsx +208 -0
- package/src/components/chat/ChatPanel.tsx +243 -0
- package/src/components/chat/ChatPromptOverlay.tsx +150 -0
- package/src/components/chat/ChatProviderSelector.tsx +135 -0
- package/src/components/chat/ChatSettingsPanel.tsx +277 -0
- package/src/components/chat/InlineCredentialSetup.tsx +343 -0
- package/src/components/chat/MarkdownRenderer.tsx +140 -0
- package/src/components/chat/chat-memory.ts +88 -0
- package/src/components/chat/chat.store.ts +479 -0
- package/src/components/chat/index.ts +5 -0
- package/src/components/chat/use-chat.ts +473 -0
- package/src/components/credentials/CreateCredentialModal.tsx +609 -0
- package/src/components/credentials/CredentialDetailDialog.tsx +882 -0
- package/src/components/credentials/EditCredentialModal.tsx +399 -0
- package/src/components/credentials/OAuth2ConnectButton.tsx +288 -0
- package/src/components/credentials/OAuth2ProviderSelector.tsx +360 -0
- package/src/components/credentials/credential-utils.ts +99 -0
- package/src/components/credentials/index.ts +10 -0
- package/src/components/dashboard/FailedRunsAlert.tsx +67 -0
- package/src/components/dashboard/FlowCard.tsx +64 -0
- package/src/components/dashboard/RecentActivityTable.tsx +92 -0
- package/src/components/dashboard/StatCard.tsx +32 -0
- package/src/components/dashboard/index.ts +5 -0
- package/src/components/dashboard/status-helpers.tsx +102 -0
- package/src/components/flow-editor/ActionsSidebar.tsx +503 -0
- package/src/components/flow-editor/FlowEditor.tsx +1002 -0
- package/src/components/flow-editor/FlowHeader.tsx +87 -0
- package/src/components/flow-editor/FlowLayout.tsx +117 -0
- package/src/components/flow-editor/ModeSwitcher.tsx +49 -0
- package/src/components/flow-editor/NodeSidebar.tsx +343 -0
- package/src/components/flow-editor/RunControls.tsx +109 -0
- package/src/components/flow-editor/ToolConfigPanel.tsx +434 -0
- package/src/components/flow-editor/ValidationPanel.tsx +167 -0
- package/src/components/flow-editor/flow-editor.store.ts +2 -0
- package/src/components/flow-editor/index.ts +6 -0
- package/src/components/flow-editor/inline-edit.tsx +111 -0
- package/src/components/flow-editor/node-config-panel/ConfigFieldWithTemplate.tsx +334 -0
- package/src/components/flow-editor/node-config-panel/CredentialCombobox.tsx +217 -0
- package/src/components/flow-editor/node-config-panel/CredentialsSection.tsx +154 -0
- package/src/components/flow-editor/node-config-panel/DroppableInput.tsx +45 -0
- package/src/components/flow-editor/node-config-panel/DynamicSelectField.tsx +223 -0
- package/src/components/flow-editor/node-config-panel/JsonPreviewPanel.tsx +134 -0
- package/src/components/flow-editor/node-config-panel/NodeConfigPanel.tsx +650 -0
- package/src/components/flow-editor/node-config-panel/NodeConfigPanelHeader.tsx +91 -0
- package/src/components/flow-editor/node-config-panel/ParametersSection.tsx +144 -0
- package/src/components/flow-editor/node-config-panel/SearchableSelectField.tsx +126 -0
- package/src/components/flow-editor/node-config-panel/SwitchCasesField.tsx +212 -0
- package/src/components/flow-editor/node-config-panel/hooks/index.ts +2 -0
- package/src/components/flow-editor/node-config-panel/hooks/use-node-config-panel-state.ts +284 -0
- package/src/components/flow-editor/node-config-panel/hooks/use-node-execution.ts +287 -0
- package/src/components/flow-editor/node-config-panel/hooks/use-upstream-slots.ts +310 -0
- package/src/components/flow-editor/node-config-panel/panels/AgentToolsPanel.tsx +837 -0
- package/src/components/flow-editor/node-config-panel/panels/ConfigurationPanel.tsx +383 -0
- package/src/components/flow-editor/node-config-panel/panels/DataMapperPane.tsx +456 -0
- package/src/components/flow-editor/node-config-panel/panels/InputPanel.tsx +338 -0
- package/src/components/flow-editor/node-config-panel/panels/OutputPanel.tsx +109 -0
- package/src/components/flow-editor/node-config-panel/panels/index.ts +4 -0
- package/src/components/flow-editor/node-config-panel/types.ts +20 -0
- package/src/components/flow-editor/node-config-panel/use-node-config-panel-store.ts +283 -0
- package/src/components/flow-editor/node-config-panel/use-node-config-state.ts +172 -0
- package/src/components/flow-editor/node-config-panel/use-run-node.ts +147 -0
- package/src/components/flow-editor/node-config-panel/utils.ts +73 -0
- package/src/components/flow-editor/serialize-to-sdk.ts +204 -0
- package/src/components/flow-editor/toolbar-context.ts +9 -0
- package/src/components/flow-editor/use-copy-paste.ts +575 -0
- package/src/components/flow-editor/use-copy-paste.types.ts +35 -0
- package/src/components/flow-editor/use-flow-editor.ts +241 -0
- package/src/components/flow-runs-table/FlowRunsTable.tsx +631 -0
- package/src/components/flow-runs-table/index.ts +1 -0
- package/src/components/flow-viewer/FlowRunsView.tsx +268 -0
- package/src/components/flow-viewer/FlowStatusView.tsx +351 -0
- package/src/components/flow-viewer/RunSelector.tsx +422 -0
- package/src/components/flow-viewer/RunsSidebar.tsx +125 -0
- package/src/components/flow-viewer/agent-tool-executions-list.tsx +298 -0
- package/src/components/flow-viewer/index.ts +1 -0
- package/src/components/flow-viewer/logs-panel.tsx +567 -0
- package/src/components/flow-viewer/use-execution-log-data.ts +374 -0
- package/src/components/graph/BatchFlowEdge.tsx +229 -0
- package/src/components/graph/LayoutSelector.tsx +42 -0
- package/src/components/graph/index.ts +61 -0
- package/src/components/graph/styleUtils.ts +375 -0
- package/src/components/nodes/.DS_Store +0 -0
- package/src/components/nodes/AgentConfigPanel.tsx +1033 -0
- package/src/components/nodes/AgentNode.tsx +298 -0
- package/src/components/nodes/AgentToolsBox.tsx +193 -0
- package/src/components/nodes/NodeAppendix.tsx +98 -0
- package/src/components/nodes/NodeStatusIndicator.tsx +74 -0
- package/src/components/nodes/NodeViewContext.tsx +45 -0
- package/src/components/nodes/ToolParamField.tsx +282 -0
- package/src/components/nodes/ToolSelectorModal.tsx +648 -0
- package/src/components/nodes/ToolSelectorParts.tsx +505 -0
- package/src/components/nodes/UniversalNode.tsx +356 -0
- package/src/components/nodes/createContextAwareNodes.ts +19 -0
- package/src/components/nodes/index.ts +45 -0
- package/src/components/nodes/nodeRegistry.ts +50 -0
- package/src/components/nodes/withNodeContext.tsx +55 -0
- package/src/components/shared/InvectLoader.tsx +59 -0
- package/src/components/shared/InvectLogo.tsx +59 -0
- package/src/components/shared/ProviderIcon.tsx +115 -0
- package/src/components/side-menu/side-menu.tsx +267 -0
- package/src/components/sidebar/BaseSidebar.tsx +148 -0
- package/src/components/sidebar/index.ts +1 -0
- package/src/components/triggers/CronPreview.tsx +243 -0
- package/src/components/triggers/index.ts +1 -0
- package/src/components/ui/alert-dialog.tsx +152 -0
- package/src/components/ui/badge.tsx +39 -0
- package/src/components/ui/button.tsx +58 -0
- package/src/components/ui/card.tsx +75 -0
- package/src/components/ui/codemirror-js-editor.tsx +432 -0
- package/src/components/ui/codemirror-json-editor.tsx +816 -0
- package/src/components/ui/codemirror-nunjucks-editor.tsx +451 -0
- package/src/components/ui/codemirror-vscode-theme.ts +243 -0
- package/src/components/ui/collapsible.tsx +12 -0
- package/src/components/ui/command.tsx +162 -0
- package/src/components/ui/dialog.tsx +140 -0
- package/src/components/ui/dropdown-menu.tsx +232 -0
- package/src/components/ui/empty-state.tsx +93 -0
- package/src/components/ui/input.tsx +26 -0
- package/src/components/ui/label.tsx +19 -0
- package/src/components/ui/popover.tsx +53 -0
- package/src/components/ui/resizable.tsx +61 -0
- package/src/components/ui/scroll-area.tsx +56 -0
- package/src/components/ui/select.tsx +179 -0
- package/src/components/ui/separator.tsx +26 -0
- package/src/components/ui/slider.tsx +58 -0
- package/src/components/ui/switch.tsx +22 -0
- package/src/components/ui/table.tsx +90 -0
- package/src/components/ui/textarea.tsx +23 -0
- package/src/components/ui/tooltip.tsx +54 -0
- package/src/components/ui/tree-view.tsx +574 -0
- package/src/contexts/AgentToolCallbacksContext.tsx +31 -0
- package/src/contexts/ApiContext.tsx +51 -0
- package/src/contexts/FlowDataContext.tsx +21 -0
- package/src/contexts/NodeRegistryContext.tsx +54 -0
- package/src/contexts/PluginRegistryContext.tsx +182 -0
- package/src/contexts/ThemeProvider.tsx +106 -0
- package/src/contexts/ValidationContext.tsx +122 -0
- package/src/demo/DemoInvect.tsx +42 -0
- package/src/demo/FlowViewer.tsx +294 -0
- package/src/demo/demo-api-client.ts +246 -0
- package/src/demo/index.ts +28 -0
- package/src/demo/sample-data.ts +1980 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use-document-title.ts +8 -0
- package/src/hooks/use-flow-data.ts +144 -0
- package/src/hooks/use-invect-portal-class.ts +27 -0
- package/src/hooks/useFlowEditorStore.ts +2 -0
- package/src/index.ts +70 -0
- package/src/lib/utils.ts +6 -0
- package/src/prettier.d.ts +13 -0
- package/src/routes/all-flow-runs.tsx +27 -0
- package/src/routes/credentials.tsx +362 -0
- package/src/routes/flow-route-layout.tsx +113 -0
- package/src/routes/flow-runs.tsx +22 -0
- package/src/routes/flow.tsx +22 -0
- package/src/routes/home.tsx +282 -0
- package/src/services/index.ts +6 -0
- package/src/stores/executionViewStore.ts +211 -0
- package/src/stores/flow-editor.store.ts +738 -0
- package/src/stores/flowEditorStore.ts +2 -0
- package/src/stores/index.ts +10 -0
- package/src/stores/uiStore.ts +189 -0
- package/src/types/agent-tools.types.ts +64 -0
- package/src/types/index.ts +5 -0
- package/src/types/node-definition.types.ts +104 -0
- package/src/types/plugin.types.ts +123 -0
- package/src/utils/credentialBranding.ts +116 -0
- package/src/utils/credentialFiltering.ts +68 -0
- package/src/utils/flowTransformations.ts +137 -0
- package/src/utils/layoutUtils.ts +127 -0
- package/src/utils/nodeReferenceUtils.ts +135 -0
- package/src/vendor.d.ts +7 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
// Credential-related React Query hooks
|
|
2
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
3
|
+
import { useApiClient } from '../contexts/ApiContext';
|
|
4
|
+
import { queryKeys, getErrorMessage } from './query-keys';
|
|
5
|
+
import type { CredentialFilters, CreateCredentialInput, UpdateCredentialInput } from './types';
|
|
6
|
+
|
|
7
|
+
// Credential Queries
|
|
8
|
+
export function useCredentials(filters?: CredentialFilters, options?: { enabled?: boolean }) {
|
|
9
|
+
const apiClient = useApiClient();
|
|
10
|
+
|
|
11
|
+
return useQuery({
|
|
12
|
+
queryKey: queryKeys.credentials(filters),
|
|
13
|
+
queryFn: () => apiClient.listCredentials(filters),
|
|
14
|
+
staleTime: 1000 * 60 * 5,
|
|
15
|
+
enabled: options?.enabled ?? true,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function useCredential(id: string) {
|
|
20
|
+
const apiClient = useApiClient();
|
|
21
|
+
|
|
22
|
+
return useQuery({
|
|
23
|
+
queryKey: queryKeys.credential(id),
|
|
24
|
+
queryFn: () => apiClient.getCredential(id),
|
|
25
|
+
enabled: Boolean(id),
|
|
26
|
+
staleTime: 1000 * 60,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function useCredentialUsage(id: string, enabled: boolean = true) {
|
|
31
|
+
const apiClient = useApiClient();
|
|
32
|
+
|
|
33
|
+
return useQuery({
|
|
34
|
+
queryKey: queryKeys.credentialUsage(id),
|
|
35
|
+
queryFn: () => apiClient.getCredentialUsage(id),
|
|
36
|
+
enabled: enabled && Boolean(id),
|
|
37
|
+
staleTime: 1000 * 60,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Credential Mutations
|
|
42
|
+
export function useCreateCredential() {
|
|
43
|
+
const apiClient = useApiClient();
|
|
44
|
+
const queryClient = useQueryClient();
|
|
45
|
+
|
|
46
|
+
return useMutation({
|
|
47
|
+
mutationFn: (input: CreateCredentialInput) => apiClient.createCredential(input),
|
|
48
|
+
onSuccess: () => {
|
|
49
|
+
queryClient.invalidateQueries({ queryKey: ['credentials'] });
|
|
50
|
+
},
|
|
51
|
+
onError: (error) => {
|
|
52
|
+
console.error('Error creating credential:', getErrorMessage(error));
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function useUpdateCredential() {
|
|
58
|
+
const apiClient = useApiClient();
|
|
59
|
+
const queryClient = useQueryClient();
|
|
60
|
+
|
|
61
|
+
return useMutation({
|
|
62
|
+
mutationFn: ({ id, data }: { id: string; data: UpdateCredentialInput }) =>
|
|
63
|
+
apiClient.updateCredential(id, data),
|
|
64
|
+
onSuccess: (_, { id }) => {
|
|
65
|
+
queryClient.invalidateQueries({ queryKey: ['credentials'] });
|
|
66
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.credential(id) });
|
|
67
|
+
},
|
|
68
|
+
onError: (error) => {
|
|
69
|
+
console.error('Error updating credential:', getErrorMessage(error));
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function useDeleteCredential() {
|
|
75
|
+
const apiClient = useApiClient();
|
|
76
|
+
const queryClient = useQueryClient();
|
|
77
|
+
|
|
78
|
+
return useMutation({
|
|
79
|
+
mutationFn: (id: string) => apiClient.deleteCredential(id),
|
|
80
|
+
onSuccess: () => {
|
|
81
|
+
queryClient.invalidateQueries({ queryKey: ['credentials'] });
|
|
82
|
+
},
|
|
83
|
+
onError: (error) => {
|
|
84
|
+
console.error('Error deleting credential:', getErrorMessage(error));
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function useTestCredential() {
|
|
90
|
+
const apiClient = useApiClient();
|
|
91
|
+
|
|
92
|
+
return useMutation({
|
|
93
|
+
mutationFn: (id: string) => apiClient.testCredential(id),
|
|
94
|
+
onError: (error) => {
|
|
95
|
+
console.error('Error testing credential:', getErrorMessage(error));
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Test Credential Request Mutation (for testing API connections)
|
|
101
|
+
export function useTestCredentialRequest() {
|
|
102
|
+
const apiClient = useApiClient();
|
|
103
|
+
|
|
104
|
+
return useMutation({
|
|
105
|
+
mutationFn: (params: {
|
|
106
|
+
url: string;
|
|
107
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
108
|
+
headers?: Record<string, string>;
|
|
109
|
+
body?: string;
|
|
110
|
+
}) => apiClient.testCredentialRequest(params),
|
|
111
|
+
onError: (error) => {
|
|
112
|
+
console.error('Error testing credential request:', getErrorMessage(error));
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// OAuth2 Queries
|
|
118
|
+
export function useOAuth2Providers() {
|
|
119
|
+
const apiClient = useApiClient();
|
|
120
|
+
|
|
121
|
+
return useQuery({
|
|
122
|
+
queryKey: ['oauth2', 'providers'],
|
|
123
|
+
queryFn: () => apiClient.getOAuth2Providers(),
|
|
124
|
+
staleTime: 1000 * 60 * 60, // 1 hour - providers don't change
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function useOAuth2Provider(providerId: string) {
|
|
129
|
+
const apiClient = useApiClient();
|
|
130
|
+
|
|
131
|
+
return useQuery({
|
|
132
|
+
queryKey: ['oauth2', 'provider', providerId],
|
|
133
|
+
queryFn: () => apiClient.getOAuth2Provider(providerId),
|
|
134
|
+
enabled: Boolean(providerId),
|
|
135
|
+
staleTime: 1000 * 60 * 60,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// OAuth2 Mutations
|
|
140
|
+
export function useStartOAuth2Flow() {
|
|
141
|
+
const apiClient = useApiClient();
|
|
142
|
+
|
|
143
|
+
return useMutation({
|
|
144
|
+
mutationFn: (params: {
|
|
145
|
+
providerId?: string;
|
|
146
|
+
clientId?: string;
|
|
147
|
+
clientSecret?: string;
|
|
148
|
+
redirectUri: string;
|
|
149
|
+
scopes?: string[];
|
|
150
|
+
returnUrl?: string;
|
|
151
|
+
credentialName?: string;
|
|
152
|
+
existingCredentialId?: string;
|
|
153
|
+
}) => apiClient.startOAuth2Flow(params),
|
|
154
|
+
onError: (error) => {
|
|
155
|
+
console.error('Error starting OAuth2 flow:', getErrorMessage(error));
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function useHandleOAuth2Callback() {
|
|
161
|
+
const apiClient = useApiClient();
|
|
162
|
+
const queryClient = useQueryClient();
|
|
163
|
+
|
|
164
|
+
return useMutation({
|
|
165
|
+
mutationFn: (params: {
|
|
166
|
+
code: string;
|
|
167
|
+
state: string;
|
|
168
|
+
clientId?: string;
|
|
169
|
+
clientSecret?: string;
|
|
170
|
+
redirectUri?: string;
|
|
171
|
+
}) => apiClient.handleOAuth2Callback(params),
|
|
172
|
+
onSuccess: () => {
|
|
173
|
+
// Invalidate both the list and all individual credential queries
|
|
174
|
+
// so the detail dialog picks up the new tokens
|
|
175
|
+
queryClient.invalidateQueries({ queryKey: ['credentials'] });
|
|
176
|
+
},
|
|
177
|
+
onError: (error) => {
|
|
178
|
+
console.error('Error handling OAuth2 callback:', getErrorMessage(error));
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function useRefreshOAuth2Credential() {
|
|
184
|
+
const apiClient = useApiClient();
|
|
185
|
+
const queryClient = useQueryClient();
|
|
186
|
+
|
|
187
|
+
return useMutation({
|
|
188
|
+
mutationFn: (credentialId: string) => apiClient.refreshOAuth2Credential(credentialId),
|
|
189
|
+
onSuccess: (_, credentialId) => {
|
|
190
|
+
queryClient.invalidateQueries({ queryKey: ['credentials'] });
|
|
191
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.credential(credentialId) });
|
|
192
|
+
},
|
|
193
|
+
onError: (error) => {
|
|
194
|
+
console.error('Error refreshing OAuth2 credential:', getErrorMessage(error));
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// Execution-related React Query hooks
|
|
2
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { useApiClient } from '../contexts/ApiContext';
|
|
5
|
+
import { queryKeys, getErrorMessage } from './query-keys';
|
|
6
|
+
import { ValidationError } from './types';
|
|
7
|
+
import { type FlowRun, type FlowInputs } from '@invect/core/types';
|
|
8
|
+
|
|
9
|
+
// Execution Queries
|
|
10
|
+
// NOTE: Real-time updates are provided by useFlowRunStream (SSE).
|
|
11
|
+
// These hooks only do an initial fetch; the stream writes into the same cache keys.
|
|
12
|
+
|
|
13
|
+
export function useFlowRuns(flowId: string) {
|
|
14
|
+
const apiClient = useApiClient();
|
|
15
|
+
|
|
16
|
+
return useQuery({
|
|
17
|
+
queryKey: queryKeys.executions(flowId),
|
|
18
|
+
queryFn: () => apiClient.getFlowRunsByFlowId(flowId),
|
|
19
|
+
enabled: !!flowId,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function useFlowRun(id: string) {
|
|
24
|
+
const apiClient = useApiClient();
|
|
25
|
+
return useQuery({
|
|
26
|
+
queryKey: queryKeys.flowRun(id),
|
|
27
|
+
queryFn: () => apiClient.getFlowRun(id),
|
|
28
|
+
enabled: !!id,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function useNodeExecutions(flowRunId: string) {
|
|
33
|
+
const apiClient = useApiClient();
|
|
34
|
+
|
|
35
|
+
return useQuery({
|
|
36
|
+
queryKey: queryKeys.nodeExecutions(flowRunId),
|
|
37
|
+
queryFn: () => apiClient.getNodeExecutionsByFlowRun(flowRunId),
|
|
38
|
+
enabled: !!flowRunId,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function useLatestFlowRun(flowId: string) {
|
|
43
|
+
const { data: executionsResponse } = useFlowRuns(flowId);
|
|
44
|
+
const executions = executionsResponse?.data || [];
|
|
45
|
+
|
|
46
|
+
const latestExecution = useMemo(() => {
|
|
47
|
+
if (!executions.length) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return executions.sort(
|
|
51
|
+
(a: FlowRun, b: FlowRun) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),
|
|
52
|
+
)[0];
|
|
53
|
+
}, [executions]);
|
|
54
|
+
|
|
55
|
+
return useFlowRun(latestExecution?.id || '');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function useListFlowRuns(
|
|
59
|
+
flowId?: string,
|
|
60
|
+
status?: string,
|
|
61
|
+
page?: number,
|
|
62
|
+
limit?: number,
|
|
63
|
+
sortBy?: string,
|
|
64
|
+
sortOrder?: 'asc' | 'desc',
|
|
65
|
+
) {
|
|
66
|
+
const apiClient = useApiClient();
|
|
67
|
+
|
|
68
|
+
const filter: Record<string, string[]> = {};
|
|
69
|
+
if (flowId) {
|
|
70
|
+
filter.flowId = [flowId];
|
|
71
|
+
}
|
|
72
|
+
if (status) {
|
|
73
|
+
filter.status = [status];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const queryOptions = {
|
|
77
|
+
filter: Object.keys(filter).length > 0 ? filter : undefined,
|
|
78
|
+
pagination: page && limit ? { page, limit } : undefined,
|
|
79
|
+
sort: sortBy && sortOrder ? { sortBy: sortBy as keyof FlowRun, sortOrder } : undefined,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
return useQuery({
|
|
83
|
+
queryKey: queryKeys.allExecutions(flowId, status, page, limit, sortBy, sortOrder),
|
|
84
|
+
queryFn: () => apiClient.getAllFlowRuns(queryOptions),
|
|
85
|
+
staleTime: 1000 * 60 * 2, // 2 minutes
|
|
86
|
+
retry: (failureCount, error) => {
|
|
87
|
+
if (failureCount >= 2) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
if (error instanceof Error && error.message.includes('4')) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
return true;
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Execution Mutations
|
|
99
|
+
export function useExecuteFlow() {
|
|
100
|
+
const apiClient = useApiClient();
|
|
101
|
+
const queryClient = useQueryClient();
|
|
102
|
+
return useMutation({
|
|
103
|
+
mutationFn: ({
|
|
104
|
+
flowId,
|
|
105
|
+
inputs,
|
|
106
|
+
useBatchProcessing,
|
|
107
|
+
}: {
|
|
108
|
+
flowId: string;
|
|
109
|
+
inputs?: FlowInputs;
|
|
110
|
+
useBatchProcessing?: boolean;
|
|
111
|
+
}) =>
|
|
112
|
+
apiClient.executeFlow(flowId, inputs, {
|
|
113
|
+
version: 'latest',
|
|
114
|
+
useBatchProcessing: useBatchProcessing,
|
|
115
|
+
}),
|
|
116
|
+
onSuccess: (_, { flowId }) => {
|
|
117
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.executions(flowId) });
|
|
118
|
+
},
|
|
119
|
+
onError: (error) => {
|
|
120
|
+
console.error('Error executing flow:', getErrorMessage(error));
|
|
121
|
+
|
|
122
|
+
if (error instanceof ValidationError) {
|
|
123
|
+
console.log('🔍 Flow Execution Validation Error Details:');
|
|
124
|
+
console.log('🔍 - isValid:', error.validationResult.isValid);
|
|
125
|
+
console.log('🔍 - warnings:', error.validationResult.warnings);
|
|
126
|
+
|
|
127
|
+
if (!error.validationResult.isValid) {
|
|
128
|
+
console.log('🔍 - errors:', error.validationResult.errors);
|
|
129
|
+
|
|
130
|
+
error.validationResult.errors.forEach((validationError, index) => {
|
|
131
|
+
console.log(`🔍 Execution Error ${index + 1}:`, {
|
|
132
|
+
nodeId: validationError.nodeId,
|
|
133
|
+
message: validationError.message,
|
|
134
|
+
type: validationError.type,
|
|
135
|
+
severity: validationError.severity,
|
|
136
|
+
additionalContext: validationError.additionalContext,
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Execution Control Mutations
|
|
146
|
+
export function usePauseFlowRun() {
|
|
147
|
+
const queryClient = useQueryClient();
|
|
148
|
+
const apiClient = useApiClient();
|
|
149
|
+
return useMutation({
|
|
150
|
+
mutationFn: ({ executionId, reason }: { executionId: string; reason?: string }) =>
|
|
151
|
+
apiClient.pauseFlowRun(executionId, reason),
|
|
152
|
+
onSuccess: (_, { executionId }) => {
|
|
153
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.flowRun(executionId) });
|
|
154
|
+
},
|
|
155
|
+
onError: (error) => {
|
|
156
|
+
console.error('Failed to pause execution:', error);
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function useResumeFlowRun() {
|
|
162
|
+
const queryClient = useQueryClient();
|
|
163
|
+
const apiClient = useApiClient();
|
|
164
|
+
return useMutation({
|
|
165
|
+
mutationFn: (executionId: string) => apiClient.resumeFlowRun(executionId),
|
|
166
|
+
onSuccess: (_, executionId) => {
|
|
167
|
+
queryClient.invalidateQueries({ queryKey: ['executions'] });
|
|
168
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.flowRun(executionId) });
|
|
169
|
+
},
|
|
170
|
+
onError: (error) => {
|
|
171
|
+
console.error('Failed to resume execution:', error);
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export function useCancelFlowRun() {
|
|
177
|
+
const queryClient = useQueryClient();
|
|
178
|
+
const apiClient = useApiClient();
|
|
179
|
+
return useMutation({
|
|
180
|
+
mutationFn: (executionId: string) => apiClient.cancelFlowRun(executionId),
|
|
181
|
+
onSuccess: (_, executionId) => {
|
|
182
|
+
queryClient.invalidateQueries({ queryKey: ['executions'] });
|
|
183
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.flowRun(executionId) });
|
|
184
|
+
},
|
|
185
|
+
onError: (error) => {
|
|
186
|
+
console.error('Failed to cancel execution:', error);
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Execute Flow To Node Mutation
|
|
192
|
+
export function useExecuteFlowToNode() {
|
|
193
|
+
const apiClient = useApiClient();
|
|
194
|
+
|
|
195
|
+
return useMutation({
|
|
196
|
+
mutationFn: (params: {
|
|
197
|
+
flowId: string;
|
|
198
|
+
nodeId: string;
|
|
199
|
+
inputs?: Record<string, unknown>;
|
|
200
|
+
options?: { useBatchProcessing?: boolean };
|
|
201
|
+
}) =>
|
|
202
|
+
apiClient.executeFlowToNode(
|
|
203
|
+
params.flowId,
|
|
204
|
+
params.nodeId,
|
|
205
|
+
params.inputs || {},
|
|
206
|
+
params.options,
|
|
207
|
+
),
|
|
208
|
+
onError: (error) => {
|
|
209
|
+
console.error('Error executing flow to node:', getErrorMessage(error));
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Test Node Mutation
|
|
215
|
+
export function useTestNode() {
|
|
216
|
+
const apiClient = useApiClient();
|
|
217
|
+
|
|
218
|
+
return useMutation({
|
|
219
|
+
mutationFn: (params: {
|
|
220
|
+
nodeType: string;
|
|
221
|
+
params: Record<string, unknown>;
|
|
222
|
+
inputs: Record<string, unknown>;
|
|
223
|
+
}) => apiClient.testNode(params.nodeType, params.params, params.inputs),
|
|
224
|
+
onError: (error) => {
|
|
225
|
+
console.error('Error testing node:', getErrorMessage(error));
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// Flow-related React Query hooks
|
|
2
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
3
|
+
import { useApiClient } from '../contexts/ApiContext';
|
|
4
|
+
import { queryKeys, getErrorMessage } from './query-keys';
|
|
5
|
+
import { type ReactFlowDataOptions } from './types';
|
|
6
|
+
import {
|
|
7
|
+
type CreateFlowDto,
|
|
8
|
+
type CreateFlowVersionDto,
|
|
9
|
+
type QueryOptions,
|
|
10
|
+
type Flow,
|
|
11
|
+
type FlowVersion,
|
|
12
|
+
type ReactFlowData,
|
|
13
|
+
type InvectDefinition,
|
|
14
|
+
} from '@invect/core/types';
|
|
15
|
+
|
|
16
|
+
export function useDashboardStats() {
|
|
17
|
+
const apiClient = useApiClient();
|
|
18
|
+
|
|
19
|
+
return useQuery({
|
|
20
|
+
queryKey: queryKeys.dashboardStats,
|
|
21
|
+
queryFn: () => apiClient.getDashboardStats(),
|
|
22
|
+
staleTime: 1000 * 30, // 30 seconds
|
|
23
|
+
refetchInterval: 1000 * 60, // Refresh every minute
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function useFlows(options?: QueryOptions<Flow>) {
|
|
28
|
+
const apiClient = useApiClient();
|
|
29
|
+
|
|
30
|
+
return useQuery({
|
|
31
|
+
queryKey: [...queryKeys.flows, options],
|
|
32
|
+
queryFn: () => apiClient.getFlows(options),
|
|
33
|
+
staleTime: 1000 * 60 * 5, // 5 minutes
|
|
34
|
+
retry: (failureCount, error) => {
|
|
35
|
+
if (failureCount >= 2) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
if (error instanceof Error && error.message.includes('4')) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function useFlow(id: string) {
|
|
47
|
+
const apiClient = useApiClient();
|
|
48
|
+
|
|
49
|
+
return useQuery({
|
|
50
|
+
queryKey: queryKeys.flow(id),
|
|
51
|
+
queryFn: () => apiClient.getFlow(id),
|
|
52
|
+
enabled: !!id,
|
|
53
|
+
staleTime: 1000 * 30, // 30 seconds - reduced to ensure fresh data after mutations
|
|
54
|
+
retry: (failureCount, error) => {
|
|
55
|
+
if (failureCount >= 2) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
if (error instanceof Error && error.message.includes('4')) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function useFlowVersions(flowId: string, options?: QueryOptions<FlowVersion>) {
|
|
67
|
+
const apiClient = useApiClient();
|
|
68
|
+
|
|
69
|
+
return useQuery({
|
|
70
|
+
queryKey: [...queryKeys.flowVersions(flowId), options],
|
|
71
|
+
queryFn: () => apiClient.getFlowVersions(flowId, options),
|
|
72
|
+
enabled: !!flowId,
|
|
73
|
+
staleTime: 1000 * 30, // 30 seconds - reduced to ensure fresh data after mutations
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// React Flow Data Query
|
|
78
|
+
export function useFlowReactFlowData(
|
|
79
|
+
flowId: string,
|
|
80
|
+
options?: ReactFlowDataOptions,
|
|
81
|
+
): ReturnType<typeof useQuery<ReactFlowData, Error>> {
|
|
82
|
+
const apiClient = useApiClient();
|
|
83
|
+
|
|
84
|
+
return useQuery({
|
|
85
|
+
queryKey: queryKeys.reactFlow(flowId, options?.version, options?.flowRunId),
|
|
86
|
+
queryFn: () => apiClient.getFlowReactFlowData(flowId, options),
|
|
87
|
+
enabled: !!flowId,
|
|
88
|
+
staleTime: options?.flowRunId ? 0 : 1000 * 30,
|
|
89
|
+
retry: (failureCount, error) => {
|
|
90
|
+
if (failureCount >= 2) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
if (error instanceof Error && error.message.includes('4')) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
return true;
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Flow Mutations
|
|
102
|
+
export function useCreateFlow() {
|
|
103
|
+
const queryClient = useQueryClient();
|
|
104
|
+
const apiClient = useApiClient();
|
|
105
|
+
return useMutation({
|
|
106
|
+
mutationFn: (data: CreateFlowDto) => apiClient.createFlow(data),
|
|
107
|
+
onSuccess: () => {
|
|
108
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.flows });
|
|
109
|
+
},
|
|
110
|
+
onError: (error) => {
|
|
111
|
+
console.error('Error creating flow:', getErrorMessage(error));
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function useCreateFlowWithVersion() {
|
|
117
|
+
const queryClient = useQueryClient();
|
|
118
|
+
const apiClient = useApiClient();
|
|
119
|
+
return useMutation({
|
|
120
|
+
mutationFn: ({
|
|
121
|
+
flowDto,
|
|
122
|
+
versionDto,
|
|
123
|
+
}: {
|
|
124
|
+
flowDto: CreateFlowDto;
|
|
125
|
+
versionDto: CreateFlowVersionDto;
|
|
126
|
+
}) => apiClient.createFlowWithVersion(flowDto, versionDto),
|
|
127
|
+
onSuccess: () => {
|
|
128
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.flows });
|
|
129
|
+
},
|
|
130
|
+
onError: (error) => {
|
|
131
|
+
console.error('Error creating flow with version:', getErrorMessage(error));
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function useUpdateFlow() {
|
|
137
|
+
const queryClient = useQueryClient();
|
|
138
|
+
const apiClient = useApiClient();
|
|
139
|
+
return useMutation({
|
|
140
|
+
mutationFn: ({ id, data }: { id: string; data: Partial<CreateFlowDto> }) =>
|
|
141
|
+
apiClient.updateFlow(id, data),
|
|
142
|
+
onSuccess: (_, { id }) => {
|
|
143
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.flow(id) });
|
|
144
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.flows });
|
|
145
|
+
},
|
|
146
|
+
onError: (error) => {
|
|
147
|
+
console.error('Error updating flow:', getErrorMessage(error));
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function useDeleteFlow() {
|
|
153
|
+
const queryClient = useQueryClient();
|
|
154
|
+
const apiClient = useApiClient();
|
|
155
|
+
return useMutation({
|
|
156
|
+
mutationFn: (id: string) => apiClient.deleteFlow(id),
|
|
157
|
+
onSuccess: () => {
|
|
158
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.flows });
|
|
159
|
+
},
|
|
160
|
+
onError: (error) => {
|
|
161
|
+
console.error('Error deleting flow:', getErrorMessage(error));
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Flow Version Mutations
|
|
167
|
+
export function useCreateFlowVersion() {
|
|
168
|
+
const queryClient = useQueryClient();
|
|
169
|
+
const apiClient = useApiClient();
|
|
170
|
+
return useMutation({
|
|
171
|
+
mutationFn: ({ flowId, data }: { flowId: string; data: CreateFlowVersionDto }) =>
|
|
172
|
+
apiClient.createFlowVersion(flowId, data),
|
|
173
|
+
onSuccess: (_, { flowId }) => {
|
|
174
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.flowVersions(flowId) });
|
|
175
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.flow(flowId) });
|
|
176
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.flows });
|
|
177
|
+
},
|
|
178
|
+
onError: (error) => {
|
|
179
|
+
console.error('Error creating flow version:', getErrorMessage(error));
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export function useValidateFlow() {
|
|
185
|
+
const apiClient = useApiClient();
|
|
186
|
+
|
|
187
|
+
return useMutation({
|
|
188
|
+
mutationFn: ({ flowId, flowData }: { flowId: string; flowData: InvectDefinition }) =>
|
|
189
|
+
apiClient.validateFlow(flowId, flowData),
|
|
190
|
+
retry: false,
|
|
191
|
+
onError: (error) => {
|
|
192
|
+
console.error('Error validating flow:', getErrorMessage(error));
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
}
|
package/src/api/index.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// API layer barrel export
|
|
2
|
+
// Types
|
|
3
|
+
export * from './types';
|
|
4
|
+
|
|
5
|
+
// API Client
|
|
6
|
+
export { ApiClient } from './client';
|
|
7
|
+
|
|
8
|
+
// Query keys
|
|
9
|
+
export { queryKeys, getErrorMessage } from './query-keys';
|
|
10
|
+
|
|
11
|
+
// Domain hooks
|
|
12
|
+
export * from './flows.api';
|
|
13
|
+
export * from './executions.api';
|
|
14
|
+
export * from './credentials.api';
|
|
15
|
+
export * from './triggers.api';
|
|
16
|
+
export * from './agent-tools.api';
|
|
17
|
+
export * from './node-data.api';
|