@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,113 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ /**
3
+ * Preflight graph validation + CEL helpers for the flow simulator.
4
+ *
5
+ * Validation runs BEFORE a simulation so the debugger refuses to "Run" a
6
+ * structurally broken flow (which the real runtime would reject) instead of
7
+ * producing misleading partial output. Condition evaluation deliberately does
8
+ * NOT swallow errors the way the shared `evaluatePlainCondition` does — a
9
+ * debugger must tell the author *why* a branch was false (parse error, missing
10
+ * variable, type error), so we capture and surface the message.
11
+ */
12
+ import { ExpressionEvaluator } from '@object-ui/core';
13
+ const edgeCondString = (c) => typeof c === 'string' ? c : undefined;
14
+ /** Evaluate a CEL condition, capturing (not swallowing) any failure. */
15
+ export function evalCondition(expr, variables) {
16
+ const source = expr.trim();
17
+ if (!source)
18
+ return { result: false, error: 'Empty condition.' };
19
+ try {
20
+ const evaluator = new ExpressionEvaluator({ ...variables, data: variables });
21
+ const isTemplate = /\$\{/.test(source);
22
+ const raw = isTemplate
23
+ ? evaluator.evaluate(source, { throwOnError: true })
24
+ : evaluator.evaluateExpression(source);
25
+ return { result: raw === true };
26
+ }
27
+ catch (err) {
28
+ return { result: false, error: err.message || 'Evaluation failed.' };
29
+ }
30
+ }
31
+ /** Static structural checks; `errors` block Run, `warnings` are advisory. */
32
+ export function validateFlowDraft(nodes, edges) {
33
+ const errors = [];
34
+ const warnings = [];
35
+ const ids = nodes.map((n) => n.id);
36
+ const idSet = new Set();
37
+ for (const id of ids) {
38
+ if (!id) {
39
+ errors.push({ level: 'error', message: 'A node is missing an id.' });
40
+ continue;
41
+ }
42
+ if (idSet.has(id))
43
+ errors.push({ level: 'error', nodeId: id, message: `Duplicate node id "${id}".` });
44
+ idSet.add(id);
45
+ }
46
+ for (const e of edges) {
47
+ if (!idSet.has(e.source))
48
+ errors.push({ level: 'error', message: `Edge source "${e.source}" does not exist.` });
49
+ if (!idSet.has(e.target))
50
+ errors.push({ level: 'error', message: `Edge target "${e.target}" does not exist.` });
51
+ }
52
+ // Entry resolution: prefer an explicit `start` node, else a node with no
53
+ // incoming edge. Zero or many → the author must fix it before running.
54
+ const incoming = new Set(edges.map((e) => e.target));
55
+ const startNodes = nodes.filter((n) => n.type === 'start');
56
+ const roots = nodes.filter((n) => !incoming.has(n.id));
57
+ let startNodeId;
58
+ if (startNodes.length === 1) {
59
+ startNodeId = startNodes[0].id;
60
+ if (incoming.has(startNodeId)) {
61
+ warnings.push({ level: 'warning', nodeId: startNodeId, message: 'Start node has an incoming edge.' });
62
+ }
63
+ }
64
+ else if (startNodes.length > 1) {
65
+ errors.push({ level: 'error', message: `Flow has ${startNodes.length} start nodes; expected one.` });
66
+ }
67
+ else if (roots.length === 1) {
68
+ startNodeId = roots[0].id;
69
+ warnings.push({ level: 'warning', nodeId: startNodeId, message: 'No "start" node; using the only root node as the entry.' });
70
+ }
71
+ else if (roots.length === 0) {
72
+ errors.push({ level: 'error', message: 'No entry node (every node has an incoming edge — the graph is fully cyclic).' });
73
+ }
74
+ else {
75
+ errors.push({ level: 'error', message: `Cannot determine a single entry node (${roots.length} candidates). Add a "start" node.` });
76
+ }
77
+ // Per-decision: at most one default; warn on missing default (possible dead end).
78
+ for (const n of nodes) {
79
+ if (n.type !== 'decision')
80
+ continue;
81
+ const out = edges.filter((e) => e.source === n.id);
82
+ const defaults = out.filter((e) => e.isDefault);
83
+ if (defaults.length > 1) {
84
+ errors.push({ level: 'error', nodeId: n.id, message: `Decision "${n.id}" has ${defaults.length} default branches.` });
85
+ }
86
+ if (out.length === 0) {
87
+ warnings.push({ level: 'warning', nodeId: n.id, message: `Decision "${n.id}" has no outgoing branches.` });
88
+ }
89
+ else if (defaults.length === 0 && out.every((e) => edgeCondString(e.condition))) {
90
+ warnings.push({ level: 'warning', nodeId: n.id, message: `Decision "${n.id}" has no default branch; it may dead-end when no condition matches.` });
91
+ }
92
+ }
93
+ // Unreachable nodes (advisory) — BFS from the resolved entry.
94
+ if (startNodeId) {
95
+ const reachable = new Set([startNodeId]);
96
+ const queue = [startNodeId];
97
+ while (queue.length) {
98
+ const cur = queue.shift();
99
+ for (const e of edges) {
100
+ if (e.source === cur && idSet.has(e.target) && !reachable.has(e.target)) {
101
+ reachable.add(e.target);
102
+ queue.push(e.target);
103
+ }
104
+ }
105
+ }
106
+ for (const n of nodes) {
107
+ if (!reachable.has(n.id)) {
108
+ warnings.push({ level: 'warning', nodeId: n.id, message: `Node "${n.id}" is unreachable from the entry.` });
109
+ }
110
+ }
111
+ }
112
+ return { errors, warnings, startNodeId };
113
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * FlowSimulator — a deterministic, backend-free interpreter that walks a flow
3
+ * draft for designer-time debugging. See `flow-sim-types.ts` for the contract.
4
+ *
5
+ * Supported faithfully: start, decision (edge-first CEL routing), the CRUD /
6
+ * get / http / connector / script(notification|code) side-effects (MOCKED), and
7
+ * end. `wait` and `screen` PAUSE for manual continuation. `loop` resolves its
8
+ * collection and exposes the iterator but is a labelled single pass (the edge
9
+ * model has no separate body/exit edge). `parallel_gateway` fans out WITHOUT
10
+ * join synchronization; the ADR-0031 structured containers (`parallel`,
11
+ * `try_catch` — nested body regions), `join_gateway`, `subflow` and
12
+ * `boundary_event` are marked unsupported rather than faked. A hard step
13
+ * ceiling guards cycles.
14
+ */
15
+ import type { MockResults, SimEdge, SimNode, SimState, SimStep } from './flow-sim-types';
16
+ export declare class FlowSimulator {
17
+ private nodes;
18
+ private edges;
19
+ private mocks;
20
+ private seq;
21
+ state: SimState;
22
+ constructor(nodes: SimNode[], edges: SimEdge[]);
23
+ /** Validate + seed variables and queue the entry node. Returns the validation. */
24
+ reset(seedVariables?: Record<string, unknown>, mocks?: MockResults): import("./flow-sim-types").FlowValidation;
25
+ get done(): boolean;
26
+ /** Execute one queued node. Returns the recorded step, or null when idle. */
27
+ step(): SimStep | null;
28
+ /** Run to completion (or until a pause / error). */
29
+ runToEnd(): SimState;
30
+ /** Continue a flow paused on a `wait` / `screen` node. */
31
+ resume(screenOutputs?: Record<string, unknown>): void;
32
+ private execute;
33
+ private executeDecision;
34
+ private executeLoop;
35
+ /** Resolve a `{var}` template ref or a plain variable name from `variables`. */
36
+ private resolveRef;
37
+ /** Apply a node's mock output to the simulation variables; returns what it wrote. */
38
+ private applyMock;
39
+ private mockNote;
40
+ /** Enqueue every outgoing target (linear nodes have one; parallel fans out). */
41
+ private enqueueSuccessors;
42
+ private traverse;
43
+ private record;
44
+ }
@@ -0,0 +1,316 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ import { evalCondition, validateFlowDraft } from './flow-sim-validate';
3
+ const MAX_STEPS = 500;
4
+ const PASS_THROUGH = new Set(['start', 'assignment']);
5
+ const MOCKED_SIDE_EFFECT = new Set([
6
+ 'create_record',
7
+ 'update_record',
8
+ 'delete_record',
9
+ 'get_record',
10
+ 'http_request',
11
+ 'connector_action',
12
+ ]);
13
+ // `parallel` / `try_catch` carry nested body regions (ADR-0031) the flat
14
+ // stepper can't walk — pass through honestly instead of faking their semantics.
15
+ const UNSUPPORTED = new Set(['join_gateway', 'subflow', 'boundary_event', 'parallel', 'try_catch']);
16
+ const edgeId = (e, i) => e.id || `${e.source}->${e.target}#${i}`;
17
+ const condStr = (c) => (typeof c === 'string' ? c : undefined);
18
+ const str = (v) => (typeof v === 'string' && v ? v : undefined);
19
+ export class FlowSimulator {
20
+ constructor(nodes, edges) {
21
+ Object.defineProperty(this, "nodes", {
22
+ enumerable: true,
23
+ configurable: true,
24
+ writable: true,
25
+ value: new Map()
26
+ });
27
+ Object.defineProperty(this, "edges", {
28
+ enumerable: true,
29
+ configurable: true,
30
+ writable: true,
31
+ value: []
32
+ });
33
+ Object.defineProperty(this, "mocks", {
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true,
37
+ value: {}
38
+ });
39
+ Object.defineProperty(this, "seq", {
40
+ enumerable: true,
41
+ configurable: true,
42
+ writable: true,
43
+ value: 0
44
+ });
45
+ Object.defineProperty(this, "state", {
46
+ enumerable: true,
47
+ configurable: true,
48
+ writable: true,
49
+ value: {
50
+ status: 'idle',
51
+ variables: {},
52
+ steps: [],
53
+ frontier: [],
54
+ activeNodeId: null,
55
+ visitedNodeIds: [],
56
+ traversedEdgeIds: [],
57
+ }
58
+ });
59
+ for (const n of nodes)
60
+ this.nodes.set(n.id, n);
61
+ this.edges = edges;
62
+ }
63
+ /** Validate + seed variables and queue the entry node. Returns the validation. */
64
+ reset(seedVariables = {}, mocks = {}) {
65
+ const validation = validateFlowDraft([...this.nodes.values()], this.edges);
66
+ this.mocks = mocks;
67
+ this.seq = 0;
68
+ this.state = {
69
+ status: validation.errors.length ? 'error' : 'idle',
70
+ variables: { ...seedVariables },
71
+ steps: [],
72
+ frontier: validation.startNodeId ? [validation.startNodeId] : [],
73
+ activeNodeId: null,
74
+ visitedNodeIds: [],
75
+ traversedEdgeIds: [],
76
+ error: validation.errors.length ? validation.errors[0].message : undefined,
77
+ };
78
+ return validation;
79
+ }
80
+ get done() {
81
+ return this.state.status === 'done' || this.state.status === 'error';
82
+ }
83
+ /** Execute one queued node. Returns the recorded step, or null when idle. */
84
+ step() {
85
+ const s = this.state;
86
+ if (s.status === 'error' || s.status === 'done' || s.status === 'paused')
87
+ return null;
88
+ if (this.seq >= MAX_STEPS) {
89
+ s.status = 'error';
90
+ s.error = `Step limit (${MAX_STEPS}) exceeded — the flow may contain an infinite loop.`;
91
+ return null;
92
+ }
93
+ const nodeId = s.frontier.shift();
94
+ if (!nodeId) {
95
+ s.status = 'done';
96
+ s.activeNodeId = null;
97
+ return null;
98
+ }
99
+ const node = this.nodes.get(nodeId);
100
+ if (!node) {
101
+ return this.record(nodeId, 'unknown', nodeId, 'error', { error: `Node "${nodeId}" not found.` });
102
+ }
103
+ s.status = 'running';
104
+ s.activeNodeId = nodeId;
105
+ if (!s.visitedNodeIds.includes(nodeId))
106
+ s.visitedNodeIds.push(nodeId);
107
+ const step = this.execute(node);
108
+ // Settle the run status. A pause halts the queue until resume(); a decision
109
+ // dead-end / missing node already set 'error' inside execute(). Only a still
110
+ // -'running' branch that drained the frontier completes as 'done'.
111
+ if (s.status === 'running' && s.frontier.length === 0) {
112
+ s.status = 'done';
113
+ s.activeNodeId = null;
114
+ }
115
+ return step;
116
+ }
117
+ /** Run to completion (or until a pause / error). */
118
+ runToEnd() {
119
+ let guard = 0;
120
+ while (this.state.status !== 'done' && this.state.status !== 'error' && this.state.status !== 'paused') {
121
+ if (++guard > MAX_STEPS + 5)
122
+ break;
123
+ this.step();
124
+ }
125
+ return this.state;
126
+ }
127
+ /** Continue a flow paused on a `wait` / `screen` node. */
128
+ resume(screenOutputs) {
129
+ const s = this.state;
130
+ if (s.status !== 'paused' || !s.activeNodeId)
131
+ return;
132
+ const node = this.nodes.get(s.activeNodeId);
133
+ if (screenOutputs && node?.type === 'screen') {
134
+ Object.assign(s.variables, screenOutputs);
135
+ }
136
+ s.pausedReason = undefined;
137
+ s.status = 'running';
138
+ if (node)
139
+ this.enqueueSuccessors(node);
140
+ if (s.frontier.length === 0) {
141
+ s.status = 'done';
142
+ s.activeNodeId = null;
143
+ }
144
+ }
145
+ // ---- node execution -----------------------------------------------------
146
+ execute(node) {
147
+ const type = node.type;
148
+ if (type === 'end') {
149
+ // Terminate this branch only; other queued branches still run.
150
+ return this.record(node.id, type, node.label, 'ok', { note: 'Flow end reached.' });
151
+ }
152
+ if (type === 'decision')
153
+ return this.executeDecision(node);
154
+ if (UNSUPPORTED.has(type)) {
155
+ this.enqueueSuccessors(node);
156
+ return this.record(node.id, type, node.label, 'skipped', {
157
+ note: `"${type}" is not modelled by the simulator; passing through without its real semantics.`,
158
+ });
159
+ }
160
+ if (type === 'parallel_gateway') {
161
+ this.enqueueSuccessors(node);
162
+ return this.record(node.id, type, node.label, 'ok', {
163
+ note: 'Parallel split — branches fan out (no join synchronization is simulated).',
164
+ });
165
+ }
166
+ if (type === 'wait') {
167
+ this.state.status = 'paused';
168
+ this.state.pausedReason = 'wait';
169
+ return this.record(node.id, type, node.label, 'paused', { note: 'Wait reached — continue manually.' });
170
+ }
171
+ if (type === 'screen') {
172
+ this.state.status = 'paused';
173
+ this.state.pausedReason = 'screen';
174
+ return this.record(node.id, type, node.label, 'paused', { note: 'Screen reached — provide inputs, then continue.' });
175
+ }
176
+ if (type === 'loop') {
177
+ const step = this.executeLoop(node);
178
+ this.enqueueSuccessors(node);
179
+ return step;
180
+ }
181
+ if (MOCKED_SIDE_EFFECT.has(type) || type === 'script') {
182
+ const wrote = this.applyMock(node);
183
+ this.enqueueSuccessors(node);
184
+ return this.record(node.id, type, node.label, 'mocked', {
185
+ wrote,
186
+ note: this.mockNote(node),
187
+ });
188
+ }
189
+ // start / assignment / anything else: pass straight through.
190
+ this.enqueueSuccessors(node);
191
+ return this.record(node.id, type, node.label, 'ok', {
192
+ note: PASS_THROUGH.has(type) ? undefined : `Type "${type}" treated as pass-through.`,
193
+ });
194
+ }
195
+ executeDecision(node) {
196
+ const out = this.edges
197
+ .map((e, i) => ({ e, i }))
198
+ .filter((x) => x.e.source === node.id);
199
+ const evals = [];
200
+ let chosen;
201
+ let firstError;
202
+ // Evaluate conditional edges in declared order; first truthy wins.
203
+ for (const { e, i } of out) {
204
+ if (e.isDefault)
205
+ continue;
206
+ const cond = condStr(e.condition);
207
+ if (!cond) {
208
+ evals.push({ edgeId: edgeId(e, i), target: e.target, result: false, selected: false, error: 'Branch has no condition.' });
209
+ continue;
210
+ }
211
+ const r = evalCondition(cond, this.state.variables);
212
+ if (r.error && !firstError)
213
+ firstError = `${cond}: ${r.error}`;
214
+ const selected = r.result && !chosen;
215
+ if (selected)
216
+ chosen = { e, i };
217
+ evals.push({ edgeId: edgeId(e, i), target: e.target, condition: cond, result: r.result, error: r.error, selected });
218
+ }
219
+ // Fall back to the default branch when no condition matched.
220
+ if (!chosen) {
221
+ const def = out.find((x) => x.e.isDefault);
222
+ if (def) {
223
+ chosen = def;
224
+ evals.push({ edgeId: edgeId(def.e, def.i), target: def.e.target, isDefault: true, result: true, selected: true });
225
+ }
226
+ }
227
+ const multiMatch = evals.filter((x) => x.result && !x.isDefault).length > 1;
228
+ if (chosen)
229
+ this.traverse(chosen.e, chosen.i);
230
+ return this.record(node.id, 'decision', node.label, chosen ? 'ok' : 'error', {
231
+ edges: evals,
232
+ error: chosen ? undefined : firstError ?? 'No branch matched and there is no default branch.',
233
+ note: multiMatch ? 'Multiple conditions matched; the first declared branch was taken.' : undefined,
234
+ });
235
+ }
236
+ executeLoop(node) {
237
+ const ref = str(node.config?.collection);
238
+ const iterVar = str(node.config?.iteratorVariable);
239
+ let note = 'Loop simulated as a single pass (body re-execution is not modelled).';
240
+ if (ref) {
241
+ const resolved = this.resolveRef(ref);
242
+ if (Array.isArray(resolved)) {
243
+ note = `Collection "${ref}" has ${resolved.length} item(s); simulated as a single pass.`;
244
+ if (iterVar && resolved.length)
245
+ this.state.variables[iterVar] = resolved[0];
246
+ }
247
+ else if (resolved !== undefined) {
248
+ note = `Collection "${ref}" is not an array; loop may not run at runtime.`;
249
+ }
250
+ }
251
+ return this.record(node.id, 'loop', node.label, 'ok', { note });
252
+ }
253
+ // ---- helpers ------------------------------------------------------------
254
+ /** Resolve a `{var}` template ref or a plain variable name from `variables`. */
255
+ resolveRef(ref) {
256
+ const m = ref.match(/^\{(.+)\}$/);
257
+ const key = (m ? m[1] : ref).trim();
258
+ return this.state.variables[key];
259
+ }
260
+ /** Apply a node's mock output to the simulation variables; returns what it wrote. */
261
+ applyMock(node) {
262
+ const cfg = node.config ?? {};
263
+ const mock = this.mocks[node.id];
264
+ const wrote = {};
265
+ const single = str(cfg.outputVariable);
266
+ if (single) {
267
+ wrote[single] = mock !== undefined ? mock : {};
268
+ this.state.variables[single] = wrote[single];
269
+ }
270
+ const list = Array.isArray(cfg.outputVariables) ? cfg.outputVariables : [];
271
+ if (list.length) {
272
+ const m = mock && typeof mock === 'object' ? mock : {};
273
+ for (const name of list) {
274
+ if (typeof name !== 'string')
275
+ continue;
276
+ wrote[name] = name in m ? m[name] : undefined;
277
+ this.state.variables[name] = wrote[name];
278
+ }
279
+ }
280
+ return Object.keys(wrote).length ? wrote : undefined;
281
+ }
282
+ mockNote(node) {
283
+ if (node.type === 'script') {
284
+ const action = str(node.config?.actionType);
285
+ if (action && action !== 'code') {
286
+ const recips = Array.isArray(node.config?.recipients) ? node.config.recipients.length : 0;
287
+ return `Mocked ${action} notification${recips ? ` to ${recips} recipient(s)` : ''}.`;
288
+ }
289
+ return 'Mocked code script (no real code executed).';
290
+ }
291
+ return `Mocked ${node.type.replace(/_/g, ' ')} (no backend call).`;
292
+ }
293
+ /** Enqueue every outgoing target (linear nodes have one; parallel fans out). */
294
+ enqueueSuccessors(node) {
295
+ this.edges.forEach((e, i) => {
296
+ if (e.source === node.id)
297
+ this.traverse(e, i);
298
+ });
299
+ }
300
+ traverse(e, i) {
301
+ const id = edgeId(e, i);
302
+ if (!this.state.traversedEdgeIds.includes(id))
303
+ this.state.traversedEdgeIds.push(id);
304
+ if (this.nodes.has(e.target))
305
+ this.state.frontier.push(e.target);
306
+ }
307
+ record(nodeId, type, label, status, extra = {}) {
308
+ const step = { seq: this.seq++, nodeId, type, label: label || nodeId, status, ...extra };
309
+ this.state.steps.push(step);
310
+ if (status === 'error' && this.state.status !== 'paused') {
311
+ this.state.status = 'error';
312
+ this.state.error = extra.error;
313
+ }
314
+ return step;
315
+ }
316
+ }
@@ -0,0 +1,47 @@
1
+ export interface DatasetDimensionInfo {
2
+ /** Dimension name (snake_case, referenced by `report.rows`). */
3
+ name: string;
4
+ /** Raw field type id when declared (e.g. 'text', 'date'). */
5
+ type?: string;
6
+ }
7
+ export interface DatasetMeasureInfo {
8
+ /** Measure name (snake_case, referenced by `report.values`). */
9
+ name: string;
10
+ /** Aggregate function (sum / avg / count / …) — display hint only. */
11
+ aggregate?: string;
12
+ /** Whether the dataset author certified this measure. */
13
+ certified?: boolean;
14
+ }
15
+ export interface DatasetCatalogEntry {
16
+ /** Dataset unique name (what `report.dataset` stores). */
17
+ name: string;
18
+ /** Human label (falls back to the name). */
19
+ label: string;
20
+ dimensions: DatasetDimensionInfo[];
21
+ measures: DatasetMeasureInfo[];
22
+ }
23
+ export interface UseDatasetCatalogResult {
24
+ datasets: DatasetCatalogEntry[];
25
+ loading: boolean;
26
+ error: string | null;
27
+ }
28
+ /** Normalize a raw dataset document into a catalog entry. */
29
+ export declare function toCatalogEntry(doc: Record<string, unknown>): DatasetCatalogEntry | null;
30
+ export declare function useDatasetCatalog(
31
+ /**
32
+ * Pre-resolved catalog. When supplied the hook skips the network fetch
33
+ * entirely and returns this list verbatim.
34
+ */
35
+ override?: DatasetCatalogEntry[]): UseDatasetCatalogResult;
36
+ export interface UseDatasetSemanticsResult {
37
+ dimensions: DatasetDimensionInfo[];
38
+ measures: DatasetMeasureInfo[];
39
+ loading: boolean;
40
+ error: string | null;
41
+ }
42
+ /**
43
+ * Resolve the bound dataset's dimensions/measures from the catalog, lazily
44
+ * hydrating via `client.get('dataset', name)` when the list endpoint returned
45
+ * a summary without them (some servers list names only).
46
+ */
47
+ export declare function useDatasetSemantics(name: string | undefined, catalog: UseDatasetCatalogResult): UseDatasetSemanticsResult;
@@ -0,0 +1,133 @@
1
+ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.
2
+ /**
3
+ * useDatasetCatalog — loads the analytics dataset catalog for the Report
4
+ * inspector's dataset binding controls (ADR-0021 single-form).
5
+ *
6
+ * A 9.0 report binds a semantic-layer `dataset` and selects its `values`
7
+ * (measure names) grouped by `rows` (dimension names) — so the editor needs
8
+ * (a) the list of datasets to bind, and (b) the bound dataset's
9
+ * dimensions/measures to offer as picker options.
10
+ *
11
+ * Mirrors {@link useObjectFields}: defensive (a 404 or transport error
12
+ * resolves to an empty catalog with `error` set, the inspector falls back to
13
+ * manual entry) and override-friendly (hosts that already hold the catalog
14
+ * pass it to keep the inspector network-free, e.g. tests and the runtime
15
+ * config panel).
16
+ */
17
+ import * as React from 'react';
18
+ import { useMetadataClient } from '../useMetadata';
19
+ function resolveLabel(label, fallback) {
20
+ if (typeof label === 'string' && label)
21
+ return label;
22
+ if (label && typeof label === 'object') {
23
+ const def = label.default;
24
+ if (typeof def === 'string' && def)
25
+ return def;
26
+ }
27
+ return fallback;
28
+ }
29
+ /** Normalize a raw dataset document into a catalog entry. */
30
+ export function toCatalogEntry(doc) {
31
+ const name = typeof doc.name === 'string' ? doc.name : '';
32
+ if (!name)
33
+ return null;
34
+ const dimensions = Array.isArray(doc.dimensions)
35
+ ? doc.dimensions
36
+ .filter((d) => d && typeof d.name === 'string' && d.name)
37
+ .map((d) => ({
38
+ name: d.name,
39
+ type: typeof d.type === 'string' ? d.type : undefined,
40
+ }))
41
+ : [];
42
+ const measures = Array.isArray(doc.measures)
43
+ ? doc.measures
44
+ .filter((m) => m && typeof m.name === 'string' && m.name)
45
+ .map((m) => ({
46
+ name: m.name,
47
+ aggregate: typeof m.aggregate === 'string' ? m.aggregate : undefined,
48
+ certified: m.certified === true,
49
+ }))
50
+ : [];
51
+ return { name, label: resolveLabel(doc.label, name), dimensions, measures };
52
+ }
53
+ export function useDatasetCatalog(
54
+ /**
55
+ * Pre-resolved catalog. When supplied the hook skips the network fetch
56
+ * entirely and returns this list verbatim.
57
+ */
58
+ override) {
59
+ const client = useMetadataClient();
60
+ const [state, setState] = React.useState({
61
+ datasets: override ?? [],
62
+ loading: !override,
63
+ error: null,
64
+ });
65
+ React.useEffect(() => {
66
+ if (override) {
67
+ setState({ datasets: override, loading: false, error: null });
68
+ return;
69
+ }
70
+ let cancelled = false;
71
+ setState((s) => ({ ...s, loading: true, error: null }));
72
+ client
73
+ .list('dataset')
74
+ .then((docs) => {
75
+ if (cancelled)
76
+ return;
77
+ const datasets = (Array.isArray(docs) ? docs : [])
78
+ .map(toCatalogEntry)
79
+ .filter((e) => e !== null);
80
+ setState({ datasets, loading: false, error: null });
81
+ })
82
+ .catch((err) => {
83
+ if (cancelled)
84
+ return;
85
+ setState({ datasets: [], loading: false, error: err?.message ?? String(err) });
86
+ });
87
+ return () => {
88
+ cancelled = true;
89
+ };
90
+ }, [client, override]);
91
+ return state;
92
+ }
93
+ /**
94
+ * Resolve the bound dataset's dimensions/measures from the catalog, lazily
95
+ * hydrating via `client.get('dataset', name)` when the list endpoint returned
96
+ * a summary without them (some servers list names only).
97
+ */
98
+ export function useDatasetSemantics(name, catalog) {
99
+ const client = useMetadataClient();
100
+ const entry = name ? catalog.datasets.find((d) => d.name === name) : undefined;
101
+ const needsFetch = !!name && !catalog.loading &&
102
+ (!entry || (entry.dimensions.length === 0 && entry.measures.length === 0));
103
+ const [fetched, setFetched] = React.useState(null);
104
+ React.useEffect(() => {
105
+ if (!needsFetch || !name)
106
+ return;
107
+ if (fetched?.name === name)
108
+ return;
109
+ let cancelled = false;
110
+ client
111
+ .get('dataset', name)
112
+ .then((doc) => {
113
+ if (cancelled)
114
+ return;
115
+ setFetched({ name, entry: doc ? toCatalogEntry(doc) : null, error: doc ? null : 'Dataset not found' });
116
+ })
117
+ .catch((err) => {
118
+ if (cancelled)
119
+ return;
120
+ setFetched({ name, entry: null, error: err?.message ?? String(err) });
121
+ });
122
+ return () => {
123
+ cancelled = true;
124
+ };
125
+ }, [client, name, needsFetch, fetched]);
126
+ const resolved = needsFetch && fetched?.name === name ? fetched.entry : entry;
127
+ return {
128
+ dimensions: resolved?.dimensions ?? [],
129
+ measures: resolved?.measures ?? [],
130
+ loading: catalog.loading || (needsFetch && fetched?.name !== name),
131
+ error: (needsFetch && fetched?.name === name ? fetched.error : null) ?? catalog.error,
132
+ };
133
+ }