@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,861 @@
1
+ <!--
2
+ ReviewPrompt Component
3
+
4
+ Renders a review prompt for review-type interrupts.
5
+ Displays proposed field changes with accept/reject toggles per field.
6
+ Supports bulk "Accept All" / "Reject All" actions.
7
+ Shows the review decisions when resolved.
8
+ Styled with BEM syntax.
9
+ -->
10
+
11
+ <script lang="ts">
12
+ import Icon from '@iconify/svelte';
13
+ import { diffWords, diffArrays, diffJson } from 'diff';
14
+ import type { Change } from 'diff';
15
+ import { sanitizeHtml } from '../../utils/sanitize.js';
16
+ import type {
17
+ ReviewConfig,
18
+ ReviewResolution,
19
+ ReviewFieldDecision
20
+ } from '../../types/interrupt.js';
21
+
22
+ /**
23
+ * Component props
24
+ */
25
+ interface Props {
26
+ /** Review configuration from the interrupt */
27
+ config: ReviewConfig;
28
+ /** Whether this interrupt has been resolved */
29
+ isResolved: boolean;
30
+ /** The resolved value if resolved */
31
+ resolvedValue?: ReviewResolution;
32
+ /** Whether the form is currently submitting */
33
+ isSubmitting: boolean;
34
+ /** Error message if submission failed */
35
+ error?: string;
36
+ /** Username of the person who resolved the interrupt */
37
+ resolvedByUserName?: string;
38
+ /** Callback when user submits review */
39
+ onSubmit: (value: ReviewResolution) => void;
40
+ }
41
+
42
+ let {
43
+ config,
44
+ isResolved,
45
+ resolvedValue,
46
+ isSubmitting,
47
+ error,
48
+ resolvedByUserName,
49
+ onSubmit
50
+ }: Props = $props();
51
+
52
+ /** Local state: map of field -> accepted boolean. Default all to true (accept). */
53
+ // svelte-ignore state_referenced_locally — initial default, user toggles during review
54
+ let decisions = $state<Record<string, boolean>>(
55
+ Object.fromEntries(config.changes.map((c) => [c.field, true]))
56
+ );
57
+
58
+ /** Local state: map of field -> HTML view mode ('rendered' or 'raw'). Default to 'rendered'. */
59
+ // svelte-ignore state_referenced_locally
60
+ let htmlViewMode = $state<Record<string, 'rendered' | 'raw'>>(
61
+ Object.fromEntries(config.changes.map((c) => [c.field, 'rendered']))
62
+ );
63
+
64
+ /** Count of accepted fields */
65
+ const acceptedCount = $derived(Object.values(decisions).filter((v) => v).length);
66
+
67
+ /** Count of rejected fields */
68
+ const rejectedCount = $derived(Object.values(decisions).filter((v) => !v).length);
69
+
70
+ /** Total number of changes */
71
+ const totalCount = $derived(config.changes.length);
72
+
73
+ /** Button labels with defaults */
74
+ const acceptAllLabel = $derived(config.acceptAllLabel ?? 'Accept All');
75
+ const rejectAllLabel = $derived(config.rejectAllLabel ?? 'Reject All');
76
+ const submitLabel = $derived(config.submitLabel ?? 'Submit Review');
77
+
78
+ /**
79
+ * Set a specific field's decision
80
+ */
81
+ function setFieldDecision(field: string, accepted: boolean): void {
82
+ if (isResolved || isSubmitting) return;
83
+ decisions = { ...decisions, [field]: accepted };
84
+ }
85
+
86
+ /**
87
+ * Accept all changes
88
+ */
89
+ function handleAcceptAll(): void {
90
+ if (isResolved || isSubmitting) return;
91
+ decisions = Object.fromEntries(config.changes.map((c) => [c.field, true]));
92
+ }
93
+
94
+ /**
95
+ * Reject all changes
96
+ */
97
+ function handleRejectAll(): void {
98
+ if (isResolved || isSubmitting) return;
99
+ decisions = Object.fromEntries(config.changes.map((c) => [c.field, false]));
100
+ }
101
+
102
+ /**
103
+ * Submit the review
104
+ */
105
+ function handleSubmit(): void {
106
+ if (isResolved || isSubmitting) return;
107
+
108
+ const fieldDecisions: Record<string, ReviewFieldDecision> = {};
109
+ for (const change of config.changes) {
110
+ const accepted = decisions[change.field] ?? true;
111
+ fieldDecisions[change.field] = {
112
+ accepted,
113
+ value: accepted ? change.proposed : change.original
114
+ };
115
+ }
116
+
117
+ const resolution: ReviewResolution = {
118
+ decisions: fieldDecisions,
119
+ summary: {
120
+ accepted: acceptedCount,
121
+ rejected: rejectedCount,
122
+ total: totalCount
123
+ }
124
+ };
125
+
126
+ onSubmit(resolution);
127
+ }
128
+
129
+ /**
130
+ * Toggle HTML view mode between rendered and raw for a field.
131
+ */
132
+ function toggleHtmlView(field: string): void {
133
+ htmlViewMode = {
134
+ ...htmlViewMode,
135
+ [field]: htmlViewMode[field] === 'rendered' ? 'raw' : 'rendered'
136
+ };
137
+ }
138
+
139
+ /**
140
+ * Check if a string contains HTML tags.
141
+ */
142
+ function containsHtml(value: unknown): boolean {
143
+ return typeof value === 'string' && /<[a-z][\s\S]*?>/i.test(value);
144
+ }
145
+
146
+ /**
147
+ * Strip HTML tags from a string, preserving text content.
148
+ * Collapses whitespace and trims the result.
149
+ */
150
+ function stripHtmlTags(html: string): string {
151
+ return html
152
+ .replace(/<br\s*\/?>/gi, '\n')
153
+ .replace(/<\/(?:p|div|li|h[1-6])>/gi, '\n')
154
+ .replace(/<[^>]+>/g, '')
155
+ .replace(/&amp;/g, '&')
156
+ .replace(/&lt;/g, '<')
157
+ .replace(/&gt;/g, '>')
158
+ .replace(/&quot;/g, '"')
159
+ .replace(/&#39;/g, "'")
160
+ .replace(/&nbsp;/g, ' ')
161
+ .replace(/\n{3,}/g, '\n\n')
162
+ .trim();
163
+ }
164
+
165
+ /**
166
+ * Format a value for display
167
+ */
168
+ function formatValue(value: unknown): string {
169
+ if (value === null || value === undefined) return '(empty)';
170
+ if (typeof value === 'string') return value;
171
+ if (typeof value === 'boolean') return value ? 'Yes' : 'No';
172
+ if (typeof value === 'object') return JSON.stringify(value, null, 2);
173
+ return String(value);
174
+ }
175
+
176
+ /**
177
+ * Compute a diff between two values.
178
+ * Supports strings (word-level), arrays (element-level), and objects (JSON line-level).
179
+ * For HTML strings, strips tags and diffs the plain text content.
180
+ */
181
+ function computeDiff(
182
+ original: unknown,
183
+ proposed: unknown,
184
+ rawMode: boolean = false
185
+ ): Change[] | null {
186
+ if (typeof original === 'string' && typeof proposed === 'string') {
187
+ const origText = !rawMode && containsHtml(original) ? stripHtmlTags(original) : original;
188
+ const propText = !rawMode && containsHtml(proposed) ? stripHtmlTags(proposed) : proposed;
189
+ return diffWords(origText, propText);
190
+ }
191
+ if (Array.isArray(original) && Array.isArray(proposed)) {
192
+ const arrayChanges = diffArrays(original, proposed);
193
+ return arrayChanges.map((part) => ({
194
+ value: part.value.map((v: unknown) => JSON.stringify(v)).join(', '),
195
+ added: part.added,
196
+ removed: part.removed,
197
+ count: part.count
198
+ }));
199
+ }
200
+ if (
201
+ typeof original === 'object' &&
202
+ original !== null &&
203
+ !Array.isArray(original) &&
204
+ typeof proposed === 'object' &&
205
+ proposed !== null &&
206
+ !Array.isArray(proposed)
207
+ ) {
208
+ return diffJson(original, proposed);
209
+ }
210
+ return null;
211
+ }
212
+
213
+ /**
214
+ * Check if a diff result contains multi-line content (e.g. JSON diffs).
215
+ */
216
+ function isMultiLineDiff(changes: Change[]): boolean {
217
+ return changes.some((part) => part.value.includes('\n'));
218
+ }
219
+ </script>
220
+
221
+ <div
222
+ class="review-prompt"
223
+ class:review-prompt--resolved={isResolved}
224
+ class:review-prompt--submitting={isSubmitting}
225
+ >
226
+ <!-- Message -->
227
+ <p class="review-prompt__message">{config.message}</p>
228
+
229
+ <!-- Error message -->
230
+ {#if error}
231
+ <div class="review-prompt__error">
232
+ <Icon icon="mdi:alert-circle" />
233
+ <span>{error}</span>
234
+ </div>
235
+ {/if}
236
+
237
+ <!-- Bulk actions & counter (pending state only) -->
238
+ {#if !isResolved}
239
+ <div class="review-prompt__toolbar">
240
+ <div class="review-prompt__bulk-actions">
241
+ <button
242
+ type="button"
243
+ class="review-prompt__bulk-btn review-prompt__bulk-btn--accept"
244
+ onclick={handleAcceptAll}
245
+ disabled={isSubmitting}
246
+ >
247
+ <Icon icon="mdi:check-all" />
248
+ <span>{acceptAllLabel}</span>
249
+ </button>
250
+ <button
251
+ type="button"
252
+ class="review-prompt__bulk-btn review-prompt__bulk-btn--reject"
253
+ onclick={handleRejectAll}
254
+ disabled={isSubmitting}
255
+ >
256
+ <Icon icon="mdi:close-circle-multiple-outline" />
257
+ <span>{rejectAllLabel}</span>
258
+ </button>
259
+ </div>
260
+ <span class="review-prompt__counter">
261
+ {acceptedCount} of {totalCount} accepted
262
+ </span>
263
+ </div>
264
+ {/if}
265
+
266
+ <!-- Changes list -->
267
+ <div class="review-prompt__changes">
268
+ {#each config.changes as change (change.field)}
269
+ {@const isAccepted = isResolved
270
+ ? (resolvedValue?.decisions[change.field]?.accepted ?? true)
271
+ : (decisions[change.field] ?? true)}
272
+ {@const isHtml = containsHtml(change.original) || containsHtml(change.proposed)}
273
+ {@const isRawView = htmlViewMode[change.field] === 'raw'}
274
+ {@const diff = computeDiff(change.original, change.proposed, isRawView)}
275
+ <div
276
+ class="review-prompt__change"
277
+ class:review-prompt__change--accepted={isAccepted}
278
+ class:review-prompt__change--rejected={!isAccepted}
279
+ >
280
+ <!-- Change header: label + toggle -->
281
+ <div class="review-prompt__change-header">
282
+ <span class="review-prompt__change-label">{change.label}</span>
283
+ {#if !isResolved}
284
+ <div class="review-prompt__toggle-group">
285
+ <button
286
+ type="button"
287
+ class="review-prompt__toggle-btn review-prompt__toggle-btn--accept"
288
+ class:review-prompt__toggle-btn--active={isAccepted}
289
+ onclick={() => setFieldDecision(change.field, true)}
290
+ disabled={isSubmitting}
291
+ aria-label="Accept {change.label}"
292
+ title="Accept"
293
+ >
294
+ <Icon icon="mdi:check" />
295
+ <span>Accept</span>
296
+ </button>
297
+ <button
298
+ type="button"
299
+ class="review-prompt__toggle-btn review-prompt__toggle-btn--reject"
300
+ class:review-prompt__toggle-btn--active={!isAccepted}
301
+ onclick={() => setFieldDecision(change.field, false)}
302
+ disabled={isSubmitting}
303
+ aria-label="Reject {change.label}"
304
+ title="Reject"
305
+ >
306
+ <Icon icon="mdi:close" />
307
+ <span>Reject</span>
308
+ </button>
309
+ </div>
310
+ {:else}
311
+ <span
312
+ class="review-prompt__decision-badge"
313
+ class:review-prompt__decision-badge--accepted={isAccepted}
314
+ class:review-prompt__decision-badge--rejected={!isAccepted}
315
+ >
316
+ {#if isAccepted}
317
+ <Icon icon="mdi:check-circle" />
318
+ <span>Accepted</span>
319
+ {:else}
320
+ <Icon icon="mdi:close-circle" />
321
+ <span>Rejected</span>
322
+ {/if}
323
+ </span>
324
+ {/if}
325
+ </div>
326
+
327
+ <!-- Change diff content -->
328
+ <div class="review-prompt__change-body">
329
+ {#if isHtml}
330
+ <div class="review-prompt__html-toggle-row">
331
+ <button
332
+ type="button"
333
+ class="review-prompt__html-toggle-btn"
334
+ onclick={() => toggleHtmlView(change.field)}
335
+ >
336
+ <Icon icon={isRawView ? 'mdi:eye' : 'mdi:code-tags'} />
337
+ <span>{isRawView ? 'Rendered' : 'Raw HTML'}</span>
338
+ </button>
339
+ </div>
340
+ {/if}
341
+ <div class="review-prompt__diff-row">
342
+ <span class="review-prompt__diff-label">Original:</span>
343
+ {#if isHtml && !isRawView}
344
+ <span class="review-prompt__diff-value review-prompt__html-content"
345
+ >{@html sanitizeHtml(String(change.original))}</span
346
+ >
347
+ {:else if isHtml && isRawView}
348
+ <code class="review-prompt__diff-value review-prompt__raw-html"
349
+ >{change.original}</code
350
+ >
351
+ {:else}
352
+ <span class="review-prompt__diff-value">
353
+ {formatValue(change.original)}
354
+ </span>
355
+ {/if}
356
+ </div>
357
+ <div class="review-prompt__diff-row">
358
+ <span class="review-prompt__diff-label">Proposed:</span>
359
+ {#if isHtml && !isRawView}
360
+ <span
361
+ class="review-prompt__diff-value review-prompt__diff-value--proposed review-prompt__html-content"
362
+ >{@html sanitizeHtml(String(change.proposed))}</span
363
+ >
364
+ {:else if isHtml && isRawView}
365
+ <code
366
+ class="review-prompt__diff-value review-prompt__diff-value--proposed review-prompt__raw-html"
367
+ >{change.proposed}</code
368
+ >
369
+ {:else}
370
+ <span class="review-prompt__diff-value review-prompt__diff-value--proposed">
371
+ {formatValue(change.proposed)}
372
+ </span>
373
+ {/if}
374
+ </div>
375
+ {#if diff}
376
+ <div class="review-prompt__diff-row">
377
+ <span class="review-prompt__diff-label">Diff:</span>
378
+ {#if isMultiLineDiff(diff)}
379
+ <pre
380
+ class="review-prompt__diff-value review-prompt__diff-block">{#each diff as part}{#if part.added}<span
381
+ class="review-prompt__diff-token--added">{part.value}</span
382
+ >{:else if part.removed}<span class="review-prompt__diff-token--removed"
383
+ >{part.value}</span
384
+ >{:else}<span>{part.value}</span>{/if}{/each}</pre>
385
+ {:else}
386
+ <span class="review-prompt__diff-value review-prompt__diff-inline">
387
+ {#each diff as part}
388
+ {#if part.added}
389
+ <span class="review-prompt__diff-token--added">{part.value}</span>
390
+ {:else if part.removed}
391
+ <span class="review-prompt__diff-token--removed">{part.value}</span>
392
+ {:else}
393
+ <span>{part.value}</span>
394
+ {/if}
395
+ {/each}
396
+ </span>
397
+ {/if}
398
+ </div>
399
+ {/if}
400
+ </div>
401
+ </div>
402
+ {/each}
403
+ </div>
404
+
405
+ <!-- Submit button (pending state only) -->
406
+ {#if !isResolved}
407
+ <div class="review-prompt__actions">
408
+ <button
409
+ type="button"
410
+ class="review-prompt__submit"
411
+ onclick={handleSubmit}
412
+ disabled={isSubmitting}
413
+ >
414
+ {#if isSubmitting}
415
+ <span class="review-prompt__spinner"></span>
416
+ {:else}
417
+ <Icon icon="mdi:check" />
418
+ {/if}
419
+ <span>{submitLabel}</span>
420
+ </button>
421
+ </div>
422
+ {/if}
423
+
424
+ <!-- Resolved summary -->
425
+ {#if isResolved && resolvedValue}
426
+ <div class="review-prompt__summary">
427
+ <span class="review-prompt__summary-text">
428
+ {resolvedValue.summary.accepted} accepted, {resolvedValue.summary.rejected} rejected out of {resolvedValue
429
+ .summary.total} changes
430
+ </span>
431
+ </div>
432
+ {/if}
433
+
434
+ <!-- Resolved indicator -->
435
+ {#if isResolved}
436
+ <div class="review-prompt__resolved-badge">
437
+ <Icon icon="mdi:check-circle" />
438
+ <span>
439
+ {resolvedByUserName ? `Response submitted by ${resolvedByUserName}` : 'Response submitted'}
440
+ </span>
441
+ </div>
442
+ {/if}
443
+ </div>
444
+
445
+ <style>
446
+ /* Uses design tokens from tokens.css / base.css
447
+ Component tokens: --fd-review-* defined in base.css */
448
+ .review-prompt {
449
+ display: flex;
450
+ flex-direction: column;
451
+ gap: var(--fd-space-md);
452
+ }
453
+
454
+ .review-prompt--resolved {
455
+ opacity: 0.85;
456
+ }
457
+
458
+ .review-prompt--submitting {
459
+ pointer-events: none;
460
+ }
461
+
462
+ .review-prompt__message {
463
+ margin: 0;
464
+ font-size: var(--fd-review-font-size-message);
465
+ line-height: var(--fd-review-line-height);
466
+ color: var(--fd-foreground);
467
+ }
468
+
469
+ .review-prompt__error {
470
+ display: flex;
471
+ align-items: center;
472
+ gap: var(--fd-review-space-sm);
473
+ padding: var(--fd-space-xs) var(--fd-space-md);
474
+ background-color: var(--fd-error-muted);
475
+ border-radius: var(--fd-radius-md);
476
+ color: var(--fd-error);
477
+ font-size: var(--fd-review-font-size-error);
478
+ }
479
+
480
+ /* Toolbar: bulk actions + counter */
481
+ .review-prompt__toolbar {
482
+ display: flex;
483
+ align-items: center;
484
+ justify-content: space-between;
485
+ gap: var(--fd-space-md);
486
+ flex-wrap: wrap;
487
+ }
488
+
489
+ .review-prompt__bulk-actions {
490
+ display: flex;
491
+ gap: var(--fd-space-xs);
492
+ }
493
+
494
+ .review-prompt__bulk-btn {
495
+ display: inline-flex;
496
+ align-items: center;
497
+ gap: var(--fd-review-space-sm);
498
+ padding: var(--fd-review-space-sm) var(--fd-space-md);
499
+ font-size: var(--fd-text-xs);
500
+ font-weight: 500;
501
+ font-family: inherit;
502
+ border-radius: var(--fd-radius-md);
503
+ cursor: pointer;
504
+ transition: all var(--fd-transition-fast);
505
+ border: 1px solid var(--fd-border);
506
+ background-color: var(--fd-muted);
507
+ color: var(--fd-foreground);
508
+ }
509
+
510
+ .review-prompt__bulk-btn:hover:not(:disabled) {
511
+ border-color: var(--fd-border-strong);
512
+ }
513
+
514
+ .review-prompt__bulk-btn--accept:hover:not(:disabled) {
515
+ background-color: var(--fd-success-muted);
516
+ border-color: var(--fd-success);
517
+ color: var(--fd-success);
518
+ }
519
+
520
+ .review-prompt__bulk-btn--reject:hover:not(:disabled) {
521
+ background-color: var(--fd-error-muted);
522
+ border-color: var(--fd-error);
523
+ color: var(--fd-error);
524
+ }
525
+
526
+ .review-prompt__bulk-btn:disabled {
527
+ opacity: 0.5;
528
+ cursor: not-allowed;
529
+ }
530
+
531
+ .review-prompt__counter {
532
+ font-size: var(--fd-text-xs);
533
+ color: var(--fd-muted-foreground);
534
+ }
535
+
536
+ /* Change cards */
537
+ .review-prompt__changes {
538
+ display: flex;
539
+ flex-direction: column;
540
+ gap: var(--fd-space-xs);
541
+ }
542
+
543
+ .review-prompt__change {
544
+ border: 1px solid var(--fd-border);
545
+ border-radius: var(--fd-radius-lg);
546
+ background-color: var(--fd-background);
547
+ overflow: hidden;
548
+ transition: all var(--fd-transition-fast);
549
+ }
550
+
551
+ .review-prompt__change--accepted {
552
+ border-color: var(--fd-success);
553
+ }
554
+
555
+ .review-prompt__change--rejected {
556
+ border-color: var(--fd-error);
557
+ }
558
+
559
+ .review-prompt__change-header {
560
+ display: flex;
561
+ align-items: center;
562
+ justify-content: space-between;
563
+ padding: var(--fd-review-space-md) var(--fd-review-space-lg);
564
+ border-bottom: 1px solid var(--fd-border);
565
+ }
566
+
567
+ .review-prompt__change--accepted .review-prompt__change-header {
568
+ background-color: var(--fd-success-muted);
569
+ border-bottom-color: var(--fd-success);
570
+ }
571
+
572
+ .review-prompt__change--rejected .review-prompt__change-header {
573
+ background-color: var(--fd-error-muted);
574
+ border-bottom-color: var(--fd-error);
575
+ }
576
+
577
+ .review-prompt__change-label {
578
+ font-size: var(--fd-text-sm);
579
+ font-weight: 600;
580
+ color: var(--fd-foreground);
581
+ }
582
+
583
+ /* Accept/Reject toggle buttons */
584
+ .review-prompt__toggle-group {
585
+ display: flex;
586
+ gap: var(--fd-space-3xs);
587
+ }
588
+
589
+ .review-prompt__toggle-btn {
590
+ display: inline-flex;
591
+ align-items: center;
592
+ justify-content: center;
593
+ gap: var(--fd-space-3xs);
594
+ height: var(--fd-review-toggle-height);
595
+ padding: 0 var(--fd-space-xs);
596
+ border-radius: var(--fd-radius-md);
597
+ border: 1px solid var(--fd-border);
598
+ background-color: var(--fd-background);
599
+ color: var(--fd-muted-foreground);
600
+ cursor: pointer;
601
+ transition: all var(--fd-transition-fast);
602
+ font-size: var(--fd-text-xs);
603
+ font-weight: 500;
604
+ font-family: inherit;
605
+ }
606
+
607
+ .review-prompt__toggle-btn:hover:not(:disabled) {
608
+ border-color: var(--fd-border-strong);
609
+ }
610
+
611
+ .review-prompt__toggle-btn--accept.review-prompt__toggle-btn--active {
612
+ background-color: var(--fd-success);
613
+ border-color: var(--fd-success);
614
+ color: var(--fd-success-foreground);
615
+ }
616
+
617
+ .review-prompt__toggle-btn--reject.review-prompt__toggle-btn--active {
618
+ background-color: var(--fd-error);
619
+ border-color: var(--fd-error);
620
+ color: var(--fd-error-foreground);
621
+ }
622
+
623
+ .review-prompt__toggle-btn:disabled {
624
+ opacity: 0.5;
625
+ cursor: not-allowed;
626
+ }
627
+
628
+ /* Decision badge (resolved state) */
629
+ .review-prompt__decision-badge {
630
+ display: inline-flex;
631
+ align-items: center;
632
+ gap: var(--fd-space-3xs);
633
+ font-size: var(--fd-text-xs);
634
+ font-weight: 500;
635
+ }
636
+
637
+ .review-prompt__decision-badge--accepted {
638
+ color: var(--fd-success);
639
+ }
640
+
641
+ .review-prompt__decision-badge--rejected {
642
+ color: var(--fd-error);
643
+ }
644
+
645
+ /* Diff content */
646
+ .review-prompt__change-body {
647
+ display: flex;
648
+ flex-direction: column;
649
+ }
650
+
651
+ .review-prompt__diff-row {
652
+ display: flex;
653
+ align-items: baseline;
654
+ gap: var(--fd-space-xs);
655
+ padding: var(--fd-space-xs) var(--fd-review-space-lg);
656
+ border-bottom: 1px solid var(--fd-border);
657
+ }
658
+
659
+ .review-prompt__diff-row:last-child {
660
+ border-bottom: none;
661
+ }
662
+
663
+ .review-prompt__diff-label {
664
+ font-size: var(--fd-text-xs);
665
+ font-weight: 500;
666
+ color: var(--fd-muted-foreground);
667
+ min-width: var(--fd-review-diff-label-width);
668
+ flex-shrink: 0;
669
+ }
670
+
671
+ .review-prompt__diff-value {
672
+ font-size: var(--fd-text-sm);
673
+ color: var(--fd-foreground);
674
+ word-break: break-word;
675
+ white-space: pre-wrap;
676
+ }
677
+
678
+ .review-prompt__diff-value--proposed {
679
+ font-weight: 500;
680
+ }
681
+
682
+ /* Inline diff display */
683
+ .review-prompt__diff-inline {
684
+ line-height: var(--fd-review-line-height-content);
685
+ }
686
+
687
+ /* HTML view toggle */
688
+ .review-prompt__html-toggle-row {
689
+ display: flex;
690
+ justify-content: flex-end;
691
+ padding: var(--fd-review-space-sm) var(--fd-review-space-lg) 0;
692
+ }
693
+
694
+ .review-prompt__html-toggle-btn {
695
+ display: inline-flex;
696
+ align-items: center;
697
+ gap: var(--fd-space-3xs);
698
+ padding: var(--fd-review-space-xs) var(--fd-space-xs);
699
+ font-size: var(--fd-review-font-size-html-toggle);
700
+ font-weight: 500;
701
+ font-family: inherit;
702
+ color: var(--fd-muted-foreground);
703
+ background: none;
704
+ border: 1px solid var(--fd-border);
705
+ border-radius: var(--fd-radius-md);
706
+ cursor: pointer;
707
+ transition: all var(--fd-transition-fast);
708
+ }
709
+
710
+ .review-prompt__html-toggle-btn:hover {
711
+ color: var(--fd-foreground);
712
+ border-color: var(--fd-border-strong);
713
+ }
714
+
715
+ /* Raw HTML code display */
716
+ .review-prompt__raw-html {
717
+ font-family: var(--fd-review-font-mono);
718
+ font-size: var(--fd-text-xs);
719
+ line-height: var(--fd-review-line-height);
720
+ white-space: pre-wrap;
721
+ word-break: break-word;
722
+ }
723
+
724
+ /* Rendered HTML content */
725
+ .review-prompt__html-content {
726
+ font-size: var(--fd-text-sm);
727
+ line-height: var(--fd-review-line-height-content);
728
+ }
729
+
730
+ .review-prompt__html-content :global(p) {
731
+ margin: 0 0 0.5em 0;
732
+ }
733
+
734
+ .review-prompt__html-content :global(p:last-child) {
735
+ margin-bottom: 0;
736
+ }
737
+
738
+ .review-prompt__html-content :global(ul),
739
+ .review-prompt__html-content :global(ol) {
740
+ margin: 0 0 0.5em 0;
741
+ padding-left: 1.25em;
742
+ }
743
+
744
+ .review-prompt__html-content :global(h1),
745
+ .review-prompt__html-content :global(h2),
746
+ .review-prompt__html-content :global(h3),
747
+ .review-prompt__html-content :global(h4),
748
+ .review-prompt__html-content :global(h5),
749
+ .review-prompt__html-content :global(h6) {
750
+ margin: 0 0 0.25em 0;
751
+ font-size: 1em;
752
+ font-weight: 600;
753
+ }
754
+
755
+ /* Block diff display (for JSON/multi-line diffs) */
756
+ .review-prompt__diff-block {
757
+ margin: 0;
758
+ font-family: var(--fd-review-font-mono);
759
+ font-size: var(--fd-text-xs);
760
+ line-height: var(--fd-review-line-height);
761
+ white-space: pre-wrap;
762
+ word-break: break-word;
763
+ overflow-x: auto;
764
+ }
765
+
766
+ .review-prompt__diff-token--added {
767
+ background-color: var(--fd-success-muted);
768
+ color: var(--fd-success);
769
+ padding: var(--fd-review-diff-token-padding);
770
+ border-radius: var(--fd-radius-sm);
771
+ }
772
+
773
+ .review-prompt__diff-token--removed {
774
+ background-color: var(--fd-error-muted);
775
+ color: var(--fd-error);
776
+ text-decoration: line-through;
777
+ padding: var(--fd-review-diff-token-padding);
778
+ border-radius: var(--fd-radius-sm);
779
+ }
780
+
781
+ /* Actions */
782
+ .review-prompt__actions {
783
+ display: flex;
784
+ gap: var(--fd-space-md);
785
+ margin-top: var(--fd-space-3xs);
786
+ }
787
+
788
+ .review-prompt__submit {
789
+ display: inline-flex;
790
+ align-items: center;
791
+ justify-content: center;
792
+ gap: var(--fd-space-xs);
793
+ padding: var(--fd-review-space-md) var(--fd-space-2xl);
794
+ border-radius: var(--fd-radius-lg);
795
+ font-size: var(--fd-text-sm);
796
+ font-weight: 600;
797
+ font-family: inherit;
798
+ cursor: pointer;
799
+ transition: all var(--fd-transition-normal);
800
+ border: none;
801
+ min-height: var(--fd-space-5xl);
802
+ background: var(--fd-interrupt-btn-primary-bg);
803
+ color: var(--fd-primary-foreground);
804
+ box-shadow: var(--fd-shadow-sm);
805
+ }
806
+
807
+ .review-prompt__submit:hover:not(:disabled) {
808
+ background: var(--fd-interrupt-btn-primary-bg-hover);
809
+ box-shadow: var(--fd-shadow-md);
810
+ transform: translateY(-1px);
811
+ }
812
+
813
+ .review-prompt__submit:disabled {
814
+ opacity: 0.5;
815
+ cursor: not-allowed;
816
+ transform: none;
817
+ box-shadow: none;
818
+ }
819
+
820
+ .review-prompt__spinner {
821
+ width: var(--fd-space-xl);
822
+ height: var(--fd-space-xl);
823
+ border: 2px solid var(--fd-border);
824
+ border-top-color: currentColor;
825
+ border-radius: 50%;
826
+ animation: review-spin 0.6s linear infinite;
827
+ }
828
+
829
+ @keyframes review-spin {
830
+ to {
831
+ transform: rotate(360deg);
832
+ }
833
+ }
834
+
835
+ /* Summary */
836
+ .review-prompt__summary {
837
+ padding: var(--fd-space-xs) var(--fd-space-md);
838
+ background-color: var(--fd-primary-muted);
839
+ border: 1px solid var(--fd-interrupt-completed-border);
840
+ border-radius: var(--fd-radius-md);
841
+ }
842
+
843
+ .review-prompt__summary-text {
844
+ font-size: var(--fd-text-sm);
845
+ color: var(--fd-interrupt-completed-text);
846
+ }
847
+
848
+ /* Resolved badge - neutral blue theme */
849
+ .review-prompt__resolved-badge {
850
+ display: inline-flex;
851
+ align-items: center;
852
+ gap: var(--fd-review-space-sm);
853
+ padding: var(--fd-review-space-sm) var(--fd-space-md);
854
+ background-color: var(--fd-interrupt-badge-completed-bg);
855
+ border-radius: var(--fd-radius-full);
856
+ color: var(--fd-interrupt-badge-completed-text);
857
+ font-size: var(--fd-text-xs);
858
+ font-weight: 500;
859
+ align-self: flex-start;
860
+ }
861
+ </style>