orcheo-studio 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/.bumpversion.cfg +14 -0
  2. package/.eslintrc +1 -0
  3. package/CHANGELOG.md +32 -0
  4. package/README.md +60 -0
  5. package/bin/orcheo-studio.js +39 -0
  6. package/components.json +21 -0
  7. package/dist/assets/arc-BbeTokFd.js +1 -0
  8. package/dist/assets/architectureDiagram-VXUJARFQ-CN00R9LC.js +36 -0
  9. package/dist/assets/avatar-01-CIAd4XAq.svg +1 -0
  10. package/dist/assets/avatar-02-BkgLJWQZ.svg +1 -0
  11. package/dist/assets/avatar-03-DVVcnD3b.svg +1 -0
  12. package/dist/assets/avatar-04-ydqFTDdh.svg +1 -0
  13. package/dist/assets/avatar-05-CSIhgJow.svg +1 -0
  14. package/dist/assets/avatar-06-B-h1Nz9Y.svg +1 -0
  15. package/dist/assets/avatar-07-BgkDZuBW.svg +1 -0
  16. package/dist/assets/avatar-08-C5KZjVH6.svg +1 -0
  17. package/dist/assets/avatar-09-2EGeSlPh.svg +1 -0
  18. package/dist/assets/avatar-10-DRf4ZGD2.svg +1 -0
  19. package/dist/assets/avatar-11-CEzBCpib.svg +1 -0
  20. package/dist/assets/avatar-12-COVngNEy.svg +1 -0
  21. package/dist/assets/avatar-13-D1i1tZVO.svg +1 -0
  22. package/dist/assets/avatar-14-B68CNAEs.svg +1 -0
  23. package/dist/assets/avatar-15-B9NsRNUX.svg +1 -0
  24. package/dist/assets/avatar-16-DQ_JJRGR.svg +1 -0
  25. package/dist/assets/avatar-17-DfDJkGv5.svg +1 -0
  26. package/dist/assets/avatar-18-BuxiqOaJ.svg +1 -0
  27. package/dist/assets/avatar-19-C2mJfrwW.svg +1 -0
  28. package/dist/assets/avatar-20-DPE_yE1a.svg +1 -0
  29. package/dist/assets/avatar-21-DbB0Lj6t.svg +1 -0
  30. package/dist/assets/blockDiagram-VD42YOAC-BPpieIRz.js +122 -0
  31. package/dist/assets/c4Diagram-YG6GDRKO-DAhuY1fj.js +10 -0
  32. package/dist/assets/channel-DtVQHWfl.js +1 -0
  33. package/dist/assets/chunk-4BX2VUAB-7RJQCroR.js +1 -0
  34. package/dist/assets/chunk-55IACEB6-CEN5yOA_.js +1 -0
  35. package/dist/assets/chunk-B4BG7PRW-vdlAz_3Q.js +165 -0
  36. package/dist/assets/chunk-DI55MBZ5-BTmKjGVg.js +220 -0
  37. package/dist/assets/chunk-FMBD7UC4-CwWvFfrg.js +15 -0
  38. package/dist/assets/chunk-QN33PNHL-XH90lUUN.js +1 -0
  39. package/dist/assets/chunk-QZHKN3VN-DMoMVES0.js +1 -0
  40. package/dist/assets/chunk-TZMSLE5B-Bx2XTXDY.js +1 -0
  41. package/dist/assets/classDiagram-2ON5EDUG-pw6P8q-u.js +1 -0
  42. package/dist/assets/classDiagram-v2-WZHVMYZB-pw6P8q-u.js +1 -0
  43. package/dist/assets/clone-DJq6GzHg.js +1 -0
  44. package/dist/assets/cose-bilkent-S5V4N54A-DS1MNwZB.js +1 -0
  45. package/dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
  46. package/dist/assets/dagre-6UL2VRFP-DdklXSXB.js +4 -0
  47. package/dist/assets/defaultLocale-C4B-KCzX.js +1 -0
  48. package/dist/assets/diagram-PSM6KHXK-BKBo8pqg.js +24 -0
  49. package/dist/assets/diagram-QEK2KX5R-DaavZhFO.js +43 -0
  50. package/dist/assets/diagram-S2PKOQOG-DkTwknYd.js +24 -0
  51. package/dist/assets/erDiagram-Q2GNP2WA-ClR5qEsI.js +60 -0
  52. package/dist/assets/flowDiagram-NV44I4VS-Cxt_sJHB.js +162 -0
  53. package/dist/assets/ganttDiagram-JELNMOA3-CIbs3JPJ.js +267 -0
  54. package/dist/assets/gitGraphDiagram-V2S2FVAM-DmqLh_uo.js +65 -0
  55. package/dist/assets/graph-zo28rS-a.js +1 -0
  56. package/dist/assets/index-B0_h2wCA.css +1 -0
  57. package/dist/assets/index-Be29_rJf.js +775 -0
  58. package/dist/assets/infoDiagram-HS3SLOUP-D9_rMkAf.js +2 -0
  59. package/dist/assets/init-Gi6I4Gst.js +1 -0
  60. package/dist/assets/isUndefined-C59bc74c.js +1 -0
  61. package/dist/assets/journeyDiagram-XKPGCS4Q-4ZuggLXE.js +139 -0
  62. package/dist/assets/kanban-definition-3W4ZIXB7-BQDNrhHL.js +89 -0
  63. package/dist/assets/katex-CBSAILhF.js +261 -0
  64. package/dist/assets/layout-CXbNm-Yo.js +1 -0
  65. package/dist/assets/linear-DQWATg1F.js +1 -0
  66. package/dist/assets/min-DJjRzMm8.js +1 -0
  67. package/dist/assets/mindmap-definition-VGOIOE7T-DiZQmsHT.js +68 -0
  68. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  69. package/dist/assets/pieDiagram-ADFJNKIX-Bkju7jCD.js +30 -0
  70. package/dist/assets/quadrantDiagram-AYHSOK5B-CIB47UvU.js +7 -0
  71. package/dist/assets/requirementDiagram-UZGBJVZJ-BSB3uACk.js +64 -0
  72. package/dist/assets/sankeyDiagram-TZEHDZUN-rB8wD2kd.js +10 -0
  73. package/dist/assets/sequenceDiagram-WL72ISMW-Cd9s3Q_1.js +145 -0
  74. package/dist/assets/stateDiagram-FKZM4ZOC-zAxtjcM9.js +1 -0
  75. package/dist/assets/stateDiagram-v2-4FDKWEC3-C4DctH65.js +1 -0
  76. package/dist/assets/timeline-definition-IT6M3QCI-Et89F1F3.js +61 -0
  77. package/dist/assets/treemap-GDKQZRPO-6mZVX2Gv.js +162 -0
  78. package/dist/assets/xychartDiagram-PRI3JC2R-CgyY8dNz.js +7 -0
  79. package/dist/favicon.ico +0 -0
  80. package/dist/index.html +19 -0
  81. package/dist/robots.txt +2 -0
  82. package/eslint.config.js +49 -0
  83. package/index.html +18 -0
  84. package/package.json +183 -0
  85. package/postcss.config.js +6 -0
  86. package/public/favicon.ico +0 -0
  87. package/public/robots.txt +2 -0
  88. package/src/App.tsx +115 -0
  89. package/src/assets/avatars/avatar-01.svg +1 -0
  90. package/src/assets/avatars/avatar-02.svg +1 -0
  91. package/src/assets/avatars/avatar-03.svg +1 -0
  92. package/src/assets/avatars/avatar-04.svg +1 -0
  93. package/src/assets/avatars/avatar-05.svg +1 -0
  94. package/src/assets/avatars/avatar-06.svg +1 -0
  95. package/src/assets/avatars/avatar-07.svg +1 -0
  96. package/src/assets/avatars/avatar-08.svg +1 -0
  97. package/src/assets/avatars/avatar-09.svg +1 -0
  98. package/src/assets/avatars/avatar-10.svg +1 -0
  99. package/src/assets/avatars/avatar-11.svg +1 -0
  100. package/src/assets/avatars/avatar-12.svg +1 -0
  101. package/src/assets/avatars/avatar-13.svg +1 -0
  102. package/src/assets/avatars/avatar-14.svg +1 -0
  103. package/src/assets/avatars/avatar-15.svg +1 -0
  104. package/src/assets/avatars/avatar-16.svg +1 -0
  105. package/src/assets/avatars/avatar-17.svg +1 -0
  106. package/src/assets/avatars/avatar-18.svg +1 -0
  107. package/src/assets/avatars/avatar-19.svg +1 -0
  108. package/src/assets/avatars/avatar-20.svg +1 -0
  109. package/src/assets/avatars/avatar-21.svg +1 -0
  110. package/src/assets/avatars/index.ts +99 -0
  111. package/src/design-system/ui/alert-dialog.tsx +141 -0
  112. package/src/design-system/ui/alert.tsx +59 -0
  113. package/src/design-system/ui/avatar.tsx +51 -0
  114. package/src/design-system/ui/badge.tsx +38 -0
  115. package/src/design-system/ui/button.tsx +59 -0
  116. package/src/design-system/ui/card.tsx +83 -0
  117. package/src/design-system/ui/dialog.tsx +122 -0
  118. package/src/design-system/ui/dropdown-menu.tsx +201 -0
  119. package/src/design-system/ui/input.tsx +22 -0
  120. package/src/design-system/ui/label.tsx +26 -0
  121. package/src/design-system/ui/scroll-area.tsx +48 -0
  122. package/src/design-system/ui/select.tsx +159 -0
  123. package/src/design-system/ui/separator.tsx +31 -0
  124. package/src/design-system/ui/sheet.tsx +141 -0
  125. package/src/design-system/ui/skeleton.tsx +15 -0
  126. package/src/design-system/ui/switch.tsx +29 -0
  127. package/src/design-system/ui/table.tsx +120 -0
  128. package/src/design-system/ui/tabs.tsx +55 -0
  129. package/src/design-system/ui/textarea.tsx +22 -0
  130. package/src/design-system/ui/toast.tsx +132 -0
  131. package/src/design-system/ui/toaster.tsx +35 -0
  132. package/src/design-system/ui/toggle-group.tsx +61 -0
  133. package/src/design-system/ui/toggle.tsx +46 -0
  134. package/src/design-system/ui/tooltip.tsx +32 -0
  135. package/src/features/MODULES.md +199 -0
  136. package/src/features/account/components/settings/appearance-settings-tab.tsx +24 -0
  137. package/src/features/account/components/theme-settings.tsx +70 -0
  138. package/src/features/account/components/use-theme-preferences.ts +106 -0
  139. package/src/features/account/pages/profile/components/profile-general-tab.tsx +89 -0
  140. package/src/features/account/pages/profile/types.ts +7 -0
  141. package/src/features/account/pages/profile.tsx +71 -0
  142. package/src/features/account/pages/service-tokens.tsx +522 -0
  143. package/src/features/account/pages/settings.tsx +42 -0
  144. package/src/features/account/pages/workspace-management.tsx +63 -0
  145. package/src/features/account/pages/workspace-members.tsx +335 -0
  146. package/src/features/auth/components/auto-login.tsx +51 -0
  147. package/src/features/auth/components/require-auth.tsx +56 -0
  148. package/src/features/auth/lib/auth-session.ts +448 -0
  149. package/src/features/auth/lib/oidc-client.ts +565 -0
  150. package/src/features/auth/pages/login.tsx +24 -0
  151. package/src/features/auth/pages/oauth-callback.tsx +63 -0
  152. package/src/features/chatkit/components/chatkit-surface.tsx +60 -0
  153. package/src/features/chatkit/components/public-chat-config.ts +70 -0
  154. package/src/features/chatkit/components/public-chat-error-boundary.tsx +74 -0
  155. package/src/features/chatkit/components/public-chat-widget.tsx +150 -0
  156. package/src/features/chatkit/components/studio-chat-bubble.tsx +451 -0
  157. package/src/features/chatkit/lib/chatkit-attachments.ts +31 -0
  158. package/src/features/chatkit/lib/chatkit-client.ts +195 -0
  159. package/src/features/chatkit/lib/chatkit-theme.ts +20 -0
  160. package/src/features/chatkit/lib/telemetry.ts +29 -0
  161. package/src/features/chatkit/lib/workflow-session.ts +70 -0
  162. package/src/features/chatkit/pages/public-chat.tsx +445 -0
  163. package/src/features/shared/components/chat-interface-options.ts +325 -0
  164. package/src/features/shared/components/chat-interface.types.ts +47 -0
  165. package/src/features/shared/components/top-navigation/account-menu.tsx +172 -0
  166. package/src/features/shared/components/top-navigation/active-workspace-indicator.tsx +280 -0
  167. package/src/features/shared/components/top-navigation/studio-brand.tsx +59 -0
  168. package/src/features/shared/components/top-navigation/top-navigation-types.ts +22 -0
  169. package/src/features/shared/components/top-navigation/version-status.tsx +280 -0
  170. package/src/features/shared/components/top-navigation.tsx +42 -0
  171. package/src/features/shared/components/workspace-bootstrap-gate.tsx +235 -0
  172. package/src/features/workflow/components/dialogs/add-credential-dialog.tsx +245 -0
  173. package/src/features/workflow/components/dialogs/confirm-delete-workflow-dialog.tsx +52 -0
  174. package/src/features/workflow/components/dialogs/credential-access-badge.tsx +34 -0
  175. package/src/features/workflow/components/dialogs/credential-status-badge.tsx +45 -0
  176. package/src/features/workflow/components/dialogs/credentials-table.tsx +453 -0
  177. package/src/features/workflow/components/dialogs/credentials-vault.tsx +85 -0
  178. package/src/features/workflow/components/dialogs/edit-credential-dialog.tsx +264 -0
  179. package/src/features/workflow/components/dialogs/update-workflow-dialog.tsx +214 -0
  180. package/src/features/workflow/components/dialogs/upload-workflow-dialog.tsx +288 -0
  181. package/src/features/workflow/components/forms/schema-config-form.tsx +41 -0
  182. package/src/features/workflow/components/layouts/sidebar-layout.tsx +288 -0
  183. package/src/features/workflow/components/layouts/use-sidebar-resize.ts +164 -0
  184. package/src/features/workflow/components/layouts/workflow-page-layout.tsx +69 -0
  185. package/src/features/workflow/components/panels/json-object-field.tsx +138 -0
  186. package/src/features/workflow/components/panels/rjsf-basic-widgets.tsx +21 -0
  187. package/src/features/workflow/components/panels/rjsf-input-widgets.tsx +105 -0
  188. package/src/features/workflow/components/panels/rjsf-templates.tsx +147 -0
  189. package/src/features/workflow/components/panels/rjsf-text-widgets.tsx +139 -0
  190. package/src/features/workflow/components/panels/rjsf-theme.tsx +10 -0
  191. package/src/features/workflow/components/panels/schema-dnd.ts +79 -0
  192. package/src/features/workflow/components/panels/workflow-diff-dialog.tsx +207 -0
  193. package/src/features/workflow/components/panels/workflow-history-filters.tsx +62 -0
  194. package/src/features/workflow/components/panels/workflow-history-footer.tsx +28 -0
  195. package/src/features/workflow/components/panels/workflow-history-header.tsx +47 -0
  196. package/src/features/workflow/components/panels/workflow-history-table.tsx +148 -0
  197. package/src/features/workflow/components/panels/workflow-history.tsx +150 -0
  198. package/src/features/workflow/components/panels/workflow-tabs.tsx +29 -0
  199. package/src/features/workflow/components/trace/agent-prism/Avatar.tsx +146 -0
  200. package/src/features/workflow/components/trace/agent-prism/Badge.tsx +95 -0
  201. package/src/features/workflow/components/trace/agent-prism/BrandLogo.tsx +102 -0
  202. package/src/features/workflow/components/trace/agent-prism/Button.tsx +124 -0
  203. package/src/features/workflow/components/trace/agent-prism/CollapseAndExpandControls.tsx +45 -0
  204. package/src/features/workflow/components/trace/agent-prism/CollapsibleSection.tsx +124 -0
  205. package/src/features/workflow/components/trace/agent-prism/CopyButton.tsx +63 -0
  206. package/src/features/workflow/components/trace/agent-prism/DetailsView/DetailsView.tsx +146 -0
  207. package/src/features/workflow/components/trace/agent-prism/DetailsView/DetailsViewAttributesTab.tsx +125 -0
  208. package/src/features/workflow/components/trace/agent-prism/DetailsView/DetailsViewContentViewer.tsx +51 -0
  209. package/src/features/workflow/components/trace/agent-prism/DetailsView/DetailsViewHeader.tsx +100 -0
  210. package/src/features/workflow/components/trace/agent-prism/DetailsView/DetailsViewInputOutputTab.tsx +401 -0
  211. package/src/features/workflow/components/trace/agent-prism/DetailsView/DetailsViewJsonOutput.tsx +33 -0
  212. package/src/features/workflow/components/trace/agent-prism/DetailsView/DetailsViewRawDataTab.tsx +27 -0
  213. package/src/features/workflow/components/trace/agent-prism/IconButton.tsx +75 -0
  214. package/src/features/workflow/components/trace/agent-prism/PriceBadge.tsx +14 -0
  215. package/src/features/workflow/components/trace/agent-prism/SearchInput.tsx +17 -0
  216. package/src/features/workflow/components/trace/agent-prism/SpanBadge.tsx +54 -0
  217. package/src/features/workflow/components/trace/agent-prism/SpanCard/SpanCard.tsx +480 -0
  218. package/src/features/workflow/components/trace/agent-prism/SpanCard/SpanCardBadges.tsx +23 -0
  219. package/src/features/workflow/components/trace/agent-prism/SpanCard/SpanCardConnector.tsx +36 -0
  220. package/src/features/workflow/components/trace/agent-prism/SpanCard/SpanCardTimeline.tsx +60 -0
  221. package/src/features/workflow/components/trace/agent-prism/SpanCard/SpanCardToggle.tsx +39 -0
  222. package/src/features/workflow/components/trace/agent-prism/SpanStatus.tsx +80 -0
  223. package/src/features/workflow/components/trace/agent-prism/TabSelector.tsx +35 -0
  224. package/src/features/workflow/components/trace/agent-prism/Tabs.tsx +140 -0
  225. package/src/features/workflow/components/trace/agent-prism/TextInput.tsx +143 -0
  226. package/src/features/workflow/components/trace/agent-prism/TimestampBadge.tsx +22 -0
  227. package/src/features/workflow/components/trace/agent-prism/TokensBadge.tsx +27 -0
  228. package/src/features/workflow/components/trace/agent-prism/TraceList/TraceList.tsx +123 -0
  229. package/src/features/workflow/components/trace/agent-prism/TraceList/TraceListItem.tsx +86 -0
  230. package/src/features/workflow/components/trace/agent-prism/TraceList/TraceListItemHeader.tsx +37 -0
  231. package/src/features/workflow/components/trace/agent-prism/TraceViewer/TraceViewer.tsx +208 -0
  232. package/src/features/workflow/components/trace/agent-prism/TraceViewer/TraceViewerDesktopLayout.tsx +99 -0
  233. package/src/features/workflow/components/trace/agent-prism/TraceViewer/TraceViewerMobileLayout.tsx +103 -0
  234. package/src/features/workflow/components/trace/agent-prism/TraceViewer/TraceViewerPlaceholder.tsx +5 -0
  235. package/src/features/workflow/components/trace/agent-prism/TraceViewer/TraceViewerSearchAndControls.tsx +30 -0
  236. package/src/features/workflow/components/trace/agent-prism/TraceViewer/TraceViewerTreeViewContainer.tsx +76 -0
  237. package/src/features/workflow/components/trace/agent-prism/TraceViewer/useTraceSelection.ts +186 -0
  238. package/src/features/workflow/components/trace/agent-prism/TreeView.tsx +73 -0
  239. package/src/features/workflow/components/trace/agent-prism/index.ts +7 -0
  240. package/src/features/workflow/components/trace/agent-prism/shared.ts +170 -0
  241. package/src/features/workflow/components/trace/agent-prism/theme/index.ts +101 -0
  242. package/src/features/workflow/components/trace/agent-prism/theme/theme.css +247 -0
  243. package/src/features/workflow/data/templates/assets/vibe-agent/config.json +5 -0
  244. package/src/features/workflow/data/templates/candidate-badges.ts +138 -0
  245. package/src/features/workflow/data/templates/index.ts +29 -0
  246. package/src/features/workflow/data/templates/template-definition.ts +77 -0
  247. package/src/features/workflow/data/templates/template-owner.ts +7 -0
  248. package/src/features/workflow/data/workflow-data.ts +8 -0
  249. package/src/features/workflow/data/workflow-types.ts +57 -0
  250. package/src/features/workflow/lib/mermaid-renderer.ts +334 -0
  251. package/src/features/workflow/lib/workflow-diff.ts +191 -0
  252. package/src/features/workflow/lib/workflow-execution-builders.ts +103 -0
  253. package/src/features/workflow/lib/workflow-execution-formatters.ts +145 -0
  254. package/src/features/workflow/lib/workflow-execution-storage.ts +63 -0
  255. package/src/features/workflow/lib/workflow-execution.types.ts +80 -0
  256. package/src/features/workflow/lib/workflow-storage-api.ts +581 -0
  257. package/src/features/workflow/lib/workflow-storage-helpers.ts +373 -0
  258. package/src/features/workflow/lib/workflow-storage-versioning.ts +127 -0
  259. package/src/features/workflow/lib/workflow-storage.constants.ts +21 -0
  260. package/src/features/workflow/lib/workflow-storage.ts +482 -0
  261. package/src/features/workflow/lib/workflow-storage.types.ts +261 -0
  262. package/src/features/workflow/pages/workflow/components/settings-tab-content.tsx +428 -0
  263. package/src/features/workflow/pages/workflow/components/trace-tab-content.tsx +183 -0
  264. package/src/features/workflow/pages/workflow/components/workflow-config-sheet.tsx +207 -0
  265. package/src/features/workflow/pages/workflow/components/workflow-config-sheet.utils.ts +275 -0
  266. package/src/features/workflow/pages/workflow/components/workflow-layout.tsx +143 -0
  267. package/src/features/workflow/pages/workflow/components/workflow-tab-content.tsx +766 -0
  268. package/src/features/workflow/pages/workflow/handlers/credentials.ts +338 -0
  269. package/src/features/workflow/pages/workflow/helpers/execution.ts +39 -0
  270. package/src/features/workflow/pages/workflow/helpers/trace.ts +838 -0
  271. package/src/features/workflow/pages/workflow/helpers/types.ts +28 -0
  272. package/src/features/workflow/pages/workflow/hooks/controller/build-layout-props.ts +171 -0
  273. package/src/features/workflow/pages/workflow/hooks/controller/use-workflow-controller.ts +19 -0
  274. package/src/features/workflow/pages/workflow/hooks/controller/use-workflow-core.ts +84 -0
  275. package/src/features/workflow/pages/workflow/hooks/controller/use-workflow-execution-controller.ts +167 -0
  276. package/src/features/workflow/pages/workflow/hooks/controller/use-workflow-lifecycle.ts +37 -0
  277. package/src/features/workflow/pages/workflow/hooks/controller/use-workflow-resources.ts +57 -0
  278. package/src/features/workflow/pages/workflow/hooks/execution-log-helpers.ts +75 -0
  279. package/src/features/workflow/pages/workflow/hooks/execution-node-status.ts +46 -0
  280. package/src/features/workflow/pages/workflow/hooks/execution-record-updater.ts +119 -0
  281. package/src/features/workflow/pages/workflow/hooks/execution-record.ts +31 -0
  282. package/src/features/workflow/pages/workflow/hooks/execution-runtime-updates.ts +96 -0
  283. package/src/features/workflow/pages/workflow/hooks/use-execution-trace.ts +512 -0
  284. package/src/features/workflow/pages/workflow/hooks/use-execution-updates.ts +125 -0
  285. package/src/features/workflow/pages/workflow/hooks/use-pause-workflow.ts +70 -0
  286. package/src/features/workflow/pages/workflow/hooks/use-studio-ui-state.ts +10 -0
  287. package/src/features/workflow/pages/workflow/hooks/use-workflow-chat.ts +212 -0
  288. package/src/features/workflow/pages/workflow/hooks/use-workflow-credential-readiness.ts +72 -0
  289. package/src/features/workflow/pages/workflow/hooks/use-workflow-credentials.ts +167 -0
  290. package/src/features/workflow/pages/workflow/hooks/use-workflow-execution-state.ts +20 -0
  291. package/src/features/workflow/pages/workflow/hooks/use-workflow-listeners.ts +182 -0
  292. package/src/features/workflow/pages/workflow/hooks/use-workflow-loader.ts +236 -0
  293. package/src/features/workflow/pages/workflow/hooks/use-workflow-metadata-state.ts +56 -0
  294. package/src/features/workflow/pages/workflow/hooks/use-workflow-saver.ts +191 -0
  295. package/src/features/workflow/pages/workflow/hooks/use-workflow-storage-listener.ts +81 -0
  296. package/src/features/workflow/pages/workflow/hooks/workflow-runner-websocket.ts +150 -0
  297. package/src/features/workflow/pages/workflow-gallery/types.ts +3 -0
  298. package/src/features/workflow/pages/workflow-gallery/use-workflow-gallery-actions.ts +223 -0
  299. package/src/features/workflow/pages/workflow-gallery/use-workflow-gallery-state.ts +206 -0
  300. package/src/features/workflow/pages/workflow-gallery/use-workflow-gallery.ts +14 -0
  301. package/src/features/workflow/pages/workflow-gallery/workflow-card-size.ts +8 -0
  302. package/src/features/workflow/pages/workflow-gallery/workflow-card.tsx +327 -0
  303. package/src/features/workflow/pages/workflow-gallery/workflow-gallery-tabs.tsx +173 -0
  304. package/src/features/workflow/pages/workflow-gallery.tsx +96 -0
  305. package/src/features/workflow/pages/workflow.tsx +119 -0
  306. package/src/features/workflow/types/credential-vault.ts +52 -0
  307. package/src/hooks/browser-context-provider.tsx +19 -0
  308. package/src/hooks/use-browser-context.ts +188 -0
  309. package/src/hooks/use-color-scheme.ts +77 -0
  310. package/src/hooks/use-credential-vault.ts +442 -0
  311. package/src/hooks/use-page-context.ts +39 -0
  312. package/src/hooks/use-toast.ts +182 -0
  313. package/src/hooks/use-uploads-allowed.ts +28 -0
  314. package/src/index.css +95 -0
  315. package/src/lib/api.ts +445 -0
  316. package/src/lib/auth-fetch.ts +35 -0
  317. package/src/lib/config.ts +102 -0
  318. package/src/lib/theme.ts +109 -0
  319. package/src/lib/utils.ts +6 -0
  320. package/src/lib/workspace-routing.ts +67 -0
  321. package/src/lib/workspace-session.ts +66 -0
  322. package/src/lib/workspace-slug.ts +10 -0
  323. package/src/main.tsx +28 -0
  324. package/src/vite-env.d.ts +17 -0
  325. package/tailwind.config.js +153 -0
  326. package/tsconfig.app.json +30 -0
  327. package/tsconfig.json +16 -0
  328. package/tsconfig.node.json +21 -0
  329. package/vite.config.ts +122 -0
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Theme initialization utility
3
+ *
4
+ * This module provides functions to initialize and manage theme settings
5
+ * across the application. It ensures theme preferences persist across
6
+ * page refreshes by reading from localStorage and applying the appropriate
7
+ * CSS classes before the React app renders.
8
+ */
9
+
10
+ export type Theme = "light" | "dark" | "system";
11
+
12
+ /**
13
+ * Initialize the theme on app load
14
+ * This should be called before React renders to prevent theme flashing
15
+ */
16
+ export function initializeTheme(): void {
17
+ // Get saved theme preference from localStorage
18
+ const savedTheme = localStorage.getItem("theme") as Theme | null;
19
+ const theme = savedTheme || "system";
20
+
21
+ // Apply the theme
22
+ applyTheme(theme);
23
+
24
+ // Apply other preferences
25
+ const reducedMotion = localStorage.getItem("reducedMotion") === "true";
26
+ const highContrast = localStorage.getItem("highContrast") === "true";
27
+ const accentColor = localStorage.getItem("accentColor") || "blue";
28
+
29
+ applyReducedMotion(reducedMotion);
30
+ applyHighContrast(highContrast);
31
+ applyAccentColor(accentColor);
32
+ }
33
+
34
+ /**
35
+ * Apply a theme to the document
36
+ * @param theme - The theme to apply ("light", "dark", or "system")
37
+ */
38
+ export function applyTheme(theme: Theme): void {
39
+ if (theme === "system") {
40
+ // Use system preference
41
+ const systemTheme = window.matchMedia("(prefers-color-scheme: dark)")
42
+ .matches
43
+ ? "dark"
44
+ : "light";
45
+ document.documentElement.classList.toggle("dark", systemTheme === "dark");
46
+ } else {
47
+ // Use explicit theme
48
+ document.documentElement.classList.toggle("dark", theme === "dark");
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Apply the reduced motion preference to the document root.
54
+ */
55
+ export function applyReducedMotion(enabled: boolean): void {
56
+ document.documentElement.classList.toggle("reduce-motion", enabled);
57
+ }
58
+
59
+ /**
60
+ * Apply the high contrast preference to the document root.
61
+ */
62
+ export function applyHighContrast(enabled: boolean): void {
63
+ document.documentElement.classList.toggle("high-contrast", enabled);
64
+ }
65
+
66
+ /**
67
+ * Apply the accent color preference to the document root.
68
+ */
69
+ export function applyAccentColor(color: string): void {
70
+ document.documentElement.setAttribute("data-accent", color);
71
+ }
72
+
73
+ /**
74
+ * Listen for system theme changes when using "system" theme
75
+ * @param callback - Function to call when system theme changes
76
+ * @returns Cleanup function to remove the listener
77
+ */
78
+ export function listenToSystemTheme(
79
+ callback: (isDark: boolean) => void,
80
+ ): () => void {
81
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
82
+
83
+ const handler = (e: MediaQueryListEvent) => {
84
+ callback(e.matches);
85
+ };
86
+
87
+ mediaQuery.addEventListener("change", handler);
88
+
89
+ return () => {
90
+ mediaQuery.removeEventListener("change", handler);
91
+ };
92
+ }
93
+
94
+ /**
95
+ * Keep the applied theme in sync with the OS color scheme while the stored
96
+ * preference is "system". Without this, switching the OS between light and
97
+ * dark only takes effect after a full page reload.
98
+ * @returns Cleanup function to remove the listener
99
+ */
100
+ export function watchSystemTheme(): () => void {
101
+ return listenToSystemTheme(() => {
102
+ const savedTheme =
103
+ (localStorage.getItem("theme") as Theme | null) ?? "system";
104
+
105
+ if (savedTheme === "system") {
106
+ applyTheme("system");
107
+ }
108
+ });
109
+ }
@@ -0,0 +1,6 @@
1
+ import { clsx, type ClassValue } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+ }
@@ -0,0 +1,67 @@
1
+ const RESERVED_PATH_SEGMENTS = new Set([
2
+ "auth",
3
+ "chat",
4
+ "login",
5
+ "profile",
6
+ "settings",
7
+ "workspace",
8
+ ]);
9
+
10
+ const trimPathSegment = (value: string | null | undefined): string | null => {
11
+ const trimmed = value?.trim();
12
+ return trimmed ? trimmed : null;
13
+ };
14
+
15
+ export const getWorkspaceGalleryPath = (
16
+ workspaceSlug: string | null | undefined,
17
+ ): string => {
18
+ const slug = trimPathSegment(workspaceSlug);
19
+ return slug ? `/${slug}` : "/";
20
+ };
21
+
22
+ export const getWorkspacePathWithSlug = (
23
+ pathname: string,
24
+ workspaceSlug: string,
25
+ ): string => {
26
+ const slug = trimPathSegment(workspaceSlug);
27
+ if (!slug) {
28
+ return getWorkspaceGalleryPath(slug);
29
+ }
30
+
31
+ const pathSegments = pathname.split("/").filter(Boolean);
32
+ if (pathSegments.length === 0) {
33
+ return getWorkspaceGalleryPath(slug);
34
+ }
35
+
36
+ const [firstSegment, ...rest] = pathSegments;
37
+ if (RESERVED_PATH_SEGMENTS.has(firstSegment.toLowerCase())) {
38
+ return getWorkspaceGalleryPath(slug);
39
+ }
40
+
41
+ return `/${[slug, ...rest].join("/")}`;
42
+ };
43
+
44
+ export const getWorkspaceWorkflowPath = (
45
+ workspaceSlug: string | null | undefined,
46
+ workflowRef: string,
47
+ ): string => {
48
+ const slug = trimPathSegment(workspaceSlug);
49
+ const ref = workflowRef.trim();
50
+ if (!ref) {
51
+ return getWorkspaceGalleryPath(slug);
52
+ }
53
+ return slug ? `/${slug}/${ref}` : `/${ref}`;
54
+ };
55
+
56
+ export const getWorkspaceSlugFromPathname = (
57
+ pathname: string,
58
+ ): string | null => {
59
+ const firstSegment = pathname.split("/").filter(Boolean)[0] ?? null;
60
+ if (!firstSegment) {
61
+ return null;
62
+ }
63
+ if (RESERVED_PATH_SEGMENTS.has(firstSegment.toLowerCase())) {
64
+ return null;
65
+ }
66
+ return firstSegment;
67
+ };
@@ -0,0 +1,66 @@
1
+ const WORKSPACE_SLUG_KEY = "orcheo_studio_workspace_slug";
2
+ const WORKSPACE_HEADER = "X-Orcheo-Workspace";
3
+
4
+ const safeLocalStorageGet = (key: string): string | null => {
5
+ if (typeof window === "undefined") {
6
+ return null;
7
+ }
8
+
9
+ try {
10
+ return window.localStorage.getItem(key);
11
+ } catch {
12
+ return null;
13
+ }
14
+ };
15
+
16
+ const safeLocalStorageSet = (key: string, value: string | null): void => {
17
+ if (typeof window === "undefined") {
18
+ return;
19
+ }
20
+
21
+ try {
22
+ if (value === null) {
23
+ window.localStorage.removeItem(key);
24
+ return;
25
+ }
26
+ window.localStorage.setItem(key, value);
27
+ } catch {
28
+ return;
29
+ }
30
+ };
31
+
32
+ const normalizeSlug = (value: string): string => value.trim();
33
+
34
+ export const getWorkspaceHeaderName = (): string => WORKSPACE_HEADER;
35
+
36
+ export const getSelectedWorkspaceSlug = (): string | null => {
37
+ const slug = safeLocalStorageGet(WORKSPACE_SLUG_KEY);
38
+ if (!slug) {
39
+ return null;
40
+ }
41
+ const normalized = normalizeSlug(slug);
42
+ return normalized || null;
43
+ };
44
+
45
+ export const setSelectedWorkspaceSlug = (slug: string | null): void => {
46
+ if (slug === null) {
47
+ safeLocalStorageSet(WORKSPACE_SLUG_KEY, null);
48
+ } else {
49
+ safeLocalStorageSet(WORKSPACE_SLUG_KEY, normalizeSlug(slug));
50
+ }
51
+ };
52
+
53
+ export const clearSelectedWorkspaceSlug = (): void => {
54
+ setSelectedWorkspaceSlug(null);
55
+ };
56
+
57
+ export const getWorkspaceSelectionHeaders = (): Record<string, string> => {
58
+ const slug = getSelectedWorkspaceSlug();
59
+ if (!slug) {
60
+ return {};
61
+ }
62
+
63
+ return {
64
+ [getWorkspaceHeaderName()]: slug,
65
+ };
66
+ };
@@ -0,0 +1,10 @@
1
+ const WORKSPACE_SLUG_PATTERN = /[^a-z0-9_-]+/g;
2
+
3
+ export function slugifyWorkspace(value: string): string {
4
+ return value
5
+ .trim()
6
+ .toLowerCase()
7
+ .replace(WORKSPACE_SLUG_PATTERN, "-")
8
+ .replace(/-+/g, "-")
9
+ .replace(/^-|-$/g, "");
10
+ }
package/src/main.tsx ADDED
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+ import * as ReactDOM from "react-dom";
3
+ import { createRoot } from "react-dom/client";
4
+ import App from "./App";
5
+ import "./index.css";
6
+ import { initializeTheme, watchSystemTheme } from "./lib/theme";
7
+
8
+ // Initialize theme before React renders to prevent flash of wrong theme
9
+ initializeTheme();
10
+
11
+ // Keep the theme in sync with the OS color scheme when "system" is selected,
12
+ // so light/dark switches apply live without requiring a page refresh.
13
+ watchSystemTheme();
14
+
15
+ // Make React and ReactDOM globally available immediately (not in useEffect)
16
+ window.React = React;
17
+ window.ReactDOM = ReactDOM;
18
+
19
+ const root = createRoot(document.getElementById("root") as HTMLElement);
20
+ root.render(
21
+ <React.StrictMode>
22
+ <App />
23
+ </React.StrictMode>,
24
+ );
25
+
26
+ // If you want to start measuring performance in your app, pass a function
27
+ // to log results (for example: reportWebVitals(console.log))
28
+ // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
@@ -0,0 +1,17 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ interface ImportMetaEnv {
4
+ readonly VITE_ORCHEO_BACKEND_URL?: string;
5
+ readonly VITE_ORCHEO_CHATKIT_DOMAIN_KEY?: string;
6
+ }
7
+
8
+ interface ImportMeta {
9
+ readonly env: ImportMetaEnv;
10
+ }
11
+
12
+ declare const __ORCHEO_STUDIO_VERSION__: string;
13
+
14
+ declare module "*.py?raw" {
15
+ const content: string;
16
+ export default content;
17
+ }
@@ -0,0 +1,153 @@
1
+ import tailwindcssAnimate from "tailwindcss-animate";
2
+
3
+ const agentPrismPrefix = "agentprism";
4
+ const agentPrismTokens = [
5
+ "background",
6
+ "foreground",
7
+ "primary",
8
+ "primary-foreground",
9
+ "primary",
10
+ "primary-foreground",
11
+ "secondary",
12
+ "secondary-foreground",
13
+ "muted",
14
+ "muted-foreground",
15
+ "accent",
16
+ "accent-foreground",
17
+ "brand",
18
+ "brand-foreground",
19
+ "brand-secondary",
20
+ "brand-secondary-foreground",
21
+ "border",
22
+ "border-subtle",
23
+ "border-strong",
24
+ "border-inverse",
25
+ "success",
26
+ "success-muted",
27
+ "success-muted-foreground",
28
+ "error",
29
+ "error-muted",
30
+ "error-muted-foreground",
31
+ "warning",
32
+ "warning-muted",
33
+ "warning-muted-foreground",
34
+ "pending",
35
+ "pending-muted",
36
+ "pending-muted-foreground",
37
+ "code-string",
38
+ "code-number",
39
+ "code-key",
40
+ "code-base",
41
+ "badge-default",
42
+ "badge-default-foreground",
43
+ "avatar-llm",
44
+ "badge-llm",
45
+ "badge-llm-foreground",
46
+ "timeline-llm",
47
+ "avatar-agent",
48
+ "badge-agent",
49
+ "badge-agent-foreground",
50
+ "timeline-agent",
51
+ "avatar-tool",
52
+ "badge-tool",
53
+ "badge-tool-foreground",
54
+ "timeline-tool",
55
+ "avatar-chain",
56
+ "badge-chain",
57
+ "badge-chain-foreground",
58
+ "timeline-chain",
59
+ "avatar-retrieval",
60
+ "badge-retrieval",
61
+ "badge-retrieval-foreground",
62
+ "timeline-retrieval",
63
+ "avatar-embedding",
64
+ "badge-embedding",
65
+ "badge-embedding-foreground",
66
+ "timeline-embedding",
67
+ "avatar-guardrail",
68
+ "badge-guardrail",
69
+ "badge-guardrail-foreground",
70
+ "timeline-guardrail",
71
+ "avatar-create-agent",
72
+ "badge-create-agent",
73
+ "badge-create-agent-foreground",
74
+ "timeline-create-agent",
75
+ "avatar-span",
76
+ "badge-span",
77
+ "badge-span-foreground",
78
+ "timeline-span",
79
+ "avatar-event",
80
+ "badge-event",
81
+ "badge-event-foreground",
82
+ "timeline-event",
83
+ "avatar-unknown",
84
+ "badge-unknown",
85
+ "badge-unknown-foreground",
86
+ "timeline-unknown",
87
+ ];
88
+
89
+ const agentPrismTailwindColors = Object.fromEntries(
90
+ agentPrismTokens.map((tokenName) => [
91
+ `agentprism-${tokenName}`,
92
+ `oklch(var(--${agentPrismPrefix}-${tokenName}) / <alpha-value>)`,
93
+ ]),
94
+ );
95
+
96
+ /** @type {import('tailwindcss').Config} */
97
+ export default {
98
+ darkMode: ["class"],
99
+ content: ["./main.tsx", "./src/**/*.{js,ts,jsx,tsx}"],
100
+ theme: {
101
+ extend: {
102
+ borderRadius: {
103
+ lg: "var(--radius)",
104
+ md: "calc(var(--radius) - 2px)",
105
+ sm: "calc(var(--radius) - 4px)",
106
+ },
107
+ colors: {
108
+ background: "hsl(var(--background))",
109
+ foreground: "hsl(var(--foreground))",
110
+ card: {
111
+ DEFAULT: "hsl(var(--card))",
112
+ foreground: "hsl(var(--card-foreground))",
113
+ },
114
+ popover: {
115
+ DEFAULT: "hsl(var(--popover))",
116
+ foreground: "hsl(var(--popover-foreground))",
117
+ },
118
+ primary: {
119
+ DEFAULT: "hsl(var(--primary))",
120
+ foreground: "hsl(var(--primary-foreground))",
121
+ },
122
+ secondary: {
123
+ DEFAULT: "hsl(var(--secondary))",
124
+ foreground: "hsl(var(--secondary-foreground))",
125
+ },
126
+ muted: {
127
+ DEFAULT: "hsl(var(--muted))",
128
+ foreground: "hsl(var(--muted-foreground))",
129
+ },
130
+ accent: {
131
+ DEFAULT: "hsl(var(--accent))",
132
+ foreground: "hsl(var(--accent-foreground))",
133
+ },
134
+ destructive: {
135
+ DEFAULT: "hsl(var(--destructive))",
136
+ foreground: "hsl(var(--destructive-foreground))",
137
+ },
138
+ border: "hsl(var(--border))",
139
+ input: "hsl(var(--input))",
140
+ ring: "hsl(var(--ring))",
141
+ chart: {
142
+ 1: "hsl(var(--chart-1))",
143
+ 2: "hsl(var(--chart-2))",
144
+ 3: "hsl(var(--chart-3))",
145
+ 4: "hsl(var(--chart-4))",
146
+ 5: "hsl(var(--chart-5))",
147
+ },
148
+ ...agentPrismTailwindColors,
149
+ },
150
+ },
151
+ },
152
+ plugins: [tailwindcssAnimate],
153
+ };
@@ -0,0 +1,30 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+ "target": "ES2020",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
7
+ "module": "ESNext",
8
+ "skipLibCheck": true,
9
+ "baseUrl": ".",
10
+ "paths": {
11
+ "@/*": ["src/*"],
12
+ "@lib/*": ["src/lib/*"],
13
+ "@design-system/*": ["src/design-system/*"],
14
+ "@features/*": ["src/features/*"]
15
+ },
16
+ "moduleResolution": "bundler",
17
+ "allowImportingTsExtensions": true,
18
+ "isolatedModules": true,
19
+ "moduleDetection": "force",
20
+ "noEmit": true,
21
+ "jsx": "react-jsx",
22
+ "strict": true,
23
+ "noUnusedLocals": true,
24
+ "noUnusedParameters": true,
25
+ "noFallthroughCasesInSwitch": true,
26
+ "noUncheckedSideEffectImports": true,
27
+ "types": ["@openai/chatkit"]
28
+ },
29
+ "include": ["src"]
30
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "files": [],
3
+ "compilerOptions": {
4
+ "baseUrl": ".",
5
+ "paths": {
6
+ "@/*": ["src/*"],
7
+ "@lib/*": ["src/lib/*"],
8
+ "@design-system/*": ["src/design-system/*"],
9
+ "@features/*": ["src/features/*"]
10
+ }
11
+ },
12
+ "references": [
13
+ { "path": "./tsconfig.app.json" },
14
+ { "path": "./tsconfig.node.json" }
15
+ ]
16
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+ "target": "ES2022",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+ "moduleResolution": "bundler",
9
+ "allowImportingTsExtensions": true,
10
+ "isolatedModules": true,
11
+ "moduleDetection": "force",
12
+ "noEmit": true,
13
+ "strict": true,
14
+ "noUnusedLocals": true,
15
+ "noUnusedParameters": true,
16
+ "noFallthroughCasesInSwitch": true,
17
+ "noUncheckedSideEffectImports": true,
18
+ "types": ["node"]
19
+ },
20
+ "include": ["vite.config.ts"]
21
+ }
package/vite.config.ts ADDED
@@ -0,0 +1,122 @@
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+ import path from 'path'
4
+ import { fileURLToPath } from 'url'
5
+ import { readFileSync } from 'fs'
6
+
7
+ // ES Module equivalent of __dirname
8
+ const __dirname = path.dirname(fileURLToPath(import.meta.url))
9
+ const packageJsonPath = path.resolve(__dirname, './package.json')
10
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as {
11
+ version?: string
12
+ }
13
+ const studioVersion = packageJson.version ?? '0.0.0'
14
+
15
+ // https://vite.dev/config/
16
+ export default defineConfig({
17
+ plugins: [react()],
18
+ define: {
19
+ __ORCHEO_STUDIO_VERSION__: JSON.stringify(studioVersion),
20
+ },
21
+ resolve: {
22
+ alias: {
23
+ '@': path.resolve(__dirname, './src'),
24
+ '@lib': path.resolve(__dirname, './src/lib'),
25
+ '@design-system': path.resolve(__dirname, './src/design-system'),
26
+ '@features': path.resolve(__dirname, './src/features'),
27
+ }
28
+ },
29
+ // Fix for CJS/ESM compatibility issues with React 19
30
+ // Force pre-bundling of all dependencies to handle CJS->ESM conversion
31
+ optimizeDeps: {
32
+ // Force re-optimization to ensure all deps are bundled
33
+ force: true,
34
+ // Only exclude test-related packages that shouldn't be in production
35
+ exclude: ['vitest', '@testing-library/react', '@testing-library/jest-dom', '@testing-library/user-event'],
36
+ // Explicitly include all known problematic CJS packages and their subpaths
37
+ include: [
38
+ // React ecosystem
39
+ 'react',
40
+ 'react-dom',
41
+ 'react-dom/client',
42
+ 'react/jsx-runtime',
43
+ 'react/jsx-dev-runtime',
44
+ // use-sync-external-store (used by zustand, swr, @radix-ui)
45
+ 'use-sync-external-store',
46
+ 'use-sync-external-store/shim',
47
+ 'use-sync-external-store/shim/with-selector',
48
+ 'use-sync-external-store/shim/with-selector.js',
49
+ // prop-types (used by many React libs)
50
+ 'prop-types',
51
+ 'react-is',
52
+ // @rjsf dependencies
53
+ 'ajv',
54
+ 'ajv-formats',
55
+ 'jsonpointer',
56
+ 'json-schema-merge-allof',
57
+ // lodash submodules used by @rjsf
58
+ 'lodash/get',
59
+ 'lodash/set',
60
+ 'lodash/has',
61
+ 'lodash/omit',
62
+ 'lodash/pick',
63
+ 'lodash/merge',
64
+ 'lodash/cloneDeep',
65
+ 'lodash/isEmpty',
66
+ 'lodash/isObject',
67
+ 'lodash/isString',
68
+ 'lodash/isNumber',
69
+ 'lodash/isNil',
70
+ 'lodash/isPlainObject',
71
+ 'lodash/forEach',
72
+ 'lodash/toPath',
73
+ 'lodash/uniqueId',
74
+ 'lodash/keys',
75
+ 'lodash/union',
76
+ 'lodash/uniq',
77
+ 'lodash/times',
78
+ 'lodash/reduce',
79
+ 'lodash/transform',
80
+ 'lodash/difference',
81
+ 'lodash/flattenDeep',
82
+ 'lodash/isEqualWith',
83
+ 'lodash/setWith',
84
+ 'lodash/pickBy',
85
+ 'lodash/unset',
86
+ 'lodash/defaultsDeep',
87
+ 'lodash/flatten',
88
+ // Other CJS packages
89
+ 'react-split',
90
+ 'dom-helpers',
91
+ 'dayjs',
92
+ 'invariant',
93
+ 'copy-to-clipboard',
94
+ 'moment',
95
+ 'moment-timezone',
96
+ 'papaparse',
97
+ // zustand and related
98
+ 'zustand',
99
+ 'zustand/traditional',
100
+ 'zustand/middleware',
101
+ // @braintree/sanitize-url (CJS transitive dep of mermaid)
102
+ '@braintree/sanitize-url',
103
+ ]
104
+ },
105
+ build: {
106
+ commonjsOptions: {
107
+ include: [/node_modules/],
108
+ transformMixedEsModules: true,
109
+ }
110
+ },
111
+ server: {
112
+ port: 2026,
113
+ hmr: process.env.VITE_DISABLE_HMR === 'true' ? false : undefined,
114
+ allowedHosts: [
115
+ 'localhost',
116
+ ...((process.env.VITE_ORCHEO_ALLOWED_HOSTS || '')
117
+ .split(',')
118
+ .map((h: string) => h.trim())
119
+ .filter(Boolean))
120
+ ]
121
+ }
122
+ })