@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,953 @@
1
1
  # @object-ui/app-shell — Changelog
2
2
 
3
+ ## 7.0.0
4
+
5
+ ### Minor Changes
6
+
7
+ - a00e16d: feat: evaluate CEL `disabled` on action buttons + record-page Undo wiring
8
+
9
+ - **components (page header)**: the `record_header` action toolbar now evaluates
10
+ a CEL `disabled` predicate against the record (boolean was the only honoured
11
+ form before), mirroring its existing `visible` evaluation. An action can now
12
+ grey out conditionally (e.g. "Reassign" on a converted lead) instead of only
13
+ hiding via `visible`.
14
+ - **plugin-grid (row menu)**: `RowActionMenu` items likewise evaluate `disabled`
15
+ (boolean or CEL against the row), and skip the click when disabled.
16
+ - **components (action-button)**: forward `undoable` / `recordIdField` when
17
+ executing, so undoable update actions keep their Undo affordance through the
18
+ `action:button` path.
19
+ - **app-shell (RecordDetailView)**: mount `useGlobalUndo` and wire the record
20
+ action runtime's success toast to offer "Undo" for `undoable` actions
21
+ (capturing the changed fields' prior values from the loaded record).
22
+ - **plugin-detail (record:quick_actions)**: the widget's buttons now evaluate a
23
+ CEL `disabled` and show a spinner + disable while running.
24
+
25
+ - 11ef5e3: Action modal transport with placement (SDUI opt #2).
26
+
27
+ `useActionModal` provides a reusable `onModal` handler that renders an action's modal envelope in the right container by `placement`: `center` (Dialog), `side` (Sheet), `bottom` (Drawer), `fullscreen`. `content` is an arbitrary SchemaNode rendered via `SchemaRenderer`, so a modal action can open any page/form/list; string targets / `{objectName, mode}` keep opening a `ModalForm`. Wired into `RecordDetailView` so `type:'modal'` actions open client-side (previously routed to a server POST).
28
+
29
+ - f7f325d: feat: action progress state + Undo affordance
30
+
31
+ - **core**: `ActionResult.undo` (an `UndoableOperation`) and `ActionDef.undoable`.
32
+ On success the `ActionRunner` pushes the operation onto the global UndoManager
33
+ and the success toast carries an "Undo" affordance (`ToastHandler` gains an
34
+ `undo` option).
35
+ - **app-shell**: the console action runtime mounts `useGlobalUndo` (Ctrl+Z /
36
+ Ctrl+Shift+Z) and renders the toast's "Undo" button; its `apiHandler` resolves
37
+ the row id from the list row record and, for `undoable` actions, captures the
38
+ changed fields' prior values so the update can be reverted.
39
+ - **plugin-detail**: record-header quick-action buttons show a spinner + disable
40
+ while the action runs (a visible progress state for slow/flow actions).
41
+
42
+ - c12986e: Add resultDialog + target interpolation for one-shot action reveals
43
+
44
+ Some platform actions return values the user MUST copy now because the
45
+ server will not surface them again — 2FA TOTP URI + backup codes, freshly
46
+ minted OAuth client_secret, regenerated recovery codes. Previously these
47
+ had to ship as bespoke pages in `apps/account` because actions only
48
+ emitted a fire-and-forget toast.
49
+
50
+ **`@object-ui/core` — ActionRunner**
51
+
52
+ - New `ActionDef.resultDialog: ResultDialogSpec` field. When set on a
53
+ successful action, the runner suppresses the `successMessage` toast and
54
+ awaits the registered `ResultDialogHandler` instead. Missing handler is
55
+ non-fatal (logs a warning); rejected handler is treated as acknowledged.
56
+ - New `setResultDialogHandler(handler)` setter.
57
+ - New types: `ResultDialogSpec`, `ResultDialogFieldSpec`,
58
+ `ResultDialogHandler`.
59
+ - `executeUrl` and `executeAPI` now run `${param.X}` and `${ctx.X}`
60
+ interpolation against `target` before fetching / navigating. Values are
61
+ `encodeURIComponent`'d, missing keys resolve to empty string. `ctx`
62
+ exposes `origin`, `user`, `org`, `recordId` by default; consumers can
63
+ inject more via `context.ctx`.
64
+
65
+ **`@object-ui/react`**
66
+
67
+ - `ActionProvider` and `useActionRunner` both gained an `onResultDialog`
68
+ option that wires straight through to the runner.
69
+
70
+ **`@object-ui/app-shell`**
71
+
72
+ - New `ActionResultDialog` component — promise-based, blocks click-outside
73
+ and Escape (the user MUST click acknowledge), renders five field
74
+ formats: `qrcode` (client-side via the `qrcode` package — never sent
75
+ off-device, so 2FA URIs stay secret), `code-list`, `secret`, `text`,
76
+ `json`. Falls back to `json` when a value's shape doesn't match its
77
+ declared format.
78
+ - `ObjectView` and `RecordDetailView` install the handler and mount the
79
+ dialog automatically, so any action with `resultDialog` declared in
80
+ metadata now works without code changes.
81
+ - New dependency: `qrcode@^1.5.x` for client-side QR rendering.
82
+
83
+ Pairs with the framework-side `Action.resultDialog` schema added in
84
+ `@objectstack/spec` and the `sys_two_factor` / `sys_oauth_application` /
85
+ `sys_account` updates in `@objectstack/platform-objects`.
86
+
87
+ - 0c95963: ADR-0021 single-form: dataset-native report editing + legacy report surface retired.
88
+
89
+ - The Studio/runtime report inspector now edits the 9.0 dataset binding (dataset picker + values/rows selectors sourced from the dataset's semantic layer) instead of the removed objectName/columns query form.
90
+ - plugin-report: the pre-9.0 query-form renderers (SpecReportGrid, MatrixRenderer, JoinedReportRenderer), the drill helpers, and the legacy authoring components (ReportBuilder, ReportConfigPanel, ColumnsEditor, GroupingsBuilder, JoinedBlocksEditor, FieldPickerDialog, ChartConfig, ScheduleConfig) are removed. ReportRenderer dispatches dataset-bound reports to DatasetReportRenderer; stored pre-9.0 spec JSON renders through the lossy specReportToPresentation → ReportViewer bridge until migrated.
91
+
92
+ - 1c25b56: ADR-0032: author-time condition validation in the flow inspectors.
93
+
94
+ Flow node and edge condition editors now flag a malformed predicate **as you
95
+ type** — most importantly the `{record.x}` template-brace-in-CEL mistake (#1491),
96
+ which `{…}` parses as a CEL map literal and silently fails — with the same
97
+ corrective message the build and the `validate_expression` agent tool emit.
98
+ Client-side check for now (no CEL parser in the browser); swaps to
99
+ `@objectstack/formula`'s shared `validateExpression` once it is published.
100
+
101
+ - 30ee761: feat(studio): surface pending drafts on the package detail (ADR-0033)
102
+
103
+ After an AI builds an app, its objects/views land as drafts bound to the app package — but Studio's active-only browsers hid them, so the package looked empty and there was no obvious way to find what to review/publish.
104
+
105
+ - `MetadataClient.listDrafts({ packageId?, type? })` calls the new `GET /api/v1/meta/_drafts` endpoint, returning pending draft headers (with `packageId`).
106
+ - The package detail sheet (PackagesPage) now shows a **Pending changes** section listing each drafted item, each linking to the existing per-item review/diff (`?review=1`) so the user can publish it. A just-built app package is no longer shown as empty.
107
+
108
+ - 81c0777: feat(studio): ADR-0033 Phase B — draft review surface (chat → designer → generic diff)
109
+
110
+ Closes the AI metadata-authoring loop in Studio. The framework (ADR-0033 Phases A + C) makes the assistant stage every change as a DRAFT; this lets a human see and review those drafts.
111
+
112
+ **`@object-ui/plugin-chatbot`**
113
+
114
+ - `mapMessages` now detects the framework's draft envelopes — `{ status:'drafted', type, name, … }` (single) and `{ status:'drafted', drafted:[{type,name}] }` (apply_blueprint batch) — and lifts the reviewable targets onto `ChatToolInvocation.draftReview` (mirrors the existing HITL `pendingActionId` path; the Vercel `{type:'text',value}` wrapper is peeled). `blueprint_proposed` is intentionally not surfaced (no draft yet).
115
+ - `ChatbotEnhanced` renders a **"Review N change(s)"** button on drafted tool results, driven by a new `onReviewDraft` callback prop.
116
+
117
+ **`@object-ui/app-shell`**
118
+
119
+ - `assistantBus` gains a review channel (`requestReview` / `requestAssistantReview`); `ConsoleFloatingChatbot` wires the chat button to it; a small navigator inside `AppContent` (which knows the app base) routes to `/apps/:appName/metadata/:type/:name?review=1`.
120
+ - `ResourceEditPage` honours `?review=1`: it force-reloads the pending draft (covers the case where the AI drafted the item after the page mounted) and opens the review/diff.
121
+ - New **`DraftReviewPanel`** — a generic, type-agnostic draft↔published structural diff (added / changed / removed by key), reusing `LayeredDiff`'s `computeDiffRows`. It gives **every** metadata type (view, dashboard, flow, …) a real "what will publishing change" review, surfaced as a toolbar affordance + sheet whenever a draft exists. The object designer keeps its richer per-field review.
122
+
123
+ Nothing is published by any of this — the human still clicks Publish.
124
+
125
+ - 672f854: feat(studio): add "Publish app" button to publish all package drafts (ADR-0033)
126
+
127
+ The package detail's Pending changes section gains a primary **Publish app (N)** button that calls `POST /api/v1/packages/:id/publish-drafts` to promote every drafted item of the app in one shot, then refreshes the pending list. Complements the per-item review/publish links — so after an AI builds an app you can review item-by-item or publish the whole thing at once.
128
+
129
+ - 893e530: Package documentation portal + nav entry (ADR-0046).
130
+
131
+ The `/docs/:name` viewer already existed but had no way in: no index and no
132
+ navigation entry, so a doc was reachable only by typing its exact URL. Adds a
133
+ platform-level docs portal at `/docs` (`DocsIndex`) that lists every installed
134
+ `doc` metadata item grouped by package namespace, each linking to the existing
135
+ viewer. A "Documentation" entry now appears in the home/system navigation
136
+ (`UnifiedSidebar`), visible to all users (not gated behind workspace-admin), so
137
+ docs are discoverable. The viewer route stays app-independent and
138
+ single-coordinate (`/docs/<name>`); per-app deep-links remain opt-in `url` nav
139
+ items pointing at that same global URL. Doc grouping is a pure, unit-tested
140
+ helper (`groupDocsByPackage`).
141
+
142
+ - 053c948: feat: ADR-0047 — interface pages, visualization switcher, and Airtable-parity filters
143
+
144
+ End-user interface/list pages reach full rendering and authoring parity:
145
+
146
+ - **Spec tabs + visualization switcher** — `ObjectView` now forwards
147
+ `viewDef.tabs` (stored/served but never rendered) and `viewDef.appearance`
148
+ (`allowedVisualizations` whitelist), turning on the dormant `ViewSwitcher` when
149
+ more than one type is whitelisted; effective options = author whitelist ∩
150
+ capability-resolvable types (kanban needs `groupBy`, calendar a date field, …).
151
+ `ListView` accepts the canonical `ViewFilterRule[]` tab-filter shape.
152
+ - **User filters** — render only when `userFilters` is explicitly configured;
153
+ selections (dropdown values + active tab) mirror into `uf_*` URL params and
154
+ restore on load, so filtered lists survive reload and are shareable.
155
+ - **Toolbar polish** — the visualization switcher becomes a compact right-side
156
+ "Grid ▾" dropdown inside the tool cluster (no extra row); filter tabs and
157
+ dropdown filters are mutually exclusive.
158
+ - **Studio authoring** — a usable, schema-driven interface-page inspector
159
+ (collapsible sections honoured, array-of-enum → multi-select, a None/Tabs/
160
+ Dropdown `filter-mode` selector where None maps to ABSENCE of `userFilters`),
161
+ and the Design/Preview tabs render the live list via `InterfaceListPage`
162
+ (including a non-empty grid when the source view is hollow).
163
+
164
+ - 053c948: feat(app-shell): ADR-0048 (option A) — package-id app routing + prefer-local resolution
165
+
166
+ Apps are now routed by their canonical package id rather than name:
167
+
168
+ - **Resolution layer** — new `appRoute` helpers: `appRouteSegment(app)`
169
+ (canonical link segment = package id, name fallback) and
170
+ `matchAppBySegment(apps, seg)` (prefers `_packageId`, falls back to `name`).
171
+ `AppContent` selects the active app via `matchAppBySegment`, so
172
+ `/apps/<packageId>` resolves while `/apps/<appName>` keeps working (a per-tenant
173
+ alias / legacy URL).
174
+ - **Emission layer** — nav generates `/apps/<packageId>` links across app
175
+ switching (AppSwitcher/AppSidebar/CommandPalette), sidebar base paths,
176
+ create/edit-app, and the hidden-app switch, all via `appRouteSegment(app)`.
177
+ - **Prefer-local resolution** — `preferLocal(list, name, ownerPackageId)` resolves
178
+ a bare metadata name to the item whose `_packageId` matches the active app's
179
+ package (falling back to first match), wired at PageView/DashboardView/
180
+ ReportView and AppHeader so two installed packages can ship the same bare name.
181
+
182
+ - 053c948: feat(console/ai): AI workspace UX — date-grouped conversations, draggable split, keyboard shortcuts
183
+
184
+ ChatGPT/Claude-parity polish for the console AI workspace:
185
+
186
+ - **Date-grouped conversations** — the flat conversations list groups into
187
+ recency sections (Today / Yesterday / Previous 7 days / Previous 30 days /
188
+ Older) with calendar-day boundaries, via a pure exported
189
+ `groupConversationsByDate()`.
190
+ - **Draggable chat ↔ preview split** — a draggable, double-click-to-reset divider
191
+ between chat and the Live Canvas preview; width persists to `localStorage`,
192
+ clamped so neither pane collapses (chat ≥ 360px, preview ≥ 420px), keyboard-
193
+ accessible (`role="separator"`, ←/→ resize).
194
+ - **Collapsible conversations list** — auto-tucks when the preview opens, with a
195
+ manual toggle.
196
+ - **Keyboard shortcuts** — ⌘⇧O new chat, ⌘⇧S toggle the conversations list.
197
+
198
+ - 5c23088: **Wire `App.hidden` shell hint — App Switcher + avatar dropdown**
199
+
200
+ Honour the new `App.hidden` field from `@objectstack/spec/ui`:
201
+
202
+ - **`AppSwitcher.tsx`** — filter `app.hidden === true` out of the top-bar app dropdown so personal-settings-style apps don't appear next to business apps.
203
+ - **`AppHeader.tsx`** — render hidden apps as entries in the avatar / user dropdown (immediately after the hardcoded Profile / Settings items). Uses the app's `icon` + `label` via the existing `getIcon` + `appLabel` utilities, and navigates to `/apps/${app.name}`.
204
+
205
+ This is the front-end side of the Account-app split: the `account` app shipped by `@objectstack/platform-objects` declares `hidden: true` and now surfaces through the avatar menu — same pattern as GitHub Settings, Google account chip, and Salesforce Personal Settings.
206
+
207
+ No new dependencies; pure metadata-driven wiring.
208
+
209
+ - 053c948: feat(app-shell): zero-roundtrip `newTabUrl` fast path for `opensInNewTab` actions
210
+
211
+ Actions that declare `newTabUrl` (a path template with a `{recordId}` placeholder
212
+ whose target endpoint performs all auth/authz itself) now drive the pre-opened
213
+ popup straight to that URL on click, skipping the action POST entirely — applied
214
+ to both server-action paths (list rows via `useConsoleActionRuntime`, record
215
+ header via `RecordDetailView`). The popup paints the existing spinner page until
216
+ the (possibly slow) endpoint commits its redirect; the URL is resolved absolute
217
+ because `about:blank` gives a bare-relative href no reliable base. The
218
+ popup-blocked toast fallback is unchanged. Removes one full round trip of
219
+ white-screen latency from every such Open click.
220
+
221
+ - 05ff1fb: Studio: the "New page" form can now create a record page bound to an object.
222
+
223
+ The page create form was identity-only (label/name/icon/description), so it couldn't make a `pageType: 'record'` page or bind it to an object — even though the page edit form and protocol schema fully support those fields. Mirror the `view` resource's create config: the page create form now exposes **Object**, **Page type** (default `record`), and **Kind** (`full`/`slotted`), so a record page can be created and bound in Studio (#1541). The block layout is then composed in the editor's PagePreview canvas.
224
+
225
+ - 7c956d0: Runtime persistence seam: add `'page'` artifact type (record-page draft/publish).
226
+
227
+ `RuntimeArtifactType` now includes `'page'`, so a record `PageSchema` stages and publishes through the same ADR-0034 `/meta` draft model as views/reports/dashboards (#1541). New pure helpers `recordPageName(objectName, existing?)` (prefers an assigned page name, else mints `<object>_record`) and `recordPageEnvelope(objectName, schema, name?)` (sets the `name`/`object`/`pageType:'record'`/`kind:'full'` identity fields the resolver matches on) — foundation for the record-page edit loop.
228
+
229
+ - b0d64c4: Studio: new record pages seed their layout from the object's default detail page.
230
+
231
+ Creating a `pageType: 'record'` page bound to an object previously started from a blank canvas. The `page` resource now has a `createSeed` hook that, on create, fetches the bound object and seeds the page's `regions` from `buildDefaultPageSchema(objectDef)` — the same auto-generated detail layout the runtime renders by default. Authors start by tweaking the default page, not rebuilding it. A generic async `createSeed` hook was added to `MetadataResourceConfig` (merged into the create body after `createBuildBody`/`createDefaults`; best-effort). Completes #1541's Studio authoring path.
232
+
233
+ - 80f9796: Repoint the Console bell to `sys_inbox_message` + `sys_notification_receipt` (ADR-0030)
234
+
235
+ The notification bell read the legacy `sys_notification` object's
236
+ `recipient_id`/`is_read`/`title`/`body` columns. ADR-0030 re-modeled
237
+ `sys_notification` into the L2 _event_ (no recipient/read-state), so the bell
238
+ returned nothing — every notification the new pipeline produced was invisible.
239
+
240
+ The bell now reads the L5 in-app materialization instead:
241
+
242
+ - **List**: `sys_inbox_message` filtered by `user_id` (the `mine` scope), 20
243
+ most-recent, ordered by `created_at`.
244
+ - **Read-state**: joins `sys_notification_receipt` (filtered by `user_id` +
245
+ `channel:'inbox'`). A message is unread until its event has a
246
+ `read`/`clicked`/`dismissed` receipt; the unread count drives the badge.
247
+ - **Mark-read**: `UPDATE`s the existing `delivered` receipt to `read`
248
+ (keyed `(notification_id, user_id, channel)`), inserting only as a fallback
249
+ when no receipt exists. Replaces the old `sys_notification.is_read` write.
250
+ - **Navigation**: follows the materialization's `action_url` (absolute,
251
+ `/apps/...`, or app-relative `/{object}/{id}`), falling back to the legacy
252
+ `source_object`/`source_id` pointer.
253
+ - **"View all"**: routes to `/apps/setup/sys_inbox_message?view=mine`.
254
+
255
+ Pairs with the framework ADR-0030 pipeline (`@objectstack/service-messaging`).
256
+ Verified in-browser (showcase Console): a materialized inbox message + its
257
+ `delivered` receipt lit the bell badge; the popover rendered the row;
258
+ "mark all read" flipped the receipt to `read` in place (no duplicate) and
259
+ cleared the badge.
260
+
261
+ - 5e8965c: Complete the page-editor block configuration and prune shell-only blocks. Adds configurable property panels for the remaining content blocks with authorable properties — `page:accordion`, `record:path`, `record:quick_actions`, `ai:chat_window`, `ai:input` — so every page-content block in the palette is configurable in the UI (pure containers like `page:section` / `element:divider` correctly have no panel). Removes shell-singleton blocks (`app:launcher`, `global:notifications`, `user:profile`) from the page block palette — those are provided by the app shell, not authored as page content.
262
+ - 94c58ad: Align the page-editor element palette with reality. Adds the real lightweight-list primitives — `element:definition-list` (compact key/value `<dl>`) and `element:repeater` (data-bound, chrome-free list) — to the block palette with full config panels (object/field pickers for the repeater), and removes three palette entries that have no renderer (`element:form`, `element:filter`, `element:record_picker`) so the palette only offers blocks that actually render.
263
+ - c681874: Expand page-editor block configuration. Adds configurable property panels for more blocks (`element:number`, `element:button`, `record:alert`) and introduces array-valued property editors — a `string-list` editor (e.g. `record:highlights` fields) and an add/remove `array` editor (e.g. `page:tabs` items, `record:details` sections) — so these blocks are configurable in the UI instead of only via raw JSON.
264
+ - d988090: Schema-driven object/field pickers in the page-editor block inspector. Data-reference block properties are now dropdowns populated from the live metadata instead of free-text: an object picker (e.g. `record:related_list` object, `element:number` object) and cascading field pickers that list the chosen object's actual fields (e.g. `record:related_list` relationship field, `element:number` field, `record:path` status field, `record:highlights`/`record:details` field lists). Resolves the object from the record page's bound object or a sibling block property; degrades gracefully to a text input when the metadata can't be fetched.
265
+ - 9049bbe: Add end-user friendly agent process summaries for chatbot tool calls, with a debug mode for raw reasoning and tool details. Console chat surfaces now keep a sanitized browser-side display cache so refreshes can restore user/assistant text plus grouped tool states when the backend returns no message rows.
266
+ - 77cc6bb: Cloud Connection bind v2 UX (cloud ADR runtime-identity-binding §2.3): the binding flow becomes one click. `CloudConnectionPanel` drops the environment-id input entirely (registration happens cloud-side at approval), auto-opens the approval page in a popup on Connect (user-code display stays as the popup-blocked fallback), and shows the registered runtime name + runtime id once bound. `DeviceAuthPage` displays the requesting device's context (`runtime_name` / `runtime_version` from the verification URL) plus an "only approve if you started this" warning — the informed-consent surface for the RFC 8628 flow. Two new `auth.device.*` keys across all locales.
267
+ - 0ca2040: `cloud-connection:panel` SDUI widget — the RFC 8628 device-code binding state machine for the metadata-driven Cloud Connection Setup page (shipped by `@objectstack/cloud-connection`). status → connect → user-code display + approval link → poll → bound/disconnect; the runtime credential never reaches the browser.
268
+ - 04e6168: SDUI: give PageView a console action runtime (#1605). Extract ObjectView's schema-action wiring into a reusable `useConsoleActionRuntime` hook (+ a `ConsoleActionRuntimeProvider` wrapper): confirm / param / result dialogs, the authenticated api / flow / server-action handlers, SPA navigation, the paused screen-flow runner, and a refresh callback. ObjectView now consumes the hook (behaviour unchanged), and PageView wraps its page schema in the runtime — so a page-level `action:button` can collect params, call authenticated API endpoints, show confirm/result dialogs, run screen flows, navigate the SPA, and invalidate embedded data after success. Pages run global (object-less) actions; the hook binds `objectName` only when one is present. This unblocks metadata-driven app home pages (e.g. a "Create environment" primary action) instead of bespoke React components.
269
+ - 39c89e7: ADR-0021 D2: true matrix cross-tab + dataset-path drill-down.
270
+
271
+ - DatasetReportRenderer pivots `type: 'matrix'` reports into a real rows × columns cross-tab (one dataset query over all dimensions, pivoted client-side; matrix without `columns` degrades to the flat grouped table). Joined blocks pivot too.
272
+ - Drill-down: aggregated rows / matrix cells are clickable when the host passes `onDrill` (and the report doesn't set `drilldown: false`), emitting `{dataset, groupKey, runtimeFilter}`. ReportView resolves the dataset's object + dimension→field mapping (reverse-mapping select option labels back to stored values) and navigates to the object list scoped by `?filter[field]=value`.
273
+ - Studio: the report inspector gains a Columns (across dimensions) list for matrix reports; ReportPreview renders through the same DatasetReportRenderer as the runtime, so the matrix preview is WYSIWYG.
274
+
275
+ - 1c8f775: Add the External Datasource Federation Studio surface (ADR-0015 P5)
276
+
277
+ Federated datasources (`schemaMode !== 'managed'`) now get a dedicated
278
+ panel inside their Studio Preview tab, so connecting a mature external
279
+ database and registering its tables as ObjectStack objects is a
280
+ point-and-click flow instead of a CLI-only one. The panel pairs with the
281
+ framework backend shipped in objectstack-ai/framework#1390
282
+ (`registerExternalDatasourceRoutes` → `/api/v1/datasources/:name/external/*`).
283
+
284
+ ObjectStack is metadata-driven: `datasource` is a metadata type, so it is
285
+ browsed and edited through the standard metadata-admin engine
286
+ (`metadata:resource`) reached from the Studio app's left-side menu —
287
+ **not** a hand-written page. The Studio app (framework
288
+ `packages/platform-objects/src/apps/studio.app.ts`, Integration group)
289
+ gains a `Datasources` nav item pointing at
290
+ `metadata:resource?type=datasource`; the federation panel is contributed
291
+ to that standard surface via `registerMetadataPreview('datasource', …)`.
292
+
293
+ **`@object-ui/app-shell` — `views/metadata-admin/external/`**
294
+
295
+ - `api.ts` — a thin, typed REST client over the four federation routes
296
+ (`tables`, `tables/:remote/draft`, `refresh-catalog`, `validate`) plus an
297
+ `importObjectDraft` helper that PUTs a generated draft to `/meta/object`.
298
+ All calls go through `createAuthenticatedFetch()` (Bearer + `X-Tenant-ID`
299
+ - `Accept-Language`). A `503 external_service_unavailable` reply is mapped
300
+ to a typed `ExternalServiceUnavailableError` so the UI shows a friendly
301
+ "federation not enabled on this server" hint. Contract types are inlined
302
+ (they were added in framework 7.3; objectui pins `@objectstack/spec`
303
+ `^7.2.1`).
304
+ - `SchemaBrowser` — lists remote tables (allowedSchemas-filtered server-side)
305
+ with a text filter, on-demand Refresh (never a timer — warehouse
306
+ introspection is expensive), and a per-table Import action.
307
+ - `ImportObjectDialog` — generates an Object draft, surfaces the
308
+ type-compat matrix's `// REVIEW:` columns and the generated `*.object.ts`
309
+ source, then imports it as a real object. Never mutates the remote schema.
310
+ - `ValidationPanel` — runs validation on demand and renders per-object
311
+ structured schema diffs (missing column, type mismatch, …). Doubles as an
312
+ on-demand drift view.
313
+ - `ExternalDatasourcePanel` — Tables / Validation tabs plus a header strip
314
+ with "Refresh catalog" and the snapshot timestamp.
315
+ - `DatasourcePreview` — registered via `registerMetadataPreview('datasource', …)`,
316
+ it renders the panel automatically inside the standard resource edit
317
+ page's Preview tab when the saved datasource is federated
318
+ (`schemaMode !== 'managed'`), keyed off the item name. This is the only
319
+ wiring needed: no bespoke page, no extra route, no `@object-ui/app-shell`
320
+ surface to re-export — the metadata-admin engine + left-side nav own the
321
+ navigation. Federated datasources are read-only code artifacts (the
322
+ `datasource` type forbids runtime create), which the standard list view
323
+ already reflects (no "Create" button).
324
+
325
+ Out of scope (blocked on backend follow-ups): the connection wizard
326
+ (driver/credentials/secrets — belongs in System Settings) and a push-based
327
+ drift inbox (needs an event feed). The framework exposes no
328
+ test-connection, secrets, or drift-feed routes yet.
329
+
330
+ - d54346c: feat: action/flow completion messaging
331
+
332
+ - **core**: `ActionResult.silent` — a handler sets it when the action only
333
+ HANDED OFF to a follow-up UI (rather than completing), so `ActionRunner`
334
+ skips the automatic success toast. Fixes the misleading "Action completed
335
+ successfully" toast that fired the moment a `flow` action opened its wizard.
336
+ - **app-shell**: both flow handlers now return `silent: true` when the flow
337
+ pauses at a screen (the wizard only opened — it hasn't completed). `FlowRunner`
338
+ renders the flow's declared `successMessage` / `errorMessage` (from the
339
+ terminal `AutomationResult`) instead of a generic "Done" / the raw error.
340
+
341
+ - 12566ea: Flow designer ↔ automation engine alignment + run history panel.
342
+
343
+ - **Palette/type-picker:** replace the BPMN `parallel_gateway` / `join_gateway`
344
+ (and `boundary_event` in the picker) with the structured `parallel` and
345
+ `try_catch` constructs the engine actually executes (ADR-0031 keeps the BPMN
346
+ gateway types as import/export interop only — they have no executor, so
347
+ flows authored with them failed at runtime with `NO_EXECUTOR`). Legacy
348
+ gateway nodes still render for imported flows.
349
+ - **Runs panel:** new `FlowRunsPanel` fetches `GET /api/v1/automation/{name}/runs`
350
+ and surfaces run status / duration / per-node step logs in the FlowPreview
351
+ side panel (Variables / Debug / Runs), degrading quietly when the engine is
352
+ offline.
353
+ - **Simulator:** structured containers (`parallel`, `try_catch`) pass through
354
+ honestly as unsupported instead of faking their semantics.
355
+
356
+ - 4e060b7: Polish the Studio flow-designer canvas visuals
357
+
358
+ A refinement pass over the metadata-admin flow designer (`FlowCanvas` +
359
+ `flow-canvas-parts`) — purely presentational, no behavioral or API changes,
360
+ theme-aware (light/dark), and still dependency-free.
361
+
362
+ - **Node cards**: the flat 3px left-accent stripe is replaced by a tinted,
363
+ color-coded **icon chip** (the card's primary category cue), with a bolder
364
+ label, refined uppercase type caption, layered hover elevation
365
+ (`-translate-y-0.5` + soft shadow), and clearer selected / run-state rings.
366
+ Per-category `chip` tone tokens (soft bg + inset ring) added alongside the
367
+ existing icon/accent/label tones. Added distinct tones for `loop` (sky),
368
+ `screen`/`user_task` (pink) and `assignment` (purple) — previously they fell
369
+ back to the generic slate "task" tone, so every node type now reads as a
370
+ distinct color in the canvas.
371
+ - **Readable labels**: node width 188→240 and the per-node summary moved from a
372
+ right-hand column onto a second line, so the label now gets the **full card
373
+ width** (it was badly truncated — "Manager Re…", "Budget Ab…"). A native title
374
+ tooltip surfaces the full text on the rare remaining truncation.
375
+ - **No overlap on add**: adding a connected node no longer pins it directly below
376
+ its parent (which stacked every sibling on the same spot) — it's left to the
377
+ layered auto-layout, which slots it beside its siblings.
378
+ - **Canvas surface**: the dot grid now tracks pan **and** zoom (it moves with
379
+ the diagram instead of floating behind a static texture), plus a subtle inset
380
+ vignette for depth.
381
+ - **Edges**: rounded line caps, slightly stronger default stroke, and
382
+ pill-shaped (rounded-full, frosted) branch/condition labels.
383
+ - **Toolbar + add-node palette**: frosted, rounded controls with a primary
384
+ hover affordance; the palette gains an "Add node" header and matching tinted
385
+ icon chips per row.
386
+
387
+ Verified in-browser (Studio → flow → designer) in both light and dark themes.
388
+
389
+ - 5332639: feat(app-shell): render full object forms (incl. master-detail) in screen-flow wizard steps
390
+
391
+ `FlowRunner` now renders an `object-form` screen step: when the paused screen
392
+ carries `kind: 'object-form'`, it mounts the real `<ObjectForm>` for the named
393
+ object (auto-routing to `MasterDetailForm` for inline child collections),
394
+ prefilled from the step's `defaults`. The form persists itself (atomic
395
+ master-detail batch), then resumes the run with the saved record id bound to the
396
+ step's `idVariable`. `dataSource`/`objects` are threaded through all three
397
+ `FlowRunner` mount points.
398
+
399
+ Also fixes three pre-existing bugs this surfaced (each affects normal forms too):
400
+
401
+ - **plugin-form**: `ObjectForm` now forwards `initialValues`/`initialData` when
402
+ routing to `MasterDetailForm`, so prefilled header values are no longer
403
+ dropped on master-detail create forms.
404
+ - **fields**: `PercentField` treated values as `0–1` fractions (`value × 100`),
405
+ so a `0–100` field (e.g. `probability` default `50`) rendered as `5000%` —
406
+ exceeding `max=100`, which makes HTML5 constraint validation mark the field
407
+ `:invalid` and silently block the whole form's submit. It now treats a field
408
+ declaring `max > 1` as the `0–100` whole-number convention, matching the
409
+ read-side formatter.
410
+ - **data-objectstack**: `ObjectStackAdapter.batchTransaction` now sends
411
+ `credentials: 'include'`, so master-detail batch saves authenticate under the
412
+ console's cookie session (previously every batch save 401'd).
413
+
414
+ - e02aedd: Group the flow add-node palette by category, and offer every node type
415
+
416
+ The quick-add palette listed 12 node types as a flat list; `assignment`,
417
+ `screen`, `delete_record` and the parallel gateways could only be reached by
418
+ adding a node and switching its type in the inspector. Building flows, that's a
419
+ real friction point.
420
+
421
+ - **Complete**: the palette now offers Delete record, Set variables
422
+ (assignment), Screen, Parallel split and Parallel join too — so every common
423
+ node type is one click away.
424
+ - **Grouped**: items are organised into **Data / Logic / Human / Integration /
425
+ Flow** sections with headers and dividers, so the (now longer) list stays
426
+ scannable. A new `nodeCategory(type)` helper drives the grouping and gives
427
+ engine-only / plugin-contributed node types a sensible section; `mergePalette`
428
+ preserves a base item's category and infers one for engine-only types.
429
+
430
+ Verified in-browser: the grouped palette renders all sections with tinted icon
431
+ chips, and the newly-offered types add to the canvas with the correct icon/tone
432
+ and no overlap.
433
+
434
+ - 7130d4e: Add FlowRunner — render & resume interactive screen-flows
435
+
436
+ A `type: 'flow'` action whose run pauses at a `screen` node now opens a
437
+ `FlowRunner` modal that renders the screen's fields, submits the values to the
438
+ framework resume endpoint (`POST /api/v1/automation/{flow}/runs/{runId}/resume`),
439
+ and advances to the next screen or closes + refreshes on completion. Previously
440
+ such flows launched server-side but the screen was never rendered, so the input
441
+ was never collected.
442
+
443
+ - New `FlowRunner` component (fields → form → resume loop).
444
+ - `ObjectView` + `RecordDetailView` flow handlers detect a paused-screen launch
445
+ response (`{ status:'paused', runId, screen }`) and open the runner; for
446
+ list_item actions the row's id (`_rowRecord.id`) flows in as the flow's
447
+ `recordId`.
448
+
449
+ Pairs with the framework screen-flow runtime (`@objectstack/service-automation`
450
+ - `@objectstack/runtime`). Verified in-browser: showcase task row → "Reassign…"
451
+ → form → submit → the task is reassigned.
452
+
453
+ - 3fa23a7: feat(header): context-aware Help & Documentation menu + app-scoped docs index
454
+
455
+ The top-right "?" was a bare external link to `docs.objectstack.ai`, duplicating
456
+ the left sidebar's in-product `/docs` entry and ignoring the ADR-0046 docs hub.
457
+ It is now an aggregated, context-aware menu:
458
+
459
+ - **This app's docs** — shown only when the current app's package owns docs
460
+ (matched by `_packageId`). A single-doc app deep-links straight to the
461
+ viewer; a multi-doc app lands on the new app-scoped index.
462
+ - **All documentation** — the in-product `/docs` portal.
463
+ - **Online documentation** — `docs.objectstack.ai` (opens in a new tab).
464
+
465
+ Docs are lazily fetched once on first menu open (names/labels only), so the menu
466
+ adds no cost until used; a failed fetch soft-degrades to the static entries.
467
+
468
+ Also adds the app-scoped docs index route **`/apps/:packageId/docs`**
469
+ (`AppDocsIndex`) — the package-scoped sibling of `/docs`, listing just that
470
+ app's docs — which the "This app's docs" entry targets when an app ships more
471
+ than one. New `help.*` strings added to the `en` and `zh` bundles (other
472
+ locales fall back to `en`).
473
+
474
+ - 9f9d1db: Add an `icon` form widget — a searchable Lucide icon picker for metadata-admin.
475
+
476
+ Metadata `icon` fields (page/app/object) were a raw text input where authors had to know and type an exact Lucide name. The new `widget: 'icon'` renders a combobox: the trigger shows a live preview of the current icon, and opening it reveals a search box plus a grid of matching icons (preview + name). Selecting writes the kebab-case name string. Out-of-catalog values (e.g. icons from another library, or typos to fix later) survive — they render on the trigger and stay reachable as a "keep" option so re-opening never silently drops them. Registered as `'icon'` in the metadata-admin `WIDGETS` map; pair with `widget: 'icon'` in the spec `*.form.ts`.
477
+
478
+ - 0d707b6: `marketplace:installed-list` SDUI widget — the Installed Apps body (control-plane/local dual-source list, refresh, uninstall) extracted from the React route page, which now renders the same component. The page shell ships as metadata with `@objectstack/cloud-connection`'s install-local plugin (cloud ADR-0009 P2a).
479
+ - 67dbaa1: interface page: Add-Record config now takes effect; view picker mirrors runtime resolution
480
+
481
+ - **Fix: `interfaceConfig.addRecord` did nothing.** `InterfaceListPage` never forwarded `addRecord` into the schema it hands to `ListView`, so the panel's Add-Record toggle/position/mode were silently dropped — the button could never appear on an interface page. Now `addRecord` is passed through (ListView already gates the button on `addRecord.enabled` across all visualizations).
482
+ - **`view-ref` picker no longer mislabels resolvable values.** A stored `sourceView` like the bare `default` was tagged "(not in object)" even though the runtime resolves it. The widget now mirrors `InterfaceListPage.resolveSourceView` (exact name / `<object>.<name>` suffix / `default`-`list` special-case) via an extracted, unit-tested `resolveStoredViewRef`, showing the matched view's label (e.g. "All Tasks → showcase_task.default") instead of a false warning.
483
+
484
+ - 586770c: metadata editor: `view-ref` widget for picking a source view
485
+
486
+ Adds a `view-ref` form widget so `interfaceConfig.sourceView` (and any field with `widget: 'view-ref'`) renders as a dropdown of the source object's views instead of a free-text name the author could mistype. Views come from a new `WidgetContext.objectViews`, which `ResourceEditPage` loads for the page's source object (`interfaceConfig.source` / `object`). A value not in the catalog is still shown so stale/custom names survive; clearing to "None" omits the field (the protocol treats absence as the object's default view). The widget mirrors the existing `field-ref` picker and degrades gracefully when no source object is bound.
487
+
488
+ Pairs with the `@objectstack/spec` change that sets `widget: 'view-ref'` + `dependsOn: 'source'` on the page form's `sourceView` field.
489
+
490
+ - 652f9b2: feat(packages): "Discard changes" and "Delete app" buttons in the package detail sheet
491
+
492
+ Adds two one-click package-lifecycle actions next to the existing "Publish app", mirroring the new backend endpoints:
493
+
494
+ - **Discard changes (N)** — next to "Publish app" in the Pending changes block. Drops every pending draft via `POST /packages/:id/discard-drafts`, reverting the app to its last published baseline. Non-destructive (published metadata + data untouched), then refreshes the pending list.
495
+ - **Delete app** — in the Actions row. Removes the whole package via `DELETE /packages/:id` (active + draft metadata + drops each object's table). Confirms first ("this cannot be undone"); closes the sheet on success, keeps it open and shows the error on failure.
496
+
497
+ Together with "Publish app", this gives the full AI-build review loop a UI: publish to preview → keep, **discard all changes**, or **delete the app**.
498
+
499
+ - 82195b5: Configurable property panels for page-editor blocks (SDUI). The Studio page editor's block inspector now renders typed, protocol-aligned property fields (editing the block's `properties`) for the minimal SDUI-essential content blocks — `element:text`, `element:image`, `page:header`, `page:card`, `record:related_list` — instead of only the generic `type`/`id`/`className`/`hidden` fields. Previously these properties were editable only via raw JSON.
500
+ - f12225b: The Studio page editor can now edit nested sub-blocks inside container blocks. A `page:tabs`/`page:accordion` tab's children, and a `page:card`/`page:section`'s body, are surfaced as indented, selectable sub-blocks — each one can be selected, configured (via the inspector and its object/field pickers), edited, removed, and new ones added — in both full and slotted pages. Addressing is handled by extending the block-path scheme to support object-key hops (e.g. `…components[0].properties.items[0].children[0]`) and a nested sub-path under slot ids. Closes the last gap so a container's contents are fully point-and-click instead of raw JSON.
501
+ - 14e3db5: The Studio page editor can now edit slotted record pages. A `kind:'slotted'` page surfaces its 7 canonical slots (header / actions / alerts / highlights / details / tabs / discussion) as editable regions — overridden slots show their blocks (selectable + configurable via the inspector and its object/field pickers), and unoverridden slots show an "inherited — add a block to override" placeholder. Edits write back to `slots`; empty slots are omitted so they keep inheriting the synthesized default. This closes the loop for the most common low-code task — customizing a business object's detail page (highlights/tabs/details) point-and-click instead of by hand-editing JSON.
502
+ - 4eb9cb6: feat(plugin-tree): add a `tree` / tree-grid object view type
503
+
504
+ Renders a self-referencing object as an indented, expand/collapse tree-grid —
505
+ the right view for arbitrary-depth hierarchies (business unit / org chart,
506
+ category trees, BOMs, nested comments) that fixed-depth grouping can't express.
507
+ New `@object-ui/plugin-tree` package (`object-tree`/`tree`), `tree` added to the
508
+ `ViewType` union, and dispatch wired through plugin-list `ListView` +
509
+ app-shell `ObjectView` (the console path).
510
+
511
+ - de3224e: feat(metadata): relationship-level `inlineEdit` auto-renders master-detail
512
+
513
+ A child object's `master_detail`/`lookup` field can declare `inlineEdit: true`
514
+ (in the data model) to mean "edit me inline within my parent's form". The
515
+ metadata layer now scans for these and merges the resulting child collections
516
+ into each parent object's form view as `subforms` — so the parent's **standard**
517
+ New/Edit form auto-renders an atomic master-detail form with **no view config
518
+ and no bespoke page**. The intent lives once in the data model (where e.g. an AI
519
+ modelling the schema naturally sets it); forms derive the UI.
520
+
521
+ `master_detail` children WITHOUT `inlineEdit` are not inlined (so associations
522
+ like comments/attachments stay out of the entry form). An explicit
523
+ `form.subforms` entry overrides the derived one. Optional
524
+ `inlineTitle`/`inlineColumns`/`inlineAmountField` tune the grid.
525
+
526
+ - 010883d: Migrate the runtime DashboardView "dashboard editor" onto the studio's spec-driven inspectors. A single app-shell `DashboardConfigPanel` now replaces both legacy `plugin-dashboard` panels (the dashboard-level config panel and the per-widget config panel): with no widget selected it hosts a new spec-driven `DashboardDefaultInspector` (registered as the studio default inspector for the `dashboard` type), and with a widget selected it hosts the existing `DashboardWidgetInspector`. Both inspectors edit the full nested Dashboard document directly, so the runtime's widget flatten/unflatten adapters are removed. The panel lives in app-shell to avoid a circular dependency on plugin-dashboard; the `sys_dashboard` persistence path is unchanged.
527
+ - 7da8a57: Migrate the runtime ReportView "report editor" onto the studio's spec-driven inspector. The right-rail editor now hosts the same report inspector the metadata studio uses (config fields sourced from `@objectstack/spec` `ReportSchema` / `reportForm`) instead of plugin-report's legacy `buildReportSchema` / `ConfigPanelRenderer` engine, so runtime and studio share one report-editing surface. A new spec-driven `ReportDefaultInspector` is registered as the studio default inspector for the `report` type, and a thin app-shell `ReportConfigPanel` hosts it for the runtime (kept in app-shell to avoid a circular dependency on plugin-report). Field pickers read from the in-memory object definition (no extra network fetch); the `sys_report` persistence path is unchanged.
528
+ - 7b71cd8: Unify the runtime ObjectView "view editor" onto the studio's spec-driven inspector. The right-rail view editor now hosts the same `ViewVariantInspector` the metadata studio uses (config fields sourced straight from `@objectstack/spec`) instead of the legacy `buildViewConfigSchema` engine, so runtime and studio share one view-editing surface. A new `view-config-adapter` bridges the runtime's flat view shape and the studio's ViewItem draft, keeping the `sys_view` persistence path untouched; field pickers read from the in-memory object definition (no extra network fetch). The legacy `buildViewConfigSchema` engine and its exports are retired; `ConfigPanelRenderer` is retained for the dashboard/report config panels.
529
+ - 8426db7: feat(form): standard New/Edit modal renders form-view subforms (Tier 0)
530
+
531
+ The console's standard create/edit record modal now renders inline child
532
+ collections when the object's form view declares `subforms` — master-detail
533
+ entry with **no bespoke page**, persisted as one atomic transaction.
534
+
535
+ - `ModalForm` (and the create/edit modal in app-shell `AppContent`) detects
536
+ `subforms` and renders `MasterDetailForm` inside the dialog (it owns its Save
537
+ bar; the modal footer is suppressed); on success the modal closes + refreshes.
538
+ - `AppContent` sources `subforms` from the object's default form view
539
+ (`form.subforms` / `formViews.default.subforms`).
540
+ - `ModalFormSchema` gains `subforms`.
541
+
542
+ With this, declaring `formViews.default.subforms: [{ childObject }]` is enough
543
+ to make an object's standard New/Edit screen a master-detail form — completing
544
+ the config-driven master-detail story (Tier 0 → derive everything from the
545
+ relationship + child metadata).
546
+
547
+ ### Patch Changes
548
+
549
+ - 3b5e293: ADR-0034 step 2: route ObjectView's view-config save through the runtime persistence seam, completing the seam's coverage of all three runtime editors (view/report/dashboard). Corrects the seam's `view` branch to mirror ObjectView's real update path (`dataSource.updateViewConfig(...)`, the ADR-0005 overlay API) rather than a raw `sys_view` write. Behaviour is unchanged while the `VITE_RUNTIME_EDIT_VIA_META` flag is off; flag on routes the view update to the studio `/meta` draft. The view CREATE path (`createView` + default-column/kanban/gallery massaging) and the draft/publish UI remain deferred.
550
+ - 02c3c65: ADR-0034 step 1: introduce a flag-gated runtime metadata persistence seam. `persistRuntimeMetadata` / `publishRuntimeMetadata` centralise where the runtime view/report/dashboard editors save. Behind the `VITE_RUNTIME_EDIT_VIA_META` flag (default **off**) they reproduce today's `sys_*` writes exactly (zero behaviour change); flag **on** routes to the studio `/meta` per-item draft/publish model (`MetadataClient.save(..., { mode: 'draft' })` + `publish`). ReportView and DashboardView now save through the seam; ObjectView (view) and the draft/publish UI are deliberately deferred. No `sys_*` table is removed and no data is migrated. Also adds the finalized ADR-0034.
551
+ - b8a5d41: ADR-0048: finish sweeping app-entry links onto the canonical package-id route
552
+ segment (follow-up to the home-page fix).
553
+
554
+ - `AppManagementPage` (System → Apps) "Open app" button now opens
555
+ `/apps/<packageId>` (`app._packageId ?? app.name`) instead of `/apps/<name>`.
556
+ - `AppContent` current-app sub-routes/redirects (the `metadata/package` →
557
+ `component/developer/packages` redirect, and the record-form `baseUrl`) now
558
+ build against the URL's own `appName` segment instead of `activeApp.name`, so a
559
+ `/apps/<packageId>/…` URL keeps its package-id segment instead of flipping to
560
+ the name form. `requestedAppMissing` (preview-drafts) now resolves the segment
561
+ via `matchAppBySegment` so a package-id URL isn't treated as a missing app.
562
+
563
+ - 4cd0a0d: ADR-0048 (#1824): the Studio metadata editor's post-save refresh now scopes its
564
+ layered + draft re-read to the same package as the initial load (`?package=`), so
565
+ when two installed packages ship the same `type`/`name` the editor re-reads
566
+ this package's own row after saving — not another package's. The save itself
567
+ already binds the package; this aligns the refresh with it.
568
+ - a571911: ADR-0048: the console **home** page now links into apps by their canonical
569
+ package-id route segment, matching the nav. The app grid (`HomePage`) and the
570
+ "add to favorites" href (`AppCard`) were still building `/apps/<app.name>` while
571
+ the sidebar/switcher/command-palette emit `/apps/<packageId>` (via
572
+ `appRouteSegment`). So opening an app from the home page produced a name-form URL
573
+ (e.g. `/apps/studio`) instead of `/apps/com.objectstack.studio`. Both now use
574
+ `appRouteSegment(app)`.
575
+ - b99d9bd: ADR-0048: package-scope the Studio metadata editor read. Two installed packages
576
+ may ship metadata with the same `type`/`name`; the editor now resolves the right
577
+ one instead of first-match.
578
+
579
+ - `MetadataClient`: `layered()` and `getDraft()` accept `{ packageId }`, and
580
+ `get()` emits the `package` query param (→ server prefer-local, `?package=`).
581
+ - `ResourceListPage`: each item's edit link carries its owning package
582
+ (`?package=<row._packageId>`), so even the unscoped "all" list disambiguates;
583
+ falls back to the workspace suffix for runtime/overlay-only rows.
584
+ - `ResourceEditPage`: reads `?package=` and scopes the layered + draft read to
585
+ that package. (The route's `:appName` is the Studio app, not the edited item's
586
+ owner, so the scope must come from the URL, not the active app.)
587
+
588
+ - 5a95032: Polish the full-page AI workspace with a responsive conversation drawer, clearer page context, constrained chat width, and accessible conversation row actions.
589
+ - 053c948: fix(app-shell): send the current-page object to the AI assistant context
590
+
591
+ The floating console assistant forwarded only `appName` + the full objects list,
592
+ never the object the user is actually viewing — so asking it to "analyse this
593
+ object" (especially in a non-English prompt) gave the agent nothing to anchor on
594
+ and it replied that it couldn't find the object. The current object/record are
595
+ now derived from the route (mirroring `useTrackRouteAsRecent`'s URL layout,
596
+ tolerant of a `_console` shell prefix) and passed as `context.objectName` /
597
+ `context.recordId`, so the backend injects that object's schema into the system
598
+ prompt and scopes data queries to it. Pairs with the framework current-object
599
+ resolution fix.
600
+
601
+ - 40c79df: Improve the floating chatbot flow with responsive panel bounds, safer FAB placement, inline responding and stop states, and clearer retryable error feedback.
602
+ - 6c0c92c: fix(app-shell): command palette idempotent open + stable locators (ADR-0054 Phase 1)
603
+
604
+ The top-bar "Search… ⌘K" button now opens the command palette directly via a
605
+ shared, idempotent `openCommandPalette()` instead of re-dispatching a synthetic
606
+ `⌘K` `KeyboardEvent` — so it works under automation and in ⌘K-reserving
607
+ browsers. Open state is URL-addressable (`?palette=1`, `?cmdk=1` alias), making
608
+ the palette deep-linkable and restore-on-reload. The dialog and header trigger
609
+ emit stable `data-testid` locators (`overlay:command-palette`,
610
+ `action:command-palette:open`) plus an ARIA name. New `useCommandPalette()` hook
611
+ and `CommandPaletteProvider`; `CommandDialog` gains a `contentProps` passthrough
612
+ for the dialog locator/ARIA. Implements invariants C1/C3/C4 of the UI
613
+ testability contract.
614
+
615
+ - 97c6831: Localize AI workspace, shell navigation, startup, connection, toast, and chatbot affordance text across core console screens.
616
+ - f6044fa: feat(form): subforms in DrawerForm + full-page record form (Tier 0 everywhere)
617
+
618
+ Completes config-driven master-detail across all standard create/edit entry
619
+ points (after the modal in the previous change):
620
+
621
+ - `DrawerForm` now hosts `MasterDetailForm` inside the drawer when the schema
622
+ declares `subforms` (its own Save bar; closes + refreshes on success).
623
+ - `RecordFormPage` (full-page New/Edit) sources `subforms` from the object's
624
+ form view, so the full-page form renders inline child collections too.
625
+ - `ObjectForm`'s subforms shortcut now defers to the drawer/modal variants for
626
+ those formTypes (so they keep their envelope), and only renders the
627
+ master-detail form directly for inline/simple forms.
628
+
629
+ Declaring `formViews.default.subforms: [{ childObject }]` now yields a
630
+ master-detail experience in the modal, drawer, AND full-page form — no bespoke
631
+ page anywhere.
632
+
633
+ - 6cfa330: feat(dashboard): drill "Open in list" escape hatch + unify report drill
634
+
635
+ Adopts the mainstream BI peek-then-escalate drill model. Drill-through opens an
636
+ in-place drawer (keep context) and offers an "Open in list →" affordance to
637
+ escalate to the object's full list page (sort / bulk-select / export / shareable
638
+ URL) — the Looker / Power BI "see records → open in page" pattern.
639
+
640
+ - New `DrillNavigationContext` (`@object-ui/react`): the app shell provides
641
+ `openRecordList`; the renderer stays decoupled from console routing.
642
+ - The drill drawers (pivot / dataset / chart / KPI) render the escape hatch when
643
+ a host navigation handler is present, and hide it otherwise (self-contained
644
+ peek). `DashboardView` provides the handler via `useOpenRecordList`.
645
+ - `DrillDownConfig.target` gains `'navigate'` — skip the drawer and open the
646
+ list directly; degrades to `'drawer'` when no host handler is available.
647
+ - `ReportView` drill-through now opens the same in-place drawer (peek records →
648
+ click a row to open a record) instead of navigating away; the escape hatch
649
+ preserves the previous navigate-to-list behavior. Dashboard and report drill
650
+ are now unified.
651
+ - i18n: `dashboard.openInList` (en / zh).
652
+
653
+ - 23bf869: fix(app-shell): edit-in-studio pencil no longer overlaps interface-page toolbar buttons
654
+
655
+ The PageView "Edit in studio" pencil is an absolute overlay at the page's
656
+ top-right. On an interface (list) page whose header surfaces toolbar buttons
657
+ (e.g. an Approvals page's "Mark Done"), the pencil sat on top of the rightmost
658
+ button, clipping its label. PageView now tells InterfaceListPage to reserve
659
+ right padding on its header (`reserveEditAffordance`, only when the pencil is
660
+ shown) so the toolbar clears the affordance. Non-admin / non-editable pages are
661
+ unchanged.
662
+
663
+ - 70b7780: Metadata editor: a failed LOAD no longer masquerades as field validation errors.
664
+
665
+ When the layered/draft fetch fails (network/500/timeout), `ResourceEditPage` previously still rendered the form on empty defaults, so the client Zod validator fired spurious "name/label/regions required" diagnostics — making a transport failure look like a structurally broken item.
666
+
667
+ - New `loadFailed` state, set in the load catch block and reset at the start of each load.
668
+ - The validation-diagnostics banner is now gated by `shouldRenderDiagnostics()`, which suppresses the diagnostics block entirely on load failure, so the empty-default form's required-field issues never surface.
669
+ - The top error banner is now explicit: "Failed to load &lt;type&gt;/&lt;name&gt;: &lt;message&gt;" (new `engine.edit.loadFailed` i18n key, en + zh-CN).
670
+
671
+ The happy path is unaffected: a genuinely-invalid item that loaded successfully still shows its validation diagnostics.
672
+
673
+ - fe69471: Flow designer: start a new flow with a trigger, and stop the edge "+" overlapping branch labels
674
+
675
+ Two more dogfooding fixes for the Studio flow designer:
676
+
677
+ - **Empty flow → Start node.** An empty editable flow's "Add node" inserted a
678
+ generic `task` node; it now seeds a `start` (trigger) node — the canonical
679
+ entry point every flow needs — so the canvas opens on the trigger and the
680
+ author builds forward from there.
681
+ - **Edge insert handle no longer collides with the branch label.** The "insert
682
+ node" `+` button and the branch/condition label pill were both centered on the
683
+ edge midpoint, so on a labeled edge (`approve`, `if …`) the `+` sat on top of
684
+ the label. The `+` now slides to the right of the label when one is present
685
+ (unlabeled edges keep the centered `+`).
686
+
687
+ Verified in-browser: labeled edges show the label and a clear, separate insert
688
+ handle; `tsc --noEmit` clean.
689
+
690
+ - 0032b23: FlowRunner: close the runner when a resume ends in a terminal flow failure.
691
+
692
+ The engine consumes a run's suspension before executing downstream nodes
693
+ (resume-once semantics), so a resume whose `AutomationResult` is
694
+ `success: false` can never be retried — the old behavior left the dialog open
695
+ and a second Submit hit "No suspended run". Transport-level failures (network
696
+ / 5xx) still keep the dialog open for retry.
697
+
698
+ - e8d56ec: fix(form): honour the form view layout in the full-page record form
699
+
700
+ `RecordFormPage` hard-coded `formType: 'simple'`, so a record's declared form
701
+ view layout (`tabbed` / `wizard` / `split`) was ignored on the full-page
702
+ create/edit route — `ObjectForm` already renders every variant, the entry point
703
+ just never passed it through. It now reads the object's `form` / `formViews.default`
704
+ `type` + `sections` and forwards them (plus variant props: defaultTab, tabPosition,
705
+ allowSkip, showStepIndicator, split\*). Page-level layouts only — `drawer`/`modal`
706
+ are presentation/open-modes, not record-page layouts, so they fall back to `simple`.
707
+
708
+ Refs objectstack-ai/framework#1890
709
+
710
+ - 0ad72a6: fix: pass full gantt config to renderer, render multi-value lookups in gantt tooltips, persist `bodyExtra` on dataSource actions, and complete zh/en gantt labels
711
+
712
+ Four platform gaps that the EHR app previously worked around with `node_modules` patches:
713
+
714
+ - **app-shell / ObjectView** — the `config.gantt → renderer props` adapter was a hardcoded 6-field whitelist, so `parentField`/`typeField` (and `baseline*`, `groupByField`, `resourceView`, `tooltipFields`, `quickFilters`, …) never reached the renderer and the chart degraded to a flat list. It now spreads the full `viewDef.gantt` first, then applies the three required defaults last (mirroring the gallery branch).
715
+ - **plugin-gantt / ObjectGantt** — the tooltip value formatter only handled single-object lookups, so a multi-value lookup (a populated `[{name},{name}]` array) fell through to `'—'`. It now maps each array element to its display value and joins them.
716
+ - **app-shell / useConsoleActionRuntime** — `bodyExtra` was merged only on the absolute-HTTP path; the generic `dataSource.update` path ignored it, so a pure-confirmation action (no params array) left an empty payload and persisted nothing. `bodyExtra` is now merged last on that path too, matching the documented semantics.
717
+ - **i18n** — added the gantt labels the 9.x renderer references but the bundles lacked: `toolbar.thisWeek/thisMonth/exportPdf/saveLayout`, `viewMode.year`, `menu.add*/removeDependency/noCandidates`, the `linkType.*` and `conflict.*` blocks, and `readOnly*` — in both `en` (canonical key source) and `zh`.
718
+
719
+ - e133fae: Gate the runtime report and dashboard editors behind an admin check. Editing a report or dashboard mutates the **shared** definition (it writes the single `sys_report` / `sys_dashboard` record, not a per-user copy), but the edit buttons were shown to every user — so any viewer could change a report/dashboard for everyone. The "Edit" affordance (and its config panel) is now admin-only, matching ObjectView's existing view-config gate. This is the first step of ADR-0034 (runtime edits are an admin quick-edit of the shared definition).
720
+ - 18d0339: Relabel metadata-driven UI on a language switch without a page refresh (#1319)
721
+
722
+ Switching the UI language left server-resolved metadata labels (object/field/
723
+ view labels, action-dialog text) in the old language until a hard refresh,
724
+ because renderers cache those labels by object name and never refetch on a
725
+ language change.
726
+
727
+ **`@object-ui/auth`** — `createAuthenticatedFetch` now folds the active
728
+ `<html lang>` into `Accept-Language` on API calls (never clobbering an explicit
729
+ header), so a switch carries the new locale on every subsequent request.
730
+
731
+ **`@object-ui/app-shell`** — `ConnectedShellInner` drops the adapter's
732
+ locale-blind metadata cache in the render phase and remounts the metadata
733
+ subtree via `key={language}`, so every renderer refetches in the new locale.
734
+ The adapter and its connection sit above the key and are preserved — an in-app
735
+ relabel, not a reconnect.
736
+
737
+ **`@object-ui/i18n`** — dev-mode missing-key warnings: `createI18n` gains
738
+ `warnMissingKeys` (default on outside production) wiring a deduped i18next
739
+ `missingKeyHandler`. `useObjectLabel`'s convention-key probes are flagged so
740
+ their intentional misses (which fall back to server metadata) stay silent.
741
+
742
+ Pairs with the framework-side locale-aware metadata changes in
743
+ `@objectstack/client` / `@objectstack/objectql` / `@objectstack/rest`.
744
+
745
+ - 59b6bbb: i18n the managed-by empty states for system / append-only / better-auth object lists.
746
+
747
+ `resolveManagedByEmptyState` previously hardcoded English titles and messages (e.g. "No identity records", "No events recorded"), so list views for managed objects (identity, audit logs, system-generated records) rendered English regardless of locale. It now takes the `t` translator and resolves `list.managedBy.{system,appendOnly,betterAuth}.{title,message}` (English kept as `defaultValue` fallbacks); `ObjectView` passes its `t` through. Added the keys to the `en` and `zh` locale packs.
748
+
749
+ - e95cc25: Fix the NavigationSyncEffect baseline race: lazily-loaded `page`/`dashboard` metadata (and the empty cache during `invalidate()` refetch) could seed a partial diff baseline, making platform `sys_` pages look "user added" — the effect then wrote them into every app's navigation, 403ing on ADR-0010 locked apps (red "Failed to update navigation" toasts) and polluting writable apps. The effect now diffs only while both types are `status === 'ready'` (new optional `MetadataContextValue.getTypeStatus`), never treats `sys_`-prefixed artifacts as user creations, and skips apps whose `_lock`/`protection.lock` is `full`/`no-overlay`.
750
+ - e265a40: fix(app-shell): resolve 51 react-hooks/rules-of-hooks errors in ObjectView
751
+
752
+ ObjectView had a mid-component early return (`if (!objectDef) return …`) sitting before ~50 hooks, which violated the Rules of Hooks and risked a `Rendered fewer hooks than expected` crash if `objectDef` flipped present→absent→present on a live instance (object switch, metadata refresh, reload failure). Split the component so the missing-object empty state lives in a thin `ObjectView` wrapper, while `ObjectViewInner` (mounted only when the definition exists) calls all hooks unconditionally. Behavior is unchanged.
753
+
754
+ - 42e557a: "Your organization" Install routes by deployment shape: install-local runtimes (runtime-config `features.installLocal`) install via `/marketplace/install-local` into their OWN kernel (the bound oscc\_ credential fetches the org manifest — ADR-0008); cloud-managed environments keep the control-plane `/cloud-connection/install` path. Previously the org Install button always called the control-plane path, which 401s on self-hosted runtimes.
755
+ - af74a5d: Add an admin-only "Edit in studio" affordance to the runtime PageView. Custom pages are authored in the metadata studio (canvas + inspector), not at runtime — so instead of embedding the heavyweight page canvas, PageView now shows a lightweight top-right button (admins only) that deep-links to the page's studio editor (`/apps/:app/metadata/page/:name`). This gives view/report/dashboard/page a consistent runtime admin edit entry point.
756
+ - 3cc38fe: perf(detail/header): lazy + dedupe related-list fan-out, coalesce header polls
757
+
758
+ Opening a record detail fired ~50 concurrent `/api/v1` requests that
759
+ head-of-line-blocked one another on a single control-plane container.
760
+
761
+ - `RecordDetailView` no longer eager-preloads reverse-reference children
762
+ when the reference rail renders them (that data was discarded while the
763
+ rail re-fetched the same collections).
764
+ - `record:reference_rail` now gates fetching on visibility
765
+ (`IntersectionObserver`; the rail is `hidden xl:flex`), caps concurrency
766
+ at 3, and fetches once per `(parentId + entries)` via a signature guard,
767
+ applying results through a mounted ref.
768
+ - `AppHeader` inbox/notification, approvals, and activity pollers gained
769
+ in-flight guards so bootstrap effect re-runs coalesce to one request; the
770
+ approvals poll now sends one request with all identities comma-joined
771
+ instead of one per identity.
772
+
773
+ Measured locally: opening an environment detail dropped from ~52 to ~17
774
+ requests, related collections from ×3–5 each to ×1, approvals from ×9 to ≤3.
775
+
776
+ - 053a164: fix(metadata): keep form-family views out of the runtime list-view switcher
777
+
778
+ The backend now exposes each view as an independent **ViewItem** (ADR-0017,
779
+ "Object has-many View"): `{ name: '<object>.<key>', object, viewKind:
780
+ 'list' | 'form', config }`. The Studio preview was already taught this shape,
781
+ but the runtime console path was not — `MetadataProvider.mergeViewsIntoObjects`
782
+ only understood the legacy aggregated container (`{ list, form, listViews,
783
+ formViews }`) and ignored `viewKind` entirely. As a result a form-family view
784
+ (e.g. `crm_activity.default`, expanded from `formViews.default`) was neither
785
+ recognized nor excluded: navigating to its `/view/<name>` URL silently fell
786
+ back to the default grid list instead of being treated as a record form.
787
+
788
+ `mergeViewsIntoObjects` now recognizes the ViewItem shape and routes by
789
+ `viewKind` — `'list'` → `objectDef.listViews`, `'form'` → `objectDef.formViews`
790
+ — so FORM-family views never enter the list-view switcher (which reads only
791
+ `listViews`). Each item's `config` body is flattened to the renderer shape so
792
+ `type`/`columns`/`calendar`/… survive, the canonical `<object>.<key>` name is
793
+ used as the view id (so `/view/<name>` resolves), and the legacy container is
794
+ skipped for any object that already has expanded ViewItems (no double-listing).
795
+ Objects served only as a legacy container are unaffected.
796
+
797
+ - db8cd00: feat(app-shell): global settle signal (window.\_\_objectui) + region aria-busy (ADR-0054 Phase 3)
798
+
799
+ Adds a single machine-readable "is the app idle?" predicate (ADR-0054 C5). The
800
+ data layer wraps the adapter's `fetch` to count in-flight requests, mirrored onto
801
+ `window.__objectui` with live `idle` / `pendingRequests` getters plus `whenIdle()`
802
+ and `subscribe()`. New `useSettleSignal()` React hook and lower-level exports
803
+ (`getPendingRequests`, `subscribeSettle`, `whenIdle`, `withSettleSignal`,
804
+ `installSettleSignalGlobal`). The list view and record-picker results regions now
805
+ set `aria-busy` while fetching and `data-state="loading|idle"` for region-level
806
+ waiting. Lets an automated (AI) driver wait for settle instead of hardcoding
807
+ timeouts.
808
+
809
+ - 2f31406: Refine Studio package-scoped navigation and home overview.
810
+
811
+ Studio now treats the selected package as the home overview scope, flattens the root Overview sidebar group, hides the duplicate all-metadata sidebar entry, redirects the invalid package metadata route to package management, preserves the selected package across package-management navigation, and adds a localized package-management sidebar label.
812
+
813
+ - d901f65: feat(app-shell): testability ratchet — ban synthetic-event triggers (ADR-0054 Phase 5)
814
+
815
+ Locks in the testability contract so it can't regress. A conformance test (in the
816
+ gating `pnpm test` job) fails the build if a new synthetic-event trigger
817
+ (`dispatchEvent(new KeyboardEvent/MouseEvent/PointerEvent)`) appears anywhere in
818
+ `packages/*/src` or `apps/*/src`; a matching local ESLint rule
819
+ (`object-ui/no-synthetic-event-trigger`) flags it in-editor. The last two
820
+ offenders — the sidebar swipe-to-open gestures (`UnifiedSidebar`, `AppSidebar`)
821
+ — are converted to a direct, idempotent `setOpenMobile(true)` (C1), so the tree
822
+ is clean at zero. Completes the ADR-0054 rollout.
823
+
824
+ - 8d1195d: Fix `type: 'url'` actions so they actually reach the backend in split-origin dev setups, and so reveal-once result dialogs render.
825
+
826
+ - `ActionRunner.executeUrl`: when context provides `apiBase`, relative `/api/...`, `/_auth/...`, and `/_account/...` URLs are now promoted to absolute (`${apiBase}${path}`) before navigation. Same-origin API paths (with or without `apiBase`) trigger a full-page `window.location.href` rather than React-Router push — this is required for server-side OAuth redirect dances (e.g. better-auth `/sign-in/social`) that React Router would otherwise swallow into the SPA's fallback route.
827
+ - `ActionRunner.buildInterpolationContext`: surfaces `ctx.apiBase` for action targets that want to template it explicitly.
828
+ - `ObjectView`: passes `apiBase: import.meta.env.VITE_SERVER_URL` into the toolbar `ActionProvider` context so the above resolves.
829
+ - `action-button` and `action-menu` renderers now forward `resultDialog` when invoking the runner. Previously this field was silently dropped by an explicit whitelist, breaking every "show once, then hide" flow (2FA QR/backup codes, OAuth client_secret, regenerated tokens).
830
+
831
+ - 5ab52c0: feat(app-shell): useUrlOverlay primitive + URL-addressable keyboard-shortcuts dialog (ADR-0054 Phase 2)
832
+
833
+ Adds `useUrlOverlay(key)` — a reusable, router-aware hook that stores a navigable
834
+ overlay's open state in a `?<key>=1` URL param (idempotent open, deep-linkable,
835
+ restore-on-reload, back/forward; `alias`/`value`/`replace` configurable). The
836
+ command palette is refactored onto it (behavior unchanged: `?palette=1`, `?cmdk=1`
837
+ alias). The keyboard-shortcuts dialog becomes URL-addressable (`?shortcuts=1`) and
838
+ gains a click entry in the header Help menu — previously it was only reachable via
839
+ the `?` key (which remains an accelerator). Generalizes ADR-0054 invariants C1/C3
840
+ beyond the Phase 1 reference fix; the shared overlay primitives already carry
841
+ `data-testid` + Radix `data-state`, documented in the README.
842
+
843
+ - ef3c654: Localize the View variant inspector labels. The inspector (the View "home" panel, also hosted by the runtime ObjectView right-rail view editor after the spec-driven migration) previously rendered hardcoded English labels — "Label", "View type", "Object", the view-type dropdown options, and the "spec schema unavailable" hint. These now route through the metadata-admin i18n catalog (en + zh) so the runtime console and the studio both display localized text.
844
+ - Updated dependencies [5976ba3]
845
+ - Updated dependencies [a00e16d]
846
+ - Updated dependencies [eaccefd]
847
+ - Updated dependencies [f7f325d]
848
+ - Updated dependencies [c12986e]
849
+ - Updated dependencies [71d7ce0]
850
+ - Updated dependencies [0c95963]
851
+ - Updated dependencies [30ee761]
852
+ - Updated dependencies [81c0777]
853
+ - Updated dependencies [053c948]
854
+ - Updated dependencies [b99d9bd]
855
+ - Updated dependencies [053c948]
856
+ - Updated dependencies [89e113c]
857
+ - Updated dependencies [ddbe4a2]
858
+ - Updated dependencies [2d47e94]
859
+ - Updated dependencies [c5a7d6f]
860
+ - Updated dependencies [40c79df]
861
+ - Updated dependencies [9049bbe]
862
+ - Updated dependencies [053c948]
863
+ - Updated dependencies [053c948]
864
+ - Updated dependencies [77cc6bb]
865
+ - Updated dependencies [6c0c92c]
866
+ - Updated dependencies [97c6831]
867
+ - Updated dependencies [cb2fdb1]
868
+ - Updated dependencies [a58c6b8]
869
+ - Updated dependencies [c3749eb]
870
+ - Updated dependencies [39c89e7]
871
+ - Updated dependencies [78f9c16]
872
+ - Updated dependencies [92449ef]
873
+ - Updated dependencies [c09f44e]
874
+ - Updated dependencies [f6044fa]
875
+ - Updated dependencies [3d036a9]
876
+ - Updated dependencies [6cfa330]
877
+ - Updated dependencies [ad8ade6]
878
+ - Updated dependencies [e270c7d]
879
+ - Updated dependencies [ab168e4]
880
+ - Updated dependencies [d54346c]
881
+ - Updated dependencies [5332639]
882
+ - Updated dependencies [3870c20]
883
+ - Updated dependencies [2eb3096]
884
+ - Updated dependencies [b88c560]
885
+ - Updated dependencies [0ad72a6]
886
+ - Updated dependencies [bd398df]
887
+ - Updated dependencies [3fa23a7]
888
+ - Updated dependencies [18d0339]
889
+ - Updated dependencies [66ed3ad]
890
+ - Updated dependencies [c6445b6]
891
+ - Updated dependencies [80c133c]
892
+ - Updated dependencies [5e1b838]
893
+ - Updated dependencies [59b6bbb]
894
+ - Updated dependencies [d16566f]
895
+ - Updated dependencies [69510df]
896
+ - Updated dependencies [b148daf]
897
+ - Updated dependencies [90acb7f]
898
+ - Updated dependencies [7913390]
899
+ - Updated dependencies [514f426]
900
+ - Updated dependencies [586a027]
901
+ - Updated dependencies [00f8d2d]
902
+ - Updated dependencies [9aac2b8]
903
+ - Updated dependencies [1394e34]
904
+ - Updated dependencies [e95cc25]
905
+ - Updated dependencies [abe8ebc]
906
+ - Updated dependencies [300d755]
907
+ - Updated dependencies [3cc38fe]
908
+ - Updated dependencies [bd8b054]
909
+ - Updated dependencies [053c948]
910
+ - Updated dependencies [053c948]
911
+ - Updated dependencies [4eb9cb6]
912
+ - Updated dependencies [7c239fd]
913
+ - Updated dependencies [858ad94]
914
+ - Updated dependencies [c849d3b]
915
+ - Updated dependencies [7b71cd8]
916
+ - Updated dependencies [2270239]
917
+ - Updated dependencies [db8cd00]
918
+ - Updated dependencies [650bd1f]
919
+ - Updated dependencies [f011479]
920
+ - Updated dependencies [2f31406]
921
+ - Updated dependencies [18728c1]
922
+ - Updated dependencies [8426db7]
923
+ - Updated dependencies [8d1195d]
924
+ - Updated dependencies [9bef806]
925
+ - @object-ui/core@7.0.0
926
+ - @object-ui/components@7.0.0
927
+ - @object-ui/plugin-grid@7.0.0
928
+ - @object-ui/plugin-detail@7.0.0
929
+ - @object-ui/react@7.0.0
930
+ - @object-ui/plugin-report@7.0.0
931
+ - @object-ui/data-objectstack@7.0.0
932
+ - @object-ui/plugin-chatbot@7.0.0
933
+ - @object-ui/plugin-list@7.0.0
934
+ - @object-ui/i18n@7.0.0
935
+ - @object-ui/types@7.0.0
936
+ - @object-ui/plugin-form@7.0.0
937
+ - @object-ui/fields@7.0.0
938
+ - @object-ui/plugin-charts@7.0.0
939
+ - @object-ui/plugin-dashboard@7.0.0
940
+ - @object-ui/auth@7.0.0
941
+ - @object-ui/plugin-view@7.0.0
942
+ - @object-ui/layout@7.0.0
943
+ - @object-ui/plugin-calendar@7.0.0
944
+ - @object-ui/plugin-designer@7.0.0
945
+ - @object-ui/plugin-editor@7.0.0
946
+ - @object-ui/plugin-kanban@7.0.0
947
+ - @object-ui/collaboration@7.0.0
948
+ - @object-ui/permissions@7.0.0
949
+ - @object-ui/providers@7.0.0
950
+
3
951
  ## 6.2.3
4
952
 
5
953
  ### Patch Changes