@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
@@ -1,5 +1,43 @@
1
+ /**
2
+ * MetadataResourceHistoryPage — durable change log for one item
3
+ * (Phase 3c).
4
+ *
5
+ * Calls `client.history(type, name)`. The framework returns
6
+ * `{ events: MetadataEvent[] }` where each event records who saved
7
+ * what, with a monotonic `seq`. We render a vertical timeline; clicking
8
+ * an event expands its payload diff.
9
+ *
10
+ * Rollback is intentionally not exposed in MVP — restoring a previous
11
+ * version is just `client.save(type, name, oldPayload)` which already
12
+ * works, but a one-click revert needs a confirmation flow we'll add
13
+ * once admins ask for it.
14
+ */
15
+ import * as React from 'react';
16
+ import { useMetadataClient } from './useMetadata';
1
17
  export interface MetadataResourceHistoryPageProps {
2
18
  type?: string;
3
19
  name?: string;
4
20
  }
5
- export declare function MetadataResourceHistoryPage({ type: typeProp, name: nameProp, }: MetadataResourceHistoryPageProps): import("react/jsx-runtime").JSX.Element;
21
+ export declare function MetadataResourceHistoryPage({ type: typeProp, name: nameProp, }: MetadataResourceHistoryPageProps): React.JSX.Element;
22
+ /**
23
+ * Embeddable version of the history timeline. Re-used by both the
24
+ * routed full page and the right-side sheet on the edit page so we
25
+ * keep a single visual + fetching implementation.
26
+ *
27
+ * Pass `onRollback` to enable the per-event Rollback action — the
28
+ * embedded version inside ResourceEditPage uses it to refresh the
29
+ * editor's layered view after restoring a previous version.
30
+ */
31
+ export declare function HistoryPanel({ type, name, refreshKey, onCount, client, onRollback, rollbackConfirm, rollbackLabel, }: {
32
+ type: string;
33
+ name: string;
34
+ refreshKey?: number;
35
+ onCount?: (n: number) => void;
36
+ client: ReturnType<typeof useMetadataClient>;
37
+ /** Called after a successful rollback so the parent can refresh. */
38
+ onRollback?: (version: number) => void;
39
+ /** Confirmation message — defaults to a literal English string. */
40
+ rollbackConfirm?: (version: number) => string;
41
+ /** Tooltip / button label — defaults to "Rollback". */
42
+ rollbackLabel?: string;
43
+ }): React.JSX.Element;
@@ -16,7 +16,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
16
16
  */
17
17
  import * as React from 'react';
18
18
  import { useNavigate, useParams } from 'react-router-dom';
19
- import { ArrowLeft, RefreshCw, Loader2 } from 'lucide-react';
19
+ import { ArrowLeft, RefreshCw, Loader2, RotateCcw } from 'lucide-react';
20
20
  import { Button } from '@object-ui/components';
21
21
  import { Badge } from '@object-ui/components';
22
22
  import { Empty, EmptyTitle, EmptyDescription } from '@object-ui/components';
@@ -30,11 +30,26 @@ export function MetadataResourceHistoryPage({ type: typeProp, name: nameProp, })
30
30
  const client = useMetadataClient();
31
31
  const { entries } = useMetadataTypes(client);
32
32
  const entry = entries.find((t) => t.type === type);
33
+ const [refreshKey, setRefreshKey] = React.useState(0);
34
+ const [eventCount, setEventCount] = React.useState(0);
35
+ return (_jsx(PageShell, { entry: entry ?? { type, label: type }, itemName: name, subtitle: "Version history", stats: [{ label: 'Events', value: eventCount }], actions: _jsxs(_Fragment, { children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => navigate(`../${encodeURIComponent(name)}`), children: [_jsx(ArrowLeft, { className: "h-4 w-4 mr-1" }), "Back to item"] }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setRefreshKey((k) => k + 1), children: _jsx(RefreshCw, { className: "h-4 w-4" }) })] }), children: _jsx("div", { className: "p-6 max-w-4xl", children: _jsx(HistoryPanel, { type: type, name: name, refreshKey: refreshKey, onCount: setEventCount, client: client, onRollback: () => setRefreshKey((k) => k + 1) }) }) }));
36
+ }
37
+ /**
38
+ * Embeddable version of the history timeline. Re-used by both the
39
+ * routed full page and the right-side sheet on the edit page so we
40
+ * keep a single visual + fetching implementation.
41
+ *
42
+ * Pass `onRollback` to enable the per-event Rollback action — the
43
+ * embedded version inside ResourceEditPage uses it to refresh the
44
+ * editor's layered view after restoring a previous version.
45
+ */
46
+ export function HistoryPanel({ type, name, refreshKey = 0, onCount, client, onRollback, rollbackConfirm, rollbackLabel, }) {
33
47
  const [events, setEvents] = React.useState([]);
34
48
  const [loading, setLoading] = React.useState(true);
35
49
  const [error, setError] = React.useState(null);
36
- const [refreshKey, setRefreshKey] = React.useState(0);
37
50
  const [expanded, setExpanded] = React.useState(null);
51
+ const [rollingBack, setRollingBack] = React.useState(null);
52
+ const [localRefresh, setLocalRefresh] = React.useState(0);
38
53
  React.useEffect(() => {
39
54
  let cancelled = false;
40
55
  setLoading(true);
@@ -52,6 +67,7 @@ export function MetadataResourceHistoryPage({ type: typeProp, name: nameProp, })
52
67
  // Reverse chronological — most recent first.
53
68
  const sorted = [...list].sort((a, b) => (b.seq ?? 0) - (a.seq ?? 0));
54
69
  setEvents(sorted);
70
+ onCount?.(sorted.length);
55
71
  setLoading(false);
56
72
  }
57
73
  catch (err) {
@@ -64,20 +80,54 @@ export function MetadataResourceHistoryPage({ type: typeProp, name: nameProp, })
64
80
  return () => {
65
81
  cancelled = true;
66
82
  };
67
- }, [client, type, name, refreshKey]);
68
- return (_jsx(PageShell, { entry: entry ?? { type, label: type }, itemName: name, subtitle: "Version history", stats: [{ label: 'Events', value: events.length }], actions: _jsxs(_Fragment, { children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => navigate(`../${encodeURIComponent(name)}`), children: [_jsx(ArrowLeft, { className: "h-4 w-4 mr-1" }), "Back to item"] }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setRefreshKey((k) => k + 1), children: _jsx(RefreshCw, { className: "h-4 w-4" }) })] }), children: _jsxs("div", { className: "p-6 max-w-4xl", children: [loading && (_jsxs("div", { className: "text-sm text-muted-foreground flex items-center gap-2", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Loading history\u2026"] })), error && (_jsx("div", { className: "text-sm text-destructive border border-destructive/30 rounded p-3 bg-destructive/5", children: error })), !loading && !error && events.length === 0 && (_jsxs(Empty, { children: [_jsx(EmptyTitle, { children: "No history yet" }), _jsx(EmptyDescription, { children: "This item has never been edited via an overlay. The first save will create the initial history record." })] })), !loading && events.length > 0 && (_jsx("ol", { className: "space-y-2 relative pl-6 border-l", children: events.map((ev, i) => {
69
- const isOpen = expanded === i;
70
- return (_jsxs("li", { className: "relative", children: [_jsx("span", { className: "absolute -left-[27px] top-2 w-3 h-3 rounded-full bg-primary ring-4 ring-background" }), _jsxs("div", { role: "button", tabIndex: 0, onClick: () => setExpanded(isOpen ? null : i), onKeyDown: (e) => {
71
- if (e.key === 'Enter' || e.key === ' ') {
72
- setExpanded(isOpen ? null : i);
73
- }
74
- }, className: "border rounded-lg p-3 hover:border-primary/50 cursor-pointer transition-colors", children: [_jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsxs(Badge, { variant: "outline", className: "text-[10px] font-mono", children: ["seq ", ev.seq ?? '–'] }), ev.kind && (_jsx(Badge, { className: 'text-[10px] ' +
75
- (ev.kind === 'delete' || ev.kind === 'tombstone'
76
- ? 'bg-red-100 text-red-800 hover:bg-red-100'
77
- : ev.kind === 'create'
78
- ? 'bg-blue-100 text-blue-800 hover:bg-blue-100'
79
- : 'bg-emerald-100 text-emerald-800 hover:bg-emerald-100'), children: String(ev.kind) })), ev.actor && (_jsxs("span", { className: "text-xs text-muted-foreground", children: ["by", ' ', _jsx("span", { className: "font-mono", children: String(ev.actor) })] })), ev.at && (_jsx("span", { className: "text-xs text-muted-foreground ml-auto", children: formatWhen(ev.at) }))] }), isOpen && (_jsx("pre", { className: "mt-2 text-xs font-mono bg-muted/30 rounded p-2 overflow-auto max-h-[280px]", children: safeStringify(ev) }))] })] }, `${ev.seq ?? i}-${i}`));
80
- }) }))] }) }));
83
+ }, [client, type, name, refreshKey, localRefresh]);
84
+ async function doRollback(version) {
85
+ const message = rollbackConfirm
86
+ ? rollbackConfirm(version)
87
+ : `Restore version ${version}? This writes the historical body back as the current overlay.`;
88
+ if (!confirm(message))
89
+ return;
90
+ setRollingBack(version);
91
+ setError(null);
92
+ try {
93
+ await client.rollback(type, name, version);
94
+ onRollback?.(version);
95
+ // Refetch so the new revert event shows up at the top.
96
+ setLocalRefresh((k) => k + 1);
97
+ }
98
+ catch (err) {
99
+ setError(err?.message ?? String(err));
100
+ }
101
+ finally {
102
+ setRollingBack(null);
103
+ }
104
+ }
105
+ return (_jsxs(_Fragment, { children: [loading && (_jsxs("div", { className: "text-sm text-muted-foreground flex items-center gap-2", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Loading history\u2026"] })), error && (_jsx("div", { className: "text-sm text-destructive border border-destructive/30 rounded p-3 bg-destructive/5", children: error })), !loading && !error && events.length === 0 && (_jsxs(Empty, { children: [_jsx(EmptyTitle, { children: "No history yet" }), _jsx(EmptyDescription, { children: "This item has never been edited via an overlay. The first save will create the initial history record." })] })), !loading && events.length > 0 && (_jsx("ol", { className: "space-y-2 relative pl-6 border-l", children: events.map((ev, i) => {
106
+ const isOpen = expanded === i;
107
+ const op = ev.op ?? ev.kind;
108
+ const ts = ev.ts ?? ev.at;
109
+ const canRollback = !!onRollback
110
+ && typeof ev.version === 'number'
111
+ && op !== 'delete'
112
+ && op !== 'tombstone';
113
+ return (_jsxs("li", { className: "relative", children: [_jsx("span", { className: "absolute -left-[27px] top-2 w-3 h-3 rounded-full bg-primary ring-4 ring-background" }), _jsxs("div", { role: "button", tabIndex: 0, onClick: () => setExpanded(isOpen ? null : i), onKeyDown: (e) => {
114
+ if (e.key === 'Enter' || e.key === ' ') {
115
+ setExpanded(isOpen ? null : i);
116
+ }
117
+ }, className: "border rounded-lg p-3 hover:border-primary/50 cursor-pointer transition-colors", children: [_jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsxs(Badge, { variant: "outline", className: "text-[10px] font-mono", children: ["seq ", ev.seq ?? '–'] }), typeof ev.version === 'number' && (_jsxs(Badge, { variant: "outline", className: "text-[10px] font-mono", children: ["v", ev.version] })), op && (_jsx(Badge, { className: 'text-[10px] ' +
118
+ (op === 'delete' || op === 'tombstone'
119
+ ? 'bg-red-100 text-red-800 hover:bg-red-100'
120
+ : op === 'create'
121
+ ? 'bg-blue-100 text-blue-800 hover:bg-blue-100'
122
+ : op === 'publish'
123
+ ? 'bg-emerald-100 text-emerald-800 hover:bg-emerald-100'
124
+ : op === 'revert'
125
+ ? 'bg-amber-100 text-amber-900 hover:bg-amber-100'
126
+ : 'bg-emerald-100 text-emerald-800 hover:bg-emerald-100'), children: String(op) })), ev.actor && (_jsxs("span", { className: "text-xs text-muted-foreground", children: ["by", ' ', _jsx("span", { className: "font-mono", children: String(ev.actor) })] })), ts && (_jsx("span", { className: "text-xs text-muted-foreground ml-auto", children: formatWhen(ts) })), canRollback && (_jsx(Button, { size: "sm", variant: "ghost", className: "h-6 w-6 p-0", title: rollbackLabel ?? 'Rollback to this version', disabled: rollingBack !== null, onClick: (e) => {
127
+ e.stopPropagation();
128
+ doRollback(ev.version);
129
+ }, children: rollingBack === ev.version ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(RotateCcw, { className: "h-3.5 w-3.5" })) }))] }), isOpen && (_jsx("pre", { className: "mt-2 text-xs font-mono bg-muted/30 rounded p-2 overflow-auto max-h-[280px]", children: safeStringify(ev) }))] })] }, `${ev.seq ?? i}-${i}`));
130
+ }) }))] }));
81
131
  }
82
132
  function formatWhen(at) {
83
133
  try {
@@ -1,4 +1,16 @@
1
+ /**
2
+ * MetadataResourceListPage — generic list of items for a metadata type
3
+ * (Phase 3c).
4
+ *
5
+ * Reads `/meta/:type`, applies registry-driven columns + search +
6
+ * source/overlay filters, and renders an ObjectGrid-like table.
7
+ * Each row links to its EditPage at `./:name?type=…`.
8
+ *
9
+ * No virtualisation in MVP — metadata lists are typically < 200 items
10
+ * per type, well under the threshold where it'd matter.
11
+ */
12
+ import * as React from 'react';
1
13
  export interface MetadataResourceListPageProps {
2
14
  type?: string;
3
15
  }
4
- export declare function MetadataResourceListPage({ type: typeProp }: MetadataResourceListPageProps): import("react/jsx-runtime").JSX.Element;
16
+ export declare function MetadataResourceListPage({ type: typeProp }: MetadataResourceListPageProps): React.JSX.Element;
@@ -12,37 +12,190 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
12
12
  * per type, well under the threshold where it'd matter.
13
13
  */
14
14
  import * as React from 'react';
15
- import { Link, useNavigate, useParams } from 'react-router-dom';
16
- import { Plus, Search, RefreshCw } from 'lucide-react';
15
+ import { Link, Navigate, useNavigate, useParams, useSearchParams } from 'react-router-dom';
16
+ import { Plus, Search, RefreshCw, AlertTriangle, Lock } from 'lucide-react';
17
17
  import { Button } from '@object-ui/components';
18
18
  import { Input } from '@object-ui/components';
19
19
  import { Badge } from '@object-ui/components';
20
20
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@object-ui/components';
21
21
  import { Empty, EmptyTitle, EmptyDescription } from '@object-ui/components';
22
22
  import { PageShell } from './PageShell';
23
+ import { MetadataTypeActions } from './MetadataTypeActions';
23
24
  import { useMetadataClient, useMetadataTypes, matchesQuery, } from './useMetadata';
24
25
  import { getMetadataResource, resolveResourceConfig, } from './registry';
25
- import { t, detectLocale } from './i18n';
26
+ import { t, tFormat, translateMetadataType, detectLocale } from './i18n';
27
+ /**
28
+ * Derive provenance from item._packageId. The `loadMetaFromDb` path
29
+ * tags objects with the synthetic packageId 'sys_metadata' (see
30
+ * framework protocol.ts:3092); treat that sentinel as runtime-authored.
31
+ */
32
+ function classifyProvenance(item, rawSource) {
33
+ if (rawSource === 'overlay' || rawSource === 'runtime')
34
+ return 'runtime';
35
+ if (rawSource === 'code' || rawSource === 'artifact')
36
+ return 'artifact';
37
+ const pkg = item._packageId;
38
+ if (!pkg || pkg === 'sys_metadata')
39
+ return 'runtime';
40
+ return 'artifact';
41
+ }
26
42
  export function MetadataResourceListPage({ type: typeProp }) {
27
43
  const params = useParams();
28
44
  const type = typeProp ?? params.type ?? '';
29
- const navigate = useNavigate();
30
- const client = useMetadataClient();
31
- const { entries: typesEntries } = useMetadataTypes(client);
32
- const entry = typesEntries.find((t) => t.type === type);
33
- const config = resolveResourceConfig(type, entry);
45
+ if (type === 'package') {
46
+ const appName = params.appName ?? 'studio';
47
+ return _jsx(Navigate, { to: `/apps/${appName}/component/developer/packages`, replace: true });
48
+ }
34
49
  // If a fully custom ListPage is registered, render it and bail.
50
+ // Done before any other hooks so hook count stays stable across type
51
+ // switches between custom and default list pages.
35
52
  const customConfig = getMetadataResource(type);
36
53
  if (customConfig?.ListPage) {
37
54
  const Custom = customConfig.ListPage;
38
55
  return _jsx(Custom, { type: type });
39
56
  }
57
+ return _jsx(DefaultMetadataList, { type: type, appName: params.appName });
58
+ }
59
+ function DefaultMetadataList({ type, appName }) {
60
+ const navigate = useNavigate();
61
+ const client = useMetadataClient();
62
+ const { entries: typesEntries } = useMetadataTypes(client);
63
+ const entry = typesEntries.find((t) => t.type === type);
64
+ const config = resolveResourceConfig(type, entry);
40
65
  const [items, setItems] = React.useState([]);
41
66
  const [loading, setLoading] = React.useState(true);
42
67
  const [error, setError] = React.useState(null);
43
68
  const [query, setQuery] = React.useState('');
44
69
  const [sourceFilter, setSourceFilter] = React.useState('all');
70
+ const [searchParams, setSearchParams] = useSearchParams();
45
71
  const [refreshKey, setRefreshKey] = React.useState(0);
72
+ // Studio is scoped to a single *project* package at a time. Load the
73
+ // installed packages and keep only project-scoped ones — anything not
74
+ // tagged `system`/`cloud` (a missing scope counts as project). System
75
+ // metadata therefore never leaks: the scope selector never offers a
76
+ // system package and an unscoped view is not allowed.
77
+ const [projectPackages, setProjectPackages] = React.useState(null);
78
+ React.useEffect(() => {
79
+ let cancelled = false;
80
+ (async () => {
81
+ try {
82
+ const list = await client.list('package');
83
+ if (cancelled)
84
+ return;
85
+ const SYSTEM_SCOPES = new Set(['system', 'cloud']);
86
+ const rows = (list ?? [])
87
+ .map((raw) => {
88
+ const item = raw && typeof raw === 'object' && 'item' in raw ? raw.item : raw;
89
+ const m = (item?.manifest ?? item ?? {});
90
+ return {
91
+ id: m.id,
92
+ scope: m.scope,
93
+ name: m.name || m.id,
94
+ };
95
+ })
96
+ .filter((p) => p.id && !SYSTEM_SCOPES.has(p.scope));
97
+ rows.sort((a, b) => a.name.localeCompare(b.name));
98
+ setProjectPackages(rows.map((p) => ({ id: p.id, name: p.name })));
99
+ }
100
+ catch {
101
+ if (!cancelled)
102
+ setProjectPackages([]);
103
+ }
104
+ })();
105
+ return () => {
106
+ cancelled = true;
107
+ };
108
+ }, [client]);
109
+ // Resolve the CURRENT APP's package so the list defaults to the scope the
110
+ // admin is actually working in (e.g. opening Pages from the Showcase app
111
+ // shows that app's pages, not an alphabetically-first empty template). The
112
+ // route segment may be the app `name` or its package id, so match both.
113
+ const [appPackage, setAppPackage] = React.useState(null);
114
+ React.useEffect(() => {
115
+ let cancelled = false;
116
+ if (!appName) {
117
+ setAppPackage(null);
118
+ return;
119
+ }
120
+ (async () => {
121
+ try {
122
+ const apps = await client.list('app');
123
+ if (cancelled)
124
+ return;
125
+ const match = (apps ?? [])
126
+ .map((raw) => (raw && typeof raw === 'object' && 'item' in raw ? raw.item : raw))
127
+ .find((a) => a?.name === appName || a?._packageId === appName);
128
+ setAppPackage(match?._packageId ?? null);
129
+ }
130
+ catch {
131
+ if (!cancelled)
132
+ setAppPackage(null);
133
+ }
134
+ })();
135
+ return () => { cancelled = true; };
136
+ }, [client, appName]);
137
+ // Resolve the active package from the URL, validated against the project
138
+ // package set. `null` while packages are still loading (fail closed).
139
+ const urlPackage = searchParams.get('package');
140
+ const activePackage = React.useMemo(() => {
141
+ if (!projectPackages)
142
+ return null;
143
+ if (urlPackage && projectPackages.some((p) => p.id === urlPackage))
144
+ return urlPackage;
145
+ if (projectPackages.length === 0)
146
+ return null;
147
+ // No valid URL package: prefer the CURRENT APP's package (the scope the
148
+ // admin is working in) when it's a valid project package — this is what
149
+ // makes "Pages" in the Showcase app default to Showcase's pages.
150
+ if (appPackage && projectPackages.some((p) => p.id === appPackage))
151
+ return appPackage;
152
+ // Otherwise prefer the project package that actually OWNS rows of this
153
+ // metadata type, so the list never opens empty on an alphabetically-first
154
+ // package that happens to own none. Falls back to the first package.
155
+ const counts = new Map();
156
+ for (const row of items) {
157
+ const pkg = row.item?._packageId;
158
+ if (pkg && pkg !== 'sys_metadata')
159
+ counts.set(pkg, (counts.get(pkg) ?? 0) + 1);
160
+ }
161
+ let best = null;
162
+ let bestN = 0;
163
+ for (const p of projectPackages) {
164
+ const n = counts.get(p.id) ?? 0;
165
+ if (n > bestN) {
166
+ best = p.id;
167
+ bestN = n;
168
+ }
169
+ }
170
+ return best ?? projectPackages[0]?.id ?? null;
171
+ }, [projectPackages, urlPackage, items, appPackage]);
172
+ // Repair `?package=` so the sidebar selector, deep-links and create/edit
173
+ // navigation all agree on the active scope. Runs once packages resolve
174
+ // and the URL holds no valid project package.
175
+ React.useEffect(() => {
176
+ if (!projectPackages || projectPackages.length === 0)
177
+ return;
178
+ if (urlPackage && projectPackages.some((p) => p.id === urlPackage))
179
+ return;
180
+ // If the current app's package is known we can repair immediately; otherwise
181
+ // wait for rows so `activePackage` can resolve to the package that owns this
182
+ // type (repairing to the alphabetical-first package before then would lock
183
+ // the list onto an empty scope).
184
+ const appPkgValid = !!(appPackage && projectPackages.some((p) => p.id === appPackage));
185
+ if (!appPkgValid && items.length === 0)
186
+ return;
187
+ if (!activePackage)
188
+ return;
189
+ const next = new URLSearchParams(searchParams);
190
+ next.set('package', activePackage);
191
+ setSearchParams(next, { replace: true });
192
+ // eslint-disable-next-line react-hooks/exhaustive-deps
193
+ }, [projectPackages, urlPackage, items, activePackage, appPackage]);
194
+ // Carry the active package into create/edit navigation as `?package=` so
195
+ // the editor binds newly-saved rows to that software package.
196
+ const pkgSuffix = activePackage
197
+ ? `?package=${encodeURIComponent(activePackage)}`
198
+ : '';
46
199
  React.useEffect(() => {
47
200
  let cancelled = false;
48
201
  setLoading(true);
@@ -54,10 +207,14 @@ export function MetadataResourceListPage({ type: typeProp }) {
54
207
  return;
55
208
  const rows = (list ?? []).map((raw) => {
56
209
  const item = (raw && typeof raw === 'object' && 'item' in raw ? raw.item : raw) ?? {};
210
+ // _diagnostics may live on the unwrapped item (default) or on the
211
+ // outer envelope when callers reshape rows; check both.
212
+ const diagnostics = item?._diagnostics ?? raw?._diagnostics ?? undefined;
57
213
  return {
58
214
  raw,
59
215
  item,
60
- source: raw?.source,
216
+ source: classifyProvenance(item, raw?.source),
217
+ diagnostics,
61
218
  };
62
219
  });
63
220
  setItems(rows);
@@ -75,24 +232,51 @@ export function MetadataResourceListPage({ type: typeProp }) {
75
232
  };
76
233
  }, [client, type, refreshKey]);
77
234
  const searchableFields = config.searchableFields ?? ['name', 'label', 'description'];
78
- const filtered = items.filter((row) => {
235
+ // Structural scope — every row this package could ever show for this
236
+ // type, before the user's search box / source dropdown narrow it. Header
237
+ // counts, the source filter, and the empty-state copy all key off this so
238
+ // a package with zero items of a type reads as "暂无…条目", not "no match
239
+ // for an (empty) query" just because *other* packages own rows of the
240
+ // same type (server list() is not package-scoped; we scope client-side).
241
+ const scopedItems = React.useMemo(() => items.filter((row) => {
242
+ // Per-type hide hook (e.g. `view` drops the bare aggregated
243
+ // container the framework keeps for runtime dual-read).
244
+ if (config.listFilter && !config.listFilter(row.item))
245
+ return false;
246
+ // Mandatory project-package scope: show nothing until a concrete
247
+ // project package is active, then only rows tagged with it. The
248
+ // 'sys_metadata' sentinel and untagged rows never match.
249
+ if (!activePackage)
250
+ return false;
251
+ const pkg = row.item?._packageId;
252
+ const effectivePkg = !pkg || pkg === 'sys_metadata' ? null : pkg;
253
+ return effectivePkg === activePackage;
254
+ }), [items, activePackage, config]);
255
+ // User-driven filters (search query + source provenance) on top of scope.
256
+ const filtered = scopedItems.filter((row) => {
79
257
  if (!matchesQuery(row.item, query, searchableFields))
80
258
  return false;
81
- if (sourceFilter !== 'all' && row.source && row.source !== sourceFilter)
259
+ if (sourceFilter !== 'all' && row.source !== sourceFilter)
82
260
  return false;
83
261
  return true;
84
262
  });
85
- // Compute source counts for the filter dropdown.
263
+ // Compute source + invalid counts for filter / header stats.
86
264
  const sourceCounts = React.useMemo(() => {
87
- const c = { all: items.length, code: 0, overlay: 0, effective: 0 };
88
- for (const r of items) {
89
- if (r.source && c[r.source] !== undefined)
90
- c[r.source]++;
265
+ const c = { all: scopedItems.length, artifact: 0, runtime: 0 };
266
+ for (const r of scopedItems) {
267
+ c[r.source]++;
91
268
  }
92
269
  return c;
93
- }, [items]);
270
+ }, [scopedItems]);
271
+ const invalidCount = React.useMemo(() => scopedItems.filter((r) => r.diagnostics && r.diagnostics.valid === false).length, [scopedItems]);
272
+ // Items with warnings but no errors — softer, advisory tier. We
273
+ // count rows (not warning instances) for consistency with `invalid`.
274
+ const warnOnlyCount = React.useMemo(() => scopedItems.filter((r) => r.diagnostics &&
275
+ r.diagnostics.valid !== false &&
276
+ (r.diagnostics.warnings?.length ?? 0) > 0).length, [scopedItems]);
94
277
  const columns = config.listColumns ?? defaultColumns(config.primaryKey ?? 'name');
95
278
  const locale = detectLocale();
279
+ const typeLabel = translateMetadataType(type, locale, entry?.label ?? type);
96
280
  // Localise default column labels — registered columns keep their
97
281
  // hand-authored labels (consumers may want bespoke wording).
98
282
  const localizeColumnLabel = (col) => {
@@ -101,24 +285,76 @@ export function MetadataResourceListPage({ type: typeProp }) {
101
285
  return translated === tryKey ? col.label : translated;
102
286
  };
103
287
  return (_jsx(PageShell, { entry: entry ?? { type, label: type }, stats: [
104
- { label: t('engine.list.items', locale), value: items.length },
288
+ { label: t('engine.list.items', locale), value: scopedItems.length },
105
289
  { label: t('engine.list.filtered', locale), value: filtered.length },
106
- ], actions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: () => setRefreshKey((k) => k + 1), title: t('engine.list.refresh', locale), children: _jsx(RefreshCw, { className: "h-4 w-4" }) }), entry?.allowOrgOverride && (_jsxs(Button, { size: "sm", onClick: () => navigate(`./new`), children: [_jsx(Plus, { className: "h-4 w-4 mr-1" }), t('engine.list.create', locale)] }))] }), children: _jsxs("div", { className: "p-6 space-y-4", children: [_jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [_jsxs("div", { className: "relative flex-1 min-w-[200px] max-w-md", children: [_jsx(Search, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground" }), _jsx(Input, { className: "pl-8", placeholder: t('engine.list.search', locale), value: query, onChange: (e) => setQuery(e.target.value) })] }), _jsxs(Select, { value: sourceFilter, onValueChange: setSourceFilter, children: [_jsx(SelectTrigger, { className: "w-[180px]", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsxs(SelectItem, { value: "all", children: [t('engine.list.allSources', locale), " (", sourceCounts.all, ")"] }), _jsxs(SelectItem, { value: "code", children: ["Code (", sourceCounts.code, ")"] }), _jsxs(SelectItem, { value: "overlay", children: ["Overlay (", sourceCounts.overlay, ")"] }), _jsxs(SelectItem, { value: "effective", children: ["Effective (", sourceCounts.effective, ")"] })] })] })] }), loading && (_jsxs("div", { className: "text-sm text-muted-foreground", children: [t('engine.edit.loading', locale), " ", type, "\u2026"] })), error && (_jsx("div", { className: "text-sm text-destructive border border-destructive/30 rounded p-3 bg-destructive/5", children: error })), !loading && !error && filtered.length === 0 && (_jsxs(Empty, { children: [_jsx(EmptyTitle, { children: items.length === 0
107
- ? `No ${type} items registered`
108
- : `No matches for "${query}"` }), _jsx(EmptyDescription, { children: config.emptyStateHint ??
109
- (entry?.allowOrgOverride
110
- ? `Click "New" above to create the first ${type}.`
111
- : `This type is read-only — instances are defined by code artifacts in packages.`) })] })), !loading && filtered.length > 0 && (_jsx("div", { className: "border rounded-lg overflow-hidden", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted/40 text-xs uppercase tracking-wider text-muted-foreground", children: _jsxs("tr", { children: [columns.map((c) => (_jsx("th", { className: "px-3 py-2 text-left font-medium", style: c.width ? { width: c.width } : undefined, children: localizeColumnLabel(c) }, c.key))), _jsx("th", { className: "px-3 py-2 text-right font-medium w-[80px]", children: t('engine.list.col.source', locale) })] }) }), _jsx("tbody", { className: "divide-y", children: filtered.map((row, i) => {
290
+ ...(invalidCount > 0
291
+ ? [
292
+ {
293
+ label: t('engine.list.invalid', locale),
294
+ value: (_jsxs("span", { className: "inline-flex items-center gap-1 text-destructive", children: [_jsx(AlertTriangle, { className: "w-3.5 h-3.5" }), invalidCount] })),
295
+ },
296
+ ]
297
+ : []),
298
+ ...(warnOnlyCount > 0
299
+ ? [
300
+ {
301
+ label: t('engine.list.warnings', locale),
302
+ value: (_jsxs("span", { className: "inline-flex items-center gap-1 text-amber-600 dark:text-amber-400", children: [_jsx(AlertTriangle, { className: "w-3.5 h-3.5" }), warnOnlyCount] })),
303
+ },
304
+ ]
305
+ : []),
306
+ ], actions: _jsxs(_Fragment, { children: [_jsx(MetadataTypeActions, { entry: entry, location: "list_toolbar", onAfter: () => setRefreshKey((k) => k + 1) }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setRefreshKey((k) => k + 1), title: t('engine.list.refresh', locale), children: _jsx(RefreshCw, { className: "h-4 w-4" }) }), (entry?.allowOrgOverride || entry?.allowRuntimeCreate) && (_jsxs(Button, { size: "sm", variant: config.createFields ? 'default' : 'outline', onClick: () => navigate(`./new${pkgSuffix}`), title: config.createFields
307
+ ? tFormat('engine.list.createHint', locale, { type: typeLabel })
308
+ : undefined, children: [_jsx(Plus, { className: "h-4 w-4 mr-1" }), t('engine.list.create', locale)] }))] }), children: _jsxs("div", { className: "p-6 space-y-4", children: [_jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [_jsxs("div", { className: "relative flex-1 min-w-[200px] max-w-md", children: [_jsx(Search, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground" }), _jsx(Input, { className: "pl-8", placeholder: t('engine.list.search', locale), value: query, onChange: (e) => setQuery(e.target.value) })] }), _jsxs(Select, { value: sourceFilter, onValueChange: setSourceFilter, children: [_jsx(SelectTrigger, { className: "w-[180px]", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsxs(SelectItem, { value: "all", children: [t('engine.list.allSources', locale), " (", sourceCounts.all, ")"] }), _jsxs(SelectItem, { value: "artifact", children: [t('engine.list.source.artifact', locale), " (", sourceCounts.artifact, ")"] }), _jsxs(SelectItem, { value: "runtime", children: [t('engine.list.source.runtime', locale), " (", sourceCounts.runtime, ")"] })] })] })] }), (loading || projectPackages === null) && (_jsxs("div", { className: "text-sm text-muted-foreground", children: [t('engine.edit.loading', locale), " ", type, "\u2026"] })), error && (_jsx("div", { className: "text-sm text-destructive border border-destructive/30 rounded p-3 bg-destructive/5", children: error })), !loading && !error && projectPackages !== null && projectPackages.length === 0 && (_jsxs(Empty, { children: [_jsx(EmptyTitle, { children: "No project packages installed" }), _jsx(EmptyDescription, { children: "Studio only shows metadata that belongs to a project software package. Install or create a project package to manage its metadata here." })] })), !loading && !error && projectPackages !== null && projectPackages.length > 0 && filtered.length === 0 && (_jsxs(Empty, { children: [_jsx(EmptyTitle, { children: scopedItems.length === 0
309
+ ? tFormat('engine.list.emptyType', locale, { type: typeLabel })
310
+ : tFormat('engine.list.emptyQuery', locale, { query }) }), _jsx(EmptyDescription, { children: config.emptyStateHint ??
311
+ (entry?.allowOrgOverride || entry?.allowRuntimeCreate
312
+ ? tFormat('engine.list.createHint', locale, { type: typeLabel })
313
+ : t('engine.list.readOnlyHint', locale)) }), scopedItems.length === 0 && (entry?.allowOrgOverride || entry?.allowRuntimeCreate) && (_jsx("div", { className: "mt-4", children: _jsxs(Button, { onClick: () => navigate(`./new${pkgSuffix}`), children: [_jsx(Plus, { className: "h-4 w-4 mr-1" }), t('engine.list.create', locale)] }) }))] })), !loading && filtered.length > 0 && (_jsx("div", { className: "border rounded-lg overflow-hidden", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted/40 text-xs uppercase tracking-wider text-muted-foreground", children: _jsxs("tr", { children: [columns.map((c) => (_jsx("th", { className: "px-3 py-2 text-left font-medium", style: c.width ? { width: c.width } : undefined, children: localizeColumnLabel(c) }, c.key))), _jsx("th", { className: "px-3 py-2 text-right font-medium w-[80px]", children: t('engine.list.col.source', locale) })] }) }), _jsx("tbody", { className: "divide-y", children: filtered.map((row, i) => {
112
314
  const pk = config.primaryKey ?? 'name';
113
315
  const name = String(row.item[pk] ?? `(unnamed-${i})`);
114
- return (_jsxs("tr", { className: "hover:bg-accent/50", children: [columns.map((c, ci) => {
316
+ // ADR-0048 link to this row's OWNING package so the editor
317
+ // resolves the right item even in the unscoped "all" list
318
+ // where two packages may ship the same name. Falls back to the
319
+ // workspace suffix for runtime/overlay-only rows (no real
320
+ // package, or the `sys_metadata` rehydration sentinel).
321
+ const rowPkg = row.item._packageId;
322
+ const rowEditSuffix = rowPkg && rowPkg !== 'sys_metadata'
323
+ ? `?package=${encodeURIComponent(rowPkg)}`
324
+ : pkgSuffix;
325
+ const invalid = row.diagnostics?.valid === false;
326
+ const errorList = row.diagnostics?.errors ?? [];
327
+ const warnList = row.diagnostics?.warnings ?? [];
328
+ const warnOnly = !invalid && warnList.length > 0;
329
+ const errorTitle = invalid
330
+ ? errorList
331
+ .slice(0, 3)
332
+ .map((e) => `${e.path || '(root)'}: ${e.message}`)
333
+ .join('\n') +
334
+ (errorList.length > 3 ? `\n+${errorList.length - 3} more` : '')
335
+ : warnOnly
336
+ ? warnList
337
+ .slice(0, 3)
338
+ .map((w) => `${w.path || '(root)'}: ${w.message}`)
339
+ .join('\n') +
340
+ (warnList.length > 3 ? `\n+${warnList.length - 3} more` : '')
341
+ : '';
342
+ return (_jsxs("tr", { className: 'hover:bg-accent/50 ' +
343
+ (invalid
344
+ ? 'bg-destructive/[0.04]'
345
+ : warnOnly
346
+ ? 'bg-amber-500/[0.05]'
347
+ : ''), children: [columns.map((c, ci) => {
115
348
  const value = row.item[c.key];
116
349
  const cell = c.render ? c.render(value, row.item) : defaultCell(value);
117
- return (_jsx("td", { className: "px-3 py-2 align-top", children: ci === 0 ? (_jsx(Link, { to: `./${encodeURIComponent(name)}`, className: "text-primary hover:underline font-mono", children: cell })) : (cell) }, c.key));
118
- }), _jsx("td", { className: "px-3 py-2 text-right align-top", children: row.source ? (_jsx(Badge, { variant: "outline", className: 'text-[10px] ' +
119
- (row.source === 'overlay'
120
- ? 'border-emerald-500 text-emerald-700'
121
- : ''), children: row.source })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: "\u2014" })) })] }, name + i));
350
+ return (_jsx("td", { className: "px-3 py-2 align-top", children: ci === 0 ? (_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [invalid && (_jsx("span", { className: "inline-flex", "aria-label": t('engine.list.invalidTitle', locale), title: `${tFormat('engine.list.invalidCount', locale, { count: errorList.length })}\n${errorTitle}`, children: _jsx(AlertTriangle, { className: "w-3.5 h-3.5 text-destructive shrink-0" }) })), warnOnly && (_jsx("span", { className: "inline-flex", "aria-label": t('engine.list.warnTitle', locale), title: `${tFormat('engine.list.warnCount', locale, { count: warnList.length })}\n${errorTitle}`, children: _jsx(AlertTriangle, { className: "w-3.5 h-3.5 text-amber-600 dark:text-amber-400 shrink-0" }) })), _jsx(Link, { to: `./${encodeURIComponent(name)}${rowEditSuffix}`, className: "text-primary hover:underline font-mono", children: cell })] })) : (cell) }, c.key));
351
+ }), _jsxs("td", { className: "px-3 py-2 text-right align-top", children: [row.item._lock && row.item._lock !== 'none' && (_jsx("span", { className: "inline-flex items-center mr-1 text-amber-600 dark:text-amber-400", title: row.item._lockReason
352
+ ?? `_lock=${String(row.item._lock)}`, children: _jsx(Lock, { className: "h-3 w-3" }) })), _jsx(Badge, { variant: "outline", className: 'text-[10px] ' +
353
+ (row.source === 'artifact'
354
+ ? 'border-sky-500/50 text-sky-700 dark:text-sky-300'
355
+ : 'border-emerald-500/50 text-emerald-700 dark:text-emerald-300'), title: row.source === 'artifact'
356
+ ? `${t('engine.list.source.artifactDesc', locale)}${row.item._packageId ? ` (${row.item._packageId})` : ''}`
357
+ : t('engine.list.source.runtimeDesc', locale), children: t(`engine.list.source.${row.source}`, locale) })] })] }, name + i));
122
358
  }) })] }) }))] }) }));
123
359
  }
124
360
  function defaultColumns(primaryKey) {
@@ -1,3 +1,25 @@
1
+ /**
2
+ * MetadataResourceRouter — top-level component bound to
3
+ * `metadata:resource`. Switches between list / create / edit /
4
+ * history based on the trailing wildcard URL.
5
+ *
6
+ * URL shape (the parent route is `/apps/:appName/component/:ns/:name/*`,
7
+ * so the wildcard begins AFTER `metadata/resource`):
8
+ *
9
+ * `?type=view` → list of `view` items
10
+ * `/new?type=view` → create new view
11
+ * `/account?type=object` → edit object `account`
12
+ * `/account/history?type=object` → history for object `account`
13
+ *
14
+ * The `type` query param is the single source of truth for the
15
+ * metadata type. The wildcard provides the item name (or `'new'`).
16
+ *
17
+ * Why parse the wildcard manually instead of nested `<Routes>`?
18
+ * The parent route's `path` is `component/:ns/:name/*` and React
19
+ * Router strips the matched portion before passing what's left to
20
+ * `useParams['*']`, so we just split on `/`.
21
+ */
22
+ import * as React from 'react';
1
23
  /**
2
24
  * Props forwarded by `ComponentNavView` — it merges URL query-string
3
25
  * into props, so we accept both `type` (from `?type=…`) and route
@@ -7,4 +29,4 @@ export interface MetadataResourceRouterProps {
7
29
  /** Singular metadata type, e.g. 'view'. */
8
30
  type?: string;
9
31
  }
10
- export declare function MetadataResourceRouter({ type }: MetadataResourceRouterProps): import("react/jsx-runtime").JSX.Element;
32
+ export declare function MetadataResourceRouter({ type }: MetadataResourceRouterProps): React.JSX.Element;