@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.
Files changed (419) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -0
  3. package/dist/Invect-CWpIwZ5F.js +92738 -0
  4. package/dist/Invect.d.ts +25 -0
  5. package/dist/InvectShell.d.ts +14 -0
  6. package/dist/api/agent-tools.api.d.ts +1 -0
  7. package/dist/api/client.d.ts +207 -0
  8. package/dist/api/credentials.api.d.ts +47 -0
  9. package/dist/api/executions.api.d.ts +43 -0
  10. package/dist/api/flows.api.d.ts +100 -0
  11. package/dist/api/index.d.ts +9 -0
  12. package/dist/api/node-data.api.d.ts +66 -0
  13. package/dist/api/query-keys.d.ts +22 -0
  14. package/dist/api/triggers.api.d.ts +44 -0
  15. package/dist/api/types.d.ts +147 -0
  16. package/dist/api/use-flow-run-stream.d.ts +12 -0
  17. package/dist/assets/invect-branding.d.ts +4 -0
  18. package/dist/assets/provider-icons/index.d.ts +8 -0
  19. package/dist/babel-C9OtljFZ.js +9721 -0
  20. package/dist/components/PageLayout.d.ts +17 -0
  21. package/dist/components/chat/ChatInput.d.ts +17 -0
  22. package/dist/components/chat/ChatMessageList.d.ts +14 -0
  23. package/dist/components/chat/ChatModelSelector.d.ts +11 -0
  24. package/dist/components/chat/ChatPanel.d.ts +19 -0
  25. package/dist/components/chat/ChatPromptOverlay.d.ts +13 -0
  26. package/dist/components/chat/ChatProviderSelector.d.ts +9 -0
  27. package/dist/components/chat/ChatSettingsPanel.d.ts +11 -0
  28. package/dist/components/chat/InlineCredentialSetup.d.ts +9 -0
  29. package/dist/components/chat/MarkdownRenderer.d.ts +7 -0
  30. package/dist/components/chat/chat-memory.d.ts +21 -0
  31. package/dist/components/chat/chat.store.d.ts +416 -0
  32. package/dist/components/chat/index.d.ts +5 -0
  33. package/dist/components/chat/use-chat.d.ts +28 -0
  34. package/dist/components/credentials/CreateCredentialModal.d.ts +13 -0
  35. package/dist/components/credentials/CredentialDetailDialog.d.ts +17 -0
  36. package/dist/components/credentials/EditCredentialModal.d.ts +11 -0
  37. package/dist/components/credentials/OAuth2ConnectButton.d.ts +38 -0
  38. package/dist/components/credentials/OAuth2ProviderSelector.d.ts +15 -0
  39. package/dist/components/credentials/credential-utils.d.ts +12 -0
  40. package/dist/components/credentials/index.d.ts +9 -0
  41. package/dist/components/dashboard/FailedRunsAlert.d.ts +3 -0
  42. package/dist/components/dashboard/FlowCard.d.ts +7 -0
  43. package/dist/components/dashboard/RecentActivityTable.d.ts +9 -0
  44. package/dist/components/dashboard/StatCard.d.ts +10 -0
  45. package/dist/components/dashboard/index.d.ts +5 -0
  46. package/dist/components/dashboard/status-helpers.d.ts +5 -0
  47. package/dist/components/flow-editor/ActionsSidebar.d.ts +2 -0
  48. package/dist/components/flow-editor/FlowEditor.d.ts +21 -0
  49. package/dist/components/flow-editor/FlowHeader.d.ts +9 -0
  50. package/dist/components/flow-editor/FlowLayout.d.ts +24 -0
  51. package/dist/components/flow-editor/ModeSwitcher.d.ts +7 -0
  52. package/dist/components/flow-editor/NodeSidebar.d.ts +24 -0
  53. package/dist/components/flow-editor/RunControls.d.ts +12 -0
  54. package/dist/components/flow-editor/ToolConfigPanel.d.ts +16 -0
  55. package/dist/components/flow-editor/ValidationPanel.d.ts +5 -0
  56. package/dist/components/flow-editor/flow-editor.store.d.ts +1 -0
  57. package/dist/components/flow-editor/index.d.ts +6 -0
  58. package/dist/components/flow-editor/inline-edit.d.ts +10 -0
  59. package/dist/components/flow-editor/node-config-panel/ConfigFieldWithTemplate.d.ts +26 -0
  60. package/dist/components/flow-editor/node-config-panel/CredentialCombobox.d.ts +21 -0
  61. package/dist/components/flow-editor/node-config-panel/CredentialsSection.d.ts +19 -0
  62. package/dist/components/flow-editor/node-config-panel/DroppableInput.d.ts +20 -0
  63. package/dist/components/flow-editor/node-config-panel/DynamicSelectField.d.ts +22 -0
  64. package/dist/components/flow-editor/node-config-panel/JsonPreviewPanel.d.ts +25 -0
  65. package/dist/components/flow-editor/node-config-panel/NodeConfigPanel.d.ts +14 -0
  66. package/dist/components/flow-editor/node-config-panel/NodeConfigPanelHeader.d.ts +15 -0
  67. package/dist/components/flow-editor/node-config-panel/ParametersSection.d.ts +16 -0
  68. package/dist/components/flow-editor/node-config-panel/SearchableSelectField.d.ts +17 -0
  69. package/dist/components/flow-editor/node-config-panel/SwitchCasesField.d.ts +18 -0
  70. package/dist/components/flow-editor/node-config-panel/hooks/index.d.ts +2 -0
  71. package/dist/components/flow-editor/node-config-panel/hooks/use-node-config-panel-state.d.ts +24 -0
  72. package/dist/components/flow-editor/node-config-panel/hooks/use-node-execution.d.ts +46 -0
  73. package/dist/components/flow-editor/node-config-panel/hooks/use-upstream-slots.d.ts +16 -0
  74. package/dist/components/flow-editor/node-config-panel/panels/AgentToolsPanel.d.ts +18 -0
  75. package/dist/components/flow-editor/node-config-panel/panels/ConfigurationPanel.d.ts +49 -0
  76. package/dist/components/flow-editor/node-config-panel/panels/DataMapperPane.d.ts +40 -0
  77. package/dist/components/flow-editor/node-config-panel/panels/InputPanel.d.ts +49 -0
  78. package/dist/components/flow-editor/node-config-panel/panels/OutputPanel.d.ts +7 -0
  79. package/dist/components/flow-editor/node-config-panel/panels/index.d.ts +4 -0
  80. package/dist/components/flow-editor/node-config-panel/types.d.ts +19 -0
  81. package/dist/components/flow-editor/node-config-panel/use-node-config-panel-store.d.ts +49 -0
  82. package/dist/components/flow-editor/node-config-panel/use-node-config-state.d.ts +26 -0
  83. package/dist/components/flow-editor/node-config-panel/use-run-node.d.ts +16 -0
  84. package/dist/components/flow-editor/node-config-panel/utils.d.ts +9 -0
  85. package/dist/components/flow-editor/serialize-to-sdk.d.ts +20 -0
  86. package/dist/components/flow-editor/toolbar-context.d.ts +2 -0
  87. package/dist/components/flow-editor/use-copy-paste.d.ts +7 -0
  88. package/dist/components/flow-editor/use-copy-paste.types.d.ts +38 -0
  89. package/dist/components/flow-editor/use-flow-editor.d.ts +44 -0
  90. package/dist/components/flow-runs-table/FlowRunsTable.d.ts +6 -0
  91. package/dist/components/flow-runs-table/index.d.ts +1 -0
  92. package/dist/components/flow-viewer/FlowRunsView.d.ts +7 -0
  93. package/dist/components/flow-viewer/FlowStatusView.d.ts +21 -0
  94. package/dist/components/flow-viewer/RunSelector.d.ts +13 -0
  95. package/dist/components/flow-viewer/RunsSidebar.d.ts +14 -0
  96. package/dist/components/flow-viewer/agent-tool-executions-list.d.ts +7 -0
  97. package/dist/components/flow-viewer/index.d.ts +1 -0
  98. package/dist/components/flow-viewer/logs-panel.d.ts +18 -0
  99. package/dist/components/flow-viewer/use-execution-log-data.d.ts +113 -0
  100. package/dist/components/graph/BatchFlowEdge.d.ts +33 -0
  101. package/dist/components/graph/LayoutSelector.d.ts +9 -0
  102. package/dist/components/graph/index.d.ts +47 -0
  103. package/dist/components/graph/styleUtils.d.ts +124 -0
  104. package/dist/components/nodes/AgentConfigPanel.d.ts +24 -0
  105. package/dist/components/nodes/AgentNode.d.ts +8 -0
  106. package/dist/components/nodes/AgentToolsBox.d.ts +41 -0
  107. package/dist/components/nodes/NodeAppendix.d.ts +19 -0
  108. package/dist/components/nodes/NodeStatusIndicator.d.ts +30 -0
  109. package/dist/components/nodes/NodeViewContext.d.ts +18 -0
  110. package/dist/components/nodes/ToolParamField.d.ts +28 -0
  111. package/dist/components/nodes/ToolSelectorModal.d.ts +80 -0
  112. package/dist/components/nodes/ToolSelectorParts.d.ts +30 -0
  113. package/dist/components/nodes/UniversalNode.d.ts +2 -0
  114. package/dist/components/nodes/createContextAwareNodes.d.ts +6 -0
  115. package/dist/components/nodes/index.d.ts +22 -0
  116. package/dist/components/nodes/nodeRegistry.d.ts +13 -0
  117. package/dist/components/nodes/withNodeContext.d.ts +7 -0
  118. package/dist/components/shared/InvectLoader.d.ts +8 -0
  119. package/dist/components/shared/InvectLogo.d.ts +9 -0
  120. package/dist/components/shared/ProviderIcon.d.ts +23 -0
  121. package/dist/components/side-menu/side-menu.d.ts +4 -0
  122. package/dist/components/sidebar/BaseSidebar.d.ts +17 -0
  123. package/dist/components/sidebar/index.d.ts +1 -0
  124. package/dist/components/triggers/CronPreview.d.ts +12 -0
  125. package/dist/components/triggers/index.d.ts +1 -0
  126. package/dist/components/ui/alert-dialog.d.ts +18 -0
  127. package/dist/components/ui/badge.d.ts +9 -0
  128. package/dist/components/ui/button.d.ts +13 -0
  129. package/dist/components/ui/card.d.ts +9 -0
  130. package/dist/components/ui/codemirror-js-editor.d.ts +25 -0
  131. package/dist/components/ui/codemirror-json-editor.d.ts +18 -0
  132. package/dist/components/ui/codemirror-nunjucks-editor.d.ts +13 -0
  133. package/dist/components/ui/codemirror-vscode-theme.d.ts +24 -0
  134. package/dist/components/ui/collapsible.d.ts +6 -0
  135. package/dist/components/ui/command.d.ts +18 -0
  136. package/dist/components/ui/dialog.d.ts +18 -0
  137. package/dist/components/ui/dropdown-menu.d.ts +25 -0
  138. package/dist/components/ui/empty-state.d.ts +21 -0
  139. package/dist/components/ui/input.d.ts +3 -0
  140. package/dist/components/ui/label.d.ts +4 -0
  141. package/dist/components/ui/popover.d.ts +10 -0
  142. package/dist/components/ui/resizable.d.ts +8 -0
  143. package/dist/components/ui/scroll-area.d.ts +5 -0
  144. package/dist/components/ui/select.d.ts +18 -0
  145. package/dist/components/ui/separator.d.ts +4 -0
  146. package/dist/components/ui/slider.d.ts +4 -0
  147. package/dist/components/ui/switch.d.ts +3 -0
  148. package/dist/components/ui/table.d.ts +10 -0
  149. package/dist/components/ui/textarea.d.ts +3 -0
  150. package/dist/components/ui/tooltip.d.ts +7 -0
  151. package/dist/components/ui/tree-view.d.ts +107 -0
  152. package/dist/contexts/AgentToolCallbacksContext.d.ts +23 -0
  153. package/dist/contexts/ApiContext.d.ts +11 -0
  154. package/dist/contexts/FlowDataContext.d.ts +9 -0
  155. package/dist/contexts/NodeRegistryContext.d.ts +14 -0
  156. package/dist/contexts/PluginRegistryContext.d.ts +39 -0
  157. package/dist/contexts/ThemeProvider.d.ts +18 -0
  158. package/dist/contexts/ValidationContext.d.ts +22 -0
  159. package/dist/demo/DemoInvect.d.ts +11 -0
  160. package/dist/demo/FlowViewer.d.ts +31 -0
  161. package/dist/demo/demo-api-client.d.ts +33 -0
  162. package/dist/demo/index.d.ts +6 -0
  163. package/dist/demo/sample-data.d.ts +1538 -0
  164. package/dist/demo.d.ts +2 -0
  165. package/dist/demo.js +2774 -0
  166. package/dist/estree-ClbRfS-1.js +7076 -0
  167. package/dist/fonts/geist-cyrillic-wght-normal.woff2 +0 -0
  168. package/dist/fonts/geist-latin-ext-wght-normal.woff2 +0 -0
  169. package/dist/fonts/geist-latin-wght-normal.woff2 +0 -0
  170. package/dist/fonts/iosevka-latin-400-normal.woff2 +0 -0
  171. package/dist/hooks/index.d.ts +1 -0
  172. package/dist/hooks/use-document-title.d.ts +1 -0
  173. package/dist/hooks/use-flow-data.d.ts +22 -0
  174. package/dist/hooks/use-invect-portal-class.d.ts +21 -0
  175. package/dist/hooks/useFlowEditorStore.d.ts +1 -0
  176. package/dist/index.css +3 -0
  177. package/dist/index.d.ts +22 -0
  178. package/dist/index.js +717 -0
  179. package/dist/lib/utils.d.ts +2 -0
  180. package/dist/prettier.d.ts +13 -0
  181. package/dist/routes/all-flow-runs.d.ts +5 -0
  182. package/dist/routes/credentials.d.ts +5 -0
  183. package/dist/routes/flow-route-layout.d.ts +19 -0
  184. package/dist/routes/flow-runs.d.ts +5 -0
  185. package/dist/routes/flow.d.ts +5 -0
  186. package/dist/routes/home.d.ts +5 -0
  187. package/dist/services/index.d.ts +1 -0
  188. package/dist/standalone-C3Df7W52.js +3463 -0
  189. package/dist/stores/executionViewStore.d.ts +64 -0
  190. package/dist/stores/flow-editor.store.d.ts +137 -0
  191. package/dist/stores/flowEditorStore.d.ts +1 -0
  192. package/dist/stores/index.d.ts +2 -0
  193. package/dist/stores/uiStore.d.ts +45 -0
  194. package/dist/types/agent-tools.types.d.ts +53 -0
  195. package/dist/types/index.d.ts +2 -0
  196. package/dist/types/node-definition.types.d.ts +85 -0
  197. package/dist/types/plugin.types.d.ts +100 -0
  198. package/dist/utils/credentialBranding.d.ts +8 -0
  199. package/dist/utils/credentialFiltering.d.ts +20 -0
  200. package/dist/utils/flowTransformations.d.ts +16 -0
  201. package/dist/utils/layoutUtils.d.ts +23 -0
  202. package/dist/utils/nodeReferenceUtils.d.ts +37 -0
  203. package/dist/vendor.d.ts +5 -0
  204. package/package.json +130 -0
  205. package/src/.DS_Store +0 -0
  206. package/src/Invect.tsx +229 -0
  207. package/src/InvectShell.tsx +55 -0
  208. package/src/api/agent-tools.api.ts +23 -0
  209. package/src/api/client.ts +899 -0
  210. package/src/api/credentials.api.ts +197 -0
  211. package/src/api/executions.api.ts +228 -0
  212. package/src/api/flows.api.ts +195 -0
  213. package/src/api/index.ts +17 -0
  214. package/src/api/node-data.api.ts +167 -0
  215. package/src/api/query-keys.ts +44 -0
  216. package/src/api/triggers.api.ts +120 -0
  217. package/src/api/types.ts +212 -0
  218. package/src/api/use-flow-run-stream.ts +206 -0
  219. package/src/app.css +560 -0
  220. package/src/assets/.DS_Store +0 -0
  221. package/src/assets/favicon.ico +0 -0
  222. package/src/assets/fonts/geist-cyrillic-wght-normal.woff2 +0 -0
  223. package/src/assets/fonts/geist-latin-ext-wght-normal.woff2 +0 -0
  224. package/src/assets/fonts/geist-latin-wght-normal.woff2 +0 -0
  225. package/src/assets/fonts/iosevka-latin-400-normal.woff2 +0 -0
  226. package/src/assets/invect-branding.ts +51 -0
  227. package/src/assets/provider-icons/anthropic.svg +1 -0
  228. package/src/assets/provider-icons/anthropic_light.svg +1 -0
  229. package/src/assets/provider-icons/github.svg +1 -0
  230. package/src/assets/provider-icons/github_light.svg +1 -0
  231. package/src/assets/provider-icons/gmail.svg +1 -0
  232. package/src/assets/provider-icons/google_calendar.svg +1 -0
  233. package/src/assets/provider-icons/google_docs.svg +1 -0
  234. package/src/assets/provider-icons/google_drive.svg +1 -0
  235. package/src/assets/provider-icons/google_sheets.svg +1 -0
  236. package/src/assets/provider-icons/index.ts +55 -0
  237. package/src/assets/provider-icons/linear.svg +1 -0
  238. package/src/assets/provider-icons/openai.svg +1 -0
  239. package/src/assets/provider-icons/postgres.svg +1 -0
  240. package/src/assets/provider-icons/slack.svg +1 -0
  241. package/src/assets/small-loader-dark.svg +22 -0
  242. package/src/assets/small-loader-light.svg +22 -0
  243. package/src/assets/small.svg +7 -0
  244. package/src/components/.DS_Store +0 -0
  245. package/src/components/PageLayout.tsx +55 -0
  246. package/src/components/chat/ChatInput.tsx +115 -0
  247. package/src/components/chat/ChatMessageList.tsx +788 -0
  248. package/src/components/chat/ChatModelSelector.tsx +208 -0
  249. package/src/components/chat/ChatPanel.tsx +243 -0
  250. package/src/components/chat/ChatPromptOverlay.tsx +150 -0
  251. package/src/components/chat/ChatProviderSelector.tsx +135 -0
  252. package/src/components/chat/ChatSettingsPanel.tsx +277 -0
  253. package/src/components/chat/InlineCredentialSetup.tsx +343 -0
  254. package/src/components/chat/MarkdownRenderer.tsx +140 -0
  255. package/src/components/chat/chat-memory.ts +88 -0
  256. package/src/components/chat/chat.store.ts +479 -0
  257. package/src/components/chat/index.ts +5 -0
  258. package/src/components/chat/use-chat.ts +473 -0
  259. package/src/components/credentials/CreateCredentialModal.tsx +609 -0
  260. package/src/components/credentials/CredentialDetailDialog.tsx +882 -0
  261. package/src/components/credentials/EditCredentialModal.tsx +399 -0
  262. package/src/components/credentials/OAuth2ConnectButton.tsx +288 -0
  263. package/src/components/credentials/OAuth2ProviderSelector.tsx +360 -0
  264. package/src/components/credentials/credential-utils.ts +99 -0
  265. package/src/components/credentials/index.ts +10 -0
  266. package/src/components/dashboard/FailedRunsAlert.tsx +67 -0
  267. package/src/components/dashboard/FlowCard.tsx +64 -0
  268. package/src/components/dashboard/RecentActivityTable.tsx +92 -0
  269. package/src/components/dashboard/StatCard.tsx +32 -0
  270. package/src/components/dashboard/index.ts +5 -0
  271. package/src/components/dashboard/status-helpers.tsx +102 -0
  272. package/src/components/flow-editor/ActionsSidebar.tsx +503 -0
  273. package/src/components/flow-editor/FlowEditor.tsx +1002 -0
  274. package/src/components/flow-editor/FlowHeader.tsx +87 -0
  275. package/src/components/flow-editor/FlowLayout.tsx +117 -0
  276. package/src/components/flow-editor/ModeSwitcher.tsx +49 -0
  277. package/src/components/flow-editor/NodeSidebar.tsx +343 -0
  278. package/src/components/flow-editor/RunControls.tsx +109 -0
  279. package/src/components/flow-editor/ToolConfigPanel.tsx +434 -0
  280. package/src/components/flow-editor/ValidationPanel.tsx +167 -0
  281. package/src/components/flow-editor/flow-editor.store.ts +2 -0
  282. package/src/components/flow-editor/index.ts +6 -0
  283. package/src/components/flow-editor/inline-edit.tsx +111 -0
  284. package/src/components/flow-editor/node-config-panel/ConfigFieldWithTemplate.tsx +334 -0
  285. package/src/components/flow-editor/node-config-panel/CredentialCombobox.tsx +217 -0
  286. package/src/components/flow-editor/node-config-panel/CredentialsSection.tsx +154 -0
  287. package/src/components/flow-editor/node-config-panel/DroppableInput.tsx +45 -0
  288. package/src/components/flow-editor/node-config-panel/DynamicSelectField.tsx +223 -0
  289. package/src/components/flow-editor/node-config-panel/JsonPreviewPanel.tsx +134 -0
  290. package/src/components/flow-editor/node-config-panel/NodeConfigPanel.tsx +650 -0
  291. package/src/components/flow-editor/node-config-panel/NodeConfigPanelHeader.tsx +91 -0
  292. package/src/components/flow-editor/node-config-panel/ParametersSection.tsx +144 -0
  293. package/src/components/flow-editor/node-config-panel/SearchableSelectField.tsx +126 -0
  294. package/src/components/flow-editor/node-config-panel/SwitchCasesField.tsx +212 -0
  295. package/src/components/flow-editor/node-config-panel/hooks/index.ts +2 -0
  296. package/src/components/flow-editor/node-config-panel/hooks/use-node-config-panel-state.ts +284 -0
  297. package/src/components/flow-editor/node-config-panel/hooks/use-node-execution.ts +287 -0
  298. package/src/components/flow-editor/node-config-panel/hooks/use-upstream-slots.ts +310 -0
  299. package/src/components/flow-editor/node-config-panel/panels/AgentToolsPanel.tsx +837 -0
  300. package/src/components/flow-editor/node-config-panel/panels/ConfigurationPanel.tsx +383 -0
  301. package/src/components/flow-editor/node-config-panel/panels/DataMapperPane.tsx +456 -0
  302. package/src/components/flow-editor/node-config-panel/panels/InputPanel.tsx +338 -0
  303. package/src/components/flow-editor/node-config-panel/panels/OutputPanel.tsx +109 -0
  304. package/src/components/flow-editor/node-config-panel/panels/index.ts +4 -0
  305. package/src/components/flow-editor/node-config-panel/types.ts +20 -0
  306. package/src/components/flow-editor/node-config-panel/use-node-config-panel-store.ts +283 -0
  307. package/src/components/flow-editor/node-config-panel/use-node-config-state.ts +172 -0
  308. package/src/components/flow-editor/node-config-panel/use-run-node.ts +147 -0
  309. package/src/components/flow-editor/node-config-panel/utils.ts +73 -0
  310. package/src/components/flow-editor/serialize-to-sdk.ts +204 -0
  311. package/src/components/flow-editor/toolbar-context.ts +9 -0
  312. package/src/components/flow-editor/use-copy-paste.ts +575 -0
  313. package/src/components/flow-editor/use-copy-paste.types.ts +35 -0
  314. package/src/components/flow-editor/use-flow-editor.ts +241 -0
  315. package/src/components/flow-runs-table/FlowRunsTable.tsx +631 -0
  316. package/src/components/flow-runs-table/index.ts +1 -0
  317. package/src/components/flow-viewer/FlowRunsView.tsx +268 -0
  318. package/src/components/flow-viewer/FlowStatusView.tsx +351 -0
  319. package/src/components/flow-viewer/RunSelector.tsx +422 -0
  320. package/src/components/flow-viewer/RunsSidebar.tsx +125 -0
  321. package/src/components/flow-viewer/agent-tool-executions-list.tsx +298 -0
  322. package/src/components/flow-viewer/index.ts +1 -0
  323. package/src/components/flow-viewer/logs-panel.tsx +567 -0
  324. package/src/components/flow-viewer/use-execution-log-data.ts +374 -0
  325. package/src/components/graph/BatchFlowEdge.tsx +229 -0
  326. package/src/components/graph/LayoutSelector.tsx +42 -0
  327. package/src/components/graph/index.ts +61 -0
  328. package/src/components/graph/styleUtils.ts +375 -0
  329. package/src/components/nodes/.DS_Store +0 -0
  330. package/src/components/nodes/AgentConfigPanel.tsx +1033 -0
  331. package/src/components/nodes/AgentNode.tsx +298 -0
  332. package/src/components/nodes/AgentToolsBox.tsx +193 -0
  333. package/src/components/nodes/NodeAppendix.tsx +98 -0
  334. package/src/components/nodes/NodeStatusIndicator.tsx +74 -0
  335. package/src/components/nodes/NodeViewContext.tsx +45 -0
  336. package/src/components/nodes/ToolParamField.tsx +282 -0
  337. package/src/components/nodes/ToolSelectorModal.tsx +648 -0
  338. package/src/components/nodes/ToolSelectorParts.tsx +505 -0
  339. package/src/components/nodes/UniversalNode.tsx +356 -0
  340. package/src/components/nodes/createContextAwareNodes.ts +19 -0
  341. package/src/components/nodes/index.ts +45 -0
  342. package/src/components/nodes/nodeRegistry.ts +50 -0
  343. package/src/components/nodes/withNodeContext.tsx +55 -0
  344. package/src/components/shared/InvectLoader.tsx +59 -0
  345. package/src/components/shared/InvectLogo.tsx +59 -0
  346. package/src/components/shared/ProviderIcon.tsx +115 -0
  347. package/src/components/side-menu/side-menu.tsx +267 -0
  348. package/src/components/sidebar/BaseSidebar.tsx +148 -0
  349. package/src/components/sidebar/index.ts +1 -0
  350. package/src/components/triggers/CronPreview.tsx +243 -0
  351. package/src/components/triggers/index.ts +1 -0
  352. package/src/components/ui/alert-dialog.tsx +152 -0
  353. package/src/components/ui/badge.tsx +39 -0
  354. package/src/components/ui/button.tsx +58 -0
  355. package/src/components/ui/card.tsx +75 -0
  356. package/src/components/ui/codemirror-js-editor.tsx +432 -0
  357. package/src/components/ui/codemirror-json-editor.tsx +816 -0
  358. package/src/components/ui/codemirror-nunjucks-editor.tsx +451 -0
  359. package/src/components/ui/codemirror-vscode-theme.ts +243 -0
  360. package/src/components/ui/collapsible.tsx +12 -0
  361. package/src/components/ui/command.tsx +162 -0
  362. package/src/components/ui/dialog.tsx +140 -0
  363. package/src/components/ui/dropdown-menu.tsx +232 -0
  364. package/src/components/ui/empty-state.tsx +93 -0
  365. package/src/components/ui/input.tsx +26 -0
  366. package/src/components/ui/label.tsx +19 -0
  367. package/src/components/ui/popover.tsx +53 -0
  368. package/src/components/ui/resizable.tsx +61 -0
  369. package/src/components/ui/scroll-area.tsx +56 -0
  370. package/src/components/ui/select.tsx +179 -0
  371. package/src/components/ui/separator.tsx +26 -0
  372. package/src/components/ui/slider.tsx +58 -0
  373. package/src/components/ui/switch.tsx +22 -0
  374. package/src/components/ui/table.tsx +90 -0
  375. package/src/components/ui/textarea.tsx +23 -0
  376. package/src/components/ui/tooltip.tsx +54 -0
  377. package/src/components/ui/tree-view.tsx +574 -0
  378. package/src/contexts/AgentToolCallbacksContext.tsx +31 -0
  379. package/src/contexts/ApiContext.tsx +51 -0
  380. package/src/contexts/FlowDataContext.tsx +21 -0
  381. package/src/contexts/NodeRegistryContext.tsx +54 -0
  382. package/src/contexts/PluginRegistryContext.tsx +182 -0
  383. package/src/contexts/ThemeProvider.tsx +106 -0
  384. package/src/contexts/ValidationContext.tsx +122 -0
  385. package/src/demo/DemoInvect.tsx +42 -0
  386. package/src/demo/FlowViewer.tsx +294 -0
  387. package/src/demo/demo-api-client.ts +246 -0
  388. package/src/demo/index.ts +28 -0
  389. package/src/demo/sample-data.ts +1980 -0
  390. package/src/hooks/index.ts +1 -0
  391. package/src/hooks/use-document-title.ts +8 -0
  392. package/src/hooks/use-flow-data.ts +144 -0
  393. package/src/hooks/use-invect-portal-class.ts +27 -0
  394. package/src/hooks/useFlowEditorStore.ts +2 -0
  395. package/src/index.ts +70 -0
  396. package/src/lib/utils.ts +6 -0
  397. package/src/prettier.d.ts +13 -0
  398. package/src/routes/all-flow-runs.tsx +27 -0
  399. package/src/routes/credentials.tsx +362 -0
  400. package/src/routes/flow-route-layout.tsx +113 -0
  401. package/src/routes/flow-runs.tsx +22 -0
  402. package/src/routes/flow.tsx +22 -0
  403. package/src/routes/home.tsx +282 -0
  404. package/src/services/index.ts +6 -0
  405. package/src/stores/executionViewStore.ts +211 -0
  406. package/src/stores/flow-editor.store.ts +738 -0
  407. package/src/stores/flowEditorStore.ts +2 -0
  408. package/src/stores/index.ts +10 -0
  409. package/src/stores/uiStore.ts +189 -0
  410. package/src/types/agent-tools.types.ts +64 -0
  411. package/src/types/index.ts +5 -0
  412. package/src/types/node-definition.types.ts +104 -0
  413. package/src/types/plugin.types.ts +123 -0
  414. package/src/utils/credentialBranding.ts +116 -0
  415. package/src/utils/credentialFiltering.ts +68 -0
  416. package/src/utils/flowTransformations.ts +137 -0
  417. package/src/utils/layoutUtils.ts +127 -0
  418. package/src/utils/nodeReferenceUtils.ts +135 -0
  419. package/src/vendor.d.ts +7 -0
@@ -0,0 +1,2 @@
1
+ // Re-export from canonical location for backwards compatibility
2
+ export * from '../components/flow-editor/flow-editor.store';
@@ -0,0 +1,10 @@
1
+ // Zustand stores for Invect frontend state management
2
+ //
3
+ // Architecture:
4
+ // - React Query: Server state (API data, caching, sync)
5
+ // - Zustand: Client state (UI state, selections, local mutations before save)
6
+ //
7
+ // Key principle: Never duplicate server state in Zustand
8
+
9
+ export * from './uiStore';
10
+ export * from './executionViewStore';
@@ -0,0 +1,189 @@
1
+ import { create, type StoreApi, type UseBoundStore } from 'zustand';
2
+ import { devtools, persist } from 'zustand/middleware';
3
+ import { immer } from 'zustand/middleware/immer';
4
+
5
+ export type ModalType =
6
+ | 'createFlow'
7
+ | 'createCredential'
8
+ | 'editCredential'
9
+ | 'confirm'
10
+ | 'executeFlow'
11
+ | 'deleteConfirm'
12
+ | null;
13
+
14
+ export type SidebarTab = 'nodes' | 'settings' | 'history';
15
+
16
+ interface UIState {
17
+ // Sidebar
18
+ sidebarCollapsed: boolean;
19
+ activeSidebarTab: SidebarTab;
20
+
21
+ // Modals
22
+ activeModal: ModalType;
23
+ modalData: Record<string, unknown>;
24
+
25
+ // Panels
26
+ validationPanelOpen: boolean;
27
+ logsPanelOpen: boolean;
28
+
29
+ // Node sidebar (for adding nodes)
30
+ nodeSidebarOpen: boolean;
31
+
32
+ // Bottom toolbar
33
+ toolbarCollapsed: boolean;
34
+ }
35
+
36
+ interface UIActions {
37
+ // Sidebar
38
+ toggleSidebar: () => void;
39
+ setSidebarCollapsed: (collapsed: boolean) => void;
40
+ setSidebarTab: (tab: SidebarTab) => void;
41
+
42
+ // Modals
43
+ openModal: (modal: NonNullable<ModalType>, data?: Record<string, unknown>) => void;
44
+ closeModal: () => void;
45
+ setModalData: (data: Record<string, unknown>) => void;
46
+
47
+ // Panels
48
+ toggleValidationPanel: () => void;
49
+ setValidationPanelOpen: (open: boolean) => void;
50
+ toggleLogsPanel: () => void;
51
+ setLogsPanelOpen: (open: boolean) => void;
52
+
53
+ // Node sidebar
54
+ toggleNodeSidebar: () => void;
55
+ setNodeSidebarOpen: (open: boolean) => void;
56
+
57
+ // Bottom toolbar
58
+ toggleToolbarCollapsed: () => void;
59
+
60
+ // Reset
61
+ reset: () => void;
62
+ }
63
+
64
+ export type UIStore = UIState & UIActions;
65
+
66
+ const initialState: UIState = {
67
+ sidebarCollapsed: false,
68
+ activeSidebarTab: 'nodes',
69
+ activeModal: null,
70
+ modalData: {},
71
+ validationPanelOpen: false,
72
+ logsPanelOpen: false,
73
+ nodeSidebarOpen: true,
74
+ toolbarCollapsed: false,
75
+ };
76
+
77
+ export const useUIStore: UseBoundStore<StoreApi<UIStore>> = create<UIStore>()(
78
+ devtools(
79
+ persist(
80
+ immer((set) => ({
81
+ ...initialState,
82
+
83
+ // Sidebar
84
+ toggleSidebar: () =>
85
+ set((state) => {
86
+ state.sidebarCollapsed = !state.sidebarCollapsed;
87
+ }),
88
+
89
+ setSidebarCollapsed: (collapsed) =>
90
+ set((state) => {
91
+ state.sidebarCollapsed = collapsed;
92
+ }),
93
+
94
+ setSidebarTab: (tab) =>
95
+ set((state) => {
96
+ state.activeSidebarTab = tab;
97
+ }),
98
+
99
+ // Modals
100
+ openModal: (modal, data = {}) =>
101
+ set((state) => {
102
+ state.activeModal = modal;
103
+ state.modalData = data;
104
+ }),
105
+
106
+ closeModal: () =>
107
+ set((state) => {
108
+ state.activeModal = null;
109
+ state.modalData = {};
110
+ }),
111
+
112
+ setModalData: (data) =>
113
+ set((state) => {
114
+ state.modalData = { ...state.modalData, ...data };
115
+ }),
116
+
117
+ // Panels
118
+ toggleValidationPanel: () =>
119
+ set((state) => {
120
+ state.validationPanelOpen = !state.validationPanelOpen;
121
+ }),
122
+
123
+ setValidationPanelOpen: (open) =>
124
+ set((state) => {
125
+ state.validationPanelOpen = open;
126
+ }),
127
+
128
+ toggleLogsPanel: () =>
129
+ set((state) => {
130
+ state.logsPanelOpen = !state.logsPanelOpen;
131
+ }),
132
+
133
+ setLogsPanelOpen: (open) =>
134
+ set((state) => {
135
+ state.logsPanelOpen = open;
136
+ }),
137
+
138
+ // Node sidebar
139
+ toggleNodeSidebar: () =>
140
+ set((state) => {
141
+ state.nodeSidebarOpen = !state.nodeSidebarOpen;
142
+ }),
143
+
144
+ setNodeSidebarOpen: (open) =>
145
+ set((state) => {
146
+ state.nodeSidebarOpen = open;
147
+ }),
148
+
149
+ // Bottom toolbar
150
+ toggleToolbarCollapsed: () =>
151
+ set((state) => {
152
+ state.toolbarCollapsed = !state.toolbarCollapsed;
153
+ }),
154
+
155
+ // Reset
156
+ reset: () => set(() => ({ ...initialState })),
157
+ })),
158
+ {
159
+ name: 'invect-ui',
160
+ // Only persist certain fields
161
+ partialize: (state) => ({
162
+ sidebarCollapsed: state.sidebarCollapsed,
163
+ activeSidebarTab: state.activeSidebarTab,
164
+ nodeSidebarOpen: state.nodeSidebarOpen,
165
+ toolbarCollapsed: state.toolbarCollapsed,
166
+ }),
167
+ },
168
+ ),
169
+ { name: 'ui' },
170
+ ),
171
+ );
172
+
173
+ // Selector hooks
174
+ export const useSidebarCollapsed = () => useUIStore((s) => s.sidebarCollapsed);
175
+ export const useActiveSidebarTab = () => useUIStore((s) => s.activeSidebarTab);
176
+ export const useActiveModal = () => useUIStore((s) => s.activeModal);
177
+ export const useModalData = () => useUIStore((s) => s.modalData);
178
+ export const useValidationPanelOpen = () => useUIStore((s) => s.validationPanelOpen);
179
+ export const useLogsPanelOpen = () => useUIStore((s) => s.logsPanelOpen);
180
+ export const useNodeSidebarOpen = () => useUIStore((s) => s.nodeSidebarOpen);
181
+
182
+ // Combined selectors
183
+ export const useModals = () =>
184
+ useUIStore((s) => ({
185
+ activeModal: s.activeModal,
186
+ modalData: s.modalData,
187
+ openModal: s.openModal,
188
+ closeModal: s.closeModal,
189
+ }));
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Agent Tool Types for Frontend
3
+ *
4
+ * Types for displaying and managing agent tools in the UI.
5
+ * These align with AgentToolDefinition from @invect/core.
6
+ */
7
+
8
+ import type { AppendixPosition } from '../components/nodes/NodeAppendix';
9
+
10
+ /**
11
+ * Tool category for organization in UI
12
+ * Matches AgentToolCategory from @invect/core
13
+ */
14
+ export type ToolCategory = 'data' | 'web' | 'code' | 'utility' | 'custom';
15
+
16
+ /**
17
+ * Simplified tool definition for display in the UI
18
+ * Matches the essential fields from AgentToolDefinition in core
19
+ */
20
+ export interface AgentToolDisplay {
21
+ /** Unique tool identifier (snake_case) */
22
+ id: string;
23
+ /** Human-readable name */
24
+ name: string;
25
+ /** Tool category for organization and styling */
26
+ category: ToolCategory;
27
+ /** Description (optional for display, shown in tooltips) */
28
+ description?: string;
29
+ }
30
+
31
+ /**
32
+ * Convert from backend AgentToolDefinition to frontend display format
33
+ * This is a utility type - the actual conversion is done in components
34
+ */
35
+ export type AgentToolDefinitionToDisplay<
36
+ T extends { id: string; name: string; category: ToolCategory; description?: string },
37
+ > = Pick<T, 'id' | 'name' | 'category' | 'description'>;
38
+
39
+ /**
40
+ * Agent node data extensions for tools
41
+ */
42
+ export interface AgentNodeToolsData {
43
+ /** Resolved tools for display (populated by frontend from API) */
44
+ tools?: AgentToolDisplay[];
45
+ /** Position of the tools appendix */
46
+ toolsPosition?: AppendixPosition;
47
+ }
48
+
49
+ /**
50
+ * Event handlers for agent tool interactions
51
+ */
52
+ export interface AgentToolHandlers {
53
+ /** Called when user clicks "Add Tool" button */
54
+ onAddTool?: () => void;
55
+ /** Called when user clicks on a tool (to configure it) */
56
+ onToolClick?: (tool: AgentToolDisplay) => void;
57
+ /** Called when user clicks remove button on a tool */
58
+ onRemoveTool?: (toolId: string) => void;
59
+ /** Called when user changes the tools appendix position */
60
+ onToolsPositionChange?: (position: AppendixPosition) => void;
61
+ }
62
+
63
+ // Re-export for convenience
64
+ export type { AppendixPosition };
@@ -0,0 +1,5 @@
1
+ // Node definition types - export from the more complete one
2
+ export * from './node-definition.types';
3
+
4
+ // Agent tool types for UI
5
+ export * from './agent-tools.types';
@@ -0,0 +1,104 @@
1
+ export interface NodeHandleDefinition {
2
+ id: string;
3
+ label: string;
4
+ type: string; // e.g., "string", "object", "any"
5
+ required?: boolean;
6
+ description?: string;
7
+ }
8
+
9
+ export interface NodeParamField {
10
+ name: string;
11
+ label: string;
12
+ type:
13
+ | 'text'
14
+ | 'textarea'
15
+ | 'select'
16
+ | 'number'
17
+ | 'boolean'
18
+ | 'json'
19
+ | 'code'
20
+ | 'credential'
21
+ | 'switch-cases';
22
+ description?: string;
23
+ placeholder?: string;
24
+ defaultValue?: unknown;
25
+ options?: { label: string; value: string | number; description?: string }[]; // For select
26
+ required?: boolean;
27
+ hidden?: boolean; // For internal params
28
+ disabled?: boolean;
29
+ extended?: boolean; // If true, field is shown in "More Options" collapsed section
30
+
31
+ // Credential field options (only used when type="credential")
32
+ credentialTypes?: ('oauth2' | 'api_key' | 'basic_auth' | 'database' | 'llm')[]; // Filter credentials by auth type or credential type
33
+ oauth2Providers?: string[]; // Filter OAuth2 credentials by provider ID (e.g., "google")
34
+ requiredScopes?: string[]; // OAuth2 scopes this node needs (used instead of provider defaults)
35
+
36
+ // Dynamic option loading metadata (serialised from action's loadOptions config)
37
+ /** When present, this field's options should be loaded from the server. */
38
+ loadOptions?: {
39
+ /** Sibling field names that trigger a reload when they change. */
40
+ dependsOn: string[];
41
+ };
42
+ }
43
+
44
+ export interface NodeDefinition {
45
+ /**
46
+ * Node type identifier. Can be a GraphNodeType enum value (e.g. "MODEL")
47
+ * or a provider action ID (e.g. "gmail.list_messages").
48
+ */
49
+ type: string;
50
+ label: string;
51
+ description: string;
52
+ icon?: string; // Icon name
53
+
54
+ /**
55
+ * Provider info for grouping in the node palette.
56
+ * Actions populate this from their ProviderDef; legacy nodes may leave it undefined.
57
+ */
58
+ provider?: {
59
+ id: string;
60
+ name: string;
61
+ icon?: string;
62
+ /** Raw SVG markup for custom provider branding. Takes precedence over `icon`. */
63
+ svgIcon?: string;
64
+ };
65
+
66
+ /**
67
+ * Single unified input handle definition. Undefined when the node does not accept inbound edges (e.g. Flow Input node).
68
+ */
69
+ input?: NodeHandleDefinition;
70
+
71
+ /**
72
+ * Fixed output handles.
73
+ * For nodes with `dynamicOutputs`, these are placeholders —
74
+ * the frontend derives actual handles from the node's params.
75
+ */
76
+ outputs: NodeHandleDefinition[];
77
+
78
+ /**
79
+ * When true, output handles are derived from the node's params at render
80
+ * time (e.g. switch node cases) instead of using the static `outputs` array.
81
+ */
82
+ dynamicOutputs?: boolean;
83
+
84
+ /**
85
+ * Configuration fields for the node (displayed in the sidebar/form).
86
+ */
87
+ paramFields: NodeParamField[];
88
+
89
+ /**
90
+ * Default values for parameters.
91
+ */
92
+ defaultParams?: Record<string, unknown>;
93
+
94
+ /**
95
+ * Maximum number of instances of this node type allowed per flow.
96
+ * Undefined = unlimited.
97
+ */
98
+ maxInstances?: number;
99
+
100
+ /**
101
+ * When true, hide this node from the palette (deprecated but still executable).
102
+ */
103
+ hidden?: boolean;
104
+ }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Frontend Plugin Types
3
+ *
4
+ * Defines the extension points that frontend plugins can contribute to.
5
+ * These types are consumed by the PluginRegistryContext and the Invect
6
+ * component to render plugin-contributed UI elements.
7
+ */
8
+
9
+ import type { ComponentType, ReactNode } from 'react';
10
+
11
+ // ─────────────────────────────────────────────────────────────
12
+ // Frontend Plugin Interface
13
+ // ─────────────────────────────────────────────────────────────
14
+
15
+ /**
16
+ * A frontend plugin that contributes UI to the Invect application.
17
+ * Plugins are registered via `<Invect plugins={[myPlugin]} />`.
18
+ */
19
+ export interface InvectFrontendPlugin {
20
+ /** Unique plugin ID — should match backend plugin ID for manifest resolution */
21
+ id: string;
22
+
23
+ /** Display name */
24
+ name?: string;
25
+
26
+ /** Add items to the sidebar navigation */
27
+ sidebar?: PluginSidebarContribution[];
28
+
29
+ /**
30
+ * Component rendered at the very bottom of the sidebar.
31
+ * Receives `collapsed` and `basePath` props to adapt layout and build links.
32
+ * Typically used for user avatar / profile link.
33
+ * Only the first plugin that provides this wins.
34
+ */
35
+ sidebarFooter?: ComponentType<{ collapsed: boolean; basePath: string }>;
36
+
37
+ /** Add top-level routes (pages) */
38
+ routes?: PluginRouteContribution[];
39
+
40
+ /** Add tabs to contextual panels (flow editor right panel, etc.) */
41
+ panelTabs?: PluginPanelTabContribution[];
42
+
43
+ /** Add action buttons/components to contextual headers */
44
+ headerActions?: PluginHeaderActionContribution[];
45
+
46
+ /**
47
+ * Named component implementations — resolved from backend componentIds.
48
+ * Key = componentId (e.g. 'rbac.FlowAccessPanel'), value = React component.
49
+ */
50
+ components?: Record<string, ComponentType<Record<string, unknown>>>;
51
+
52
+ /** Wrap the React tree with additional providers (auth context, etc.) */
53
+ providers?: ComponentType<{ children: ReactNode }>[];
54
+
55
+ /**
56
+ * Inject headers into every API request.
57
+ * Called before each request. Return headers to merge.
58
+ */
59
+ apiHeaders?: () => Record<string, string> | Promise<Record<string, string>>;
60
+
61
+ /**
62
+ * Check if the current user has a specific permission.
63
+ * Returns true/false to override, or undefined to defer to default.
64
+ */
65
+ checkPermission?: (permission: string, context?: PermissionContext) => boolean | undefined;
66
+ }
67
+
68
+ // ─────────────────────────────────────────────────────────────
69
+ // Contribution Types
70
+ // ─────────────────────────────────────────────────────────────
71
+
72
+ export interface PluginSidebarContribution {
73
+ label: string;
74
+ icon: ComponentType<{ className?: string }>;
75
+ path: string;
76
+ /** Badge text or function returning badge text */
77
+ badge?: string | (() => string | undefined);
78
+ /** Position hint: 'top' (after defaults), 'bottom' (before theme toggle) */
79
+ position?: 'top' | 'bottom';
80
+ /** Required permission — item hidden if check fails */
81
+ permission?: string;
82
+ }
83
+
84
+ export interface PluginRouteContribution {
85
+ path: string;
86
+ component: ComponentType<{ basePath: string }>;
87
+ /** If true, route is nested under the flow layout */
88
+ flowScoped?: boolean;
89
+ }
90
+
91
+ export interface PluginPanelTabContribution {
92
+ /** Where the tab appears */
93
+ context: 'flowEditor' | 'nodeConfig';
94
+ label: string;
95
+ icon?: ComponentType<{ className?: string }>;
96
+ component: ComponentType<PanelTabProps>;
97
+ /** Required permission — tab hidden if check fails */
98
+ permission?: string;
99
+ }
100
+
101
+ export interface PluginHeaderActionContribution {
102
+ /** Where the action appears */
103
+ context: 'flowHeader' | 'flowList';
104
+ component: ComponentType<HeaderActionProps>;
105
+ /** Required permission — action hidden if check fails */
106
+ permission?: string;
107
+ }
108
+
109
+ export interface PanelTabProps {
110
+ flowId: string;
111
+ basePath: string;
112
+ }
113
+
114
+ export interface HeaderActionProps {
115
+ flowId?: string;
116
+ basePath: string;
117
+ }
118
+
119
+ export interface PermissionContext {
120
+ resourceType?: string;
121
+ resourceId?: string;
122
+ flowId?: string;
123
+ }
@@ -0,0 +1,116 @@
1
+ import type { Credential } from '../api/types';
2
+
3
+ const OAUTH2_TO_ICON_ID: Record<string, string> = {
4
+ google: 'google',
5
+ microsoft: 'microsoft',
6
+ github: 'github',
7
+ slack: 'slack',
8
+ linear: 'linear',
9
+ };
10
+
11
+ const NAME_HINTS: Array<[RegExp, string, string]> = [
12
+ [/openai|gpt/i, 'openai', 'Zap'],
13
+ [/anthropic|claude/i, 'anthropic', 'Zap'],
14
+ [/openrouter/i, 'openrouter', 'Bot'],
15
+ [/gmail/i, 'google', 'Mail'],
16
+ [/github/i, 'github', 'Github'],
17
+ [/slack/i, 'slack', 'MessageSquare'],
18
+ [/linear/i, 'linear', 'CheckSquare'],
19
+ [/google/i, 'google', 'Globe'],
20
+ [/postgres/i, 'postgres', 'Database'],
21
+ ];
22
+
23
+ const URL_HINTS: Array<[RegExp, string, string]> = [
24
+ [/openai/i, 'openai', 'Zap'],
25
+ [/anthropic/i, 'anthropic', 'Zap'],
26
+ [/openrouter/i, 'openrouter', 'Bot'],
27
+ [/github/i, 'github', 'Github'],
28
+ [/slack/i, 'slack', 'MessageSquare'],
29
+ ];
30
+
31
+ export interface CredentialBranding {
32
+ providerId?: string;
33
+ icon: string;
34
+ providerLabel: string | null;
35
+ }
36
+
37
+ function toTitleCase(value: string): string {
38
+ return value.replace(/_/g, ' ').replace(/\b\w/g, (char) => char.toUpperCase());
39
+ }
40
+
41
+ function getConfiguredProvider(credential: Credential): string | null {
42
+ const provider =
43
+ (credential.config?.oauth2Provider as string | undefined) ??
44
+ (credential.metadata?.provider as string | undefined) ??
45
+ (credential.config?.provider as string | undefined) ??
46
+ null;
47
+
48
+ return provider?.trim() || null;
49
+ }
50
+
51
+ function getProviderFromUrls(credential: Credential): { providerId: string; icon: string } | null {
52
+ const urlCandidates = [
53
+ credential.config?.apiUrl,
54
+ credential.config?.baseUrl,
55
+ credential.config?.endpoint,
56
+ credential.metadata?.apiUrl,
57
+ ];
58
+
59
+ for (const candidate of urlCandidates) {
60
+ if (typeof candidate !== 'string' || candidate.length === 0) {
61
+ continue;
62
+ }
63
+
64
+ for (const [pattern, providerId, icon] of URL_HINTS) {
65
+ if (pattern.test(candidate)) {
66
+ return { providerId, icon };
67
+ }
68
+ }
69
+ }
70
+
71
+ return null;
72
+ }
73
+
74
+ export function getCredentialBranding(credential: Credential): CredentialBranding {
75
+ const configuredProvider = getConfiguredProvider(credential);
76
+ if (configuredProvider) {
77
+ const providerId = OAUTH2_TO_ICON_ID[configuredProvider] ?? configuredProvider.toLowerCase();
78
+ return {
79
+ providerId,
80
+ icon: credential.authType === 'oauth2' ? 'Key' : credential.type === 'llm' ? 'Bot' : 'Key',
81
+ providerLabel: toTitleCase(configuredProvider),
82
+ };
83
+ }
84
+
85
+ for (const [pattern, providerId, icon] of NAME_HINTS) {
86
+ if (pattern.test(credential.name)) {
87
+ return {
88
+ providerId,
89
+ icon,
90
+ providerLabel: toTitleCase(providerId),
91
+ };
92
+ }
93
+ }
94
+
95
+ const urlProvider = getProviderFromUrls(credential);
96
+ if (urlProvider) {
97
+ return {
98
+ providerId: urlProvider.providerId,
99
+ icon: urlProvider.icon,
100
+ providerLabel: toTitleCase(urlProvider.providerId),
101
+ };
102
+ }
103
+
104
+ if (credential.type === 'database') {
105
+ return { icon: 'Database', providerLabel: null };
106
+ }
107
+ if (credential.type === 'llm') {
108
+ return { icon: 'Bot', providerLabel: null };
109
+ }
110
+
111
+ return { icon: 'Key', providerLabel: null };
112
+ }
113
+
114
+ export function getCredentialProviderLabel(credential: Credential): string | null {
115
+ return getCredentialBranding(credential).providerLabel;
116
+ }
@@ -0,0 +1,68 @@
1
+ import type { Credential } from '../api/types';
2
+
3
+ interface CredentialFieldHints {
4
+ /** OAuth2 provider IDs to match (e.g., ["google"]) */
5
+ oauth2Providers?: string[];
6
+ /** Credential types to match (e.g., ["oauth2", "api_key"]) */
7
+ credentialTypes?: string[];
8
+ }
9
+
10
+ /**
11
+ * Filter a list of credentials to those relevant for a specific credential field.
12
+ *
13
+ * Matching rules:
14
+ * 1. If the field specifies `oauth2Providers`, show credentials whose
15
+ * `metadata.oauth2Provider` matches **plus** any non-OAuth2 credentials
16
+ * (apiKey, bearer, etc.) that could serve as manual API key fallbacks.
17
+ * 2. If the field specifies `credentialTypes` (without oauth2Providers),
18
+ * filter by `authType`.
19
+ * 3. If neither is specified, return all credentials (no filtering).
20
+ */
21
+ export function filterCredentialsForField(
22
+ credentials: Credential[],
23
+ field: CredentialFieldHints,
24
+ ): Credential[] {
25
+ // No filtering hints → show everything
26
+ if (
27
+ (!field.oauth2Providers || field.oauth2Providers.length === 0) &&
28
+ (!field.credentialTypes || field.credentialTypes.length === 0)
29
+ ) {
30
+ return credentials;
31
+ }
32
+
33
+ // OAuth2 provider filtering (primary case for integration nodes)
34
+ if (field.oauth2Providers && field.oauth2Providers.length > 0) {
35
+ const providers = field.oauth2Providers;
36
+ return credentials.filter((cred) => {
37
+ // Match by OAuth2 provider stored in metadata or config
38
+ const credProvider =
39
+ (cred.metadata?.oauth2Provider as string | undefined) ??
40
+ (cred.config?.oauth2Provider as string | undefined) ??
41
+ (cred.metadata?.provider as string | undefined);
42
+ if (credProvider && providers.includes(credProvider)) {
43
+ return true;
44
+ }
45
+
46
+ // Also include non-OAuth2 credentials (manual API keys, bearer tokens)
47
+ // as they might be custom credentials for the same service
48
+ if (cred.authType !== 'oauth2') {
49
+ return true;
50
+ }
51
+
52
+ // Exclude OAuth2 credentials from other providers
53
+ return false;
54
+ });
55
+ }
56
+
57
+ // Credential type filtering (e.g., ["llm"], ["database"], ["api_key"])
58
+ // Checks both the credential's `type` (CredentialType: 'llm', 'http-api', 'database')
59
+ // and `authType` (CredentialAuthType: 'apiKey', 'bearer', 'oauth2', etc.)
60
+ if (field.credentialTypes && field.credentialTypes.length > 0) {
61
+ const types = field.credentialTypes;
62
+ return credentials.filter((cred) => {
63
+ return types.includes(cred.type) || types.includes(cred.authType);
64
+ });
65
+ }
66
+
67
+ return credentials;
68
+ }