@object-ui/app-shell 6.2.2 → 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 +967 -0
  2. package/README.md +292 -0
  3. package/dist/assistant/assistantBus.d.ts +72 -0
  4. package/dist/assistant/assistantBus.js +133 -0
  5. package/dist/chrome/CommandPalette.d.ts +1 -1
  6. package/dist/chrome/CommandPalette.js +26 -22
  7. package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
  8. package/dist/chrome/ConsoleToaster.d.ts +1 -1
  9. package/dist/chrome/ConsoleToaster.js +3 -1
  10. package/dist/chrome/ErrorBoundary.d.ts +1 -1
  11. package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
  12. package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
  13. package/dist/chrome/LoadingScreen.d.ts +1 -1
  14. package/dist/chrome/LoadingScreen.js +22 -26
  15. package/dist/chrome/RouteFader.d.ts +1 -1
  16. package/dist/chrome/ThemeProvider.d.ts +1 -1
  17. package/dist/components/ManagedByBadge.d.ts +1 -1
  18. package/dist/console/AppContent.d.ts +1 -1
  19. package/dist/console/AppContent.js +170 -37
  20. package/dist/console/ConsoleShell.d.ts +7 -7
  21. package/dist/console/ConsoleShell.js +32 -3
  22. package/dist/console/ai/AiChatPage.d.ts +88 -1
  23. package/dist/console/ai/AiChatPage.js +743 -66
  24. package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
  25. package/dist/console/ai/ConversationsSidebar.js +149 -34
  26. package/dist/console/ai/LiveCanvas.d.ts +22 -0
  27. package/dist/console/ai/LiveCanvas.js +78 -0
  28. package/dist/console/ai/reconcileTurn.d.ts +8 -0
  29. package/dist/console/ai/reconcileTurn.js +20 -0
  30. package/dist/console/auth/AuthPageLayout.d.ts +1 -1
  31. package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
  32. package/dist/console/auth/LoginPage.d.ts +1 -1
  33. package/dist/console/auth/RegisterPage.d.ts +1 -1
  34. package/dist/console/auth/RegisterPage.js +23 -3
  35. package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
  36. package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
  37. package/dist/console/home/AppCard.d.ts +1 -1
  38. package/dist/console/home/AppCard.js +6 -12
  39. package/dist/console/home/HomeAppsStrip.d.ts +8 -0
  40. package/dist/console/home/HomeAppsStrip.js +61 -0
  41. package/dist/console/home/HomeLayout.d.ts +1 -1
  42. package/dist/console/home/HomeLayout.js +3 -1
  43. package/dist/console/home/HomePage.d.ts +1 -2
  44. package/dist/console/home/HomePage.js +149 -21
  45. package/dist/console/home/HomeRail.d.ts +22 -0
  46. package/dist/console/home/HomeRail.js +62 -0
  47. package/dist/console/home/QuickActions.d.ts +1 -1
  48. package/dist/console/home/QuickActions.js +3 -11
  49. package/dist/console/home/RecentApps.d.ts +1 -1
  50. package/dist/console/home/RecentApps.js +2 -2
  51. package/dist/console/home/StarredApps.d.ts +1 -1
  52. package/dist/console/home/StarredApps.js +2 -2
  53. package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
  54. package/dist/console/marketplace/InstalledListWidget.js +93 -0
  55. package/dist/console/marketplace/MarkdownText.d.ts +1 -1
  56. package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
  57. package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
  58. package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
  59. package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
  60. package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
  61. package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
  62. package/dist/console/marketplace/MarketplacePage.js +60 -3
  63. package/dist/console/marketplace/PackageIcon.d.ts +1 -1
  64. package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
  65. package/dist/console/marketplace/PluginDisclosure.js +38 -0
  66. package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
  67. package/dist/console/marketplace/marketplaceApi.js +254 -1
  68. package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
  69. package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
  70. package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
  71. package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
  72. package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
  73. package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
  74. package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
  75. package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
  76. package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
  77. package/dist/context/CommandPaletteProvider.d.ts +44 -0
  78. package/dist/context/CommandPaletteProvider.js +71 -0
  79. package/dist/context/FavoritesProvider.d.ts +1 -1
  80. package/dist/context/NavigationContext.d.ts +1 -1
  81. package/dist/context/RecentItemsProvider.d.ts +2 -2
  82. package/dist/context/UserStateAdapters.d.ts +1 -1
  83. package/dist/context/index.d.ts +2 -0
  84. package/dist/context/index.js +1 -0
  85. package/dist/hooks/index.d.ts +5 -2
  86. package/dist/hooks/index.js +4 -1
  87. package/dist/hooks/useActionModal.d.ts +53 -0
  88. package/dist/hooks/useActionModal.js +111 -0
  89. package/dist/hooks/useChatConversation.d.ts +107 -4
  90. package/dist/hooks/useChatConversation.js +253 -25
  91. package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
  92. package/dist/hooks/useConsoleActionRuntime.js +560 -0
  93. package/dist/hooks/useConversationList.js +61 -3
  94. package/dist/hooks/useHomeInbox.d.ts +13 -0
  95. package/dist/hooks/useHomeInbox.js +142 -0
  96. package/dist/hooks/useNavPins.js +17 -23
  97. package/dist/hooks/useNavigationSync.d.ts +33 -0
  98. package/dist/hooks/useNavigationSync.js +98 -12
  99. package/dist/hooks/useReconcileOnError.d.ts +40 -0
  100. package/dist/hooks/useReconcileOnError.js +37 -0
  101. package/dist/hooks/useRecordApprovals.d.ts +18 -19
  102. package/dist/hooks/useRecordApprovals.js +24 -40
  103. package/dist/hooks/useResponsiveSidebar.js +14 -5
  104. package/dist/hooks/useSettleSignal.d.ts +19 -0
  105. package/dist/hooks/useSettleSignal.js +20 -0
  106. package/dist/hooks/useTrackRouteAsRecent.js +35 -0
  107. package/dist/hooks/useUrlOverlay.d.ts +62 -0
  108. package/dist/hooks/useUrlOverlay.js +88 -0
  109. package/dist/index.d.ts +16 -7
  110. package/dist/index.js +12 -4
  111. package/dist/layout/ActivityFeed.d.ts +1 -1
  112. package/dist/layout/AppHeader.d.ts +3 -2
  113. package/dist/layout/AppHeader.js +237 -72
  114. package/dist/layout/AppSidebar.d.ts +2 -1
  115. package/dist/layout/AppSidebar.js +26 -46
  116. package/dist/layout/AppSwitcher.d.ts +2 -1
  117. package/dist/layout/AppSwitcher.js +9 -5
  118. package/dist/layout/AuthPageLayout.d.ts +1 -1
  119. package/dist/layout/ConnectionStatus.d.ts +1 -1
  120. package/dist/layout/ConnectionStatus.js +9 -6
  121. package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
  122. package/dist/layout/ConsoleChatbotFab.js +16 -2
  123. package/dist/layout/ConsoleFloatingChatbot.d.ts +32 -2
  124. package/dist/layout/ConsoleFloatingChatbot.js +374 -41
  125. package/dist/layout/ConsoleLayout.d.ts +1 -1
  126. package/dist/layout/ConsoleLayout.js +27 -11
  127. package/dist/layout/ContextSelectors.d.ts +44 -0
  128. package/dist/layout/ContextSelectors.js +218 -0
  129. package/dist/layout/InboxPopover.d.ts +6 -1
  130. package/dist/layout/InboxPopover.js +25 -6
  131. package/dist/layout/LocaleSwitcher.d.ts +1 -1
  132. package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
  133. package/dist/layout/LocalizedSidebarTrigger.js +15 -0
  134. package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
  135. package/dist/layout/ModeToggle.d.ts +1 -1
  136. package/dist/layout/PageHeader.d.ts +1 -1
  137. package/dist/layout/UnifiedSidebar.d.ts +2 -1
  138. package/dist/layout/UnifiedSidebar.js +116 -15
  139. package/dist/observability/index.d.ts +1 -0
  140. package/dist/observability/index.js +1 -0
  141. package/dist/observability/settleSignal.d.ts +64 -0
  142. package/dist/observability/settleSignal.js +131 -0
  143. package/dist/preview/DraftChangesPanel.d.ts +19 -0
  144. package/dist/preview/DraftChangesPanel.js +114 -0
  145. package/dist/preview/DraftPreviewBar.d.ts +8 -0
  146. package/dist/preview/DraftPreviewBar.js +86 -0
  147. package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
  148. package/dist/preview/PreviewDraftEmptyState.js +47 -0
  149. package/dist/preview/PreviewModeContext.d.ts +57 -0
  150. package/dist/preview/PreviewModeContext.js +99 -0
  151. package/dist/preview/UnpublishedAppBar.d.ts +8 -0
  152. package/dist/preview/UnpublishedAppBar.js +79 -0
  153. package/dist/preview/draftStatus.d.ts +20 -0
  154. package/dist/preview/draftStatus.js +27 -0
  155. package/dist/preview/usePublishAllDrafts.d.ts +18 -0
  156. package/dist/preview/usePublishAllDrafts.js +106 -0
  157. package/dist/providers/AdapterProvider.d.ts +1 -1
  158. package/dist/providers/AdapterProvider.js +6 -1
  159. package/dist/providers/ExpressionProvider.d.ts +1 -1
  160. package/dist/providers/MetadataProvider.d.ts +17 -2
  161. package/dist/providers/MetadataProvider.js +183 -12
  162. package/dist/runtime-config.d.ts +46 -2
  163. package/dist/runtime-config.js +39 -2
  164. package/dist/services/builtinComponents.js +68 -59
  165. package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
  166. package/dist/skeletons/SkeletonDetail.d.ts +1 -1
  167. package/dist/skeletons/SkeletonGrid.d.ts +1 -1
  168. package/dist/utils/appRoute.d.ts +21 -0
  169. package/dist/utils/appRoute.js +25 -0
  170. package/dist/utils/deriveRelatedLists.d.ts +54 -0
  171. package/dist/utils/deriveRelatedLists.js +91 -0
  172. package/dist/utils/index.d.ts +4 -0
  173. package/dist/utils/index.js +3 -0
  174. package/dist/utils/managedByEmptyState.d.ts +8 -1
  175. package/dist/utils/managedByEmptyState.js +13 -7
  176. package/dist/utils/preferLocal.d.ts +18 -0
  177. package/dist/utils/preferLocal.js +24 -0
  178. package/dist/views/ActionConfirmDialog.d.ts +1 -1
  179. package/dist/views/ActionConfirmDialog.js +3 -1
  180. package/dist/views/ActionParamDialog.d.ts +6 -1
  181. package/dist/views/ActionParamDialog.js +9 -3
  182. package/dist/views/ActionResultDialog.d.ts +13 -0
  183. package/dist/views/ActionResultDialog.js +134 -0
  184. package/dist/views/ComponentNavView.d.ts +14 -1
  185. package/dist/views/CreateViewDialog.d.ts +1 -1
  186. package/dist/views/DashboardConfigPanel.d.ts +28 -0
  187. package/dist/views/DashboardConfigPanel.js +81 -0
  188. package/dist/views/DashboardView.d.ts +4 -3
  189. package/dist/views/DashboardView.js +38 -239
  190. package/dist/views/FlowRunner.d.ts +59 -0
  191. package/dist/views/FlowRunner.js +153 -0
  192. package/dist/views/InterfaceListPage.d.ts +49 -0
  193. package/dist/views/InterfaceListPage.js +347 -0
  194. package/dist/views/MetadataInspector.d.ts +2 -2
  195. package/dist/views/ObjectView.d.ts +1 -1
  196. package/dist/views/ObjectView.js +209 -532
  197. package/dist/views/PageView.d.ts +8 -3
  198. package/dist/views/PageView.js +45 -32
  199. package/dist/views/RecordDetailView.d.ts +1 -1
  200. package/dist/views/RecordDetailView.js +363 -148
  201. package/dist/views/RecordFormPage.d.ts +1 -1
  202. package/dist/views/RecordFormPage.js +26 -1
  203. package/dist/views/ReportConfigPanel.d.ts +37 -0
  204. package/dist/views/ReportConfigPanel.js +85 -0
  205. package/dist/views/ReportView.d.ts +1 -1
  206. package/dist/views/ReportView.js +116 -7
  207. package/dist/views/RuntimeDraftBar.d.ts +30 -0
  208. package/dist/views/RuntimeDraftBar.js +112 -0
  209. package/dist/views/SearchResultsPage.d.ts +1 -1
  210. package/dist/views/SearchResultsPage.js +8 -18
  211. package/dist/views/ViewConfigPanel.d.ts +24 -17
  212. package/dist/views/ViewConfigPanel.js +121 -77
  213. package/dist/views/index.d.ts +1 -1
  214. package/dist/views/index.js +1 -1
  215. package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
  216. package/dist/views/metadata-admin/AuditPanel.js +79 -0
  217. package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
  218. package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
  219. package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
  220. package/dist/views/metadata-admin/DirectoryPage.js +113 -24
  221. package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
  222. package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
  223. package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
  224. package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
  225. package/dist/views/metadata-admin/JsonSourceEditor.d.ts +37 -0
  226. package/dist/views/metadata-admin/JsonSourceEditor.js +178 -0
  227. package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
  228. package/dist/views/metadata-admin/LayeredDiff.js +171 -5
  229. package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
  230. package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
  231. package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
  232. package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
  233. package/dist/views/metadata-admin/PackagesPage.js +395 -0
  234. package/dist/views/metadata-admin/PageShell.d.ts +1 -1
  235. package/dist/views/metadata-admin/PageShell.js +9 -4
  236. package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
  237. package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
  238. package/dist/views/metadata-admin/QuickFind.js +6 -3
  239. package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
  240. package/dist/views/metadata-admin/RelatedPanel.js +20 -18
  241. package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
  242. package/dist/views/metadata-admin/ResourceEditPage.js +1223 -60
  243. package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
  244. package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
  245. package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
  246. package/dist/views/metadata-admin/ResourceListPage.js +266 -30
  247. package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
  248. package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
  249. package/dist/views/metadata-admin/SchemaForm.js +559 -49
  250. package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
  251. package/dist/views/metadata-admin/StudioHomePage.js +213 -0
  252. package/dist/views/metadata-admin/anchors.js +237 -24
  253. package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
  254. package/dist/views/metadata-admin/clientValidation.js +169 -0
  255. package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
  256. package/dist/views/metadata-admin/color-variant-field.js +38 -0
  257. package/dist/views/metadata-admin/createDerive.d.ts +75 -0
  258. package/dist/views/metadata-admin/createDerive.js +179 -0
  259. package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
  260. package/dist/views/metadata-admin/dashboard-schema.js +80 -0
  261. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
  262. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
  263. package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
  264. package/dist/views/metadata-admin/datasource/register.js +24 -0
  265. package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
  266. package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
  267. package/dist/views/metadata-admin/default-schemas.js +115 -10
  268. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
  269. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
  270. package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
  271. package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
  272. package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
  273. package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
  274. package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
  275. package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
  276. package/dist/views/metadata-admin/external/api.d.ts +100 -0
  277. package/dist/views/metadata-admin/external/api.js +124 -0
  278. package/dist/views/metadata-admin/i18n.d.ts +1 -0
  279. package/dist/views/metadata-admin/i18n.js +1166 -2
  280. package/dist/views/metadata-admin/index.d.ts +8 -5
  281. package/dist/views/metadata-admin/index.js +12 -2
  282. package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
  283. package/dist/views/metadata-admin/inspector-registry.js +11 -0
  284. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
  285. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
  286. package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
  287. package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
  288. package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
  289. package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
  290. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
  291. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
  292. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
  293. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
  294. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
  295. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +107 -0
  296. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
  297. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +45 -0
  298. package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
  299. package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
  300. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
  301. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
  302. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
  303. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
  304. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
  305. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +140 -0
  306. package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
  307. package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
  308. package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
  309. package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
  310. package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
  311. package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
  312. package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
  313. package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
  314. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
  315. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +54 -0
  316. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
  317. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +330 -0
  318. package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
  319. package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
  320. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
  321. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +160 -0
  322. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
  323. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
  324. package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
  325. package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
  326. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
  327. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
  328. package/dist/views/metadata-admin/inspectors/_shared.d.ts +124 -0
  329. package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
  330. package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
  331. package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
  332. package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
  333. package/dist/views/metadata-admin/inspectors/flow-node-config.js +461 -0
  334. package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
  335. package/dist/views/metadata-admin/inspectors/index.js +45 -0
  336. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
  337. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
  338. package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
  339. package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
  340. package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
  341. package/dist/views/metadata-admin/mergeServerFields.js +56 -0
  342. package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
  343. package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
  344. package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
  345. package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
  346. package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
  347. package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
  348. package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
  349. package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
  350. package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
  351. package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
  352. package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
  353. package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
  354. package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
  355. package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
  356. package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
  357. package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
  358. package/dist/views/metadata-admin/previews/DatasetPreview.js +89 -0
  359. package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
  360. package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
  361. package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
  362. package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
  363. package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
  364. package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
  365. package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
  366. package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +43 -0
  367. package/dist/views/metadata-admin/previews/FlowCanvas.js +328 -0
  368. package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
  369. package/dist/views/metadata-admin/previews/FlowPreview.js +92 -0
  370. package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
  371. package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
  372. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
  373. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +170 -0
  374. package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
  375. package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
  376. package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
  377. package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
  378. package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
  379. package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
  380. package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
  381. package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
  382. package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
  383. package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
  384. package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
  385. package/dist/views/metadata-admin/previews/PagePreview.js +90 -4
  386. package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
  387. package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
  388. package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
  389. package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
  390. package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
  391. package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
  392. package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
  393. package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
  394. package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
  395. package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
  396. package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
  397. package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
  398. package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
  399. package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
  400. package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
  401. package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
  402. package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
  403. package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
  404. package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
  405. package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
  406. package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
  407. package/dist/views/metadata-admin/previews/block-config.js +324 -0
  408. package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
  409. package/dist/views/metadata-admin/previews/block-types.js +110 -0
  410. package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
  411. package/dist/views/metadata-admin/previews/field-types.js +97 -0
  412. package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +88 -0
  413. package/dist/views/metadata-admin/previews/flow-canvas-layout.js +190 -0
  414. package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +88 -0
  415. package/dist/views/metadata-admin/previews/flow-canvas-parts.js +358 -0
  416. package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
  417. package/dist/views/metadata-admin/previews/form-preview.js +29 -0
  418. package/dist/views/metadata-admin/previews/index.js +43 -0
  419. package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
  420. package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
  421. package/dist/views/metadata-admin/previews/object-fields-io.d.ts +109 -0
  422. package/dist/views/metadata-admin/previews/object-fields-io.js +208 -0
  423. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +91 -0
  424. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
  425. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +8 -0
  426. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +113 -0
  427. package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +44 -0
  428. package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +316 -0
  429. package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
  430. package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
  431. package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
  432. package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
  433. package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
  434. package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
  435. package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
  436. package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
  437. package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
  438. package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
  439. package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
  440. package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
  441. package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
  442. package/dist/views/metadata-admin/previews/widget-types.js +40 -0
  443. package/dist/views/metadata-admin/registry.d.ts +140 -19
  444. package/dist/views/metadata-admin/report-schema.d.ts +26 -0
  445. package/dist/views/metadata-admin/report-schema.js +121 -0
  446. package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
  447. package/dist/views/metadata-admin/useMetadata.js +155 -4
  448. package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
  449. package/dist/views/metadata-admin/view-item-normalize.js +68 -0
  450. package/dist/views/metadata-admin/view-schema.d.ts +16 -0
  451. package/dist/views/metadata-admin/view-schema.js +107 -0
  452. package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
  453. package/dist/views/metadata-admin/view-variant-model.js +64 -0
  454. package/dist/views/metadata-admin/widgets.d.ts +89 -1
  455. package/dist/views/metadata-admin/widgets.js +491 -17
  456. package/dist/views/runtime-metadata-persistence.d.ts +78 -0
  457. package/dist/views/runtime-metadata-persistence.js +89 -0
  458. package/dist/views/useOpenRecordList.d.ts +18 -0
  459. package/dist/views/useOpenRecordList.js +36 -0
  460. package/dist/views/userFilterUrlState.d.ts +15 -0
  461. package/dist/views/userFilterUrlState.js +53 -0
  462. package/dist/views/view-config-adapter.d.ts +38 -0
  463. package/dist/views/view-config-adapter.js +80 -0
  464. package/package.json +52 -34
  465. package/dist/views/DesignDrawer.d.ts +0 -28
  466. package/dist/views/DesignDrawer.js +0 -51
  467. package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
  468. package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
@@ -0,0 +1,22 @@
1
+ /**
2
+ * StudioHomePage — the landing page for the metadata-admin ("Studio")
3
+ * app root (`/apps/:appName/`).
4
+ *
5
+ * Previously the app root resolved to an empty `<Navigate>` target and
6
+ * rendered a blank content area. This page replaces that blank space
7
+ * with a real, data-driven overview built on the same hooks the
8
+ * directory uses:
9
+ *
10
+ * • Hero band with a time-of-day greeting + headline KPIs.
11
+ * • KPI cards (types / writable / packages / health) — health card
12
+ * deep-links to diagnostics when issues exist.
13
+ * • "Explore" grid — one card per metadata domain, each listing its
14
+ * top types as count-badged chips that link straight into the list.
15
+ * • Quick actions — one-click "New …" buttons for writable types.
16
+ * • Recently viewed — pulls from the shared RecentItemsProvider.
17
+ *
18
+ * All data comes from `/meta/types` + the diagnostics sweep, so the page
19
+ * stays correct regardless of which packages are installed.
20
+ */
21
+ import * as React from 'react';
22
+ export declare function StudioHomePage(): React.JSX.Element;
@@ -0,0 +1,213 @@
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
+ * StudioHomePage — the landing page for the metadata-admin ("Studio")
5
+ * app root (`/apps/:appName/`).
6
+ *
7
+ * Previously the app root resolved to an empty `<Navigate>` target and
8
+ * rendered a blank content area. This page replaces that blank space
9
+ * with a real, data-driven overview built on the same hooks the
10
+ * directory uses:
11
+ *
12
+ * • Hero band with a time-of-day greeting + headline KPIs.
13
+ * • KPI cards (types / writable / packages / health) — health card
14
+ * deep-links to diagnostics when issues exist.
15
+ * • "Explore" grid — one card per metadata domain, each listing its
16
+ * top types as count-badged chips that link straight into the list.
17
+ * • Quick actions — one-click "New …" buttons for writable types.
18
+ * • Recently viewed — pulls from the shared RecentItemsProvider.
19
+ *
20
+ * All data comes from `/meta/types` + the diagnostics sweep, so the page
21
+ * stays correct regardless of which packages are installed.
22
+ */
23
+ import * as React from 'react';
24
+ import { Link, useSearchParams } from 'react-router-dom';
25
+ import { Search, Database, Layers, Workflow, Sparkles, Settings, ShieldCheck, Box, Package as PackageIcon, AlertTriangle, CheckCircle2, ArrowRight, Plus, Clock, LayoutDashboard, FileText, BarChart3, Table2, } from 'lucide-react';
26
+ import { Button } from '@object-ui/components';
27
+ import { useRecentItems } from '../../context/RecentItemsProvider';
28
+ import { useMetadataClient, useMetadataTypes, useGlobalDiagnostics, } from './useMetadata';
29
+ import { MetadataQuickFind } from './QuickFind';
30
+ import { translateMetadataType, translateMetadataDomain, t, tFormat, detectLocale, } from './i18n';
31
+ const HIDDEN_TYPES = new Set(['field', 'package']);
32
+ const DOMAIN_ICONS = {
33
+ data: Database,
34
+ ui: Layers,
35
+ automation: Workflow,
36
+ ai: Sparkles,
37
+ system: Settings,
38
+ platform: Settings,
39
+ identity: ShieldCheck,
40
+ security: ShieldCheck,
41
+ };
42
+ /** Per-domain accent gradients — used for icon chips + chip hover rings. */
43
+ const DOMAIN_ACCENT = {
44
+ data: { from: 'from-sky-500', to: 'to-blue-600', ring: 'hover:ring-sky-400/40', text: 'text-sky-600 dark:text-sky-400' },
45
+ ui: { from: 'from-violet-500', to: 'to-fuchsia-600', ring: 'hover:ring-violet-400/40', text: 'text-violet-600 dark:text-violet-400' },
46
+ automation: { from: 'from-amber-500', to: 'to-orange-600', ring: 'hover:ring-amber-400/40', text: 'text-amber-600 dark:text-amber-400' },
47
+ ai: { from: 'from-pink-500', to: 'to-rose-600', ring: 'hover:ring-pink-400/40', text: 'text-pink-600 dark:text-pink-400' },
48
+ identity: { from: 'from-emerald-500', to: 'to-teal-600', ring: 'hover:ring-emerald-400/40', text: 'text-emerald-600 dark:text-emerald-400' },
49
+ security: { from: 'from-emerald-500', to: 'to-teal-600', ring: 'hover:ring-emerald-400/40', text: 'text-emerald-600 dark:text-emerald-400' },
50
+ system: { from: 'from-slate-500', to: 'to-slate-700', ring: 'hover:ring-slate-400/40', text: 'text-slate-600 dark:text-slate-300' },
51
+ platform: { from: 'from-slate-500', to: 'to-slate-700', ring: 'hover:ring-slate-400/40', text: 'text-slate-600 dark:text-slate-300' },
52
+ other: { from: 'from-slate-400', to: 'to-slate-600', ring: 'hover:ring-slate-400/40', text: 'text-slate-600 dark:text-slate-300' },
53
+ };
54
+ const DOMAIN_ORDER = ['data', 'ui', 'automation', 'ai', 'identity', 'security', 'system', 'platform', 'other'];
55
+ /** Types that are most useful to surface as one-click "New …" actions. */
56
+ const QUICK_CREATE_ORDER = ['object', 'view', 'page', 'dashboard', 'report', 'flow', 'action', 'agent'];
57
+ const RECENT_ICONS = {
58
+ object: Table2,
59
+ dashboard: LayoutDashboard,
60
+ page: FileText,
61
+ report: BarChart3,
62
+ record: Box,
63
+ metadata: Layers,
64
+ };
65
+ function greetingKey() {
66
+ const h = new Date().getHours();
67
+ if (h < 12)
68
+ return 'engine.home.greetingMorning';
69
+ if (h < 18)
70
+ return 'engine.home.greetingAfternoon';
71
+ return 'engine.home.greetingEvening';
72
+ }
73
+ function relativeTime(iso, locale) {
74
+ const then = new Date(iso).getTime();
75
+ if (Number.isNaN(then))
76
+ return '';
77
+ const diff = Date.now() - then;
78
+ const zh = locale.startsWith('zh');
79
+ const mins = Math.floor(diff / 60000);
80
+ if (mins < 1)
81
+ return zh ? '刚刚' : 'just now';
82
+ if (mins < 60)
83
+ return zh ? `${mins} 分钟前` : `${mins}m ago`;
84
+ const hrs = Math.floor(mins / 60);
85
+ if (hrs < 24)
86
+ return zh ? `${hrs} 小时前` : `${hrs}h ago`;
87
+ const days = Math.floor(hrs / 24);
88
+ if (days < 7)
89
+ return zh ? `${days} 天前` : `${days}d ago`;
90
+ const weeks = Math.floor(days / 7);
91
+ return zh ? `${weeks} 周前` : `${weeks}w ago`;
92
+ }
93
+ export function StudioHomePage() {
94
+ const client = useMetadataClient();
95
+ const { loading, entries } = useMetadataTypes(client);
96
+ const { recentItems } = useRecentItems();
97
+ const locale = React.useMemo(() => detectLocale(), []);
98
+ const [searchParams, setSearchParams] = useSearchParams();
99
+ const [projectPackages, setProjectPackages] = React.useState(null);
100
+ React.useEffect(() => {
101
+ let cancelled = false;
102
+ (async () => {
103
+ try {
104
+ const list = await client.list('package');
105
+ if (cancelled)
106
+ return;
107
+ const SYSTEM_SCOPES = new Set(['system', 'cloud']);
108
+ const rows = (list ?? [])
109
+ .map((raw) => {
110
+ const item = raw && typeof raw === 'object' && 'item' in raw ? raw.item : raw;
111
+ const m = (item?.manifest ?? item ?? {});
112
+ return {
113
+ id: m.id,
114
+ scope: m.scope,
115
+ name: m.name || m.id,
116
+ };
117
+ })
118
+ .filter((p) => p.id && !SYSTEM_SCOPES.has(p.scope));
119
+ rows.sort((a, b) => a.name.localeCompare(b.name));
120
+ setProjectPackages(rows.map((p) => ({ id: p.id, name: p.name })));
121
+ }
122
+ catch {
123
+ if (!cancelled)
124
+ setProjectPackages([]);
125
+ }
126
+ })();
127
+ return () => {
128
+ cancelled = true;
129
+ };
130
+ }, [client]);
131
+ const urlPackage = searchParams.get('package');
132
+ const activePackage = React.useMemo(() => {
133
+ if (!projectPackages)
134
+ return null;
135
+ if (urlPackage && projectPackages.some((p) => p.id === urlPackage))
136
+ return urlPackage;
137
+ return projectPackages[0]?.id ?? null;
138
+ }, [projectPackages, urlPackage]);
139
+ React.useEffect(() => {
140
+ if (!projectPackages || projectPackages.length === 0)
141
+ return;
142
+ if (urlPackage && projectPackages.some((p) => p.id === urlPackage))
143
+ return;
144
+ const next = new URLSearchParams(searchParams);
145
+ next.set('package', projectPackages[0].id);
146
+ setSearchParams(next, { replace: true });
147
+ // eslint-disable-next-line react-hooks/exhaustive-deps
148
+ }, [projectPackages, urlPackage]);
149
+ const packageSuffix = activePackage ? `?package=${encodeURIComponent(activePackage)}` : '';
150
+ const metadataHref = `metadata${packageSuffix}`;
151
+ const packagesHref = `component/developer/packages${packageSuffix}`;
152
+ const { summary: diagSummary, countsByType, packagesByType, loading: diagLoading, } = useGlobalDiagnostics(client, 'warning', activePackage ?? undefined);
153
+ const visible = React.useMemo(() => entries.filter((e) => {
154
+ if (HIDDEN_TYPES.has(e.type))
155
+ return false;
156
+ if (!activePackage)
157
+ return false;
158
+ return (packagesByType[e.type] ?? []).includes(activePackage);
159
+ }), [activePackage, entries, packagesByType]);
160
+ const writable = React.useMemo(() => visible.filter((e) => e.allowOrgOverride || e.allowRuntimeCreate), [visible]);
161
+ // Group visible types by domain, sorted by count desc within each group.
162
+ const grouped = React.useMemo(() => {
163
+ var _a;
164
+ const map = {};
165
+ for (const e of visible)
166
+ (map[_a = e.domain ?? 'other'] ?? (map[_a] = [])).push(e);
167
+ for (const list of Object.values(map)) {
168
+ list.sort((a, b) => (countsByType[b.type] ?? 0) - (countsByType[a.type] ?? 0));
169
+ }
170
+ return Object.entries(map).sort(([a], [b]) => (DOMAIN_ORDER.indexOf(a) === -1 ? 99 : DOMAIN_ORDER.indexOf(a)) -
171
+ (DOMAIN_ORDER.indexOf(b) === -1 ? 99 : DOMAIN_ORDER.indexOf(b)));
172
+ }, [visible, countsByType]);
173
+ const quickCreate = React.useMemo(() => {
174
+ const byType = new Map(writable.map((e) => [e.type, e]));
175
+ return QUICK_CREATE_ORDER.map((ty) => byType.get(ty)).filter(Boolean);
176
+ }, [writable]);
177
+ const issues = diagSummary.total;
178
+ const healthy = !loading && !diagLoading && issues === 0;
179
+ if (loading || projectPackages === null || (activePackage && diagLoading)) {
180
+ return (_jsx("div", { className: "flex h-full items-center justify-center p-8 text-sm text-muted-foreground", children: t('engine.home.loading', locale) }));
181
+ }
182
+ return (_jsxs("div", { className: "h-full overflow-auto bg-gradient-to-b from-muted/40 to-background", children: [_jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 py-6 space-y-6", children: [_jsxs("section", { className: "relative overflow-hidden rounded-3xl bg-gradient-to-br from-indigo-600 via-violet-600 to-fuchsia-600 px-7 py-8 text-white shadow-xl shadow-violet-500/20", children: [_jsx("div", { className: "pointer-events-none absolute -right-16 -top-20 h-64 w-64 rounded-full bg-white/15 blur-3xl" }), _jsx("div", { className: "pointer-events-none absolute -bottom-24 left-1/3 h-56 w-56 rounded-full bg-fuchsia-300/20 blur-3xl" }), _jsx("div", { className: "pointer-events-none absolute inset-0 opacity-[0.12]", style: {
183
+ backgroundImage: 'radial-gradient(currentColor 1px, transparent 1px)',
184
+ backgroundSize: '18px 18px',
185
+ } }), _jsxs("div", { className: "relative flex flex-col gap-6 lg:flex-row lg:items-end lg:justify-between", children: [_jsxs("div", { className: "max-w-xl", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-white/80", children: [_jsx(Sparkles, { className: "h-4 w-4" }), t(greetingKey(), locale)] }), _jsx("h1", { className: "mt-2 text-3xl font-bold tracking-tight sm:text-4xl", children: "Studio" }), _jsx("p", { className: "mt-2 text-sm leading-relaxed text-white/85 sm:text-base", children: t('engine.home.subtitle', locale) }), _jsxs("div", { className: "mt-5 flex flex-wrap items-center gap-2.5", children: [_jsx(Button, { asChild: true, size: "sm", variant: "ghost", className: "bg-white/10 text-white shadow-sm ring-1 ring-white/25 hover:bg-white/20 hover:text-white", children: _jsxs(Link, { to: metadataHref, children: [_jsx(Layers, { className: "mr-1.5 h-4 w-4" }), t('engine.home.browseAll', locale)] }) }), _jsxs("span", { className: "inline-flex items-center gap-1.5 rounded-full bg-white/15 px-3 py-1.5 text-xs font-medium text-white/90 backdrop-blur-sm", children: [_jsx(Search, { className: "h-3.5 w-3.5" }), t('engine.directory.quickFind', locale), " \u2318\u21E7M"] })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-3", children: [_jsx(HeroPill, { value: visible.length, label: t('engine.home.statTypes', locale) }), _jsx(HeroPill, { value: writable.length, label: t('engine.home.statWritable', locale) }), _jsx(HeroPill, { value: projectPackages.length, label: t('engine.home.statPackages', locale) })] })] })] }), _jsxs("section", { className: "grid grid-cols-2 gap-4 lg:grid-cols-4", children: [_jsx(StatCard, { icon: Layers, from: "from-indigo-500", to: "to-violet-600", value: visible.length, label: t('engine.home.statTypes', locale), to_link: metadataHref }), _jsx(StatCard, { icon: CheckCircle2, from: "from-sky-500", to: "to-blue-600", value: writable.length, label: t('engine.home.statWritable', locale), to_link: metadataHref }), _jsx(StatCard, { icon: PackageIcon, from: "from-emerald-500", to: "to-teal-600", value: projectPackages.length, label: t('engine.home.statPackages', locale), to_link: packagesHref }), _jsxs(Link, { to: healthy ? metadataHref : `metadata/_diagnostics${packageSuffix}`, className: 'group relative flex flex-col justify-between overflow-hidden rounded-2xl border p-4 transition-all hover:-translate-y-0.5 hover:shadow-lg ' +
186
+ (healthy
187
+ ? 'border-emerald-200 bg-emerald-50/60 dark:border-emerald-900/50 dark:bg-emerald-950/30'
188
+ : 'border-amber-300 bg-amber-50/70 dark:border-amber-900/50 dark:bg-amber-950/30'), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: 'flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br text-white shadow-sm ' +
189
+ (healthy ? 'from-emerald-500 to-teal-600' : 'from-amber-500 to-orange-600'), children: healthy ? _jsx(CheckCircle2, { className: "h-5 w-5" }) : _jsx(AlertTriangle, { className: "h-5 w-5" }) }), _jsx(ArrowRight, { className: "h-4 w-4 text-muted-foreground transition-transform group-hover:translate-x-0.5" })] }), _jsxs("div", { className: "mt-3", children: [_jsx("div", { className: "text-2xl font-bold tabular-nums", children: healthy ? t('engine.home.allHealthy', locale) : issues }), _jsx("div", { className: "text-xs text-muted-foreground", children: healthy
190
+ ? t('engine.home.allHealthyHint', locale)
191
+ : t('engine.home.statIssues', locale) })] })] })] }), quickCreate.length > 0 && (_jsxs("section", { children: [_jsx(SectionHeader, { icon: Plus, title: t('engine.home.quickActions', locale), hint: t('engine.home.quickActionsHint', locale) }), _jsx("div", { className: "mt-3 flex flex-wrap gap-2.5", children: quickCreate.map((e) => (_jsx(Button, { asChild: true, variant: "outline", size: "sm", className: "group rounded-full border-transparent bg-muted hover:bg-primary/10 hover:text-primary", children: _jsxs(Link, { to: `metadata/${encodeURIComponent(e.type)}/new${packageSuffix}`, children: [_jsx(Plus, { className: "mr-1 h-3.5 w-3.5 text-primary transition-transform group-hover:rotate-90" }), tFormat('engine.home.newItem', locale, {
192
+ label: translateMetadataType(e.type, locale, e.label),
193
+ })] }) }, e.type))) })] })), _jsxs("div", { className: "grid gap-6 lg:grid-cols-3", children: [_jsxs("section", { className: "lg:col-span-2", children: [_jsx(SectionHeader, { icon: Layers, title: t('engine.home.explore', locale), hint: t('engine.home.exploreHint', locale) }), _jsx("div", { className: "mt-3 grid gap-4 sm:grid-cols-2", children: grouped.map(([domain, group]) => (_jsx(DomainCard, { domain: domain, group: group, countsByType: countsByType, locale: locale, packageSuffix: packageSuffix }, domain))) })] }), _jsxs("section", { children: [_jsx(SectionHeader, { icon: Clock, title: t('engine.home.recent', locale) }), _jsx("div", { className: "mt-3 rounded-2xl border bg-card p-2", children: recentItems.length === 0 ? (_jsx("div", { className: "px-3 py-8 text-center text-xs text-muted-foreground", children: t('engine.home.recentEmpty', locale) })) : (_jsx("ul", { className: "space-y-0.5", children: recentItems.slice(0, 8).map((item) => {
194
+ const Icon = RECENT_ICONS[item.type] ?? Box;
195
+ return (_jsx("li", { children: _jsxs(Link, { to: item.href, className: "group flex items-center gap-3 rounded-xl px-3 py-2 transition-colors hover:bg-accent", children: [_jsx("span", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground transition-colors group-hover:bg-primary/10 group-hover:text-primary", children: _jsx(Icon, { className: "h-4 w-4" }) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-sm font-medium", children: item.label }), _jsx("span", { className: "block text-[11px] text-muted-foreground", children: relativeTime(item.visitedAt, locale) })] }), _jsx(ArrowRight, { className: "h-3.5 w-3.5 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100" })] }) }, item.id));
196
+ }) })) })] })] })] }), _jsx(MetadataQuickFind, {})] }));
197
+ }
198
+ function HeroPill({ value, label }) {
199
+ return (_jsxs("div", { className: "rounded-2xl bg-white/15 px-4 py-3 text-center backdrop-blur-sm ring-1 ring-white/20", children: [_jsx("div", { className: "text-2xl font-bold tabular-nums leading-none", children: value }), _jsx("div", { className: "mt-1 text-[11px] font-medium text-white/80", children: label })] }));
200
+ }
201
+ function StatCard({ icon: Icon, from, to, value, label, to_link, }) {
202
+ return (_jsxs(Link, { to: to_link, className: "group relative flex flex-col justify-between overflow-hidden rounded-2xl border bg-card p-4 transition-all hover:-translate-y-0.5 hover:border-primary/40 hover:shadow-lg", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: `flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br ${from} ${to} text-white shadow-sm`, children: _jsx(Icon, { className: "h-5 w-5" }) }), _jsx(ArrowRight, { className: "h-4 w-4 text-muted-foreground opacity-0 transition-all group-hover:translate-x-0.5 group-hover:opacity-100" })] }), _jsxs("div", { className: "mt-3", children: [_jsx("div", { className: "text-2xl font-bold tabular-nums", children: value }), _jsx("div", { className: "text-xs text-muted-foreground", children: label })] })] }));
203
+ }
204
+ function SectionHeader({ icon: Icon, title, hint, }) {
205
+ return (_jsxs("div", { className: "flex items-baseline gap-2.5", children: [_jsxs("h2", { className: "flex items-center gap-2 text-base font-semibold", children: [_jsx(Icon, { className: "h-4 w-4 text-muted-foreground" }), title] }), hint && _jsx("p", { className: "text-xs text-muted-foreground", children: hint })] }));
206
+ }
207
+ function DomainCard({ domain, group, countsByType, locale, packageSuffix, }) {
208
+ const Icon = DOMAIN_ICONS[domain] ?? Box;
209
+ const accent = DOMAIN_ACCENT[domain] ?? DOMAIN_ACCENT.other;
210
+ const top = group.slice(0, 6);
211
+ const more = group.length - top.length;
212
+ return (_jsxs("div", { className: `group rounded-2xl border bg-card p-4 ring-1 ring-transparent transition-all hover:-translate-y-0.5 hover:shadow-lg ${accent.ring}`, children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: `flex h-9 w-9 items-center justify-center rounded-xl bg-gradient-to-br ${accent.from} ${accent.to} text-white shadow-sm`, children: _jsx(Icon, { className: "h-[18px] w-[18px]" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-semibold", children: translateMetadataDomain(domain, locale) }), _jsxs("div", { className: "text-[11px] text-muted-foreground", children: [group.length, " ", t('engine.home.typesLower', locale)] })] })] }), _jsxs("div", { className: "mt-3 flex flex-wrap gap-1.5", children: [top.map((e) => (_jsxs(Link, { to: `metadata/${encodeURIComponent(e.type)}${packageSuffix}`, className: "inline-flex items-center gap-1.5 rounded-lg border bg-background px-2 py-1 text-xs transition-colors hover:border-primary/50 hover:bg-accent", children: [_jsx("span", { className: "truncate max-w-[10rem]", children: translateMetadataType(e.type, locale, e.label) }), _jsx("span", { className: "tabular-nums text-[10px] text-muted-foreground", children: countsByType[e.type] ?? 0 })] }, e.type))), more > 0 && (_jsxs(Link, { to: `metadata${packageSuffix}`, className: `inline-flex items-center gap-1 rounded-lg px-2 py-1 text-xs font-medium ${accent.text} hover:underline`, children: ["+", more] }))] })] }));
213
+ }
@@ -88,17 +88,15 @@ export function registerBuiltinAnchors() {
88
88
  groupLabel: 'Hooks',
89
89
  order: 20,
90
90
  }],
91
+ createFields: ['label', 'name', 'object', 'description'],
92
+ createDerive: [
93
+ { from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
94
+ ],
95
+ createDefaults: { events: [] },
91
96
  });
92
- // approval.object object (approval processes targeting this object)
93
- registerMetadataResource({
94
- type: 'approval',
95
- anchors: [{
96
- anchorType: 'object',
97
- match: anchorByField('object'),
98
- groupLabel: 'Approval Processes',
99
- order: 70,
100
- }],
101
- });
97
+ // Approval is no longer a standalone metadata type (ADR-0019) it is a flow
98
+ // node (`type: 'approval'`). Approvals therefore surface on an object through
99
+ // the Flows it belongs to, not a separate "Approval Processes" group.
102
100
  // page.object → object (auto-generated record pages, etc.)
103
101
  registerMetadataResource({
104
102
  type: 'page',
@@ -108,23 +106,144 @@ export function registerBuiltinAnchors() {
108
106
  groupLabel: 'Pages',
109
107
  order: 40,
110
108
  }],
109
+ // Mirror `view`'s create form: a page (esp. a *record* page) must be able to
110
+ // bind an `object` and pick its page `type` / `kind` at creation — the
111
+ // identity-only form (label/name/icon/description) couldn't make a record
112
+ // page. The block layout is then composed in the editor's PagePreview canvas.
113
+ createFields: ['label', 'name', 'object', 'type', 'kind'],
114
+ createDerive: [
115
+ { from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
116
+ ],
117
+ createSchema: {
118
+ type: 'object',
119
+ required: ['label', 'name', 'type'],
120
+ properties: {
121
+ label: { type: 'string', title: 'Label', description: 'Human-readable page title.' },
122
+ name: {
123
+ type: 'string',
124
+ title: 'Name',
125
+ description: 'Page key (snake_case).',
126
+ pattern: '^[a-z_][a-z0-9_]*$',
127
+ },
128
+ type: {
129
+ type: 'string',
130
+ title: 'Page type',
131
+ // 'list' (interface page) is the primary, most-built page type — offer
132
+ // it first and as the default. 'dashboard' is roadmap (no distinct
133
+ // renderer yet), so it's omitted here, matching the edit form.
134
+ enum: ['list', 'record', 'home', 'app', 'utility'],
135
+ default: 'list',
136
+ description: 'List / Interface page = a data view (Airtable-style: columns, filters, visualizations). Record page renders one object record.',
137
+ },
138
+ object: {
139
+ type: 'string',
140
+ title: 'Object',
141
+ widget: 'ref:object',
142
+ description: 'The object this page reads from — the data source for a list page, or the record object for a record page.',
143
+ },
144
+ kind: {
145
+ type: 'string',
146
+ title: 'Kind',
147
+ enum: ['full', 'slotted'],
148
+ default: 'full',
149
+ description: 'full = the whole page; slotted = override only named slots of the default.',
150
+ },
151
+ },
152
+ },
153
+ createDefaults: { type: 'list', kind: 'full', regions: [] },
154
+ // Seed a record page's regions from the bound object's synthesized default
155
+ // detail page, so authoring starts from the auto-generated layout (the same
156
+ // one the runtime renders by default) instead of a blank canvas.
157
+ createSeed: async (draft, { client }) => {
158
+ // List/interface page: pre-bind the chosen object as the data source so
159
+ // the new page renders immediately (the author then curates columns,
160
+ // filters, visualizations in the editor).
161
+ if (draft?.type === 'list') {
162
+ return draft?.object ? { interfaceConfig: { source: String(draft.object) } } : {};
163
+ }
164
+ if (draft?.type !== 'record' || !draft?.object)
165
+ return {};
166
+ try {
167
+ const objectDef = await client.get('object', String(draft.object));
168
+ if (!objectDef || typeof objectDef !== 'object')
169
+ return {};
170
+ const { buildDefaultPageSchema } = await import('@object-ui/plugin-detail');
171
+ const synth = buildDefaultPageSchema(objectDef);
172
+ const seed = {};
173
+ if (Array.isArray(synth?.regions) && synth.regions.length)
174
+ seed.regions = synth.regions;
175
+ if (synth?.template)
176
+ seed.template = synth.template;
177
+ return seed;
178
+ }
179
+ catch {
180
+ return {};
181
+ }
182
+ },
111
183
  });
112
- // view binds to an object via data.object (list view / form view variants)
184
+ // A view is the canonical first-class ViewItem ({ viewKind, config }),
185
+ // bound to its object by the top-level `object` foreign key.
113
186
  registerMetadataResource({
114
187
  type: 'view',
115
188
  anchors: [{
116
189
  anchorType: 'object',
117
190
  match: anchorByField([
118
- 'data.object',
119
- 'list.data.object',
120
- 'form.data.object',
121
191
  'object',
192
+ 'config.data.object',
122
193
  ]),
123
194
  groupLabel: 'Views',
124
195
  order: 30,
125
196
  }],
197
+ createFields: ['label', 'name', 'object', 'kind'],
198
+ createDerive: [
199
+ { from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
200
+ ],
201
+ createSchema: {
202
+ type: 'object',
203
+ required: ['label', 'name', 'object', 'kind'],
204
+ properties: {
205
+ label: { type: 'string', title: 'Label', description: 'Human-readable view name.' },
206
+ name: {
207
+ type: 'string',
208
+ title: 'Name',
209
+ description: 'View key (snake_case). Qualified to <object>.<key> on save.',
210
+ pattern: '^[a-z_][a-z0-9_]*$',
211
+ },
212
+ object: {
213
+ type: 'string',
214
+ title: 'Object',
215
+ description: 'The object this view displays.',
216
+ },
217
+ kind: {
218
+ type: 'string',
219
+ title: 'View kind',
220
+ enum: ['grid', 'kanban', 'gallery', 'calendar', 'timeline', 'gantt', 'chart'],
221
+ default: 'grid',
222
+ description: 'Pick a starter layout. Switch later in the designer.',
223
+ },
224
+ },
225
+ },
226
+ // Emit a canonical ViewItem. `name` is the globally-unique qualified id
227
+ // `<object>.<key>`; the layout `kind` (grid/kanban/…) is all list-family,
228
+ // so `viewKind` is 'list' and the chosen layout lives at `config.type`.
229
+ createBuildBody: (draft) => {
230
+ const object = String(draft.object ?? '');
231
+ const key = String(draft.name ?? '');
232
+ const qualifiedName = key.includes('.') || !object ? key : `${object}.${key}`;
233
+ return {
234
+ name: qualifiedName,
235
+ object,
236
+ viewKind: 'list',
237
+ label: draft.label,
238
+ config: {
239
+ type: draft.kind || 'grid',
240
+ columns: [],
241
+ data: { provider: 'object', object },
242
+ },
243
+ };
244
+ },
126
245
  });
127
- // flow / workflow may reference an object at the root or under `on`
246
+ // flow may reference an object at the root or under `on`
128
247
  registerMetadataResource({
129
248
  type: 'flow',
130
249
  anchors: [{
@@ -133,16 +252,14 @@ export function registerBuiltinAnchors() {
133
252
  groupLabel: 'Flows',
134
253
  order: 50,
135
254
  }],
255
+ createFields: ['label', 'name', 'type', 'description'],
256
+ createDerive: [
257
+ { from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
258
+ ],
259
+ createDefaults: { nodes: [], edges: [] },
136
260
  });
137
- registerMetadataResource({
138
- type: 'workflow',
139
- anchors: [{
140
- anchorType: 'object',
141
- match: anchorByField(['object', 'on.object']),
142
- groupLabel: 'Workflow Rules',
143
- order: 51,
144
- }],
145
- });
261
+ // ADR-0020: `workflow` retired as a metadata type — record state machines
262
+ // are a `state_machine` validation rule on the object (no separate anchor).
146
263
  // trigger.object → object (low-level DB-style triggers)
147
264
  registerMetadataResource({
148
265
  type: 'trigger',
@@ -152,6 +269,10 @@ export function registerBuiltinAnchors() {
152
269
  groupLabel: 'Triggers',
153
270
  order: 52,
154
271
  }],
272
+ createFields: ['label', 'name', 'object'],
273
+ createDerive: [
274
+ { from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
275
+ ],
155
276
  });
156
277
  // validation: usually embedded in the object, but standalone variants
157
278
  // do exist. Match anything whose `object` points back at us.
@@ -163,6 +284,36 @@ export function registerBuiltinAnchors() {
163
284
  groupLabel: 'Validations',
164
285
  order: 25,
165
286
  }],
287
+ createFields: ['label', 'name', 'message'],
288
+ createDerive: [
289
+ { from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
290
+ ],
291
+ createSchema: {
292
+ type: 'object',
293
+ required: ['label', 'name', 'message'],
294
+ properties: {
295
+ label: { type: 'string', title: 'Label', description: 'Human-readable rule name.' },
296
+ name: {
297
+ type: 'string',
298
+ title: 'Name',
299
+ description: 'Machine name (snake_case). Used in URLs.',
300
+ pattern: '^[a-z_][a-z0-9_]*$',
301
+ },
302
+ message: {
303
+ type: 'string',
304
+ title: 'Error message',
305
+ description: 'Shown to the user when the rule blocks save.',
306
+ },
307
+ },
308
+ },
309
+ createDefaults: {
310
+ type: 'script',
311
+ active: true,
312
+ events: ['insert', 'update'],
313
+ priority: 10,
314
+ severity: 'error',
315
+ condition: 'false',
316
+ },
166
317
  });
167
318
  // permission has a sparse object-keyed map under `objects`. Match by
168
319
  // membership of the parent name in that map.
@@ -177,6 +328,11 @@ export function registerBuiltinAnchors() {
177
328
  groupLabel: 'Permissions',
178
329
  order: 60,
179
330
  }],
331
+ createFields: ['label', 'name', 'isProfile'],
332
+ createDerive: [
333
+ { from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
334
+ ],
335
+ createDefaults: { objects: {} },
180
336
  });
181
337
  // action — both record-scoped and object-scoped actions live here.
182
338
  // Schemas vary, so accept any of the three common shapes.
@@ -192,6 +348,10 @@ export function registerBuiltinAnchors() {
192
348
  groupLabel: 'Actions',
193
349
  order: 55,
194
350
  }],
351
+ createFields: ['label', 'name', 'objectName', 'icon'],
352
+ createDerive: [
353
+ { from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
354
+ ],
195
355
  });
196
356
  // dashboard / report — surface ones bound to a specific object.
197
357
  // Many will not have an explicit anchor; those simply don't appear.
@@ -203,6 +363,11 @@ export function registerBuiltinAnchors() {
203
363
  groupLabel: 'Dashboards',
204
364
  order: 80,
205
365
  }],
366
+ createFields: ['label', 'name', 'description'],
367
+ createDerive: [
368
+ { from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
369
+ ],
370
+ createDefaults: { widgets: [] },
206
371
  });
207
372
  registerMetadataResource({
208
373
  type: 'report',
@@ -212,6 +377,54 @@ export function registerBuiltinAnchors() {
212
377
  groupLabel: 'Reports',
213
378
  order: 81,
214
379
  }],
380
+ createFields: ['label', 'name', 'objectName', 'description'],
381
+ createDerive: [
382
+ { from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
383
+ ],
384
+ createDefaults: { columns: [] },
385
+ });
386
+ // Cosmetic defaults for the `object` type list page — gives Object the
387
+ // same look as every other metadata type while still surfacing the
388
+ // fields/columns developers care about most.
389
+ registerMetadataResource({
390
+ type: 'object',
391
+ iconName: 'database',
392
+ domain: 'data',
393
+ // Protocol-driven create form: ask for identity only. The rest of
394
+ // the object (fields, validations, indexes, hooks, …) is added
395
+ // through the bespoke designer that takes over on the edit page,
396
+ // so requiring it up-front would just front-load 30 inputs with
397
+ // no payoff.
398
+ createFields: ['label', 'pluralLabel', 'name', 'description'],
399
+ createDerive: [
400
+ { from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
401
+ { from: 'label', to: 'pluralLabel', transform: 'plural-en', untilUserEdits: true },
402
+ ],
403
+ // `fields` is the only other required key on the ObjectSchema —
404
+ // seed it as an empty record so the saved body validates.
405
+ createDefaults: { fields: {} },
406
+ searchableFields: ['name', 'label', 'pluralLabel', 'description'],
407
+ listColumns: [
408
+ { key: 'name', label: 'Name', width: '24%' },
409
+ { key: 'label', label: 'Label', width: '22%' },
410
+ { key: 'pluralLabel', label: 'Plural', width: '22%' },
411
+ {
412
+ key: 'fields',
413
+ label: 'Fields',
414
+ width: '90px',
415
+ render: (value) => {
416
+ if (value == null)
417
+ return '—';
418
+ const count = Array.isArray(value)
419
+ ? value.length
420
+ : typeof value === 'object'
421
+ ? Object.keys(value).length
422
+ : 0;
423
+ return count;
424
+ },
425
+ },
426
+ { key: 'description', label: 'Description' },
427
+ ],
215
428
  });
216
429
  }
217
430
  /**
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Live client-side Zod validation for metadata drafts.
3
+ *
4
+ * Unblocked by `@objectstack/spec@7.x` — the spec package now ships
5
+ * per-metadata-type Zod schemas under its kernel/data/ui/automation/
6
+ * ai/system subpaths, so we no longer have to wait for the next save
7
+ * round-trip to learn the draft is invalid.
8
+ *
9
+ * Usage (from ResourceEditPage):
10
+ *
11
+ * const { issues } = await validateMetadataDraft(type, draft);
12
+ * setIssues(issues);
13
+ *
14
+ * Schemas are loaded lazily — the first call for a given type kicks
15
+ * off a dynamic `import()` of the relevant spec subpath, then caches
16
+ * the result. Types we don't have a client-side schema for (e.g.
17
+ * `validation`, `trigger`, `connector`, etc.) return an empty issue list;
18
+ * the user still gets server-side diagnostics on save.
19
+ */
20
+ import type { SchemaFormIssue } from './SchemaForm';
21
+ /**
22
+ * Returns true if a client-side schema exists for the given metadata
23
+ * type. Useful for deciding whether to skip the debounce in caller.
24
+ */
25
+ export declare function hasClientValidator(type: string): boolean;
26
+ export interface ValidateResult {
27
+ /** Whether a client schema was available and the draft conforms. */
28
+ ok: boolean;
29
+ /** Issues to render in SchemaForm + Monaco. Empty on success or unsupported type. */
30
+ issues: SchemaFormIssue[];
31
+ }
32
+ /**
33
+ * Run Zod validation for the given metadata draft. Returns `{ok: true,
34
+ * issues: []}` for types without a registered schema so callers can
35
+ * fall back to server-side diagnostics without special-casing.
36
+ */
37
+ export declare function validateMetadataDraft(type: string, draft: unknown,
38
+ /**
39
+ * The live server JSON schema for this type (from `/meta/types`, i.e.
40
+ * `RichMetadataTypeEntry.schema`). When provided it ROOT-CURES cross-repo
41
+ * spec skew: the bundled `@objectstack/spec` may lag the running server, so
42
+ * we never let the client be STRICTER than the server — a "missing required
43
+ * field" flagged by the (possibly stale) bundled Zod is suppressed when the
44
+ * server marks that field optional. The server's own validation on save
45
+ * stays authoritative. This makes the editor track the live schema without a
46
+ * per-change shim (cf. `FORWARD_COMPAT_FLOW_NODE_TYPES`).
47
+ */
48
+ serverSchema?: {
49
+ required?: unknown;
50
+ }): Promise<ValidateResult>;