@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,79 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * ObjectUI
4
+ * Copyright (c) 2024-present ObjectStack Inc.
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE file in the root directory of this source tree.
8
+ */
9
+ /**
10
+ * ADR-0045 — the "unpublished app" banner. Renders while the CURRENT app is
11
+ * materialized-but-unlisted (`app.hidden === true`): the app is fully real —
12
+ * tables, data, interactions — but end users can't see it (launchers exclude
13
+ * it; the REST gate strips it for non-builders). The banner narrates that
14
+ * state and offers the one action that matters: Publish, which simply flips
15
+ * visibility (`hidden: false`) — instant and reversible, per ADR-0045.
16
+ *
17
+ * Sibling of DraftPreviewBar (the ADR-0037 draft-overlay watermark): that bar
18
+ * owns mutation preview (`?preview=draft`); this one owns the materialize
19
+ * regime. In preview mode this bar yields — the draft bar already narrates.
20
+ */
21
+ import { useState } from 'react';
22
+ import { useLocation, useParams } from 'react-router-dom';
23
+ import { EyeOff, Rocket } from 'lucide-react';
24
+ import { toast } from 'sonner';
25
+ import { Button } from '@object-ui/components';
26
+ import { useObjectTranslation } from '@object-ui/i18n';
27
+ import { useMetadata } from '../providers/MetadataProvider';
28
+ import { matchAppBySegment } from '../utils/appRoute';
29
+ import { usePreviewDrafts } from './PreviewModeContext';
30
+ export function UnpublishedAppBar() {
31
+ const preview = usePreviewDrafts();
32
+ const { appName } = useParams();
33
+ const location = useLocation();
34
+ const { apps, refresh } = useMetadata();
35
+ const { t } = useObjectTranslation();
36
+ const [publishing, setPublishing] = useState(false);
37
+ // The draft-preview watermark owns the preview tree; never stack both bars.
38
+ if (preview)
39
+ return null;
40
+ const routeApp = appName ?? location.pathname.match(/\/apps\/([^/?#]+)/)?.[1];
41
+ if (!routeApp)
42
+ return null;
43
+ const app = matchAppBySegment(apps ?? [], routeApp);
44
+ if (!app || app.hidden !== true)
45
+ return null;
46
+ const publish = async () => {
47
+ setPublishing(true);
48
+ try {
49
+ // Publish = the ADR-0045 visibility flip: one metadata write, no
50
+ // lifecycle machinery. Body is the full current app with hidden:false
51
+ // (the meta save endpoint replaces the overlay row).
52
+ const res = await fetch(`/api/v1/meta/app/${encodeURIComponent(routeApp)}`, {
53
+ method: 'PUT',
54
+ credentials: 'include',
55
+ headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
56
+ body: JSON.stringify({ ...app, hidden: false }),
57
+ });
58
+ if (!res.ok) {
59
+ const payload = await res.json().catch(() => null);
60
+ throw new Error(payload?.error?.message ?? payload?.error ?? `HTTP ${res.status}`);
61
+ }
62
+ toast.success(t('preview.unpublishedBar.published', {
63
+ defaultValue: 'Published! The app is now visible to your users.',
64
+ }));
65
+ refresh?.();
66
+ }
67
+ catch (e) {
68
+ toast.error(`${t('preview.unpublishedBar.publishFailed', { defaultValue: 'Publish failed' })}: ${e.message}`);
69
+ }
70
+ finally {
71
+ setPublishing(false);
72
+ }
73
+ };
74
+ return (_jsxs("div", { className: "sticky top-0 z-40 flex items-center gap-3 border-b border-amber-300/70 bg-amber-50 px-4 py-2 text-sm text-amber-900 dark:border-amber-700/60 dark:bg-amber-950/40 dark:text-amber-200", "data-testid": "unpublished-app-bar", children: [_jsx(EyeOff, { className: "h-4 w-4 shrink-0" }), _jsx("p", { className: "min-w-0 flex-1 truncate", children: t('preview.unpublishedBar.message', {
75
+ defaultValue: 'Unpublished app — fully functional, but only builders can see it. Publish to make it visible to your users.',
76
+ }) }), _jsxs(Button, { size: "sm", onClick: publish, disabled: publishing, "data-testid": "unpublished-app-publish", children: [_jsx(Rocket, { className: "mr-1 h-3.5 w-3.5" }), publishing
77
+ ? t('preview.unpublishedBar.publishing', { defaultValue: 'Publishing…' })
78
+ : t('preview.unpublishedBar.publish', { defaultValue: 'Publish' })] })] }));
79
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ /**
9
+ * Live draft-status read for the chat's draft cards (panel-as-source-of-truth,
10
+ * made literal): how many drafts are still PENDING in a package, straight from
11
+ * the ADR-0033 `_drafts` endpoint. The chat passes this to
12
+ * `fetchPendingDraftCount` so a card's Publish/Published affordance reflects
13
+ * the server's CURRENT state — across conversation reloads, other sessions'
14
+ * publishes, and later edits into the same package — instead of replaying the
15
+ * tool-result snapshot it was born with.
16
+ *
17
+ * Cookie-authenticated like every other console call; tolerant of both
18
+ * response shapes (`[...]` and `{ drafts: [...] }`).
19
+ */
20
+ export declare function fetchPendingDraftCount(packageId: string): Promise<number>;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ /**
9
+ * Live draft-status read for the chat's draft cards (panel-as-source-of-truth,
10
+ * made literal): how many drafts are still PENDING in a package, straight from
11
+ * the ADR-0033 `_drafts` endpoint. The chat passes this to
12
+ * `fetchPendingDraftCount` so a card's Publish/Published affordance reflects
13
+ * the server's CURRENT state — across conversation reloads, other sessions'
14
+ * publishes, and later edits into the same package — instead of replaying the
15
+ * tool-result snapshot it was born with.
16
+ *
17
+ * Cookie-authenticated like every other console call; tolerant of both
18
+ * response shapes (`[...]` and `{ drafts: [...] }`).
19
+ */
20
+ export async function fetchPendingDraftCount(packageId) {
21
+ const res = await fetch(`/api/v1/meta/_drafts?packageId=${encodeURIComponent(packageId)}`, { credentials: 'include', headers: { Accept: 'application/json' }, cache: 'no-store' });
22
+ if (!res.ok)
23
+ throw new Error(`_drafts HTTP ${res.status}`);
24
+ const data = (await res.json());
25
+ const list = Array.isArray(data) ? data : data?.drafts ?? data?.data?.drafts ?? [];
26
+ return Array.isArray(list) ? list.length : 0;
27
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ type TranslateFn = (key: string, opts?: Record<string, unknown>) => string;
9
+ export interface PublishAllResult {
10
+ ok: boolean;
11
+ /** Count of drafts the call attempted to publish. */
12
+ attempted: number;
13
+ }
14
+ export declare function usePublishAllDrafts(t: TranslateFn): {
15
+ publishAll: () => Promise<PublishAllResult>;
16
+ publishing: boolean;
17
+ };
18
+ export {};
@@ -0,0 +1,106 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ /**
9
+ * One-click "publish everything pending" — shared by the Home pending-drafts
10
+ * banner and the ADR-0037 draft-preview bar, so both surfaces publish through
11
+ * the SAME governed path and report the SAME health.
12
+ *
13
+ * Package-bound drafts go through `POST /packages/:id/publish-drafts` — the
14
+ * path that orders structure-before-seeds server-side and runs the ADR-0038
15
+ * L3 runtime probes; findings surface as a loud warning toast instead of a
16
+ * blind "Published!". Package-less drafts fall back to by-reference publish
17
+ * (structure first, seeds last) so they never dead-end.
18
+ */
19
+ import { useCallback, useState } from 'react';
20
+ import { toast } from 'sonner';
21
+ import { publishHealthFromResponse } from '@object-ui/plugin-chatbot';
22
+ import { useMetadataClient } from '../views/metadata-admin/useMetadata';
23
+ export function usePublishAllDrafts(t) {
24
+ const client = useMetadataClient();
25
+ const [publishing, setPublishing] = useState(false);
26
+ const publishAll = useCallback(async () => {
27
+ setPublishing(true);
28
+ try {
29
+ const pending = ((await client.listDrafts?.({})) || [])
30
+ .filter((d) => d && typeof d.type === 'string' && typeof d.name === 'string')
31
+ .map((d) => ({
32
+ type: d.type,
33
+ name: d.name,
34
+ packageId: typeof d.packageId === 'string' && d.packageId ? d.packageId : null,
35
+ }));
36
+ if (pending.length === 0) {
37
+ toast.info(t('home.pendingDrafts.nothing', { defaultValue: 'Nothing to publish.' }));
38
+ return { ok: true, attempted: 0 };
39
+ }
40
+ const packageIds = [...new Set(pending.map((d) => d.packageId).filter((p) => p !== null))];
41
+ const orphans = pending.filter((d) => d.packageId === null);
42
+ const seedProblems = [];
43
+ const probeProblems = [];
44
+ let seededRows = 0;
45
+ const recordHealth = (health) => {
46
+ if (!health)
47
+ return;
48
+ if (health.seedError)
49
+ seedProblems.push(health.seedError);
50
+ if (typeof health.seededRows === 'number')
51
+ seededRows += health.seededRows;
52
+ for (const issue of health.issues ?? []) {
53
+ if (issue.severity === 'error')
54
+ probeProblems.push(issue.message);
55
+ }
56
+ };
57
+ for (const packageId of packageIds) {
58
+ const res = await fetch(`/api/v1/packages/${encodeURIComponent(packageId)}/publish-drafts`, {
59
+ method: 'POST',
60
+ credentials: 'include',
61
+ headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
62
+ body: '{}',
63
+ });
64
+ const payload = await res.json().catch(() => null);
65
+ if (!res.ok || payload?.success === false) {
66
+ throw new Error(payload?.error?.message || `HTTP ${res.status}`);
67
+ }
68
+ recordHealth(publishHealthFromResponse(payload));
69
+ }
70
+ const ordered = [
71
+ ...orphans.filter((d) => d.type !== 'seed'),
72
+ ...orphans.filter((d) => d.type === 'seed'),
73
+ ];
74
+ for (const d of ordered) {
75
+ const res = await client.publishDraft(d.type, d.name);
76
+ const seedApplied = res?.seedApplied;
77
+ if (seedApplied && seedApplied.success === false) {
78
+ seedProblems.push(seedApplied.error ?? `${d.name}: sample data failed to load`);
79
+ }
80
+ }
81
+ if (probeProblems.length > 0) {
82
+ toast.warning(t('home.pendingDrafts.probeWarn', { defaultValue: 'Published, but verification found problems.' }), { description: probeProblems[0] });
83
+ }
84
+ else if (seedProblems.length > 0) {
85
+ toast.warning(t('home.pendingDrafts.seedWarn', { defaultValue: 'Published, but some sample data failed to load.' }), { description: seedProblems[0] });
86
+ }
87
+ else {
88
+ toast.success(seededRows > 0
89
+ ? t('home.pendingDrafts.publishedVerified', {
90
+ count: seededRows,
91
+ defaultValue: 'Published & verified — {{count}} sample row(s) live.',
92
+ })
93
+ : t('home.pendingDrafts.published', { defaultValue: 'Published! Your changes are live.' }));
94
+ }
95
+ return { ok: true, attempted: pending.length };
96
+ }
97
+ catch (e) {
98
+ toast.error(`${t('home.pendingDrafts.publishFailed', { defaultValue: 'Publish failed' })}: ${e.message}`);
99
+ return { ok: false, attempted: 0 };
100
+ }
101
+ finally {
102
+ setPublishing(false);
103
+ }
104
+ }, [client, t]);
105
+ return { publishAll, publishing };
106
+ }
@@ -18,4 +18,4 @@ interface AdapterProviderProps {
18
18
  * Creates an ObjectStackAdapter, connects to the API, then provides it to children.
19
19
  * Shows nothing (returns null) until the adapter is ready.
20
20
  */
21
- export declare function AdapterProvider({ children, adapter: externalAdapter }: AdapterProviderProps): import("react/jsx-runtime").JSX.Element;
21
+ export declare function AdapterProvider({ children, adapter: externalAdapter }: AdapterProviderProps): import("react").JSX.Element;
@@ -11,6 +11,7 @@ import { useState, useEffect } from 'react';
11
11
  import { ObjectStackAdapter } from '@object-ui/data-objectstack';
12
12
  import { createAuthenticatedFetch } from '@object-ui/auth';
13
13
  import { AdapterCtx } from '@object-ui/react';
14
+ import { installSettleSignalGlobal, withSettleSignal } from '../observability/settleSignal';
14
15
  export { useAdapter } from '@object-ui/react';
15
16
  /**
16
17
  * Creates an ObjectStackAdapter, connects to the API, then provides it to children.
@@ -24,11 +25,15 @@ export function AdapterProvider({ children, adapter: externalAdapter }) {
24
25
  return;
25
26
  }
26
27
  let cancelled = false;
28
+ // Expose window.__objectui.{pendingRequests,idle,whenIdle} so an automated
29
+ // (AI) browser driver has one "is the app settled?" predicate (ADR-0054 C5).
30
+ installSettleSignalGlobal();
27
31
  async function init() {
28
32
  try {
29
33
  const a = new ObjectStackAdapter({
30
34
  baseUrl: import.meta.env.VITE_SERVER_URL || '',
31
- fetch: createAuthenticatedFetch(),
35
+ // Count every outbound request in the global in-flight signal (C5).
36
+ fetch: withSettleSignal(createAuthenticatedFetch()),
32
37
  autoReconnect: true,
33
38
  maxReconnectAttempts: 5,
34
39
  reconnectDelay: 1000,
@@ -41,7 +41,7 @@ interface ExpressionProviderProps {
41
41
  data?: Record<string, any>;
42
42
  features?: Record<string, any>;
43
43
  }
44
- export declare function ExpressionProvider({ children, user, app, data, features }: ExpressionProviderProps): import("react/jsx-runtime").JSX.Element;
44
+ export declare function ExpressionProvider({ children, user, app, data, features }: ExpressionProviderProps): React.JSX.Element;
45
45
  /**
46
46
  * Hook to access the expression context.
47
47
  * Returns the full context value or a default empty context.
@@ -1,5 +1,5 @@
1
1
  import { type ReactNode } from 'react';
2
- import type { ObjectStackAdapter } from '@object-ui/data-objectstack';
2
+ import { type ObjectStackAdapter } from '@object-ui/data-objectstack';
3
3
  import { useMetadata, type MetadataContextValue, type MetadataState } from '@object-ui/react';
4
4
  export type { MetadataState, MetadataContextValue };
5
5
  export { useMetadataItem } from '@object-ui/react';
@@ -10,7 +10,22 @@ interface MetadataProviderProps {
10
10
  adapter: ObjectStackAdapter;
11
11
  ttlMs?: number;
12
12
  }
13
- export declare function MetadataProvider({ children, adapter, ttlMs }: MetadataProviderProps): import("react/jsx-runtime").JSX.Element;
13
+ /** Exported for tests both metadata sources must normalize identically. */
14
+ export declare function extractItems(res: unknown): any[];
15
+ export declare function mergeViewsIntoObjects(objects: any[], views: any[]): any[];
16
+ /**
17
+ * Relationship-driven master-detail: a child object's `master_detail`/`lookup`
18
+ * field can carry `inlineEdit: true` to declare "edit me inline within my
19
+ * parent's form". This pass scans every object for such fields and merges the
20
+ * resulting child collections into each parent object's form view as
21
+ * `subforms` — so the parent's standard create/edit form renders an atomic
22
+ * master-detail form with NO view config and NO bespoke page. The intent lives
23
+ * in the data model (where it's defined once, e.g. by an AI modelling the
24
+ * schema); forms just follow. An explicit `form.subforms` entry for the same
25
+ * child overrides the model-derived one.
26
+ */
27
+ export declare function attachInlineSubforms(objects: any[]): any[];
28
+ export declare function MetadataProvider({ children, adapter, ttlMs }: MetadataProviderProps): import("react").JSX.Element;
14
29
  export declare function useMetadataType(type: string): {
15
30
  items: any[];
16
31
  loading: boolean;
@@ -1,6 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useState, useEffect, useCallback, useRef, useMemo, } from 'react';
3
+ import { MetadataClient } from '@object-ui/data-objectstack';
4
+ import { resolveInlineMode } from '@object-ui/plugin-form';
3
5
  import { MetadataCtx, useMetadata } from '@object-ui/react';
6
+ import { usePreviewDrafts } from '../preview/PreviewModeContext';
7
+ import { subscribeCanvasInvalidate, subscribeMetadataRefresh } from '../assistant/assistantBus';
4
8
  export { useMetadataItem } from '@object-ui/react';
5
9
  export { useMetadata };
6
10
  // ---------------------------------------------------------------------------
@@ -41,7 +45,15 @@ function debug(...args) {
41
45
  // ---------------------------------------------------------------------------
42
46
  // Helpers
43
47
  // ---------------------------------------------------------------------------
44
- function extractItems(res) {
48
+ /** Exported for tests — both metadata sources must normalize identically. */
49
+ export function extractItems(res) {
50
+ // Both source shapes must parse: the adapter SDK returns the wrapped
51
+ // `{ type, items: [...] }` envelope, while the ADR-0037 preview path's
52
+ // MetadataClient.list() returns the already-unwrapped array. Dropping the
53
+ // bare-array shape silently emptied the ENTIRE draft-preview world (every
54
+ // type read 0 items), stranding the Live Canvas on "No Apps Configured".
55
+ if (Array.isArray(res))
56
+ return res;
45
57
  if (res && typeof res === 'object' && 'items' in res && Array.isArray(res.items)) {
46
58
  return res.items;
47
59
  }
@@ -61,14 +73,54 @@ function isNamedItem(item) {
61
73
  'name' in item &&
62
74
  typeof item.name === 'string');
63
75
  }
64
- function mergeViewsIntoObjects(objects, views) {
76
+ /** A first-class ViewItem carries a `viewKind` discriminant + `object` binding. */
77
+ function isViewItem(view) {
78
+ return !!view && typeof view === 'object' && !!view.viewKind && !!view.object;
79
+ }
80
+ export function mergeViewsIntoObjects(objects, views) {
81
+ var _a;
65
82
  if (!objects.length || !views.length)
66
83
  return objects;
67
84
  const byObject = {};
85
+ // Objects that received expanded ViewItems — their legacy aggregated
86
+ // container (also present in the `view` list) is superseded and skipped.
87
+ const hasViewItems = new Set();
88
+ for (const view of views) {
89
+ if (isViewItem(view))
90
+ hasViewItems.add(view.object);
91
+ }
68
92
  for (const view of views) {
93
+ // ── New protocol: independent ViewItem ({ name, object, viewKind, config }) ──
94
+ if (isViewItem(view)) {
95
+ const bucket = (byObject[_a = view.object] || (byObject[_a] = { listViews: {}, formViews: {} }));
96
+ // Canonical `<object>.<key>` name doubles as the view id, so `/view/<name>`
97
+ // URLs resolve directly against the switcher tab ids.
98
+ const key = view.name || `${view.object}.${view.viewKind}`;
99
+ const body = view.config && typeof view.config === 'object' ? view.config : {};
100
+ // Flatten `config` to the legacy NamedListView/FormView shape the
101
+ // renderer consumes (type/data/columns/sections at top level); carry the
102
+ // item-level label/isDefault and stamp `name` so primary-view promotion
103
+ // (which matches on `list.name`) finds this entry by its listViews key.
104
+ const entry = { ...body, name: key, label: view.label ?? body.label, isDefault: !!view.isDefault };
105
+ if (view.viewKind === 'form') {
106
+ bucket.formViews[key] = entry;
107
+ if (view.isDefault || !bucket.form)
108
+ bucket.form = entry;
109
+ }
110
+ else {
111
+ bucket.listViews[key] = entry;
112
+ if (view.isDefault)
113
+ bucket.primary = entry;
114
+ }
115
+ continue;
116
+ }
117
+ // ── Legacy aggregated container ({ list, form, listViews, formViews }) ──
69
118
  const objName = view?.name || view?.list?.data?.object || view?.form?.data?.object;
70
119
  if (!objName)
71
120
  continue;
121
+ // Expanded ViewItems supersede the bare container for this object.
122
+ if (hasViewItems.has(objName))
123
+ continue;
72
124
  const bucket = (byObject[objName] || (byObject[objName] = { listViews: {}, formViews: {} }));
73
125
  if (view.list) {
74
126
  // Preserve the primary list view as `obj.list` per @objectstack/spec
@@ -115,6 +167,67 @@ function mergeViewsIntoObjects(objects, views) {
115
167
  return merged;
116
168
  });
117
169
  }
170
+ /**
171
+ * Relationship-driven master-detail: a child object's `master_detail`/`lookup`
172
+ * field can carry `inlineEdit: true` to declare "edit me inline within my
173
+ * parent's form". This pass scans every object for such fields and merges the
174
+ * resulting child collections into each parent object's form view as
175
+ * `subforms` — so the parent's standard create/edit form renders an atomic
176
+ * master-detail form with NO view config and NO bespoke page. The intent lives
177
+ * in the data model (where it's defined once, e.g. by an AI modelling the
178
+ * schema); forms just follow. An explicit `form.subforms` entry for the same
179
+ * child overrides the model-derived one.
180
+ */
181
+ export function attachInlineSubforms(objects) {
182
+ if (!objects?.length)
183
+ return objects;
184
+ const inlineByParent = {};
185
+ for (const child of objects) {
186
+ const fields = child?.fields;
187
+ if (!fields)
188
+ continue;
189
+ const entries = Array.isArray(fields)
190
+ ? fields.map((f) => [f?.name, f])
191
+ : Object.entries(fields);
192
+ for (const [fname, fdef] of entries) {
193
+ const d = fdef;
194
+ if (!fname || !d?.inlineEdit)
195
+ continue;
196
+ if (d.type !== 'master_detail' && d.type !== 'lookup')
197
+ continue;
198
+ const parent = d.reference;
199
+ if (!parent)
200
+ continue;
201
+ (inlineByParent[parent] || (inlineByParent[parent] = [])).push({
202
+ childObject: child.name,
203
+ relationshipField: fname,
204
+ // Resolve the inline-edit form factor (grid vs per-row form) from the
205
+ // declared value, falling back to the smart default by child shape.
206
+ inlineMode: resolveInlineMode(child, d.inlineEdit, { relationshipField: fname }),
207
+ ...(d.inlineTitle ? { title: d.inlineTitle } : {}),
208
+ ...(Array.isArray(d.inlineColumns) ? { columns: d.inlineColumns } : {}),
209
+ ...(typeof d.inlineAmountField === 'string' ? { amountField: d.inlineAmountField } : {}),
210
+ });
211
+ }
212
+ }
213
+ if (!Object.keys(inlineByParent).length)
214
+ return objects;
215
+ return objects.map((obj) => {
216
+ const derived = inlineByParent[obj.name];
217
+ if (!derived?.length)
218
+ return obj;
219
+ const form = { ...(obj.form || { type: 'simple' }) };
220
+ const explicit = Array.isArray(form.subforms) ? form.subforms : [];
221
+ const explicitChildren = new Set(explicit.map((s) => s.childObject));
222
+ // Model-derived first; an explicit view subform for the same child wins.
223
+ form.subforms = [...derived.filter((d) => !explicitChildren.has(d.childObject)), ...explicit];
224
+ const next = { ...obj, form };
225
+ if (obj.formViews?.default) {
226
+ next.formViews = { ...obj.formViews, default: { ...obj.formViews.default, subforms: form.subforms } };
227
+ }
228
+ return next;
229
+ });
230
+ }
118
231
  function emptyEntry() {
119
232
  return {
120
233
  status: 'idle',
@@ -157,6 +270,20 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
157
270
  const itemPromisesRef = useRef(new Map());
158
271
  const adapterRef = useRef(adapter);
159
272
  adapterRef.current = adapter;
273
+ // ADR-0037 Live Canvas: when the tree is in draft-preview mode, metadata
274
+ // reads come from the REST `?preview=draft` overlay (pending ADR-0033
275
+ // drafts win over active) instead of the adapter SDK. The MetadataClient
276
+ // is used because the SDK's meta API doesn't carry the preview flag; same
277
+ // endpoints, same cookie auth. Reads only — every write path is unchanged.
278
+ const previewDrafts = usePreviewDrafts();
279
+ const previewClient = useMemo(() => {
280
+ if (!previewDrafts)
281
+ return null;
282
+ const baseUrl = (typeof import.meta !== 'undefined' && import.meta.env?.VITE_SERVER_URL) || '';
283
+ return new MetadataClient({ baseUrl, previewDrafts: true });
284
+ }, [previewDrafts]);
285
+ const previewClientRef = useRef(previewClient);
286
+ previewClientRef.current = previewClient;
160
287
  const [version, setVersion] = useState(0);
161
288
  // Defer state bumps so they never occur synchronously during a consumer's
162
289
  // render phase. `ensureType` may be invoked from inside `useMemo` getters
@@ -171,6 +298,14 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
171
298
  Promise.resolve().then(() => setVersion(v => v + 1));
172
299
  }
173
300
  }, []);
301
+ // Entering/leaving preview swaps the entire metadata source — the published
302
+ // and draft-overlaid worlds must never mix in one cache. Drop everything and
303
+ // let consumers refetch through the new source.
304
+ useEffect(() => {
305
+ cacheRef.current.clear();
306
+ itemPromisesRef.current.clear();
307
+ bump();
308
+ }, [previewDrafts, bump]);
174
309
  const getEntry = useCallback((type) => {
175
310
  let entry = cacheRef.current.get(type);
176
311
  if (!entry) {
@@ -190,9 +325,13 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
190
325
  const started = Date.now();
191
326
  entry.status = 'loading';
192
327
  entry.error = null;
193
- const client = adapterRef.current.getClient();
194
- const promise = client.meta
195
- .getItems(type)
328
+ // Preview mode reads the draft-overlaid world (`?preview=draft`);
329
+ // normal mode reads the adapter SDK as before.
330
+ const preview = previewClientRef.current;
331
+ const fetchItems = preview
332
+ ? preview.list(type)
333
+ : adapterRef.current.getClient().meta.getItems(type);
334
+ const promise = fetchItems
196
335
  .then((res) => {
197
336
  const items = extractItems(res);
198
337
  entry.items = items;
@@ -206,7 +345,9 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
206
345
  entry.byName.set(it.name, it);
207
346
  }
208
347
  }
209
- if (type === 'app')
348
+ // Never let the draft-overlaid world poison the published session
349
+ // cache — preview is ephemeral by design.
350
+ if (type === 'app' && !preview)
210
351
  saveToSession(type, items);
211
352
  debug(`fetched type=${type} items=${items.length} in ${Date.now() - started}ms`);
212
353
  bump();
@@ -243,9 +384,11 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
243
384
  if (existing)
244
385
  return existing;
245
386
  const started = Date.now();
246
- const client = adapterRef.current.getClient();
247
- const promise = client.meta
248
- .getItem(type, name)
387
+ const preview = previewClientRef.current;
388
+ const fetchItem = preview
389
+ ? preview.get(type, name)
390
+ : adapterRef.current.getClient().meta.getItem(type, name);
391
+ const promise = fetchItem
249
392
  .then((res) => {
250
393
  const item = extractItem(res);
251
394
  if (item)
@@ -297,11 +440,35 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
297
440
  }
298
441
  bump();
299
442
  }, [bump]);
443
+ // ADR-0037 P2.5 — same-document live refresh: while this tree renders the
444
+ // draft overlay, chat hosts announce each drafted artifact on the assistant
445
+ // bus; drop that type's cache entry so the next read refetches the updated
446
+ // draft world. Published-mode trees ignore the events entirely.
447
+ useEffect(() => {
448
+ if (!previewDrafts)
449
+ return;
450
+ return subscribeCanvasInvalidate(({ type }) => {
451
+ invalidate(type);
452
+ });
453
+ }, [previewDrafts, invalidate]);
454
+ // Live-metadata-changed refresh: a publish (drafts → live) or a marketplace
455
+ // install changed the registry out-of-band, so the schema this tree cached
456
+ // is stale. Refetch every loaded type — open forms/views/nav then reflect
457
+ // the new live world without a manual page reload (the chat-card "Publish"
458
+ // and Browse-page install paths do not reload, unlike the DraftPreviewBar).
459
+ // NOT gated to preview-drafts mode: the live world every tree reads changed.
460
+ useEffect(() => {
461
+ return subscribeMetadataRefresh(() => {
462
+ void refresh();
463
+ });
464
+ }, [refresh]);
300
465
  const [initialLoading, setInitialLoading] = useState(true);
301
466
  const [initialError, setInitialError] = useState(null);
302
467
  useEffect(() => {
303
468
  let cancelled = false;
304
- const cached = loadFromSession('app');
469
+ // Session-cached apps are PUBLISHED-world data — seeding them while in
470
+ // draft preview would flash the wrong universe before the fetch lands.
471
+ const cached = previewDrafts ? null : loadFromSession('app');
305
472
  if (cached) {
306
473
  const entry = getEntry('app');
307
474
  entry.items = cached;
@@ -334,7 +501,7 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
334
501
  return () => {
335
502
  cancelled = true;
336
503
  };
337
- }, [adapter, ensureType, getEntry, bump]);
504
+ }, [adapter, ensureType, getEntry, bump, previewDrafts]);
338
505
  const value = useMemo(() => {
339
506
  void version;
340
507
  const readType = (type) => {
@@ -350,7 +517,8 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
350
517
  get objects() {
351
518
  const objs = readType(TYPE_BY_STATE_KEY.objects);
352
519
  const views = readType('view');
353
- return views.length ? mergeViewsIntoObjects(objs, views) : objs;
520
+ const merged = views.length ? mergeViewsIntoObjects(objs, views) : objs;
521
+ return attachInlineSubforms(merged);
354
522
  },
355
523
  get dashboards() {
356
524
  return readType(TYPE_BY_STATE_KEY.dashboards);
@@ -368,6 +536,9 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
368
536
  ensureType,
369
537
  getItem,
370
538
  getItemsByType,
539
+ // Pure read — must NOT kick a fetch, so render-phase status checks
540
+ // can't recurse into ensureType.
541
+ getTypeStatus: (type) => getEntry(type).status,
371
542
  };
372
543
  return base;
373
544
  }, [version, initialLoading, initialError, ensureType, getItem, getEntry, refresh, invalidate]);