@object-ui/app-shell 6.2.3 → 7.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 (468) hide show
  1. package/CHANGELOG.md +948 -0
  2. package/README.md +292 -0
  3. package/dist/assistant/assistantBus.d.ts +72 -0
  4. package/dist/assistant/assistantBus.js +133 -0
  5. package/dist/chrome/CommandPalette.d.ts +1 -1
  6. package/dist/chrome/CommandPalette.js +26 -22
  7. package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
  8. package/dist/chrome/ConsoleToaster.d.ts +1 -1
  9. package/dist/chrome/ConsoleToaster.js +3 -1
  10. package/dist/chrome/ErrorBoundary.d.ts +1 -1
  11. package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
  12. package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
  13. package/dist/chrome/LoadingScreen.d.ts +1 -1
  14. package/dist/chrome/LoadingScreen.js +22 -26
  15. package/dist/chrome/RouteFader.d.ts +1 -1
  16. package/dist/chrome/ThemeProvider.d.ts +1 -1
  17. package/dist/components/ManagedByBadge.d.ts +1 -1
  18. package/dist/console/AppContent.d.ts +1 -1
  19. package/dist/console/AppContent.js +170 -37
  20. package/dist/console/ConsoleShell.d.ts +7 -7
  21. package/dist/console/ConsoleShell.js +32 -3
  22. package/dist/console/ai/AiChatPage.d.ts +88 -1
  23. package/dist/console/ai/AiChatPage.js +743 -66
  24. package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
  25. package/dist/console/ai/ConversationsSidebar.js +149 -34
  26. package/dist/console/ai/LiveCanvas.d.ts +22 -0
  27. package/dist/console/ai/LiveCanvas.js +78 -0
  28. package/dist/console/ai/reconcileTurn.d.ts +8 -0
  29. package/dist/console/ai/reconcileTurn.js +20 -0
  30. package/dist/console/auth/AuthPageLayout.d.ts +1 -1
  31. package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
  32. package/dist/console/auth/LoginPage.d.ts +1 -1
  33. package/dist/console/auth/RegisterPage.d.ts +1 -1
  34. package/dist/console/auth/RegisterPage.js +23 -3
  35. package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
  36. package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
  37. package/dist/console/home/AppCard.d.ts +1 -1
  38. package/dist/console/home/AppCard.js +6 -12
  39. package/dist/console/home/HomeAppsStrip.d.ts +8 -0
  40. package/dist/console/home/HomeAppsStrip.js +61 -0
  41. package/dist/console/home/HomeLayout.d.ts +1 -1
  42. package/dist/console/home/HomeLayout.js +3 -1
  43. package/dist/console/home/HomePage.d.ts +1 -2
  44. package/dist/console/home/HomePage.js +149 -21
  45. package/dist/console/home/HomeRail.d.ts +22 -0
  46. package/dist/console/home/HomeRail.js +62 -0
  47. package/dist/console/home/QuickActions.d.ts +1 -1
  48. package/dist/console/home/QuickActions.js +3 -11
  49. package/dist/console/home/RecentApps.d.ts +1 -1
  50. package/dist/console/home/RecentApps.js +2 -2
  51. package/dist/console/home/StarredApps.d.ts +1 -1
  52. package/dist/console/home/StarredApps.js +2 -2
  53. package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
  54. package/dist/console/marketplace/InstalledListWidget.js +93 -0
  55. package/dist/console/marketplace/MarkdownText.d.ts +1 -1
  56. package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
  57. package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
  58. package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
  59. package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
  60. package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
  61. package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
  62. package/dist/console/marketplace/MarketplacePage.js +60 -3
  63. package/dist/console/marketplace/PackageIcon.d.ts +1 -1
  64. package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
  65. package/dist/console/marketplace/PluginDisclosure.js +38 -0
  66. package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
  67. package/dist/console/marketplace/marketplaceApi.js +254 -1
  68. package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
  69. package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
  70. package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
  71. package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
  72. package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
  73. package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
  74. package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
  75. package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
  76. package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
  77. package/dist/context/CommandPaletteProvider.d.ts +44 -0
  78. package/dist/context/CommandPaletteProvider.js +71 -0
  79. package/dist/context/FavoritesProvider.d.ts +1 -1
  80. package/dist/context/NavigationContext.d.ts +1 -1
  81. package/dist/context/RecentItemsProvider.d.ts +2 -2
  82. package/dist/context/UserStateAdapters.d.ts +1 -1
  83. package/dist/context/index.d.ts +2 -0
  84. package/dist/context/index.js +1 -0
  85. package/dist/hooks/index.d.ts +5 -2
  86. package/dist/hooks/index.js +4 -1
  87. package/dist/hooks/useActionModal.d.ts +53 -0
  88. package/dist/hooks/useActionModal.js +111 -0
  89. package/dist/hooks/useChatConversation.d.ts +107 -4
  90. package/dist/hooks/useChatConversation.js +253 -25
  91. package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
  92. package/dist/hooks/useConsoleActionRuntime.js +560 -0
  93. package/dist/hooks/useConversationList.js +61 -3
  94. package/dist/hooks/useHomeInbox.d.ts +13 -0
  95. package/dist/hooks/useHomeInbox.js +142 -0
  96. package/dist/hooks/useNavPins.js +17 -23
  97. package/dist/hooks/useNavigationSync.d.ts +33 -0
  98. package/dist/hooks/useNavigationSync.js +98 -12
  99. package/dist/hooks/useReconcileOnError.d.ts +40 -0
  100. package/dist/hooks/useReconcileOnError.js +37 -0
  101. package/dist/hooks/useRecordApprovals.d.ts +18 -19
  102. package/dist/hooks/useRecordApprovals.js +24 -40
  103. package/dist/hooks/useResponsiveSidebar.js +14 -5
  104. package/dist/hooks/useSettleSignal.d.ts +19 -0
  105. package/dist/hooks/useSettleSignal.js +20 -0
  106. package/dist/hooks/useTrackRouteAsRecent.js +35 -0
  107. package/dist/hooks/useUrlOverlay.d.ts +62 -0
  108. package/dist/hooks/useUrlOverlay.js +88 -0
  109. package/dist/index.d.ts +16 -7
  110. package/dist/index.js +12 -4
  111. package/dist/layout/ActivityFeed.d.ts +1 -1
  112. package/dist/layout/AppHeader.d.ts +3 -2
  113. package/dist/layout/AppHeader.js +237 -72
  114. package/dist/layout/AppSidebar.d.ts +2 -1
  115. package/dist/layout/AppSidebar.js +26 -46
  116. package/dist/layout/AppSwitcher.d.ts +2 -1
  117. package/dist/layout/AppSwitcher.js +9 -5
  118. package/dist/layout/AuthPageLayout.d.ts +1 -1
  119. package/dist/layout/ConnectionStatus.d.ts +1 -1
  120. package/dist/layout/ConnectionStatus.js +9 -6
  121. package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
  122. package/dist/layout/ConsoleChatbotFab.js +16 -2
  123. package/dist/layout/ConsoleFloatingChatbot.d.ts +32 -2
  124. package/dist/layout/ConsoleFloatingChatbot.js +374 -41
  125. package/dist/layout/ConsoleLayout.d.ts +1 -1
  126. package/dist/layout/ConsoleLayout.js +27 -11
  127. package/dist/layout/ContextSelectors.d.ts +44 -0
  128. package/dist/layout/ContextSelectors.js +218 -0
  129. package/dist/layout/InboxPopover.d.ts +6 -1
  130. package/dist/layout/InboxPopover.js +25 -6
  131. package/dist/layout/LocaleSwitcher.d.ts +1 -1
  132. package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
  133. package/dist/layout/LocalizedSidebarTrigger.js +15 -0
  134. package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
  135. package/dist/layout/ModeToggle.d.ts +1 -1
  136. package/dist/layout/PageHeader.d.ts +1 -1
  137. package/dist/layout/UnifiedSidebar.d.ts +2 -1
  138. package/dist/layout/UnifiedSidebar.js +116 -15
  139. package/dist/observability/index.d.ts +1 -0
  140. package/dist/observability/index.js +1 -0
  141. package/dist/observability/settleSignal.d.ts +64 -0
  142. package/dist/observability/settleSignal.js +131 -0
  143. package/dist/preview/DraftChangesPanel.d.ts +19 -0
  144. package/dist/preview/DraftChangesPanel.js +114 -0
  145. package/dist/preview/DraftPreviewBar.d.ts +8 -0
  146. package/dist/preview/DraftPreviewBar.js +86 -0
  147. package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
  148. package/dist/preview/PreviewDraftEmptyState.js +47 -0
  149. package/dist/preview/PreviewModeContext.d.ts +57 -0
  150. package/dist/preview/PreviewModeContext.js +99 -0
  151. package/dist/preview/UnpublishedAppBar.d.ts +8 -0
  152. package/dist/preview/UnpublishedAppBar.js +79 -0
  153. package/dist/preview/draftStatus.d.ts +20 -0
  154. package/dist/preview/draftStatus.js +27 -0
  155. package/dist/preview/usePublishAllDrafts.d.ts +18 -0
  156. package/dist/preview/usePublishAllDrafts.js +106 -0
  157. package/dist/providers/AdapterProvider.d.ts +1 -1
  158. package/dist/providers/AdapterProvider.js +6 -1
  159. package/dist/providers/ExpressionProvider.d.ts +1 -1
  160. package/dist/providers/MetadataProvider.d.ts +17 -2
  161. package/dist/providers/MetadataProvider.js +183 -12
  162. package/dist/runtime-config.d.ts +46 -2
  163. package/dist/runtime-config.js +39 -2
  164. package/dist/services/builtinComponents.js +68 -59
  165. package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
  166. package/dist/skeletons/SkeletonDetail.d.ts +1 -1
  167. package/dist/skeletons/SkeletonGrid.d.ts +1 -1
  168. package/dist/utils/appRoute.d.ts +21 -0
  169. package/dist/utils/appRoute.js +25 -0
  170. package/dist/utils/deriveRelatedLists.d.ts +54 -0
  171. package/dist/utils/deriveRelatedLists.js +91 -0
  172. package/dist/utils/index.d.ts +4 -0
  173. package/dist/utils/index.js +3 -0
  174. package/dist/utils/managedByEmptyState.d.ts +8 -1
  175. package/dist/utils/managedByEmptyState.js +13 -7
  176. package/dist/utils/preferLocal.d.ts +18 -0
  177. package/dist/utils/preferLocal.js +24 -0
  178. package/dist/views/ActionConfirmDialog.d.ts +1 -1
  179. package/dist/views/ActionConfirmDialog.js +3 -1
  180. package/dist/views/ActionParamDialog.d.ts +6 -1
  181. package/dist/views/ActionParamDialog.js +9 -3
  182. package/dist/views/ActionResultDialog.d.ts +13 -0
  183. package/dist/views/ActionResultDialog.js +134 -0
  184. package/dist/views/ComponentNavView.d.ts +14 -1
  185. package/dist/views/CreateViewDialog.d.ts +1 -1
  186. package/dist/views/DashboardConfigPanel.d.ts +28 -0
  187. package/dist/views/DashboardConfigPanel.js +81 -0
  188. package/dist/views/DashboardView.d.ts +4 -3
  189. package/dist/views/DashboardView.js +38 -239
  190. package/dist/views/FlowRunner.d.ts +59 -0
  191. package/dist/views/FlowRunner.js +153 -0
  192. package/dist/views/InterfaceListPage.d.ts +49 -0
  193. package/dist/views/InterfaceListPage.js +347 -0
  194. package/dist/views/MetadataInspector.d.ts +2 -2
  195. package/dist/views/ObjectView.d.ts +1 -1
  196. package/dist/views/ObjectView.js +209 -532
  197. package/dist/views/PageView.d.ts +8 -3
  198. package/dist/views/PageView.js +45 -32
  199. package/dist/views/RecordDetailView.d.ts +1 -1
  200. package/dist/views/RecordDetailView.js +363 -148
  201. package/dist/views/RecordFormPage.d.ts +1 -1
  202. package/dist/views/RecordFormPage.js +26 -1
  203. package/dist/views/ReportConfigPanel.d.ts +37 -0
  204. package/dist/views/ReportConfigPanel.js +85 -0
  205. package/dist/views/ReportView.d.ts +1 -1
  206. package/dist/views/ReportView.js +116 -7
  207. package/dist/views/RuntimeDraftBar.d.ts +30 -0
  208. package/dist/views/RuntimeDraftBar.js +112 -0
  209. package/dist/views/SearchResultsPage.d.ts +1 -1
  210. package/dist/views/SearchResultsPage.js +8 -18
  211. package/dist/views/ViewConfigPanel.d.ts +24 -17
  212. package/dist/views/ViewConfigPanel.js +121 -77
  213. package/dist/views/index.d.ts +1 -1
  214. package/dist/views/index.js +1 -1
  215. package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
  216. package/dist/views/metadata-admin/AuditPanel.js +79 -0
  217. package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
  218. package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
  219. package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
  220. package/dist/views/metadata-admin/DirectoryPage.js +113 -24
  221. package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
  222. package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
  223. package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
  224. package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
  225. package/dist/views/metadata-admin/JsonSourceEditor.d.ts +37 -0
  226. package/dist/views/metadata-admin/JsonSourceEditor.js +178 -0
  227. package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
  228. package/dist/views/metadata-admin/LayeredDiff.js +171 -5
  229. package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
  230. package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
  231. package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
  232. package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
  233. package/dist/views/metadata-admin/PackagesPage.js +395 -0
  234. package/dist/views/metadata-admin/PageShell.d.ts +1 -1
  235. package/dist/views/metadata-admin/PageShell.js +9 -4
  236. package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
  237. package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
  238. package/dist/views/metadata-admin/QuickFind.js +6 -3
  239. package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
  240. package/dist/views/metadata-admin/RelatedPanel.js +20 -18
  241. package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
  242. package/dist/views/metadata-admin/ResourceEditPage.js +1223 -60
  243. package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
  244. package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
  245. package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
  246. package/dist/views/metadata-admin/ResourceListPage.js +266 -30
  247. package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
  248. package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
  249. package/dist/views/metadata-admin/SchemaForm.js +559 -49
  250. package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
  251. package/dist/views/metadata-admin/StudioHomePage.js +213 -0
  252. package/dist/views/metadata-admin/anchors.js +237 -24
  253. package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
  254. package/dist/views/metadata-admin/clientValidation.js +169 -0
  255. package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
  256. package/dist/views/metadata-admin/color-variant-field.js +38 -0
  257. package/dist/views/metadata-admin/createDerive.d.ts +75 -0
  258. package/dist/views/metadata-admin/createDerive.js +179 -0
  259. package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
  260. package/dist/views/metadata-admin/dashboard-schema.js +80 -0
  261. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
  262. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
  263. package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
  264. package/dist/views/metadata-admin/datasource/register.js +24 -0
  265. package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
  266. package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
  267. package/dist/views/metadata-admin/default-schemas.js +115 -10
  268. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
  269. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
  270. package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
  271. package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
  272. package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
  273. package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
  274. package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
  275. package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
  276. package/dist/views/metadata-admin/external/api.d.ts +100 -0
  277. package/dist/views/metadata-admin/external/api.js +124 -0
  278. package/dist/views/metadata-admin/i18n.d.ts +1 -0
  279. package/dist/views/metadata-admin/i18n.js +1166 -2
  280. package/dist/views/metadata-admin/index.d.ts +8 -5
  281. package/dist/views/metadata-admin/index.js +12 -2
  282. package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
  283. package/dist/views/metadata-admin/inspector-registry.js +11 -0
  284. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
  285. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
  286. package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
  287. package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
  288. package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
  289. package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
  290. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
  291. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
  292. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
  293. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
  294. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
  295. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +107 -0
  296. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
  297. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +45 -0
  298. package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
  299. package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
  300. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
  301. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
  302. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
  303. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
  304. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
  305. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +140 -0
  306. package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
  307. package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
  308. package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
  309. package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
  310. package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
  311. package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
  312. package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
  313. package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
  314. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
  315. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +54 -0
  316. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
  317. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +330 -0
  318. package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
  319. package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
  320. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
  321. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +160 -0
  322. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
  323. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
  324. package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
  325. package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
  326. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
  327. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
  328. package/dist/views/metadata-admin/inspectors/_shared.d.ts +124 -0
  329. package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
  330. package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
  331. package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
  332. package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
  333. package/dist/views/metadata-admin/inspectors/flow-node-config.js +461 -0
  334. package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
  335. package/dist/views/metadata-admin/inspectors/index.js +45 -0
  336. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
  337. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
  338. package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
  339. package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
  340. package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
  341. package/dist/views/metadata-admin/mergeServerFields.js +56 -0
  342. package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
  343. package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
  344. package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
  345. package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
  346. package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
  347. package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
  348. package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
  349. package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
  350. package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
  351. package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
  352. package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
  353. package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
  354. package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
  355. package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
  356. package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
  357. package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
  358. package/dist/views/metadata-admin/previews/DatasetPreview.js +89 -0
  359. package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
  360. package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
  361. package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
  362. package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
  363. package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
  364. package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
  365. package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
  366. package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +43 -0
  367. package/dist/views/metadata-admin/previews/FlowCanvas.js +328 -0
  368. package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
  369. package/dist/views/metadata-admin/previews/FlowPreview.js +92 -0
  370. package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
  371. package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
  372. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
  373. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +170 -0
  374. package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
  375. package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
  376. package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
  377. package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
  378. package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
  379. package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
  380. package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
  381. package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
  382. package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
  383. package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
  384. package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
  385. package/dist/views/metadata-admin/previews/PagePreview.js +90 -4
  386. package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
  387. package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
  388. package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
  389. package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
  390. package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
  391. package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
  392. package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
  393. package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
  394. package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
  395. package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
  396. package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
  397. package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
  398. package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
  399. package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
  400. package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
  401. package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
  402. package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
  403. package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
  404. package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
  405. package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
  406. package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
  407. package/dist/views/metadata-admin/previews/block-config.js +324 -0
  408. package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
  409. package/dist/views/metadata-admin/previews/block-types.js +110 -0
  410. package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
  411. package/dist/views/metadata-admin/previews/field-types.js +97 -0
  412. package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +88 -0
  413. package/dist/views/metadata-admin/previews/flow-canvas-layout.js +190 -0
  414. package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +88 -0
  415. package/dist/views/metadata-admin/previews/flow-canvas-parts.js +358 -0
  416. package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
  417. package/dist/views/metadata-admin/previews/form-preview.js +29 -0
  418. package/dist/views/metadata-admin/previews/index.js +43 -0
  419. package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
  420. package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
  421. package/dist/views/metadata-admin/previews/object-fields-io.d.ts +109 -0
  422. package/dist/views/metadata-admin/previews/object-fields-io.js +208 -0
  423. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +91 -0
  424. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
  425. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +8 -0
  426. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +113 -0
  427. package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +44 -0
  428. package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +316 -0
  429. package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
  430. package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
  431. package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
  432. package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
  433. package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
  434. package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
  435. package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
  436. package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
  437. package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
  438. package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
  439. package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
  440. package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
  441. package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
  442. package/dist/views/metadata-admin/previews/widget-types.js +40 -0
  443. package/dist/views/metadata-admin/registry.d.ts +140 -19
  444. package/dist/views/metadata-admin/report-schema.d.ts +26 -0
  445. package/dist/views/metadata-admin/report-schema.js +121 -0
  446. package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
  447. package/dist/views/metadata-admin/useMetadata.js +155 -4
  448. package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
  449. package/dist/views/metadata-admin/view-item-normalize.js +68 -0
  450. package/dist/views/metadata-admin/view-schema.d.ts +16 -0
  451. package/dist/views/metadata-admin/view-schema.js +107 -0
  452. package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
  453. package/dist/views/metadata-admin/view-variant-model.js +64 -0
  454. package/dist/views/metadata-admin/widgets.d.ts +89 -1
  455. package/dist/views/metadata-admin/widgets.js +491 -17
  456. package/dist/views/runtime-metadata-persistence.d.ts +78 -0
  457. package/dist/views/runtime-metadata-persistence.js +89 -0
  458. package/dist/views/useOpenRecordList.d.ts +18 -0
  459. package/dist/views/useOpenRecordList.js +36 -0
  460. package/dist/views/userFilterUrlState.d.ts +15 -0
  461. package/dist/views/userFilterUrlState.js +53 -0
  462. package/dist/views/view-config-adapter.d.ts +38 -0
  463. package/dist/views/view-config-adapter.js +80 -0
  464. package/package.json +52 -34
  465. package/dist/views/DesignDrawer.d.ts +0 -28
  466. package/dist/views/DesignDrawer.js +0 -51
  467. package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
  468. package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
@@ -0,0 +1,97 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
3
+ /**
4
+ * FieldsListEditor — the right-panel column manager (mainstream low-code
5
+ * pattern: a vertical, drag-reorderable list of fields with an inline
6
+ * "+ Add field" picker).
7
+ *
8
+ * This is the SINGLE owner of column read / write / reorder / remove / select
9
+ * logic for a View variant. It is rendered in two places so the fields list is
10
+ * always visible:
11
+ * • {@link ViewVariantInspector} (the home / variant panel) — no row is
12
+ * highlighted; clicking a row drills into the scoped column inspector.
13
+ * • {@link ViewColumnInspector} (the scoped column panel) — the selected row
14
+ * is highlighted and the column's detail props render below it.
15
+ *
16
+ * Columns round-trip in their original shape: string variants (e.g. kanban
17
+ * card fields) stay strings; object variants keep `{ field, label, … }`. The
18
+ * raw `columns` array is reordered / spliced directly — never normalised — so
19
+ * round-trips stay lossless.
20
+ */
21
+ import * as React from 'react';
22
+ import { Badge, Label } from '@object-ui/components';
23
+ import { appendArray, moveArray, spliceArray } from '../inspectors/_shared';
24
+ import { useObjectFields } from './useObjectFields';
25
+ import { AddFieldPopover, FieldListRow } from './ViewColumnPanes';
26
+ import { colFieldName, colLabel, makeColumn, remapIndexAfterMove, remapIndexAfterRemove, usedFieldNames, } from './view-column-io';
27
+ export function FieldsListEditor({ variantKey, schema, columns, allStrings, objectName, objectFieldsOverride, selectedIndex, readOnly, onPatch, onSelectionChange, }) {
28
+ const canEdit = !readOnly;
29
+ const { fields, loading, error } = useObjectFields(objectName || undefined, objectFieldsOverride);
30
+ const fieldTypeByName = React.useMemo(() => {
31
+ const m = new Map();
32
+ for (const f of fields)
33
+ m.set(f.name, f.type);
34
+ return m;
35
+ }, [fields]);
36
+ const [dragIndex, setDragIndex] = React.useState(null);
37
+ const [overIndex, setOverIndex] = React.useState(null);
38
+ const writeColumns = React.useCallback((next) => {
39
+ onPatch({ [variantKey]: { ...schema, columns: next } });
40
+ }, [onPatch, variantKey, schema]);
41
+ const addField = React.useCallback((field) => {
42
+ const col = makeColumn(allStrings, field.name, field.label);
43
+ const next = appendArray(columns, col);
44
+ writeColumns(next);
45
+ onSelectionChange?.({
46
+ kind: 'column',
47
+ id: `${variantKey}.columns[${next.length - 1}]`,
48
+ label: field.label,
49
+ });
50
+ }, [allStrings, columns, writeColumns, variantKey, onSelectionChange]);
51
+ const removeColumn = React.useCallback((index) => {
52
+ const next = spliceArray(columns, index, null);
53
+ writeColumns(next);
54
+ if (selectedIndex != null) {
55
+ const remapped = remapIndexAfterRemove(selectedIndex, index);
56
+ if (remapped == null)
57
+ onSelectionChange?.(null);
58
+ else
59
+ onSelectionChange?.({
60
+ kind: 'column',
61
+ id: `${variantKey}.columns[${remapped}]`,
62
+ label: colLabel(next[remapped], remapped),
63
+ });
64
+ }
65
+ }, [columns, writeColumns, selectedIndex, variantKey, onSelectionChange]);
66
+ const moveColumn = React.useCallback((from, to) => {
67
+ if (from === to)
68
+ return;
69
+ const next = moveArray(columns, from, to);
70
+ writeColumns(next);
71
+ if (selectedIndex != null) {
72
+ const remapped = remapIndexAfterMove(selectedIndex, from, to);
73
+ onSelectionChange?.({
74
+ kind: 'column',
75
+ id: `${variantKey}.columns[${remapped}]`,
76
+ label: colLabel(next[remapped], remapped),
77
+ });
78
+ }
79
+ }, [columns, writeColumns, selectedIndex, variantKey, onSelectionChange]);
80
+ const selectColumn = React.useCallback((index) => {
81
+ onSelectionChange?.({
82
+ kind: 'column',
83
+ id: `${variantKey}.columns[${index}]`,
84
+ label: colLabel(columns[index], index),
85
+ });
86
+ }, [columns, variantKey, onSelectionChange]);
87
+ const usedNames = usedFieldNames(columns);
88
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: "Columns" }), _jsx(Badge, { variant: "outline", className: "text-[10px]", children: columns.length })] }), columns.length === 0 ? (_jsx("p", { className: "rounded-md border border-dashed bg-muted/30 px-3 py-3 text-center text-[11px] text-muted-foreground", children: "No columns yet. Add a field below." })) : (_jsx("div", { className: "space-y-1", children: columns.map((c, i) => (_jsx(FieldListRow, { index: i, label: colLabel(c, i), fieldName: colFieldName(c), fieldType: fieldTypeByName.get(colFieldName(c) ?? '') ?? 'text', selected: selectedIndex === i, canEdit: canEdit, dragging: dragIndex !== null, dropBefore: overIndex === i && dragIndex !== null && dragIndex !== i, onSelect: () => selectColumn(i), onRemove: () => removeColumn(i), onDragStart: () => setDragIndex(i), onDragEnd: () => {
89
+ setDragIndex(null);
90
+ setOverIndex(null);
91
+ }, onDragOverRow: () => setOverIndex(i), onDropRow: () => {
92
+ if (dragIndex != null && dragIndex !== i)
93
+ moveColumn(dragIndex, i);
94
+ setDragIndex(null);
95
+ setOverIndex(null);
96
+ } }, i))) })), canEdit && (_jsx(AddFieldPopover, { fields: fields, usedNames: usedNames, loading: loading, error: error, onAdd: addField }))] }));
97
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * FlowCanvas — an industry-standard visual flowchart designer for flow
3
+ * automation metadata (mirrors Power Automate / Salesforce Flow Builder).
4
+ *
5
+ * Dependency-free: no reactflow/@xyflow. Nodes are absolutely-positioned
6
+ * Shadcn cards over an SVG edge layer, laid out top-to-bottom by a
7
+ * deterministic layered algorithm (`flow-canvas-layout`). Authors can:
8
+ *
9
+ * - drag to reposition nodes (committed to `node.ui = {x,y}` on drop),
10
+ * - add nodes from a palette (toolbar or a node's bottom "+" handle),
11
+ * - insert a node on an edge ("+" at the edge midpoint splits A→B),
12
+ * - delete the selected node (Delete/Backspace) with full edge cleanup,
13
+ * - pan (background drag) and zoom / fit-to-view.
14
+ *
15
+ * Selection is delegated to the existing FlowNodeInspector via
16
+ * onSelectionChange — the canvas never duplicates the inspector.
17
+ *
18
+ * The component is a pure renderer of `draft`; all mutations go through
19
+ * `onPatch(partial)` and the host merges + persists.
20
+ */
21
+ import * as React from 'react';
22
+ import { type FlowNode, type FlowEdge } from './flow-canvas-layout';
23
+ export interface FlowCanvasProps {
24
+ nodes: FlowNode[];
25
+ edges: FlowEdge[];
26
+ editable: boolean;
27
+ designMode: boolean;
28
+ selectedId: string | null;
29
+ /** Stable key (see `edgeKey`) of the currently-selected edge, or null. */
30
+ selectedEdgeId?: string | null;
31
+ locale?: string;
32
+ /** Simulation overlay: currently-executing node. */
33
+ activeNodeId?: string | null;
34
+ /** Simulation overlay: nodes already executed. */
35
+ visitedNodeIds?: string[];
36
+ /** Simulation overlay: ids of edges that were traversed. */
37
+ traversedEdgeIds?: string[];
38
+ onSelect: (node: FlowNode | null) => void;
39
+ /** Select an edge (its `edgeKey`), or clear selection with `null`. */
40
+ onSelectEdge?: (edge: FlowEdge | null, key: string) => void;
41
+ onPatch?: (partial: Record<string, unknown>) => void;
42
+ }
43
+ export declare function FlowCanvas({ nodes, edges, editable, designMode, selectedId, selectedEdgeId, locale, activeNodeId, visitedNodeIds, traversedEdgeIds, onSelect, onSelectEdge, onPatch, }: FlowCanvasProps): React.JSX.Element;
@@ -0,0 +1,328 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
3
+ /**
4
+ * FlowCanvas — an industry-standard visual flowchart designer for flow
5
+ * automation metadata (mirrors Power Automate / Salesforce Flow Builder).
6
+ *
7
+ * Dependency-free: no reactflow/@xyflow. Nodes are absolutely-positioned
8
+ * Shadcn cards over an SVG edge layer, laid out top-to-bottom by a
9
+ * deterministic layered algorithm (`flow-canvas-layout`). Authors can:
10
+ *
11
+ * - drag to reposition nodes (committed to `node.ui = {x,y}` on drop),
12
+ * - add nodes from a palette (toolbar or a node's bottom "+" handle),
13
+ * - insert a node on an edge ("+" at the edge midpoint splits A→B),
14
+ * - delete the selected node (Delete/Backspace) with full edge cleanup,
15
+ * - pan (background drag) and zoom / fit-to-view.
16
+ *
17
+ * Selection is delegated to the existing FlowNodeInspector via
18
+ * onSelectionChange — the canvas never duplicates the inspector.
19
+ *
20
+ * The component is a pure renderer of `draft`; all mutations go through
21
+ * `onPatch(partial)` and the host merges + persists.
22
+ */
23
+ import * as React from 'react';
24
+ import { Maximize2, Plus, ZoomIn, ZoomOut } from 'lucide-react';
25
+ import { cn } from '@object-ui/components';
26
+ import { uniqueId, appendArray, spliceArray } from '../inspectors/_shared';
27
+ import { t as tr } from '../i18n';
28
+ import { computeLayout, diagramSize, bottomAnchor, topAnchor, edgePath, edgeMidpoint, edgeKey, conditionText, } from './flow-canvas-layout';
29
+ import { NodeCard, NodePalette, defaultNodeLabel, defaultNodeExtras } from './flow-canvas-parts';
30
+ import { useFlowNodePalette } from './useFlowNodePalette';
31
+ const MIN_ZOOM = 0.4;
32
+ const MAX_ZOOM = 1.6;
33
+ const DRAG_THRESHOLD = 4;
34
+ export function FlowCanvas({ nodes, edges, editable, designMode, selectedId, selectedEdgeId, locale, activeNodeId, visitedNodeIds, traversedEdgeIds, onSelect, onSelectEdge, onPatch, }) {
35
+ const viewportRef = React.useRef(null);
36
+ const [zoom, setZoom] = React.useState(1);
37
+ const [pan, setPan] = React.useState({ x: 0, y: 0 });
38
+ const [paletteOpen, setPaletteOpen] = React.useState(false);
39
+ // Node types offered by the add-node palette, driven by the engine's
40
+ // published descriptors (`GET /api/v1/automation/actions`) merged with the
41
+ // hardcoded base — so the palette reflects what the backend actually supports
42
+ // (e.g. the `approval` node, third-party connector actions).
43
+ const paletteItems = useFlowNodePalette();
44
+ // Transient drag position override (commit-on-drop) so rapid pointer moves
45
+ // never spam onPatch and never diverge from the persisted draft.
46
+ const [dragPos, setDragPos] = React.useState(null);
47
+ const dragRef = React.useRef(null);
48
+ const panRef = React.useRef(null);
49
+ const layout = React.useMemo(() => computeLayout(nodes, edges), [nodes, edges]);
50
+ const size = React.useMemo(() => diagramSize(layout), [layout]);
51
+ // Simulation overlay sets (display-only; never drives engine behavior).
52
+ const visitedSet = React.useMemo(() => new Set(visitedNodeIds ?? []), [visitedNodeIds]);
53
+ const traversedSet = React.useMemo(() => new Set(traversedEdgeIds ?? []), [traversedEdgeIds]);
54
+ const simRunning = (visitedNodeIds?.length ?? 0) > 0 || !!activeNodeId;
55
+ const positionOf = React.useCallback((id) => {
56
+ if (dragPos && dragPos.id === id)
57
+ return { x: dragPos.x, y: dragPos.y };
58
+ return layout.get(id) ?? { x: 0, y: 0 };
59
+ }, [dragPos, layout]);
60
+ // ── Mutations ────────────────────────────────────────────────────────────
61
+ const persistPosition = React.useCallback((id, x, y) => {
62
+ if (!onPatch)
63
+ return;
64
+ const idx = nodes.findIndex((n) => n.id === id);
65
+ if (idx < 0)
66
+ return;
67
+ const node = nodes[idx];
68
+ const nextNode = { ...node, ui: { ...(node.ui ?? {}), x, y } };
69
+ onPatch({ nodes: spliceArray(nodes, idx, nextNode) });
70
+ }, [nodes, onPatch]);
71
+ const addNode = React.useCallback((type, opts) => {
72
+ if (!onPatch)
73
+ return;
74
+ const existing = nodes.map((n) => n.id).filter(Boolean);
75
+ const id = uniqueId('node', existing);
76
+ const label = type === 'end' ? 'End' : defaultNodeLabel(type);
77
+ // Only an explicit `at` pins a manual position. A `from`-append is left
78
+ // unpinned so the layered auto-layout slots it below its parent and
79
+ // spaces it horizontally among siblings — pinning it directly under the
80
+ // parent (the old behavior) made every sibling stack on the same spot.
81
+ const at = opts?.at;
82
+ const newNode = { id, type, label, ...defaultNodeExtras(type), ...(at ? { ui: { x: at.x, y: at.y } } : {}) };
83
+ const nextNodes = appendArray(nodes, newNode);
84
+ const patch = { nodes: nextNodes };
85
+ if (opts?.from) {
86
+ const newEdge = {
87
+ id: uniqueId('edge', edges.map((e) => e.id).filter(Boolean)),
88
+ source: opts.from,
89
+ target: id,
90
+ };
91
+ patch.edges = appendArray(edges, newEdge);
92
+ }
93
+ onPatch(patch);
94
+ onSelect(newNode);
95
+ setPaletteOpen(false);
96
+ }, [edges, nodes, onPatch, onSelect, positionOf]);
97
+ /** Split edge A→B by inserting a new node N: A→N (keeps guard) + N→B. */
98
+ const insertOnEdge = React.useCallback((edge, type = 'create_record') => {
99
+ if (!onPatch)
100
+ return;
101
+ const edgeIdx = edges.findIndex((e) => e === edge);
102
+ if (edgeIdx < 0)
103
+ return;
104
+ const existing = nodes.map((n) => n.id).filter(Boolean);
105
+ const id = uniqueId('node', existing);
106
+ const from = positionOf(edge.source);
107
+ const to = positionOf(edge.target);
108
+ const at = { x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 };
109
+ const newNode = {
110
+ id,
111
+ type,
112
+ label: defaultNodeLabel(type),
113
+ ...defaultNodeExtras(type),
114
+ ui: { x: at.x, y: at.y },
115
+ };
116
+ // A→N inherits the original edge's branch semantics; N→B is plain.
117
+ const firstSegment = { ...edge, target: id };
118
+ const secondSegment = {
119
+ id: uniqueId('edge', [...edges.map((e) => e.id).filter(Boolean), 'edge']),
120
+ source: id,
121
+ target: edge.target,
122
+ };
123
+ const nextEdges = spliceArray(edges, edgeIdx, firstSegment);
124
+ onPatch({ nodes: appendArray(nodes, newNode), edges: appendArray(nextEdges, secondSegment) });
125
+ onSelect(newNode);
126
+ }, [edges, nodes, onPatch, onSelect, positionOf]);
127
+ const deleteNode = React.useCallback((id) => {
128
+ if (!onPatch)
129
+ return;
130
+ const nextNodes = nodes.filter((n) => n.id !== id);
131
+ const nextEdges = edges.filter((e) => e.source !== id && e.target !== id);
132
+ onPatch({ nodes: nextNodes, edges: nextEdges });
133
+ onSelect(null);
134
+ }, [edges, nodes, onPatch, onSelect]);
135
+ // ── Drag (reposition) — pointer capture, commit on pointer-up ──────────────
136
+ const onNodePointerDown = React.useCallback((id) => (e) => {
137
+ if (!editable || e.button !== 0)
138
+ return;
139
+ e.stopPropagation();
140
+ const origin = positionOf(id);
141
+ dragRef.current = {
142
+ nodeId: id,
143
+ startX: e.clientX,
144
+ startY: e.clientY,
145
+ originX: origin.x,
146
+ originY: origin.y,
147
+ moved: false,
148
+ };
149
+ e.currentTarget.setPointerCapture?.(e.pointerId);
150
+ }, [editable, positionOf]);
151
+ const onNodePointerMove = React.useCallback((e) => {
152
+ const d = dragRef.current;
153
+ if (!d)
154
+ return;
155
+ const dx = (e.clientX - d.startX) / zoom;
156
+ const dy = (e.clientY - d.startY) / zoom;
157
+ if (!d.moved && Math.hypot(e.clientX - d.startX, e.clientY - d.startY) < DRAG_THRESHOLD) {
158
+ return;
159
+ }
160
+ d.moved = true;
161
+ setDragPos({ id: d.nodeId, x: Math.max(0, d.originX + dx), y: Math.max(0, d.originY + dy) });
162
+ }, [zoom]);
163
+ const onNodePointerUp = React.useCallback((e) => {
164
+ const d = dragRef.current;
165
+ dragRef.current = null;
166
+ if (!d)
167
+ return;
168
+ e.currentTarget.releasePointerCapture?.(e.pointerId);
169
+ if (d.moved && dragPos) {
170
+ persistPosition(d.nodeId, Math.round(dragPos.x), Math.round(dragPos.y));
171
+ }
172
+ setDragPos(null);
173
+ }, [dragPos, persistPosition]);
174
+ // ── Pan (background drag) ──────────────────────────────────────────────────
175
+ const onBgPointerDown = React.useCallback((e) => {
176
+ if (e.button !== 0)
177
+ return;
178
+ onSelect(null);
179
+ panRef.current = { startX: e.clientX, startY: e.clientY, originX: pan.x, originY: pan.y };
180
+ e.currentTarget.setPointerCapture?.(e.pointerId);
181
+ }, [onSelect, pan.x, pan.y]);
182
+ const onBgPointerMove = React.useCallback((e) => {
183
+ const p = panRef.current;
184
+ if (!p)
185
+ return;
186
+ setPan({ x: p.originX + (e.clientX - p.startX), y: p.originY + (e.clientY - p.startY) });
187
+ }, []);
188
+ const onBgPointerUp = React.useCallback((e) => {
189
+ if (panRef.current)
190
+ e.currentTarget.releasePointerCapture?.(e.pointerId);
191
+ panRef.current = null;
192
+ }, []);
193
+ // ── Zoom / fit ─────────────────────────────────────────────────────────────
194
+ const clampZoom = (z) => Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, z));
195
+ const fitToView = React.useCallback(() => {
196
+ const vp = viewportRef.current;
197
+ if (!vp)
198
+ return;
199
+ const pad = 32;
200
+ const zx = (vp.clientWidth - pad) / size.width;
201
+ const zy = (vp.clientHeight - pad) / size.height;
202
+ const z = clampZoom(Math.min(zx, zy, 1));
203
+ setZoom(z);
204
+ setPan({
205
+ x: (vp.clientWidth - size.width * z) / 2,
206
+ y: Math.max(16, (vp.clientHeight - size.height * z) / 2),
207
+ });
208
+ }, [size.height, size.width]);
209
+ // ── Keyboard: delete selected node ─────────────────────────────────────────
210
+ const onKeyDown = React.useCallback((e) => {
211
+ if (!editable || !selectedId)
212
+ return;
213
+ if (e.key === 'Delete' || e.key === 'Backspace') {
214
+ const target = e.target;
215
+ if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {
216
+ return;
217
+ }
218
+ e.preventDefault();
219
+ deleteNode(selectedId);
220
+ }
221
+ }, [deleteNode, editable, selectedId]);
222
+ // ── Render ─────────────────────────────────────────────────────────────────
223
+ return (_jsxs("div", { className: "relative h-full min-h-[320px] w-full overflow-hidden", children: [_jsxs("div", { className: "absolute right-2 top-2 z-30 flex items-center gap-1.5", children: [editable && (_jsxs("div", { className: "relative", children: [_jsxs("button", { type: "button", onClick: () => setPaletteOpen((v) => !v), className: "inline-flex items-center gap-1.5 rounded-lg border bg-background/90 px-2.5 py-1.5 text-xs font-medium shadow-sm backdrop-blur-sm transition-colors hover:border-primary/50 hover:bg-accent hover:text-foreground", children: [_jsx(Plus, { className: "h-3.5 w-3.5" }), tr('engine.inspector.add.node', locale)] }), paletteOpen && (_jsx(NodePalette, { locale: locale, items: paletteItems, onClose: () => setPaletteOpen(false), onPick: (type) => addNode(type, { from: selectedId ?? undefined }) }))] })), _jsxs("div", { className: "flex items-center rounded-lg border bg-background/90 shadow-sm backdrop-blur-sm", children: [_jsx("button", { type: "button", title: "Zoom out", "aria-label": "Zoom out", onClick: () => setZoom((z) => clampZoom(z - 0.15)), className: "inline-flex h-7 w-7 items-center justify-center text-muted-foreground hover:text-foreground", children: _jsx(ZoomOut, { className: "h-3.5 w-3.5" }) }), _jsxs("span", { className: "w-10 text-center text-[11px] tabular-nums text-muted-foreground", children: [Math.round(zoom * 100), "%"] }), _jsx("button", { type: "button", title: "Zoom in", "aria-label": "Zoom in", onClick: () => setZoom((z) => clampZoom(z + 0.15)), className: "inline-flex h-7 w-7 items-center justify-center text-muted-foreground hover:text-foreground", children: _jsx(ZoomIn, { className: "h-3.5 w-3.5" }) }), _jsx("button", { type: "button", title: "Fit to view", "aria-label": "Fit to view", onClick: fitToView, className: "inline-flex h-7 w-7 items-center justify-center border-l text-muted-foreground hover:text-foreground", children: _jsx(Maximize2, { className: "h-3.5 w-3.5" }) })] })] }), _jsx("div", { ref: viewportRef, tabIndex: 0, role: "application", "aria-label": "Flow canvas", onKeyDown: onKeyDown, onPointerDown: onBgPointerDown, onPointerMove: (e) => {
224
+ onBgPointerMove(e);
225
+ onNodePointerMove(e);
226
+ }, onPointerUp: (e) => {
227
+ onBgPointerUp(e);
228
+ onNodePointerUp(e);
229
+ }, className: cn('h-full w-full cursor-grab outline-none active:cursor-grabbing', 'bg-muted/15 dark:bg-background/30',
230
+ // Subtle inset vignette gives the canvas surface depth.
231
+ 'shadow-[inset_0_0_90px_rgba(0,0,0,0.05)]'), style: {
232
+ // Dot grid tied to pan + zoom so the surface tracks the diagram
233
+ // (rather than floating behind a static texture).
234
+ backgroundImage: 'radial-gradient(circle at 1px 1px, hsl(var(--border)) 1px, transparent 0)',
235
+ backgroundSize: `${18 * zoom}px ${18 * zoom}px`,
236
+ backgroundPosition: `${pan.x}px ${pan.y}px`,
237
+ }, children: _jsxs("div", { className: "relative origin-top-left", style: {
238
+ width: size.width,
239
+ height: size.height,
240
+ transform: `translate(${pan.x}px, ${pan.y}px) scale(${zoom})`,
241
+ }, children: [_jsxs("svg", { className: "pointer-events-none absolute left-0 top-0 overflow-visible", width: size.width, height: size.height, children: [_jsx("defs", { children: _jsx("marker", { id: "flow-arrow", viewBox: "0 0 10 10", refX: "8", refY: "5", markerWidth: "7", markerHeight: "7", orient: "auto-start-reverse", children: _jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", className: "fill-muted-foreground/55" }) }) }), edges.map((edge, i) => {
242
+ const sp = layout.get(edge.source);
243
+ const tp = layout.get(edge.target);
244
+ if (!sp || !tp)
245
+ return null;
246
+ const from = bottomAnchor(dragPos?.id === edge.source ? positionOf(edge.source) : sp);
247
+ const to = topAnchor(dragPos?.id === edge.target ? positionOf(edge.target) : tp);
248
+ const mid = edgeMidpoint(from, to);
249
+ const cond = conditionText(edge.condition);
250
+ const branchLabel = edge.isDefault ? 'else' : cond ? `if ${cond}` : edge.label;
251
+ const eid = edgeKey(edge, i);
252
+ const traversed = traversedSet.has(eid);
253
+ const selected = selectedEdgeId === eid;
254
+ const d = edgePath(from, to);
255
+ // Edges are selectable in design mode; the host opens the edge
256
+ // inspector. A wide transparent hit-path widens the click target
257
+ // beyond the 1.5px visible stroke without altering the visuals.
258
+ const selectable = designMode && !!onSelectEdge;
259
+ return (_jsxs("g", { children: [_jsx("path", { d: d, strokeLinecap: "round", className: cn('fill-none transition-[stroke] duration-150', traversed
260
+ ? 'stroke-sky-500'
261
+ : selected
262
+ ? 'stroke-primary'
263
+ : simRunning
264
+ ? 'stroke-muted-foreground/20'
265
+ : 'stroke-muted-foreground/40'), strokeWidth: traversed || selected ? 2.5 : 1.75, markerEnd: "url(#flow-arrow)" }), selectable && (_jsx("path", { d: d, className: "pointer-events-auto cursor-pointer fill-none stroke-transparent", strokeWidth: 14, onPointerDown: (e) => e.stopPropagation(), onClick: (e) => {
266
+ e.stopPropagation();
267
+ onSelectEdge(edge, eid);
268
+ }, children: _jsx("title", { children: `${edge.source} → ${edge.target}` }) })), branchLabel && (_jsx("foreignObject", { x: mid.x - 60, y: mid.y - 11, width: 120, height: 22, className: cn(selectable && 'pointer-events-auto'), children: _jsx("div", { className: "flex justify-center", children: _jsx("span", { onPointerDown: selectable ? (e) => e.stopPropagation() : undefined, onClick: selectable ? (e) => { e.stopPropagation(); onSelectEdge(edge, eid); } : undefined, className: cn('max-w-full truncate rounded-full border bg-background/95 px-2 py-0.5 text-[10px] font-medium shadow-sm backdrop-blur-sm transition-colors', selectable && 'cursor-pointer hover:border-primary/60', selected ? 'border-primary text-primary' : 'border-border text-muted-foreground'), children: branchLabel }) }) })), editable && (_jsx("foreignObject", {
269
+ // Sit the insert handle at the edge midpoint, but slide it
270
+ // to the right of the branch-label pill when one is present
271
+ // so the two don't stack on the same spot.
272
+ x: branchLabel ? mid.x + 66 : mid.x - 11, y: mid.y - 11, width: 22, height: 22, className: "pointer-events-auto", children: _jsx("button", { type: "button", title: "Insert node here", "aria-label": "Insert node here", onPointerDown: (e) => e.stopPropagation(), onClick: (e) => {
273
+ e.stopPropagation();
274
+ insertOnEdge(edge);
275
+ }, className: "inline-flex h-[22px] w-[22px] items-center justify-center rounded-full border bg-background/90 text-muted-foreground opacity-50 shadow-sm backdrop-blur-sm transition-all hover:scale-110 hover:border-primary hover:bg-background hover:text-primary hover:opacity-100 focus-visible:opacity-100", children: _jsx(Plus, { className: "h-3 w-3" }) }) }))] }, edge.id || `${edge.source}-${edge.target}-${i}`));
276
+ })] }), nodes.map((node) => {
277
+ const runState = activeNodeId === node.id ? 'active' : visitedSet.has(node.id) ? 'visited' : undefined;
278
+ return (_jsx(NodeCard, { id: node.id, type: node.type, label: node.label || node.id, summary: nodeSummary(node), position: positionOf(node.id), selected: selectedId === node.id, editable: editable, runState: runState, dimmed: simRunning && !runState, onPointerDown: onNodePointerDown(node.id), onSelect: () => designMode && onSelect(node), onAppend: () => addNode('create_record', { from: node.id }) }, node.id));
279
+ })] }) })] }));
280
+ }
281
+ /** One-line config summary shown on the node card (best-effort, type-aware). */
282
+ function nodeSummary(node) {
283
+ const c = node.config;
284
+ const str = (v) => (typeof v === 'string' && v ? v : undefined);
285
+ const block = (key, inner) => {
286
+ const b = node[key];
287
+ return b && typeof b === 'object' ? str(b[inner]) : undefined;
288
+ };
289
+ const pick = (k) => (c ? str(c[k]) : undefined);
290
+ if (node.type === 'start') {
291
+ return pick('condition') || pick('criteria') || pick('objectName') || pick('cron') || pick('schedule') || pick('triggerType');
292
+ }
293
+ if (node.type === 'decision') {
294
+ const conds = c?.conditions;
295
+ if (Array.isArray(conds) && conds.length) {
296
+ const labels = conds
297
+ .map((x) => (x && typeof x === 'object' ? str(x.label) : undefined))
298
+ .filter(Boolean);
299
+ return labels.length ? labels.join(' / ') : `${conds.length} branches`;
300
+ }
301
+ return pick('condition');
302
+ }
303
+ if (node.type === 'script') {
304
+ return pick('actionType') || pick('template') || (c && c.script ? 'code' : undefined);
305
+ }
306
+ if (node.type === 'approval') {
307
+ const approvers = c?.approvers;
308
+ const n = Array.isArray(approvers) ? approvers.length : 0;
309
+ const behavior = pick('behavior');
310
+ if (n > 0)
311
+ return `${n} approver${n === 1 ? '' : 's'}${behavior === 'unanimous' ? ' · all' : ''}`;
312
+ return behavior || undefined;
313
+ }
314
+ return (pick('objectName') ||
315
+ block('connectorConfig', 'actionId') ||
316
+ block('waitEventConfig', 'timerDuration') ||
317
+ block('waitEventConfig', 'eventType') ||
318
+ block('boundaryConfig', 'eventType') ||
319
+ pick('condition') ||
320
+ pick('flowName') ||
321
+ pick('url') ||
322
+ pick('collection') ||
323
+ pick('action') ||
324
+ pick('flow') ||
325
+ pick('event') ||
326
+ pick('duration') ||
327
+ undefined);
328
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * FlowPreview — read-only summary of a Flow metadata draft.
3
+ *
4
+ * A full DAG canvas lives in `@object-ui/plugin-designer` and would
5
+ * pull in ReactFlow + its deps every time the metadata-admin loads,
6
+ * which is too heavy for a glance-preview. Instead we render:
7
+ *
8
+ * 1. A header strip with type / status / runAs / version.
9
+ * 2. A topologically ordered step list inferred from `nodes` +
10
+ * `edges`. Each step shows label, action type, branch markers,
11
+ * and outgoing edge conditions so authors can sanity-check the
12
+ * logic without launching the designer.
13
+ * 3. A variables side panel listing declared flow variables.
14
+ *
15
+ * The renderer is defensive — drafts may be mid-edit with dangling
16
+ * edges or duplicate node ids; we never throw, we just degrade.
17
+ */
18
+ import * as React from 'react';
19
+ import type { MetadataPreviewProps } from '../preview-registry';
20
+ export declare function FlowPreview({ draft, editing, selection, onSelectionChange, onPatch, locale }: MetadataPreviewProps): React.JSX.Element;
@@ -0,0 +1,92 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
3
+ /**
4
+ * FlowPreview — read-only summary of a Flow metadata draft.
5
+ *
6
+ * A full DAG canvas lives in `@object-ui/plugin-designer` and would
7
+ * pull in ReactFlow + its deps every time the metadata-admin loads,
8
+ * which is too heavy for a glance-preview. Instead we render:
9
+ *
10
+ * 1. A header strip with type / status / runAs / version.
11
+ * 2. A topologically ordered step list inferred from `nodes` +
12
+ * `edges`. Each step shows label, action type, branch markers,
13
+ * and outgoing edge conditions so authors can sanity-check the
14
+ * logic without launching the designer.
15
+ * 3. A variables side panel listing declared flow variables.
16
+ *
17
+ * The renderer is defensive — drafts may be mid-edit with dangling
18
+ * edges or duplicate node ids; we never throw, we just degrade.
19
+ */
20
+ import * as React from 'react';
21
+ import { Bug, CircleDot, GitBranch, History, PanelRight, Plus, Settings2, Variable, Zap, } from 'lucide-react';
22
+ import { PreviewShell, PreviewMessage, PreviewErrorBoundary } from './PreviewShell';
23
+ import { uniqueId, appendArray } from '../inspectors/_shared';
24
+ import { t as tr } from '../i18n';
25
+ import { FlowCanvas } from './FlowCanvas';
26
+ import { FlowSimulatorPanel } from './FlowSimulatorPanel';
27
+ import { FlowRunsPanel } from './FlowRunsPanel';
28
+ export function FlowPreview({ draft, editing, selection, onSelectionChange, onPatch, locale }) {
29
+ const d = draft;
30
+ const nodes = Array.isArray(d.nodes) ? d.nodes : [];
31
+ const edges = Array.isArray(d.edges) ? d.edges : [];
32
+ const variables = Array.isArray(d.variables) ? d.variables : [];
33
+ const designMode = !!(editing && onSelectionChange);
34
+ const canEdit = designMode && !!onPatch;
35
+ const selectedId = selection && selection.kind === 'node' ? selection.id : null;
36
+ const selectedEdgeId = selection && selection.kind === 'edge' ? selection.id : null;
37
+ const [showDebug, setShowDebug] = React.useState(false);
38
+ const [showVars, setShowVars] = React.useState(true);
39
+ const [showRuns, setShowRuns] = React.useState(false);
40
+ const [runHL, setRunHL] = React.useState(null);
41
+ const handleAddNode = React.useCallback(() => {
42
+ if (!canEdit)
43
+ return;
44
+ const existingIds = nodes.map((n) => n.id).filter(Boolean);
45
+ // A flow's first node is its trigger — seed a `start` node (not a generic
46
+ // `task`) so the canvas opens on the canonical entry point and the author
47
+ // adds subsequent steps from there.
48
+ const newNode = { id: uniqueId('node', existingIds), type: 'start', label: 'Start' };
49
+ const next = appendArray(nodes, newNode);
50
+ onPatch({ nodes: next });
51
+ onSelectionChange?.({ kind: 'node', id: newNode.id, label: newNode.label || newNode.id });
52
+ }, [canEdit, nodes, onPatch, onSelectionChange]);
53
+ // Run history needs the published flow name (the engine keys runs by it).
54
+ const flowName = typeof d.name === 'string' && d.name ? d.name : '';
55
+ const flowType = String(d.type ?? 'autolaunched');
56
+ const status = String(d.status ?? (d.active ? 'active' : 'draft'));
57
+ const runAs = String(d.runAs ?? 'user');
58
+ const version = d.version != null ? String(d.version) : undefined;
59
+ const errorStrategy = d.errorHandling?.strategy;
60
+ if (nodes.length === 0) {
61
+ return (_jsx(PreviewShell, { hint: `flow${designMode ? ' · design' : ''}`, children: canEdit ? (_jsx("div", { className: "p-3", children: _jsxs("button", { type: "button", className: "inline-flex items-center gap-1 rounded border border-dashed px-3 py-2 text-xs text-muted-foreground hover:bg-muted/30 hover:text-foreground", onClick: handleAddNode, children: [_jsx(Plus, { className: "h-3 w-3" }), tr('engine.inspector.add.node', locale)] }) })) : (_jsx(PreviewMessage, { children: "Add nodes in the Form tab to see the flow preview." })) }));
62
+ }
63
+ return (_jsx(PreviewShell, { hint: `flow · ${nodes.length} node${nodes.length === 1 ? '' : 's'}`, children: _jsx(PreviewErrorBoundary, { fallbackHint: "One of the flow nodes or edges is malformed.", children: _jsxs("div", { className: 'grid gap-0 h-full min-h-[440px] ' +
64
+ (showDebug || showVars || showRuns ? 'lg:grid-cols-[1fr_240px]' : 'grid-cols-1'), children: [_jsxs("div", { className: "flex flex-col min-w-0 min-h-0", children: [_jsxs("div", { className: "rounded-none border-b bg-muted/30 px-3 py-2 text-xs flex flex-wrap items-center gap-x-4 gap-y-1", children: [_jsx(Pill, { icon: Zap, label: "Trigger", value: flowType }), _jsx(Pill, { icon: CircleDot, label: "Status", value: status, tone: status === 'active' ? 'green' : status === 'draft' ? 'gray' : 'amber' }), _jsx(Pill, { icon: Settings2, label: "Run as", value: runAs }), version && _jsx(Pill, { label: "v", value: version }), errorStrategy && _jsx(Pill, { icon: GitBranch, label: "On error", value: errorStrategy }), _jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [!showDebug && !showRuns && (_jsxs("button", { type: "button", onClick: () => setShowVars((v) => !v), className: 'inline-flex items-center gap-1 rounded border px-2 py-0.5 text-[11px] font-medium transition-colors ' +
65
+ (showVars
66
+ ? 'border-violet-500 bg-violet-50 text-violet-700'
67
+ : 'border-border text-muted-foreground hover:bg-muted/50 hover:text-foreground'), title: showVars ? 'Hide variables panel' : 'Show variables panel', children: [_jsx(PanelRight, { className: "h-3 w-3" }), " Variables"] })), flowName && (_jsxs("button", { type: "button", onClick: () => {
68
+ setShowRuns((v) => !v);
69
+ setShowDebug(false);
70
+ }, className: 'inline-flex items-center gap-1 rounded border px-2 py-0.5 text-[11px] font-medium transition-colors ' +
71
+ (showRuns
72
+ ? 'border-emerald-500 bg-emerald-50 text-emerald-700'
73
+ : 'border-border text-muted-foreground hover:bg-muted/50 hover:text-foreground'), title: "Run history from the automation engine", children: [_jsx(History, { className: "h-3 w-3" }), " Runs"] })), _jsxs("button", { type: "button", onClick: () => {
74
+ setShowDebug((v) => !v);
75
+ setShowRuns(false);
76
+ }, className: 'inline-flex items-center gap-1 rounded border px-2 py-0.5 text-[11px] font-medium transition-colors ' +
77
+ (showDebug
78
+ ? 'border-sky-500 bg-sky-50 text-sky-700'
79
+ : 'border-border text-muted-foreground hover:bg-muted/50 hover:text-foreground'), children: [_jsx(Bug, { className: "h-3 w-3" }), " Debug"] })] })] }), _jsx("div", { className: "flex-1 min-h-0", children: _jsx(FlowCanvas, { nodes: nodes, edges: edges, editable: canEdit, designMode: designMode, selectedId: selectedId, selectedEdgeId: selectedEdgeId, locale: locale, activeNodeId: runHL?.activeNodeId ?? null, visitedNodeIds: runHL?.visitedNodeIds, traversedEdgeIds: runHL?.traversedEdgeIds, onSelect: (n) => n
80
+ ? onSelectionChange?.({ kind: 'node', id: n.id, label: n.label || n.id })
81
+ : onSelectionChange?.(null), onSelectEdge: (e, key) => e
82
+ ? onSelectionChange?.({ kind: 'edge', id: key, label: `${e.source} → ${e.target}` })
83
+ : onSelectionChange?.(null), onPatch: onPatch }) })] }), showDebug ? (_jsx("div", { className: "border-l bg-muted/20", children: _jsx(FlowSimulatorPanel, { nodes: nodes, edges: edges, variables: variables, onRunStateChange: setRunHL }) })) : showRuns && flowName ? (_jsx("div", { className: "border-l bg-muted/20", children: _jsx(FlowRunsPanel, { flowName: flowName }) })) : showVars ? (_jsxs("div", { className: "border-l bg-muted/20 p-3 text-xs space-y-2", children: [_jsxs("div", { className: "flex items-center gap-1.5 font-medium text-muted-foreground", children: [_jsx(Variable, { className: "h-3 w-3" }), " Variables"] }), variables.length === 0 ? (_jsx("div", { className: "text-muted-foreground italic", children: "No variables declared." })) : (_jsx("ul", { className: "space-y-1.5", children: variables.map((v, i) => (_jsxs("li", { className: "rounded border bg-background p-1.5", children: [_jsxs("div", { className: "flex items-baseline gap-1 flex-wrap", children: [_jsx("span", { className: "font-mono", children: v.name }), v.type && (_jsx("span", { className: "text-[10px] uppercase text-muted-foreground", children: v.type })), v.isInput && (_jsx("span", { className: "text-[9px] font-semibold uppercase px-1 rounded bg-sky-100 text-sky-700", children: "in" })), v.isOutput && (_jsx("span", { className: "text-[9px] font-semibold uppercase px-1 rounded bg-emerald-100 text-emerald-700", children: "out" }))] }), v.defaultValue !== undefined && (_jsxs("div", { className: "text-[10px] text-muted-foreground font-mono truncate", children: ["= ", String(v.defaultValue)] }))] }, v.name || i))) }))] })) : null] }) }) }));
84
+ }
85
+ function Pill({ icon: Icon, label, value, tone = 'gray', }) {
86
+ const cls = tone === 'green'
87
+ ? 'text-emerald-700'
88
+ : tone === 'amber'
89
+ ? 'text-amber-700'
90
+ : 'text-foreground';
91
+ return (_jsxs("span", { className: "inline-flex items-center gap-1", children: [Icon && _jsx(Icon, { className: "h-3 w-3 text-muted-foreground" }), _jsxs("span", { className: "text-muted-foreground", children: [label, ":"] }), _jsx("span", { className: `font-medium ${cls}`, children: value })] }));
92
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * FlowRunsPanel — run history for a flow, fetched from the automation engine
3
+ * (`GET /api/v1/automation/{name}/runs`, the observability surface next to
4
+ * resume/screen). Renders each run's status / start time / duration with an
5
+ * expandable per-node step log (the `ExecutionLog.steps` ADR-0019/#1479 shape),
6
+ * so authors can see where a run paused or failed without leaving the Studio.
7
+ *
8
+ * Degrades like the palette fetch: offline / plugin-absent / older backend →
9
+ * a quiet "history unavailable" note, never an error state that blocks the
10
+ * designer.
11
+ */
12
+ import * as React from 'react';
13
+ /** Step entry of a run log (spec `ExecutionStepLogSchema`, fields we render). */
14
+ interface RunStep {
15
+ nodeId: string;
16
+ nodeType?: string;
17
+ status: 'success' | 'failure' | 'skipped' | string;
18
+ durationMs?: number;
19
+ error?: {
20
+ code?: string;
21
+ message?: string;
22
+ };
23
+ }
24
+ /** Run log entry (spec `ExecutionLogSchema`, fields we render). */
25
+ export interface FlowRun {
26
+ id: string;
27
+ status: 'completed' | 'failed' | 'paused' | 'running' | 'cancelled' | string;
28
+ startedAt?: string;
29
+ completedAt?: string;
30
+ durationMs?: number;
31
+ trigger?: {
32
+ type?: string;
33
+ userId?: string;
34
+ object?: string;
35
+ };
36
+ steps?: RunStep[];
37
+ error?: {
38
+ message?: string;
39
+ };
40
+ }
41
+ /** Fetch a flow's run history. Exposed for tests. */
42
+ export declare function fetchFlowRuns(flowName: string, signal?: AbortSignal): Promise<FlowRun[] | null>;
43
+ export declare function FlowRunsPanel({ flowName }: {
44
+ flowName: string;
45
+ }): React.JSX.Element;
46
+ export {};