@flowdrop/flowdrop 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +252 -0
  3. package/dist/adapters/WorkflowAdapter.d.ts +167 -0
  4. package/dist/adapters/WorkflowAdapter.js +368 -0
  5. package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +96 -0
  6. package/dist/adapters/agentspec/AgentSpecAdapter.js +626 -0
  7. package/dist/adapters/agentspec/agentAdapter.d.ts +59 -0
  8. package/dist/adapters/agentspec/agentAdapter.js +91 -0
  9. package/dist/adapters/agentspec/autoLayout.d.ts +34 -0
  10. package/dist/adapters/agentspec/autoLayout.js +127 -0
  11. package/dist/adapters/agentspec/componentTypeDefaults.d.ts +73 -0
  12. package/dist/adapters/agentspec/componentTypeDefaults.js +238 -0
  13. package/dist/adapters/agentspec/defaultNodeTypes.d.ts +53 -0
  14. package/dist/adapters/agentspec/defaultNodeTypes.js +561 -0
  15. package/dist/adapters/agentspec/index.d.ts +37 -0
  16. package/dist/adapters/agentspec/index.js +39 -0
  17. package/dist/adapters/agentspec/validator.d.ts +34 -0
  18. package/dist/adapters/agentspec/validator.js +169 -0
  19. package/dist/api/enhanced-client.d.ts +183 -0
  20. package/dist/api/enhanced-client.js +430 -0
  21. package/dist/components/App.svelte +981 -0
  22. package/dist/components/App.svelte.d.ts +54 -0
  23. package/dist/components/CanvasBanner.stories.svelte +29 -0
  24. package/dist/components/CanvasBanner.stories.svelte.d.ts +27 -0
  25. package/dist/components/CanvasBanner.svelte +57 -0
  26. package/dist/components/CanvasBanner.svelte.d.ts +8 -0
  27. package/dist/components/ConfigForm.svelte +1138 -0
  28. package/dist/components/ConfigForm.svelte.d.ts +44 -0
  29. package/dist/components/ConfigModal.svelte +188 -0
  30. package/dist/components/ConfigModal.svelte.d.ts +13 -0
  31. package/dist/components/ConfigPanel.stories.svelte +47 -0
  32. package/dist/components/ConfigPanel.stories.svelte.d.ts +27 -0
  33. package/dist/components/ConfigPanel.svelte +182 -0
  34. package/dist/components/ConfigPanel.svelte.d.ts +32 -0
  35. package/dist/components/ConnectionLine.svelte +32 -0
  36. package/dist/components/ConnectionLine.svelte.d.ts +3 -0
  37. package/dist/components/EdgeRefresher.svelte +41 -0
  38. package/dist/components/EdgeRefresher.svelte.d.ts +9 -0
  39. package/dist/components/FlowDropZone.svelte +83 -0
  40. package/dist/components/FlowDropZone.svelte.d.ts +13 -0
  41. package/dist/components/LoadingSpinner.stories.svelte +30 -0
  42. package/dist/components/LoadingSpinner.stories.svelte.d.ts +27 -0
  43. package/dist/components/LoadingSpinner.svelte +36 -0
  44. package/dist/components/LoadingSpinner.svelte.d.ts +8 -0
  45. package/dist/components/Logo.stories.svelte +22 -0
  46. package/dist/components/Logo.stories.svelte.d.ts +27 -0
  47. package/dist/components/Logo.svelte +102 -0
  48. package/dist/components/Logo.svelte.d.ts +26 -0
  49. package/dist/components/LogsSidebar.svelte +563 -0
  50. package/dist/components/LogsSidebar.svelte.d.ts +17 -0
  51. package/dist/components/MarkdownDisplay.stories.svelte +36 -0
  52. package/dist/components/MarkdownDisplay.stories.svelte.d.ts +27 -0
  53. package/dist/components/MarkdownDisplay.svelte +29 -0
  54. package/dist/components/MarkdownDisplay.svelte.d.ts +7 -0
  55. package/dist/components/Navbar.stories.svelte +53 -0
  56. package/dist/components/Navbar.stories.svelte.d.ts +27 -0
  57. package/dist/components/Navbar.svelte +726 -0
  58. package/dist/components/Navbar.svelte.d.ts +29 -0
  59. package/dist/components/NodeSidebar.svelte +762 -0
  60. package/dist/components/NodeSidebar.svelte.d.ts +9 -0
  61. package/dist/components/NodeStatusOverlay.stories.svelte +85 -0
  62. package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +27 -0
  63. package/dist/components/NodeStatusOverlay.svelte +327 -0
  64. package/dist/components/NodeStatusOverlay.svelte.d.ts +11 -0
  65. package/dist/components/PipelineStatus.svelte +314 -0
  66. package/dist/components/PipelineStatus.svelte.d.ts +20 -0
  67. package/dist/components/PortCoordinateTracker.svelte +58 -0
  68. package/dist/components/PortCoordinateTracker.svelte.d.ts +12 -0
  69. package/dist/components/ReadOnlyDetails.svelte +170 -0
  70. package/dist/components/ReadOnlyDetails.svelte.d.ts +25 -0
  71. package/dist/components/SchemaForm.stories.svelte +116 -0
  72. package/dist/components/SchemaForm.stories.svelte.d.ts +27 -0
  73. package/dist/components/SchemaForm.svelte +536 -0
  74. package/dist/components/SchemaForm.svelte.d.ts +83 -0
  75. package/dist/components/SettingsModal.svelte +279 -0
  76. package/dist/components/SettingsModal.svelte.d.ts +23 -0
  77. package/dist/components/SettingsPanel.svelte +638 -0
  78. package/dist/components/SettingsPanel.svelte.d.ts +21 -0
  79. package/dist/components/StatusIcon.stories.svelte +60 -0
  80. package/dist/components/StatusIcon.stories.svelte.d.ts +27 -0
  81. package/dist/components/StatusIcon.svelte +119 -0
  82. package/dist/components/StatusIcon.svelte.d.ts +10 -0
  83. package/dist/components/StatusLabel.stories.svelte +17 -0
  84. package/dist/components/StatusLabel.stories.svelte.d.ts +27 -0
  85. package/dist/components/StatusLabel.svelte +33 -0
  86. package/dist/components/StatusLabel.svelte.d.ts +7 -0
  87. package/dist/components/ThemeToggle.stories.svelte +25 -0
  88. package/dist/components/ThemeToggle.stories.svelte.d.ts +27 -0
  89. package/dist/components/ThemeToggle.svelte +185 -0
  90. package/dist/components/ThemeToggle.svelte.d.ts +14 -0
  91. package/dist/components/UniversalNode.svelte +155 -0
  92. package/dist/components/UniversalNode.svelte.d.ts +15 -0
  93. package/dist/components/WorkflowEditor.svelte +1035 -0
  94. package/dist/components/WorkflowEditor.svelte.d.ts +23 -0
  95. package/dist/components/form/FormArray.svelte +1049 -0
  96. package/dist/components/form/FormArray.svelte.d.ts +22 -0
  97. package/dist/components/form/FormAutocomplete.svelte +1009 -0
  98. package/dist/components/form/FormAutocomplete.svelte.d.ts +25 -0
  99. package/dist/components/form/FormCheckboxGroup.stories.svelte +28 -0
  100. package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +27 -0
  101. package/dist/components/form/FormCheckboxGroup.svelte +155 -0
  102. package/dist/components/form/FormCheckboxGroup.svelte.d.ts +17 -0
  103. package/dist/components/form/FormCodeEditor.svelte +458 -0
  104. package/dist/components/form/FormCodeEditor.svelte.d.ts +25 -0
  105. package/dist/components/form/FormField.svelte +417 -0
  106. package/dist/components/form/FormField.svelte.d.ts +29 -0
  107. package/dist/components/form/FormFieldLight.svelte +425 -0
  108. package/dist/components/form/FormFieldLight.svelte.d.ts +18 -0
  109. package/dist/components/form/FormFieldWrapper.stories.svelte +53 -0
  110. package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +27 -0
  111. package/dist/components/form/FormFieldWrapper.svelte +125 -0
  112. package/dist/components/form/FormFieldWrapper.svelte.d.ts +18 -0
  113. package/dist/components/form/FormFieldset.svelte +142 -0
  114. package/dist/components/form/FormFieldset.svelte.d.ts +11 -0
  115. package/dist/components/form/FormMarkdownEditor.svelte +752 -0
  116. package/dist/components/form/FormMarkdownEditor.svelte.d.ts +33 -0
  117. package/dist/components/form/FormNumberField.stories.svelte +36 -0
  118. package/dist/components/form/FormNumberField.stories.svelte.d.ts +27 -0
  119. package/dist/components/form/FormNumberField.svelte +112 -0
  120. package/dist/components/form/FormNumberField.svelte.d.ts +25 -0
  121. package/dist/components/form/FormRangeField.stories.svelte +31 -0
  122. package/dist/components/form/FormRangeField.stories.svelte.d.ts +27 -0
  123. package/dist/components/form/FormRangeField.svelte +246 -0
  124. package/dist/components/form/FormRangeField.svelte.d.ts +23 -0
  125. package/dist/components/form/FormSelect.stories.svelte +50 -0
  126. package/dist/components/form/FormSelect.stories.svelte.d.ts +27 -0
  127. package/dist/components/form/FormSelect.svelte +129 -0
  128. package/dist/components/form/FormSelect.svelte.d.ts +20 -0
  129. package/dist/components/form/FormTemplateEditor.svelte +825 -0
  130. package/dist/components/form/FormTemplateEditor.svelte.d.ts +41 -0
  131. package/dist/components/form/FormTextField.stories.svelte +30 -0
  132. package/dist/components/form/FormTextField.stories.svelte.d.ts +27 -0
  133. package/dist/components/form/FormTextField.svelte +91 -0
  134. package/dist/components/form/FormTextField.svelte.d.ts +19 -0
  135. package/dist/components/form/FormTextarea.stories.svelte +34 -0
  136. package/dist/components/form/FormTextarea.stories.svelte.d.ts +27 -0
  137. package/dist/components/form/FormTextarea.svelte +97 -0
  138. package/dist/components/form/FormTextarea.svelte.d.ts +21 -0
  139. package/dist/components/form/FormToggle.stories.svelte +30 -0
  140. package/dist/components/form/FormToggle.stories.svelte.d.ts +27 -0
  141. package/dist/components/form/FormToggle.svelte +126 -0
  142. package/dist/components/form/FormToggle.svelte.d.ts +19 -0
  143. package/dist/components/form/FormUISchemaRenderer.svelte +136 -0
  144. package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +32 -0
  145. package/dist/components/form/index.d.ts +50 -0
  146. package/dist/components/form/index.js +54 -0
  147. package/dist/components/form/templateAutocomplete.d.ts +29 -0
  148. package/dist/components/form/templateAutocomplete.js +254 -0
  149. package/dist/components/form/types.d.ts +485 -0
  150. package/dist/components/form/types.js +73 -0
  151. package/dist/components/interrupt/ChoicePrompt.stories.svelte +52 -0
  152. package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +27 -0
  153. package/dist/components/interrupt/ChoicePrompt.svelte +401 -0
  154. package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +23 -0
  155. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +71 -0
  156. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +27 -0
  157. package/dist/components/interrupt/ConfirmationPrompt.svelte +292 -0
  158. package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +25 -0
  159. package/dist/components/interrupt/FormPrompt.svelte +236 -0
  160. package/dist/components/interrupt/FormPrompt.svelte.d.ts +23 -0
  161. package/dist/components/interrupt/InterruptBubble.svelte +601 -0
  162. package/dist/components/interrupt/InterruptBubble.svelte.d.ts +16 -0
  163. package/dist/components/interrupt/ReviewPrompt.stories.svelte +67 -0
  164. package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +27 -0
  165. package/dist/components/interrupt/ReviewPrompt.svelte +861 -0
  166. package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +23 -0
  167. package/dist/components/interrupt/TextInputPrompt.stories.svelte +47 -0
  168. package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +27 -0
  169. package/dist/components/interrupt/TextInputPrompt.svelte +346 -0
  170. package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +23 -0
  171. package/dist/components/interrupt/index.d.ts +13 -0
  172. package/dist/components/interrupt/index.js +15 -0
  173. package/dist/components/layouts/MainLayout.svelte +718 -0
  174. package/dist/components/layouts/MainLayout.svelte.d.ts +62 -0
  175. package/dist/components/nodes/GatewayNode.stories.svelte +108 -0
  176. package/dist/components/nodes/GatewayNode.stories.svelte.d.ts +26 -0
  177. package/dist/components/nodes/GatewayNode.svelte +591 -0
  178. package/dist/components/nodes/GatewayNode.svelte.d.ts +15 -0
  179. package/dist/components/nodes/IdeaNode.stories.svelte +52 -0
  180. package/dist/components/nodes/IdeaNode.stories.svelte.d.ts +26 -0
  181. package/dist/components/nodes/IdeaNode.svelte +455 -0
  182. package/dist/components/nodes/IdeaNode.svelte.d.ts +24 -0
  183. package/dist/components/nodes/NotesNode.stories.svelte +76 -0
  184. package/dist/components/nodes/NotesNode.stories.svelte.d.ts +26 -0
  185. package/dist/components/nodes/NotesNode.svelte +378 -0
  186. package/dist/components/nodes/NotesNode.svelte.d.ts +24 -0
  187. package/dist/components/nodes/SimpleNode.stories.svelte +159 -0
  188. package/dist/components/nodes/SimpleNode.stories.svelte.d.ts +26 -0
  189. package/dist/components/nodes/SimpleNode.svelte +451 -0
  190. package/dist/components/nodes/SimpleNode.svelte.d.ts +25 -0
  191. package/dist/components/nodes/SquareNode.stories.svelte +82 -0
  192. package/dist/components/nodes/SquareNode.stories.svelte.d.ts +26 -0
  193. package/dist/components/nodes/SquareNode.svelte +407 -0
  194. package/dist/components/nodes/SquareNode.svelte.d.ts +25 -0
  195. package/dist/components/nodes/TerminalNode.stories.svelte +25 -0
  196. package/dist/components/nodes/TerminalNode.stories.svelte.d.ts +26 -0
  197. package/dist/components/nodes/TerminalNode.svelte +690 -0
  198. package/dist/components/nodes/TerminalNode.svelte.d.ts +25 -0
  199. package/dist/components/nodes/ToolNode.stories.svelte +189 -0
  200. package/dist/components/nodes/ToolNode.stories.svelte.d.ts +26 -0
  201. package/dist/components/nodes/ToolNode.svelte +471 -0
  202. package/dist/components/nodes/ToolNode.svelte.d.ts +36 -0
  203. package/dist/components/nodes/WorkflowNode.stories.svelte +55 -0
  204. package/dist/components/nodes/WorkflowNode.stories.svelte.d.ts +26 -0
  205. package/dist/components/nodes/WorkflowNode.svelte +571 -0
  206. package/dist/components/nodes/WorkflowNode.svelte.d.ts +15 -0
  207. package/dist/components/playground/ChatPanel.svelte +905 -0
  208. package/dist/components/playground/ChatPanel.svelte.d.ts +46 -0
  209. package/dist/components/playground/ExecutionLogs.svelte +488 -0
  210. package/dist/components/playground/ExecutionLogs.svelte.d.ts +14 -0
  211. package/dist/components/playground/InputCollector.svelte +444 -0
  212. package/dist/components/playground/InputCollector.svelte.d.ts +16 -0
  213. package/dist/components/playground/MessageBubble.stories.svelte +62 -0
  214. package/dist/components/playground/MessageBubble.stories.svelte.d.ts +27 -0
  215. package/dist/components/playground/MessageBubble.svelte +633 -0
  216. package/dist/components/playground/MessageBubble.svelte.d.ts +24 -0
  217. package/dist/components/playground/Playground.svelte +1075 -0
  218. package/dist/components/playground/Playground.svelte.d.ts +25 -0
  219. package/dist/components/playground/PlaygroundModal.svelte +220 -0
  220. package/dist/components/playground/PlaygroundModal.svelte.d.ts +25 -0
  221. package/dist/components/playground/SessionManager.svelte +538 -0
  222. package/dist/components/playground/SessionManager.svelte.d.ts +20 -0
  223. package/dist/config/agentSpecEndpoints.d.ts +70 -0
  224. package/dist/config/agentSpecEndpoints.js +65 -0
  225. package/dist/config/constants.d.ts +43 -0
  226. package/dist/config/constants.js +31 -0
  227. package/dist/config/defaultCategories.d.ts +7 -0
  228. package/dist/config/defaultCategories.js +126 -0
  229. package/dist/config/defaultPortConfig.d.ts +6 -0
  230. package/dist/config/defaultPortConfig.js +201 -0
  231. package/dist/config/endpoints.d.ts +160 -0
  232. package/dist/config/endpoints.js +146 -0
  233. package/dist/config/runtimeConfig.d.ts +47 -0
  234. package/dist/config/runtimeConfig.js +80 -0
  235. package/dist/core/index.d.ts +75 -0
  236. package/dist/core/index.js +92 -0
  237. package/dist/display/index.d.ts +29 -0
  238. package/dist/display/index.js +36 -0
  239. package/dist/editor/index.d.ts +95 -0
  240. package/dist/editor/index.js +138 -0
  241. package/dist/form/code.d.ts +101 -0
  242. package/dist/form/code.js +168 -0
  243. package/dist/form/fieldRegistry.d.ts +169 -0
  244. package/dist/form/fieldRegistry.js +152 -0
  245. package/dist/form/full.d.ts +56 -0
  246. package/dist/form/full.js +80 -0
  247. package/dist/form/index.d.ts +77 -0
  248. package/dist/form/index.js +91 -0
  249. package/dist/form/markdown.d.ts +69 -0
  250. package/dist/form/markdown.js +103 -0
  251. package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
  252. package/dist/helpers/nodeLayoutHelper.js +19 -0
  253. package/dist/helpers/proximityConnect.d.ts +94 -0
  254. package/dist/helpers/proximityConnect.js +314 -0
  255. package/dist/helpers/workflowEditorHelper.d.ts +183 -0
  256. package/dist/helpers/workflowEditorHelper.js +595 -0
  257. package/dist/index.d.ts +37 -0
  258. package/dist/index.js +64 -0
  259. package/dist/mocks/app-environment.d.ts +8 -0
  260. package/dist/mocks/app-environment.js +16 -0
  261. package/dist/mocks/app-forms.d.ts +2 -0
  262. package/dist/mocks/app-forms.js +22 -0
  263. package/dist/mocks/app-navigation.d.ts +5 -0
  264. package/dist/mocks/app-navigation.js +36 -0
  265. package/dist/mocks/app-stores.d.ts +14 -0
  266. package/dist/mocks/app-stores.js +26 -0
  267. package/dist/playground/index.d.ts +131 -0
  268. package/dist/playground/index.js +172 -0
  269. package/dist/playground/mount.d.ts +203 -0
  270. package/dist/playground/mount.js +235 -0
  271. package/dist/registry/BaseRegistry.d.ts +92 -0
  272. package/dist/registry/BaseRegistry.js +124 -0
  273. package/dist/registry/builtinFormats.d.ts +23 -0
  274. package/dist/registry/builtinFormats.js +70 -0
  275. package/dist/registry/builtinNodes.d.ts +77 -0
  276. package/dist/registry/builtinNodes.js +211 -0
  277. package/dist/registry/index.d.ts +8 -0
  278. package/dist/registry/index.js +12 -0
  279. package/dist/registry/nodeComponentRegistry.d.ts +276 -0
  280. package/dist/registry/nodeComponentRegistry.js +262 -0
  281. package/dist/registry/plugin.d.ts +215 -0
  282. package/dist/registry/plugin.js +249 -0
  283. package/dist/registry/workflowFormatRegistry.d.ts +122 -0
  284. package/dist/registry/workflowFormatRegistry.js +96 -0
  285. package/dist/schema/index.d.ts +23 -0
  286. package/dist/schema/index.js +23 -0
  287. package/dist/schemas/v1/workflow.schema.json +1078 -0
  288. package/dist/services/agentSpecExecutionService.d.ts +106 -0
  289. package/dist/services/agentSpecExecutionService.js +334 -0
  290. package/dist/services/api.d.ts +115 -0
  291. package/dist/services/api.js +214 -0
  292. package/dist/services/apiVariableService.d.ts +114 -0
  293. package/dist/services/apiVariableService.js +338 -0
  294. package/dist/services/autoSaveService.d.ts +112 -0
  295. package/dist/services/autoSaveService.js +227 -0
  296. package/dist/services/categoriesApi.d.ts +14 -0
  297. package/dist/services/categoriesApi.js +49 -0
  298. package/dist/services/draftStorage.d.ts +171 -0
  299. package/dist/services/draftStorage.js +299 -0
  300. package/dist/services/dynamicSchemaService.d.ts +108 -0
  301. package/dist/services/dynamicSchemaService.js +444 -0
  302. package/dist/services/globalSave.d.ts +69 -0
  303. package/dist/services/globalSave.js +248 -0
  304. package/dist/services/historyService.d.ts +208 -0
  305. package/dist/services/historyService.js +321 -0
  306. package/dist/services/interruptService.d.ts +133 -0
  307. package/dist/services/interruptService.js +280 -0
  308. package/dist/services/nodeExecutionService.d.ts +63 -0
  309. package/dist/services/nodeExecutionService.js +266 -0
  310. package/dist/services/playgroundService.d.ts +130 -0
  311. package/dist/services/playgroundService.js +321 -0
  312. package/dist/services/portConfigApi.d.ts +14 -0
  313. package/dist/services/portConfigApi.js +54 -0
  314. package/dist/services/settingsService.d.ts +92 -0
  315. package/dist/services/settingsService.js +196 -0
  316. package/dist/services/toastService.d.ts +156 -0
  317. package/dist/services/toastService.js +265 -0
  318. package/dist/services/variableService.d.ts +141 -0
  319. package/dist/services/variableService.js +463 -0
  320. package/dist/services/workflowStorage.d.ts +37 -0
  321. package/dist/services/workflowStorage.js +116 -0
  322. package/dist/settings/index.d.ts +25 -0
  323. package/dist/settings/index.js +33 -0
  324. package/dist/stores/categoriesStore.svelte.d.ts +32 -0
  325. package/dist/stores/categoriesStore.svelte.js +77 -0
  326. package/dist/stores/editorStateMachine.svelte.d.ts +42 -0
  327. package/dist/stores/editorStateMachine.svelte.js +132 -0
  328. package/dist/stores/historyStore.svelte.d.ts +136 -0
  329. package/dist/stores/historyStore.svelte.js +207 -0
  330. package/dist/stores/interruptStore.svelte.d.ts +179 -0
  331. package/dist/stores/interruptStore.svelte.js +346 -0
  332. package/dist/stores/playgroundStore.svelte.d.ts +230 -0
  333. package/dist/stores/playgroundStore.svelte.js +515 -0
  334. package/dist/stores/portCoordinateStore.svelte.d.ts +66 -0
  335. package/dist/stores/portCoordinateStore.svelte.js +186 -0
  336. package/dist/stores/settingsStore.svelte.d.ts +158 -0
  337. package/dist/stores/settingsStore.svelte.js +544 -0
  338. package/dist/stores/workflowStore.svelte.d.ts +260 -0
  339. package/dist/stores/workflowStore.svelte.js +649 -0
  340. package/dist/stories/CanvasDecorator.svelte +49 -0
  341. package/dist/stories/CanvasDecorator.svelte.d.ts +8 -0
  342. package/dist/stories/NodeDecorator.svelte +73 -0
  343. package/dist/stories/NodeDecorator.svelte.d.ts +8 -0
  344. package/dist/stories/utils.d.ts +93 -0
  345. package/dist/stories/utils.js +122 -0
  346. package/dist/styles/base.css +1300 -0
  347. package/dist/styles/toast.css +35 -0
  348. package/dist/styles/tokens.css +475 -0
  349. package/dist/svelte-app.d.ts +150 -0
  350. package/dist/svelte-app.js +295 -0
  351. package/dist/types/agentspec.d.ts +318 -0
  352. package/dist/types/agentspec.js +48 -0
  353. package/dist/types/auth.d.ts +263 -0
  354. package/dist/types/auth.js +229 -0
  355. package/dist/types/config.d.ts +151 -0
  356. package/dist/types/config.js +7 -0
  357. package/dist/types/events.d.ts +190 -0
  358. package/dist/types/events.js +30 -0
  359. package/dist/types/index.d.ts +1234 -0
  360. package/dist/types/index.js +27 -0
  361. package/dist/types/interrupt.d.ts +390 -0
  362. package/dist/types/interrupt.js +145 -0
  363. package/dist/types/interruptState.d.ts +211 -0
  364. package/dist/types/interruptState.js +308 -0
  365. package/dist/types/playground.d.ts +351 -0
  366. package/dist/types/playground.js +95 -0
  367. package/dist/types/settings.d.ts +189 -0
  368. package/dist/types/settings.js +97 -0
  369. package/dist/types/uischema.d.ts +144 -0
  370. package/dist/types/uischema.js +51 -0
  371. package/dist/utils/colors.d.ts +288 -0
  372. package/dist/utils/colors.js +548 -0
  373. package/dist/utils/config.d.ts +37 -0
  374. package/dist/utils/config.js +226 -0
  375. package/dist/utils/connections.d.ts +125 -0
  376. package/dist/utils/connections.js +414 -0
  377. package/dist/utils/errors.d.ts +28 -0
  378. package/dist/utils/errors.js +44 -0
  379. package/dist/utils/fetchWithAuth.d.ts +25 -0
  380. package/dist/utils/fetchWithAuth.js +34 -0
  381. package/dist/utils/handleIds.d.ts +35 -0
  382. package/dist/utils/handleIds.js +58 -0
  383. package/dist/utils/handlePositioning.d.ts +31 -0
  384. package/dist/utils/handlePositioning.js +35 -0
  385. package/dist/utils/icons.d.ts +106 -0
  386. package/dist/utils/icons.js +157 -0
  387. package/dist/utils/logger.d.ts +47 -0
  388. package/dist/utils/logger.js +72 -0
  389. package/dist/utils/nodeStatus.d.ts +53 -0
  390. package/dist/utils/nodeStatus.js +183 -0
  391. package/dist/utils/nodeTypes.d.ts +117 -0
  392. package/dist/utils/nodeTypes.js +244 -0
  393. package/dist/utils/nodeWrapper.d.ts +39 -0
  394. package/dist/utils/nodeWrapper.js +62 -0
  395. package/dist/utils/performanceUtils.d.ts +30 -0
  396. package/dist/utils/performanceUtils.js +108 -0
  397. package/dist/utils/sanitize.d.ts +19 -0
  398. package/dist/utils/sanitize.js +31 -0
  399. package/dist/utils/uischema.d.ts +52 -0
  400. package/dist/utils/uischema.js +88 -0
  401. package/dist/utils/validation.d.ts +29 -0
  402. package/dist/utils/validation.js +39 -0
  403. package/package.json +292 -0
@@ -0,0 +1,626 @@
1
+ /**
2
+ * Agent Spec Adapter — Bidirectional conversion between FlowDrop and Agent Spec
3
+ *
4
+ * Converts between FlowDrop's StandardWorkflow format and Oracle's Open Agent Spec
5
+ * JSON format. Handles the key structural differences:
6
+ * - Unified edges (FlowDrop) ↔ control-flow + data-flow edges (Agent Spec)
7
+ * - Node IDs (FlowDrop) ↔ node names (Agent Spec)
8
+ * - Visual positions (FlowDrop) ↔ no positions (Agent Spec)
9
+ *
10
+ * @see https://github.com/oracle/agent-spec
11
+ */
12
+ import { getComponentTypeDefaults, extractComponentType, AGENTSPEC_NAMESPACE } from './componentTypeDefaults.js';
13
+ import { computeAutoLayout } from './autoLayout.js';
14
+ import { v4 as uuidv4 } from 'uuid';
15
+ import { logger } from '../../utils/logger.js';
16
+ import { buildHandleId, extractPortId, extractDirection } from '../../utils/handleIds.js';
17
+ // ============================================================================
18
+ // Property ↔ Port Conversion
19
+ // ============================================================================
20
+ /**
21
+ * Convert an Agent Spec Property to a FlowDrop NodePort.
22
+ */
23
+ function agentSpecPropertyToNodePort(prop, portType) {
24
+ // Map JSON Schema types to FlowDrop data types
25
+ let dataType;
26
+ switch (prop.type) {
27
+ case 'string':
28
+ dataType = 'string';
29
+ break;
30
+ case 'number':
31
+ case 'float':
32
+ dataType = 'number';
33
+ break;
34
+ case 'integer':
35
+ dataType = 'number';
36
+ break;
37
+ case 'boolean':
38
+ dataType = 'boolean';
39
+ break;
40
+ case 'array':
41
+ dataType = 'array';
42
+ break;
43
+ case 'object':
44
+ dataType = 'json';
45
+ break;
46
+ default:
47
+ dataType = 'mixed';
48
+ }
49
+ return {
50
+ id: prop.title,
51
+ name: prop.title,
52
+ type: portType,
53
+ dataType,
54
+ required: false,
55
+ description: prop.description
56
+ };
57
+ }
58
+ /**
59
+ * Convert a FlowDrop NodePort to an Agent Spec Property.
60
+ */
61
+ function nodePortToAgentSpecProperty(port) {
62
+ // Map FlowDrop data types to JSON Schema types
63
+ let type;
64
+ switch (port.dataType) {
65
+ case 'string':
66
+ type = 'string';
67
+ break;
68
+ case 'number':
69
+ case 'float':
70
+ type = 'number';
71
+ break;
72
+ case 'integer':
73
+ type = 'integer';
74
+ break;
75
+ case 'boolean':
76
+ type = 'boolean';
77
+ break;
78
+ case 'array':
79
+ type = 'array';
80
+ break;
81
+ case 'json':
82
+ case 'object':
83
+ type = 'object';
84
+ break;
85
+ default:
86
+ type = 'string';
87
+ }
88
+ const prop = {
89
+ title: port.id,
90
+ type
91
+ };
92
+ if (port.description)
93
+ prop.description = port.description;
94
+ if (port.defaultValue !== undefined)
95
+ prop.default = port.defaultValue;
96
+ return prop;
97
+ }
98
+ // ============================================================================
99
+ // AgentSpecAdapter
100
+ // ============================================================================
101
+ export class AgentSpecAdapter {
102
+ // ========================================================================
103
+ // FlowDrop → Agent Spec (Export)
104
+ // ========================================================================
105
+ /**
106
+ * Convert a FlowDrop StandardWorkflow to an Agent Spec Flow.
107
+ *
108
+ * Handles:
109
+ * - Node conversion with config → node attributes
110
+ * - Edge splitting into control-flow and data-flow
111
+ * - Position preservation in metadata
112
+ * - Gateway branch → from_branch mapping
113
+ */
114
+ toAgentSpec(workflow) {
115
+ // Build node ID → name mapping
116
+ // Agent Spec uses node names as references; FlowDrop uses structured IDs
117
+ const nodeIdToName = new Map();
118
+ for (const node of workflow.nodes) {
119
+ const name = this.resolveNodeName(node);
120
+ nodeIdToName.set(node.id, name);
121
+ }
122
+ // Convert nodes
123
+ const agentSpecNodes = workflow.nodes.map((node) => this.convertNodeToAgentSpec(node, nodeIdToName));
124
+ // Split edges into control-flow and data-flow
125
+ const controlFlowEdges = [];
126
+ const dataFlowEdges = [];
127
+ for (const edge of workflow.edges) {
128
+ const sourceNode = workflow.nodes.find((n) => n.id === edge.source);
129
+ if (!sourceNode)
130
+ continue;
131
+ const sourcePortId = extractPortId(edge.sourceHandle);
132
+ const sourcePortDataType = this.getSourcePortDataType(sourceNode, sourcePortId);
133
+ if (sourcePortDataType === 'trigger') {
134
+ controlFlowEdges.push(this.convertToControlFlowEdge(edge, sourceNode, nodeIdToName));
135
+ }
136
+ else {
137
+ dataFlowEdges.push(this.convertToDataFlowEdge(edge, nodeIdToName));
138
+ }
139
+ }
140
+ // Find start node
141
+ const startNodeName = this.findStartNodeName(agentSpecNodes, nodeIdToName);
142
+ return {
143
+ component_type: 'flow',
144
+ name: workflow.name,
145
+ description: workflow.description,
146
+ start_node: startNodeName,
147
+ nodes: agentSpecNodes,
148
+ control_flow_connections: controlFlowEdges,
149
+ data_flow_connections: dataFlowEdges.length > 0 ? dataFlowEdges : null,
150
+ metadata: {
151
+ 'flowdrop:workflow_id': workflow.id,
152
+ 'flowdrop:version': workflow.metadata?.version,
153
+ ...(workflow.metadata?.author ? { 'flowdrop:author': workflow.metadata.author } : {}),
154
+ ...(workflow.metadata?.tags ? { 'flowdrop:tags': workflow.metadata.tags } : {})
155
+ }
156
+ };
157
+ }
158
+ /**
159
+ * Export a FlowDrop StandardWorkflow as Agent Spec JSON string.
160
+ */
161
+ exportJSON(workflow) {
162
+ return JSON.stringify(this.toAgentSpec(workflow), null, 2);
163
+ }
164
+ // ========================================================================
165
+ // Agent Spec → FlowDrop (Import)
166
+ // ========================================================================
167
+ /**
168
+ * Convert an Agent Spec Flow to a FlowDrop StandardWorkflow.
169
+ *
170
+ * Handles:
171
+ * - Auto-layout (Agent Spec has no positions)
172
+ * - Edge merging (control-flow + data-flow → unified edges)
173
+ * - Node type mapping via registry
174
+ * - Component type preservation in extensions
175
+ */
176
+ fromAgentSpec(agentSpecFlow) {
177
+ // Compute positions for nodes
178
+ const positions = computeAutoLayout(agentSpecFlow);
179
+ // Build name → FlowDrop node ID mapping
180
+ const nameToNodeId = new Map();
181
+ const nodeCountByType = new Map();
182
+ for (const asNode of agentSpecFlow.nodes) {
183
+ const typeId = `${AGENTSPEC_NAMESPACE}.${asNode.component_type}`;
184
+ const count = (nodeCountByType.get(typeId) || 0) + 1;
185
+ nodeCountByType.set(typeId, count);
186
+ const nodeId = `${typeId}.${count}`;
187
+ nameToNodeId.set(asNode.name, nodeId);
188
+ }
189
+ // Convert nodes
190
+ const nodes = agentSpecFlow.nodes.map((asNode) => {
191
+ const nodeId = nameToNodeId.get(asNode.name);
192
+ const position = positions.get(asNode.name) || { x: 0, y: 0 };
193
+ return this.convertNodeFromAgentSpec(asNode, nodeId, position);
194
+ });
195
+ // Convert edges (merge control-flow + data-flow into unified edges)
196
+ const edges = [];
197
+ // Control-flow edges → trigger port connections
198
+ for (const cfEdge of agentSpecFlow.control_flow_connections) {
199
+ const edge = this.convertFromControlFlowEdge(cfEdge, nameToNodeId, nodes);
200
+ if (edge)
201
+ edges.push(edge);
202
+ }
203
+ // Data-flow edges → data port connections
204
+ if (agentSpecFlow.data_flow_connections) {
205
+ for (const dfEdge of agentSpecFlow.data_flow_connections) {
206
+ const edge = this.convertFromDataFlowEdge(dfEdge, nameToNodeId);
207
+ if (edge)
208
+ edges.push(edge);
209
+ }
210
+ }
211
+ return {
212
+ id: agentSpecFlow.metadata?.['flowdrop:workflow_id'] || uuidv4(),
213
+ name: agentSpecFlow.name,
214
+ description: agentSpecFlow.description,
215
+ nodes,
216
+ edges,
217
+ metadata: {
218
+ version: agentSpecFlow.metadata?.['flowdrop:version'] || '1.0.0',
219
+ createdAt: new Date().toISOString(),
220
+ updatedAt: new Date().toISOString(),
221
+ author: agentSpecFlow.metadata?.['flowdrop:author'],
222
+ tags: agentSpecFlow.metadata?.['flowdrop:tags']
223
+ }
224
+ };
225
+ }
226
+ /**
227
+ * Import an Agent Spec flow from a JSON string.
228
+ */
229
+ importJSON(json) {
230
+ const parsed = JSON.parse(json);
231
+ return this.fromAgentSpec(parsed);
232
+ }
233
+ // ========================================================================
234
+ // Node Conversion (Private)
235
+ // ========================================================================
236
+ /**
237
+ * Resolve a stable name for a FlowDrop node in Agent Spec.
238
+ * Uses the node's config instanceTitle, label, or falls back to ID.
239
+ */
240
+ resolveNodeName(node) {
241
+ const instanceTitle = node.data.config?.instanceTitle;
242
+ if (instanceTitle)
243
+ return instanceTitle;
244
+ return node.data.label || node.id;
245
+ }
246
+ /**
247
+ * Convert a FlowDrop StandardNode to an Agent Spec node.
248
+ */
249
+ convertNodeToAgentSpec(node, nodeIdToName) {
250
+ const componentType = this.resolveComponentType(node);
251
+ const name = nodeIdToName.get(node.id) || node.id;
252
+ // Convert data ports (skip trigger/tool ports — those are handled as edges)
253
+ const dataInputs = node.data.metadata.inputs
254
+ .filter((p) => p.dataType !== 'trigger' && p.dataType !== 'tool')
255
+ .map((p) => nodePortToAgentSpecProperty(p));
256
+ const dataOutputs = node.data.metadata.outputs
257
+ .filter((p) => p.dataType !== 'trigger' && p.dataType !== 'tool')
258
+ .map((p) => nodePortToAgentSpecProperty(p));
259
+ // Build base node
260
+ const base = {
261
+ component_type: componentType,
262
+ name,
263
+ description: node.data.metadata.description || undefined,
264
+ inputs: dataInputs.length > 0 ? dataInputs : undefined,
265
+ outputs: dataOutputs.length > 0 ? dataOutputs : undefined,
266
+ metadata: {
267
+ 'flowdrop:position': node.position,
268
+ 'flowdrop:node_id': node.id,
269
+ 'flowdrop:node_type_id': node.data.metadata.id
270
+ }
271
+ };
272
+ // Add type-specific attributes from config
273
+ return this.addNodeSpecificAttributes(base, node);
274
+ }
275
+ /**
276
+ * Add Agent Spec type-specific attributes from FlowDrop config.
277
+ */
278
+ addNodeSpecificAttributes(asNode, fdNode) {
279
+ const config = fdNode.data.config || {};
280
+ switch (asNode.component_type) {
281
+ case 'llm_node': {
282
+ const llmNode = asNode;
283
+ if (config.prompt_template)
284
+ llmNode.prompt_template = config.prompt_template;
285
+ if (config.system_prompt)
286
+ llmNode.system_prompt = config.system_prompt;
287
+ if (config.llm_config_ref)
288
+ llmNode.llm_config = config.llm_config_ref;
289
+ return llmNode;
290
+ }
291
+ case 'branching_node': {
292
+ const branchNode = asNode;
293
+ const branches = config.branches;
294
+ branchNode.branches = branches
295
+ ? branches.map((b) => ({
296
+ name: b.name,
297
+ condition: b.condition || undefined,
298
+ description: b.description || undefined
299
+ }))
300
+ : [];
301
+ return branchNode;
302
+ }
303
+ case 'api_node': {
304
+ const apiNode = asNode;
305
+ if (config.endpoint)
306
+ apiNode.endpoint = config.endpoint;
307
+ if (config.method)
308
+ apiNode.method = config.method;
309
+ if (config.headers) {
310
+ try {
311
+ apiNode.headers =
312
+ typeof config.headers === 'string'
313
+ ? JSON.parse(config.headers)
314
+ : config.headers;
315
+ }
316
+ catch (error) {
317
+ // Ignore parse errors
318
+ logger.warn('Failed to parse header JSON', error);
319
+ }
320
+ }
321
+ return apiNode;
322
+ }
323
+ case 'agent_node': {
324
+ const agentNode = asNode;
325
+ if (config.agent_ref)
326
+ agentNode.agent = config.agent_ref;
327
+ return agentNode;
328
+ }
329
+ case 'flow_node': {
330
+ const flowNode = asNode;
331
+ if (config.flow_ref)
332
+ flowNode.flow = config.flow_ref;
333
+ return flowNode;
334
+ }
335
+ case 'map_node': {
336
+ const mapNode = asNode;
337
+ if (config.input_collection)
338
+ mapNode.input_collection = config.input_collection;
339
+ if (config.output_collection)
340
+ mapNode.output_collection = config.output_collection;
341
+ if (config.map_flow_ref)
342
+ mapNode.map_flow = config.map_flow_ref;
343
+ return mapNode;
344
+ }
345
+ case 'tool_node': {
346
+ const toolNode = asNode;
347
+ if (config.tool_ref)
348
+ toolNode.tool = config.tool_ref;
349
+ return toolNode;
350
+ }
351
+ default:
352
+ return asNode;
353
+ }
354
+ }
355
+ /**
356
+ * Resolve Agent Spec component type from a FlowDrop node.
357
+ */
358
+ resolveComponentType(node) {
359
+ // Check extensions first (round-trip preservation)
360
+ const ext = node.data.metadata.extensions?.['agentspec:component_type'];
361
+ if (ext && typeof ext === 'string') {
362
+ return ext;
363
+ }
364
+ // Infer from FlowDrop node type ID
365
+ const fromId = extractComponentType(node.data.metadata.id);
366
+ if (fromId)
367
+ return fromId;
368
+ // Infer from FlowDrop visual type + category
369
+ const nodeType = node.data.metadata.type;
370
+ const category = node.data.metadata.category;
371
+ if (nodeType === 'terminal' && category === 'triggers')
372
+ return 'start_node';
373
+ if (nodeType === 'terminal' && category === 'outputs')
374
+ return 'end_node';
375
+ if (nodeType === 'gateway')
376
+ return 'branching_node';
377
+ if (nodeType === 'tool')
378
+ return 'tool_node';
379
+ if (category === 'ai' || category === 'models')
380
+ return 'llm_node';
381
+ if (category === 'agents')
382
+ return 'agent_node';
383
+ if (category === 'data')
384
+ return 'api_node';
385
+ // Default fallback
386
+ return 'llm_node';
387
+ }
388
+ /**
389
+ * Convert an Agent Spec node to a FlowDrop StandardNode.
390
+ *
391
+ * Uses lightweight component type defaults for trigger ports and visual styling.
392
+ * Does NOT depend on the full node type registry — works with any component_type,
393
+ * including custom/unknown types (falls back to sensible defaults).
394
+ */
395
+ convertNodeFromAgentSpec(asNode, nodeId, position) {
396
+ // Restore position from metadata if available (round-trip)
397
+ const savedPosition = asNode.metadata?.['flowdrop:position'];
398
+ const finalPosition = savedPosition || position;
399
+ // Convert inputs/outputs to FlowDrop ports
400
+ const dataInputs = (asNode.inputs || []).map((p) => agentSpecPropertyToNodePort(p, 'input'));
401
+ const dataOutputs = (asNode.outputs || []).map((p) => agentSpecPropertyToNodePort(p, 'output'));
402
+ // Use lightweight adapter defaults (never throws on unknown types)
403
+ const defaults = getComponentTypeDefaults(asNode.component_type);
404
+ const nodeTypeId = asNode.metadata?.['flowdrop:node_type_id'] ||
405
+ `${AGENTSPEC_NAMESPACE}.${asNode.component_type}`;
406
+ const metadata = {
407
+ id: nodeTypeId,
408
+ name: defaults.defaultName,
409
+ type: defaults.visualType,
410
+ description: asNode.description || defaults.defaultDescription,
411
+ category: defaults.category,
412
+ version: '1.0.0',
413
+ icon: defaults.icon,
414
+ color: defaults.color,
415
+ badge: defaults.badge,
416
+ inputs: [...defaults.triggerInputs, ...dataInputs],
417
+ outputs: [...defaults.triggerOutputs, ...dataOutputs],
418
+ configSchema: { type: 'object', properties: {} },
419
+ formats: ['agentspec'],
420
+ extensions: {
421
+ 'agentspec:component_type': asNode.component_type,
422
+ 'agentspec:original_name': asNode.name
423
+ }
424
+ };
425
+ // Build config from Agent Spec node-specific attributes
426
+ const config = this.extractConfigFromAgentSpec(asNode);
427
+ return {
428
+ id: nodeId,
429
+ type: nodeTypeId,
430
+ position: finalPosition,
431
+ data: {
432
+ label: asNode.name,
433
+ config,
434
+ metadata
435
+ }
436
+ };
437
+ }
438
+ /**
439
+ * Extract FlowDrop config values from Agent Spec node-specific attributes.
440
+ */
441
+ extractConfigFromAgentSpec(asNode) {
442
+ const config = {};
443
+ switch (asNode.component_type) {
444
+ case 'llm_node': {
445
+ const llm = asNode;
446
+ if (llm.prompt_template)
447
+ config.prompt_template = llm.prompt_template;
448
+ if (llm.system_prompt)
449
+ config.system_prompt = llm.system_prompt;
450
+ if (llm.llm_config) {
451
+ config.llm_config_ref =
452
+ typeof llm.llm_config === 'string' ? llm.llm_config : llm.llm_config.name;
453
+ }
454
+ break;
455
+ }
456
+ case 'branching_node': {
457
+ const branch = asNode;
458
+ config.branches = branch.branches.map((b) => ({
459
+ name: b.name,
460
+ label: b.name,
461
+ condition: b.condition || '',
462
+ isDefault: !b.condition
463
+ }));
464
+ break;
465
+ }
466
+ case 'api_node': {
467
+ const api = asNode;
468
+ if (api.endpoint)
469
+ config.endpoint = api.endpoint;
470
+ if (api.method)
471
+ config.method = api.method;
472
+ if (api.headers)
473
+ config.headers = JSON.stringify(api.headers, null, 2);
474
+ break;
475
+ }
476
+ case 'agent_node': {
477
+ const agent = asNode;
478
+ if (agent.agent) {
479
+ config.agent_ref = typeof agent.agent === 'string' ? agent.agent : agent.agent.name;
480
+ }
481
+ break;
482
+ }
483
+ case 'flow_node': {
484
+ const flow = asNode;
485
+ if (flow.flow) {
486
+ config.flow_ref = typeof flow.flow === 'string' ? flow.flow : flow.flow.name;
487
+ }
488
+ break;
489
+ }
490
+ case 'map_node': {
491
+ const map = asNode;
492
+ if (map.input_collection)
493
+ config.input_collection = map.input_collection;
494
+ if (map.output_collection)
495
+ config.output_collection = map.output_collection;
496
+ if (map.map_flow) {
497
+ config.map_flow_ref = typeof map.map_flow === 'string' ? map.map_flow : map.map_flow.name;
498
+ }
499
+ break;
500
+ }
501
+ case 'tool_node': {
502
+ const tool = asNode;
503
+ if (tool.tool) {
504
+ config.tool_ref = typeof tool.tool === 'string' ? tool.tool : tool.tool.name;
505
+ }
506
+ break;
507
+ }
508
+ }
509
+ return config;
510
+ }
511
+ // ========================================================================
512
+ // Edge Conversion (Private)
513
+ // ========================================================================
514
+ /**
515
+ * Get the data type of a source port from a FlowDrop node.
516
+ */
517
+ getSourcePortDataType(node, portId) {
518
+ if (!portId)
519
+ return null;
520
+ // Check static output ports
521
+ const port = node.data.metadata.outputs.find((p) => p.id === portId);
522
+ if (port)
523
+ return port.dataType;
524
+ // Check if it's a gateway branch (always trigger)
525
+ if (node.data.metadata.type === 'gateway') {
526
+ const branches = node.data.config?.branches;
527
+ if (branches?.some((b) => b.name === portId)) {
528
+ return 'trigger';
529
+ }
530
+ }
531
+ // Check dynamic outputs
532
+ const dynamicOutputs = node.data.config?.dynamicOutputs;
533
+ if (dynamicOutputs) {
534
+ const dp = dynamicOutputs.find((p) => p.name === portId);
535
+ if (dp)
536
+ return dp.dataType;
537
+ }
538
+ return null;
539
+ }
540
+ /**
541
+ * Convert a FlowDrop trigger edge to an Agent Spec ControlFlowEdge.
542
+ */
543
+ convertToControlFlowEdge(edge, sourceNode, nodeIdToName) {
544
+ const fromNode = nodeIdToName.get(edge.source) || edge.source;
545
+ const toNode = nodeIdToName.get(edge.target) || edge.target;
546
+ const sourcePortId = extractPortId(edge.sourceHandle);
547
+ // Determine from_branch for gateway nodes
548
+ let fromBranch;
549
+ if (sourceNode.data.metadata.type === 'gateway' && sourcePortId) {
550
+ const branches = sourceNode.data.config?.branches;
551
+ if (branches?.some((b) => b.name === sourcePortId)) {
552
+ fromBranch = sourcePortId;
553
+ }
554
+ }
555
+ return {
556
+ name: `${fromNode}_to_${toNode}${fromBranch ? `_${fromBranch}` : ''}`,
557
+ from_node: fromNode,
558
+ to_node: toNode,
559
+ from_branch: fromBranch
560
+ };
561
+ }
562
+ /**
563
+ * Convert a FlowDrop data edge to an Agent Spec DataFlowEdge.
564
+ */
565
+ convertToDataFlowEdge(edge, nodeIdToName) {
566
+ const sourceNode = nodeIdToName.get(edge.source) || edge.source;
567
+ const destNode = nodeIdToName.get(edge.target) || edge.target;
568
+ const sourceOutput = extractPortId(edge.sourceHandle) || 'output';
569
+ const destInput = extractPortId(edge.targetHandle) || 'input';
570
+ return {
571
+ name: `${sourceNode}_${sourceOutput}_to_${destNode}_${destInput}`,
572
+ source_node: sourceNode,
573
+ source_output: sourceOutput,
574
+ destination_node: destNode,
575
+ destination_input: destInput
576
+ };
577
+ }
578
+ /**
579
+ * Convert an Agent Spec ControlFlowEdge to a FlowDrop edge.
580
+ */
581
+ convertFromControlFlowEdge(cfEdge, nameToNodeId, nodes) {
582
+ const sourceId = nameToNodeId.get(cfEdge.from_node);
583
+ const targetId = nameToNodeId.get(cfEdge.to_node);
584
+ if (!sourceId || !targetId)
585
+ return null;
586
+ // Determine source handle
587
+ let sourcePortId = 'trigger'; // default for non-branch control flow
588
+ if (cfEdge.from_branch) {
589
+ sourcePortId = cfEdge.from_branch;
590
+ }
591
+ return {
592
+ id: uuidv4(),
593
+ source: sourceId,
594
+ target: targetId,
595
+ sourceHandle: buildHandleId(sourceId, 'output', sourcePortId),
596
+ targetHandle: buildHandleId(targetId, 'input', 'trigger')
597
+ };
598
+ }
599
+ /**
600
+ * Convert an Agent Spec DataFlowEdge to a FlowDrop edge.
601
+ */
602
+ convertFromDataFlowEdge(dfEdge, nameToNodeId) {
603
+ const sourceId = nameToNodeId.get(dfEdge.source_node);
604
+ const targetId = nameToNodeId.get(dfEdge.destination_node);
605
+ if (!sourceId || !targetId)
606
+ return null;
607
+ return {
608
+ id: uuidv4(),
609
+ source: sourceId,
610
+ target: targetId,
611
+ sourceHandle: buildHandleId(sourceId, 'output', dfEdge.source_output),
612
+ targetHandle: buildHandleId(targetId, 'input', dfEdge.destination_input)
613
+ };
614
+ }
615
+ /**
616
+ * Find the start node name from converted Agent Spec nodes.
617
+ */
618
+ findStartNodeName(nodes, nodeIdToName) {
619
+ // Look for an explicit start_node
620
+ const startNode = nodes.find((n) => n.component_type === 'start_node');
621
+ if (startNode)
622
+ return startNode.name;
623
+ // Fall back to the first node
624
+ return nodes.length > 0 ? nodes[0].name : 'start';
625
+ }
626
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Agent-Level Adapter
3
+ *
4
+ * Handles conversion between FlowDrop workflows and full Agent Spec Documents
5
+ * (which wrap a Flow with Agent metadata like tools, LLM config, etc.)
6
+ */
7
+ import type { AgentSpecDocument, AgentSpecTool, AgentSpecLLMConfig } from '../../types/agentspec.js';
8
+ import type { StandardWorkflow } from '../WorkflowAdapter.js';
9
+ /**
10
+ * Agent-level configuration that wraps a workflow.
11
+ * Contains the Agent Spec agent metadata that lives outside the flow.
12
+ */
13
+ export interface AgentConfig {
14
+ /** Agent name */
15
+ name: string;
16
+ /** Agent description */
17
+ description?: string;
18
+ /** System prompt for the agent */
19
+ systemPrompt?: string;
20
+ /** Tools available to the agent */
21
+ tools?: AgentSpecTool[];
22
+ /** LLM configuration */
23
+ llmConfig?: AgentSpecLLMConfig;
24
+ }
25
+ /**
26
+ * Result of importing an Agent Spec Document.
27
+ */
28
+ export interface AgentSpecImportResult {
29
+ /** The FlowDrop workflow (from the flow) */
30
+ workflow: StandardWorkflow;
31
+ /** Agent metadata (from the agent, if present) */
32
+ agentConfig?: AgentConfig;
33
+ /** Shared tools declared at document level */
34
+ tools?: AgentSpecTool[];
35
+ /** Shared LLM configurations declared at document level */
36
+ llmConfigs?: AgentSpecLLMConfig[];
37
+ }
38
+ export declare class AgentSpecAgentAdapter {
39
+ private flowAdapter;
40
+ constructor();
41
+ /**
42
+ * Convert a FlowDrop workflow + agent config into a full AgentSpecDocument.
43
+ *
44
+ * The document wraps the flow with agent metadata (tools, LLM config, system prompt).
45
+ */
46
+ toAgentSpecDocument(workflow: StandardWorkflow, agentConfig?: AgentConfig, tools?: AgentSpecTool[], llmConfigs?: AgentSpecLLMConfig[]): AgentSpecDocument;
47
+ /**
48
+ * Import a full AgentSpecDocument, extracting the flow and agent metadata.
49
+ */
50
+ fromAgentSpecDocument(doc: AgentSpecDocument): AgentSpecImportResult;
51
+ /**
52
+ * Export a full AgentSpecDocument as JSON string.
53
+ */
54
+ exportJSON(workflow: StandardWorkflow, agentConfig?: AgentConfig, tools?: AgentSpecTool[], llmConfigs?: AgentSpecLLMConfig[]): string;
55
+ /**
56
+ * Import from JSON string containing an AgentSpecDocument.
57
+ */
58
+ importJSON(json: string): AgentSpecImportResult;
59
+ }