@flowdrop/flowdrop 1.4.0 → 1.6.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 (441) hide show
  1. package/README.md +94 -51
  2. package/dist/adapters/WorkflowAdapter.d.ts +1 -1
  3. package/dist/adapters/WorkflowAdapter.js +27 -47
  4. package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +2 -2
  5. package/dist/adapters/agentspec/AgentSpecAdapter.js +122 -133
  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 +52 -6
  9. package/dist/adapters/agentspec/autoLayout.js +118 -23
  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 +20 -22
  18. package/dist/api/enhanced-client.d.ts +3 -3
  19. package/dist/api/enhanced-client.js +72 -73
  20. package/dist/chat/commandClassifier.d.ts +19 -0
  21. package/dist/chat/commandClassifier.js +30 -0
  22. package/dist/chat/index.d.ts +27 -0
  23. package/dist/chat/index.js +32 -0
  24. package/dist/chat/responseParser.d.ts +21 -0
  25. package/dist/chat/responseParser.js +91 -0
  26. package/dist/commands/batch.d.ts +18 -0
  27. package/dist/commands/batch.js +54 -0
  28. package/dist/commands/executor.d.ts +37 -0
  29. package/dist/commands/executor.js +1133 -0
  30. package/dist/commands/index.d.ts +14 -0
  31. package/dist/commands/index.js +17 -0
  32. package/dist/commands/parser.d.ts +16 -0
  33. package/dist/commands/parser.js +295 -0
  34. package/dist/commands/positioner.d.ts +19 -0
  35. package/dist/commands/positioner.js +33 -0
  36. package/dist/commands/storeIntegration.svelte.d.ts +16 -0
  37. package/dist/commands/storeIntegration.svelte.js +67 -0
  38. package/dist/commands/types.d.ts +343 -0
  39. package/dist/commands/types.js +45 -0
  40. package/dist/components/App.svelte +522 -237
  41. package/dist/components/App.svelte.d.ts +11 -8
  42. package/dist/components/CanvasBanner.stories.svelte +10 -16
  43. package/dist/components/CanvasBanner.stories.svelte.d.ts +1 -1
  44. package/dist/components/CanvasBanner.svelte +2 -2
  45. package/dist/components/CanvasBanner.svelte.d.ts +1 -1
  46. package/dist/components/CanvasController.svelte +37 -0
  47. package/dist/components/CanvasController.svelte.d.ts +32 -0
  48. package/dist/components/ConfigForm.svelte +118 -256
  49. package/dist/components/ConfigForm.svelte.d.ts +2 -2
  50. package/dist/components/ConfigMappingRow.svelte +128 -0
  51. package/dist/components/ConfigMappingRow.svelte.d.ts +8 -0
  52. package/dist/components/ConfigModal.svelte +3 -3
  53. package/dist/components/ConfigModal.svelte.d.ts +1 -1
  54. package/dist/components/ConfigPanel.stories.svelte +19 -19
  55. package/dist/components/ConfigPanel.stories.svelte.d.ts +1 -1
  56. package/dist/components/ConfigPanel.svelte +57 -19
  57. package/dist/components/ConfigPanel.svelte.d.ts +3 -1
  58. package/dist/components/ConnectionLine.svelte +4 -4
  59. package/dist/components/EdgeRefresher.svelte +1 -1
  60. package/dist/components/FlowDropEdge.stories.svelte +110 -110
  61. package/dist/components/FlowDropEdge.svelte +11 -19
  62. package/dist/components/FlowDropEdge.svelte.d.ts +1 -1
  63. package/dist/components/FlowDropZone.svelte +6 -9
  64. package/dist/components/FlowDropZone.svelte.d.ts +1 -1
  65. package/dist/components/LoadingSpinner.stories.svelte +13 -13
  66. package/dist/components/LoadingSpinner.stories.svelte.d.ts +1 -1
  67. package/dist/components/LoadingSpinner.svelte +3 -3
  68. package/dist/components/LoadingSpinner.svelte.d.ts +1 -1
  69. package/dist/components/Logo.stories.svelte +4 -4
  70. package/dist/components/Logo.stories.svelte.d.ts +1 -1
  71. package/dist/components/Logo.svelte +3 -9
  72. package/dist/components/LogsSidebar.svelte +46 -53
  73. package/dist/components/LogsSidebar.svelte.d.ts +1 -1
  74. package/dist/components/MarkdownDisplay.stories.svelte +10 -14
  75. package/dist/components/MarkdownDisplay.stories.svelte.d.ts +1 -1
  76. package/dist/components/MarkdownDisplay.svelte +4 -6
  77. package/dist/components/Navbar.stories.svelte +19 -19
  78. package/dist/components/Navbar.stories.svelte.d.ts +1 -1
  79. package/dist/components/Navbar.svelte +28 -49
  80. package/dist/components/Navbar.svelte.d.ts +2 -2
  81. package/dist/components/NodeSidebar.svelte +55 -135
  82. package/dist/components/NodeSidebar.svelte.d.ts +1 -1
  83. package/dist/components/NodeStatusOverlay.stories.svelte +19 -31
  84. package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +1 -1
  85. package/dist/components/NodeStatusOverlay.svelte +40 -55
  86. package/dist/components/NodeStatusOverlay.svelte.d.ts +3 -3
  87. package/dist/components/NodeSwapPicker.svelte +493 -0
  88. package/dist/components/NodeSwapPicker.svelte.d.ts +16 -0
  89. package/dist/components/PipelineStatus.svelte +63 -89
  90. package/dist/components/PipelineStatus.svelte.d.ts +4 -4
  91. package/dist/components/PortCoordinateTracker.svelte +5 -7
  92. package/dist/components/PortCoordinateTracker.svelte.d.ts +1 -1
  93. package/dist/components/PortMappingRow.svelte +205 -0
  94. package/dist/components/PortMappingRow.svelte.d.ts +12 -0
  95. package/dist/components/ReadOnlyDetails.svelte +1 -1
  96. package/dist/components/SchemaForm.stories.svelte +53 -53
  97. package/dist/components/SchemaForm.stories.svelte.d.ts +1 -1
  98. package/dist/components/SchemaForm.svelte +24 -51
  99. package/dist/components/SchemaForm.svelte.d.ts +2 -2
  100. package/dist/components/SettingsModal.svelte +6 -9
  101. package/dist/components/SettingsModal.svelte.d.ts +1 -1
  102. package/dist/components/SettingsPanel.svelte +138 -158
  103. package/dist/components/SettingsPanel.svelte.d.ts +1 -1
  104. package/dist/components/StatusIcon.stories.svelte +16 -29
  105. package/dist/components/StatusIcon.stories.svelte.d.ts +1 -1
  106. package/dist/components/StatusIcon.svelte +19 -19
  107. package/dist/components/StatusIcon.svelte.d.ts +2 -2
  108. package/dist/components/StatusLabel.stories.svelte +8 -8
  109. package/dist/components/StatusLabel.stories.svelte.d.ts +1 -1
  110. package/dist/components/SwapMappingEditor.svelte +529 -0
  111. package/dist/components/SwapMappingEditor.svelte.d.ts +12 -0
  112. package/dist/components/ThemeToggle.stories.svelte +10 -10
  113. package/dist/components/ThemeToggle.stories.svelte.d.ts +1 -1
  114. package/dist/components/ThemeToggle.svelte +22 -33
  115. package/dist/components/ThemeToggle.svelte.d.ts +1 -1
  116. package/dist/components/UniversalNode.svelte +29 -41
  117. package/dist/components/UniversalNode.svelte.d.ts +3 -3
  118. package/dist/components/WorkflowEditor.svelte +210 -170
  119. package/dist/components/WorkflowEditor.svelte.d.ts +12 -4
  120. package/dist/components/chat/AIChatPanel.svelte +797 -0
  121. package/dist/components/chat/AIChatPanel.svelte.d.ts +13 -0
  122. package/dist/components/chat/CommandPreview.svelte +234 -0
  123. package/dist/components/chat/CommandPreview.svelte.d.ts +9 -0
  124. package/dist/components/console/CommandConsole.stories.svelte +111 -0
  125. package/dist/components/console/CommandConsole.stories.svelte.d.ts +27 -0
  126. package/dist/components/console/CommandConsole.svelte +263 -0
  127. package/dist/components/console/CommandConsole.svelte.d.ts +11 -0
  128. package/dist/components/console/ConsoleAutocomplete.svelte +142 -0
  129. package/dist/components/console/ConsoleAutocomplete.svelte.d.ts +21 -0
  130. package/dist/components/console/ConsoleInput.svelte +771 -0
  131. package/dist/components/console/ConsoleInput.svelte.d.ts +16 -0
  132. package/dist/components/console/ConsoleOutput.svelte +116 -0
  133. package/dist/components/console/ConsoleOutput.svelte.d.ts +11 -0
  134. package/dist/components/console/formatters.d.ts +26 -0
  135. package/dist/components/console/formatters.js +116 -0
  136. package/dist/components/form/FormArray.svelte +75 -132
  137. package/dist/components/form/FormArray.svelte.d.ts +1 -1
  138. package/dist/components/form/FormAutocomplete.svelte +65 -108
  139. package/dist/components/form/FormAutocomplete.svelte.d.ts +1 -1
  140. package/dist/components/form/FormCheckboxGroup.stories.svelte +13 -16
  141. package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +1 -1
  142. package/dist/components/form/FormCheckboxGroup.svelte +2 -2
  143. package/dist/components/form/FormCodeEditor.svelte +42 -56
  144. package/dist/components/form/FormField.svelte +79 -90
  145. package/dist/components/form/FormField.svelte.d.ts +2 -2
  146. package/dist/components/form/FormFieldLight.svelte +72 -88
  147. package/dist/components/form/FormFieldLight.svelte.d.ts +1 -1
  148. package/dist/components/form/FormFieldWrapper.stories.svelte +14 -14
  149. package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +1 -1
  150. package/dist/components/form/FormFieldWrapper.svelte +2 -9
  151. package/dist/components/form/FormFieldWrapper.svelte.d.ts +1 -1
  152. package/dist/components/form/FormFieldset.svelte +3 -3
  153. package/dist/components/form/FormFieldset.svelte.d.ts +2 -2
  154. package/dist/components/form/FormMarkdownEditor.svelte +123 -156
  155. package/dist/components/form/FormNumberField.stories.svelte +18 -18
  156. package/dist/components/form/FormNumberField.stories.svelte.d.ts +1 -1
  157. package/dist/components/form/FormNumberField.svelte +6 -6
  158. package/dist/components/form/FormRangeField.stories.svelte +13 -13
  159. package/dist/components/form/FormRangeField.stories.svelte.d.ts +1 -1
  160. package/dist/components/form/FormRangeField.svelte +4 -12
  161. package/dist/components/form/FormSelect.stories.svelte +21 -21
  162. package/dist/components/form/FormSelect.stories.svelte.d.ts +1 -1
  163. package/dist/components/form/FormSelect.svelte +5 -5
  164. package/dist/components/form/FormSelect.svelte.d.ts +1 -1
  165. package/dist/components/form/FormTemplateEditor.svelte +126 -175
  166. package/dist/components/form/FormTemplateEditor.svelte.d.ts +1 -1
  167. package/dist/components/form/FormTextField.stories.svelte +17 -23
  168. package/dist/components/form/FormTextField.stories.svelte.d.ts +1 -1
  169. package/dist/components/form/FormTextField.svelte +4 -4
  170. package/dist/components/form/FormTextarea.stories.svelte +18 -21
  171. package/dist/components/form/FormTextarea.stories.svelte.d.ts +1 -1
  172. package/dist/components/form/FormTextarea.svelte +4 -4
  173. package/dist/components/form/FormToggle.stories.svelte +13 -16
  174. package/dist/components/form/FormToggle.stories.svelte.d.ts +1 -1
  175. package/dist/components/form/FormToggle.svelte +3 -3
  176. package/dist/components/form/FormUISchemaRenderer.svelte +12 -19
  177. package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +3 -3
  178. package/dist/components/form/index.d.ts +19 -19
  179. package/dist/components/form/index.js +18 -18
  180. package/dist/components/form/templateAutocomplete.d.ts +2 -2
  181. package/dist/components/form/templateAutocomplete.js +55 -64
  182. package/dist/components/form/types.d.ts +6 -6
  183. package/dist/components/form/types.js +4 -9
  184. package/dist/components/icons/AlertCircleIcon.svelte +1 -6
  185. package/dist/components/icons/CogIcon.svelte +1 -6
  186. package/dist/components/interrupt/ChoicePrompt.stories.svelte +27 -27
  187. package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +1 -1
  188. package/dist/components/interrupt/ChoicePrompt.svelte +17 -41
  189. package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +1 -1
  190. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +17 -17
  191. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +1 -1
  192. package/dist/components/interrupt/ConfirmationPrompt.svelte +10 -16
  193. package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +1 -1
  194. package/dist/components/interrupt/FormPrompt.svelte +10 -15
  195. package/dist/components/interrupt/FormPrompt.svelte.d.ts +1 -1
  196. package/dist/components/interrupt/InterruptBubble.svelte +87 -121
  197. package/dist/components/interrupt/InterruptBubble.svelte.d.ts +2 -2
  198. package/dist/components/interrupt/ReviewPrompt.stories.svelte +37 -37
  199. package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +1 -1
  200. package/dist/components/interrupt/ReviewPrompt.svelte +55 -75
  201. package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +1 -1
  202. package/dist/components/interrupt/TextInputPrompt.stories.svelte +16 -17
  203. package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +1 -1
  204. package/dist/components/interrupt/TextInputPrompt.svelte +13 -18
  205. package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +1 -1
  206. package/dist/components/interrupt/index.d.ts +6 -5
  207. package/dist/components/interrupt/index.js +6 -5
  208. package/dist/components/layouts/MainLayout.svelte +46 -84
  209. package/dist/components/layouts/MainLayout.svelte.d.ts +6 -6
  210. package/dist/components/nodes/GatewayNode.stories.svelte +64 -65
  211. package/dist/components/nodes/GatewayNode.svelte +37 -70
  212. package/dist/components/nodes/GatewayNode.svelte.d.ts +3 -3
  213. package/dist/components/nodes/IdeaNode.stories.svelte +25 -26
  214. package/dist/components/nodes/IdeaNode.svelte +22 -36
  215. package/dist/components/nodes/IdeaNode.svelte.d.ts +1 -1
  216. package/dist/components/nodes/NotesNode.stories.svelte +37 -38
  217. package/dist/components/nodes/NotesNode.svelte +28 -39
  218. package/dist/components/nodes/NotesNode.svelte.d.ts +1 -1
  219. package/dist/components/nodes/SimpleNode.stories.svelte +137 -138
  220. package/dist/components/nodes/SimpleNode.svelte +44 -74
  221. package/dist/components/nodes/SimpleNode.svelte.d.ts +1 -1
  222. package/dist/components/nodes/SquareNode.stories.svelte +75 -75
  223. package/dist/components/nodes/SquareNode.svelte +42 -68
  224. package/dist/components/nodes/SquareNode.svelte.d.ts +1 -1
  225. package/dist/components/nodes/TerminalNode.stories.svelte +10 -10
  226. package/dist/components/nodes/TerminalNode.svelte +74 -112
  227. package/dist/components/nodes/TerminalNode.svelte.d.ts +1 -1
  228. package/dist/components/nodes/ToolNode.stories.svelte +115 -116
  229. package/dist/components/nodes/ToolNode.svelte +31 -64
  230. package/dist/components/nodes/ToolNode.svelte.d.ts +1 -1
  231. package/dist/components/nodes/WorkflowNode.stories.svelte +84 -89
  232. package/dist/components/nodes/WorkflowNode.svelte +50 -103
  233. package/dist/components/nodes/WorkflowNode.svelte.d.ts +3 -3
  234. package/dist/components/playground/ChatPanel.svelte +47 -103
  235. package/dist/components/playground/ExecutionLogs.svelte +45 -68
  236. package/dist/components/playground/InputCollector.svelte +32 -51
  237. package/dist/components/playground/MessageBubble.stories.svelte +25 -25
  238. package/dist/components/playground/MessageBubble.stories.svelte.d.ts +1 -1
  239. package/dist/components/playground/MessageBubble.svelte +54 -70
  240. package/dist/components/playground/MessageBubble.svelte.d.ts +1 -1
  241. package/dist/components/playground/Playground.svelte +60 -91
  242. package/dist/components/playground/Playground.svelte.d.ts +3 -3
  243. package/dist/components/playground/PlaygroundModal.svelte +8 -12
  244. package/dist/components/playground/PlaygroundModal.svelte.d.ts +3 -3
  245. package/dist/components/playground/SessionManager.svelte +34 -40
  246. package/dist/components/playground/SessionManager.svelte.d.ts +1 -1
  247. package/dist/config/agentSpecEndpoints.d.ts +1 -1
  248. package/dist/config/agentSpecEndpoints.js +20 -20
  249. package/dist/config/constants.js +2 -2
  250. package/dist/config/defaultCategories.d.ts +1 -1
  251. package/dist/config/defaultCategories.js +86 -86
  252. package/dist/config/defaultPortConfig.d.ts +1 -1
  253. package/dist/config/defaultPortConfig.js +144 -144
  254. package/dist/config/endpoints.d.ts +12 -4
  255. package/dist/config/endpoints.js +70 -65
  256. package/dist/config/runtimeConfig.d.ts +2 -2
  257. package/dist/config/runtimeConfig.js +8 -8
  258. package/dist/core/index.d.ts +68 -63
  259. package/dist/core/index.js +44 -35
  260. package/dist/display/index.d.ts +2 -2
  261. package/dist/display/index.js +2 -2
  262. package/dist/editor/index.d.ts +64 -62
  263. package/dist/editor/index.js +57 -55
  264. package/dist/form/code.d.ts +5 -5
  265. package/dist/form/code.js +14 -14
  266. package/dist/form/fieldRegistry.d.ts +3 -3
  267. package/dist/form/fieldRegistry.js +9 -11
  268. package/dist/form/full.d.ts +8 -8
  269. package/dist/form/full.js +9 -9
  270. package/dist/form/index.d.ts +18 -18
  271. package/dist/form/index.js +16 -16
  272. package/dist/form/markdown.d.ts +4 -4
  273. package/dist/form/markdown.js +8 -8
  274. package/dist/helpers/proximityConnect.d.ts +3 -3
  275. package/dist/helpers/proximityConnect.js +40 -35
  276. package/dist/helpers/workflowEditorHelper.d.ts +8 -58
  277. package/dist/helpers/workflowEditorHelper.js +73 -292
  278. package/dist/index.d.ts +6 -6
  279. package/dist/index.js +6 -6
  280. package/dist/mocks/app-environment.js +2 -2
  281. package/dist/mocks/app-forms.js +1 -1
  282. package/dist/mocks/app-navigation.js +2 -2
  283. package/dist/mocks/app-stores.js +3 -3
  284. package/dist/playground/index.d.ts +19 -19
  285. package/dist/playground/index.js +16 -16
  286. package/dist/playground/mount.d.ts +3 -3
  287. package/dist/playground/mount.js +24 -24
  288. package/dist/registry/builtinFormats.js +13 -13
  289. package/dist/registry/builtinNodes.d.ts +2 -2
  290. package/dist/registry/builtinNodes.js +77 -77
  291. package/dist/registry/index.d.ts +4 -4
  292. package/dist/registry/index.js +4 -4
  293. package/dist/registry/nodeComponentRegistry.d.ts +8 -8
  294. package/dist/registry/nodeComponentRegistry.js +9 -11
  295. package/dist/registry/plugin.d.ts +2 -2
  296. package/dist/registry/plugin.js +11 -11
  297. package/dist/registry/workflowFormatRegistry.d.ts +3 -3
  298. package/dist/registry/workflowFormatRegistry.js +2 -2
  299. package/dist/schema/index.d.ts +1 -1
  300. package/dist/schema/index.js +2 -2
  301. package/dist/schemas/v1/workflow.schema.json +107 -22
  302. package/dist/services/agentSpecExecutionService.d.ts +3 -3
  303. package/dist/services/agentSpecExecutionService.js +55 -56
  304. package/dist/services/api.d.ts +2 -2
  305. package/dist/services/api.js +37 -37
  306. package/dist/services/apiVariableService.d.ts +1 -1
  307. package/dist/services/apiVariableService.js +34 -41
  308. package/dist/services/autoSaveService.js +8 -8
  309. package/dist/services/categoriesApi.d.ts +2 -2
  310. package/dist/services/categoriesApi.js +8 -8
  311. package/dist/services/chatService.d.ts +65 -0
  312. package/dist/services/chatService.js +131 -0
  313. package/dist/services/draftStorage.d.ts +1 -1
  314. package/dist/services/draftStorage.js +11 -11
  315. package/dist/services/dynamicSchemaService.d.ts +1 -1
  316. package/dist/services/dynamicSchemaService.js +39 -41
  317. package/dist/services/globalSave.d.ts +2 -2
  318. package/dist/services/globalSave.js +38 -41
  319. package/dist/services/historyService.d.ts +7 -5
  320. package/dist/services/historyService.js +29 -14
  321. package/dist/services/interruptService.d.ts +1 -1
  322. package/dist/services/interruptService.js +29 -35
  323. package/dist/services/nodeExecutionService.d.ts +1 -1
  324. package/dist/services/nodeExecutionService.js +44 -45
  325. package/dist/services/playgroundService.d.ts +1 -1
  326. package/dist/services/playgroundService.js +29 -29
  327. package/dist/services/portConfigApi.d.ts +2 -2
  328. package/dist/services/portConfigApi.js +8 -8
  329. package/dist/services/settingsService.d.ts +2 -2
  330. package/dist/services/settingsService.js +19 -25
  331. package/dist/services/toastService.d.ts +4 -4
  332. package/dist/services/toastService.js +33 -33
  333. package/dist/services/variableService.d.ts +1 -1
  334. package/dist/services/variableService.js +36 -36
  335. package/dist/services/workflowStorage.d.ts +2 -2
  336. package/dist/services/workflowStorage.js +13 -13
  337. package/dist/settings/index.d.ts +7 -7
  338. package/dist/settings/index.js +6 -6
  339. package/dist/skins/default.d.ts +1 -1
  340. package/dist/skins/default.js +1 -1
  341. package/dist/skins/index.d.ts +3 -3
  342. package/dist/skins/index.js +7 -7
  343. package/dist/skins/slate.d.ts +1 -1
  344. package/dist/skins/slate.js +69 -69
  345. package/dist/stores/categoriesStore.svelte.d.ts +1 -1
  346. package/dist/stores/categoriesStore.svelte.js +5 -5
  347. package/dist/stores/editorStateMachine.svelte.d.ts +2 -2
  348. package/dist/stores/editorStateMachine.svelte.js +34 -34
  349. package/dist/stores/historyStore.svelte.d.ts +4 -4
  350. package/dist/stores/historyStore.svelte.js +4 -4
  351. package/dist/stores/interruptStore.svelte.d.ts +3 -3
  352. package/dist/stores/interruptStore.svelte.js +27 -22
  353. package/dist/stores/playgroundStore.svelte.d.ts +3 -3
  354. package/dist/stores/playgroundStore.svelte.js +29 -23
  355. package/dist/stores/portCoordinateStore.svelte.d.ts +6 -2
  356. package/dist/stores/portCoordinateStore.svelte.js +30 -39
  357. package/dist/stores/settingsStore.svelte.d.ts +2 -2
  358. package/dist/stores/settingsStore.svelte.js +57 -62
  359. package/dist/stores/workflowStore.svelte.d.ts +34 -5
  360. package/dist/stores/workflowStore.svelte.js +127 -108
  361. package/dist/stories/CanvasDecorator.svelte +7 -10
  362. package/dist/stories/CanvasDecorator.svelte.d.ts +2 -2
  363. package/dist/stories/EdgeDecorator.svelte +28 -31
  364. package/dist/stories/EdgeDecorator.svelte.d.ts +1 -1
  365. package/dist/stories/NodeDecorator.svelte +14 -20
  366. package/dist/stories/NodeDecorator.svelte.d.ts +1 -1
  367. package/dist/stories/utils.d.ts +2 -2
  368. package/dist/stories/utils.js +89 -93
  369. package/dist/styles/base.css +16 -50
  370. package/dist/styles/tokens.css +10 -28
  371. package/dist/svelte-app.d.ts +10 -10
  372. package/dist/svelte-app.js +39 -39
  373. package/dist/themes/default.d.ts +1 -1
  374. package/dist/themes/default.js +4 -4
  375. package/dist/themes/index.d.ts +3 -3
  376. package/dist/themes/index.js +11 -11
  377. package/dist/themes/minimal.d.ts +1 -1
  378. package/dist/themes/minimal.js +5 -5
  379. package/dist/types/agentspec.d.ts +18 -18
  380. package/dist/types/agentspec.js +2 -2
  381. package/dist/types/auth.d.ts +1 -1
  382. package/dist/types/auth.js +6 -6
  383. package/dist/types/chat.d.ts +63 -0
  384. package/dist/types/chat.js +9 -0
  385. package/dist/types/config.d.ts +6 -6
  386. package/dist/types/events.d.ts +28 -2
  387. package/dist/types/events.js +2 -1
  388. package/dist/types/index.d.ts +40 -32
  389. package/dist/types/index.js +6 -6
  390. package/dist/types/interrupt.d.ts +6 -6
  391. package/dist/types/interrupt.js +21 -21
  392. package/dist/types/interruptState.d.ts +12 -12
  393. package/dist/types/interruptState.js +66 -66
  394. package/dist/types/playground.d.ts +7 -7
  395. package/dist/types/playground.js +14 -14
  396. package/dist/types/settings.d.ts +12 -4
  397. package/dist/types/settings.js +21 -23
  398. package/dist/types/skin.d.ts +1 -1
  399. package/dist/types/theme.d.ts +2 -2
  400. package/dist/types/uischema.d.ts +4 -4
  401. package/dist/types/uischema.js +3 -3
  402. package/dist/utils/colors.d.ts +1 -1
  403. package/dist/utils/colors.js +95 -97
  404. package/dist/utils/config.d.ts +2 -2
  405. package/dist/utils/config.js +48 -48
  406. package/dist/utils/connections.d.ts +2 -2
  407. package/dist/utils/connections.js +15 -15
  408. package/dist/utils/edgeStyling.d.ts +42 -0
  409. package/dist/utils/edgeStyling.js +173 -0
  410. package/dist/utils/errors.js +3 -3
  411. package/dist/utils/fetchWithAuth.d.ts +1 -1
  412. package/dist/utils/fetchWithAuth.js +2 -2
  413. package/dist/utils/handleIds.d.ts +2 -2
  414. package/dist/utils/handleIds.js +8 -8
  415. package/dist/utils/handlePositioning.d.ts +1 -1
  416. package/dist/utils/handlePositioning.js +2 -2
  417. package/dist/utils/icons.d.ts +1 -1
  418. package/dist/utils/icons.js +74 -74
  419. package/dist/utils/logger.d.ts +1 -1
  420. package/dist/utils/logger.js +7 -7
  421. package/dist/utils/nodeIds.d.ts +31 -0
  422. package/dist/utils/nodeIds.js +42 -0
  423. package/dist/utils/nodeStatus.d.ts +1 -1
  424. package/dist/utils/nodeStatus.js +48 -48
  425. package/dist/utils/nodeSwap.d.ts +221 -0
  426. package/dist/utils/nodeSwap.js +680 -0
  427. package/dist/utils/nodeTypes.d.ts +1 -1
  428. package/dist/utils/nodeTypes.js +20 -21
  429. package/dist/utils/nodeWrapper.d.ts +7 -7
  430. package/dist/utils/nodeWrapper.js +19 -21
  431. package/dist/utils/performanceUtils.d.ts +1 -1
  432. package/dist/utils/performanceUtils.js +1 -2
  433. package/dist/utils/portUtils.d.ts +2 -2
  434. package/dist/utils/portUtils.js +1 -1
  435. package/dist/utils/sanitize.js +1 -1
  436. package/dist/utils/uischema.d.ts +2 -2
  437. package/dist/utils/uischema.js +8 -8
  438. package/dist/utils/validation.js +8 -8
  439. package/package.json +12 -11
  440. package/dist/helpers/nodeLayoutHelper.d.ts +0 -14
  441. package/dist/helpers/nodeLayoutHelper.js +0 -19
@@ -6,8 +6,8 @@
6
6
  *
7
7
  * @module stores/playgroundStore
8
8
  */
9
- import { isChatInputNode, defaultIsTerminalStatus, } from "../types/playground.js";
10
- import { logger } from "../utils/logger.js";
9
+ import { isChatInputNode, defaultIsTerminalStatus } from '../types/playground.js';
10
+ import { logger } from '../utils/logger.js';
11
11
  // =========================================================================
12
12
  // Core State
13
13
  // =========================================================================
@@ -101,7 +101,7 @@ export function getLastPollTimestamp() {
101
101
  * Get current session status
102
102
  */
103
103
  export function getSessionStatus() {
104
- return _currentSession?.status ?? "idle";
104
+ return _currentSession?.status ?? 'idle';
105
105
  }
106
106
  /**
107
107
  * Get message count
@@ -113,13 +113,13 @@ export function getMessageCount() {
113
113
  * Get chat messages (excludes log messages)
114
114
  */
115
115
  export function getChatMessages() {
116
- return _messages.filter((m) => m.role !== "log");
116
+ return _messages.filter((m) => m.role !== 'log');
117
117
  }
118
118
  /**
119
119
  * Get log messages only
120
120
  */
121
121
  export function getLogMessages() {
122
- return _messages.filter((m) => m.role === "log");
122
+ return _messages.filter((m) => m.role === 'log');
123
123
  }
124
124
  /**
125
125
  * Get the latest message
@@ -145,21 +145,21 @@ export function getInputFields() {
145
145
  const nodeTypeId = node.data.metadata?.id ?? node.type;
146
146
  // Check if this is an input-type node
147
147
  // The category can be "inputs" (standard) or variations like "input"
148
- const categoryStr = String(category || "");
149
- const isInputCategory = categoryStr === "inputs" || categoryStr === "input";
148
+ const categoryStr = String(category || '');
149
+ const isInputCategory = categoryStr === 'inputs' || categoryStr === 'input';
150
150
  if (isInputCategory || isChatInputNode(nodeTypeId)) {
151
151
  // Get output ports that provide data
152
152
  const outputs = node.data.metadata?.outputs ?? [];
153
153
  outputs.forEach((output) => {
154
- if (output.type === "output") {
154
+ if (output.type === 'output') {
155
155
  // Create a field for each output
156
156
  const field = {
157
157
  nodeId: node.id,
158
158
  fieldId: output.id,
159
159
  label: node.data.label || output.name || nodeTypeId,
160
- type: output.dataType || "string",
160
+ type: output.dataType || 'string',
161
161
  defaultValue: node.data.config?.[output.id],
162
- required: output.required ?? false,
162
+ required: output.required ?? false
163
163
  };
164
164
  // Check for schema in configSchema
165
165
  const configSchema = node.data.metadata?.configSchema;
@@ -178,10 +178,10 @@ export function getInputFields() {
178
178
  nodeId: node.id,
179
179
  fieldId: key,
180
180
  label: schema.title || key,
181
- type: schema.type || "string",
181
+ type: schema.type || 'string',
182
182
  defaultValue: node.data.config?.[key] ?? schema.default,
183
183
  required: configSchema.required?.includes(key) ?? false,
184
- schema,
184
+ schema
185
185
  };
186
186
  fields.push(field);
187
187
  });
@@ -196,7 +196,7 @@ export function getInputFields() {
196
196
  */
197
197
  export function getHasChatInput() {
198
198
  const fields = getInputFields();
199
- return fields.some((field) => isChatInputNode(field.nodeId) || field.type === "string");
199
+ return fields.some((field) => isChatInputNode(field.nodeId) || field.type === 'string');
200
200
  }
201
201
  /**
202
202
  * Get session count
@@ -275,13 +275,13 @@ export const playgroundActions = {
275
275
  _currentSession = {
276
276
  ..._currentSession,
277
277
  status,
278
- updatedAt: new Date().toISOString(),
278
+ updatedAt: new Date().toISOString()
279
279
  };
280
280
  }
281
281
  // Also update in sessions list
282
282
  const session = _currentSession;
283
283
  if (session) {
284
- _sessions = _sessions.map((s) => s.id === session.id ? { ...s, status } : s);
284
+ _sessions = _sessions.map((s) => (s.id === session.id ? { ...s, status } : s));
285
285
  }
286
286
  },
287
287
  /**
@@ -324,12 +324,21 @@ export const playgroundActions = {
324
324
  },
325
325
  /**
326
326
  * Add a message to the current session
327
- * Messages are automatically sorted chronologically after adding
327
+ * Uses binary search insertion for O(log n) instead of full sort.
328
328
  *
329
329
  * @param message - The message to add
330
330
  */
331
331
  addMessage: (message) => {
332
- _messages = sortMessagesChronologically([..._messages, message]);
332
+ const seq = message.sequenceNumber ?? 0;
333
+ let lo = 0, hi = _messages.length;
334
+ while (lo < hi) {
335
+ const mid = (lo + hi) >>> 1;
336
+ if ((_messages[mid].sequenceNumber ?? 0) <= seq)
337
+ lo = mid + 1;
338
+ else
339
+ hi = mid;
340
+ }
341
+ _messages = [..._messages.slice(0, lo), message, ..._messages.slice(lo)];
333
342
  },
334
343
  /**
335
344
  * Add multiple messages to the current session
@@ -344,10 +353,7 @@ export const playgroundActions = {
344
353
  const existingIds = new Set(_messages.map((m) => m.id));
345
354
  const uniqueNewMessages = newMessages.filter((m) => !existingIds.has(m.id));
346
355
  // Sort the combined messages chronologically
347
- _messages = sortMessagesChronologically([
348
- ..._messages,
349
- ...uniqueNewMessages,
350
- ]);
356
+ _messages = sortMessagesChronologically([..._messages, ...uniqueNewMessages]);
351
357
  },
352
358
  /**
353
359
  * Clear all messages
@@ -413,7 +419,7 @@ export const playgroundActions = {
413
419
  _messages = [];
414
420
  _lastPollTimestamp = null;
415
421
  }
416
- },
422
+ }
417
423
  };
418
424
  // =========================================================================
419
425
  // Polling Callback Factory
@@ -517,6 +523,6 @@ export async function refreshSessionMessages(fetchMessages, isTerminalStatus) {
517
523
  callback(response);
518
524
  }
519
525
  catch (err) {
520
- logger.error("[playgroundStore] Failed to refresh messages:", err);
526
+ logger.error('[playgroundStore] Failed to refresh messages:', err);
521
527
  }
522
528
  }
@@ -12,8 +12,8 @@
12
12
  * which SvelteFlow already maintains for all node types. This avoids replicating
13
13
  * CSS positioning logic and stays automatically accurate.
14
14
  */
15
- import type { WorkflowNode as WorkflowNodeType, PortCoordinate, PortCoordinateMap } from "../types/index.js";
16
- import type { InternalNode } from "@xyflow/svelte";
15
+ import type { WorkflowNode as WorkflowNodeType, PortCoordinate, PortCoordinateMap } from '../types/index.js';
16
+ import type { InternalNode } from '@xyflow/svelte';
17
17
  /**
18
18
  * Rebuild coordinates for ALL nodes from SvelteFlow internals.
19
19
  * Call on initial workflow load (after render) and after bulk changes.
@@ -36,6 +36,10 @@ export declare function updateNodePortCoordinates(node: WorkflowNodeType, getInt
36
36
  * @param nodeId - ID of the node to remove
37
37
  */
38
38
  export declare function removeNodePortCoordinates(nodeId: string): void;
39
+ /**
40
+ * Clear all port coordinates (lifecycle cleanup).
41
+ */
42
+ export declare function clearPortCoordinates(): void;
39
43
  /**
40
44
  * Get coordinates for a specific handle.
41
45
  *
@@ -12,9 +12,9 @@
12
12
  * which SvelteFlow already maintains for all node types. This avoids replicating
13
13
  * CSS positioning logic and stays automatically accurate.
14
14
  */
15
- import { SvelteMap } from "svelte/reactivity";
16
- import { untrack } from "svelte";
17
- import { ProximityConnectHelper } from "../helpers/proximityConnect.js";
15
+ import { SvelteMap } from 'svelte/reactivity';
16
+ import { untrack } from 'svelte';
17
+ import { ProximityConnectHelper } from '../helpers/proximityConnect.js';
18
18
  /** Reactive state holding all port absolute coordinates, keyed by handleId */
19
19
  let coordinates = $state(new SvelteMap());
20
20
  /**
@@ -28,14 +28,14 @@ function parseHandleId(handleId) {
28
28
  // Match the last occurrence of -input- or -output- to handle nodeIds with hyphens
29
29
  const inputMatch = handleId.match(/^(.+)-input-(.+)$/);
30
30
  if (inputMatch) {
31
- return { nodeId: inputMatch[1], direction: "input", portId: inputMatch[2] };
31
+ return { nodeId: inputMatch[1], direction: 'input', portId: inputMatch[2] };
32
32
  }
33
33
  const outputMatch = handleId.match(/^(.+)-output-(.+)$/);
34
34
  if (outputMatch) {
35
35
  return {
36
36
  nodeId: outputMatch[1],
37
- direction: "output",
38
- portId: outputMatch[2],
37
+ direction: 'output',
38
+ portId: outputMatch[2]
39
39
  };
40
40
  }
41
41
  return null;
@@ -46,11 +46,11 @@ function parseHandleId(handleId) {
46
46
  */
47
47
  function buildPortDataTypeLookup(node) {
48
48
  const lookup = new Map();
49
- const inputs = ProximityConnectHelper.getAllPorts(node, "input");
49
+ const inputs = ProximityConnectHelper.getAllPorts(node, 'input');
50
50
  for (const port of inputs) {
51
51
  lookup.set(`input-${port.id}`, port.dataType);
52
52
  }
53
- const outputs = ProximityConnectHelper.getAllPorts(node, "output");
53
+ const outputs = ProximityConnectHelper.getAllPorts(node, 'output');
54
54
  for (const port of outputs) {
55
55
  lookup.set(`output-${port.id}`, port.dataType);
56
56
  }
@@ -70,10 +70,7 @@ function computeNodePortCoordinates(node, internalNode) {
70
70
  const posAbs = internalNode.internals.positionAbsolute;
71
71
  const dataTypeLookup = buildPortDataTypeLookup(node);
72
72
  const result = [];
73
- const allHandles = [
74
- ...(handleBounds.source ?? []),
75
- ...(handleBounds.target ?? []),
76
- ];
73
+ const allHandles = [...(handleBounds.source ?? []), ...(handleBounds.target ?? [])];
77
74
  for (const handle of allHandles) {
78
75
  if (!handle.id)
79
76
  continue;
@@ -90,7 +87,7 @@ function computeNodePortCoordinates(node, internalNode) {
90
87
  handleId: handle.id,
91
88
  nodeId: parsed.nodeId,
92
89
  direction: parsed.direction,
93
- dataType,
90
+ dataType
94
91
  });
95
92
  }
96
93
  return result;
@@ -126,27 +123,19 @@ export function updateNodePortCoordinates(node, getInternalNode) {
126
123
  const internalNode = getInternalNode(node.id);
127
124
  if (!internalNode)
128
125
  return;
129
- // Remove old entries for this node.
130
- // untrack prevents this read from creating a reactive dependency on `coordinates`
131
- // inside any $effect that calls this function — otherwise the effect would re-run
132
- // every time we mutate `coordinates`, creating an infinite reactive loop during drag.
133
- const keysToDelete = untrack(() => {
134
- const keys = [];
126
+ // Build a new map with all entries except this node's, then add recomputed entries.
127
+ // Single assignment fires one reactive notification instead of N deletes + M sets.
128
+ const newMap = new SvelteMap();
129
+ untrack(() => {
135
130
  for (const [key, coord] of coordinates) {
136
- if (coord.nodeId === node.id) {
137
- keys.push(key);
138
- }
131
+ if (coord.nodeId !== node.id)
132
+ newMap.set(key, coord);
139
133
  }
140
- return keys;
141
134
  });
142
- for (const key of keysToDelete) {
143
- coordinates.delete(key);
144
- }
145
- // Add new entries
146
- const coords = computeNodePortCoordinates(node, internalNode);
147
- for (const coord of coords) {
148
- coordinates.set(coord.handleId, coord);
135
+ for (const coord of computeNodePortCoordinates(node, internalNode)) {
136
+ newMap.set(coord.handleId, coord);
149
137
  }
138
+ coordinates = newMap;
150
139
  }
151
140
  /**
152
141
  * Remove all coordinates for a node (on node delete).
@@ -154,18 +143,20 @@ export function updateNodePortCoordinates(node, getInternalNode) {
154
143
  * @param nodeId - ID of the node to remove
155
144
  */
156
145
  export function removeNodePortCoordinates(nodeId) {
157
- const keysToDelete = untrack(() => {
158
- const keys = [];
146
+ const newMap = new SvelteMap();
147
+ untrack(() => {
159
148
  for (const [key, coord] of coordinates) {
160
- if (coord.nodeId === nodeId) {
161
- keys.push(key);
162
- }
149
+ if (coord.nodeId !== nodeId)
150
+ newMap.set(key, coord);
163
151
  }
164
- return keys;
165
152
  });
166
- for (const key of keysToDelete) {
167
- coordinates.delete(key);
168
- }
153
+ coordinates = newMap;
154
+ }
155
+ /**
156
+ * Clear all port coordinates (lifecycle cleanup).
157
+ */
158
+ export function clearPortCoordinates() {
159
+ coordinates = new SvelteMap();
169
160
  }
170
161
  /**
171
162
  * Get coordinates for a specific handle.
@@ -9,8 +9,8 @@
9
9
  *
10
10
  * @module stores/settingsStore
11
11
  */
12
- import type { FlowDropSettings, ThemeSettings, EditorSettings, UISettings, BehaviorSettings, ApiSettings, PartialSettings, SyncStatus, ResolvedTheme, ThemePreference, SettingsChangeCallback, SettingsCategory } from "../types/settings.js";
13
- export type { ThemePreference, ResolvedTheme } from "../types/settings.js";
12
+ import type { FlowDropSettings, ThemeSettings, EditorSettings, UISettings, BehaviorSettings, ApiSettings, PartialSettings, SyncStatus, ResolvedTheme, ThemePreference, SettingsChangeCallback, SettingsCategory } from '../types/settings.js';
13
+ export type { ThemePreference, ResolvedTheme } from '../types/settings.js';
14
14
  /**
15
15
  * Get current settings (replaces settingsStore derived store)
16
16
  */
@@ -9,8 +9,8 @@
9
9
  *
10
10
  * @module stores/settingsStore
11
11
  */
12
- import { DEFAULT_SETTINGS, SETTINGS_STORAGE_KEY } from "../types/settings.js";
13
- import { logger } from "../utils/logger.js";
12
+ import { DEFAULT_SETTINGS, SETTINGS_STORAGE_KEY } from '../types/settings.js';
13
+ import { logger } from '../utils/logger.js';
14
14
  // =========================================================================
15
15
  // Internal State
16
16
  // =========================================================================
@@ -32,7 +32,7 @@ const changeListeners = new Set();
32
32
  * @returns Saved settings or null if not found/invalid
33
33
  */
34
34
  function loadFromStorage() {
35
- if (typeof window === "undefined") {
35
+ if (typeof window === 'undefined') {
36
36
  return null;
37
37
  }
38
38
  try {
@@ -44,7 +44,7 @@ function loadFromStorage() {
44
44
  }
45
45
  }
46
46
  catch (error) {
47
- logger.warn("Failed to load settings from localStorage:", error);
47
+ logger.warn('Failed to load settings from localStorage:', error);
48
48
  }
49
49
  return null;
50
50
  }
@@ -54,14 +54,14 @@ function loadFromStorage() {
54
54
  * @param settings - Settings to persist
55
55
  */
56
56
  function saveToStorage(settings) {
57
- if (typeof window === "undefined") {
57
+ if (typeof window === 'undefined') {
58
58
  return;
59
59
  }
60
60
  try {
61
61
  localStorage.setItem(SETTINGS_STORAGE_KEY, JSON.stringify(settings));
62
62
  }
63
63
  catch (error) {
64
- logger.warn("Failed to save settings to localStorage:", error);
64
+ logger.warn('Failed to save settings to localStorage:', error);
65
65
  }
66
66
  }
67
67
  // =========================================================================
@@ -80,7 +80,7 @@ function deepMergeSettings(target, source) {
80
80
  editor: { ...target.editor },
81
81
  ui: { ...target.ui },
82
82
  behavior: { ...target.behavior },
83
- api: { ...target.api },
83
+ api: { ...target.api }
84
84
  };
85
85
  // Merge theme settings
86
86
  if (source.theme) {
@@ -117,15 +117,15 @@ const initialSettings = loadFromStorage() ?? DEFAULT_SETTINGS;
117
117
  let storeState = $state({
118
118
  settings: initialSettings,
119
119
  initialized: true,
120
- syncStatus: "idle",
120
+ syncStatus: 'idle',
121
121
  lastSyncedAt: null,
122
- syncError: null,
122
+ syncError: null
123
123
  });
124
124
  /**
125
125
  * System theme preference using $state rune
126
126
  * Updates when system preference changes
127
127
  */
128
- let systemThemeState = $state(typeof window !== "undefined" ? getSystemTheme() : "light");
128
+ let systemThemeState = $state(typeof window !== 'undefined' ? getSystemTheme() : 'light');
129
129
  // =========================================================================
130
130
  // Getter Functions (replacing derived stores)
131
131
  // =========================================================================
@@ -142,7 +142,7 @@ export function getSyncStatus() {
142
142
  return {
143
143
  status: storeState.syncStatus,
144
144
  lastSyncedAt: storeState.lastSyncedAt,
145
- error: storeState.syncError,
145
+ error: storeState.syncError
146
146
  };
147
147
  }
148
148
  /**
@@ -187,7 +187,7 @@ export function getTheme() {
187
187
  * (replaces resolvedTheme derived store)
188
188
  */
189
189
  export function getResolvedTheme() {
190
- if (storeState.settings.theme.preference === "auto") {
190
+ if (storeState.settings.theme.preference === 'auto') {
191
191
  return systemThemeState;
192
192
  }
193
193
  return storeState.settings.theme.preference;
@@ -205,12 +205,10 @@ export function getSystemThemeState() {
205
205
  * Get the system's color scheme preference
206
206
  */
207
207
  function getSystemTheme() {
208
- if (typeof window === "undefined") {
209
- return "light";
208
+ if (typeof window === 'undefined') {
209
+ return 'light';
210
210
  }
211
- return window.matchMedia("(prefers-color-scheme: dark)").matches
212
- ? "dark"
213
- : "light";
211
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
214
212
  }
215
213
  /**
216
214
  * Initialize the system theme change listener.
@@ -219,16 +217,16 @@ function getSystemTheme() {
219
217
  * @returns Cleanup function that removes the listener
220
218
  */
221
219
  export function initThemeListener() {
222
- if (typeof window === "undefined") {
220
+ if (typeof window === 'undefined') {
223
221
  return () => { };
224
222
  }
225
- const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
223
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
226
224
  const handleSystemThemeChange = (event) => {
227
- systemThemeState = event.matches ? "dark" : "light";
225
+ systemThemeState = event.matches ? 'dark' : 'light';
228
226
  };
229
- mediaQuery.addEventListener("change", handleSystemThemeChange);
227
+ mediaQuery.addEventListener('change', handleSystemThemeChange);
230
228
  return () => {
231
- mediaQuery.removeEventListener("change", handleSystemThemeChange);
229
+ mediaQuery.removeEventListener('change', handleSystemThemeChange);
232
230
  };
233
231
  }
234
232
  // =========================================================================
@@ -242,14 +240,14 @@ function notifyChange(category, key, previousValue, newValue) {
242
240
  category,
243
241
  key,
244
242
  previousValue,
245
- newValue,
243
+ newValue
246
244
  };
247
245
  changeListeners.forEach((listener) => {
248
246
  try {
249
247
  listener(event);
250
248
  }
251
249
  catch (error) {
252
- logger.error("Settings change listener error:", error);
250
+ logger.error('Settings change listener error:', error);
253
251
  }
254
252
  });
255
253
  }
@@ -272,7 +270,7 @@ export function updateSettings(partial) {
272
270
  // Notify listeners for each changed category
273
271
  for (const category of Object.keys(partial)) {
274
272
  const partialCategory = partial[category];
275
- if (partialCategory && typeof partialCategory === "object") {
273
+ if (partialCategory && typeof partialCategory === 'object') {
276
274
  for (const key of Object.keys(partialCategory)) {
277
275
  const prevCat = getCategoryAsRecord(previousSettings, category);
278
276
  const newCat = getCategoryAsRecord(newSettings, category);
@@ -284,7 +282,7 @@ export function updateSettings(partial) {
284
282
  }
285
283
  storeState = {
286
284
  ...storeState,
287
- settings: newSettings,
285
+ settings: newSettings
288
286
  };
289
287
  }
290
288
  /**
@@ -296,8 +294,7 @@ export function resetSettings(categories) {
296
294
  if (categories && categories.length > 0) {
297
295
  const partial = {};
298
296
  for (const category of categories) {
299
- partial[category] =
300
- DEFAULT_SETTINGS[category];
297
+ partial[category] = DEFAULT_SETTINGS[category];
301
298
  }
302
299
  updateSettings(partial);
303
300
  }
@@ -305,7 +302,7 @@ export function resetSettings(categories) {
305
302
  saveToStorage(DEFAULT_SETTINGS);
306
303
  storeState = {
307
304
  ...storeState,
308
- settings: DEFAULT_SETTINGS,
305
+ settings: DEFAULT_SETTINGS
309
306
  };
310
307
  }
311
308
  }
@@ -327,11 +324,11 @@ export function setTheme(newTheme) {
327
324
  export function toggleTheme() {
328
325
  const currentTheme = getTheme();
329
326
  const currentResolved = getResolvedTheme();
330
- if (currentTheme === "auto") {
331
- setTheme(currentResolved === "dark" ? "light" : "dark");
327
+ if (currentTheme === 'auto') {
328
+ setTheme(currentResolved === 'dark' ? 'light' : 'dark');
332
329
  }
333
330
  else {
334
- setTheme(currentTheme === "dark" ? "light" : "dark");
331
+ setTheme(currentTheme === 'dark' ? 'light' : 'dark');
335
332
  }
336
333
  }
337
334
  /**
@@ -340,14 +337,14 @@ export function toggleTheme() {
340
337
  export function cycleTheme() {
341
338
  const currentTheme = getTheme();
342
339
  switch (currentTheme) {
343
- case "light":
344
- setTheme("dark");
340
+ case 'light':
341
+ setTheme('dark');
345
342
  break;
346
- case "dark":
347
- setTheme("auto");
343
+ case 'dark':
344
+ setTheme('auto');
348
345
  break;
349
- case "auto":
350
- setTheme("light");
346
+ case 'auto':
347
+ setTheme('light');
351
348
  break;
352
349
  }
353
350
  }
@@ -357,10 +354,10 @@ export function cycleTheme() {
357
354
  * @param resolved - The resolved theme to apply
358
355
  */
359
356
  function applyTheme(resolved) {
360
- if (typeof document === "undefined") {
357
+ if (typeof document === 'undefined') {
361
358
  return;
362
359
  }
363
- document.documentElement.setAttribute("data-theme", resolved);
360
+ document.documentElement.setAttribute('data-theme', resolved);
364
361
  }
365
362
  /**
366
363
  * Stored cleanup function for the theme effect.
@@ -409,10 +406,10 @@ export function initializeTheme() {
409
406
  * @returns true if running in browser and theme is applied
410
407
  */
411
408
  export function isThemeInitialized() {
412
- if (typeof document === "undefined") {
409
+ if (typeof document === 'undefined') {
413
410
  return false;
414
411
  }
415
- return document.documentElement.hasAttribute("data-theme");
412
+ return document.documentElement.hasAttribute('data-theme');
416
413
  }
417
414
  // =========================================================================
418
415
  // API Sync Functions
@@ -432,30 +429,30 @@ export function setSettingsService(service) {
432
429
  */
433
430
  export async function syncSettingsToApi() {
434
431
  if (!settingsService) {
435
- logger.warn("Settings service not configured for API sync");
432
+ logger.warn('Settings service not configured for API sync');
436
433
  return;
437
434
  }
438
435
  storeState = {
439
436
  ...storeState,
440
- syncStatus: "syncing",
441
- syncError: null,
437
+ syncStatus: 'syncing',
438
+ syncError: null
442
439
  };
443
440
  try {
444
441
  const currentSettings = getSettings();
445
442
  await settingsService.savePreferences(currentSettings);
446
443
  storeState = {
447
444
  ...storeState,
448
- syncStatus: "synced",
445
+ syncStatus: 'synced',
449
446
  lastSyncedAt: Date.now(),
450
- syncError: null,
447
+ syncError: null
451
448
  };
452
449
  }
453
450
  catch (error) {
454
- const errorMessage = error instanceof Error ? error.message : "Failed to sync settings";
451
+ const errorMessage = error instanceof Error ? error.message : 'Failed to sync settings';
455
452
  storeState = {
456
453
  ...storeState,
457
- syncStatus: "error",
458
- syncError: errorMessage,
454
+ syncStatus: 'error',
455
+ syncError: errorMessage
459
456
  };
460
457
  throw error;
461
458
  }
@@ -467,13 +464,13 @@ export async function syncSettingsToApi() {
467
464
  */
468
465
  export async function loadSettingsFromApi() {
469
466
  if (!settingsService) {
470
- logger.warn("Settings service not configured for API sync");
467
+ logger.warn('Settings service not configured for API sync');
471
468
  return;
472
469
  }
473
470
  storeState = {
474
471
  ...storeState,
475
- syncStatus: "syncing",
476
- syncError: null,
472
+ syncStatus: 'syncing',
473
+ syncError: null
477
474
  };
478
475
  try {
479
476
  const apiSettingsData = await settingsService.getPreferences();
@@ -481,21 +478,19 @@ export async function loadSettingsFromApi() {
481
478
  storeState = {
482
479
  ...storeState,
483
480
  settings: mergedSettings,
484
- syncStatus: "synced",
481
+ syncStatus: 'synced',
485
482
  lastSyncedAt: Date.now(),
486
- syncError: null,
483
+ syncError: null
487
484
  };
488
485
  // Also persist to localStorage
489
486
  saveToStorage(mergedSettings);
490
487
  }
491
488
  catch (error) {
492
- const errorMessage = error instanceof Error
493
- ? error.message
494
- : "Failed to load settings from API";
489
+ const errorMessage = error instanceof Error ? error.message : 'Failed to load settings from API';
495
490
  storeState = {
496
491
  ...storeState,
497
- syncStatus: "error",
498
- syncError: errorMessage,
492
+ syncStatus: 'error',
493
+ syncError: errorMessage
499
494
  };
500
495
  throw error;
501
496
  }
@@ -530,7 +525,7 @@ export async function initializeSettings(options) {
530
525
  const withDefaults = deepMergeSettings(currentSettings, options.defaults);
531
526
  storeState = {
532
527
  ...storeState,
533
- settings: withDefaults,
528
+ settings: withDefaults
534
529
  };
535
530
  saveToStorage(withDefaults);
536
531
  }
@@ -543,7 +538,7 @@ export async function initializeSettings(options) {
543
538
  }
544
539
  catch {
545
540
  // Silently fail - local settings are still available
546
- logger.warn("Failed to sync settings from API on initialization");
541
+ logger.warn('Failed to sync settings from API on initialization');
547
542
  }
548
543
  }
549
544
  }