@object-ui/app-shell 6.2.3 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/CHANGELOG.md +1229 -0
  2. package/README.md +292 -0
  3. package/dist/assistant/assistantBus.d.ts +72 -0
  4. package/dist/assistant/assistantBus.js +133 -0
  5. package/dist/chrome/CommandPalette.d.ts +1 -1
  6. package/dist/chrome/CommandPalette.js +26 -22
  7. package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
  8. package/dist/chrome/ConsoleToaster.d.ts +1 -1
  9. package/dist/chrome/ConsoleToaster.js +3 -1
  10. package/dist/chrome/ErrorBoundary.d.ts +1 -1
  11. package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
  12. package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
  13. package/dist/chrome/LoadingScreen.d.ts +1 -1
  14. package/dist/chrome/LoadingScreen.js +22 -26
  15. package/dist/chrome/RouteFader.d.ts +1 -1
  16. package/dist/chrome/ThemeProvider.d.ts +1 -1
  17. package/dist/components/ManagedByBadge.d.ts +1 -1
  18. package/dist/console/AppContent.d.ts +1 -1
  19. package/dist/console/AppContent.js +184 -39
  20. package/dist/console/ConsoleShell.d.ts +7 -7
  21. package/dist/console/ConsoleShell.js +32 -3
  22. package/dist/console/ai/AiChatPage.d.ts +88 -1
  23. package/dist/console/ai/AiChatPage.js +747 -66
  24. package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
  25. package/dist/console/ai/ConversationsSidebar.js +149 -34
  26. package/dist/console/ai/LiveCanvas.d.ts +28 -0
  27. package/dist/console/ai/LiveCanvas.js +80 -0
  28. package/dist/console/ai/reconcileTurn.d.ts +8 -0
  29. package/dist/console/ai/reconcileTurn.js +20 -0
  30. package/dist/console/auth/AuthPageLayout.d.ts +1 -1
  31. package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
  32. package/dist/console/auth/LoginPage.d.ts +1 -1
  33. package/dist/console/auth/RegisterPage.d.ts +1 -1
  34. package/dist/console/auth/RegisterPage.js +23 -3
  35. package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
  36. package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
  37. package/dist/console/home/AppCard.d.ts +1 -1
  38. package/dist/console/home/AppCard.js +6 -12
  39. package/dist/console/home/HomeAppsStrip.d.ts +8 -0
  40. package/dist/console/home/HomeAppsStrip.js +61 -0
  41. package/dist/console/home/HomeLayout.d.ts +1 -1
  42. package/dist/console/home/HomeLayout.js +3 -1
  43. package/dist/console/home/HomePage.d.ts +1 -2
  44. package/dist/console/home/HomePage.js +149 -21
  45. package/dist/console/home/HomeRail.d.ts +22 -0
  46. package/dist/console/home/HomeRail.js +62 -0
  47. package/dist/console/home/QuickActions.d.ts +1 -1
  48. package/dist/console/home/QuickActions.js +3 -11
  49. package/dist/console/home/RecentApps.d.ts +1 -1
  50. package/dist/console/home/RecentApps.js +2 -2
  51. package/dist/console/home/StarredApps.d.ts +1 -1
  52. package/dist/console/home/StarredApps.js +2 -2
  53. package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
  54. package/dist/console/marketplace/InstalledListWidget.js +93 -0
  55. package/dist/console/marketplace/MarkdownText.d.ts +1 -1
  56. package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
  57. package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
  58. package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
  59. package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
  60. package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
  61. package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
  62. package/dist/console/marketplace/MarketplacePage.js +60 -3
  63. package/dist/console/marketplace/PackageIcon.d.ts +1 -1
  64. package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
  65. package/dist/console/marketplace/PluginDisclosure.js +38 -0
  66. package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
  67. package/dist/console/marketplace/marketplaceApi.js +254 -1
  68. package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
  69. package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
  70. package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
  71. package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
  72. package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
  73. package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
  74. package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
  75. package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
  76. package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
  77. package/dist/context/CommandPaletteProvider.d.ts +44 -0
  78. package/dist/context/CommandPaletteProvider.js +71 -0
  79. package/dist/context/FavoritesProvider.d.ts +1 -1
  80. package/dist/context/NavigationContext.d.ts +1 -1
  81. package/dist/context/RecentItemsProvider.d.ts +2 -2
  82. package/dist/context/UserStateAdapters.d.ts +1 -1
  83. package/dist/context/index.d.ts +2 -0
  84. package/dist/context/index.js +1 -0
  85. package/dist/hooks/index.d.ts +5 -2
  86. package/dist/hooks/index.js +4 -1
  87. package/dist/hooks/useActionModal.d.ts +53 -0
  88. package/dist/hooks/useActionModal.js +111 -0
  89. package/dist/hooks/useChatConversation.d.ts +137 -4
  90. package/dist/hooks/useChatConversation.js +316 -25
  91. package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
  92. package/dist/hooks/useConsoleActionRuntime.js +564 -0
  93. package/dist/hooks/useConversationList.js +61 -3
  94. package/dist/hooks/useHomeInbox.d.ts +13 -0
  95. package/dist/hooks/useHomeInbox.js +142 -0
  96. package/dist/hooks/useNavPins.js +17 -23
  97. package/dist/hooks/useNavigationSync.d.ts +33 -0
  98. package/dist/hooks/useNavigationSync.js +98 -12
  99. package/dist/hooks/useReconcileOnError.d.ts +40 -0
  100. package/dist/hooks/useReconcileOnError.js +37 -0
  101. package/dist/hooks/useRecordApprovals.d.ts +18 -19
  102. package/dist/hooks/useRecordApprovals.js +24 -40
  103. package/dist/hooks/useResponsiveSidebar.js +14 -5
  104. package/dist/hooks/useSettleSignal.d.ts +19 -0
  105. package/dist/hooks/useSettleSignal.js +20 -0
  106. package/dist/hooks/useTrackRouteAsRecent.js +35 -0
  107. package/dist/hooks/useUrlOverlay.d.ts +62 -0
  108. package/dist/hooks/useUrlOverlay.js +88 -0
  109. package/dist/index.d.ts +18 -8
  110. package/dist/index.js +17 -5
  111. package/dist/layout/ActivityFeed.d.ts +1 -1
  112. package/dist/layout/AppHeader.d.ts +3 -2
  113. package/dist/layout/AppHeader.js +237 -72
  114. package/dist/layout/AppSidebar.d.ts +2 -1
  115. package/dist/layout/AppSidebar.js +26 -46
  116. package/dist/layout/AppSwitcher.d.ts +2 -1
  117. package/dist/layout/AppSwitcher.js +9 -5
  118. package/dist/layout/AuthPageLayout.d.ts +1 -1
  119. package/dist/layout/ConnectionStatus.d.ts +1 -1
  120. package/dist/layout/ConnectionStatus.js +9 -6
  121. package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
  122. package/dist/layout/ConsoleChatbotFab.js +16 -2
  123. package/dist/layout/ConsoleFloatingChatbot.d.ts +34 -2
  124. package/dist/layout/ConsoleFloatingChatbot.js +391 -41
  125. package/dist/layout/ConsoleLayout.d.ts +1 -1
  126. package/dist/layout/ConsoleLayout.js +27 -11
  127. package/dist/layout/ContextSelectors.d.ts +44 -0
  128. package/dist/layout/ContextSelectors.js +242 -0
  129. package/dist/layout/InboxPopover.d.ts +6 -1
  130. package/dist/layout/InboxPopover.js +25 -6
  131. package/dist/layout/LocaleSwitcher.d.ts +1 -1
  132. package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
  133. package/dist/layout/LocalizedSidebarTrigger.js +15 -0
  134. package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
  135. package/dist/layout/ModeToggle.d.ts +1 -1
  136. package/dist/layout/PageHeader.d.ts +1 -1
  137. package/dist/layout/UnifiedSidebar.d.ts +2 -1
  138. package/dist/layout/UnifiedSidebar.js +116 -15
  139. package/dist/layout/agentPicker.d.ts +56 -0
  140. package/dist/layout/agentPicker.js +40 -0
  141. package/dist/observability/index.d.ts +1 -0
  142. package/dist/observability/index.js +1 -0
  143. package/dist/observability/settleSignal.d.ts +64 -0
  144. package/dist/observability/settleSignal.js +131 -0
  145. package/dist/preview/CommitTimeline.d.ts +15 -0
  146. package/dist/preview/CommitTimeline.js +82 -0
  147. package/dist/preview/DraftChangesPanel.d.ts +19 -0
  148. package/dist/preview/DraftChangesPanel.js +114 -0
  149. package/dist/preview/DraftPreviewBar.d.ts +8 -0
  150. package/dist/preview/DraftPreviewBar.js +86 -0
  151. package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
  152. package/dist/preview/PreviewDraftEmptyState.js +47 -0
  153. package/dist/preview/PreviewModeContext.d.ts +57 -0
  154. package/dist/preview/PreviewModeContext.js +99 -0
  155. package/dist/preview/UnpublishedAppBar.d.ts +8 -0
  156. package/dist/preview/UnpublishedAppBar.js +83 -0
  157. package/dist/preview/commitHistory.d.ts +28 -0
  158. package/dist/preview/commitHistory.js +48 -0
  159. package/dist/preview/draftStatus.d.ts +20 -0
  160. package/dist/preview/draftStatus.js +27 -0
  161. package/dist/preview/usePublishAllDrafts.d.ts +18 -0
  162. package/dist/preview/usePublishAllDrafts.js +106 -0
  163. package/dist/providers/AdapterProvider.d.ts +1 -1
  164. package/dist/providers/AdapterProvider.js +6 -1
  165. package/dist/providers/ExpressionProvider.d.ts +1 -1
  166. package/dist/providers/MetadataProvider.d.ts +17 -2
  167. package/dist/providers/MetadataProvider.js +192 -12
  168. package/dist/runtime-config.d.ts +46 -2
  169. package/dist/runtime-config.js +39 -2
  170. package/dist/services/builtinComponents.js +68 -59
  171. package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
  172. package/dist/skeletons/SkeletonDetail.d.ts +1 -1
  173. package/dist/skeletons/SkeletonGrid.d.ts +1 -1
  174. package/dist/utils/appRoute.d.ts +21 -0
  175. package/dist/utils/appRoute.js +25 -0
  176. package/dist/utils/deriveRelatedLists.d.ts +54 -0
  177. package/dist/utils/deriveRelatedLists.js +91 -0
  178. package/dist/utils/index.d.ts +4 -0
  179. package/dist/utils/index.js +3 -0
  180. package/dist/utils/managedByEmptyState.d.ts +8 -1
  181. package/dist/utils/managedByEmptyState.js +13 -7
  182. package/dist/utils/preferLocal.d.ts +18 -0
  183. package/dist/utils/preferLocal.js +24 -0
  184. package/dist/views/ActionConfirmDialog.d.ts +1 -1
  185. package/dist/views/ActionConfirmDialog.js +3 -1
  186. package/dist/views/ActionParamDialog.d.ts +6 -1
  187. package/dist/views/ActionParamDialog.js +9 -3
  188. package/dist/views/ActionResultDialog.d.ts +13 -0
  189. package/dist/views/ActionResultDialog.js +134 -0
  190. package/dist/views/ComponentNavView.d.ts +14 -1
  191. package/dist/views/CreateViewDialog.d.ts +1 -1
  192. package/dist/views/DashboardConfigPanel.d.ts +28 -0
  193. package/dist/views/DashboardConfigPanel.js +81 -0
  194. package/dist/views/DashboardView.d.ts +4 -3
  195. package/dist/views/DashboardView.js +38 -239
  196. package/dist/views/FlowRunner.d.ts +31 -0
  197. package/dist/views/FlowRunner.js +121 -0
  198. package/dist/views/InterfaceListPage.d.ts +49 -0
  199. package/dist/views/InterfaceListPage.js +347 -0
  200. package/dist/views/MetadataInspector.d.ts +2 -2
  201. package/dist/views/ObjectView.d.ts +1 -1
  202. package/dist/views/ObjectView.js +209 -532
  203. package/dist/views/PageView.d.ts +8 -3
  204. package/dist/views/PageView.js +45 -32
  205. package/dist/views/RecordDetailView.d.ts +1 -1
  206. package/dist/views/RecordDetailView.js +363 -148
  207. package/dist/views/RecordFormPage.d.ts +1 -1
  208. package/dist/views/RecordFormPage.js +26 -1
  209. package/dist/views/ReportConfigPanel.d.ts +37 -0
  210. package/dist/views/ReportConfigPanel.js +85 -0
  211. package/dist/views/ReportView.d.ts +1 -1
  212. package/dist/views/ReportView.js +116 -7
  213. package/dist/views/RuntimeDraftBar.d.ts +30 -0
  214. package/dist/views/RuntimeDraftBar.js +112 -0
  215. package/dist/views/ScreenView.d.ts +70 -0
  216. package/dist/views/ScreenView.js +73 -0
  217. package/dist/views/SearchResultsPage.d.ts +1 -1
  218. package/dist/views/SearchResultsPage.js +8 -18
  219. package/dist/views/ViewConfigPanel.d.ts +24 -17
  220. package/dist/views/ViewConfigPanel.js +121 -77
  221. package/dist/views/index.d.ts +1 -1
  222. package/dist/views/index.js +1 -1
  223. package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
  224. package/dist/views/metadata-admin/AuditPanel.js +79 -0
  225. package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
  226. package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
  227. package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
  228. package/dist/views/metadata-admin/DirectoryPage.js +101 -24
  229. package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
  230. package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
  231. package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
  232. package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
  233. package/dist/views/metadata-admin/JsonSourceEditor.d.ts +39 -0
  234. package/dist/views/metadata-admin/JsonSourceEditor.js +196 -0
  235. package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
  236. package/dist/views/metadata-admin/LayeredDiff.js +171 -5
  237. package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
  238. package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
  239. package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
  240. package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
  241. package/dist/views/metadata-admin/PackagesPage.js +403 -0
  242. package/dist/views/metadata-admin/PageShell.d.ts +1 -1
  243. package/dist/views/metadata-admin/PageShell.js +9 -4
  244. package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
  245. package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
  246. package/dist/views/metadata-admin/QuickFind.js +6 -3
  247. package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
  248. package/dist/views/metadata-admin/RelatedPanel.js +20 -18
  249. package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
  250. package/dist/views/metadata-admin/ResourceEditPage.js +1250 -60
  251. package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
  252. package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
  253. package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
  254. package/dist/views/metadata-admin/ResourceListPage.js +258 -30
  255. package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
  256. package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
  257. package/dist/views/metadata-admin/SchemaForm.js +559 -49
  258. package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
  259. package/dist/views/metadata-admin/StudioHomePage.js +205 -0
  260. package/dist/views/metadata-admin/anchors.js +255 -24
  261. package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
  262. package/dist/views/metadata-admin/clientValidation.js +169 -0
  263. package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
  264. package/dist/views/metadata-admin/color-variant-field.js +38 -0
  265. package/dist/views/metadata-admin/createDerive.d.ts +75 -0
  266. package/dist/views/metadata-admin/createDerive.js +179 -0
  267. package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
  268. package/dist/views/metadata-admin/dashboard-schema.js +80 -0
  269. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
  270. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
  271. package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
  272. package/dist/views/metadata-admin/datasource/register.js +24 -0
  273. package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
  274. package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
  275. package/dist/views/metadata-admin/default-schemas.js +115 -10
  276. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
  277. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
  278. package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
  279. package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
  280. package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
  281. package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
  282. package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
  283. package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
  284. package/dist/views/metadata-admin/external/api.d.ts +100 -0
  285. package/dist/views/metadata-admin/external/api.js +124 -0
  286. package/dist/views/metadata-admin/i18n.d.ts +1 -0
  287. package/dist/views/metadata-admin/i18n.js +1252 -2
  288. package/dist/views/metadata-admin/index.d.ts +8 -5
  289. package/dist/views/metadata-admin/index.js +12 -2
  290. package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
  291. package/dist/views/metadata-admin/inspector-registry.js +11 -0
  292. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
  293. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
  294. package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
  295. package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
  296. package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
  297. package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
  298. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
  299. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
  300. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
  301. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
  302. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
  303. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +221 -0
  304. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
  305. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +126 -0
  306. package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
  307. package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
  308. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
  309. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
  310. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
  311. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
  312. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
  313. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +205 -0
  314. package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
  315. package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
  316. package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
  317. package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
  318. package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
  319. package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
  320. package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
  321. package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
  322. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
  323. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +55 -0
  324. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
  325. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +365 -0
  326. package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
  327. package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
  328. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
  329. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +218 -0
  330. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
  331. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
  332. package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
  333. package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
  334. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
  335. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
  336. package/dist/views/metadata-admin/inspectors/_shared.d.ts +128 -0
  337. package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
  338. package/dist/views/metadata-admin/inspectors/datasetFilterCondition.d.ts +24 -0
  339. package/dist/views/metadata-admin/inspectors/datasetFilterCondition.js +97 -0
  340. package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
  341. package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
  342. package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
  343. package/dist/views/metadata-admin/inspectors/flow-node-config.js +506 -0
  344. package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
  345. package/dist/views/metadata-admin/inspectors/index.js +45 -0
  346. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
  347. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
  348. package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
  349. package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
  350. package/dist/views/metadata-admin/issuePath.d.ts +22 -0
  351. package/dist/views/metadata-admin/issuePath.js +65 -0
  352. package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
  353. package/dist/views/metadata-admin/mergeServerFields.js +56 -0
  354. package/dist/views/metadata-admin/package-scope.d.ts +26 -0
  355. package/dist/views/metadata-admin/package-scope.js +43 -0
  356. package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
  357. package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
  358. package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
  359. package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
  360. package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
  361. package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
  362. package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
  363. package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
  364. package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
  365. package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
  366. package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
  367. package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
  368. package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
  369. package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
  370. package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
  371. package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
  372. package/dist/views/metadata-admin/previews/DatasetPreview.js +105 -0
  373. package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
  374. package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
  375. package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
  376. package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
  377. package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
  378. package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
  379. package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
  380. package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +49 -0
  381. package/dist/views/metadata-admin/previews/FlowCanvas.js +416 -0
  382. package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
  383. package/dist/views/metadata-admin/previews/FlowPreview.js +120 -0
  384. package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
  385. package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
  386. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
  387. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +204 -0
  388. package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
  389. package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
  390. package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
  391. package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
  392. package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
  393. package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
  394. package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
  395. package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
  396. package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
  397. package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
  398. package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
  399. package/dist/views/metadata-admin/previews/PagePreview.js +200 -5
  400. package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
  401. package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
  402. package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
  403. package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
  404. package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
  405. package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
  406. package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
  407. package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
  408. package/dist/views/metadata-admin/previews/ScreenPreview.d.ts +38 -0
  409. package/dist/views/metadata-admin/previews/ScreenPreview.js +61 -0
  410. package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
  411. package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
  412. package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
  413. package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
  414. package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
  415. package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
  416. package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
  417. package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
  418. package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
  419. package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
  420. package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
  421. package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
  422. package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
  423. package/dist/views/metadata-admin/previews/block-config.js +324 -0
  424. package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
  425. package/dist/views/metadata-admin/previews/block-types.js +110 -0
  426. package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
  427. package/dist/views/metadata-admin/previews/field-types.js +97 -0
  428. package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +102 -0
  429. package/dist/views/metadata-admin/previews/flow-canvas-layout.js +227 -0
  430. package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +96 -0
  431. package/dist/views/metadata-admin/previews/flow-canvas-parts.js +373 -0
  432. package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
  433. package/dist/views/metadata-admin/previews/form-preview.js +29 -0
  434. package/dist/views/metadata-admin/previews/index.js +43 -0
  435. package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
  436. package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
  437. package/dist/views/metadata-admin/previews/object-fields-io.d.ts +130 -0
  438. package/dist/views/metadata-admin/previews/object-fields-io.js +243 -0
  439. package/dist/views/metadata-admin/previews/screen-spec.d.ts +43 -0
  440. package/dist/views/metadata-admin/previews/screen-spec.js +108 -0
  441. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +102 -0
  442. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
  443. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +15 -0
  444. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +185 -0
  445. package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +73 -0
  446. package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +426 -0
  447. package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
  448. package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
  449. package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
  450. package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
  451. package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
  452. package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
  453. package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
  454. package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
  455. package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
  456. package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
  457. package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
  458. package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
  459. package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
  460. package/dist/views/metadata-admin/previews/widget-types.js +40 -0
  461. package/dist/views/metadata-admin/registry.d.ts +140 -19
  462. package/dist/views/metadata-admin/report-schema.d.ts +26 -0
  463. package/dist/views/metadata-admin/report-schema.js +121 -0
  464. package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
  465. package/dist/views/metadata-admin/useMetadata.js +155 -4
  466. package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
  467. package/dist/views/metadata-admin/view-item-normalize.js +68 -0
  468. package/dist/views/metadata-admin/view-schema.d.ts +16 -0
  469. package/dist/views/metadata-admin/view-schema.js +107 -0
  470. package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
  471. package/dist/views/metadata-admin/view-variant-model.js +64 -0
  472. package/dist/views/metadata-admin/widgets.d.ts +89 -1
  473. package/dist/views/metadata-admin/widgets.js +491 -17
  474. package/dist/views/runtime-metadata-persistence.d.ts +78 -0
  475. package/dist/views/runtime-metadata-persistence.js +89 -0
  476. package/dist/views/useOpenRecordList.d.ts +18 -0
  477. package/dist/views/useOpenRecordList.js +36 -0
  478. package/dist/views/userFilterUrlState.d.ts +15 -0
  479. package/dist/views/userFilterUrlState.js +53 -0
  480. package/dist/views/view-config-adapter.d.ts +38 -0
  481. package/dist/views/view-config-adapter.js +80 -0
  482. package/package.json +52 -34
  483. package/dist/views/DesignDrawer.d.ts +0 -28
  484. package/dist/views/DesignDrawer.js +0 -51
  485. package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
  486. package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
@@ -0,0 +1,73 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
3
+ /**
4
+ * ScreenView — the presentational body of a flow `screen` (framework
5
+ * screen-flow runtime, ADR-0019): the flat input-field list OR the named
6
+ * object's full create/edit form.
7
+ *
8
+ * Extracted from {@link FlowRunner} so the exact same renderer drives both the
9
+ * runtime (paused screen-flow → collect input → resume) and the Studio design
10
+ * preview ({@link ScreenPreview}). Keeping ONE renderer is deliberate: a
11
+ * separate preview reimplementation would drift from runtime — the
12
+ * simulator-vs-engine divergence fixed in #1927.
13
+ *
14
+ * It owns no submit/resume behaviour and no Dialog chrome — the caller frames
15
+ * it (the runtime wraps it in a Dialog + footer and resumes the run; the
16
+ * preview wraps it in a card and hides the persist bar).
17
+ */
18
+ import { Input, Label, Textarea, Checkbox, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, cn, } from '@object-ui/components';
19
+ import { ObjectForm } from '@object-ui/plugin-form';
20
+ /** Whether a screen renders the object-form body rather than the flat fields. */
21
+ export function isObjectFormScreen(screen) {
22
+ return screen.kind === 'object-form' && !!screen.objectName;
23
+ }
24
+ /** Seed flat-field values from each field's `defaultValue`. */
25
+ export function initialScreenValues(screen) {
26
+ const v = {};
27
+ for (const f of screen.fields)
28
+ if (f.defaultValue !== undefined)
29
+ v[f.name] = f.defaultValue;
30
+ return v;
31
+ }
32
+ export function ScreenView({ screen, values, onValueChange, dataSource, objects, objectForm, className }) {
33
+ if (isObjectFormScreen(screen)) {
34
+ const objectDef = Array.isArray(objects) ? objects.find((o) => o?.name === screen.objectName) : undefined;
35
+ const subforms = objectDef
36
+ ? (objectDef.form?.subforms ?? objectDef.formViews?.default?.subforms)
37
+ : undefined;
38
+ // Full object create/edit form (with inline master-detail grids). At runtime
39
+ // the form owns its own Save/Cancel bar; the preview hides it.
40
+ return (_jsx("div", { className: cn('py-2', className), children: dataSource ? (_jsx(ObjectForm, { schema: {
41
+ type: 'object-form',
42
+ formType: 'simple',
43
+ objectName: screen.objectName,
44
+ mode: screen.mode === 'edit' ? 'edit' : 'create',
45
+ recordId: screen.mode === 'edit' ? screen.recordId : undefined,
46
+ ...(screen.defaults ? { initialValues: screen.defaults } : {}),
47
+ layout: 'vertical',
48
+ subforms,
49
+ onSuccess: objectForm?.onSuccess,
50
+ onCancel: objectForm?.onCancel,
51
+ showSubmit: objectForm?.showSubmit ?? true,
52
+ showCancel: objectForm?.showCancel ?? true,
53
+ submitText: objectForm?.submitText ?? 'Save & Continue',
54
+ cancelText: objectForm?.cancelText ?? 'Cancel',
55
+ }, dataSource: dataSource }, screen.nodeId)) : (_jsx("div", { className: "text-sm text-destructive py-4", children: objectForm?.noDataSourceMessage ?? 'This step renders an object form but no data source is available.' })) }));
56
+ }
57
+ return (_jsx("div", { className: cn('space-y-4 py-2', className), children: screen.fields.map((f) => (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: `ff-${f.name}`, className: "text-sm", children: [f.label || f.name, f.required && _jsx("span", { className: "text-destructive", children: " *" })] }), _jsx(FieldInput, { field: f, value: values[f.name], onChange: (v) => onValueChange(f.name, v) })] }, f.name))) }));
58
+ }
59
+ export function FieldInput({ field, value, onChange }) {
60
+ const id = `ff-${field.name}`;
61
+ const t = (field.type || 'text').toLowerCase();
62
+ if (Array.isArray(field.options) && field.options.length > 0) {
63
+ return (_jsxs(Select, { value: value != null ? String(value) : undefined, onValueChange: (v) => onChange(v), children: [_jsx(SelectTrigger, { id: id, children: _jsx(SelectValue, { placeholder: field.placeholder || 'Select…' }) }), _jsx(SelectContent, { children: field.options.map((o, i) => (_jsx(SelectItem, { value: String(o.value), children: o.label }, i))) })] }));
64
+ }
65
+ if (t === 'boolean' || t === 'checkbox') {
66
+ return _jsx(Checkbox, { id: id, checked: value === true, onCheckedChange: (c) => onChange(c === true) });
67
+ }
68
+ if (t === 'textarea' || t === 'markdown') {
69
+ return _jsx(Textarea, { id: id, value: value ?? '', placeholder: field.placeholder, onChange: (e) => onChange(e.target.value) });
70
+ }
71
+ const htmlType = t === 'number' || t === 'currency' ? 'number' : t === 'email' ? 'email' : t === 'date' ? 'date' : 'text';
72
+ return (_jsx(Input, { id: id, type: htmlType, value: value ?? '', placeholder: field.placeholder, onChange: (e) => onChange(htmlType === 'number' ? (e.target.value === '' ? undefined : Number(e.target.value)) : e.target.value) }));
73
+ }
@@ -6,4 +6,4 @@
6
6
  * objects, dashboards, pages, and reports matching the query.
7
7
  * @module
8
8
  */
9
- export declare function SearchResultsPage(): import("react/jsx-runtime").JSX.Element;
9
+ export declare function SearchResultsPage(): import("react").JSX.Element;
@@ -13,6 +13,9 @@ import { Input, Card, CardContent, Badge, } from '@object-ui/components';
13
13
  import { Search, Database, LayoutDashboard, FileText, BarChart3, ArrowLeft, } from 'lucide-react';
14
14
  import { useObjectTranslation } from '@object-ui/i18n';
15
15
  import { useMetadata } from '../providers/MetadataProvider';
16
+ import { matchAppBySegment } from '../utils/appRoute';
17
+ import { resolveHref } from '@object-ui/layout';
18
+ import { useAuth } from '@object-ui/auth';
16
19
  /** Flatten nested navigation groups into a flat list of leaf items */
17
20
  function flattenNavigation(items) {
18
21
  const result = [];
@@ -46,30 +49,17 @@ export function SearchResultsPage() {
46
49
  const [query, setQuery] = useState(queryParam);
47
50
  const { apps: metadataApps } = useMetadata();
48
51
  const apps = metadataApps || [];
49
- const activeApp = apps.find((a) => a.name === appName) || apps[0];
52
+ const activeApp = matchAppBySegment(apps, appName) || apps[0];
50
53
  const baseUrl = `/apps/${appName}`;
54
+ const { user } = useAuth();
51
55
  // Build searchable items from navigation
52
56
  const allItems = useMemo(() => {
53
57
  if (!activeApp)
54
58
  return [];
55
59
  const navItems = flattenNavigation(activeApp.navigation || []);
60
+ const templateContext = { currentUserId: user?.id ?? null };
56
61
  return navItems.map((item) => {
57
- let href = '#';
58
- if (item.type === 'object') {
59
- href = `${baseUrl}/${item.objectName}`;
60
- if (item.viewName)
61
- href += `/view/${item.viewName}`;
62
- }
63
- else if (item.type === 'dashboard')
64
- href = `${baseUrl}/dashboard/${item.dashboardName}`;
65
- else if (item.type === 'page')
66
- href = `${baseUrl}/page/${item.pageName}`;
67
- else if (item.type === 'report')
68
- href = `${baseUrl}/report/${item.reportName}`;
69
- else if (item.type === 'component' && item.componentRef) {
70
- const segs = String(item.componentRef).split(':').filter(Boolean);
71
- href = `${baseUrl}/component/${segs.join('/')}`;
72
- }
62
+ const { href } = resolveHref(item, baseUrl, templateContext);
73
63
  return {
74
64
  id: item.id,
75
65
  label: item.label || item.objectName || item.dashboardName || item.pageName || item.reportName || '',
@@ -78,7 +68,7 @@ export function SearchResultsPage() {
78
68
  description: item.description,
79
69
  };
80
70
  }).filter((item) => item.href !== '#');
81
- }, [activeApp, baseUrl]);
71
+ }, [activeApp, baseUrl, user?.id]);
82
72
  // Filter results
83
73
  const results = useMemo(() => {
84
74
  if (!query.trim())
@@ -1,15 +1,22 @@
1
1
  /**
2
- * ViewConfigPanel — Airtable-style simplified configuration panel.
2
+ * ViewConfigPanel — the runtime ObjectView's right-rail "view editor".
3
3
  *
4
- * Renders a focused, opinionated set of sections (Page / Data /
5
- * Appearance / Toolbar / User actions / Navigation / Advanced) — matching
6
- * Airtable's Interface designer right rail. Power-user sections (records,
7
- * sharing, accessibility) are intentionally excluded to keep the panel
8
- * approachable; they can be re-introduced later as a dedicated "advanced"
9
- * settings dialog if needed.
4
+ * MIGRATED: this panel now hosts the studio's spec-driven
5
+ * {@link ViewVariantInspector} instead of the legacy `buildViewConfigSchema`
6
+ * engine, so the runtime and the metadata studio share ONE inspector. The
7
+ * inspector renders the per-view-type config fields straight from
8
+ * `@objectstack/spec` (grid / kanban / calendar / gallery / …) plus the
9
+ * shared column / filter / sort / toolbar sections.
10
10
  *
11
- * All changes are buffered in a local draft state. Clicking Save commits
12
- * the draft via onSave; Discard resets to the original activeView.
11
+ * The runtime ObjectView keeps the active view as a FLAT NamedListView; the
12
+ * inspector authors a canonical ViewItem draft. {@link view-config-adapter}
13
+ * bridges the two shapes so the `sys_view` persistence path is untouched:
14
+ * edits live as a ViewItem draft while the panel is open, then flatten back
15
+ * to the runtime view shape on update / save / create.
16
+ *
17
+ * Field loading is network-free: `objectDef.fields` is mapped into the
18
+ * inspector's `objectFieldsOverride` so neither the inspector nor its
19
+ * column editor issue a `client.get('object', …)` request.
13
20
  */
14
21
  /** Editor panel types that can be opened from clickable rows */
15
22
  export type EditorPanelType = 'columns' | 'filter' | 'sort';
@@ -29,13 +36,6 @@ export interface ViewConfigPanelProps {
29
36
  filter?: any[];
30
37
  sort?: any[];
31
38
  description?: string;
32
- showSearch?: boolean;
33
- showFilters?: boolean;
34
- showSort?: boolean;
35
- allowExport?: boolean;
36
- showDescription?: boolean;
37
- addRecordViaForm?: boolean;
38
- exportOptions?: any;
39
39
  [key: string]: any;
40
40
  };
41
41
  /** The object definition */
@@ -54,5 +54,12 @@ export interface ViewConfigPanelProps {
54
54
  onSave?: (draft: Record<string, any>) => void;
55
55
  /** Called when create-mode view is created */
56
56
  onCreate?: (config: Record<string, any>) => void;
57
+ /**
58
+ * Studio metadata client — drives saves and the ADR-0034 draft/publish
59
+ * chrome ({@link RuntimeDraftBar}).
60
+ */
61
+ metadataClient?: any;
62
+ /** Called after a publish / discard so the host can refresh its read. */
63
+ onAfterChange?: () => void;
57
64
  }
58
- export declare function ViewConfigPanel({ open, onClose, mode, activeView, objectDef, onViewUpdate, onSave, onCreate }: ViewConfigPanelProps): import("react/jsx-runtime").JSX.Element;
65
+ export declare function ViewConfigPanel({ open, onClose, mode, activeView, objectDef, onViewUpdate, onSave, onCreate, metadataClient, onAfterChange }: ViewConfigPanelProps): import("react").JSX.Element;
@@ -1,112 +1,156 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
- * ViewConfigPanel — Airtable-style simplified configuration panel.
3
+ * ViewConfigPanel — the runtime ObjectView's right-rail "view editor".
4
4
  *
5
- * Renders a focused, opinionated set of sections (Page / Data /
6
- * Appearance / Toolbar / User actions / Navigation / Advanced) — matching
7
- * Airtable's Interface designer right rail. Power-user sections (records,
8
- * sharing, accessibility) are intentionally excluded to keep the panel
9
- * approachable; they can be re-introduced later as a dedicated "advanced"
10
- * settings dialog if needed.
5
+ * MIGRATED: this panel now hosts the studio's spec-driven
6
+ * {@link ViewVariantInspector} instead of the legacy `buildViewConfigSchema`
7
+ * engine, so the runtime and the metadata studio share ONE inspector. The
8
+ * inspector renders the per-view-type config fields straight from
9
+ * `@objectstack/spec` (grid / kanban / calendar / gallery / …) plus the
10
+ * shared column / filter / sort / toolbar sections.
11
11
  *
12
- * All changes are buffered in a local draft state. Clicking Save commits
13
- * the draft via onSave; Discard resets to the original activeView.
12
+ * The runtime ObjectView keeps the active view as a FLAT NamedListView; the
13
+ * inspector authors a canonical ViewItem draft. {@link view-config-adapter}
14
+ * bridges the two shapes so the `sys_view` persistence path is untouched:
15
+ * edits live as a ViewItem draft while the panel is open, then flatten back
16
+ * to the runtime view shape on update / save / create.
17
+ *
18
+ * Field loading is network-free: `objectDef.fields` is mapped into the
19
+ * inspector's `objectFieldsOverride` so neither the inspector nor its
20
+ * column editor issue a `client.get('object', …)` request.
14
21
  */
15
22
  import { useMemo, useEffect, useRef, useCallback, useState } from 'react';
16
- import { ConfigPanelRenderer, useConfigDraft, Button } from '@object-ui/components';
17
- import { Settings2 } from 'lucide-react';
23
+ import { Button } from '@object-ui/components';
18
24
  import { useObjectTranslation } from '@object-ui/i18n';
19
- import { buildViewConfigSchema, deriveFieldOptions, toFilterGroup, toSortItems, VIEW_TYPE_LABELS, } from '@object-ui/plugin-view';
20
- export function ViewConfigPanel({ open, onClose, mode = 'edit', activeView, objectDef, onViewUpdate, onSave, onCreate }) {
25
+ import { ViewVariantInspector } from './metadata-admin/inspectors/ViewVariantInspector';
26
+ import { RuntimeDraftBar } from './RuntimeDraftBar';
27
+ import { isFormFamilyKey } from './metadata-admin/view-variant-model';
28
+ import { detectLocale } from './metadata-admin/i18n';
29
+ import { runtimeViewToInspectorDraft, inspectorDraftToRuntimeView, } from './view-config-adapter';
30
+ /**
31
+ * Map an Object definition's `fields` record into the inspector's flat field
32
+ * catalog so it can render field-reference pickers (columns, groupByField, …)
33
+ * without a network fetch.
34
+ */
35
+ function mapObjectFields(objectDef) {
36
+ const fields = objectDef.fields;
37
+ if (!fields || typeof fields !== 'object')
38
+ return [];
39
+ return Object.entries(fields).map(([name, def]) => {
40
+ const f = (def ?? {});
41
+ return {
42
+ name,
43
+ label: typeof f.label === 'string' && f.label ? f.label : name,
44
+ type: typeof f.type === 'string' ? f.type : 'text',
45
+ hidden: f.hidden === true,
46
+ };
47
+ });
48
+ }
49
+ export function ViewConfigPanel({ open, onClose, mode = 'edit', activeView, objectDef, onViewUpdate, onSave, onCreate, metadataClient, onAfterChange }) {
21
50
  const { t } = useObjectTranslation();
22
51
  const panelRef = useRef(null);
23
- // "Show advanced settings" when false (default), the panel only shows
24
- // the Airtable-essential subset. When true, every section/field is
25
- // surfaced for power users. Reset whenever the panel closes so reopening
26
- // returns to the simplified view.
27
- const [showAdvanced, setShowAdvanced] = useState(false);
28
- useEffect(() => {
29
- if (!open)
30
- setShowAdvanced(false);
31
- }, [open]);
32
- // Default empty view for create mode
52
+ const locale = useMemo(() => detectLocale(), []);
53
+ // Provisional id for a create-mode view. A lazy useState initializer runs
54
+ // exactly once, keeping the impure `Date.now()` out of render; the backend
55
+ // assigns the real `name` on create, so this only needs to be unique
56
+ // within the draft.
57
+ const [newViewId] = useState(() => `view_${Date.now()}`);
58
+ // Default empty view used to seed create mode.
33
59
  const defaultNewView = useMemo(() => ({
34
- id: `view_${Date.now()}`,
60
+ id: newViewId,
35
61
  label: t('console.objectView.newView'),
36
62
  type: 'grid',
37
63
  columns: [],
38
64
  filter: [],
39
65
  sort: [],
40
- showSearch: true,
41
- showFilters: true,
42
- showSort: true,
43
66
  }), []); // eslint-disable-line react-hooks/exhaustive-deps
44
- // Stabilize source reference: only change when view ID changes.
45
- // This prevents useConfigDraft from resetting on every parent re-render
46
- // (same behavior as original useEffect with [activeView.id] dependency).
67
+ // Inspector draft state. Rebuilt only when the source view ID (or create
68
+ // mode) changes not on every parent re-render — so in-flight edits are
69
+ // not clobbered (same stabilization the legacy panel used with stableKey).
47
70
  const stableKey = mode === 'create' ? 'create' : activeView.id;
48
- const stableActiveView = useMemo(() => ({ ...activeView }), [stableKey]);
49
- const effectiveActiveView = mode === 'create' ? defaultNewView : stableActiveView;
50
- // Schema-driven draft state management
51
- const { draft, isDirty, updateField, discard, undo, redo, canUndo, canRedo } = useConfigDraft(effectiveActiveView, {
52
- mode,
53
- onUpdate: onViewUpdate,
54
- });
55
- // Focus the panel when it opens for keyboard accessibility
71
+ const initialDraft = useMemo(() => runtimeViewToInspectorDraft(mode === 'create' ? defaultNewView : activeView, objectDef.name), [stableKey, objectDef.name]);
72
+ const [draft, setDraft] = useState(initialDraft);
73
+ const [isDirty, setIsDirty] = useState(false);
74
+ // Bumped on each edit-mode save so the draft/publish chrome surfaces the
75
+ // "unpublished changes" indicator immediately (the save writes a draft).
76
+ const [savedSignal, setSavedSignal] = useState(0);
77
+ // Mirror the committed draft into a ref so `handlePatch` can compute the
78
+ // next draft synchronously without a side-effecting state updater.
79
+ const draftRef = useRef(draft);
80
+ // Reset the draft when the source view changes — derived from `initialDraft`
81
+ // during render (React's "adjust state on prop change" pattern) rather than
82
+ // in an effect, so there's no extra render pass.
83
+ const lastDraftRef = useRef(initialDraft);
84
+ if (lastDraftRef.current !== initialDraft) {
85
+ lastDraftRef.current = initialDraft;
86
+ draftRef.current = initialDraft;
87
+ setDraft(initialDraft);
88
+ setIsDirty(false);
89
+ }
90
+ useEffect(() => { draftRef.current = draft; }, [draft]);
91
+ // Focus the panel when it opens for keyboard accessibility.
56
92
  useEffect(() => {
57
93
  if (open && panelRef.current) {
58
94
  panelRef.current.focus();
59
95
  }
60
96
  }, [open]);
61
- // Derive field options from objectDef
62
- const fieldOptions = useMemo(() => deriveFieldOptions(objectDef), [objectDef.fields]);
63
- // Bridge: filter/sort builder format
64
- const filterGroupValue = useMemo(() => toFilterGroup(draft.filter), [draft.filter]);
65
- const sortItemsValue = useMemo(() => toSortItems(draft.sort), [draft.sort]);
66
- // Build schema. essentialOnly is the default; the user can opt-in to the
67
- // full advanced surface via the "Show advanced settings" toggle below.
68
- const schema = useMemo(() => buildViewConfigSchema({
69
- t,
70
- fieldOptions,
71
- objectDef,
72
- updateField,
73
- filterGroupValue,
74
- sortItemsValue,
75
- essentialOnly: !showAdvanced,
76
- }), [t, fieldOptions, objectDef, updateField, filterGroupValue, sortItemsValue, showAdvanced]);
77
- // Override breadcrumb with dynamic view type
78
- const viewType = draft.type || 'grid';
79
- const dynamicSchema = useMemo(() => ({
80
- ...schema,
81
- breadcrumb: [t('console.objectView.page'), VIEW_TYPE_LABELS[viewType] || viewType],
82
- }), [schema, t, viewType]);
83
- // Save/discard handlers with create mode support
97
+ // Network-free field catalog sourced from the object definition the host
98
+ // already holds.
99
+ const objectFields = useMemo(() => mapObjectFields(objectDef), [objectDef.fields]); // eslint-disable-line react-hooks/exhaustive-deps
100
+ const familyKey = isFormFamilyKey(draft.viewKind) ? 'form' : 'list';
101
+ // Shallow-merge an inspector patch into the draft, then mirror the
102
+ // flattened runtime view back to the host field-by-field (matching the
103
+ // legacy onViewUpdate(field, value) contract ObjectView expects).
104
+ const handlePatch = useCallback((patch) => {
105
+ const next = { ...draftRef.current, ...patch };
106
+ draftRef.current = next;
107
+ setDraft(next);
108
+ setIsDirty(true);
109
+ if (onViewUpdate) {
110
+ const flat = inspectorDraftToRuntimeView(next);
111
+ for (const [field, value] of Object.entries(flat)) {
112
+ if (field === 'id')
113
+ continue;
114
+ onViewUpdate(field, value);
115
+ }
116
+ }
117
+ }, [onViewUpdate]);
84
118
  const handleSave = useCallback(() => {
119
+ const flat = inspectorDraftToRuntimeView(draft);
85
120
  if (mode === 'create') {
86
- onCreate?.(draft);
121
+ onCreate?.(flat);
87
122
  }
88
123
  else {
89
- onSave?.(draft);
124
+ onSave?.(flat);
125
+ setSavedSignal((s) => s + 1);
90
126
  }
91
- // Clear dirty state after save while preserving draft values
92
- discard();
93
- }, [draft, onSave, onCreate, mode, discard]);
127
+ setIsDirty(false);
128
+ }, [draft, onSave, onCreate, mode]);
94
129
  const handleDiscard = useCallback(() => {
95
130
  if (mode === 'create') {
96
131
  onClose();
97
132
  return;
98
133
  }
99
- discard();
100
- }, [discard, mode, onClose]);
134
+ setDraft(initialDraft);
135
+ setIsDirty(false);
136
+ }, [initialDraft, mode, onClose]);
137
+ // ADR-0034 (#1515): resume a pending draft into the inspector when the
138
+ // panel reopens (flag-ON only; the bar never fires this when the flag is
139
+ // off). The stored body is the flat runtime view, so adapt it back to the
140
+ // inspector draft shape before seeding.
141
+ const handleResumeDraft = useCallback((body) => {
142
+ const resumed = runtimeViewToInspectorDraft(body, objectDef.name);
143
+ draftRef.current = resumed;
144
+ setDraft(resumed);
145
+ setIsDirty(false);
146
+ }, [objectDef.name]);
101
147
  const panelTitle = mode === 'create'
102
148
  ? t('console.objectView.createView')
103
149
  : t('console.objectView.configureView');
104
- // Header-extra: "Show advanced" toggle button. Subtle gear icon button
105
- // sitting next to undo/redo/close clearly affordant but not visually
106
- // dominant. Title swaps between "Show advanced settings" and "Show fewer
107
- // settings" so the user always knows what the next click will do.
108
- const advancedToggle = (_jsx(Button, { size: "sm", variant: showAdvanced ? 'secondary' : 'ghost', onClick: () => setShowAdvanced(v => !v), className: "h-7 w-7 p-0", "data-testid": "view-config-advanced-toggle", "aria-pressed": showAdvanced, title: showAdvanced
109
- ? t('console.objectView.showFewerSettings', { defaultValue: 'Show fewer settings' })
110
- : t('console.objectView.showAdvancedSettings', { defaultValue: 'Show advanced settings' }), children: _jsx(Settings2, { className: "h-3.5 w-3.5" }) }));
111
- return (_jsx(ConfigPanelRenderer, { open: open, onClose: onClose, schema: dynamicSchema, draft: draft, isDirty: isDirty, onFieldChange: updateField, onSave: handleSave, onDiscard: handleDiscard, onUndo: undo, onRedo: redo, canUndo: canUndo, canRedo: canRedo, undoLabel: t('designer.undo'), redoLabel: t('designer.redo'), objectDef: objectDef, saveLabel: t('console.objectView.save'), discardLabel: t('console.objectView.discard'), panelRef: panelRef, role: "complementary", ariaLabel: panelTitle, tabIndex: -1, testId: "view-config-panel", closeTitle: t('console.objectView.closePanel'), footerTestId: "view-config-footer", saveTestId: "view-config-save", discardTestId: "view-config-discard", headerExtra: advancedToggle, className: "transition-all overflow-hidden" }));
150
+ if (!open) {
151
+ // Keep the slide container (owned by ObjectView) able to collapse to
152
+ // zero width without rendering inspector internals while hidden.
153
+ return _jsx("div", { ref: panelRef, tabIndex: -1, "data-testid": "view-config-panel", "aria-hidden": true });
154
+ }
155
+ return (_jsxs("div", { ref: panelRef, tabIndex: -1, role: "complementary", "aria-label": panelTitle, "data-testid": "view-config-panel", className: "flex h-full flex-col", children: [_jsx("div", { className: "min-h-0 flex-1 overflow-auto", children: _jsx(ViewVariantInspector, { type: "view", name: draft.name, draft: draft, variantKey: "config", familyKey: familyKey, isHome: true, readOnly: false, locale: locale, objectFieldsOverride: objectFields, onPatch: handlePatch }) }), _jsxs("div", { "data-testid": "view-config-footer", className: "flex items-center justify-end gap-2 border-t px-4 py-2.5", children: [mode === 'edit' && (_jsx(RuntimeDraftBar, { type: "view", name: activeView.id, metadataClient: metadataClient, dirty: isDirty, onResume: handleResumeDraft, savedSignal: savedSignal, onAfterChange: onAfterChange })), _jsx(Button, { variant: "ghost", size: "sm", onClick: handleDiscard, "data-testid": "view-config-discard", children: t('console.objectView.discard') }), _jsx(Button, { size: "sm", onClick: handleSave, disabled: mode === 'edit' && !isDirty, "data-testid": "view-config-save", children: t('console.objectView.save') })] })] }));
112
156
  }
@@ -8,7 +8,7 @@ export { ReportView } from './ReportView';
8
8
  export { SearchResultsPage } from './SearchResultsPage';
9
9
  export { ActionConfirmDialog } from './ActionConfirmDialog';
10
10
  export { ActionParamDialog } from './ActionParamDialog';
11
+ export { ActionResultDialog, type ResultDialogState } from './ActionResultDialog';
11
12
  export { MetadataToggle, MetadataPanel } from './MetadataInspector';
12
13
  export { ViewConfigPanel } from './ViewConfigPanel';
13
14
  export { CreateViewDialog } from './CreateViewDialog';
14
- export { DesignDrawer } from './DesignDrawer';
@@ -7,7 +7,7 @@ export { ReportView } from './ReportView';
7
7
  export { SearchResultsPage } from './SearchResultsPage';
8
8
  export { ActionConfirmDialog } from './ActionConfirmDialog';
9
9
  export { ActionParamDialog } from './ActionParamDialog';
10
+ export { ActionResultDialog } from './ActionResultDialog';
10
11
  export { MetadataToggle, MetadataPanel } from './MetadataInspector';
11
12
  export { ViewConfigPanel } from './ViewConfigPanel';
12
13
  export { CreateViewDialog } from './CreateViewDialog';
13
- export { DesignDrawer } from './DesignDrawer';
@@ -0,0 +1,28 @@
1
+ /**
2
+ * AuditPanel — ADR-0010 §3.6 / Phase 4.1 protection-audit trail.
3
+ *
4
+ * Renders the rows in `sys_metadata_audit` for a single metadata
5
+ * item (type + name): every save/publish/rollback/delete/reset
6
+ * attempt, with the lock state at the moment of the call and the
7
+ * decision (`allowed` / `denied` / `forced`). This is the compliance
8
+ * surface promised by the metadata-protection ADR — denied attempts
9
+ * never reach the regular history log, so this is the only place
10
+ * where blocked writes are visible.
11
+ *
12
+ * Data source: `client.audit(type, name)` →
13
+ * `GET /api/v1/meta/:type/:name/audit`.
14
+ *
15
+ * Empty state is friendly: a fresh install has no rows because the
16
+ * audit writer only fires on actual write attempts, so "no events"
17
+ * just means nobody has tried to change this item.
18
+ */
19
+ import * as React from 'react';
20
+ import type { MetadataClient } from '@object-ui/data-objectstack';
21
+ import { type SupportedLocale } from './i18n';
22
+ export interface AuditPanelProps {
23
+ type: string;
24
+ name: string;
25
+ client: MetadataClient;
26
+ locale?: SupportedLocale | string;
27
+ }
28
+ export declare function AuditPanel({ type, name, client, locale, }: AuditPanelProps): React.JSX.Element;
@@ -0,0 +1,79 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.
3
+ /**
4
+ * AuditPanel — ADR-0010 §3.6 / Phase 4.1 protection-audit trail.
5
+ *
6
+ * Renders the rows in `sys_metadata_audit` for a single metadata
7
+ * item (type + name): every save/publish/rollback/delete/reset
8
+ * attempt, with the lock state at the moment of the call and the
9
+ * decision (`allowed` / `denied` / `forced`). This is the compliance
10
+ * surface promised by the metadata-protection ADR — denied attempts
11
+ * never reach the regular history log, so this is the only place
12
+ * where blocked writes are visible.
13
+ *
14
+ * Data source: `client.audit(type, name)` →
15
+ * `GET /api/v1/meta/:type/:name/audit`.
16
+ *
17
+ * Empty state is friendly: a fresh install has no rows because the
18
+ * audit writer only fires on actual write attempts, so "no events"
19
+ * just means nobody has tried to change this item.
20
+ */
21
+ import * as React from 'react';
22
+ import { RefreshCw, Loader2, ShieldCheck, ShieldAlert, ShieldX } from 'lucide-react';
23
+ import { Button } from '@object-ui/components';
24
+ import { Badge } from '@object-ui/components';
25
+ import { Empty, EmptyTitle, EmptyDescription } from '@object-ui/components';
26
+ import { t } from './i18n';
27
+ function fmtTime(iso) {
28
+ if (!iso)
29
+ return '';
30
+ const d = new Date(iso);
31
+ if (Number.isNaN(d.getTime()))
32
+ return iso;
33
+ return d.toLocaleString();
34
+ }
35
+ function outcomeBadge(outcome) {
36
+ const map = {
37
+ allowed: {
38
+ label: 'allowed',
39
+ cls: 'bg-emerald-50 text-emerald-700 border-emerald-200',
40
+ Icon: ShieldCheck,
41
+ },
42
+ denied: {
43
+ label: 'denied',
44
+ cls: 'bg-rose-50 text-rose-700 border-rose-200',
45
+ Icon: ShieldX,
46
+ },
47
+ forced: {
48
+ label: 'forced',
49
+ cls: 'bg-amber-50 text-amber-700 border-amber-200',
50
+ Icon: ShieldAlert,
51
+ },
52
+ };
53
+ const v = map[outcome] ?? map.allowed;
54
+ return (_jsxs("span", { className: `inline-flex items-center gap-1 rounded border px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide ${v.cls}`, children: [_jsx(v.Icon, { className: "h-3 w-3" }), v.label] }));
55
+ }
56
+ export function AuditPanel({ type, name, client, locale = 'en-US', }) {
57
+ const [loading, setLoading] = React.useState(false);
58
+ const [error, setError] = React.useState(null);
59
+ const [events, setEvents] = React.useState(null);
60
+ const load = React.useCallback(async () => {
61
+ setLoading(true);
62
+ setError(null);
63
+ try {
64
+ const res = await client.audit(type, name, { limit: 100 });
65
+ setEvents(res.events ?? []);
66
+ }
67
+ catch (err) {
68
+ setError(String(err?.message ?? err));
69
+ setEvents([]);
70
+ }
71
+ finally {
72
+ setLoading(false);
73
+ }
74
+ }, [client, type, name]);
75
+ React.useEffect(() => {
76
+ void load();
77
+ }, [load]);
78
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "flex items-center justify-between border-b px-1 pb-2", children: [_jsxs("div", { className: "text-xs text-muted-foreground", children: [events?.length ?? 0, " ", t('engine.edit.auditCount', locale)] }), _jsxs(Button, { variant: "ghost", size: "sm", onClick: () => void load(), disabled: loading, className: "h-7 gap-1 text-xs", title: t('engine.edit.refresh', locale), children: [loading ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin" })) : (_jsx(RefreshCw, { className: "h-3 w-3" })), t('engine.edit.refresh', locale)] })] }), error && (_jsx("div", { className: "m-2 rounded border border-rose-200 bg-rose-50 p-2 text-xs text-rose-700", children: error })), _jsx("div", { className: "flex-1 overflow-auto", children: loading && (!events || events.length === 0) ? (_jsxs("div", { className: "flex h-32 items-center justify-center text-xs text-muted-foreground", children: [_jsx(Loader2, { className: "mr-2 h-3 w-3 animate-spin" }), t('engine.edit.loading', locale)] })) : !events || events.length === 0 ? (_jsxs(Empty, { className: "py-10", children: [_jsx(EmptyTitle, { children: t('engine.edit.auditEmptyTitle', locale) }), _jsx(EmptyDescription, { children: t('engine.edit.auditEmptyDescription', locale) })] })) : (_jsxs("table", { className: "w-full text-xs", children: [_jsx("thead", { className: "sticky top-0 bg-muted/40 text-left text-[10px] uppercase tracking-wide text-muted-foreground", children: _jsxs("tr", { children: [_jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColTime', locale) }), _jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColActor', locale) }), _jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColOperation', locale) }), _jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColOutcome', locale) }), _jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColLock', locale) }), _jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColNote', locale) })] }) }), _jsx("tbody", { children: events.map((ev) => (_jsxs("tr", { className: "border-t border-border/50 align-top hover:bg-muted/20", children: [_jsx("td", { className: "whitespace-nowrap px-2 py-1.5 font-mono text-[11px]", children: fmtTime(ev.occurredAt) }), _jsx("td", { className: "px-2 py-1.5", children: ev.actor }), _jsx("td", { className: "px-2 py-1.5", children: _jsx(Badge, { variant: "outline", className: "text-[10px]", children: ev.operation }) }), _jsx("td", { className: "px-2 py-1.5", children: outcomeBadge(ev.outcome) }), _jsx("td", { className: "px-2 py-1.5", children: ev.lockState && ev.lockState !== 'none' ? (_jsxs("span", { className: "font-mono text-[11px]", children: [ev.lockState, ev.lockOverridden ? ' *' : ''] })) : (_jsx("span", { className: "text-muted-foreground", children: "\u2014" })) }), _jsx("td", { className: "max-w-[28ch] truncate px-2 py-1.5 text-muted-foreground", title: ev.note ?? ev.code, children: ev.note ?? ev.code })] }, String(ev.id)))) })] })) })] }));
79
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * MetadataDiagnosticsPage — governance overview.
3
+ *
4
+ * Renders the cross-type `/meta/diagnostics` sweep: every metadata
5
+ * item that fails load-time Zod validation, grouped by type, with a
6
+ * deep-link to its edit page. The framework computes this server-side
7
+ * (see `protocol.getMetaDiagnostics`); the client just paints it.
8
+ *
9
+ * Counterpart surfaces:
10
+ * • DirectoryPage tile badges — per-type aggregate
11
+ * • ResourceListPage row badges — per-item flag inside one type
12
+ * • ResourceEditPage banner + inline SchemaForm errors — full
13
+ * drill-down for a single item
14
+ *
15
+ * This page is the only one that shows everything in one view, so
16
+ * ops can answer "what's broken across the whole app?" without
17
+ * clicking into 27 type pages.
18
+ */
19
+ import * as React from 'react';
20
+ export declare function MetadataDiagnosticsPage(): React.JSX.Element;