@object-ui/app-shell 6.2.3 → 7.1.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 (486) hide show
  1. package/CHANGELOG.md +1229 -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 +184 -39
  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 +747 -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 +28 -0
  27. package/dist/console/ai/LiveCanvas.js +80 -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 +137 -4
  90. package/dist/hooks/useChatConversation.js +316 -25
  91. package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
  92. package/dist/hooks/useConsoleActionRuntime.js +564 -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 +18 -8
  110. package/dist/index.js +17 -5
  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 +34 -2
  124. package/dist/layout/ConsoleFloatingChatbot.js +391 -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 +242 -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/layout/agentPicker.d.ts +56 -0
  140. package/dist/layout/agentPicker.js +40 -0
  141. package/dist/observability/index.d.ts +1 -0
  142. package/dist/observability/index.js +1 -0
  143. package/dist/observability/settleSignal.d.ts +64 -0
  144. package/dist/observability/settleSignal.js +131 -0
  145. package/dist/preview/CommitTimeline.d.ts +15 -0
  146. package/dist/preview/CommitTimeline.js +82 -0
  147. package/dist/preview/DraftChangesPanel.d.ts +19 -0
  148. package/dist/preview/DraftChangesPanel.js +114 -0
  149. package/dist/preview/DraftPreviewBar.d.ts +8 -0
  150. package/dist/preview/DraftPreviewBar.js +86 -0
  151. package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
  152. package/dist/preview/PreviewDraftEmptyState.js +47 -0
  153. package/dist/preview/PreviewModeContext.d.ts +57 -0
  154. package/dist/preview/PreviewModeContext.js +99 -0
  155. package/dist/preview/UnpublishedAppBar.d.ts +8 -0
  156. package/dist/preview/UnpublishedAppBar.js +83 -0
  157. package/dist/preview/commitHistory.d.ts +28 -0
  158. package/dist/preview/commitHistory.js +48 -0
  159. package/dist/preview/draftStatus.d.ts +20 -0
  160. package/dist/preview/draftStatus.js +27 -0
  161. package/dist/preview/usePublishAllDrafts.d.ts +18 -0
  162. package/dist/preview/usePublishAllDrafts.js +106 -0
  163. package/dist/providers/AdapterProvider.d.ts +1 -1
  164. package/dist/providers/AdapterProvider.js +6 -1
  165. package/dist/providers/ExpressionProvider.d.ts +1 -1
  166. package/dist/providers/MetadataProvider.d.ts +17 -2
  167. package/dist/providers/MetadataProvider.js +192 -12
  168. package/dist/runtime-config.d.ts +46 -2
  169. package/dist/runtime-config.js +39 -2
  170. package/dist/services/builtinComponents.js +68 -59
  171. package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
  172. package/dist/skeletons/SkeletonDetail.d.ts +1 -1
  173. package/dist/skeletons/SkeletonGrid.d.ts +1 -1
  174. package/dist/utils/appRoute.d.ts +21 -0
  175. package/dist/utils/appRoute.js +25 -0
  176. package/dist/utils/deriveRelatedLists.d.ts +54 -0
  177. package/dist/utils/deriveRelatedLists.js +91 -0
  178. package/dist/utils/index.d.ts +4 -0
  179. package/dist/utils/index.js +3 -0
  180. package/dist/utils/managedByEmptyState.d.ts +8 -1
  181. package/dist/utils/managedByEmptyState.js +13 -7
  182. package/dist/utils/preferLocal.d.ts +18 -0
  183. package/dist/utils/preferLocal.js +24 -0
  184. package/dist/views/ActionConfirmDialog.d.ts +1 -1
  185. package/dist/views/ActionConfirmDialog.js +3 -1
  186. package/dist/views/ActionParamDialog.d.ts +6 -1
  187. package/dist/views/ActionParamDialog.js +9 -3
  188. package/dist/views/ActionResultDialog.d.ts +13 -0
  189. package/dist/views/ActionResultDialog.js +134 -0
  190. package/dist/views/ComponentNavView.d.ts +14 -1
  191. package/dist/views/CreateViewDialog.d.ts +1 -1
  192. package/dist/views/DashboardConfigPanel.d.ts +28 -0
  193. package/dist/views/DashboardConfigPanel.js +81 -0
  194. package/dist/views/DashboardView.d.ts +4 -3
  195. package/dist/views/DashboardView.js +38 -239
  196. package/dist/views/FlowRunner.d.ts +31 -0
  197. package/dist/views/FlowRunner.js +121 -0
  198. package/dist/views/InterfaceListPage.d.ts +49 -0
  199. package/dist/views/InterfaceListPage.js +347 -0
  200. package/dist/views/MetadataInspector.d.ts +2 -2
  201. package/dist/views/ObjectView.d.ts +1 -1
  202. package/dist/views/ObjectView.js +209 -532
  203. package/dist/views/PageView.d.ts +8 -3
  204. package/dist/views/PageView.js +45 -32
  205. package/dist/views/RecordDetailView.d.ts +1 -1
  206. package/dist/views/RecordDetailView.js +363 -148
  207. package/dist/views/RecordFormPage.d.ts +1 -1
  208. package/dist/views/RecordFormPage.js +26 -1
  209. package/dist/views/ReportConfigPanel.d.ts +37 -0
  210. package/dist/views/ReportConfigPanel.js +85 -0
  211. package/dist/views/ReportView.d.ts +1 -1
  212. package/dist/views/ReportView.js +116 -7
  213. package/dist/views/RuntimeDraftBar.d.ts +30 -0
  214. package/dist/views/RuntimeDraftBar.js +112 -0
  215. package/dist/views/ScreenView.d.ts +70 -0
  216. package/dist/views/ScreenView.js +73 -0
  217. package/dist/views/SearchResultsPage.d.ts +1 -1
  218. package/dist/views/SearchResultsPage.js +8 -18
  219. package/dist/views/ViewConfigPanel.d.ts +24 -17
  220. package/dist/views/ViewConfigPanel.js +121 -77
  221. package/dist/views/index.d.ts +1 -1
  222. package/dist/views/index.js +1 -1
  223. package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
  224. package/dist/views/metadata-admin/AuditPanel.js +79 -0
  225. package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
  226. package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
  227. package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
  228. package/dist/views/metadata-admin/DirectoryPage.js +101 -24
  229. package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
  230. package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
  231. package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
  232. package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
  233. package/dist/views/metadata-admin/JsonSourceEditor.d.ts +39 -0
  234. package/dist/views/metadata-admin/JsonSourceEditor.js +196 -0
  235. package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
  236. package/dist/views/metadata-admin/LayeredDiff.js +171 -5
  237. package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
  238. package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
  239. package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
  240. package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
  241. package/dist/views/metadata-admin/PackagesPage.js +403 -0
  242. package/dist/views/metadata-admin/PageShell.d.ts +1 -1
  243. package/dist/views/metadata-admin/PageShell.js +9 -4
  244. package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
  245. package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
  246. package/dist/views/metadata-admin/QuickFind.js +6 -3
  247. package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
  248. package/dist/views/metadata-admin/RelatedPanel.js +20 -18
  249. package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
  250. package/dist/views/metadata-admin/ResourceEditPage.js +1250 -60
  251. package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
  252. package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
  253. package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
  254. package/dist/views/metadata-admin/ResourceListPage.js +258 -30
  255. package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
  256. package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
  257. package/dist/views/metadata-admin/SchemaForm.js +559 -49
  258. package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
  259. package/dist/views/metadata-admin/StudioHomePage.js +205 -0
  260. package/dist/views/metadata-admin/anchors.js +255 -24
  261. package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
  262. package/dist/views/metadata-admin/clientValidation.js +169 -0
  263. package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
  264. package/dist/views/metadata-admin/color-variant-field.js +38 -0
  265. package/dist/views/metadata-admin/createDerive.d.ts +75 -0
  266. package/dist/views/metadata-admin/createDerive.js +179 -0
  267. package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
  268. package/dist/views/metadata-admin/dashboard-schema.js +80 -0
  269. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
  270. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
  271. package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
  272. package/dist/views/metadata-admin/datasource/register.js +24 -0
  273. package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
  274. package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
  275. package/dist/views/metadata-admin/default-schemas.js +115 -10
  276. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
  277. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
  278. package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
  279. package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
  280. package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
  281. package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
  282. package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
  283. package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
  284. package/dist/views/metadata-admin/external/api.d.ts +100 -0
  285. package/dist/views/metadata-admin/external/api.js +124 -0
  286. package/dist/views/metadata-admin/i18n.d.ts +1 -0
  287. package/dist/views/metadata-admin/i18n.js +1252 -2
  288. package/dist/views/metadata-admin/index.d.ts +8 -5
  289. package/dist/views/metadata-admin/index.js +12 -2
  290. package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
  291. package/dist/views/metadata-admin/inspector-registry.js +11 -0
  292. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
  293. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
  294. package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
  295. package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
  296. package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
  297. package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
  298. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
  299. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
  300. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
  301. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
  302. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
  303. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +221 -0
  304. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
  305. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +126 -0
  306. package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
  307. package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
  308. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
  309. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
  310. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
  311. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
  312. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
  313. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +205 -0
  314. package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
  315. package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
  316. package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
  317. package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
  318. package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
  319. package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
  320. package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
  321. package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
  322. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
  323. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +55 -0
  324. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
  325. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +365 -0
  326. package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
  327. package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
  328. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
  329. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +218 -0
  330. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
  331. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
  332. package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
  333. package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
  334. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
  335. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
  336. package/dist/views/metadata-admin/inspectors/_shared.d.ts +128 -0
  337. package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
  338. package/dist/views/metadata-admin/inspectors/datasetFilterCondition.d.ts +24 -0
  339. package/dist/views/metadata-admin/inspectors/datasetFilterCondition.js +97 -0
  340. package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
  341. package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
  342. package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
  343. package/dist/views/metadata-admin/inspectors/flow-node-config.js +506 -0
  344. package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
  345. package/dist/views/metadata-admin/inspectors/index.js +45 -0
  346. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
  347. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
  348. package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
  349. package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
  350. package/dist/views/metadata-admin/issuePath.d.ts +22 -0
  351. package/dist/views/metadata-admin/issuePath.js +65 -0
  352. package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
  353. package/dist/views/metadata-admin/mergeServerFields.js +56 -0
  354. package/dist/views/metadata-admin/package-scope.d.ts +26 -0
  355. package/dist/views/metadata-admin/package-scope.js +43 -0
  356. package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
  357. package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
  358. package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
  359. package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
  360. package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
  361. package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
  362. package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
  363. package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
  364. package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
  365. package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
  366. package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
  367. package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
  368. package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
  369. package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
  370. package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
  371. package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
  372. package/dist/views/metadata-admin/previews/DatasetPreview.js +105 -0
  373. package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
  374. package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
  375. package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
  376. package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
  377. package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
  378. package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
  379. package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
  380. package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +49 -0
  381. package/dist/views/metadata-admin/previews/FlowCanvas.js +416 -0
  382. package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
  383. package/dist/views/metadata-admin/previews/FlowPreview.js +120 -0
  384. package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
  385. package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
  386. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
  387. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +204 -0
  388. package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
  389. package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
  390. package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
  391. package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
  392. package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
  393. package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
  394. package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
  395. package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
  396. package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
  397. package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
  398. package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
  399. package/dist/views/metadata-admin/previews/PagePreview.js +200 -5
  400. package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
  401. package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
  402. package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
  403. package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
  404. package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
  405. package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
  406. package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
  407. package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
  408. package/dist/views/metadata-admin/previews/ScreenPreview.d.ts +38 -0
  409. package/dist/views/metadata-admin/previews/ScreenPreview.js +61 -0
  410. package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
  411. package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
  412. package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
  413. package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
  414. package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
  415. package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
  416. package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
  417. package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
  418. package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
  419. package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
  420. package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
  421. package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
  422. package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
  423. package/dist/views/metadata-admin/previews/block-config.js +324 -0
  424. package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
  425. package/dist/views/metadata-admin/previews/block-types.js +110 -0
  426. package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
  427. package/dist/views/metadata-admin/previews/field-types.js +97 -0
  428. package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +102 -0
  429. package/dist/views/metadata-admin/previews/flow-canvas-layout.js +227 -0
  430. package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +96 -0
  431. package/dist/views/metadata-admin/previews/flow-canvas-parts.js +373 -0
  432. package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
  433. package/dist/views/metadata-admin/previews/form-preview.js +29 -0
  434. package/dist/views/metadata-admin/previews/index.js +43 -0
  435. package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
  436. package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
  437. package/dist/views/metadata-admin/previews/object-fields-io.d.ts +130 -0
  438. package/dist/views/metadata-admin/previews/object-fields-io.js +243 -0
  439. package/dist/views/metadata-admin/previews/screen-spec.d.ts +43 -0
  440. package/dist/views/metadata-admin/previews/screen-spec.js +108 -0
  441. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +102 -0
  442. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
  443. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +15 -0
  444. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +185 -0
  445. package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +73 -0
  446. package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +426 -0
  447. package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
  448. package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
  449. package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
  450. package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
  451. package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
  452. package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
  453. package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
  454. package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
  455. package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
  456. package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
  457. package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
  458. package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
  459. package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
  460. package/dist/views/metadata-admin/previews/widget-types.js +40 -0
  461. package/dist/views/metadata-admin/registry.d.ts +140 -19
  462. package/dist/views/metadata-admin/report-schema.d.ts +26 -0
  463. package/dist/views/metadata-admin/report-schema.js +121 -0
  464. package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
  465. package/dist/views/metadata-admin/useMetadata.js +155 -4
  466. package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
  467. package/dist/views/metadata-admin/view-item-normalize.js +68 -0
  468. package/dist/views/metadata-admin/view-schema.d.ts +16 -0
  469. package/dist/views/metadata-admin/view-schema.js +107 -0
  470. package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
  471. package/dist/views/metadata-admin/view-variant-model.js +64 -0
  472. package/dist/views/metadata-admin/widgets.d.ts +89 -1
  473. package/dist/views/metadata-admin/widgets.js +491 -17
  474. package/dist/views/runtime-metadata-persistence.d.ts +78 -0
  475. package/dist/views/runtime-metadata-persistence.js +89 -0
  476. package/dist/views/useOpenRecordList.d.ts +18 -0
  477. package/dist/views/useOpenRecordList.js +36 -0
  478. package/dist/views/userFilterUrlState.d.ts +15 -0
  479. package/dist/views/userFilterUrlState.js +53 -0
  480. package/dist/views/view-config-adapter.d.ts +38 -0
  481. package/dist/views/view-config-adapter.js +80 -0
  482. package/package.json +52 -34
  483. package/dist/views/DesignDrawer.d.ts +0 -28
  484. package/dist/views/DesignDrawer.js +0 -51
  485. package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
  486. package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
@@ -0,0 +1,56 @@
1
+ /**
2
+ * agentPicker
3
+ *
4
+ * Pure decision logic for the floating assistant's Build/Ask switcher. Kept in
5
+ * its own module (no React, no chat deps) so it can be unit-tested without
6
+ * dragging in the heavy chat component graph (FloatingChatbot → streamdown →
7
+ * shiki → @ai-sdk, ~20MB) that `ConsoleFloatingChatbot` pulls in.
8
+ * @module
9
+ */
10
+ import { type AgentDescriptor } from '@object-ui/plugin-chatbot';
11
+ /** Minimal catalog shape the decision needs — just the agent name. */
12
+ type AgentLike = Pick<AgentDescriptor, 'name'>;
13
+ export interface AgentPickerDecisionInput {
14
+ /** Live agent catalog from `useAgents` (the single source of truth). */
15
+ agents: AgentLike[];
16
+ /**
17
+ * Explicit host override. When defined it wins outright — `true` forces the
18
+ * switcher on, `false` forces it off — regardless of catalog or env.
19
+ */
20
+ showAgentPickerProp?: boolean;
21
+ /**
22
+ * `VITE_AI_SHOW_AGENT_PICKER === 'true'` — the power-user / admin global
23
+ * escape hatch that forces the switcher on without touching app metadata.
24
+ */
25
+ envOptIn?: boolean;
26
+ /**
27
+ * Whether AI Studio (authoring / "online development") is enabled for this
28
+ * deployment. When off, the build agent must not be reachable from the panel,
29
+ * so the auto-reveal is suppressed even if the catalog still serves `build`.
30
+ * Mirrors `ConsoleLayout`'s `aiStudioEnabled` gate. Defaults to true.
31
+ */
32
+ aiStudioEnabled?: boolean;
33
+ }
34
+ /**
35
+ * True when the live catalog exposes BOTH a data/query (`ask`) and an authoring
36
+ * (`build`) agent — alias-aware via {@link isAskAgent}/{@link isBuildAgent}, so
37
+ * a catalog still serving the legacy `data_chat`/`metadata_assistant` ids counts
38
+ * too. This is the "AI development is unlocked for this viewer" signal, the same
39
+ * `askAvailable && buildAvailable` notion HomePage uses to surface "Build with AI".
40
+ */
41
+ export declare function isAiDevUnlocked(agents: AgentLike[]): boolean;
42
+ /**
43
+ * Decide whether the floating assistant should reveal its Build/Ask switcher.
44
+ *
45
+ * Restrained by design (the original "end users shouldn't have to choose" rule):
46
+ * a pure end-user surface bound to a single `ask` agent never sees it. Precedence:
47
+ * 1. `showAgentPickerProp` — explicit host override wins (`true`/`false`).
48
+ * 2. `envOptIn` — `VITE_AI_SHOW_AGENT_PICKER` forces it on globally.
49
+ * 3. Auto-reveal — AI development is unlocked ({@link isAiDevUnlocked}) AND
50
+ * authoring isn't deployment-disabled (`aiStudioEnabled`).
51
+ *
52
+ * Returns the *intent* only: the render site still requires more than one agent
53
+ * (`agents.length > 1`) to draw an actual choice.
54
+ */
55
+ export declare function shouldShowAgentPicker({ agents, showAgentPickerProp, envOptIn, aiStudioEnabled, }: AgentPickerDecisionInput): boolean;
56
+ export {};
@@ -0,0 +1,40 @@
1
+ /**
2
+ * agentPicker
3
+ *
4
+ * Pure decision logic for the floating assistant's Build/Ask switcher. Kept in
5
+ * its own module (no React, no chat deps) so it can be unit-tested without
6
+ * dragging in the heavy chat component graph (FloatingChatbot → streamdown →
7
+ * shiki → @ai-sdk, ~20MB) that `ConsoleFloatingChatbot` pulls in.
8
+ * @module
9
+ */
10
+ import { isAskAgent, isBuildAgent } from '@object-ui/plugin-chatbot';
11
+ /**
12
+ * True when the live catalog exposes BOTH a data/query (`ask`) and an authoring
13
+ * (`build`) agent — alias-aware via {@link isAskAgent}/{@link isBuildAgent}, so
14
+ * a catalog still serving the legacy `data_chat`/`metadata_assistant` ids counts
15
+ * too. This is the "AI development is unlocked for this viewer" signal, the same
16
+ * `askAvailable && buildAvailable` notion HomePage uses to surface "Build with AI".
17
+ */
18
+ export function isAiDevUnlocked(agents) {
19
+ return (agents.some((a) => isAskAgent(a.name)) && agents.some((a) => isBuildAgent(a.name)));
20
+ }
21
+ /**
22
+ * Decide whether the floating assistant should reveal its Build/Ask switcher.
23
+ *
24
+ * Restrained by design (the original "end users shouldn't have to choose" rule):
25
+ * a pure end-user surface bound to a single `ask` agent never sees it. Precedence:
26
+ * 1. `showAgentPickerProp` — explicit host override wins (`true`/`false`).
27
+ * 2. `envOptIn` — `VITE_AI_SHOW_AGENT_PICKER` forces it on globally.
28
+ * 3. Auto-reveal — AI development is unlocked ({@link isAiDevUnlocked}) AND
29
+ * authoring isn't deployment-disabled (`aiStudioEnabled`).
30
+ *
31
+ * Returns the *intent* only: the render site still requires more than one agent
32
+ * (`agents.length > 1`) to draw an actual choice.
33
+ */
34
+ export function shouldShowAgentPicker({ agents, showAgentPickerProp, envOptIn = false, aiStudioEnabled = true, }) {
35
+ if (showAgentPickerProp !== undefined)
36
+ return showAgentPickerProp;
37
+ if (envOptIn)
38
+ return true;
39
+ return aiStudioEnabled && isAiDevUnlocked(agents);
40
+ }
@@ -7,3 +7,4 @@
7
7
  * @module
8
8
  */
9
9
  export { initSentry, captureError, setSentryUser, getSentry } from './sentry';
10
+ export { beginRequest, endRequest, getPendingRequests, isIdle, subscribeSettle, whenIdle, withSettleSignal, installSettleSignalGlobal, type ObjectUiGlobal, } from './settleSignal';
@@ -7,3 +7,4 @@
7
7
  * @module
8
8
  */
9
9
  export { initSentry, captureError, setSentryUser, getSentry } from './sentry';
10
+ export { beginRequest, endRequest, getPendingRequests, isIdle, subscribeSettle, whenIdle, withSettleSignal, installSettleSignalGlobal, } from './settleSignal';
@@ -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,15 @@
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 CommitTimelineProps {
9
+ open: boolean;
10
+ onOpenChange: (open: boolean) => void;
11
+ packageId: string;
12
+ /** Called after a successful revert so the host can refresh the app view. */
13
+ onReverted?: () => void;
14
+ }
15
+ export declare function CommitTimeline({ open, onOpenChange, packageId, onReverted }: CommitTimelineProps): import("react").JSX.Element;
@@ -0,0 +1,82 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } 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-0067 — the package "Build history" timeline. Lists every commit an AI
11
+ * build (or edit) landed, newest-first, with "Revert" per apply commit: undo
12
+ * that change set (artifacts it created are soft-removed; ones it edited are
13
+ * restored) as a NEW append-only revert commit. This is the history-not-confirm
14
+ * surface — the user reviews and reverts instead of approving each publish.
15
+ *
16
+ * Sibling of DraftChangesPanel (which lists PENDING drafts before a publish);
17
+ * this lists what already LANDED, and can undo it.
18
+ */
19
+ import { useCallback, useEffect, useState } from 'react';
20
+ import { GitBranch, Undo2, Loader2 } from 'lucide-react';
21
+ import { toast } from 'sonner';
22
+ import { Badge, Button, Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from '@object-ui/components';
23
+ import { useObjectTranslation } from '@object-ui/i18n';
24
+ import { fetchCommits, revertCommit } from './commitHistory';
25
+ function relativeTime(iso) {
26
+ if (!iso)
27
+ return '';
28
+ const then = Date.parse(iso);
29
+ if (Number.isNaN(then))
30
+ return '';
31
+ const secs = Math.max(0, Math.round((Date.now() - then) / 1000));
32
+ if (secs < 60)
33
+ return `${secs}s`;
34
+ const mins = Math.round(secs / 60);
35
+ if (mins < 60)
36
+ return `${mins}m`;
37
+ const hrs = Math.round(mins / 60);
38
+ if (hrs < 24)
39
+ return `${hrs}h`;
40
+ return `${Math.round(hrs / 24)}d`;
41
+ }
42
+ export function CommitTimeline({ open, onOpenChange, packageId, onReverted }) {
43
+ const { t } = useObjectTranslation();
44
+ const [commits, setCommits] = useState(null);
45
+ const [error, setError] = useState(null);
46
+ const [reverting, setReverting] = useState(null);
47
+ const load = useCallback(async () => {
48
+ setCommits(null);
49
+ setError(null);
50
+ try {
51
+ setCommits(await fetchCommits(packageId));
52
+ }
53
+ catch (e) {
54
+ setError(e.message);
55
+ }
56
+ }, [packageId]);
57
+ useEffect(() => {
58
+ if (open)
59
+ void load();
60
+ }, [open, load]);
61
+ const onRevert = async (commitId) => {
62
+ setReverting(commitId);
63
+ try {
64
+ await revertCommit(packageId, commitId);
65
+ toast.success(t('preview.history.reverted', { defaultValue: 'Reverted — the change has been undone.' }));
66
+ onReverted?.();
67
+ await load();
68
+ }
69
+ catch (e) {
70
+ toast.error(`${t('preview.history.revertFailed', { defaultValue: 'Revert failed' })}: ${e.message}`);
71
+ }
72
+ finally {
73
+ setReverting(null);
74
+ }
75
+ };
76
+ return (_jsx(Sheet, { open: open, onOpenChange: onOpenChange, children: _jsxs(SheetContent, { side: "right", className: "w-[420px] sm:max-w-[420px]", "data-testid": "commit-timeline-panel", children: [_jsxs(SheetHeader, { children: [_jsx(SheetTitle, { children: t('preview.history.title', { defaultValue: 'Build history' }) }), _jsx(SheetDescription, { children: t('preview.history.description', {
77
+ defaultValue: 'Every change to this app, newest first. Revert any step to undo it — no publish confirmation needed.',
78
+ }) })] }), _jsx("div", { className: "mt-4 flex flex-col gap-2 overflow-y-auto px-4 pb-6", children: error ? (_jsxs("p", { className: "text-sm text-destructive", children: [t('preview.history.loadFailed', { defaultValue: 'Could not load history:' }), " ", error] })) : commits === 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.history.loading', { defaultValue: 'Loading history…' })] })) : commits.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('preview.history.empty', { defaultValue: 'No history yet for this app.' }) })) : (commits.map((c) => (_jsxs("div", { className: "flex items-start gap-2.5 rounded-md border px-2.5 py-2 text-sm", "data-testid": "commit-row", children: [_jsx(GitBranch, { className: `mt-0.5 h-4 w-4 shrink-0 ${c.operation === 'revert' ? 'text-muted-foreground' : 'text-primary'}` }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate font-medium", children: c.message ??
79
+ (c.operation === 'revert'
80
+ ? t('preview.history.revertLabel', { defaultValue: 'Reverted a change' })
81
+ : t('preview.history.applyLabel', { defaultValue: 'Build change' })) }), _jsxs("p", { className: "mt-0.5 flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground", children: [c.operation === 'revert' ? (_jsx(Badge, { variant: "outline", className: "border-muted-foreground/30", children: t('preview.history.revert', { defaultValue: 'revert' }) })) : null, _jsxs("span", { children: [c.itemCount, " ", t('preview.history.items', { defaultValue: 'item(s)' })] }), c.actor ? _jsxs("span", { children: ["\u00B7 ", c.actor] }) : null, c.createdAt ? _jsxs("span", { children: ["\u00B7 ", relativeTime(c.createdAt)] }) : null] })] }), c.operation === 'apply' ? (_jsx(Button, { size: "sm", variant: "ghost", className: "shrink-0", disabled: reverting !== null, onClick: () => onRevert(c.id), "data-testid": "commit-revert", children: reverting === c.id ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" })) : (_jsxs(_Fragment, { children: [_jsx(Undo2, { className: "mr-1 h-3.5 w-3.5" }), t('preview.history.revertAction', { defaultValue: 'Revert' })] })) })) : null] }, c.id)))) })] }) }));
82
+ }
@@ -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;