@object-ui/app-shell 6.2.3 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. package/CHANGELOG.md +948 -0
  2. package/README.md +292 -0
  3. package/dist/assistant/assistantBus.d.ts +72 -0
  4. package/dist/assistant/assistantBus.js +133 -0
  5. package/dist/chrome/CommandPalette.d.ts +1 -1
  6. package/dist/chrome/CommandPalette.js +26 -22
  7. package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
  8. package/dist/chrome/ConsoleToaster.d.ts +1 -1
  9. package/dist/chrome/ConsoleToaster.js +3 -1
  10. package/dist/chrome/ErrorBoundary.d.ts +1 -1
  11. package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
  12. package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
  13. package/dist/chrome/LoadingScreen.d.ts +1 -1
  14. package/dist/chrome/LoadingScreen.js +22 -26
  15. package/dist/chrome/RouteFader.d.ts +1 -1
  16. package/dist/chrome/ThemeProvider.d.ts +1 -1
  17. package/dist/components/ManagedByBadge.d.ts +1 -1
  18. package/dist/console/AppContent.d.ts +1 -1
  19. package/dist/console/AppContent.js +170 -37
  20. package/dist/console/ConsoleShell.d.ts +7 -7
  21. package/dist/console/ConsoleShell.js +32 -3
  22. package/dist/console/ai/AiChatPage.d.ts +88 -1
  23. package/dist/console/ai/AiChatPage.js +743 -66
  24. package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
  25. package/dist/console/ai/ConversationsSidebar.js +149 -34
  26. package/dist/console/ai/LiveCanvas.d.ts +22 -0
  27. package/dist/console/ai/LiveCanvas.js +78 -0
  28. package/dist/console/ai/reconcileTurn.d.ts +8 -0
  29. package/dist/console/ai/reconcileTurn.js +20 -0
  30. package/dist/console/auth/AuthPageLayout.d.ts +1 -1
  31. package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
  32. package/dist/console/auth/LoginPage.d.ts +1 -1
  33. package/dist/console/auth/RegisterPage.d.ts +1 -1
  34. package/dist/console/auth/RegisterPage.js +23 -3
  35. package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
  36. package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
  37. package/dist/console/home/AppCard.d.ts +1 -1
  38. package/dist/console/home/AppCard.js +6 -12
  39. package/dist/console/home/HomeAppsStrip.d.ts +8 -0
  40. package/dist/console/home/HomeAppsStrip.js +61 -0
  41. package/dist/console/home/HomeLayout.d.ts +1 -1
  42. package/dist/console/home/HomeLayout.js +3 -1
  43. package/dist/console/home/HomePage.d.ts +1 -2
  44. package/dist/console/home/HomePage.js +149 -21
  45. package/dist/console/home/HomeRail.d.ts +22 -0
  46. package/dist/console/home/HomeRail.js +62 -0
  47. package/dist/console/home/QuickActions.d.ts +1 -1
  48. package/dist/console/home/QuickActions.js +3 -11
  49. package/dist/console/home/RecentApps.d.ts +1 -1
  50. package/dist/console/home/RecentApps.js +2 -2
  51. package/dist/console/home/StarredApps.d.ts +1 -1
  52. package/dist/console/home/StarredApps.js +2 -2
  53. package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
  54. package/dist/console/marketplace/InstalledListWidget.js +93 -0
  55. package/dist/console/marketplace/MarkdownText.d.ts +1 -1
  56. package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
  57. package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
  58. package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
  59. package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
  60. package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
  61. package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
  62. package/dist/console/marketplace/MarketplacePage.js +60 -3
  63. package/dist/console/marketplace/PackageIcon.d.ts +1 -1
  64. package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
  65. package/dist/console/marketplace/PluginDisclosure.js +38 -0
  66. package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
  67. package/dist/console/marketplace/marketplaceApi.js +254 -1
  68. package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
  69. package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
  70. package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
  71. package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
  72. package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
  73. package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
  74. package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
  75. package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
  76. package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
  77. package/dist/context/CommandPaletteProvider.d.ts +44 -0
  78. package/dist/context/CommandPaletteProvider.js +71 -0
  79. package/dist/context/FavoritesProvider.d.ts +1 -1
  80. package/dist/context/NavigationContext.d.ts +1 -1
  81. package/dist/context/RecentItemsProvider.d.ts +2 -2
  82. package/dist/context/UserStateAdapters.d.ts +1 -1
  83. package/dist/context/index.d.ts +2 -0
  84. package/dist/context/index.js +1 -0
  85. package/dist/hooks/index.d.ts +5 -2
  86. package/dist/hooks/index.js +4 -1
  87. package/dist/hooks/useActionModal.d.ts +53 -0
  88. package/dist/hooks/useActionModal.js +111 -0
  89. package/dist/hooks/useChatConversation.d.ts +107 -4
  90. package/dist/hooks/useChatConversation.js +253 -25
  91. package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
  92. package/dist/hooks/useConsoleActionRuntime.js +560 -0
  93. package/dist/hooks/useConversationList.js +61 -3
  94. package/dist/hooks/useHomeInbox.d.ts +13 -0
  95. package/dist/hooks/useHomeInbox.js +142 -0
  96. package/dist/hooks/useNavPins.js +17 -23
  97. package/dist/hooks/useNavigationSync.d.ts +33 -0
  98. package/dist/hooks/useNavigationSync.js +98 -12
  99. package/dist/hooks/useReconcileOnError.d.ts +40 -0
  100. package/dist/hooks/useReconcileOnError.js +37 -0
  101. package/dist/hooks/useRecordApprovals.d.ts +18 -19
  102. package/dist/hooks/useRecordApprovals.js +24 -40
  103. package/dist/hooks/useResponsiveSidebar.js +14 -5
  104. package/dist/hooks/useSettleSignal.d.ts +19 -0
  105. package/dist/hooks/useSettleSignal.js +20 -0
  106. package/dist/hooks/useTrackRouteAsRecent.js +35 -0
  107. package/dist/hooks/useUrlOverlay.d.ts +62 -0
  108. package/dist/hooks/useUrlOverlay.js +88 -0
  109. package/dist/index.d.ts +16 -7
  110. package/dist/index.js +12 -4
  111. package/dist/layout/ActivityFeed.d.ts +1 -1
  112. package/dist/layout/AppHeader.d.ts +3 -2
  113. package/dist/layout/AppHeader.js +237 -72
  114. package/dist/layout/AppSidebar.d.ts +2 -1
  115. package/dist/layout/AppSidebar.js +26 -46
  116. package/dist/layout/AppSwitcher.d.ts +2 -1
  117. package/dist/layout/AppSwitcher.js +9 -5
  118. package/dist/layout/AuthPageLayout.d.ts +1 -1
  119. package/dist/layout/ConnectionStatus.d.ts +1 -1
  120. package/dist/layout/ConnectionStatus.js +9 -6
  121. package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
  122. package/dist/layout/ConsoleChatbotFab.js +16 -2
  123. package/dist/layout/ConsoleFloatingChatbot.d.ts +32 -2
  124. package/dist/layout/ConsoleFloatingChatbot.js +374 -41
  125. package/dist/layout/ConsoleLayout.d.ts +1 -1
  126. package/dist/layout/ConsoleLayout.js +27 -11
  127. package/dist/layout/ContextSelectors.d.ts +44 -0
  128. package/dist/layout/ContextSelectors.js +218 -0
  129. package/dist/layout/InboxPopover.d.ts +6 -1
  130. package/dist/layout/InboxPopover.js +25 -6
  131. package/dist/layout/LocaleSwitcher.d.ts +1 -1
  132. package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
  133. package/dist/layout/LocalizedSidebarTrigger.js +15 -0
  134. package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
  135. package/dist/layout/ModeToggle.d.ts +1 -1
  136. package/dist/layout/PageHeader.d.ts +1 -1
  137. package/dist/layout/UnifiedSidebar.d.ts +2 -1
  138. package/dist/layout/UnifiedSidebar.js +116 -15
  139. package/dist/observability/index.d.ts +1 -0
  140. package/dist/observability/index.js +1 -0
  141. package/dist/observability/settleSignal.d.ts +64 -0
  142. package/dist/observability/settleSignal.js +131 -0
  143. package/dist/preview/DraftChangesPanel.d.ts +19 -0
  144. package/dist/preview/DraftChangesPanel.js +114 -0
  145. package/dist/preview/DraftPreviewBar.d.ts +8 -0
  146. package/dist/preview/DraftPreviewBar.js +86 -0
  147. package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
  148. package/dist/preview/PreviewDraftEmptyState.js +47 -0
  149. package/dist/preview/PreviewModeContext.d.ts +57 -0
  150. package/dist/preview/PreviewModeContext.js +99 -0
  151. package/dist/preview/UnpublishedAppBar.d.ts +8 -0
  152. package/dist/preview/UnpublishedAppBar.js +79 -0
  153. package/dist/preview/draftStatus.d.ts +20 -0
  154. package/dist/preview/draftStatus.js +27 -0
  155. package/dist/preview/usePublishAllDrafts.d.ts +18 -0
  156. package/dist/preview/usePublishAllDrafts.js +106 -0
  157. package/dist/providers/AdapterProvider.d.ts +1 -1
  158. package/dist/providers/AdapterProvider.js +6 -1
  159. package/dist/providers/ExpressionProvider.d.ts +1 -1
  160. package/dist/providers/MetadataProvider.d.ts +17 -2
  161. package/dist/providers/MetadataProvider.js +183 -12
  162. package/dist/runtime-config.d.ts +46 -2
  163. package/dist/runtime-config.js +39 -2
  164. package/dist/services/builtinComponents.js +68 -59
  165. package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
  166. package/dist/skeletons/SkeletonDetail.d.ts +1 -1
  167. package/dist/skeletons/SkeletonGrid.d.ts +1 -1
  168. package/dist/utils/appRoute.d.ts +21 -0
  169. package/dist/utils/appRoute.js +25 -0
  170. package/dist/utils/deriveRelatedLists.d.ts +54 -0
  171. package/dist/utils/deriveRelatedLists.js +91 -0
  172. package/dist/utils/index.d.ts +4 -0
  173. package/dist/utils/index.js +3 -0
  174. package/dist/utils/managedByEmptyState.d.ts +8 -1
  175. package/dist/utils/managedByEmptyState.js +13 -7
  176. package/dist/utils/preferLocal.d.ts +18 -0
  177. package/dist/utils/preferLocal.js +24 -0
  178. package/dist/views/ActionConfirmDialog.d.ts +1 -1
  179. package/dist/views/ActionConfirmDialog.js +3 -1
  180. package/dist/views/ActionParamDialog.d.ts +6 -1
  181. package/dist/views/ActionParamDialog.js +9 -3
  182. package/dist/views/ActionResultDialog.d.ts +13 -0
  183. package/dist/views/ActionResultDialog.js +134 -0
  184. package/dist/views/ComponentNavView.d.ts +14 -1
  185. package/dist/views/CreateViewDialog.d.ts +1 -1
  186. package/dist/views/DashboardConfigPanel.d.ts +28 -0
  187. package/dist/views/DashboardConfigPanel.js +81 -0
  188. package/dist/views/DashboardView.d.ts +4 -3
  189. package/dist/views/DashboardView.js +38 -239
  190. package/dist/views/FlowRunner.d.ts +59 -0
  191. package/dist/views/FlowRunner.js +153 -0
  192. package/dist/views/InterfaceListPage.d.ts +49 -0
  193. package/dist/views/InterfaceListPage.js +347 -0
  194. package/dist/views/MetadataInspector.d.ts +2 -2
  195. package/dist/views/ObjectView.d.ts +1 -1
  196. package/dist/views/ObjectView.js +209 -532
  197. package/dist/views/PageView.d.ts +8 -3
  198. package/dist/views/PageView.js +45 -32
  199. package/dist/views/RecordDetailView.d.ts +1 -1
  200. package/dist/views/RecordDetailView.js +363 -148
  201. package/dist/views/RecordFormPage.d.ts +1 -1
  202. package/dist/views/RecordFormPage.js +26 -1
  203. package/dist/views/ReportConfigPanel.d.ts +37 -0
  204. package/dist/views/ReportConfigPanel.js +85 -0
  205. package/dist/views/ReportView.d.ts +1 -1
  206. package/dist/views/ReportView.js +116 -7
  207. package/dist/views/RuntimeDraftBar.d.ts +30 -0
  208. package/dist/views/RuntimeDraftBar.js +112 -0
  209. package/dist/views/SearchResultsPage.d.ts +1 -1
  210. package/dist/views/SearchResultsPage.js +8 -18
  211. package/dist/views/ViewConfigPanel.d.ts +24 -17
  212. package/dist/views/ViewConfigPanel.js +121 -77
  213. package/dist/views/index.d.ts +1 -1
  214. package/dist/views/index.js +1 -1
  215. package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
  216. package/dist/views/metadata-admin/AuditPanel.js +79 -0
  217. package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
  218. package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
  219. package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
  220. package/dist/views/metadata-admin/DirectoryPage.js +113 -24
  221. package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
  222. package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
  223. package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
  224. package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
  225. package/dist/views/metadata-admin/JsonSourceEditor.d.ts +37 -0
  226. package/dist/views/metadata-admin/JsonSourceEditor.js +178 -0
  227. package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
  228. package/dist/views/metadata-admin/LayeredDiff.js +171 -5
  229. package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
  230. package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
  231. package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
  232. package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
  233. package/dist/views/metadata-admin/PackagesPage.js +395 -0
  234. package/dist/views/metadata-admin/PageShell.d.ts +1 -1
  235. package/dist/views/metadata-admin/PageShell.js +9 -4
  236. package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
  237. package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
  238. package/dist/views/metadata-admin/QuickFind.js +6 -3
  239. package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
  240. package/dist/views/metadata-admin/RelatedPanel.js +20 -18
  241. package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
  242. package/dist/views/metadata-admin/ResourceEditPage.js +1223 -60
  243. package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
  244. package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
  245. package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
  246. package/dist/views/metadata-admin/ResourceListPage.js +266 -30
  247. package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
  248. package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
  249. package/dist/views/metadata-admin/SchemaForm.js +559 -49
  250. package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
  251. package/dist/views/metadata-admin/StudioHomePage.js +213 -0
  252. package/dist/views/metadata-admin/anchors.js +237 -24
  253. package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
  254. package/dist/views/metadata-admin/clientValidation.js +169 -0
  255. package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
  256. package/dist/views/metadata-admin/color-variant-field.js +38 -0
  257. package/dist/views/metadata-admin/createDerive.d.ts +75 -0
  258. package/dist/views/metadata-admin/createDerive.js +179 -0
  259. package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
  260. package/dist/views/metadata-admin/dashboard-schema.js +80 -0
  261. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
  262. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
  263. package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
  264. package/dist/views/metadata-admin/datasource/register.js +24 -0
  265. package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
  266. package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
  267. package/dist/views/metadata-admin/default-schemas.js +115 -10
  268. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
  269. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
  270. package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
  271. package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
  272. package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
  273. package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
  274. package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
  275. package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
  276. package/dist/views/metadata-admin/external/api.d.ts +100 -0
  277. package/dist/views/metadata-admin/external/api.js +124 -0
  278. package/dist/views/metadata-admin/i18n.d.ts +1 -0
  279. package/dist/views/metadata-admin/i18n.js +1166 -2
  280. package/dist/views/metadata-admin/index.d.ts +8 -5
  281. package/dist/views/metadata-admin/index.js +12 -2
  282. package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
  283. package/dist/views/metadata-admin/inspector-registry.js +11 -0
  284. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
  285. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
  286. package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
  287. package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
  288. package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
  289. package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
  290. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
  291. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
  292. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
  293. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
  294. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
  295. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +107 -0
  296. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
  297. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +45 -0
  298. package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
  299. package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
  300. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
  301. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
  302. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
  303. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
  304. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
  305. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +140 -0
  306. package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
  307. package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
  308. package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
  309. package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
  310. package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
  311. package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
  312. package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
  313. package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
  314. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
  315. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +54 -0
  316. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
  317. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +330 -0
  318. package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
  319. package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
  320. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
  321. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +160 -0
  322. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
  323. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
  324. package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
  325. package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
  326. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
  327. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
  328. package/dist/views/metadata-admin/inspectors/_shared.d.ts +124 -0
  329. package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
  330. package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
  331. package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
  332. package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
  333. package/dist/views/metadata-admin/inspectors/flow-node-config.js +461 -0
  334. package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
  335. package/dist/views/metadata-admin/inspectors/index.js +45 -0
  336. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
  337. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
  338. package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
  339. package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
  340. package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
  341. package/dist/views/metadata-admin/mergeServerFields.js +56 -0
  342. package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
  343. package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
  344. package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
  345. package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
  346. package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
  347. package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
  348. package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
  349. package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
  350. package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
  351. package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
  352. package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
  353. package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
  354. package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
  355. package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
  356. package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
  357. package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
  358. package/dist/views/metadata-admin/previews/DatasetPreview.js +89 -0
  359. package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
  360. package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
  361. package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
  362. package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
  363. package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
  364. package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
  365. package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
  366. package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +43 -0
  367. package/dist/views/metadata-admin/previews/FlowCanvas.js +328 -0
  368. package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
  369. package/dist/views/metadata-admin/previews/FlowPreview.js +92 -0
  370. package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
  371. package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
  372. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
  373. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +170 -0
  374. package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
  375. package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
  376. package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
  377. package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
  378. package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
  379. package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
  380. package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
  381. package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
  382. package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
  383. package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
  384. package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
  385. package/dist/views/metadata-admin/previews/PagePreview.js +90 -4
  386. package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
  387. package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
  388. package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
  389. package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
  390. package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
  391. package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
  392. package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
  393. package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
  394. package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
  395. package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
  396. package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
  397. package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
  398. package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
  399. package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
  400. package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
  401. package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
  402. package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
  403. package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
  404. package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
  405. package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
  406. package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
  407. package/dist/views/metadata-admin/previews/block-config.js +324 -0
  408. package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
  409. package/dist/views/metadata-admin/previews/block-types.js +110 -0
  410. package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
  411. package/dist/views/metadata-admin/previews/field-types.js +97 -0
  412. package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +88 -0
  413. package/dist/views/metadata-admin/previews/flow-canvas-layout.js +190 -0
  414. package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +88 -0
  415. package/dist/views/metadata-admin/previews/flow-canvas-parts.js +358 -0
  416. package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
  417. package/dist/views/metadata-admin/previews/form-preview.js +29 -0
  418. package/dist/views/metadata-admin/previews/index.js +43 -0
  419. package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
  420. package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
  421. package/dist/views/metadata-admin/previews/object-fields-io.d.ts +109 -0
  422. package/dist/views/metadata-admin/previews/object-fields-io.js +208 -0
  423. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +91 -0
  424. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
  425. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +8 -0
  426. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +113 -0
  427. package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +44 -0
  428. package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +316 -0
  429. package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
  430. package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
  431. package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
  432. package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
  433. package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
  434. package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
  435. package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
  436. package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
  437. package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
  438. package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
  439. package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
  440. package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
  441. package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
  442. package/dist/views/metadata-admin/previews/widget-types.js +40 -0
  443. package/dist/views/metadata-admin/registry.d.ts +140 -19
  444. package/dist/views/metadata-admin/report-schema.d.ts +26 -0
  445. package/dist/views/metadata-admin/report-schema.js +121 -0
  446. package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
  447. package/dist/views/metadata-admin/useMetadata.js +155 -4
  448. package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
  449. package/dist/views/metadata-admin/view-item-normalize.js +68 -0
  450. package/dist/views/metadata-admin/view-schema.d.ts +16 -0
  451. package/dist/views/metadata-admin/view-schema.js +107 -0
  452. package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
  453. package/dist/views/metadata-admin/view-variant-model.js +64 -0
  454. package/dist/views/metadata-admin/widgets.d.ts +89 -1
  455. package/dist/views/metadata-admin/widgets.js +491 -17
  456. package/dist/views/runtime-metadata-persistence.d.ts +78 -0
  457. package/dist/views/runtime-metadata-persistence.js +89 -0
  458. package/dist/views/useOpenRecordList.d.ts +18 -0
  459. package/dist/views/useOpenRecordList.js +36 -0
  460. package/dist/views/userFilterUrlState.d.ts +15 -0
  461. package/dist/views/userFilterUrlState.js +53 -0
  462. package/dist/views/view-config-adapter.d.ts +38 -0
  463. package/dist/views/view-config-adapter.js +80 -0
  464. package/package.json +52 -34
  465. package/dist/views/DesignDrawer.d.ts +0 -28
  466. package/dist/views/DesignDrawer.js +0 -51
  467. package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
  468. package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
@@ -12,24 +12,27 @@
12
12
  * registerMetadataResource({ type: 'view', EditPage: MyViewEditor });
13
13
  */
14
14
  export { MetadataDirectoryPage } from './DirectoryPage';
15
+ export { PackagesPage } from './PackagesPage';
16
+ export { StudioHomePage } from './StudioHomePage';
15
17
  export { MetadataResourceRouter } from './ResourceRouter';
16
18
  export { MetadataResourceListPage } from './ResourceListPage';
17
19
  export { MetadataResourceEditPage } from './ResourceEditPage';
18
20
  export { RelatedPanel } from './RelatedPanel';
19
21
  export { MetadataDetailDrawer } from './MetadataDetailDrawer';
20
22
  export { MetadataResourceHistoryPage } from './ResourceHistoryPage';
23
+ export { MetadataDiagnosticsPage } from './DiagnosticsPage';
21
24
  export { MetadataQuickFind } from './QuickFind';
22
25
  export { PageShell as MetadataPageShell } from './PageShell';
23
26
  export { SchemaForm } from './SchemaForm';
24
27
  export { LayeredDiff } from './LayeredDiff';
25
28
  export { PermissionMatrixEditPage } from './PermissionMatrixEditor';
26
- export { DesignerEditorWrapper, DesignerEditorBody } from './DesignerEditorWrapper';
27
- export type { DesignerEditorWrapperProps } from './DesignerEditorWrapper';
28
29
  export { translateMetadataType, translateMetadataDomain, t as translateMetadataAdmin, detectLocale, } from './i18n';
29
30
  export type { SupportedLocale } from './i18n';
30
31
  export { registerMetadataResource, getMetadataResource, listMetadataResources, listAnchorsFor, resolveResourceConfig, anchorByField, } from './registry';
31
32
  export type { MetadataResourceConfig, MetadataDomain, MetadataAnchor, } from './registry';
32
33
  export { registerMetadataPreview, getMetadataPreview, listMetadataPreviewTypes, } from './preview-registry';
33
- export type { MetadataPreview, MetadataPreviewProps } from './preview-registry';
34
- export { useMetadataClient, useMetadataTypes, useTypesIndex, matchesQuery, } from './useMetadata';
35
- export type { RichMetadataTypeEntry } from './useMetadata';
34
+ export type { MetadataPreview, MetadataPreviewProps, MetadataSelection, } from './preview-registry';
35
+ export { registerMetadataInspector, getMetadataInspector, listMetadataInspectorTypes, } from './inspector-registry';
36
+ export type { MetadataInspector, MetadataInspectorProps, } from './inspector-registry';
37
+ export { useMetadataClient, useMetadataTypes, useTypesIndex, useGlobalDiagnostics, matchesQuery, } from './useMetadata';
38
+ export type { RichMetadataTypeEntry, MetadataDiagnosticsEntry, MetadataDiagnosticsSummary, } from './useMetadata';
@@ -13,18 +13,20 @@
13
13
  * registerMetadataResource({ type: 'view', EditPage: MyViewEditor });
14
14
  */
15
15
  export { MetadataDirectoryPage } from './DirectoryPage';
16
+ export { PackagesPage } from './PackagesPage';
17
+ export { StudioHomePage } from './StudioHomePage';
16
18
  export { MetadataResourceRouter } from './ResourceRouter';
17
19
  export { MetadataResourceListPage } from './ResourceListPage';
18
20
  export { MetadataResourceEditPage } from './ResourceEditPage';
19
21
  export { RelatedPanel } from './RelatedPanel';
20
22
  export { MetadataDetailDrawer } from './MetadataDetailDrawer';
21
23
  export { MetadataResourceHistoryPage } from './ResourceHistoryPage';
24
+ export { MetadataDiagnosticsPage } from './DiagnosticsPage';
22
25
  export { MetadataQuickFind } from './QuickFind';
23
26
  export { PageShell as MetadataPageShell } from './PageShell';
24
27
  export { SchemaForm } from './SchemaForm';
25
28
  export { LayeredDiff } from './LayeredDiff';
26
29
  export { PermissionMatrixEditPage } from './PermissionMatrixEditor';
27
- export { DesignerEditorWrapper, DesignerEditorBody } from './DesignerEditorWrapper';
28
30
  export { translateMetadataType, translateMetadataDomain, t as translateMetadataAdmin, detectLocale, } from './i18n';
29
31
  export { registerMetadataResource, getMetadataResource, listMetadataResources, listAnchorsFor, resolveResourceConfig, anchorByField, } from './registry';
30
32
  // Side-effect: register the built-in anchor relationships so the Related
@@ -36,10 +38,18 @@ registerBuiltinAnchors();
36
38
  // until the framework wires Zod→JSONSchema generation into /meta/types.
37
39
  import { registerDefaultMetadataSchemas } from './default-schemas';
38
40
  registerDefaultMetadataSchemas();
41
+ import { registerDatasourceResource } from './datasource/register';
42
+ registerDatasourceResource();
39
43
  // Side-effect: register built-in Preview-tab renderers (page, view,
40
44
  // dashboard, report, app, object, email_template). Plugins can add or
41
45
  // override entries via `registerMetadataPreview()`.
42
46
  import { registerBuiltinPreviews } from './previews';
43
47
  registerBuiltinPreviews();
48
+ // Side-effect: register built-in scoped inspectors (dashboard widget,
49
+ // …). Plugins can add or override entries via
50
+ // `registerMetadataInspector()`.
51
+ import { registerBuiltinInspectors } from './inspectors';
52
+ registerBuiltinInspectors();
44
53
  export { registerMetadataPreview, getMetadataPreview, listMetadataPreviewTypes, } from './preview-registry';
45
- export { useMetadataClient, useMetadataTypes, useTypesIndex, matchesQuery, } from './useMetadata';
54
+ export { registerMetadataInspector, getMetadataInspector, listMetadataInspectorTypes, } from './inspector-registry';
55
+ export { useMetadataClient, useMetadataTypes, useTypesIndex, useGlobalDiagnostics, matchesQuery, } from './useMetadata';
@@ -0,0 +1,51 @@
1
+ /**
2
+ * MetadataInspectorRegistry — per-type "scoped sub-form" renderers.
3
+ *
4
+ * The inspector is the right-side property panel of the split editor.
5
+ * By default, the inspector renders the generic `SchemaForm` bound to
6
+ * the entire draft. When a type registers an inspector here AND the
7
+ * preview emits a {@link MetadataSelection}, the host swaps the
8
+ * generic form for the registered component so the user edits the
9
+ * *selected sub-element* (e.g. one dashboard widget) instead of the
10
+ * top-level metadata.
11
+ *
12
+ * Clearing the selection (Esc key, click background) drops back to
13
+ * the generic form automatically.
14
+ *
15
+ * Example:
16
+ *
17
+ * registerMetadataInspector('dashboard', DashboardWidgetInspector);
18
+ * // → preview emits onSelectionChange({kind:'widget', id:'kpi_1'})
19
+ * // → host renders <DashboardWidgetInspector ... /> on the right
20
+ */
21
+ import type { ComponentType } from 'react';
22
+ import type { MetadataSelection } from './preview-registry';
23
+ import type { SupportedLocale } from './i18n';
24
+ export interface MetadataInspectorProps {
25
+ /** Metadata type, e.g. 'dashboard'. */
26
+ type: string;
27
+ /** Item primary-key name (may be empty in create mode). */
28
+ name: string;
29
+ /** Current draft from the editor. Treat as immutable. */
30
+ draft: Record<string, unknown>;
31
+ /** The selection emitted by the matching preview. Never null here. */
32
+ selection: MetadataSelection;
33
+ /** Apply a shallow patch to the draft. */
34
+ onPatch: (patch: Record<string, unknown>) => void;
35
+ /** Clear the selection (returns the inspector to the top-level form). */
36
+ onClearSelection: () => void;
37
+ /**
38
+ * Replace the current selection. Used by reorder buttons to follow
39
+ * the moved item to its new index, and by other inspector affordances
40
+ * that need to redirect the focused sub-element.
41
+ */
42
+ onSelectionChange?: (next: MetadataSelection | null) => void;
43
+ /** Whether the host is in edit mode. False → disable inputs. */
44
+ readOnly: boolean;
45
+ /** Active UI locale for i18n. */
46
+ locale: SupportedLocale;
47
+ }
48
+ export type MetadataInspector = ComponentType<MetadataInspectorProps>;
49
+ export declare function registerMetadataInspector(type: string, component: MetadataInspector): void;
50
+ export declare function getMetadataInspector(type: string): MetadataInspector | undefined;
51
+ export declare function listMetadataInspectorTypes(): string[];
@@ -0,0 +1,11 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ const REGISTRY = new Map();
3
+ export function registerMetadataInspector(type, component) {
4
+ REGISTRY.set(type, component);
5
+ }
6
+ export function getMetadataInspector(type) {
7
+ return REGISTRY.get(type);
8
+ }
9
+ export function listMetadataInspectorTypes() {
10
+ return Array.from(REGISTRY.keys()).sort();
11
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * ActionDefaultInspector — type-aware authoring panel for an Action.
3
+ *
4
+ * Replaces the flat, everything-at-once SchemaForm for `action` with a
5
+ * progressively-disclosed editor organised around how an action is actually
6
+ * designed (mirroring Salesforce Quick Actions / ServiceNow UI Actions):
7
+ *
8
+ * 1. Basics — label / name / object scope / icon / variant
9
+ * 2. Behavior — type-FIRST, then only the fields that `type` needs
10
+ * (script → body editor; api → method + endpoint;
11
+ * url/flow/modal/form → a single target binding)
12
+ * 3. Inputs — the params dialog the user fills before it runs
13
+ * (field-backed picks reuse the object's field metadata)
14
+ * 4. Placement — where the button surfaces + object-vs-global scope hint
15
+ * 5. Feedback — confirm / success / error / refresh / undo / mode
16
+ * 6. Conditions — visible / disabled CEL predicates
17
+ * 7. AI exposure — opt-in tool exposure (ADR-0011)
18
+ *
19
+ * Rare/advanced props (resultDialog, bodyExtra, recordId mapping, new-tab,
20
+ * timeout, aria, …) are NOT hand-curated here — they fall through to a
21
+ * collapsed "More fields" SchemaForm fed the live server schema, with the
22
+ * curated keys hidden so nothing is double-edited and nothing is lost.
23
+ *
24
+ * AI exposure uses the flattened `aiExposed` / `aiDescription` keys (the
25
+ * objectui/server convention that ActionPreview reads), not the nested `ai`
26
+ * block, so the curated control and the runtime/preview agree.
27
+ */
28
+ import * as React from 'react';
29
+ import type { MetadataDefaultInspectorProps } from '../default-inspector-registry';
30
+ export declare function ActionDefaultInspector({ draft, onPatch, readOnly, locale, serverSchema, }: MetadataDefaultInspectorProps): React.JSX.Element;
@@ -0,0 +1,180 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
3
+ /**
4
+ * ActionDefaultInspector — type-aware authoring panel for an Action.
5
+ *
6
+ * Replaces the flat, everything-at-once SchemaForm for `action` with a
7
+ * progressively-disclosed editor organised around how an action is actually
8
+ * designed (mirroring Salesforce Quick Actions / ServiceNow UI Actions):
9
+ *
10
+ * 1. Basics — label / name / object scope / icon / variant
11
+ * 2. Behavior — type-FIRST, then only the fields that `type` needs
12
+ * (script → body editor; api → method + endpoint;
13
+ * url/flow/modal/form → a single target binding)
14
+ * 3. Inputs — the params dialog the user fills before it runs
15
+ * (field-backed picks reuse the object's field metadata)
16
+ * 4. Placement — where the button surfaces + object-vs-global scope hint
17
+ * 5. Feedback — confirm / success / error / refresh / undo / mode
18
+ * 6. Conditions — visible / disabled CEL predicates
19
+ * 7. AI exposure — opt-in tool exposure (ADR-0011)
20
+ *
21
+ * Rare/advanced props (resultDialog, bodyExtra, recordId mapping, new-tab,
22
+ * timeout, aria, …) are NOT hand-curated here — they fall through to a
23
+ * collapsed "More fields" SchemaForm fed the live server schema, with the
24
+ * curated keys hidden so nothing is double-edited and nothing is lost.
25
+ *
26
+ * AI exposure uses the flattened `aiExposed` / `aiDescription` keys (the
27
+ * objectui/server convention that ActionPreview reads), not the nested `ai`
28
+ * block, so the curated control and the runtime/preview agree.
29
+ */
30
+ import * as React from 'react';
31
+ import { Plus, Trash2 } from 'lucide-react';
32
+ import { Button, Label, Textarea, } from '@object-ui/components';
33
+ import { SchemaForm } from '../SchemaForm';
34
+ import { t } from '../i18n';
35
+ import { InspectorShell, InspectorTextField, InspectorSelectField, InspectorCheckboxField, appendArray, moveArray, spliceArray, } from './_shared';
36
+ import { useObjectOptions } from '../previews/useObjectOptions';
37
+ import { useObjectFields } from '../previews/useObjectFields';
38
+ import { useMetaOptions } from '../previews/useMetaOptions';
39
+ import { ConditionBuilder } from './ConditionBuilder';
40
+ import { IconPickerWidget } from '../widgets';
41
+ /* ─────────────── constants ─────────────── */
42
+ const ACTION_TYPES = [
43
+ { value: 'script', label: 'Script — run an expression / sandboxed JS' },
44
+ { value: 'api', label: 'API — call an endpoint' },
45
+ { value: 'flow', label: 'Flow — invoke a flow' },
46
+ { value: 'modal', label: 'Modal — open a modal/page' },
47
+ { value: 'form', label: 'Form — open a FormView' },
48
+ { value: 'url', label: 'URL — navigate to a link' },
49
+ ];
50
+ const VARIANT_OPTS = [
51
+ { value: 'primary', label: 'Primary' },
52
+ { value: 'secondary', label: 'Secondary' },
53
+ { value: 'danger', label: 'Danger' },
54
+ { value: 'ghost', label: 'Ghost' },
55
+ { value: 'link', label: 'Link' },
56
+ ];
57
+ const COMPONENT_OPTS = [
58
+ { value: 'action:button', label: 'Button' },
59
+ { value: 'action:icon', label: 'Icon only' },
60
+ { value: 'action:menu', label: 'Menu item' },
61
+ { value: 'action:group', label: 'Button group' },
62
+ ];
63
+ const MODE_OPTS = [
64
+ { value: 'create', label: 'Create' },
65
+ { value: 'edit', label: 'Edit' },
66
+ { value: 'delete', label: 'Delete' },
67
+ { value: 'custom', label: 'Custom' },
68
+ ];
69
+ const METHOD_OPTS = [
70
+ { value: 'POST', label: 'POST' },
71
+ { value: 'PATCH', label: 'PATCH' },
72
+ { value: 'PUT', label: 'PUT' },
73
+ { value: 'DELETE', label: 'DELETE' },
74
+ ];
75
+ const BODY_LANG_OPTS = [
76
+ { value: 'expression', label: 'Expression (L1)' },
77
+ { value: 'js', label: 'Sandboxed JS (L2)' },
78
+ ];
79
+ const PARAM_TYPE_OPTS = [
80
+ { value: 'text', label: 'Text' },
81
+ { value: 'textarea', label: 'Long text' },
82
+ { value: 'number', label: 'Number' },
83
+ { value: 'boolean', label: 'Checkbox' },
84
+ { value: 'select', label: 'Select' },
85
+ { value: 'date', label: 'Date' },
86
+ { value: 'datetime', label: 'Date/time' },
87
+ { value: 'lookup', label: 'Lookup' },
88
+ ];
89
+ /** Canonical action locations (mirrors spec ACTION_LOCATIONS) with friendly labels. */
90
+ const LOCATIONS = [
91
+ { value: 'record_header', label: 'Record header' },
92
+ { value: 'record_more', label: 'Record · more menu' },
93
+ { value: 'record_section', label: 'Record · section' },
94
+ { value: 'record_related', label: 'Record · related list' },
95
+ { value: 'list_toolbar', label: 'List toolbar' },
96
+ { value: 'list_item', label: 'List · row' },
97
+ { value: 'global_nav', label: 'Global nav / command palette' },
98
+ ];
99
+ /** Per-type binding hints for the single `target` field. */
100
+ const TARGET_FIELD = {
101
+ url: { label: 'URL', placeholder: 'https://… or /path?x=${param.x}', hint: 'Supports ${param.x} and ${ctx.x} interpolation.' },
102
+ flow: { label: 'Flow name', placeholder: 'snake_case flow', hint: 'The flow to invoke when clicked.' },
103
+ modal: { label: 'Modal / page name', placeholder: 'snake_case page', hint: 'The modal or page to open.' },
104
+ form: { label: 'Form view name', placeholder: 'object.viewKey', hint: 'Opens /console/forms/<name>.' },
105
+ api: { label: 'API endpoint', placeholder: '/api/v1/…', hint: 'Endpoint called with the request body below.' },
106
+ };
107
+ /** Action types whose `target` names another metadata record — render a picker
108
+ * of real names instead of free text (flow → flow, modal → page, form → view). */
109
+ const TARGET_META_TYPE = { flow: 'flow', modal: 'page', form: 'view' };
110
+ /** Target binding: a reference picker for flow/modal/form (names come from the
111
+ * matching metadata type), else a free-text input (url/api). An out-of-catalog
112
+ * value is preserved as a synthesized option so it is never silently dropped. */
113
+ function ActionTargetField({ type, value, onCommit, cfg, readOnly }) {
114
+ const metaType = TARGET_META_TYPE[type] ?? null;
115
+ const { options } = useMetaOptions(metaType);
116
+ const usePicker = !!metaType && options.length > 0;
117
+ const opts = usePicker && value && !options.some((o) => o.value === value)
118
+ ? [{ value, label: `${value} (not found)` }, ...options]
119
+ : options;
120
+ return (_jsxs("div", { className: "space-y-1", children: [usePicker ? (_jsx(InspectorSelectField, { label: `${cfg.label} *`, value: value || undefined, options: opts, onCommit: onCommit, disabled: readOnly })) : (_jsx(InspectorTextField, { label: `${cfg.label} *`, value: value, onCommit: onCommit, placeholder: cfg.placeholder, disabled: readOnly, mono: true })), _jsx("div", { className: "text-[11px] text-muted-foreground/70", children: cfg.hint })] }));
121
+ }
122
+ /** Keys this inspector edits with its own controls — hidden from the fallback. */
123
+ const CURATED_FIELDS = [
124
+ 'name', 'label', 'objectName', 'icon', 'variant', 'component',
125
+ 'type', 'target', 'execute', 'body', 'method',
126
+ 'params', 'locations', 'bulkEnabled',
127
+ 'confirmText', 'successMessage', 'errorMessage', 'refreshAfter', 'undoable', 'mode', 'shortcut',
128
+ 'visible', 'disabled', 'aiExposed', 'aiDescription',
129
+ ];
130
+ /* ─────────────── small helpers ─────────────── */
131
+ function SectionHeader({ title, hint }) {
132
+ return (_jsxs("div", { className: "space-y-0.5", children: [_jsx("div", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: title }), hint && _jsx("div", { className: "text-[11px] text-muted-foreground/70", children: hint })] }));
133
+ }
134
+ function localize(v) {
135
+ if (v == null)
136
+ return '';
137
+ if (typeof v === 'string')
138
+ return v;
139
+ if (typeof v === 'object') {
140
+ const o = v;
141
+ return o.en ?? o['en-US'] ?? Object.values(o)[0] ?? '';
142
+ }
143
+ return String(v);
144
+ }
145
+ /** Object dropdown (falls back to free text when no objects are resolvable). */
146
+ function ObjectPicker({ label, value, onCommit, disabled, hint }) {
147
+ const { options } = useObjectOptions();
148
+ return (_jsxs("div", { className: "space-y-1", children: [options.length === 0 ? (_jsx(InspectorTextField, { label: label, value: value ?? '', placeholder: "snake_case object", onCommit: onCommit, disabled: disabled, mono: true })) : (_jsx(InspectorSelectField, { label: label, value: value || undefined, options: [{ value: '', label: '— None (global) —' }, ...options], onCommit: onCommit, disabled: disabled })), hint && _jsx("div", { className: "text-[11px] text-muted-foreground/70", children: hint })] }));
149
+ }
150
+ /** Field dropdown bound to an object (free text when unresolved). */
151
+ function FieldPicker({ label, objectName, value, onCommit, disabled }) {
152
+ const { fields } = useObjectFields(objectName);
153
+ const options = React.useMemo(() => fields.filter((f) => !f.hidden).map((f) => ({ value: f.name, label: f.label && f.label !== f.name ? `${f.label} (${f.name})` : f.name })), [fields]);
154
+ if (!objectName || options.length === 0) {
155
+ return _jsx(InspectorTextField, { label: label, value: value ?? '', onCommit: onCommit, disabled: disabled, mono: true });
156
+ }
157
+ return _jsx(InspectorSelectField, { label: label, value: value || undefined, options: [{ value: '', label: '—' }, ...options], onCommit: onCommit, disabled: disabled });
158
+ }
159
+ /* ─────────────── inspector ─────────────── */
160
+ export function ActionDefaultInspector({ draft, onPatch, readOnly, locale, serverSchema, }) {
161
+ const tr = React.useCallback((key) => t(key, locale), [locale]);
162
+ const str = (k) => (typeof draft[k] === 'string' ? draft[k] : '');
163
+ const type = str('type') || 'script';
164
+ const objectName = str('objectName');
165
+ const body = (draft.body && typeof draft.body === 'object' ? draft.body : {});
166
+ const params = Array.isArray(draft.params) ? draft.params : [];
167
+ const locations = Array.isArray(draft.locations) ? draft.locations : [];
168
+ // AI exposure — flattened keys (objectui/server convention, read by ActionPreview).
169
+ const aiExposed = draft.aiExposed === true;
170
+ const aiDescription = typeof draft.aiDescription === 'string' ? draft.aiDescription : '';
171
+ const patchBody = (p) => onPatch({ body: { ...body, ...p } });
172
+ const patchParam = (i, p) => onPatch({ params: params.map((it, j) => (j === i ? { ...it, ...p } : it)) });
173
+ const toggleLocation = (loc, on) => {
174
+ const next = on ? [...new Set([...locations, loc])] : locations.filter((l) => l !== loc);
175
+ onPatch({ locations: next });
176
+ };
177
+ const targetCfg = TARGET_FIELD[type];
178
+ const fallbackSchema = serverSchema;
179
+ return (_jsxs(InspectorShell, { kindLabel: tr('engine.inspector.action.kind'), title: String(localize(draft.label) || draft.name || tr('engine.inspector.action.kind')), onClose: () => { }, closeLabel: tr('engine.inspector.action.close'), hideClose: true, children: [_jsx(SectionHeader, { title: "Basics" }), _jsx(InspectorTextField, { label: "Label", value: localize(draft.label), onCommit: (v) => onPatch({ label: v }), placeholder: "Button text shown to users", disabled: readOnly }), _jsx(InspectorTextField, { label: "Name", value: str('name'), onCommit: (v) => onPatch({ name: v }), placeholder: "snake_case identifier", disabled: readOnly, mono: true }), _jsx(ObjectPicker, { label: "Object", value: objectName, onCommit: (v) => onPatch({ objectName: v || undefined }), disabled: readOnly, hint: objectName ? 'Bound action — surfaces in this object’s views per the placement below.' : 'Empty = global action — must be referenced by a page’s quick actions, global nav, a flow, or AI to appear.' }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: "Icon" }), _jsx(IconPickerWidget, { schema: { type: 'string' }, value: str('icon'), onChange: (v) => onPatch({ icon: v || undefined }), readOnly: readOnly })] }), _jsx(InspectorSelectField, { label: "Variant", value: str('variant') || undefined, options: VARIANT_OPTS, onCommit: (v) => onPatch({ variant: v }), disabled: readOnly })] }), _jsxs("div", { className: "border-t pt-3 space-y-3", children: [_jsx(SectionHeader, { title: "Behavior", hint: "What happens when the action is triggered." }), _jsx(InspectorSelectField, { label: "Type", value: type, options: ACTION_TYPES, onCommit: (v) => onPatch({ type: v }), disabled: readOnly }), type === 'script' ? (_jsxs(_Fragment, { children: [_jsx(InspectorSelectField, { label: "Script language", value: (typeof body.language === 'string' ? body.language : undefined) || 'expression', options: BODY_LANG_OPTS, onCommit: (v) => patchBody({ language: v }), disabled: readOnly }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: "Script body" }), _jsx(Textarea, { value: typeof body.source === 'string' ? body.source : '', onChange: (e) => patchBody({ source: e.target.value }), disabled: readOnly, spellCheck: false, rows: 5, placeholder: '// (input, ctx) => result\nreturn { ok: true }', className: "text-xs font-mono" }), _jsxs("div", { className: "text-[11px] text-muted-foreground/70", children: ["Runs in the sandbox as ", _jsx("code", { children: "(input, ctx) => Promise<output>" }), "."] })] })] })) : (_jsxs(_Fragment, { children: [type === 'api' && (_jsx(InspectorSelectField, { label: "Method", value: str('method') || 'POST', options: METHOD_OPTS, onCommit: (v) => onPatch({ method: v }), disabled: readOnly })), targetCfg && (_jsx(ActionTargetField, { type: type, value: str('target'), onCommit: (v) => onPatch({ target: v }), cfg: targetCfg, readOnly: readOnly }))] }))] }), _jsxs("div", { className: "border-t pt-3 space-y-2", children: [_jsx(SectionHeader, { title: "Inputs", hint: "Collected from the user in a dialog before the action runs." }), params.length === 0 ? (_jsx("p", { className: "rounded-md border border-dashed bg-muted/30 px-3 py-2.5 text-center text-[11px] text-muted-foreground", children: "No inputs \u2014 the action runs immediately on click." })) : (params.map((p, i) => (_jsxs("div", { className: "space-y-2 rounded-md border border-border p-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("span", { className: "text-[11px] text-muted-foreground", children: ["#", i + 1] }), _jsxs("div", { className: "flex items-center gap-0.5", children: [_jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "h-6 w-6", disabled: readOnly || i === 0, "aria-label": "Move up", onClick: () => onPatch({ params: moveArray(params, i, i - 1) }), children: "\u2191" }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "h-6 w-6", disabled: readOnly || i === params.length - 1, "aria-label": "Move down", onClick: () => onPatch({ params: moveArray(params, i, i + 1) }), children: "\u2193" }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "h-6 w-6", disabled: readOnly, "aria-label": "Remove input", onClick: () => onPatch({ params: spliceArray(params, i, null) }), children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) })] })] }), objectName ? (_jsx(FieldPicker, { label: "Bind to field", objectName: objectName, value: p.field, onCommit: (v) => patchParam(i, { field: v || undefined }), disabled: readOnly })) : null, !p.field && (_jsx(InspectorTextField, { label: "Name", value: p.name ?? '', onCommit: (v) => patchParam(i, { name: v }), placeholder: "request-body key", disabled: readOnly, mono: true })), _jsx(InspectorTextField, { label: "Label", value: localize(p.label), onCommit: (v) => patchParam(i, { label: v }), disabled: readOnly }), !p.field && (_jsx(InspectorSelectField, { label: "Type", value: p.type || undefined, options: PARAM_TYPE_OPTS, onCommit: (v) => patchParam(i, { type: v }), disabled: readOnly })), _jsx(InspectorTextField, { label: "Placeholder", value: p.placeholder ?? '', onCommit: (v) => patchParam(i, { placeholder: v }), disabled: readOnly }), _jsxs("div", { className: "flex flex-wrap gap-x-4 gap-y-1", children: [_jsx(InspectorCheckboxField, { label: "Required", value: !!p.required, onCommit: (v) => patchParam(i, { required: v }), disabled: readOnly }), _jsx(InspectorCheckboxField, { label: "Pre-fill from row", value: !!p.defaultFromRow, onCommit: (v) => patchParam(i, { defaultFromRow: v }), disabled: readOnly })] })] }, i)))), !readOnly && (_jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onPatch({ params: appendArray(params, {}) }), children: [_jsx(Plus, { className: "mr-1 h-3.5 w-3.5" }), " Add input"] }))] }), _jsxs("div", { className: "border-t pt-3 space-y-2", children: [_jsx(SectionHeader, { title: "Placement", hint: "Where this action surfaces in the UI." }), _jsx("div", { className: "grid grid-cols-1 gap-1", children: LOCATIONS.map((loc) => (_jsx(InspectorCheckboxField, { label: loc.label, value: locations.includes(loc.value), onCommit: (v) => toggleLocation(loc.value, v), disabled: readOnly }, loc.value))) }), _jsx("div", { className: "grid grid-cols-2 gap-2 pt-1", children: _jsx(InspectorSelectField, { label: "Component", value: str('component') || undefined, options: COMPONENT_OPTS, onCommit: (v) => onPatch({ component: v }), disabled: readOnly }) }), _jsx(InspectorCheckboxField, { label: "Bulk \u2014 apply to multiple selected rows", value: !!draft.bulkEnabled, onCommit: (v) => onPatch({ bulkEnabled: v }), disabled: readOnly })] }), _jsxs("div", { className: "border-t pt-3 space-y-2", children: [_jsx(SectionHeader, { title: "Feedback", hint: "Confirmation and post-run messaging." }), _jsx(InspectorTextField, { label: "Confirm prompt", value: localize(draft.confirmText), onCommit: (v) => onPatch({ confirmText: v }), placeholder: "Ask before running (leave blank to skip)", disabled: readOnly }), _jsx(InspectorTextField, { label: "Success message", value: localize(draft.successMessage), onCommit: (v) => onPatch({ successMessage: v }), disabled: readOnly }), _jsx(InspectorTextField, { label: "Error message", value: localize(draft.errorMessage), onCommit: (v) => onPatch({ errorMessage: v }), disabled: readOnly }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx(InspectorSelectField, { label: "Mode", value: str('mode') || undefined, options: MODE_OPTS, onCommit: (v) => onPatch({ mode: v }), disabled: readOnly }), _jsx(InspectorTextField, { label: "Shortcut", value: str('shortcut'), onCommit: (v) => onPatch({ shortcut: v }), placeholder: "e.g. Ctrl+S", disabled: readOnly, mono: true })] }), _jsxs("div", { className: "flex flex-wrap gap-x-4 gap-y-1", children: [_jsx(InspectorCheckboxField, { label: "Refresh view after", value: !!draft.refreshAfter, onCommit: (v) => onPatch({ refreshAfter: v }), disabled: readOnly }), _jsx(InspectorCheckboxField, { label: "Offer undo", value: !!draft.undoable, onCommit: (v) => onPatch({ undoable: v }), disabled: readOnly })] })] }), _jsxs("div", { className: "border-t pt-3 space-y-3", children: [_jsx(SectionHeader, { title: "Conditions", hint: "No-code predicates over the record / user / ctx (compiled to CEL)." }), _jsx(ConditionBuilder, { label: "Visible when", value: typeof draft.visible === 'string' ? draft.visible : '', onCommit: (v) => onPatch({ visible: v || undefined }), objectName: objectName, disabled: readOnly }), _jsx(ConditionBuilder, { label: "Disabled when", value: typeof draft.disabled === 'string' ? draft.disabled : '', onCommit: (v) => onPatch({ disabled: v || undefined }), objectName: objectName, disabled: readOnly })] }), _jsxs("div", { className: "border-t pt-3 space-y-2", children: [_jsx(SectionHeader, { title: "AI exposure", hint: "Opt-in: expose this action to AI agents as a callable tool." }), _jsx(InspectorCheckboxField, { label: "Expose to AI agents", value: aiExposed, onCommit: (v) => onPatch({ aiExposed: v }), disabled: readOnly }), aiExposed ? (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: "Tool description (required, \u226540 chars)" }), _jsx(Textarea, { value: aiDescription, onChange: (e) => onPatch({ aiDescription: e.target.value }), disabled: readOnly, rows: 3, placeholder: "When and why an agent should call this action\u2026", className: "text-xs" }), aiDescription.length < 40 && (_jsx("div", { className: "text-[11px] text-destructive", children: "A \u226540-character description is required while exposed." }))] })) : null] }), fallbackSchema && (_jsxs("div", { className: "border-t pt-3 space-y-1.5", children: [_jsx(SectionHeader, { title: tr('engine.inspector.moreFields'), hint: "Advanced / rarely-used properties." }), _jsx(SchemaForm, { schema: fallbackSchema, value: draft, hiddenFields: CURATED_FIELDS, readOnly: readOnly, onChange: (next) => onPatch(next) })] }))] }));
180
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * AppNavInspector — scoped editor for the selected app navigation item.
3
+ *
4
+ * Apps accept nav under several keys (nav / navigation / tabs / items
5
+ * / menu). The preview emits selection id as a dotted path
6
+ * `<rootKey>[i]` for top-level items, `<rootKey>[i].children[j]` for
7
+ * nested. This inspector walks the same path to read/write.
8
+ *
9
+ * For simplicity v1 only edits the leaf node (label / path / icon /
10
+ * kind). Reparenting and re-ordering happen elsewhere (drag handles,
11
+ * the top-level SchemaForm).
12
+ */
13
+ import * as React from 'react';
14
+ import type { MetadataInspectorProps } from '../inspector-registry';
15
+ export declare function AppNavInspector({ selection, draft, onPatch, onClearSelection, onSelectionChange, locale, readOnly }: MetadataInspectorProps): React.JSX.Element;
16
+ export declare const APP_NAV_ROOT_KEYS: string[];
@@ -0,0 +1,110 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { t } from '../i18n';
3
+ import { InspectorShell, InspectorReorderButtons, InspectorTextField, InspectorSelectField, InspectorRemoveButton, InspectorEmptyState, spliceArray, moveArray, } from './_shared';
4
+ const ROOT_KEYS = ['nav', 'navigation', 'tabs', 'items', 'menu'];
5
+ const KINDS = ['object', 'page', 'dashboard', 'report', 'link', 'group'];
6
+ /** Parse "nav[0].children[2]" → [{key:'nav', index:0}, {key:'children', index:2}]. */
7
+ function parsePath(id) {
8
+ const segs = id.split('.');
9
+ const hops = [];
10
+ for (const s of segs) {
11
+ const m = /^([a-zA-Z_]\w*)\[(\d+)\]$/.exec(s);
12
+ if (!m)
13
+ return null;
14
+ hops.push({ key: m[1], index: Number(m[2]) });
15
+ }
16
+ return hops.length > 0 ? hops : null;
17
+ }
18
+ function readAt(draft, hops) {
19
+ let arr = draft[hops[0].key];
20
+ if (!Array.isArray(arr))
21
+ return { parent: [], node: null, index: -1 };
22
+ let node = arr[hops[0].index] ?? null;
23
+ for (let h = 1; h < hops.length; h++) {
24
+ if (!node)
25
+ return { parent: arr, node: null, index: hops[h].index };
26
+ arr = node[hops[h].key];
27
+ if (!Array.isArray(arr))
28
+ return { parent: [], node: null, index: -1 };
29
+ node = arr[hops[h].index] ?? null;
30
+ }
31
+ return { parent: arr, node, index: hops[hops.length - 1].index };
32
+ }
33
+ function writeAt(draft, hops, replacement) {
34
+ // Walk down cloning, then splice at the leaf.
35
+ const rootKey = hops[0].key;
36
+ const root = Array.isArray(draft[rootKey]) ? [...draft[rootKey]] : [];
37
+ if (hops.length === 1) {
38
+ return { [rootKey]: spliceArray(root, hops[0].index, replacement) };
39
+ }
40
+ // Walk + clone.
41
+ let arr = root;
42
+ const stack = [];
43
+ for (let h = 0; h < hops.length - 1; h++) {
44
+ const node = { ...(arr[hops[h].index] ?? {}) };
45
+ stack.push({ arr, index: hops[h].index, node });
46
+ const nextKey = hops[h + 1].key;
47
+ const childArr = Array.isArray(node[nextKey]) ? [...node[nextKey]] : [];
48
+ node[nextKey] = childArr;
49
+ arr[hops[h].index] = node;
50
+ arr = childArr;
51
+ }
52
+ // Splice at leaf:
53
+ const leafSpliced = spliceArray(arr, hops[hops.length - 1].index, replacement);
54
+ // Re-attach.
55
+ stack[stack.length - 1].node[hops[hops.length - 1].key] = leafSpliced;
56
+ return { [rootKey]: root };
57
+ }
58
+ /**
59
+ * Replace the sibling array of the leaf hop with `nextSiblings`.
60
+ * Mirrors `writeAt`'s clone-down strategy but operates on the
61
+ * containing array rather than a single index.
62
+ */
63
+ function writeSiblings(draft, hops, nextSiblings) {
64
+ const rootKey = hops[0].key;
65
+ if (hops.length === 1) {
66
+ return { [rootKey]: nextSiblings };
67
+ }
68
+ const root = Array.isArray(draft[rootKey]) ? [...draft[rootKey]] : [];
69
+ let arr = root;
70
+ for (let h = 0; h < hops.length - 2; h++) {
71
+ const node = { ...(arr[hops[h].index] ?? {}) };
72
+ const nextKey = hops[h + 1].key;
73
+ const childArr = Array.isArray(node[nextKey]) ? [...node[nextKey]] : [];
74
+ node[nextKey] = childArr;
75
+ arr[hops[h].index] = node;
76
+ arr = childArr;
77
+ }
78
+ const parentHop = hops[hops.length - 2];
79
+ const leafKey = hops[hops.length - 1].key;
80
+ const parentCopy = { ...(arr[parentHop.index] ?? {}) };
81
+ parentCopy[leafKey] = nextSiblings;
82
+ arr[parentHop.index] = parentCopy;
83
+ return { [rootKey]: root };
84
+ }
85
+ export function AppNavInspector({ selection, draft, onPatch, onClearSelection, onSelectionChange, locale, readOnly }) {
86
+ const hops = parsePath(selection.id);
87
+ const { node, parent, index } = hops ? readAt(draft, hops) : { node: null, parent: [], index: -1 };
88
+ if (!hops || !node) {
89
+ return (_jsx(InspectorShell, { kindLabel: t('engine.inspector.appNav.kind', locale), title: selection.label ?? selection.id, onClose: onClearSelection, closeLabel: t('engine.inspector.appNav.close', locale), children: _jsx(InspectorEmptyState, { message: selection.id }) }));
90
+ }
91
+ const labelOf = node.label ?? node.title ?? node.name ?? node.path ?? selection.id;
92
+ const path = node.path ?? node.href ?? node.route ?? '';
93
+ const patch = (updates) => {
94
+ onPatch(writeAt(draft, hops, { ...node, ...updates }));
95
+ };
96
+ const remove = () => {
97
+ onPatch(writeAt(draft, hops, null));
98
+ onClearSelection();
99
+ };
100
+ const move = (to) => {
101
+ const next = moveArray(parent, index, to);
102
+ onPatch(writeSiblings(draft, hops, next));
103
+ const prefix = hops.slice(0, -1).map((h) => `${h.key}[${h.index}]`).join('.');
104
+ const leafKey = hops[hops.length - 1].key;
105
+ const newId = prefix ? `${prefix}.${leafKey}[${to}]` : `${leafKey}[${to}]`;
106
+ onSelectionChange?.({ kind: 'nav', id: newId, label: String(labelOf) });
107
+ };
108
+ return (_jsxs(InspectorShell, { kindLabel: t('engine.inspector.appNav.kind', locale), title: String(labelOf), onClose: onClearSelection, closeLabel: t('engine.inspector.appNav.close', locale), headerActions: _jsx(InspectorReorderButtons, { index: index, total: parent.length, onMove: move, upLabel: t('engine.inspector.reorder.up', locale), downLabel: t('engine.inspector.reorder.down', locale), disabled: readOnly }), footer: _jsx(InspectorRemoveButton, { label: t('engine.inspector.appNav.remove', locale), onClick: remove, disabled: readOnly }), children: [_jsx(InspectorTextField, { label: t('engine.inspector.appNav.label', locale), value: String(node.label ?? node.title ?? node.name ?? ''), onCommit: (v) => patch({ label: v }), disabled: readOnly }), _jsx(InspectorTextField, { label: t('engine.inspector.appNav.path', locale), value: String(path), onCommit: (v) => patch({ path: v }), disabled: readOnly, mono: true }), _jsx(InspectorTextField, { label: t('engine.inspector.appNav.icon', locale), value: String(node.icon ?? ''), onCommit: (v) => patch({ icon: v }), disabled: readOnly }), _jsx(InspectorSelectField, { label: t('engine.inspector.appNav.kindField', locale), value: node.kind, options: KINDS.map((v) => ({ value: v, label: v })), onCommit: (v) => patch({ kind: v }), disabled: readOnly })] }));
109
+ }
110
+ export const APP_NAV_ROOT_KEYS = ROOT_KEYS;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * ConditionBuilder — a no-code editor for a CEL predicate (ServiceNow-style),
3
+ * compiling rows of [subject][operator][value] joined by AND/OR into a CEL
4
+ * string emitted via onCommit (empty ⇒ '' ⇒ caller should unset).
5
+ *
6
+ * Stateful by design: rows live in local state so an in-progress row (no
7
+ * subject yet) stays on screen instead of vanishing the moment it compiles to
8
+ * an empty string. The emitted CEL is recomputed from rows on every edit.
9
+ *
10
+ * Safety: on (re)load the builder only adopts an existing expression when it
11
+ * parses AND round-trips byte-for-byte (whitespace-normalised). Anything it
12
+ * can't round-trip cleanly opens in a raw expression textarea, so hand-authored
13
+ * complex CEL is never silently rewritten.
14
+ */
15
+ import * as React from 'react';
16
+ export declare function ConditionBuilder({ label, value, onCommit, objectName, fields: fieldsProp, disabled }: {
17
+ label?: string;
18
+ value: string;
19
+ onCommit: (cel: string) => void;
20
+ objectName?: string;
21
+ /** Pre-fetched field catalog (e.g. from the generic form's widget context);
22
+ * when omitted, fields are loaded from `objectName`. */
23
+ fields?: Array<{
24
+ name: string;
25
+ label?: string;
26
+ hidden?: boolean;
27
+ }>;
28
+ disabled?: boolean;
29
+ }): React.JSX.Element;