@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,64 @@
1
+ /**
2
+ * settleSignal — global "is the app idle?" in-flight request counter.
3
+ *
4
+ * ADR-0054 "UI testability contract", invariant C5 (machine-readable async
5
+ * state). Gives an automated (AI) browser driver a single predicate to poll
6
+ * instead of hardcoding waits or scraping per-component spinners:
7
+ *
8
+ * await page.waitForFunction(() => window.__objectui?.idle === true)
9
+ * // or: window.__objectui.pendingRequests === 0
10
+ * // or: await window.__objectui.whenIdle()
11
+ *
12
+ * The app-shell data layer increments the counter around every outbound request
13
+ * by wrapping the adapter's `fetch` with {@link withSettleSignal}. Async regions
14
+ * additionally expose `aria-busy`/`data-state` for region-level waiting.
15
+ *
16
+ * The counter is a module singleton (shared across the app); `window.__objectui`
17
+ * mirrors it via live getters installed by {@link installSettleSignalGlobal}.
18
+ *
19
+ * @module
20
+ */
21
+ type Listener = (pending: number) => void;
22
+ /** Mark one request as in-flight. Pair with {@link endRequest}. */
23
+ export declare function beginRequest(): void;
24
+ /** Mark one in-flight request as settled (clamped at 0). */
25
+ export declare function endRequest(): void;
26
+ /** Current number of in-flight requests. */
27
+ export declare function getPendingRequests(): number;
28
+ /** Whether the app is idle (no requests in flight). */
29
+ export declare function isIdle(): boolean;
30
+ /**
31
+ * Subscribe to in-flight count changes. Returns an unsubscribe function.
32
+ * Used by {@link useSettleSignal} and any consumer wanting a global busy state.
33
+ */
34
+ export declare function subscribeSettle(cb: Listener): () => void;
35
+ /**
36
+ * Resolve once the app is idle (no in-flight requests). Resolves immediately if
37
+ * already idle. `timeoutMs` (default 10s, `0` to disable) caps the wait so a
38
+ * pathological never-idle app — e.g. a held-open stream — can't hang a driver.
39
+ */
40
+ export declare function whenIdle(timeoutMs?: number): Promise<void>;
41
+ /**
42
+ * Wrap a `fetch` so each call increments the in-flight counter before the
43
+ * request and decrements it when the promise settles (success or failure).
44
+ */
45
+ export declare function withSettleSignal(fetchFn: typeof fetch): typeof fetch;
46
+ /** Shape mirrored onto `window.__objectui` for automated drivers. */
47
+ export interface ObjectUiGlobal {
48
+ /** Live in-flight request count. */
49
+ readonly pendingRequests: number;
50
+ /** Live idle flag (`pendingRequests === 0`). */
51
+ readonly idle: boolean;
52
+ /** Resolve once idle (see {@link whenIdle}). */
53
+ whenIdle: (timeoutMs?: number) => Promise<void>;
54
+ /** Subscribe to in-flight count changes. */
55
+ subscribe: (cb: (pending: number) => void) => () => void;
56
+ }
57
+ /**
58
+ * Install live `window.__objectui` accessors (idempotent). Safe to call in any
59
+ * environment — a no-op when `window` is undefined (SSR/tests).
60
+ */
61
+ export declare function installSettleSignalGlobal(): void;
62
+ /** Test-only: reset the counter and listeners to a clean state. */
63
+ export declare function __resetSettleSignal(): void;
64
+ export {};
@@ -0,0 +1,131 @@
1
+ /**
2
+ * settleSignal — global "is the app idle?" in-flight request counter.
3
+ *
4
+ * ADR-0054 "UI testability contract", invariant C5 (machine-readable async
5
+ * state). Gives an automated (AI) browser driver a single predicate to poll
6
+ * instead of hardcoding waits or scraping per-component spinners:
7
+ *
8
+ * await page.waitForFunction(() => window.__objectui?.idle === true)
9
+ * // or: window.__objectui.pendingRequests === 0
10
+ * // or: await window.__objectui.whenIdle()
11
+ *
12
+ * The app-shell data layer increments the counter around every outbound request
13
+ * by wrapping the adapter's `fetch` with {@link withSettleSignal}. Async regions
14
+ * additionally expose `aria-busy`/`data-state` for region-level waiting.
15
+ *
16
+ * The counter is a module singleton (shared across the app); `window.__objectui`
17
+ * mirrors it via live getters installed by {@link installSettleSignalGlobal}.
18
+ *
19
+ * @module
20
+ */
21
+ let pending = 0;
22
+ const listeners = new Set();
23
+ let idleWaiters = [];
24
+ function notify() {
25
+ for (const l of listeners) {
26
+ try {
27
+ l(pending);
28
+ }
29
+ catch {
30
+ /* a listener throwing must not break request accounting */
31
+ }
32
+ }
33
+ if (pending === 0 && idleWaiters.length > 0) {
34
+ const waiters = idleWaiters;
35
+ idleWaiters = [];
36
+ for (const resolve of waiters) {
37
+ try {
38
+ resolve();
39
+ }
40
+ catch {
41
+ /* ignore */
42
+ }
43
+ }
44
+ }
45
+ }
46
+ /** Mark one request as in-flight. Pair with {@link endRequest}. */
47
+ export function beginRequest() {
48
+ pending += 1;
49
+ notify();
50
+ }
51
+ /** Mark one in-flight request as settled (clamped at 0). */
52
+ export function endRequest() {
53
+ pending = Math.max(0, pending - 1);
54
+ notify();
55
+ }
56
+ /** Current number of in-flight requests. */
57
+ export function getPendingRequests() {
58
+ return pending;
59
+ }
60
+ /** Whether the app is idle (no requests in flight). */
61
+ export function isIdle() {
62
+ return pending === 0;
63
+ }
64
+ /**
65
+ * Subscribe to in-flight count changes. Returns an unsubscribe function.
66
+ * Used by {@link useSettleSignal} and any consumer wanting a global busy state.
67
+ */
68
+ export function subscribeSettle(cb) {
69
+ listeners.add(cb);
70
+ return () => {
71
+ listeners.delete(cb);
72
+ };
73
+ }
74
+ /**
75
+ * Resolve once the app is idle (no in-flight requests). Resolves immediately if
76
+ * already idle. `timeoutMs` (default 10s, `0` to disable) caps the wait so a
77
+ * pathological never-idle app — e.g. a held-open stream — can't hang a driver.
78
+ */
79
+ export function whenIdle(timeoutMs = 10000) {
80
+ if (pending === 0)
81
+ return Promise.resolve();
82
+ return new Promise((resolve) => {
83
+ let settled = false;
84
+ const finish = () => {
85
+ if (settled)
86
+ return;
87
+ settled = true;
88
+ resolve();
89
+ };
90
+ idleWaiters.push(finish);
91
+ if (timeoutMs > 0 && typeof setTimeout !== 'undefined') {
92
+ setTimeout(finish, timeoutMs);
93
+ }
94
+ });
95
+ }
96
+ /**
97
+ * Wrap a `fetch` so each call increments the in-flight counter before the
98
+ * request and decrements it when the promise settles (success or failure).
99
+ */
100
+ export function withSettleSignal(fetchFn) {
101
+ return (async (...args) => {
102
+ beginRequest();
103
+ try {
104
+ return await fetchFn(...args);
105
+ }
106
+ finally {
107
+ endRequest();
108
+ }
109
+ });
110
+ }
111
+ /**
112
+ * Install live `window.__objectui` accessors (idempotent). Safe to call in any
113
+ * environment — a no-op when `window` is undefined (SSR/tests).
114
+ */
115
+ export function installSettleSignalGlobal() {
116
+ if (typeof window === 'undefined')
117
+ return;
118
+ const w = window;
119
+ const ns = (w.__objectui ?? (w.__objectui = {}));
120
+ // Live getters so reads always reflect the current count.
121
+ Object.defineProperty(ns, 'pendingRequests', { get: getPendingRequests, configurable: true });
122
+ Object.defineProperty(ns, 'idle', { get: isIdle, configurable: true });
123
+ ns.whenIdle = whenIdle;
124
+ ns.subscribe = subscribeSettle;
125
+ }
126
+ /** Test-only: reset the counter and listeners to a clean state. */
127
+ export function __resetSettleSignal() {
128
+ pending = 0;
129
+ listeners.clear();
130
+ idleWaiters = [];
131
+ }
@@ -0,0 +1,19 @@
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
+ export interface DraftChangeEntry {
9
+ type: string;
10
+ name: string;
11
+ packageId: string | null;
12
+ /** `new` = no published version; `update` = overwrites one; undefined = probing. */
13
+ kind?: 'new' | 'update';
14
+ }
15
+ export interface DraftChangesPanelProps {
16
+ open: boolean;
17
+ onOpenChange: (open: boolean) => void;
18
+ }
19
+ export declare function DraftChangesPanel({ open, onOpenChange }: DraftChangesPanelProps): import("react").JSX.Element;
@@ -0,0 +1,114 @@
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
+ * "What will publishing change?" — the draft changeset, answered before the
11
+ * user commits. Lists every pending ADR-0033 draft grouped by metadata type,
12
+ * and classifies each as NEW (no published version exists — publishing adds
13
+ * it) or UPDATE (a published version exists — publishing overwrites it).
14
+ * This is the review surface that turns Publish from a leap of faith into an
15
+ * informed click; the per-item designer diff remains the deep-dive.
16
+ *
17
+ * Read-only: fetches `_drafts` + per-item `/published` probes on open, and
18
+ * never writes. Publishing stays with the caller (DraftPreviewBar / chat).
19
+ */
20
+ import { useCallback, useEffect, useState } from 'react';
21
+ import { FilePlus2, FilePen, Loader2 } from 'lucide-react';
22
+ import { Badge, Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from '@object-ui/components';
23
+ import { useObjectTranslation } from '@object-ui/i18n';
24
+ /** Pending drafts straight from the ADR-0033 `_drafts` endpoint. */
25
+ async function listPendingDrafts() {
26
+ const res = await fetch('/api/v1/meta/_drafts', {
27
+ credentials: 'include',
28
+ headers: { Accept: 'application/json' },
29
+ cache: 'no-store',
30
+ });
31
+ if (!res.ok)
32
+ throw new Error(`_drafts HTTP ${res.status}`);
33
+ const data = (await res.json());
34
+ const list = Array.isArray(data) ? data : data?.drafts ?? [];
35
+ return list
36
+ .filter((d) => typeof d?.type === 'string' && typeof d?.name === 'string')
37
+ .map((d) => ({
38
+ type: d.type,
39
+ name: d.name,
40
+ packageId: typeof d.packageId === 'string' && d.packageId ? d.packageId : null,
41
+ }));
42
+ }
43
+ /**
44
+ * Names that exist in the PUBLISHED world for a type — the plain (no
45
+ * `preview=draft`) list. One request classifies every draft of that type:
46
+ * a draft whose name is absent here is NEW; present means publish UPDATES it.
47
+ * (A per-item `/published` probe would be O(drafts) requests, and the REST
48
+ * tree has no such sub-route — the generic :name handler answers anything.)
49
+ */
50
+ async function publishedNamesOf(type) {
51
+ const res = await fetch(`/api/v1/meta/${encodeURIComponent(type)}`, {
52
+ credentials: 'include',
53
+ headers: { Accept: 'application/json' },
54
+ cache: 'no-store',
55
+ });
56
+ if (!res.ok)
57
+ throw new Error(`published list HTTP ${res.status}`);
58
+ const data = (await res.json());
59
+ const list = Array.isArray(data) ? data : data?.items ?? [];
60
+ return new Set(list
61
+ .map((it) => (typeof it?.name === 'string' ? it.name : null))
62
+ .filter((n) => n !== null));
63
+ }
64
+ export function DraftChangesPanel({ open, onOpenChange }) {
65
+ const { t } = useObjectTranslation();
66
+ const [entries, setEntries] = useState(null);
67
+ const [error, setError] = useState(null);
68
+ const load = useCallback(async () => {
69
+ setEntries(null);
70
+ setError(null);
71
+ try {
72
+ const drafts = await listPendingDrafts();
73
+ setEntries(drafts);
74
+ // Classify new-vs-update per TYPE: one published-list read covers every
75
+ // draft of that type. A type whose read fails stays unclassified
76
+ // (rendered neutrally) rather than failing the whole panel.
77
+ const types = [...new Set(drafts.map((d) => d.type))];
78
+ await Promise.all(types.map(async (type) => {
79
+ let published = null;
80
+ try {
81
+ published = await publishedNamesOf(type);
82
+ }
83
+ catch {
84
+ return;
85
+ }
86
+ setEntries((prev) => prev
87
+ ? prev.map((entry) => entry.type === type
88
+ ? { ...entry, kind: published.has(entry.name) ? 'update' : 'new' }
89
+ : entry)
90
+ : prev);
91
+ }));
92
+ }
93
+ catch (e) {
94
+ setError(e.message);
95
+ }
96
+ }, []);
97
+ useEffect(() => {
98
+ if (open)
99
+ void load();
100
+ }, [open, load]);
101
+ const byType = new Map();
102
+ for (const entry of entries ?? []) {
103
+ const bucket = byType.get(entry.type) ?? [];
104
+ bucket.push(entry);
105
+ byType.set(entry.type, bucket);
106
+ }
107
+ return (_jsx(Sheet, { open: open, onOpenChange: onOpenChange, children: _jsxs(SheetContent, { side: "right", className: "w-[420px] sm:max-w-[420px]", "data-testid": "draft-changes-panel", children: [_jsxs(SheetHeader, { children: [_jsx(SheetTitle, { children: t('preview.changes.title', { defaultValue: 'Pending changes' }) }), _jsx(SheetDescription, { children: t('preview.changes.description', {
108
+ defaultValue: 'What publishing will change. New items are added; updates overwrite the live version.',
109
+ }) })] }), _jsx("div", { className: "mt-4 flex flex-col gap-4 overflow-y-auto px-4 pb-6", children: error ? (_jsxs("p", { className: "text-sm text-destructive", children: [t('preview.changes.loadFailed', { defaultValue: 'Could not load pending changes:' }), ' ', error] })) : entries === null ? (_jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), t('preview.changes.loading', { defaultValue: 'Loading pending changes…' })] })) : entries.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('preview.changes.empty', { defaultValue: 'Nothing pending — every draft has been published.' }) })) : ([...byType.entries()].map(([type, items]) => (_jsxs("div", { children: [_jsxs("h4", { className: "mb-1.5 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: [type, " \u00B7 ", items.length] }), _jsx("ul", { className: "flex flex-col gap-1", children: items.map((entry) => (_jsxs("li", { className: "flex items-center gap-2 rounded-md border px-2.5 py-1.5 text-sm", children: [entry.kind === 'new' ? (_jsx(FilePlus2, { className: "h-3.5 w-3.5 shrink-0 text-emerald-600" })) : entry.kind === 'update' ? (_jsx(FilePen, { className: "h-3.5 w-3.5 shrink-0 text-amber-600" })) : (_jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-muted-foreground" })), _jsx("span", { className: "min-w-0 flex-1 truncate font-mono text-xs", children: entry.name }), entry.kind ? (_jsx(Badge, { variant: "outline", className: entry.kind === 'new'
110
+ ? 'border-emerald-200 bg-emerald-50 text-emerald-700'
111
+ : 'border-amber-200 bg-amber-50 text-amber-700', children: entry.kind === 'new'
112
+ ? t('preview.changes.kindNew', { defaultValue: 'New' })
113
+ : t('preview.changes.kindUpdate', { defaultValue: 'Update' }) })) : null] }, `${entry.type}:${entry.name}`))) })] }, type)))) })] }) }));
114
+ }
@@ -0,0 +1,8 @@
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
+ export declare function DraftPreviewBar(): import("react").JSX.Element | null;
@@ -0,0 +1,86 @@
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-0037 — the persistent "Draft preview" watermark. Renders only while the
11
+ * tree is in preview mode (`?preview=draft`); makes the mode unmistakable and
12
+ * offers the only two actions that matter: leave the preview, or make it real
13
+ * (the same governed one-click publish the Home banner uses). The bar is what
14
+ * keeps a read-only preview from ever being confused with the live app.
15
+ */
16
+ import { useEffect, useState } from 'react';
17
+ import { useLocation, useNavigate } from 'react-router-dom';
18
+ import { Eye, X, Rocket, GitCompareArrows } from 'lucide-react';
19
+ import { Button } from '@object-ui/components';
20
+ import { useObjectTranslation } from '@object-ui/i18n';
21
+ import { usePreviewDrafts, markPreviewExit, PREVIEW_QUERY_FLAG } from './PreviewModeContext';
22
+ import { usePublishAllDrafts } from './usePublishAllDrafts';
23
+ import { DraftChangesPanel } from './DraftChangesPanel';
24
+ export function DraftPreviewBar() {
25
+ const preview = usePreviewDrafts();
26
+ const location = useLocation();
27
+ const navigate = useNavigate();
28
+ const { t } = useObjectTranslation();
29
+ const { publishAll, publishing } = usePublishAllDrafts(t);
30
+ const [changesOpen, setChangesOpen] = useState(false);
31
+ // Pending-draft count for the Changes button label — what Publish will
32
+ // actually promote. Refreshed per pathname so drafts staged while the
33
+ // preview is open (the chat keeps building) update the count.
34
+ const [pendingCount, setPendingCount] = useState(null);
35
+ useEffect(() => {
36
+ if (!preview)
37
+ return;
38
+ let cancelled = false;
39
+ void fetch('/api/v1/meta/_drafts', {
40
+ credentials: 'include',
41
+ headers: { Accept: 'application/json' },
42
+ cache: 'no-store',
43
+ })
44
+ .then((r) => (r.ok ? r.json() : null))
45
+ .then((data) => {
46
+ if (cancelled || !data)
47
+ return;
48
+ const list = Array.isArray(data) ? data : data?.drafts ?? [];
49
+ setPendingCount(Array.isArray(list) ? list.length : null);
50
+ })
51
+ .catch(() => {
52
+ /* count is decorative — the panel itself reports errors */
53
+ });
54
+ return () => {
55
+ cancelled = true;
56
+ };
57
+ }, [preview, location.pathname]);
58
+ if (!preview)
59
+ return null;
60
+ const exit = () => {
61
+ // Tell the sticky preview keeper this is an INTENTIONAL exit, or it
62
+ // would immediately re-apply the flag we are about to remove.
63
+ markPreviewExit();
64
+ const params = new URLSearchParams(location.search);
65
+ params.delete(PREVIEW_QUERY_FLAG);
66
+ const qs = params.toString();
67
+ navigate(`${location.pathname}${qs ? `?${qs}` : ''}${location.hash}`, { replace: true });
68
+ };
69
+ const publish = async () => {
70
+ const result = await publishAll();
71
+ if (!result.ok)
72
+ return;
73
+ // The draft world just became the real world — exit preview and reload so
74
+ // every renderer re-reads the published registry.
75
+ exit();
76
+ setTimeout(() => { try {
77
+ window.location.reload();
78
+ }
79
+ catch { /* ignore */ } }, 300);
80
+ };
81
+ 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": "draft-preview-bar", children: [_jsx(Eye, { className: "h-4 w-4 shrink-0" }), _jsx("p", { className: "min-w-0 flex-1 truncate", children: t('preview.draftBar.message', {
82
+ defaultValue: 'Draft preview — you are seeing unpublished changes. Nothing here is live until you publish.',
83
+ }) }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => setChangesOpen(true), "data-testid": "draft-preview-changes", children: [_jsx(GitCompareArrows, { className: "mr-1 h-3.5 w-3.5" }), t('preview.draftBar.changes', { defaultValue: 'Changes' }), typeof pendingCount === 'number' ? ` (${pendingCount})` : ''] }), _jsxs(Button, { size: "sm", onClick: publish, disabled: publishing, "data-testid": "draft-preview-publish", children: [_jsx(Rocket, { className: "mr-1 h-3.5 w-3.5" }), publishing
84
+ ? t('preview.draftBar.publishing', { defaultValue: 'Publishing…' })
85
+ : t('preview.draftBar.publish', { defaultValue: 'Publish' })] }), _jsx(DraftChangesPanel, { open: changesOpen, onOpenChange: setChangesOpen }), _jsxs(Button, { size: "sm", variant: "outline", onClick: exit, "data-testid": "draft-preview-exit", children: [_jsx(X, { className: "mr-1 h-3.5 w-3.5" }), t('preview.draftBar.exit', { defaultValue: 'Exit preview' })] })] }));
86
+ }
@@ -0,0 +1,16 @@
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
+ export interface PreviewDraftEmptyStateProps {
9
+ /** The app the URL asked to preview (`/apps/:appName?preview=draft`). */
10
+ appName?: string;
11
+ /** Why the draft world failed to load, when it errored (null = loaded fine). */
12
+ error?: Error | null;
13
+ /** Re-read the draft overlay (MetadataProvider.refresh). */
14
+ onRetry: () => void;
15
+ }
16
+ export declare function PreviewDraftEmptyState({ appName, error, onRetry }: PreviewDraftEmptyStateProps): import("react").JSX.Element;
@@ -0,0 +1,47 @@
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-0037 — the draft preview's own empty/error states.
11
+ *
12
+ * A `?preview=draft` tree (the Live Canvas iframe, or a hand-opened preview
13
+ * URL) must NEVER fall through to the console's generic "No Apps Configured"
14
+ * screen: that screen tells the user nothing exists and offers "Create Your
15
+ * First App" — both wrong and disorienting inside a preview of an app the AI
16
+ * just drafted. Preview has exactly three honest non-happy states, all
17
+ * rendered here:
18
+ *
19
+ * - loading failed → say so, offer Retry (the overlay read errored);
20
+ * - app not in draft → the build likely failed or hasn't run — point the
21
+ * user back to the conversation, never to "create app";
22
+ * - nothing drafted → same message, generic (no app name in the URL).
23
+ *
24
+ * Deliberately CTA-free beyond Retry: the preview is a window owned by the
25
+ * build conversation; every corrective action lives there.
26
+ */
27
+ import { Eye, RefreshCw, TriangleAlert } from 'lucide-react';
28
+ import { Empty, EmptyTitle, EmptyDescription, Button } from '@object-ui/components';
29
+ import { useObjectTranslation } from '@object-ui/i18n';
30
+ export function PreviewDraftEmptyState({ appName, error, onRetry }) {
31
+ const { t } = useObjectTranslation();
32
+ const failed = Boolean(error);
33
+ return (_jsx("div", { className: "flex h-screen items-center justify-center", "data-testid": "preview-draft-empty-state", children: _jsxs(Empty, { children: [_jsx("div", { className: "mb-2 flex justify-center text-muted-foreground", "aria-hidden": "true", children: failed ? _jsx(TriangleAlert, { className: "h-8 w-8" }) : _jsx(Eye, { className: "h-8 w-8" }) }), _jsx(EmptyTitle, { children: failed
34
+ ? t('preview.empty.loadFailedTitle', { defaultValue: 'Draft preview failed to load' })
35
+ : appName
36
+ ? t('preview.empty.notReadyTitle', {
37
+ app: appName,
38
+ defaultValue: '“{{app}}” isn’t in the draft yet',
39
+ })
40
+ : t('preview.empty.nothingTitle', { defaultValue: 'Nothing to preview yet' }) }), _jsx(EmptyDescription, { children: failed
41
+ ? t('preview.empty.loadFailedDescription', {
42
+ defaultValue: 'The draft overlay could not be read. Retry, or check your connection.',
43
+ })
44
+ : t('preview.empty.notReadyDescription', {
45
+ defaultValue: 'The build may still be running, or it may have failed before this app was staged. Check the conversation for the build status — this pane refreshes as drafts land.',
46
+ }) }), _jsx("div", { className: "mt-4 flex justify-center", children: _jsxs(Button, { variant: "outline", onClick: onRetry, "data-testid": "preview-draft-retry", children: [_jsx(RefreshCw, { className: "mr-1.5 h-3.5 w-3.5" }), t('preview.empty.retry', { defaultValue: 'Retry' })] }) })] }) }));
47
+ }
@@ -0,0 +1,57 @@
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
+ * ADR-0037 Live Canvas — preview mode plumbing.
10
+ *
11
+ * One URL flag (`?preview=draft`) flips the whole renderer tree into
12
+ * "as-if-published" mode: metadata reads overlay pending ADR-0033 drafts on
13
+ * the active registry, so an unpublished app/view/dashboard renders exactly
14
+ * what Publish would make real. The canvas (and the Preview button in chat)
15
+ * navigate with this flag; everything below just reads the context.
16
+ *
17
+ * Read-only by design: preview changes the SOURCE of metadata reads, never
18
+ * writes, and Publish remains the single commit gate.
19
+ */
20
+ import { type ReactNode } from 'react';
21
+ /** Query flag that switches the console into draft-preview mode. */
22
+ export declare const PREVIEW_QUERY_FLAG = "preview";
23
+ export declare const PREVIEW_QUERY_VALUE = "draft";
24
+ /** True when `search` (a `location.search` string) carries `preview=draft`. */
25
+ export declare function isPreviewSearch(search: string): boolean;
26
+ /**
27
+ * Declare that the NEXT navigation is an intentional exit from draft preview.
28
+ * Call right before navigating away (e.g. the preview bar's Exit button);
29
+ * without it, the sticky keeper re-applies `?preview=draft` to in-app
30
+ * navigation so a click inside the previewed app can't silently drop the
31
+ * draft world mid-session.
32
+ */
33
+ export declare function markPreviewExit(): void;
34
+ /**
35
+ * Provides the preview-mode flag to the tree. Reads the router location
36
+ * LIVE, so entering/leaving `?preview=draft` flips consumers without a
37
+ * remount. `force` overrides the URL — the Live Canvas mounts its embedded
38
+ * renderer subtree with `force` so the canvas is always a draft window
39
+ * regardless of the host page's own URL.
40
+ *
41
+ * STICKY by design: preview is URL-keyed, but in-app navigation (the app's
42
+ * landing redirect, sidebar links, row clicks) builds URLs without the
43
+ * query string. Once the tree is in preview, this provider re-applies the
44
+ * flag (history REPLACE, no extra entry) to any same-session navigation
45
+ * that lost it — so the only way out of the draft world is the explicit
46
+ * Exit affordance ({@link markPreviewExit}), never an accidental click.
47
+ */
48
+ export declare function PreviewModeProvider({ force, children }: {
49
+ force?: boolean;
50
+ children: ReactNode;
51
+ }): import("react").JSX.Element;
52
+ /**
53
+ * Whether the current tree renders the draft-overlaid world. Defaults to
54
+ * false outside a provider, so surfaces that never mount preview (login,
55
+ * bare pages) keep reading published metadata only.
56
+ */
57
+ export declare function usePreviewDrafts(): boolean;
@@ -0,0 +1,99 @@
1
+ import { jsx as _jsx } 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-0037 Live Canvas — preview mode plumbing.
11
+ *
12
+ * One URL flag (`?preview=draft`) flips the whole renderer tree into
13
+ * "as-if-published" mode: metadata reads overlay pending ADR-0033 drafts on
14
+ * the active registry, so an unpublished app/view/dashboard renders exactly
15
+ * what Publish would make real. The canvas (and the Preview button in chat)
16
+ * navigate with this flag; everything below just reads the context.
17
+ *
18
+ * Read-only by design: preview changes the SOURCE of metadata reads, never
19
+ * writes, and Publish remains the single commit gate.
20
+ */
21
+ import { createContext, useContext, useEffect, useMemo, useState } from 'react';
22
+ import { useLocation, useNavigate } from 'react-router-dom';
23
+ const PreviewModeContext = createContext(false);
24
+ /** Query flag that switches the console into draft-preview mode. */
25
+ export const PREVIEW_QUERY_FLAG = 'preview';
26
+ export const PREVIEW_QUERY_VALUE = 'draft';
27
+ /** True when `search` (a `location.search` string) carries `preview=draft`. */
28
+ export function isPreviewSearch(search) {
29
+ return new URLSearchParams(search).get(PREVIEW_QUERY_FLAG) === PREVIEW_QUERY_VALUE;
30
+ }
31
+ // Set by markPreviewExit() for exactly one navigation: the user explicitly
32
+ // left preview (DraftPreviewBar's Exit / post-publish), so the keeper below
33
+ // must NOT re-stick the flag onto the next location.
34
+ let previewExitRequested = false;
35
+ /**
36
+ * Declare that the NEXT navigation is an intentional exit from draft preview.
37
+ * Call right before navigating away (e.g. the preview bar's Exit button);
38
+ * without it, the sticky keeper re-applies `?preview=draft` to in-app
39
+ * navigation so a click inside the previewed app can't silently drop the
40
+ * draft world mid-session.
41
+ */
42
+ export function markPreviewExit() {
43
+ previewExitRequested = true;
44
+ }
45
+ /**
46
+ * Provides the preview-mode flag to the tree. Reads the router location
47
+ * LIVE, so entering/leaving `?preview=draft` flips consumers without a
48
+ * remount. `force` overrides the URL — the Live Canvas mounts its embedded
49
+ * renderer subtree with `force` so the canvas is always a draft window
50
+ * regardless of the host page's own URL.
51
+ *
52
+ * STICKY by design: preview is URL-keyed, but in-app navigation (the app's
53
+ * landing redirect, sidebar links, row clicks) builds URLs without the
54
+ * query string. Once the tree is in preview, this provider re-applies the
55
+ * flag (history REPLACE, no extra entry) to any same-session navigation
56
+ * that lost it — so the only way out of the draft world is the explicit
57
+ * Exit affordance ({@link markPreviewExit}), never an accidental click.
58
+ */
59
+ export function PreviewModeProvider({ force, children }) {
60
+ const location = useLocation();
61
+ const navigate = useNavigate();
62
+ const fromUrl = useMemo(() => isPreviewSearch(location.search), [location.search]);
63
+ // Sticky state: stays true across the flag-less navigation window so the
64
+ // CONTEXT VALUE never flickers false mid-session. A flicker is not benign —
65
+ // it swaps the whole metadata source to published for one render, which
66
+ // (a) wastes a full refetch and (b) feeds cross-world diffs to effects
67
+ // like NavigationSyncEffect that must never see the two worlds as one
68
+ // timeline (that misread once WROTE nav changes from inside a preview).
69
+ const [sticky, setSticky] = useState(fromUrl);
70
+ useEffect(() => {
71
+ if (fromUrl) {
72
+ setSticky(true);
73
+ previewExitRequested = false;
74
+ return;
75
+ }
76
+ if (!sticky)
77
+ return;
78
+ if (previewExitRequested) {
79
+ previewExitRequested = false;
80
+ setSticky(false);
81
+ return;
82
+ }
83
+ // In-app navigation lost the flag without an explicit exit — restore it
84
+ // in place (history REPLACE, no extra entry) so a refresh/share of the
85
+ // URL stays in the draft world too.
86
+ const params = new URLSearchParams(location.search);
87
+ params.set(PREVIEW_QUERY_FLAG, PREVIEW_QUERY_VALUE);
88
+ navigate(`${location.pathname}?${params.toString()}${location.hash}`, { replace: true });
89
+ }, [fromUrl, sticky, location.pathname, location.search, location.hash, navigate]);
90
+ return (_jsx(PreviewModeContext.Provider, { value: force ?? (fromUrl || sticky), children: children }));
91
+ }
92
+ /**
93
+ * Whether the current tree renders the draft-overlaid world. Defaults to
94
+ * false outside a provider, so surfaces that never mount preview (login,
95
+ * bare pages) keep reading published metadata only.
96
+ */
97
+ export function usePreviewDrafts() {
98
+ return useContext(PreviewModeContext);
99
+ }
@@ -0,0 +1,8 @@
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
+ export declare function UnpublishedAppBar(): import("react").JSX.Element | null;