@flowdrop/flowdrop 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/README.md +50 -50
  2. package/dist/adapters/WorkflowAdapter.d.ts +1 -1
  3. package/dist/adapters/WorkflowAdapter.js +25 -25
  4. package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +2 -2
  5. package/dist/adapters/agentspec/AgentSpecAdapter.js +133 -122
  6. package/dist/adapters/agentspec/agentAdapter.d.ts +2 -2
  7. package/dist/adapters/agentspec/agentAdapter.js +10 -10
  8. package/dist/adapters/agentspec/autoLayout.d.ts +1 -1
  9. package/dist/adapters/agentspec/autoLayout.js +2 -2
  10. package/dist/adapters/agentspec/componentTypeDefaults.d.ts +1 -1
  11. package/dist/adapters/agentspec/componentTypeDefaults.js +120 -120
  12. package/dist/adapters/agentspec/defaultNodeTypes.d.ts +2 -2
  13. package/dist/adapters/agentspec/defaultNodeTypes.js +307 -307
  14. package/dist/adapters/agentspec/index.d.ts +10 -10
  15. package/dist/adapters/agentspec/index.js +6 -6
  16. package/dist/adapters/agentspec/validator.d.ts +2 -2
  17. package/dist/adapters/agentspec/validator.js +22 -20
  18. package/dist/api/enhanced-client.d.ts +3 -3
  19. package/dist/api/enhanced-client.js +73 -72
  20. package/dist/components/App.svelte +1081 -961
  21. package/dist/components/App.svelte.d.ts +9 -6
  22. package/dist/components/CanvasBanner.stories.svelte +23 -20
  23. package/dist/components/CanvasBanner.stories.svelte.d.ts +1 -1
  24. package/dist/components/CanvasBanner.svelte +46 -46
  25. package/dist/components/ConfigForm.svelte +1164 -1065
  26. package/dist/components/ConfigForm.svelte.d.ts +2 -2
  27. package/dist/components/ConfigModal.svelte +180 -180
  28. package/dist/components/ConfigModal.svelte.d.ts +1 -1
  29. package/dist/components/ConfigPanel.stories.svelte +35 -35
  30. package/dist/components/ConfigPanel.stories.svelte.d.ts +1 -1
  31. package/dist/components/ConfigPanel.svelte +178 -167
  32. package/dist/components/ConfigPanel.svelte.d.ts +1 -1
  33. package/dist/components/ConnectionLine.svelte +25 -25
  34. package/dist/components/EdgeRefresher.svelte +26 -26
  35. package/dist/components/FlowDropEdge.stories.svelte +197 -0
  36. package/dist/components/FlowDropEdge.stories.svelte.d.ts +26 -0
  37. package/dist/components/FlowDropEdge.svelte +168 -0
  38. package/dist/components/FlowDropEdge.svelte.d.ts +4 -0
  39. package/dist/components/FlowDropZone.svelte +63 -60
  40. package/dist/components/FlowDropZone.svelte.d.ts +1 -1
  41. package/dist/components/LoadingSpinner.stories.svelte +19 -19
  42. package/dist/components/LoadingSpinner.stories.svelte.d.ts +1 -1
  43. package/dist/components/LoadingSpinner.svelte +21 -21
  44. package/dist/components/LoadingSpinner.svelte.d.ts +1 -1
  45. package/dist/components/Logo.stories.svelte +13 -13
  46. package/dist/components/Logo.stories.svelte.d.ts +1 -1
  47. package/dist/components/Logo.svelte +101 -95
  48. package/dist/components/LogsSidebar.svelte +553 -546
  49. package/dist/components/LogsSidebar.svelte.d.ts +1 -1
  50. package/dist/components/MarkdownDisplay.stories.svelte +29 -23
  51. package/dist/components/MarkdownDisplay.stories.svelte.d.ts +1 -1
  52. package/dist/components/MarkdownDisplay.svelte +16 -14
  53. package/dist/components/Navbar.stories.svelte +43 -38
  54. package/dist/components/Navbar.stories.svelte.d.ts +1 -1
  55. package/dist/components/Navbar.svelte +760 -706
  56. package/dist/components/Navbar.svelte.d.ts +1 -1
  57. package/dist/components/NodeSidebar.svelte +900 -746
  58. package/dist/components/NodeSidebar.svelte.d.ts +3 -1
  59. package/dist/components/NodeStatusOverlay.stories.svelte +82 -70
  60. package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +1 -1
  61. package/dist/components/NodeStatusOverlay.svelte +295 -280
  62. package/dist/components/NodeStatusOverlay.svelte.d.ts +3 -3
  63. package/dist/components/PipelineStatus.svelte +326 -300
  64. package/dist/components/PipelineStatus.svelte.d.ts +4 -4
  65. package/dist/components/PortCoordinateTracker.svelte +49 -47
  66. package/dist/components/PortCoordinateTracker.svelte.d.ts +1 -1
  67. package/dist/components/ReadOnlyDetails.svelte +156 -156
  68. package/dist/components/SchemaForm.stories.svelte +106 -98
  69. package/dist/components/SchemaForm.stories.svelte.d.ts +1 -1
  70. package/dist/components/SchemaForm.svelte +490 -463
  71. package/dist/components/SchemaForm.svelte.d.ts +2 -2
  72. package/dist/components/SettingsModal.svelte +226 -223
  73. package/dist/components/SettingsModal.svelte.d.ts +1 -1
  74. package/dist/components/SettingsPanel.svelte +637 -601
  75. package/dist/components/SettingsPanel.svelte.d.ts +1 -1
  76. package/dist/components/StatusIcon.stories.svelte +62 -49
  77. package/dist/components/StatusIcon.stories.svelte.d.ts +1 -1
  78. package/dist/components/StatusIcon.svelte +87 -87
  79. package/dist/components/StatusIcon.svelte.d.ts +2 -2
  80. package/dist/components/StatusLabel.stories.svelte +12 -12
  81. package/dist/components/StatusLabel.stories.svelte.d.ts +1 -1
  82. package/dist/components/StatusLabel.svelte +19 -19
  83. package/dist/components/ThemeToggle.stories.svelte +16 -16
  84. package/dist/components/ThemeToggle.stories.svelte.d.ts +1 -1
  85. package/dist/components/ThemeToggle.svelte +180 -169
  86. package/dist/components/ThemeToggle.svelte.d.ts +1 -1
  87. package/dist/components/UniversalNode.svelte +150 -138
  88. package/dist/components/UniversalNode.svelte.d.ts +3 -3
  89. package/dist/components/WorkflowEditor.svelte +1069 -1007
  90. package/dist/components/WorkflowEditor.svelte.d.ts +4 -4
  91. package/dist/components/form/FormArray.svelte +1034 -973
  92. package/dist/components/form/FormArray.svelte.d.ts +1 -1
  93. package/dist/components/form/FormAutocomplete.svelte +1021 -978
  94. package/dist/components/form/FormAutocomplete.svelte.d.ts +1 -1
  95. package/dist/components/form/FormCheckboxGroup.stories.svelte +23 -20
  96. package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +1 -1
  97. package/dist/components/form/FormCheckboxGroup.svelte +136 -136
  98. package/dist/components/form/FormCodeEditor.svelte +452 -434
  99. package/dist/components/form/FormField.svelte +366 -355
  100. package/dist/components/form/FormField.svelte.d.ts +2 -2
  101. package/dist/components/form/FormFieldLight.svelte +400 -384
  102. package/dist/components/form/FormFieldLight.svelte.d.ts +1 -1
  103. package/dist/components/form/FormFieldWrapper.stories.svelte +42 -42
  104. package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +1 -1
  105. package/dist/components/form/FormFieldWrapper.svelte +100 -93
  106. package/dist/components/form/FormFieldWrapper.svelte.d.ts +1 -1
  107. package/dist/components/form/FormFieldset.svelte +108 -108
  108. package/dist/components/form/FormFieldset.svelte.d.ts +2 -2
  109. package/dist/components/form/FormMarkdownEditor.svelte +758 -725
  110. package/dist/components/form/FormNumberField.stories.svelte +25 -25
  111. package/dist/components/form/FormNumberField.stories.svelte.d.ts +1 -1
  112. package/dist/components/form/FormNumberField.svelte +88 -88
  113. package/dist/components/form/FormRangeField.stories.svelte +20 -20
  114. package/dist/components/form/FormRangeField.stories.svelte.d.ts +1 -1
  115. package/dist/components/form/FormRangeField.svelte +234 -226
  116. package/dist/components/form/FormSelect.stories.svelte +38 -38
  117. package/dist/components/form/FormSelect.stories.svelte.d.ts +1 -1
  118. package/dist/components/form/FormSelect.svelte +101 -101
  119. package/dist/components/form/FormSelect.svelte.d.ts +1 -1
  120. package/dist/components/form/FormTemplateEditor.svelte +847 -798
  121. package/dist/components/form/FormTemplateEditor.svelte.d.ts +1 -1
  122. package/dist/components/form/FormTextField.stories.svelte +29 -23
  123. package/dist/components/form/FormTextField.stories.svelte.d.ts +1 -1
  124. package/dist/components/form/FormTextField.svelte +68 -68
  125. package/dist/components/form/FormTextarea.stories.svelte +28 -25
  126. package/dist/components/form/FormTextarea.stories.svelte.d.ts +1 -1
  127. package/dist/components/form/FormTextarea.svelte +74 -74
  128. package/dist/components/form/FormToggle.stories.svelte +23 -20
  129. package/dist/components/form/FormToggle.stories.svelte.d.ts +1 -1
  130. package/dist/components/form/FormToggle.svelte +98 -98
  131. package/dist/components/form/FormUISchemaRenderer.svelte +120 -113
  132. package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +3 -3
  133. package/dist/components/form/index.d.ts +19 -19
  134. package/dist/components/form/index.js +18 -18
  135. package/dist/components/form/templateAutocomplete.d.ts +2 -2
  136. package/dist/components/form/templateAutocomplete.js +64 -55
  137. package/dist/components/form/types.d.ts +6 -6
  138. package/dist/components/form/types.js +9 -4
  139. package/dist/components/icons/AlertCircleIcon.svelte +11 -0
  140. package/dist/components/icons/AlertCircleIcon.svelte.d.ts +26 -0
  141. package/dist/components/icons/CogIcon.svelte +11 -0
  142. package/dist/components/icons/CogIcon.svelte.d.ts +26 -0
  143. package/dist/components/interrupt/ChoicePrompt.stories.svelte +54 -38
  144. package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +1 -1
  145. package/dist/components/interrupt/ChoicePrompt.svelte +407 -383
  146. package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +1 -1
  147. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +48 -48
  148. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +1 -1
  149. package/dist/components/interrupt/ConfirmationPrompt.svelte +280 -274
  150. package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +1 -1
  151. package/dist/components/interrupt/FormPrompt.svelte +223 -218
  152. package/dist/components/interrupt/FormPrompt.svelte.d.ts +1 -1
  153. package/dist/components/interrupt/InterruptBubble.svelte +617 -583
  154. package/dist/components/interrupt/InterruptBubble.svelte.d.ts +2 -2
  155. package/dist/components/interrupt/ReviewPrompt.stories.svelte +66 -56
  156. package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +1 -1
  157. package/dist/components/interrupt/ReviewPrompt.svelte +861 -841
  158. package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +1 -1
  159. package/dist/components/interrupt/TextInputPrompt.stories.svelte +38 -33
  160. package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +1 -1
  161. package/dist/components/interrupt/TextInputPrompt.svelte +333 -328
  162. package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +1 -1
  163. package/dist/components/interrupt/index.d.ts +5 -5
  164. package/dist/components/interrupt/index.js +5 -5
  165. package/dist/components/layouts/MainLayout.svelte +724 -691
  166. package/dist/components/layouts/MainLayout.svelte.d.ts +6 -6
  167. package/dist/components/nodes/GatewayNode.stories.svelte +100 -99
  168. package/dist/components/nodes/GatewayNode.svelte +605 -571
  169. package/dist/components/nodes/GatewayNode.svelte.d.ts +3 -3
  170. package/dist/components/nodes/IdeaNode.stories.svelte +44 -43
  171. package/dist/components/nodes/IdeaNode.svelte +451 -437
  172. package/dist/components/nodes/IdeaNode.svelte.d.ts +1 -1
  173. package/dist/components/nodes/NotesNode.stories.svelte +65 -64
  174. package/dist/components/nodes/NotesNode.svelte +380 -369
  175. package/dist/components/nodes/NotesNode.svelte.d.ts +1 -1
  176. package/dist/components/nodes/SimpleNode.stories.svelte +145 -144
  177. package/dist/components/nodes/SimpleNode.svelte +486 -424
  178. package/dist/components/nodes/SimpleNode.svelte.d.ts +1 -1
  179. package/dist/components/nodes/SquareNode.stories.svelte +73 -73
  180. package/dist/components/nodes/SquareNode.svelte +439 -380
  181. package/dist/components/nodes/SquareNode.svelte.d.ts +1 -1
  182. package/dist/components/nodes/TerminalNode.stories.svelte +13 -13
  183. package/dist/components/nodes/TerminalNode.svelte +709 -670
  184. package/dist/components/nodes/TerminalNode.svelte.d.ts +1 -1
  185. package/dist/components/nodes/ToolNode.stories.svelte +181 -180
  186. package/dist/components/nodes/ToolNode.svelte +505 -447
  187. package/dist/components/nodes/ToolNode.svelte.d.ts +1 -1
  188. package/dist/components/nodes/WorkflowNode.stories.svelte +70 -46
  189. package/dist/components/nodes/WorkflowNode.svelte +621 -551
  190. package/dist/components/nodes/WorkflowNode.svelte.d.ts +3 -3
  191. package/dist/components/playground/ChatPanel.svelte +945 -889
  192. package/dist/components/playground/ExecutionLogs.svelte +495 -472
  193. package/dist/components/playground/InputCollector.svelte +449 -428
  194. package/dist/components/playground/MessageBubble.stories.svelte +47 -47
  195. package/dist/components/playground/MessageBubble.stories.svelte.d.ts +1 -1
  196. package/dist/components/playground/MessageBubble.svelte +626 -610
  197. package/dist/components/playground/MessageBubble.svelte.d.ts +1 -1
  198. package/dist/components/playground/Playground.svelte +1088 -1057
  199. package/dist/components/playground/Playground.svelte.d.ts +3 -3
  200. package/dist/components/playground/PlaygroundModal.svelte +208 -204
  201. package/dist/components/playground/PlaygroundModal.svelte.d.ts +3 -3
  202. package/dist/components/playground/SessionManager.svelte +527 -521
  203. package/dist/components/playground/SessionManager.svelte.d.ts +1 -1
  204. package/dist/config/agentSpecEndpoints.d.ts +1 -1
  205. package/dist/config/agentSpecEndpoints.js +20 -20
  206. package/dist/config/constants.d.ts +8 -0
  207. package/dist/config/constants.js +10 -2
  208. package/dist/config/defaultCategories.d.ts +1 -1
  209. package/dist/config/defaultCategories.js +86 -86
  210. package/dist/config/defaultPortConfig.d.ts +1 -1
  211. package/dist/config/defaultPortConfig.js +144 -144
  212. package/dist/config/endpoints.d.ts +4 -4
  213. package/dist/config/endpoints.js +65 -65
  214. package/dist/config/runtimeConfig.d.ts +2 -2
  215. package/dist/config/runtimeConfig.js +8 -8
  216. package/dist/core/index.d.ts +63 -59
  217. package/dist/core/index.js +35 -33
  218. package/dist/display/index.d.ts +2 -2
  219. package/dist/display/index.js +2 -2
  220. package/dist/editor/index.d.ts +62 -62
  221. package/dist/editor/index.js +53 -53
  222. package/dist/form/code.d.ts +5 -5
  223. package/dist/form/code.js +14 -14
  224. package/dist/form/fieldRegistry.d.ts +3 -3
  225. package/dist/form/fieldRegistry.js +11 -9
  226. package/dist/form/full.d.ts +8 -8
  227. package/dist/form/full.js +9 -9
  228. package/dist/form/index.d.ts +18 -18
  229. package/dist/form/index.js +16 -16
  230. package/dist/form/markdown.d.ts +4 -4
  231. package/dist/form/markdown.js +8 -8
  232. package/dist/helpers/proximityConnect.d.ts +3 -3
  233. package/dist/helpers/proximityConnect.js +34 -32
  234. package/dist/helpers/workflowEditorHelper.d.ts +5 -5
  235. package/dist/helpers/workflowEditorHelper.js +108 -96
  236. package/dist/index.d.ts +6 -6
  237. package/dist/index.js +6 -6
  238. package/dist/mocks/app-environment.js +2 -2
  239. package/dist/mocks/app-forms.js +9 -9
  240. package/dist/mocks/app-navigation.js +11 -11
  241. package/dist/mocks/app-stores.js +8 -8
  242. package/dist/playground/index.d.ts +19 -19
  243. package/dist/playground/index.js +16 -16
  244. package/dist/playground/mount.d.ts +3 -3
  245. package/dist/playground/mount.js +24 -24
  246. package/dist/registry/builtinFormats.js +13 -13
  247. package/dist/registry/builtinNodes.d.ts +2 -2
  248. package/dist/registry/builtinNodes.js +77 -77
  249. package/dist/registry/index.d.ts +4 -4
  250. package/dist/registry/index.js +4 -4
  251. package/dist/registry/nodeComponentRegistry.d.ts +8 -8
  252. package/dist/registry/nodeComponentRegistry.js +11 -9
  253. package/dist/registry/plugin.d.ts +2 -2
  254. package/dist/registry/plugin.js +11 -11
  255. package/dist/registry/workflowFormatRegistry.d.ts +3 -3
  256. package/dist/registry/workflowFormatRegistry.js +2 -2
  257. package/dist/schema/index.d.ts +1 -1
  258. package/dist/schema/index.js +2 -2
  259. package/dist/schemas/v1/workflow.schema.json +22 -107
  260. package/dist/services/agentSpecExecutionService.d.ts +3 -3
  261. package/dist/services/agentSpecExecutionService.js +59 -55
  262. package/dist/services/api.d.ts +18 -4
  263. package/dist/services/api.js +46 -43
  264. package/dist/services/apiVariableService.d.ts +1 -1
  265. package/dist/services/apiVariableService.js +41 -34
  266. package/dist/services/autoSaveService.js +8 -8
  267. package/dist/services/categoriesApi.d.ts +2 -2
  268. package/dist/services/categoriesApi.js +8 -8
  269. package/dist/services/draftStorage.d.ts +1 -1
  270. package/dist/services/draftStorage.js +11 -11
  271. package/dist/services/dynamicSchemaService.d.ts +1 -1
  272. package/dist/services/dynamicSchemaService.js +41 -39
  273. package/dist/services/globalSave.d.ts +2 -2
  274. package/dist/services/globalSave.js +53 -42
  275. package/dist/services/historyService.d.ts +1 -1
  276. package/dist/services/historyService.js +8 -8
  277. package/dist/services/interruptService.d.ts +1 -1
  278. package/dist/services/interruptService.js +35 -29
  279. package/dist/services/nodeExecutionService.d.ts +1 -1
  280. package/dist/services/nodeExecutionService.js +45 -44
  281. package/dist/services/playgroundService.d.ts +1 -1
  282. package/dist/services/playgroundService.js +29 -29
  283. package/dist/services/portConfigApi.d.ts +2 -2
  284. package/dist/services/portConfigApi.js +8 -8
  285. package/dist/services/settingsService.d.ts +2 -2
  286. package/dist/services/settingsService.js +25 -19
  287. package/dist/services/toastService.d.ts +4 -4
  288. package/dist/services/toastService.js +33 -33
  289. package/dist/services/variableService.d.ts +1 -1
  290. package/dist/services/variableService.js +36 -36
  291. package/dist/services/workflowStorage.d.ts +2 -2
  292. package/dist/services/workflowStorage.js +13 -13
  293. package/dist/settings/index.d.ts +7 -7
  294. package/dist/settings/index.js +6 -6
  295. package/dist/skins/default.d.ts +2 -0
  296. package/dist/skins/default.js +1 -0
  297. package/dist/skins/index.d.ts +13 -0
  298. package/dist/skins/index.js +30 -0
  299. package/dist/skins/slate.d.ts +2 -0
  300. package/dist/skins/slate.js +78 -0
  301. package/dist/stores/categoriesStore.svelte.d.ts +1 -1
  302. package/dist/stores/categoriesStore.svelte.js +5 -5
  303. package/dist/stores/editorStateMachine.svelte.d.ts +2 -2
  304. package/dist/stores/editorStateMachine.svelte.js +65 -33
  305. package/dist/stores/historyStore.svelte.d.ts +4 -4
  306. package/dist/stores/historyStore.svelte.js +4 -4
  307. package/dist/stores/interruptStore.svelte.d.ts +3 -3
  308. package/dist/stores/interruptStore.svelte.js +21 -21
  309. package/dist/stores/playgroundStore.svelte.d.ts +2 -2
  310. package/dist/stores/playgroundStore.svelte.js +25 -18
  311. package/dist/stores/portCoordinateStore.svelte.d.ts +2 -2
  312. package/dist/stores/portCoordinateStore.svelte.js +15 -8
  313. package/dist/stores/settingsStore.svelte.d.ts +2 -2
  314. package/dist/stores/settingsStore.svelte.js +62 -57
  315. package/dist/stores/workflowStore.svelte.d.ts +3 -3
  316. package/dist/stores/workflowStore.svelte.js +50 -47
  317. package/dist/stories/CanvasDecorator.svelte +35 -32
  318. package/dist/stories/CanvasDecorator.svelte.d.ts +2 -2
  319. package/dist/stories/EdgeDecorator.svelte +125 -0
  320. package/dist/stories/EdgeDecorator.svelte.d.ts +17 -0
  321. package/dist/stories/NodeDecorator.svelte +59 -53
  322. package/dist/stories/NodeDecorator.svelte.d.ts +1 -1
  323. package/dist/stories/utils.d.ts +2 -2
  324. package/dist/stories/utils.js +105 -67
  325. package/dist/styles/base.css +599 -595
  326. package/dist/styles/toast.css +14 -14
  327. package/dist/styles/tokens.css +409 -378
  328. package/dist/svelte-app.d.ts +9 -9
  329. package/dist/svelte-app.js +39 -39
  330. package/dist/themes/default.d.ts +2 -0
  331. package/dist/themes/default.js +9 -0
  332. package/dist/themes/index.d.ts +13 -0
  333. package/dist/themes/index.js +44 -0
  334. package/dist/themes/minimal.d.ts +2 -0
  335. package/dist/themes/minimal.js +11 -0
  336. package/dist/types/agentspec.d.ts +18 -18
  337. package/dist/types/agentspec.js +2 -2
  338. package/dist/types/auth.d.ts +1 -1
  339. package/dist/types/auth.js +6 -6
  340. package/dist/types/config.d.ts +6 -6
  341. package/dist/types/events.d.ts +2 -2
  342. package/dist/types/events.js +2 -2
  343. package/dist/types/index.d.ts +32 -32
  344. package/dist/types/index.js +6 -6
  345. package/dist/types/interrupt.d.ts +6 -6
  346. package/dist/types/interrupt.js +21 -21
  347. package/dist/types/interruptState.d.ts +12 -12
  348. package/dist/types/interruptState.js +66 -66
  349. package/dist/types/playground.d.ts +7 -7
  350. package/dist/types/playground.js +14 -14
  351. package/dist/types/settings.d.ts +5 -3
  352. package/dist/types/settings.js +25 -18
  353. package/dist/types/skin.d.ts +31 -0
  354. package/dist/types/skin.js +1 -0
  355. package/dist/types/theme.d.ts +35 -0
  356. package/dist/types/theme.js +1 -0
  357. package/dist/types/uischema.d.ts +4 -4
  358. package/dist/types/uischema.js +3 -3
  359. package/dist/utils/colors.d.ts +1 -1
  360. package/dist/utils/colors.js +97 -95
  361. package/dist/utils/config.d.ts +2 -2
  362. package/dist/utils/config.js +48 -48
  363. package/dist/utils/connections.d.ts +2 -2
  364. package/dist/utils/connections.js +15 -15
  365. package/dist/utils/errors.js +3 -3
  366. package/dist/utils/fetchWithAuth.d.ts +1 -1
  367. package/dist/utils/fetchWithAuth.js +2 -2
  368. package/dist/utils/handleIds.d.ts +2 -2
  369. package/dist/utils/handleIds.js +8 -8
  370. package/dist/utils/handlePositioning.d.ts +1 -1
  371. package/dist/utils/handlePositioning.js +2 -2
  372. package/dist/utils/icons.d.ts +1 -1
  373. package/dist/utils/icons.js +74 -74
  374. package/dist/utils/logger.d.ts +1 -1
  375. package/dist/utils/logger.js +7 -7
  376. package/dist/utils/nodeStatus.d.ts +1 -1
  377. package/dist/utils/nodeStatus.js +48 -48
  378. package/dist/utils/nodeTypes.d.ts +1 -1
  379. package/dist/utils/nodeTypes.js +21 -20
  380. package/dist/utils/nodeWrapper.d.ts +7 -7
  381. package/dist/utils/nodeWrapper.js +21 -19
  382. package/dist/utils/performanceUtils.d.ts +1 -1
  383. package/dist/utils/performanceUtils.js +2 -1
  384. package/dist/utils/sanitize.js +1 -1
  385. package/dist/utils/uischema.d.ts +2 -2
  386. package/dist/utils/uischema.js +8 -8
  387. package/dist/utils/validation.js +20 -8
  388. package/package.json +296 -291
@@ -5,467 +5,525 @@
5
5
  -->
6
6
 
7
7
  <script lang="ts">
8
- import { Position, Handle } from '@xyflow/svelte';
9
- import Icon from '@iconify/svelte';
10
- import { getDataTypeColor } from '../../utils/colors';
11
- import type { NodeMetadata, NodePort } from '../../types/index.js';
12
-
13
- interface ToolNodeParameter {
14
- name: string;
15
- type?: string;
16
- description?: string;
17
- }
18
-
19
- const props = $props<{
20
- data: {
21
- label: string;
22
- config: {
23
- icon?: string;
24
- color?: string;
25
- toolName?: string;
26
- toolDescription?: string;
27
- toolVersion?: string;
28
- parameters?: ToolNodeParameter[];
29
- };
30
- metadata: NodeMetadata;
31
- nodeId?: string;
32
- onConfigOpen?: (node: {
33
- id: string;
34
- type: string;
35
- data: { label: string; config: Record<string, unknown>; metadata: NodeMetadata };
36
- }) => void;
37
- };
38
- selected?: boolean;
39
- isProcessing?: boolean;
40
- isError?: boolean;
41
- }>();
42
-
43
- // Prioritize metadata over config for tool nodes (metadata is the node definition)
44
- let toolIcon = $derived(
45
- (props.data.metadata?.icon as string) || (props.data.config?.icon as string) || 'mdi:tools'
46
- );
47
- let toolColor = $derived(
48
- (props.data.metadata?.color as string) || (props.data.config?.color as string) || '#f59e0b'
49
- );
50
-
51
- /**
52
- * Instance-specific title override from config.
53
- * Falls back to metadata name, toolName config, or label if not set.
54
- * This allows users to customize the tool title per-instance via config.
55
- */
56
- const displayTitle = $derived(
57
- (props.data.config?.instanceTitle as string) ||
58
- (props.data.metadata?.name as string) ||
59
- (props.data.config?.toolName as string) ||
60
- props.data.label ||
61
- 'Tool'
62
- );
63
-
64
- /**
65
- * Instance-specific badge label override from config.
66
- * Falls back to metadata badge or default 'TOOL' if not set.
67
- * This allows users to customize the badge text per-instance via config.
68
- */
69
- const displayBadge = $derived(
70
- (props.data.config?.instanceBadge as string) || (props.data.metadata?.badge as string) || 'TOOL'
71
- );
72
-
73
- /**
74
- * Instance-specific description override from config.
75
- * Falls back to metadata description or toolDescription config if not set.
76
- * This allows users to customize the tool description per-instance via config.
77
- */
78
- const displayDescription = $derived(
79
- (props.data.config?.instanceDescription as string) ||
80
- (props.data.metadata?.description as string) ||
81
- (props.data.config?.toolDescription as string) ||
82
- 'A configurable tool for agents'
83
- );
84
-
85
- let toolVersion = $derived(
86
- (props.data.metadata?.version as string) ||
87
- (props.data.config?.toolVersion as string) ||
88
- '1.0.0'
89
- );
90
-
91
- /**
92
- * Build inline style string for CSS custom properties
93
- * Sets the base color, CSS handles light/dark mode tints via color-mix()
94
- */
95
- let nodeStyle = $derived(`--fd-tool-node-color: ${toolColor}`);
96
-
97
- /**
98
- * Configurable port dataType to expose on this tool node.
99
- * Defaults to 'tool', but can be overridden via metadata.portDataType
100
- * to show a different port type (e.g., 'trigger') when the node is
101
- * repurposed with a custom badge.
102
- */
103
- let portDataType = $derived((props.data.metadata?.portDataType as string) || 'tool');
104
-
105
- // Check for matching interface ports in metadata
106
- let hasToolInputPort = $derived(
107
- props.data.metadata?.inputs?.some((port: NodePort) => port.dataType === portDataType) || false
108
- );
109
- let hasToolOutputPort = $derived(
110
- props.data.metadata?.outputs?.some((port: NodePort) => port.dataType === portDataType) || false
111
- );
112
-
113
- // Get the actual matching ports for proper handle generation
114
- let toolInputPort = $derived(
115
- props.data.metadata?.inputs?.find((port: NodePort) => port.dataType === portDataType)
116
- );
117
- let toolOutputPort = $derived(
118
- props.data.metadata?.outputs?.find((port: NodePort) => port.dataType === portDataType)
119
- );
120
-
121
- /**
122
- * Handle configuration sidebar - using global ConfigSidebar
123
- */
124
- function openConfigSidebar(): void {
125
- if (props.data.onConfigOpen) {
126
- // Create a WorkflowNodeType-like object for the global ConfigSidebar
127
- const nodeForConfig = {
128
- id: props.data.nodeId || 'unknown',
129
- type: 'tool',
130
- data: props.data
131
- };
132
- props.data.onConfigOpen(nodeForConfig);
133
- }
134
- }
135
-
136
- /**
137
- * Handle double-click to open config
138
- */
139
- function handleDoubleClick(): void {
140
- openConfigSidebar();
141
- }
142
-
143
- /**
144
- * Handle click events
145
- */
146
- function handleClick(): void {
147
- // Node selection is handled by Svelte Flow
148
- }
149
-
150
- /**
151
- * Handle keyboard events for accessibility
152
- */
153
- function handleKeydown(event: KeyboardEvent): void {
154
- if (event.key === 'Enter' || event.key === ' ') {
155
- event.preventDefault();
156
- handleDoubleClick();
157
- }
158
- }
8
+ import { Position, Handle } from "@xyflow/svelte";
9
+ import Icon from "@iconify/svelte";
10
+ import { getDataTypeColor, getCategoryColorToken } from "../../utils/colors";
11
+ import type { NodeMetadata, NodePort } from "../../types/index.js";
12
+ import CogIcon from "../icons/CogIcon.svelte";
13
+ import AlertCircleIcon from "../icons/AlertCircleIcon.svelte";
14
+
15
+ interface ToolNodeParameter {
16
+ name: string;
17
+ type?: string;
18
+ description?: string;
19
+ }
20
+
21
+ const props = $props<{
22
+ data: {
23
+ label: string;
24
+ config: {
25
+ icon?: string;
26
+ color?: string;
27
+ toolName?: string;
28
+ toolDescription?: string;
29
+ toolVersion?: string;
30
+ parameters?: ToolNodeParameter[];
31
+ };
32
+ metadata: NodeMetadata;
33
+ nodeId?: string;
34
+ onConfigOpen?: (node: {
35
+ id: string;
36
+ type: string;
37
+ data: {
38
+ label: string;
39
+ config: Record<string, unknown>;
40
+ metadata: NodeMetadata;
41
+ };
42
+ }) => void;
43
+ };
44
+ selected?: boolean;
45
+ isProcessing?: boolean;
46
+ isError?: boolean;
47
+ }>();
48
+
49
+ // Prioritize metadata over config for tool nodes (metadata is the node definition)
50
+ let toolIcon = $derived(
51
+ (props.data.metadata?.icon as string) ||
52
+ (props.data.config?.icon as string) ||
53
+ "mdi:tools",
54
+ );
55
+ let toolColor = $derived(
56
+ (props.data.metadata?.color as string) ||
57
+ (props.data.config?.color as string) ||
58
+ "#f59e0b",
59
+ );
60
+
61
+ /**
62
+ * Instance-specific title override from config.
63
+ * Falls back to metadata name, toolName config, or label if not set.
64
+ * This allows users to customize the tool title per-instance via config.
65
+ */
66
+ const displayTitle = $derived(
67
+ (props.data.config?.instanceTitle as string) ||
68
+ (props.data.metadata?.name as string) ||
69
+ (props.data.config?.toolName as string) ||
70
+ props.data.label ||
71
+ "Tool",
72
+ );
73
+
74
+ /**
75
+ * Instance-specific badge label override from config.
76
+ * Falls back to metadata badge or default 'TOOL' if not set.
77
+ * This allows users to customize the badge text per-instance via config.
78
+ */
79
+ const displayBadge = $derived(
80
+ (props.data.config?.instanceBadge as string) ||
81
+ (props.data.metadata?.badge as string) ||
82
+ "TOOL",
83
+ );
84
+
85
+ /**
86
+ * Instance-specific description override from config.
87
+ * Falls back to metadata description or toolDescription config if not set.
88
+ * This allows users to customize the tool description per-instance via config.
89
+ */
90
+ const displayDescription = $derived(
91
+ (props.data.config?.instanceDescription as string) ||
92
+ (props.data.metadata?.description as string) ||
93
+ (props.data.config?.toolDescription as string) ||
94
+ "A configurable tool for agents",
95
+ );
96
+
97
+ let toolVersion = $derived(
98
+ (props.data.metadata?.version as string) ||
99
+ (props.data.config?.toolVersion as string) ||
100
+ "1.0.0",
101
+ );
102
+
103
+ /**
104
+ * Build inline style string for CSS custom properties
105
+ * Sets the base color, CSS handles light/dark mode tints via color-mix()
106
+ */
107
+ let nodeStyle = $derived(`--fd-tool-node-color: ${toolColor}`);
108
+
109
+ /**
110
+ * Configurable port dataType to expose on this tool node.
111
+ * Defaults to 'tool', but can be overridden via metadata.portDataType
112
+ * to show a different port type (e.g., 'trigger') when the node is
113
+ * repurposed with a custom badge.
114
+ */
115
+ let portDataType = $derived(
116
+ (props.data.metadata?.portDataType as string) || "tool",
117
+ );
118
+
119
+ // Check for matching interface ports in metadata
120
+ let hasToolInputPort = $derived(
121
+ props.data.metadata?.inputs?.some(
122
+ (port: NodePort) => port.dataType === portDataType,
123
+ ) || false,
124
+ );
125
+ let hasToolOutputPort = $derived(
126
+ props.data.metadata?.outputs?.some(
127
+ (port: NodePort) => port.dataType === portDataType,
128
+ ) || false,
129
+ );
130
+
131
+ // Get the actual matching ports for proper handle generation
132
+ let toolInputPort = $derived(
133
+ props.data.metadata?.inputs?.find(
134
+ (port: NodePort) => port.dataType === portDataType,
135
+ ),
136
+ );
137
+ let toolOutputPort = $derived(
138
+ props.data.metadata?.outputs?.find(
139
+ (port: NodePort) => port.dataType === portDataType,
140
+ ),
141
+ );
142
+
143
+ /**
144
+ * Handle configuration sidebar - using global ConfigSidebar
145
+ */
146
+ function openConfigSidebar(): void {
147
+ if (props.data.onConfigOpen) {
148
+ // Create a WorkflowNodeType-like object for the global ConfigSidebar
149
+ const nodeForConfig = {
150
+ id: props.data.nodeId || "unknown",
151
+ type: "tool",
152
+ data: props.data,
153
+ };
154
+ props.data.onConfigOpen(nodeForConfig);
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Handle double-click to open config
160
+ */
161
+ function handleDoubleClick(): void {
162
+ openConfigSidebar();
163
+ }
164
+
165
+ /**
166
+ * Handle click events
167
+ */
168
+ function handleClick(): void {
169
+ // Node selection is handled by Svelte Flow
170
+ }
171
+
172
+ /**
173
+ * Handle keyboard events for accessibility
174
+ */
175
+ function handleKeydown(event: KeyboardEvent): void {
176
+ if (event.key === "Enter" || event.key === " ") {
177
+ event.preventDefault();
178
+ handleDoubleClick();
179
+ }
180
+ }
159
181
  </script>
160
182
 
161
183
  <!-- Tool Input Handle (optional): center at 40px (multiple of 10), 20px connection area -->
162
184
  {#if hasToolInputPort && toolInputPort}
163
- <Handle
164
- type="target"
165
- position={Position.Left}
166
- id={`${props.data.nodeId}-input-${toolInputPort.id}`}
167
- style="top: 40px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: {getDataTypeColor(
168
- portDataType
169
- )}; --fd-handle-border-color: var(--fd-handle-border);"
170
- />
185
+ <Handle
186
+ type="target"
187
+ position={Position.Left}
188
+ id={`${props.data.nodeId}-input-${toolInputPort.id}`}
189
+ style="top: 40px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
190
+ portDataType,
191
+ )}); --fd-handle-border-color: var(--fd-handle-border);"
192
+ />
171
193
  {/if}
172
194
 
173
195
  <!-- Tool Node -->
174
196
  <div
175
- class="flowdrop-tool-node"
176
- class:flowdrop-tool-node--selected={props.selected}
177
- class:flowdrop-tool-node--processing={props.isProcessing}
178
- class:flowdrop-tool-node--error={props.isError}
179
- style={nodeStyle}
180
- onclick={handleClick}
181
- ondblclick={handleDoubleClick}
182
- onkeydown={handleKeydown}
183
- role="button"
184
- tabindex="0"
197
+ class="flowdrop-tool-node"
198
+ class:flowdrop-tool-node--selected={props.selected}
199
+ class:flowdrop-tool-node--processing={props.isProcessing}
200
+ class:flowdrop-tool-node--error={props.isError}
201
+ style={nodeStyle}
202
+ onclick={handleClick}
203
+ ondblclick={handleDoubleClick}
204
+ onkeydown={handleKeydown}
205
+ role="button"
206
+ tabindex="0"
185
207
  >
186
- <!-- Node Header -->
187
- <div class="flowdrop-tool-node__header">
188
- <div class="flowdrop-tool-node__header-content">
189
- <!-- Tool Icon with Squircle Background -->
190
- <div class="flowdrop-tool-node__icon-wrapper">
191
- <Icon icon={toolIcon} class="flowdrop-tool-node__icon" />
192
- </div>
193
-
194
- <!-- Tool Info -->
195
- <div class="flowdrop-tool-node__info">
196
- <h3 class="flowdrop-tool-node__title">
197
- {displayTitle}
198
- </h3>
199
- <div class="flowdrop-tool-node__version">
200
- v{toolVersion}
201
- </div>
202
- </div>
203
-
204
- <!-- Tool Badge - tinted style matching icon wrappers -->
205
- <div class="flowdrop-tool-node__badge">{displayBadge}</div>
206
- </div>
207
-
208
- <!-- Tool Description - uses instanceDescription override if set -->
209
- <p class="flowdrop-tool-node__description">
210
- {displayDescription}
211
- </p>
212
- </div>
213
-
214
- <!-- Processing indicator -->
215
- {#if props.isProcessing}
216
- <div class="flowdrop-tool-node__processing">
217
- <div class="flowdrop-tool-node__spinner"></div>
218
- </div>
219
- {/if}
220
-
221
- <!-- Error indicator -->
222
- {#if props.isError}
223
- <div class="flowdrop-tool-node__error">
224
- <Icon icon="mdi:alert-circle" class="flowdrop-tool-node__error-icon" />
225
- </div>
226
- {/if}
227
-
228
- <!-- Config button -->
229
- <button class="flowdrop-tool-node__config-btn" onclick={openConfigSidebar} title="Configure tool">
230
- <Icon icon="mdi:cog" />
231
- </button>
208
+ <!-- Node Header -->
209
+ <div class="flowdrop-tool-node__header">
210
+ <div class="flowdrop-tool-node__header-content">
211
+ <!-- Squircle icon visibility controlled by --fd-node-icon-display -->
212
+ <div class="flowdrop-tool-node__icon-wrapper">
213
+ <Icon icon={toolIcon} class="flowdrop-tool-node__icon" />
214
+ </div>
215
+ <!-- Circle dot — visibility controlled by --fd-node-circle-display -->
216
+ <span
217
+ class="flowdrop-tool-node__color-dot"
218
+ style="background: {getCategoryColorToken(
219
+ props.data.metadata?.category,
220
+ )}"
221
+ ></span>
222
+
223
+ <!-- Tool Info -->
224
+ <div class="flowdrop-tool-node__info">
225
+ <h3 class="flowdrop-tool-node__title">
226
+ {displayTitle}
227
+ </h3>
228
+ <div class="flowdrop-tool-node__version">
229
+ v{toolVersion}
230
+ </div>
231
+ </div>
232
+
233
+ <!-- Tool Badge - tinted style matching icon wrappers -->
234
+ <div class="flowdrop-tool-node__badge">{displayBadge}</div>
235
+ </div>
236
+
237
+ <!-- Tool Description - uses instanceDescription override if set -->
238
+ <p class="flowdrop-tool-node__description">
239
+ {displayDescription}
240
+ </p>
241
+ </div>
242
+
243
+ <!-- Processing indicator -->
244
+ {#if props.isProcessing}
245
+ <div class="flowdrop-tool-node__processing">
246
+ <div class="flowdrop-tool-node__spinner"></div>
247
+ </div>
248
+ {/if}
249
+
250
+ <!-- Error indicator -->
251
+ {#if props.isError}
252
+ <div class="flowdrop-tool-node__error">
253
+ <AlertCircleIcon />
254
+ </div>
255
+ {/if}
256
+
257
+ <!-- Config button -->
258
+ <button
259
+ class="flowdrop-tool-node__config-btn"
260
+ onclick={openConfigSidebar}
261
+ title="Configure tool"
262
+ >
263
+ <CogIcon />
264
+ </button>
232
265
  </div>
233
266
 
234
267
  <!-- Tool Output Handle (optional): center at 40px (multiple of 10), 20px connection area -->
235
268
  {#if hasToolOutputPort && toolOutputPort}
236
- <Handle
237
- type="source"
238
- position={Position.Right}
239
- id={`${props.data.nodeId}-output-${toolOutputPort.id}`}
240
- style="top: 40px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: {getDataTypeColor(
241
- portDataType
242
- )}; --fd-handle-border-color: var(--fd-handle-border);"
243
- />
269
+ <Handle
270
+ type="source"
271
+ position={Position.Right}
272
+ id={`${props.data.nodeId}-output-${toolOutputPort.id}`}
273
+ style="top: 40px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
274
+ portDataType,
275
+ )}); --fd-handle-border-color: var(--fd-handle-border);"
276
+ />
244
277
  {/if}
245
278
 
246
279
  <style>
247
- .flowdrop-tool-node {
248
- position: relative;
249
- background-color: var(--fd-card);
250
- border: 1.5px solid var(--fd-tool-node-color);
251
- border-radius: var(--fd-radius-xl);
252
- width: var(--fd-node-default-width);
253
- min-height: var(--fd-node-tool-min-height);
254
- display: flex;
255
- flex-direction: column;
256
- cursor: pointer;
257
- transition: all var(--fd-transition-fast);
258
- box-shadow: var(--fd-shadow-md);
259
- overflow: visible;
260
- z-index: 10;
261
- color: var(--fd-foreground);
262
- }
263
-
264
- .flowdrop-tool-node:hover {
265
- box-shadow: var(--fd-shadow-lg);
266
- border-color: var(--fd-tool-node-color);
267
- }
268
-
269
- .flowdrop-tool-node--selected {
270
- box-shadow:
271
- 0 0 0 2px color-mix(in srgb, var(--fd-tool-node-color) 30%, transparent),
272
- var(--fd-shadow-lg);
273
- border-color: var(--fd-tool-node-color);
274
- }
275
-
276
- .flowdrop-tool-node--selected:hover {
277
- box-shadow:
278
- 0 0 0 2px color-mix(in srgb, var(--fd-tool-node-color) 30%, transparent),
279
- var(--fd-shadow-lg);
280
- border-color: var(--fd-tool-node-color);
281
- }
282
-
283
- .flowdrop-tool-node:focus-visible {
284
- outline: 2px solid var(--fd-ring);
285
- outline-offset: 2px;
286
- }
287
-
288
- .flowdrop-tool-node--processing {
289
- opacity: 0.7;
290
- }
291
-
292
- .flowdrop-tool-node--error {
293
- border-color: var(--fd-error) !important;
294
- background-color: var(--fd-error-muted) !important;
295
- }
296
-
297
- .flowdrop-tool-node__header {
298
- padding: 1rem;
299
- /* Light mode: mix tool color with white (95%) for subtle tint */
300
- background-color: color-mix(in srgb, var(--fd-tool-node-color) 5%, white);
301
- border-radius: var(--fd-radius-xl);
302
- border: none;
303
- }
304
-
305
- /* Dark mode header styles */
306
- :global([data-theme='dark']) .flowdrop-tool-node__header {
307
- /* Dark mode: mix tool color with dark background (15%) for subtle tint */
308
- background-color: color-mix(in srgb, var(--fd-tool-node-color) 15%, #1a1a1e);
309
- border: none;
310
- }
311
-
312
- .flowdrop-tool-node__header-content {
313
- display: flex;
314
- align-items: center;
315
- gap: 0.75rem;
316
- margin-bottom: 0.5rem;
317
- }
318
-
319
- /* Squircle icon wrapper - Apple-style rounded square background */
320
- .flowdrop-tool-node__icon-wrapper {
321
- display: flex;
322
- align-items: center;
323
- justify-content: center;
324
- width: 2.5rem;
325
- height: 2.5rem;
326
- border-radius: 0.625rem;
327
- background: color-mix(
328
- in srgb,
329
- var(--fd-tool-node-color) var(--fd-node-icon-bg-opacity),
330
- transparent
331
- );
332
- flex-shrink: 0;
333
- transition: all var(--fd-transition-normal);
334
- }
335
-
336
- .flowdrop-tool-node:hover .flowdrop-tool-node__icon-wrapper {
337
- background: color-mix(
338
- in srgb,
339
- var(--fd-tool-node-color) var(--fd-node-icon-bg-opacity-hover),
340
- transparent
341
- );
342
- transform: scale(1.05);
343
- }
344
-
345
- .flowdrop-tool-node__info {
346
- flex: 1;
347
- min-width: 0;
348
- }
349
-
350
- .flowdrop-tool-node__title {
351
- font-size: 1rem;
352
- font-weight: 600;
353
- color: var(--fd-foreground);
354
- margin: 0;
355
- line-height: 1.4;
356
- }
357
-
358
- .flowdrop-tool-node__version {
359
- font-size: var(--fd-text-xs);
360
- color: var(--fd-muted-foreground);
361
- font-weight: 500;
362
- margin-top: 0.125rem;
363
- }
364
-
365
- .flowdrop-tool-node__badge {
366
- background-color: color-mix(in srgb, var(--fd-tool-node-color) 15%, transparent);
367
- color: var(--fd-tool-node-color);
368
- border: 1px solid color-mix(in srgb, var(--fd-tool-node-color) 30%, transparent);
369
- font-size: 0.625rem;
370
- font-weight: 700;
371
- padding: 0.25rem 0.5rem;
372
- border-radius: var(--fd-radius-sm);
373
- letter-spacing: 0.05em;
374
- }
375
-
376
- .flowdrop-tool-node__description {
377
- font-size: var(--fd-text-xs);
378
- color: var(--fd-muted-foreground);
379
- margin: 0;
380
- line-height: 1.3;
381
- }
382
-
383
- .flowdrop-tool-node__icon-wrapper :global(.flowdrop-tool-node__icon) {
384
- width: 1.5rem;
385
- height: 1.5rem;
386
- color: var(--fd-node-icon);
387
- }
388
-
389
- .flowdrop-tool-node__processing {
390
- position: absolute;
391
- top: 4px;
392
- right: 4px;
393
- }
394
-
395
- .flowdrop-tool-node__spinner {
396
- width: 12px;
397
- height: 12px;
398
- border: 1px solid color-mix(in srgb, var(--fd-tool-node-color) 30%, transparent);
399
- border-top: 1px solid var(--fd-tool-node-color);
400
- border-radius: 50%;
401
- animation: spin 1s linear infinite;
402
- }
403
-
404
- .flowdrop-tool-node__error {
405
- position: absolute;
406
- top: 4px;
407
- right: 4px;
408
- color: var(--fd-error);
409
- }
410
-
411
- :global(.flowdrop-tool-node__error-icon) {
412
- width: 12px;
413
- height: 12px;
414
- }
415
-
416
- .flowdrop-tool-node__config-btn {
417
- position: absolute;
418
- top: 0.5rem;
419
- right: 0.5rem;
420
- width: 1.5rem;
421
- height: 1.5rem;
422
- background-color: var(--fd-backdrop);
423
- border: 1px solid var(--fd-border);
424
- border-radius: var(--fd-radius-sm);
425
- color: var(--fd-muted-foreground);
426
- cursor: pointer;
427
- display: flex;
428
- align-items: center;
429
- justify-content: center;
430
- opacity: 0;
431
- transition: all var(--fd-transition-normal);
432
- backdrop-filter: blur(4px);
433
- z-index: 15;
434
- font-size: var(--fd-text-sm);
435
- }
436
-
437
- .flowdrop-tool-node:hover .flowdrop-tool-node__config-btn {
438
- opacity: 1;
439
- }
440
-
441
- .flowdrop-tool-node__config-btn:hover {
442
- background-color: var(--fd-muted);
443
- border-color: var(--fd-border-strong);
444
- color: var(--fd-foreground);
445
- }
446
-
447
- @keyframes spin {
448
- to {
449
- transform: rotate(360deg);
450
- }
451
- }
452
-
453
- /* Handle: 20px/12px from base.css; position offsets, tool-specific hover/focus */
454
- :global(.svelte-flow__node-tool .svelte-flow__handle) {
455
- z-index: 20 !important;
456
- pointer-events: auto !important;
457
- }
458
-
459
- :global(.svelte-flow__node-tool .svelte-flow__handle:hover) {
460
- transform: translateY(-50%) scale(1.2) !important;
461
- }
462
-
463
- :global(.svelte-flow__node-tool .svelte-flow__handle:hover::before) {
464
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--fd-tool-node-color) 30%, transparent) !important;
465
- }
466
-
467
- :global(.svelte-flow__node-tool .svelte-flow__handle:focus) {
468
- outline: 2px solid var(--fd-tool-node-color) !important;
469
- outline-offset: 2px !important;
470
- }
280
+ .flowdrop-tool-node {
281
+ position: relative;
282
+ background-color: var(--fd-card);
283
+ border: 1.5px solid var(--fd-tool-node-color);
284
+ border-radius: var(--fd-radius-xl);
285
+ width: var(--fd-node-default-width);
286
+ min-height: var(--fd-node-tool-min-height);
287
+ display: flex;
288
+ flex-direction: column;
289
+ cursor: pointer;
290
+ transition: all var(--fd-transition-fast);
291
+ box-shadow: var(--fd-shadow-md);
292
+ overflow: visible;
293
+ z-index: 10;
294
+ color: var(--fd-foreground);
295
+ }
296
+
297
+ .flowdrop-tool-node:hover {
298
+ box-shadow: var(--fd-shadow-lg);
299
+ border-color: var(--fd-tool-node-color);
300
+ }
301
+
302
+ .flowdrop-tool-node--selected {
303
+ box-shadow:
304
+ 0 0 0 2px color-mix(in srgb, var(--fd-tool-node-color) 30%, transparent),
305
+ var(--fd-shadow-lg);
306
+ border-color: var(--fd-tool-node-color);
307
+ }
308
+
309
+ .flowdrop-tool-node--selected:hover {
310
+ box-shadow:
311
+ 0 0 0 2px color-mix(in srgb, var(--fd-tool-node-color) 30%, transparent),
312
+ var(--fd-shadow-lg);
313
+ border-color: var(--fd-tool-node-color);
314
+ }
315
+
316
+ .flowdrop-tool-node:focus-visible {
317
+ outline: 2px solid var(--fd-ring);
318
+ outline-offset: 2px;
319
+ }
320
+
321
+ .flowdrop-tool-node--processing {
322
+ opacity: 0.7;
323
+ }
324
+
325
+ .flowdrop-tool-node--error {
326
+ border-color: var(--fd-error) !important;
327
+ background-color: var(--fd-error-muted) !important;
328
+ }
329
+
330
+ .flowdrop-tool-node__header {
331
+ padding: 1rem;
332
+ /* Light mode: mix tool color with white (95%) for subtle tint */
333
+ background-color: color-mix(in srgb, var(--fd-tool-node-color) 5%, white);
334
+ border-radius: var(--fd-radius-xl);
335
+ border: none;
336
+ }
337
+
338
+ /* Dark mode header styles */
339
+ :global([data-theme="dark"]) .flowdrop-tool-node__header {
340
+ /* Dark mode: mix tool color with dark background (15%) for subtle tint */
341
+ background-color: color-mix(
342
+ in srgb,
343
+ var(--fd-tool-node-color) 15%,
344
+ #1a1a1e
345
+ );
346
+ border: none;
347
+ }
348
+
349
+ .flowdrop-tool-node__header-content {
350
+ display: flex;
351
+ align-items: center;
352
+ gap: 0.75rem;
353
+ margin-bottom: 0.5rem;
354
+ }
355
+
356
+ /* Squircle icon wrapper - Apple-style rounded square background */
357
+ .flowdrop-tool-node__icon-wrapper {
358
+ display: var(--fd-node-icon-display, flex);
359
+ align-items: center;
360
+ justify-content: center;
361
+ width: 2.5rem;
362
+ height: 2.5rem;
363
+ border-radius: 0.625rem;
364
+ background: color-mix(
365
+ in srgb,
366
+ var(--fd-tool-node-color) var(--fd-node-icon-bg-opacity),
367
+ transparent
368
+ );
369
+ flex-shrink: 0;
370
+ transition: all var(--fd-transition-normal);
371
+ }
372
+
373
+ .flowdrop-tool-node:hover .flowdrop-tool-node__icon-wrapper {
374
+ background: color-mix(
375
+ in srgb,
376
+ var(--fd-tool-node-color) var(--fd-node-icon-bg-opacity-hover),
377
+ transparent
378
+ );
379
+ transform: scale(1.05);
380
+ }
381
+
382
+ .flowdrop-tool-node__info {
383
+ flex: 1;
384
+ min-width: 0;
385
+ }
386
+
387
+ .flowdrop-tool-node__title {
388
+ font-size: 1rem;
389
+ font-weight: 600;
390
+ color: var(--fd-foreground);
391
+ margin: 0;
392
+ line-height: 1.4;
393
+ }
394
+
395
+ .flowdrop-tool-node__version {
396
+ font-size: var(--fd-text-xs);
397
+ color: var(--fd-muted-foreground);
398
+ font-weight: 500;
399
+ margin-top: 0.125rem;
400
+ }
401
+
402
+ .flowdrop-tool-node__badge {
403
+ background-color: color-mix(
404
+ in srgb,
405
+ var(--fd-tool-node-color) 15%,
406
+ transparent
407
+ );
408
+ color: var(--fd-tool-node-color);
409
+ border: 1px solid
410
+ color-mix(in srgb, var(--fd-tool-node-color) 30%, transparent);
411
+ font-size: 0.625rem;
412
+ font-weight: 700;
413
+ padding: 0.25rem 0.5rem;
414
+ border-radius: var(--fd-radius-sm);
415
+ letter-spacing: 0.05em;
416
+ }
417
+
418
+ .flowdrop-tool-node__description {
419
+ font-size: var(--fd-text-xs);
420
+ color: var(--fd-muted-foreground);
421
+ margin: 0;
422
+ line-height: 1.3;
423
+ }
424
+
425
+ .flowdrop-tool-node__icon-wrapper :global(.flowdrop-tool-node__icon) {
426
+ width: 1.5rem;
427
+ height: 1.5rem;
428
+ color: var(--fd-node-icon);
429
+ }
430
+
431
+ .flowdrop-tool-node__processing {
432
+ position: absolute;
433
+ top: 4px;
434
+ right: 4px;
435
+ }
436
+
437
+ .flowdrop-tool-node__spinner {
438
+ width: 12px;
439
+ height: 12px;
440
+ border: 1px solid
441
+ color-mix(in srgb, var(--fd-tool-node-color) 30%, transparent);
442
+ border-top: 1px solid var(--fd-tool-node-color);
443
+ border-radius: 50%;
444
+ animation: spin 1s linear infinite;
445
+ }
446
+
447
+ .flowdrop-tool-node__error {
448
+ position: absolute;
449
+ top: 4px;
450
+ right: 4px;
451
+ color: var(--fd-error);
452
+ }
453
+
454
+ .flowdrop-tool-node__error :global(svg) {
455
+ width: 12px;
456
+ height: 12px;
457
+ }
458
+
459
+ .flowdrop-tool-node__config-btn :global(svg) {
460
+ width: 14px;
461
+ height: 14px;
462
+ }
463
+
464
+ .flowdrop-tool-node__config-btn {
465
+ position: absolute;
466
+ top: 0.5rem;
467
+ right: 0.5rem;
468
+ width: 1.5rem;
469
+ height: 1.5rem;
470
+ background-color: var(--fd-backdrop);
471
+ border: 1px solid var(--fd-border);
472
+ border-radius: var(--fd-radius-sm);
473
+ color: var(--fd-muted-foreground);
474
+ cursor: pointer;
475
+ display: flex;
476
+ align-items: center;
477
+ justify-content: center;
478
+ opacity: 0;
479
+ transition: all var(--fd-transition-normal);
480
+ backdrop-filter: blur(4px);
481
+ z-index: 15;
482
+ font-size: var(--fd-text-sm);
483
+ }
484
+
485
+ .flowdrop-tool-node:hover .flowdrop-tool-node__config-btn {
486
+ opacity: 1;
487
+ }
488
+
489
+ .flowdrop-tool-node__config-btn:hover {
490
+ background-color: var(--fd-muted);
491
+ border-color: var(--fd-border-strong);
492
+ color: var(--fd-foreground);
493
+ }
494
+
495
+ @keyframes spin {
496
+ to {
497
+ transform: rotate(360deg);
498
+ }
499
+ }
500
+
501
+ /* Handle: 20px/12px from base.css; position offsets, tool-specific hover/focus */
502
+ :global(.svelte-flow__node-tool .svelte-flow__handle) {
503
+ z-index: 20 !important;
504
+ pointer-events: auto !important;
505
+ }
506
+
507
+ :global(.svelte-flow__node-tool .svelte-flow__handle:hover) {
508
+ transform: translateY(-50%) scale(1.2) !important;
509
+ }
510
+
511
+ :global(.svelte-flow__node-tool .svelte-flow__handle:hover::before) {
512
+ box-shadow: 0 0 0 2px
513
+ color-mix(in srgb, var(--fd-tool-node-color) 30%, transparent) !important;
514
+ }
515
+
516
+ :global(.svelte-flow__node-tool .svelte-flow__handle:focus) {
517
+ outline: 2px solid var(--fd-tool-node-color) !important;
518
+ outline-offset: 2px !important;
519
+ }
520
+
521
+ /* Circle dot icon — shown in minimal skin via --fd-node-circle-display */
522
+ .flowdrop-tool-node__color-dot {
523
+ width: 10px;
524
+ height: 10px;
525
+ border-radius: 50%;
526
+ flex-shrink: 0;
527
+ display: var(--fd-node-circle-display, none);
528
+ }
471
529
  </style>