@object-ui/app-shell 6.2.3 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/CHANGELOG.md +1229 -0
  2. package/README.md +292 -0
  3. package/dist/assistant/assistantBus.d.ts +72 -0
  4. package/dist/assistant/assistantBus.js +133 -0
  5. package/dist/chrome/CommandPalette.d.ts +1 -1
  6. package/dist/chrome/CommandPalette.js +26 -22
  7. package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
  8. package/dist/chrome/ConsoleToaster.d.ts +1 -1
  9. package/dist/chrome/ConsoleToaster.js +3 -1
  10. package/dist/chrome/ErrorBoundary.d.ts +1 -1
  11. package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
  12. package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
  13. package/dist/chrome/LoadingScreen.d.ts +1 -1
  14. package/dist/chrome/LoadingScreen.js +22 -26
  15. package/dist/chrome/RouteFader.d.ts +1 -1
  16. package/dist/chrome/ThemeProvider.d.ts +1 -1
  17. package/dist/components/ManagedByBadge.d.ts +1 -1
  18. package/dist/console/AppContent.d.ts +1 -1
  19. package/dist/console/AppContent.js +184 -39
  20. package/dist/console/ConsoleShell.d.ts +7 -7
  21. package/dist/console/ConsoleShell.js +32 -3
  22. package/dist/console/ai/AiChatPage.d.ts +88 -1
  23. package/dist/console/ai/AiChatPage.js +747 -66
  24. package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
  25. package/dist/console/ai/ConversationsSidebar.js +149 -34
  26. package/dist/console/ai/LiveCanvas.d.ts +28 -0
  27. package/dist/console/ai/LiveCanvas.js +80 -0
  28. package/dist/console/ai/reconcileTurn.d.ts +8 -0
  29. package/dist/console/ai/reconcileTurn.js +20 -0
  30. package/dist/console/auth/AuthPageLayout.d.ts +1 -1
  31. package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
  32. package/dist/console/auth/LoginPage.d.ts +1 -1
  33. package/dist/console/auth/RegisterPage.d.ts +1 -1
  34. package/dist/console/auth/RegisterPage.js +23 -3
  35. package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
  36. package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
  37. package/dist/console/home/AppCard.d.ts +1 -1
  38. package/dist/console/home/AppCard.js +6 -12
  39. package/dist/console/home/HomeAppsStrip.d.ts +8 -0
  40. package/dist/console/home/HomeAppsStrip.js +61 -0
  41. package/dist/console/home/HomeLayout.d.ts +1 -1
  42. package/dist/console/home/HomeLayout.js +3 -1
  43. package/dist/console/home/HomePage.d.ts +1 -2
  44. package/dist/console/home/HomePage.js +149 -21
  45. package/dist/console/home/HomeRail.d.ts +22 -0
  46. package/dist/console/home/HomeRail.js +62 -0
  47. package/dist/console/home/QuickActions.d.ts +1 -1
  48. package/dist/console/home/QuickActions.js +3 -11
  49. package/dist/console/home/RecentApps.d.ts +1 -1
  50. package/dist/console/home/RecentApps.js +2 -2
  51. package/dist/console/home/StarredApps.d.ts +1 -1
  52. package/dist/console/home/StarredApps.js +2 -2
  53. package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
  54. package/dist/console/marketplace/InstalledListWidget.js +93 -0
  55. package/dist/console/marketplace/MarkdownText.d.ts +1 -1
  56. package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
  57. package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
  58. package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
  59. package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
  60. package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
  61. package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
  62. package/dist/console/marketplace/MarketplacePage.js +60 -3
  63. package/dist/console/marketplace/PackageIcon.d.ts +1 -1
  64. package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
  65. package/dist/console/marketplace/PluginDisclosure.js +38 -0
  66. package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
  67. package/dist/console/marketplace/marketplaceApi.js +254 -1
  68. package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
  69. package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
  70. package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
  71. package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
  72. package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
  73. package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
  74. package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
  75. package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
  76. package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
  77. package/dist/context/CommandPaletteProvider.d.ts +44 -0
  78. package/dist/context/CommandPaletteProvider.js +71 -0
  79. package/dist/context/FavoritesProvider.d.ts +1 -1
  80. package/dist/context/NavigationContext.d.ts +1 -1
  81. package/dist/context/RecentItemsProvider.d.ts +2 -2
  82. package/dist/context/UserStateAdapters.d.ts +1 -1
  83. package/dist/context/index.d.ts +2 -0
  84. package/dist/context/index.js +1 -0
  85. package/dist/hooks/index.d.ts +5 -2
  86. package/dist/hooks/index.js +4 -1
  87. package/dist/hooks/useActionModal.d.ts +53 -0
  88. package/dist/hooks/useActionModal.js +111 -0
  89. package/dist/hooks/useChatConversation.d.ts +137 -4
  90. package/dist/hooks/useChatConversation.js +316 -25
  91. package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
  92. package/dist/hooks/useConsoleActionRuntime.js +564 -0
  93. package/dist/hooks/useConversationList.js +61 -3
  94. package/dist/hooks/useHomeInbox.d.ts +13 -0
  95. package/dist/hooks/useHomeInbox.js +142 -0
  96. package/dist/hooks/useNavPins.js +17 -23
  97. package/dist/hooks/useNavigationSync.d.ts +33 -0
  98. package/dist/hooks/useNavigationSync.js +98 -12
  99. package/dist/hooks/useReconcileOnError.d.ts +40 -0
  100. package/dist/hooks/useReconcileOnError.js +37 -0
  101. package/dist/hooks/useRecordApprovals.d.ts +18 -19
  102. package/dist/hooks/useRecordApprovals.js +24 -40
  103. package/dist/hooks/useResponsiveSidebar.js +14 -5
  104. package/dist/hooks/useSettleSignal.d.ts +19 -0
  105. package/dist/hooks/useSettleSignal.js +20 -0
  106. package/dist/hooks/useTrackRouteAsRecent.js +35 -0
  107. package/dist/hooks/useUrlOverlay.d.ts +62 -0
  108. package/dist/hooks/useUrlOverlay.js +88 -0
  109. package/dist/index.d.ts +18 -8
  110. package/dist/index.js +17 -5
  111. package/dist/layout/ActivityFeed.d.ts +1 -1
  112. package/dist/layout/AppHeader.d.ts +3 -2
  113. package/dist/layout/AppHeader.js +237 -72
  114. package/dist/layout/AppSidebar.d.ts +2 -1
  115. package/dist/layout/AppSidebar.js +26 -46
  116. package/dist/layout/AppSwitcher.d.ts +2 -1
  117. package/dist/layout/AppSwitcher.js +9 -5
  118. package/dist/layout/AuthPageLayout.d.ts +1 -1
  119. package/dist/layout/ConnectionStatus.d.ts +1 -1
  120. package/dist/layout/ConnectionStatus.js +9 -6
  121. package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
  122. package/dist/layout/ConsoleChatbotFab.js +16 -2
  123. package/dist/layout/ConsoleFloatingChatbot.d.ts +34 -2
  124. package/dist/layout/ConsoleFloatingChatbot.js +391 -41
  125. package/dist/layout/ConsoleLayout.d.ts +1 -1
  126. package/dist/layout/ConsoleLayout.js +27 -11
  127. package/dist/layout/ContextSelectors.d.ts +44 -0
  128. package/dist/layout/ContextSelectors.js +242 -0
  129. package/dist/layout/InboxPopover.d.ts +6 -1
  130. package/dist/layout/InboxPopover.js +25 -6
  131. package/dist/layout/LocaleSwitcher.d.ts +1 -1
  132. package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
  133. package/dist/layout/LocalizedSidebarTrigger.js +15 -0
  134. package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
  135. package/dist/layout/ModeToggle.d.ts +1 -1
  136. package/dist/layout/PageHeader.d.ts +1 -1
  137. package/dist/layout/UnifiedSidebar.d.ts +2 -1
  138. package/dist/layout/UnifiedSidebar.js +116 -15
  139. package/dist/layout/agentPicker.d.ts +56 -0
  140. package/dist/layout/agentPicker.js +40 -0
  141. package/dist/observability/index.d.ts +1 -0
  142. package/dist/observability/index.js +1 -0
  143. package/dist/observability/settleSignal.d.ts +64 -0
  144. package/dist/observability/settleSignal.js +131 -0
  145. package/dist/preview/CommitTimeline.d.ts +15 -0
  146. package/dist/preview/CommitTimeline.js +82 -0
  147. package/dist/preview/DraftChangesPanel.d.ts +19 -0
  148. package/dist/preview/DraftChangesPanel.js +114 -0
  149. package/dist/preview/DraftPreviewBar.d.ts +8 -0
  150. package/dist/preview/DraftPreviewBar.js +86 -0
  151. package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
  152. package/dist/preview/PreviewDraftEmptyState.js +47 -0
  153. package/dist/preview/PreviewModeContext.d.ts +57 -0
  154. package/dist/preview/PreviewModeContext.js +99 -0
  155. package/dist/preview/UnpublishedAppBar.d.ts +8 -0
  156. package/dist/preview/UnpublishedAppBar.js +83 -0
  157. package/dist/preview/commitHistory.d.ts +28 -0
  158. package/dist/preview/commitHistory.js +48 -0
  159. package/dist/preview/draftStatus.d.ts +20 -0
  160. package/dist/preview/draftStatus.js +27 -0
  161. package/dist/preview/usePublishAllDrafts.d.ts +18 -0
  162. package/dist/preview/usePublishAllDrafts.js +106 -0
  163. package/dist/providers/AdapterProvider.d.ts +1 -1
  164. package/dist/providers/AdapterProvider.js +6 -1
  165. package/dist/providers/ExpressionProvider.d.ts +1 -1
  166. package/dist/providers/MetadataProvider.d.ts +17 -2
  167. package/dist/providers/MetadataProvider.js +192 -12
  168. package/dist/runtime-config.d.ts +46 -2
  169. package/dist/runtime-config.js +39 -2
  170. package/dist/services/builtinComponents.js +68 -59
  171. package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
  172. package/dist/skeletons/SkeletonDetail.d.ts +1 -1
  173. package/dist/skeletons/SkeletonGrid.d.ts +1 -1
  174. package/dist/utils/appRoute.d.ts +21 -0
  175. package/dist/utils/appRoute.js +25 -0
  176. package/dist/utils/deriveRelatedLists.d.ts +54 -0
  177. package/dist/utils/deriveRelatedLists.js +91 -0
  178. package/dist/utils/index.d.ts +4 -0
  179. package/dist/utils/index.js +3 -0
  180. package/dist/utils/managedByEmptyState.d.ts +8 -1
  181. package/dist/utils/managedByEmptyState.js +13 -7
  182. package/dist/utils/preferLocal.d.ts +18 -0
  183. package/dist/utils/preferLocal.js +24 -0
  184. package/dist/views/ActionConfirmDialog.d.ts +1 -1
  185. package/dist/views/ActionConfirmDialog.js +3 -1
  186. package/dist/views/ActionParamDialog.d.ts +6 -1
  187. package/dist/views/ActionParamDialog.js +9 -3
  188. package/dist/views/ActionResultDialog.d.ts +13 -0
  189. package/dist/views/ActionResultDialog.js +134 -0
  190. package/dist/views/ComponentNavView.d.ts +14 -1
  191. package/dist/views/CreateViewDialog.d.ts +1 -1
  192. package/dist/views/DashboardConfigPanel.d.ts +28 -0
  193. package/dist/views/DashboardConfigPanel.js +81 -0
  194. package/dist/views/DashboardView.d.ts +4 -3
  195. package/dist/views/DashboardView.js +38 -239
  196. package/dist/views/FlowRunner.d.ts +31 -0
  197. package/dist/views/FlowRunner.js +121 -0
  198. package/dist/views/InterfaceListPage.d.ts +49 -0
  199. package/dist/views/InterfaceListPage.js +347 -0
  200. package/dist/views/MetadataInspector.d.ts +2 -2
  201. package/dist/views/ObjectView.d.ts +1 -1
  202. package/dist/views/ObjectView.js +209 -532
  203. package/dist/views/PageView.d.ts +8 -3
  204. package/dist/views/PageView.js +45 -32
  205. package/dist/views/RecordDetailView.d.ts +1 -1
  206. package/dist/views/RecordDetailView.js +363 -148
  207. package/dist/views/RecordFormPage.d.ts +1 -1
  208. package/dist/views/RecordFormPage.js +26 -1
  209. package/dist/views/ReportConfigPanel.d.ts +37 -0
  210. package/dist/views/ReportConfigPanel.js +85 -0
  211. package/dist/views/ReportView.d.ts +1 -1
  212. package/dist/views/ReportView.js +116 -7
  213. package/dist/views/RuntimeDraftBar.d.ts +30 -0
  214. package/dist/views/RuntimeDraftBar.js +112 -0
  215. package/dist/views/ScreenView.d.ts +70 -0
  216. package/dist/views/ScreenView.js +73 -0
  217. package/dist/views/SearchResultsPage.d.ts +1 -1
  218. package/dist/views/SearchResultsPage.js +8 -18
  219. package/dist/views/ViewConfigPanel.d.ts +24 -17
  220. package/dist/views/ViewConfigPanel.js +121 -77
  221. package/dist/views/index.d.ts +1 -1
  222. package/dist/views/index.js +1 -1
  223. package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
  224. package/dist/views/metadata-admin/AuditPanel.js +79 -0
  225. package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
  226. package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
  227. package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
  228. package/dist/views/metadata-admin/DirectoryPage.js +101 -24
  229. package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
  230. package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
  231. package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
  232. package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
  233. package/dist/views/metadata-admin/JsonSourceEditor.d.ts +39 -0
  234. package/dist/views/metadata-admin/JsonSourceEditor.js +196 -0
  235. package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
  236. package/dist/views/metadata-admin/LayeredDiff.js +171 -5
  237. package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
  238. package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
  239. package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
  240. package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
  241. package/dist/views/metadata-admin/PackagesPage.js +403 -0
  242. package/dist/views/metadata-admin/PageShell.d.ts +1 -1
  243. package/dist/views/metadata-admin/PageShell.js +9 -4
  244. package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
  245. package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
  246. package/dist/views/metadata-admin/QuickFind.js +6 -3
  247. package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
  248. package/dist/views/metadata-admin/RelatedPanel.js +20 -18
  249. package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
  250. package/dist/views/metadata-admin/ResourceEditPage.js +1250 -60
  251. package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
  252. package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
  253. package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
  254. package/dist/views/metadata-admin/ResourceListPage.js +258 -30
  255. package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
  256. package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
  257. package/dist/views/metadata-admin/SchemaForm.js +559 -49
  258. package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
  259. package/dist/views/metadata-admin/StudioHomePage.js +205 -0
  260. package/dist/views/metadata-admin/anchors.js +255 -24
  261. package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
  262. package/dist/views/metadata-admin/clientValidation.js +169 -0
  263. package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
  264. package/dist/views/metadata-admin/color-variant-field.js +38 -0
  265. package/dist/views/metadata-admin/createDerive.d.ts +75 -0
  266. package/dist/views/metadata-admin/createDerive.js +179 -0
  267. package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
  268. package/dist/views/metadata-admin/dashboard-schema.js +80 -0
  269. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
  270. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
  271. package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
  272. package/dist/views/metadata-admin/datasource/register.js +24 -0
  273. package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
  274. package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
  275. package/dist/views/metadata-admin/default-schemas.js +115 -10
  276. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
  277. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
  278. package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
  279. package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
  280. package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
  281. package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
  282. package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
  283. package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
  284. package/dist/views/metadata-admin/external/api.d.ts +100 -0
  285. package/dist/views/metadata-admin/external/api.js +124 -0
  286. package/dist/views/metadata-admin/i18n.d.ts +1 -0
  287. package/dist/views/metadata-admin/i18n.js +1252 -2
  288. package/dist/views/metadata-admin/index.d.ts +8 -5
  289. package/dist/views/metadata-admin/index.js +12 -2
  290. package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
  291. package/dist/views/metadata-admin/inspector-registry.js +11 -0
  292. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
  293. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
  294. package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
  295. package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
  296. package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
  297. package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
  298. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
  299. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
  300. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
  301. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
  302. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
  303. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +221 -0
  304. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
  305. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +126 -0
  306. package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
  307. package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
  308. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
  309. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
  310. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
  311. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
  312. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
  313. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +205 -0
  314. package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
  315. package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
  316. package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
  317. package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
  318. package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
  319. package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
  320. package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
  321. package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
  322. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
  323. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +55 -0
  324. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
  325. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +365 -0
  326. package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
  327. package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
  328. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
  329. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +218 -0
  330. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
  331. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
  332. package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
  333. package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
  334. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
  335. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
  336. package/dist/views/metadata-admin/inspectors/_shared.d.ts +128 -0
  337. package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
  338. package/dist/views/metadata-admin/inspectors/datasetFilterCondition.d.ts +24 -0
  339. package/dist/views/metadata-admin/inspectors/datasetFilterCondition.js +97 -0
  340. package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
  341. package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
  342. package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
  343. package/dist/views/metadata-admin/inspectors/flow-node-config.js +506 -0
  344. package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
  345. package/dist/views/metadata-admin/inspectors/index.js +45 -0
  346. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
  347. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
  348. package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
  349. package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
  350. package/dist/views/metadata-admin/issuePath.d.ts +22 -0
  351. package/dist/views/metadata-admin/issuePath.js +65 -0
  352. package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
  353. package/dist/views/metadata-admin/mergeServerFields.js +56 -0
  354. package/dist/views/metadata-admin/package-scope.d.ts +26 -0
  355. package/dist/views/metadata-admin/package-scope.js +43 -0
  356. package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
  357. package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
  358. package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
  359. package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
  360. package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
  361. package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
  362. package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
  363. package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
  364. package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
  365. package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
  366. package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
  367. package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
  368. package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
  369. package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
  370. package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
  371. package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
  372. package/dist/views/metadata-admin/previews/DatasetPreview.js +105 -0
  373. package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
  374. package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
  375. package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
  376. package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
  377. package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
  378. package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
  379. package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
  380. package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +49 -0
  381. package/dist/views/metadata-admin/previews/FlowCanvas.js +416 -0
  382. package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
  383. package/dist/views/metadata-admin/previews/FlowPreview.js +120 -0
  384. package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
  385. package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
  386. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
  387. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +204 -0
  388. package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
  389. package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
  390. package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
  391. package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
  392. package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
  393. package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
  394. package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
  395. package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
  396. package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
  397. package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
  398. package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
  399. package/dist/views/metadata-admin/previews/PagePreview.js +200 -5
  400. package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
  401. package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
  402. package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
  403. package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
  404. package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
  405. package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
  406. package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
  407. package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
  408. package/dist/views/metadata-admin/previews/ScreenPreview.d.ts +38 -0
  409. package/dist/views/metadata-admin/previews/ScreenPreview.js +61 -0
  410. package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
  411. package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
  412. package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
  413. package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
  414. package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
  415. package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
  416. package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
  417. package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
  418. package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
  419. package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
  420. package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
  421. package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
  422. package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
  423. package/dist/views/metadata-admin/previews/block-config.js +324 -0
  424. package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
  425. package/dist/views/metadata-admin/previews/block-types.js +110 -0
  426. package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
  427. package/dist/views/metadata-admin/previews/field-types.js +97 -0
  428. package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +102 -0
  429. package/dist/views/metadata-admin/previews/flow-canvas-layout.js +227 -0
  430. package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +96 -0
  431. package/dist/views/metadata-admin/previews/flow-canvas-parts.js +373 -0
  432. package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
  433. package/dist/views/metadata-admin/previews/form-preview.js +29 -0
  434. package/dist/views/metadata-admin/previews/index.js +43 -0
  435. package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
  436. package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
  437. package/dist/views/metadata-admin/previews/object-fields-io.d.ts +130 -0
  438. package/dist/views/metadata-admin/previews/object-fields-io.js +243 -0
  439. package/dist/views/metadata-admin/previews/screen-spec.d.ts +43 -0
  440. package/dist/views/metadata-admin/previews/screen-spec.js +108 -0
  441. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +102 -0
  442. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
  443. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +15 -0
  444. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +185 -0
  445. package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +73 -0
  446. package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +426 -0
  447. package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
  448. package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
  449. package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
  450. package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
  451. package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
  452. package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
  453. package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
  454. package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
  455. package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
  456. package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
  457. package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
  458. package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
  459. package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
  460. package/dist/views/metadata-admin/previews/widget-types.js +40 -0
  461. package/dist/views/metadata-admin/registry.d.ts +140 -19
  462. package/dist/views/metadata-admin/report-schema.d.ts +26 -0
  463. package/dist/views/metadata-admin/report-schema.js +121 -0
  464. package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
  465. package/dist/views/metadata-admin/useMetadata.js +155 -4
  466. package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
  467. package/dist/views/metadata-admin/view-item-normalize.js +68 -0
  468. package/dist/views/metadata-admin/view-schema.d.ts +16 -0
  469. package/dist/views/metadata-admin/view-schema.js +107 -0
  470. package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
  471. package/dist/views/metadata-admin/view-variant-model.js +64 -0
  472. package/dist/views/metadata-admin/widgets.d.ts +89 -1
  473. package/dist/views/metadata-admin/widgets.js +491 -17
  474. package/dist/views/runtime-metadata-persistence.d.ts +78 -0
  475. package/dist/views/runtime-metadata-persistence.js +89 -0
  476. package/dist/views/useOpenRecordList.d.ts +18 -0
  477. package/dist/views/useOpenRecordList.js +36 -0
  478. package/dist/views/userFilterUrlState.d.ts +15 -0
  479. package/dist/views/userFilterUrlState.js +53 -0
  480. package/dist/views/view-config-adapter.d.ts +38 -0
  481. package/dist/views/view-config-adapter.js +80 -0
  482. package/package.json +52 -34
  483. package/dist/views/DesignDrawer.d.ts +0 -28
  484. package/dist/views/DesignDrawer.js +0 -51
  485. package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
  486. package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
@@ -0,0 +1,61 @@
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
+ * ScreenPreview — live design-time preview of a flow `screen` node, rendered
5
+ * exactly as the end user will see it at runtime.
6
+ *
7
+ * It builds a runtime `ScreenSpec` from the node's authored `config` and hands
8
+ * it to the shared {@link ScreenView} — the SAME renderer the runtime
9
+ * FlowRunner uses — so the preview can never drift from runtime (the
10
+ * design↔runtime divergence #1927 set out to kill). `{var}` references in the
11
+ * title/description are interpolated, and `fields` are gated by their
12
+ * `visibleWhen`, against the supplied `variables` (the flow's declared defaults
13
+ * in the inspector, or the live simulated values when paused in the Debug
14
+ * simulator).
15
+ *
16
+ * Object-form mode is fed the SAME enriched object list the runtime uses
17
+ * (`useMetadata().objects`, which derives inline master-detail `subforms` from
18
+ * `inlineEdit` relationships) so the preview renders those child grids too.
19
+ *
20
+ * Homes: the flow node inspector (live-updates as the config is edited) and the
21
+ * Debug simulator's paused-at-screen state.
22
+ */
23
+ import * as React from 'react';
24
+ import { Button, cn } from '@object-ui/components';
25
+ import { useAdapter } from '../../../providers/AdapterProvider';
26
+ import { useMetadata } from '../../../providers/MetadataProvider';
27
+ import { ScreenView, isObjectFormScreen, initialScreenValues } from '../../ScreenView';
28
+ import { buildScreenSpec, interpolate, hiddenFieldCount } from './screen-spec';
29
+ export function ScreenPreview({ node, variables, className }) {
30
+ const adapter = useAdapter();
31
+ const meta = useMetadata();
32
+ const spec = React.useMemo(() => buildScreenSpec(node, variables), [node, variables]);
33
+ const isObjectForm = isObjectFormScreen(spec);
34
+ // Enriched object defs (incl. derived master-detail `subforms`) — the exact
35
+ // list the runtime FlowRunner gets. Only read in object-form mode so a plain
36
+ // field screen never triggers the all-objects fetch.
37
+ const objects = isObjectForm ? meta.objects : undefined;
38
+ const title = interpolate(spec.title, variables);
39
+ const description = interpolate(spec.description, variables);
40
+ const hidden = isObjectForm ? 0 : hiddenFieldCount(node, variables);
41
+ // Reset transient input state when the screen's STRUCTURE changes (fields
42
+ // added/removed/retyped/gated, or object-form target/mode); typing survives a
43
+ // label/title-only edit.
44
+ const structKey = isObjectForm
45
+ ? `obj:${spec.objectName}:${spec.mode ?? 'create'}`
46
+ : 'fields:' + spec.fields.map((f) => `${f.name}:${f.type ?? ''}:${f.required ? 1 : 0}`).join('|');
47
+ const empty = !title && !description && !isObjectForm && spec.fields.length === 0 && hidden === 0;
48
+ return (_jsxs("div", { className: cn('overflow-hidden rounded-md border bg-background', className), children: [_jsx("div", { className: "flex items-center gap-1.5 border-b bg-muted/30 px-3 py-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: "Preview" }), _jsx("div", { className: "max-h-[60vh] overflow-auto p-4", children: empty ? (_jsx("p", { className: "text-sm italic text-muted-foreground", children: "Add a title, description, fields, or an object form to preview this screen." })) : (_jsxs(_Fragment, { children: [title && _jsx("h3", { className: "text-base font-semibold leading-tight", children: title }), description && (_jsx("p", { className: cn('whitespace-pre-line text-sm text-muted-foreground', title && 'mt-1'), children: description })), _jsx(ScreenFormPreview, { spec: spec, adapter: adapter, objects: objects }, structKey), !isObjectForm && hidden > 0 && (_jsxs("p", { className: "mt-3 text-[11px] italic text-muted-foreground", children: [hidden, " field", hidden === 1 ? '' : 's', " hidden by ", hidden === 1 ? 'its' : 'their', " \u201Cvisible when\u201D", ' ', "condition", hidden === 1 ? '' : 's', "."] })), !isObjectForm && spec.fields.length > 0 && (_jsx("div", { className: "mt-4 flex justify-end", children: _jsx(Button, { size: "sm", disabled: true, children: "Submit" }) }))] })) })] }));
49
+ }
50
+ /**
51
+ * Holds the transient field values so the preview is interactive (the author
52
+ * can type into it) while never persisting anything.
53
+ */
54
+ function ScreenFormPreview({ spec, adapter, objects }) {
55
+ const [values, setValues] = React.useState(() => initialScreenValues(spec));
56
+ return (_jsx(ScreenView, { screen: spec, values: values, onValueChange: (name, v) => setValues((p) => ({ ...p, [name]: v })), dataSource: adapter ?? undefined, objects: objects, objectForm: {
57
+ showSubmit: false,
58
+ showCancel: false,
59
+ noDataSourceMessage: 'Connect to a backend to preview this object form.',
60
+ } }));
61
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * SkillPreview — read-only summary of an AI Skill draft.
3
+ *
4
+ * Skills are reusable bundles of (instructions + tool whitelist +
5
+ * trigger conditions) that agents pull in. The preview surfaces:
6
+ *
7
+ * • Header pills: active flag, permission requirements, model
8
+ * hint if present.
9
+ * • Description block.
10
+ * • Instructions — the prompt fragment injected into the agent's
11
+ * system prompt, in a soft code block so the operator can read
12
+ * it the way the LLM will.
13
+ * • Tools — chip list. Wildcards (`*`, `prefix.*`) get highlighted
14
+ * because they expand the agent's tool surface significantly.
15
+ * • Trigger phrases — the natural-language hints that route a user
16
+ * message into this skill.
17
+ * • Trigger conditions — CEL/structured conditions, rendered as a
18
+ * compact table.
19
+ */
20
+ import * as React from 'react';
21
+ import type { MetadataPreviewProps } from '../preview-registry';
22
+ export declare function SkillPreview({ name, draft }: MetadataPreviewProps): React.JSX.Element;
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Asterisk, BookOpen, Filter, MessagesSquare, Power, ShieldCheck, Sparkles, Wrench, } from 'lucide-react';
3
+ import { PreviewShell, PreviewMessage, PreviewErrorBoundary } from './PreviewShell';
4
+ export function SkillPreview({ name, draft }) {
5
+ const d = draft;
6
+ const skillName = String(d.name ?? name ?? '');
7
+ const label = String(d.label ?? skillName);
8
+ const description = d.description ?? '';
9
+ const instructions = d.instructions ?? '';
10
+ const tools = Array.isArray(d.tools) ? d.tools : [];
11
+ const triggerPhrases = Array.isArray(d.triggerPhrases) ? d.triggerPhrases : [];
12
+ const triggerConditions = Array.isArray(d.triggerConditions)
13
+ ? d.triggerConditions
14
+ : [];
15
+ const permissions = Array.isArray(d.permissions) ? d.permissions : [];
16
+ const active = d.active !== false;
17
+ const model = d.model ?? undefined;
18
+ if (!skillName) {
19
+ return (_jsx(PreviewShell, { hint: "skill", children: _jsx(PreviewMessage, { children: "Give the skill a name and at least an instructions block to see the preview." }) }));
20
+ }
21
+ return (_jsx(PreviewShell, { hint: "skill", children: _jsx(PreviewErrorBoundary, { children: _jsxs("div", { className: "p-3 space-y-3", children: [_jsx("div", { className: "rounded border bg-muted/30 p-3", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Sparkles, { className: "h-4 w-4 mt-0.5 text-muted-foreground shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [_jsx("span", { className: "text-sm font-medium truncate", children: label }), _jsx("span", { className: "font-mono text-[10px] text-muted-foreground", children: skillName })] }), description && (_jsx("div", { className: "text-xs text-muted-foreground mt-0.5", children: description })), _jsxs("div", { className: "mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px]", children: [_jsx(Pill, { icon: Power, label: active ? 'Active' : 'Disabled', tone: active ? 'green' : 'gray' }), model && _jsx(Pill, { label: `model: ${model}`, mono: true }), permissions.length > 0 && (_jsx(Pill, { icon: ShieldCheck, label: `${permissions.length} required perm${permissions.length === 1 ? '' : 's'}` }))] })] })] }) }), _jsx(Section, { title: "Instructions", icon: BookOpen, children: instructions ? (_jsx("pre", { className: "rounded border bg-background p-2.5 text-xs font-mono whitespace-pre-wrap break-words max-h-64 overflow-auto", children: instructions })) : (_jsx("div", { className: "text-xs text-amber-700", children: "No instructions yet \u2014 the skill will contribute nothing to the prompt." })) }), _jsxs(Section, { title: `Tools (${tools.length})`, icon: Wrench, children: [tools.length === 0 ? (_jsx("div", { className: "text-xs text-muted-foreground italic", children: "No tools whitelisted." })) : (_jsx("div", { className: "flex flex-wrap gap-1", children: tools.map((t) => {
22
+ const isWild = t.includes('*');
23
+ return (_jsxs("span", { className: `inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[11px] font-mono border ${isWild ? 'border-amber-300 bg-amber-50 text-amber-900' : 'border-border bg-muted/40'}`, children: [isWild && _jsx(Asterisk, { className: "h-3 w-3" }), t] }, t));
24
+ }) })), tools.some((t) => t.includes('*')) && (_jsx("div", { className: "mt-1 text-[10px] text-amber-700", children: "Wildcards expand to many tools at runtime \u2014 review the matching set in the agent before activating." }))] }), triggerPhrases.length > 0 && (_jsx(Section, { title: `Trigger Phrases (${triggerPhrases.length})`, icon: MessagesSquare, children: _jsx("ul", { className: "rounded border bg-background divide-y text-xs", children: triggerPhrases.map((p, i) => (_jsxs("li", { className: "px-2.5 py-1.5", children: [_jsx("span", { className: "text-muted-foreground mr-2", children: "\"" }), p, _jsx("span", { className: "text-muted-foreground ml-2", children: "\"" })] }, i))) }) })), triggerConditions.length > 0 && (_jsx(Section, { title: `Trigger Conditions (${triggerConditions.length})`, icon: Filter, children: _jsx("div", { className: "rounded border bg-background overflow-hidden", children: _jsx("table", { className: "w-full text-xs", children: _jsx("tbody", { className: "divide-y", children: triggerConditions.map((cond, i) => (_jsxs("tr", { children: [_jsx("td", { className: "px-2.5 py-1.5 align-top w-24 text-muted-foreground text-[10px] uppercase", children: cond.type ?? 'cond' }), _jsx("td", { className: "px-2.5 py-1.5 font-mono break-all", children: cond.expression ??
25
+ cond.value ??
26
+ JSON.stringify(cond) })] }, i))) }) }) }) })), permissions.length > 0 && (_jsx(Section, { title: "Required Permissions", icon: ShieldCheck, children: _jsx("div", { className: "flex flex-wrap gap-1", children: permissions.map((p) => (_jsx("span", { className: "inline-flex items-center gap-1 rounded border bg-muted/40 px-1.5 py-0.5 text-[11px] font-mono", children: p }, p))) }) }))] }) }) }));
27
+ }
28
+ function Section({ title, icon: Icon, children, }) {
29
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground uppercase tracking-wider", children: [Icon && _jsx(Icon, { className: "h-3 w-3" }), _jsx("span", { children: title })] }), children] }));
30
+ }
31
+ function Pill({ icon: Icon, label, tone = 'gray', mono = false, }) {
32
+ const cls = tone === 'green' ? 'text-emerald-700' : 'text-foreground';
33
+ return (_jsxs("span", { className: "inline-flex items-center gap-1", children: [Icon && _jsx(Icon, { className: "h-3 w-3 text-muted-foreground" }), _jsx("span", { className: `${cls} ${mono ? 'font-mono' : ''}`, children: label })] }));
34
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * ToolPreview — read-only summary of an AI Tool metadata draft.
3
+ *
4
+ * AI tools are LLM-callable functions whose contract is a JSON Schema
5
+ * in `parameters`. The preview renders:
6
+ *
7
+ * 1. A header strip: machine name, category, target object, flags
8
+ * (active, requiresConfirmation, builtIn).
9
+ * 2. The description verbatim (this is what the LLM reads to decide
10
+ * when to call the tool, so authors must be able to skim it).
11
+ * 3. An **input parameters** table extracted from the JSON Schema:
12
+ * one row per top-level property with type, required marker,
13
+ * description, enum hints, and default value.
14
+ * 4. An **output schema** mirror table when `outputSchema` is set.
15
+ * 5. A skeletal "example invocation" panel showing what the LLM
16
+ * would emit if it called the tool with required fields stubbed.
17
+ *
18
+ * We do not run the tool from the preview — invocation requires auth,
19
+ * permission checks, and live datasource access that the preview
20
+ * sandbox doesn't provide. Authors get an `Open in API Console` link
21
+ * for end-to-end testing.
22
+ */
23
+ import * as React from 'react';
24
+ import type { MetadataPreviewProps } from '../preview-registry';
25
+ export declare function ToolPreview({ name, draft }: MetadataPreviewProps): React.JSX.Element;
@@ -0,0 +1,122 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
3
+ /**
4
+ * ToolPreview — read-only summary of an AI Tool metadata draft.
5
+ *
6
+ * AI tools are LLM-callable functions whose contract is a JSON Schema
7
+ * in `parameters`. The preview renders:
8
+ *
9
+ * 1. A header strip: machine name, category, target object, flags
10
+ * (active, requiresConfirmation, builtIn).
11
+ * 2. The description verbatim (this is what the LLM reads to decide
12
+ * when to call the tool, so authors must be able to skim it).
13
+ * 3. An **input parameters** table extracted from the JSON Schema:
14
+ * one row per top-level property with type, required marker,
15
+ * description, enum hints, and default value.
16
+ * 4. An **output schema** mirror table when `outputSchema` is set.
17
+ * 5. A skeletal "example invocation" panel showing what the LLM
18
+ * would emit if it called the tool with required fields stubbed.
19
+ *
20
+ * We do not run the tool from the preview — invocation requires auth,
21
+ * permission checks, and live datasource access that the preview
22
+ * sandbox doesn't provide. Authors get an `Open in API Console` link
23
+ * for end-to-end testing.
24
+ */
25
+ import * as React from 'react';
26
+ import { AlertTriangle, Box, CheckCircle2, ChevronRight, Database, ExternalLink, FileJson, Power, Tag, Wrench, } from 'lucide-react';
27
+ import { PreviewShell, PreviewMessage, PreviewErrorBoundary } from './PreviewShell';
28
+ function isObjectSchema(s) {
29
+ return !!s && typeof s === 'object' && typeof s.properties === 'object';
30
+ }
31
+ function typeLabel(p) {
32
+ if (!p)
33
+ return 'any';
34
+ if (Array.isArray(p.type))
35
+ return p.type.join('|');
36
+ if (p.type === 'array' && p.items)
37
+ return `${typeLabel(p.items)}[]`;
38
+ if (p.$ref)
39
+ return p.$ref.split('/').pop() || 'ref';
40
+ return p.type ?? 'any';
41
+ }
42
+ function stubValue(p) {
43
+ if (p.default !== undefined)
44
+ return p.default;
45
+ if (Array.isArray(p.enum) && p.enum.length)
46
+ return p.enum[0];
47
+ const t = Array.isArray(p.type) ? p.type[0] : p.type;
48
+ switch (t) {
49
+ case 'string':
50
+ return p.format ? `<${p.format}>` : '<string>';
51
+ case 'number':
52
+ case 'integer':
53
+ return 0;
54
+ case 'boolean':
55
+ return false;
56
+ case 'array':
57
+ return [];
58
+ case 'object':
59
+ return {};
60
+ default:
61
+ return null;
62
+ }
63
+ }
64
+ export function ToolPreview({ name, draft }) {
65
+ const d = draft;
66
+ const toolName = String(d.name ?? name ?? '');
67
+ const label = String(d.label ?? toolName);
68
+ const description = String(d.description ?? '');
69
+ const category = d.category || undefined;
70
+ const objectName = d.objectName || undefined;
71
+ const requiresConfirmation = !!d.requiresConfirmation;
72
+ const active = d.active !== false;
73
+ const builtIn = !!d.builtIn;
74
+ const parameters = (d.parameters ?? {});
75
+ const outputSchema = (d.outputSchema ?? undefined);
76
+ const props = isObjectSchema(parameters) ? parameters.properties ?? {} : {};
77
+ const required = new Set(Array.isArray(parameters.required) ? parameters.required : []);
78
+ const exampleArgs = React.useMemo(() => {
79
+ const out = {};
80
+ for (const key of required) {
81
+ if (props[key])
82
+ out[key] = stubValue(props[key]);
83
+ }
84
+ // If there are no required fields, show the first optional one to
85
+ // give the LLM a reasonable example shape.
86
+ if (Object.keys(out).length === 0) {
87
+ const firstKey = Object.keys(props)[0];
88
+ if (firstKey)
89
+ out[firstKey] = stubValue(props[firstKey]);
90
+ }
91
+ return out;
92
+ }, [props, required]);
93
+ if (!toolName && !description && Object.keys(props).length === 0) {
94
+ return (_jsx(PreviewShell, { hint: "tool", children: _jsx(PreviewMessage, { children: "Set name, description, and parameters to see the tool preview." }) }));
95
+ }
96
+ return (_jsx(PreviewShell, { hint: "tool", toolbar: toolName && (_jsxs("a", { href: `/developer/api-console?path=/api/v1/ai/tools/${encodeURIComponent(toolName)}/invoke`, target: "_blank", rel: "noreferrer", className: "text-xs inline-flex items-center gap-1 text-muted-foreground hover:text-foreground", title: "Open API Console to test invocation", children: ["Open in API Console ", _jsx(ExternalLink, { className: "h-3 w-3" })] })), children: _jsx(PreviewErrorBoundary, { children: _jsxs("div", { className: "p-3 space-y-3", children: [_jsxs("div", { className: "rounded border bg-muted/30 p-3 space-y-1", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Wrench, { className: "h-4 w-4 mt-0.5 text-muted-foreground shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [_jsx("span", { className: "text-sm font-medium truncate", children: label }), _jsx("span", { className: "font-mono text-[10px] text-muted-foreground", children: toolName })] }), _jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px]", children: [category && _jsx(Pill, { icon: Tag, label: category }), objectName && _jsx(Pill, { icon: Database, label: objectName, mono: true }), _jsx(Pill, { icon: Power, label: active ? 'Active' : 'Disabled', tone: active ? 'green' : 'gray' }), requiresConfirmation && (_jsx(Pill, { icon: AlertTriangle, label: "Requires confirmation", tone: "amber" })), builtIn && _jsx(Pill, { label: "built-in" })] })] })] }), description && (_jsx("div", { className: "pl-6 text-xs text-foreground whitespace-pre-wrap", children: description }))] }), _jsx(Section, { title: "Input Parameters", count: Object.keys(props).length, children: Object.keys(props).length === 0 ? (_jsx(Empty, { children: "This tool takes no input parameters." })) : (_jsx(ParamTable, { props: props, required: required })) }), Object.keys(props).length > 0 && (_jsx(Section, { title: "Example LLM Call", icon: FileJson, children: _jsx("pre", { className: "m-0 rounded border bg-background p-2.5 text-xs font-mono overflow-auto max-h-[200px]", children: `{
97
+ "tool": "${toolName}",
98
+ "arguments": ${JSON.stringify(exampleArgs, null, 2).replace(/\n/g, '\n ')}
99
+ }` }) })), isObjectSchema(outputSchema) && outputSchema.properties && Object.keys(outputSchema.properties).length > 0 && (_jsx(Section, { title: "Output Schema", count: Object.keys(outputSchema.properties).length, icon: Box, children: _jsx(ParamTable, { props: outputSchema.properties, required: new Set(Array.isArray(outputSchema.required) ? outputSchema.required : []) }) }))] }) }) }));
100
+ }
101
+ function ParamTable({ props, required }) {
102
+ const keys = Object.keys(props);
103
+ return (_jsx("div", { className: "rounded border bg-background overflow-hidden", children: _jsxs("table", { className: "w-full text-xs", children: [_jsx("thead", { children: _jsxs("tr", { className: "bg-muted/30 text-left text-[10px] uppercase tracking-wider text-muted-foreground", children: [_jsx("th", { className: "px-2.5 py-1.5 font-medium", children: "Name" }), _jsx("th", { className: "px-2.5 py-1.5 font-medium", children: "Type" }), _jsx("th", { className: "px-2.5 py-1.5 font-medium", children: "Description" })] }) }), _jsx("tbody", { className: "divide-y", children: keys.map((k) => {
104
+ const p = props[k];
105
+ const isReq = required.has(k);
106
+ return (_jsxs("tr", { className: "align-top", children: [_jsx("td", { className: "px-2.5 py-1.5 font-mono", children: _jsxs("div", { className: "flex items-center gap-1", children: [isReq ? (_jsx(CheckCircle2, { className: "h-3 w-3 text-emerald-600" })) : (_jsx(ChevronRight, { className: "h-3 w-3 text-muted-foreground" })), k, isReq && _jsx("span", { className: "text-[9px] uppercase text-emerald-700 ml-1", children: "req" })] }) }), _jsx("td", { className: "px-2.5 py-1.5 font-mono text-muted-foreground", children: typeLabel(p) }), _jsxs("td", { className: "px-2.5 py-1.5", children: [p.description && _jsx("div", { children: p.description }), Array.isArray(p.enum) && p.enum.length > 0 && (_jsxs("div", { className: "text-[10px] text-muted-foreground", children: ["enum: ", p.enum.map((v) => JSON.stringify(v)).join(' | ')] })), p.default !== undefined && (_jsxs("div", { className: "text-[10px] text-muted-foreground", children: ["default: ", _jsx("code", { className: "font-mono", children: JSON.stringify(p.default) })] })), p.format && (_jsxs("div", { className: "text-[10px] text-muted-foreground", children: ["format: ", p.format] }))] })] }, k));
107
+ }) })] }) }));
108
+ }
109
+ function Section({ title, count, icon: Icon, children, }) {
110
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground uppercase tracking-wider", children: [Icon && _jsx(Icon, { className: "h-3 w-3" }), _jsx("span", { children: title }), count != null && _jsxs("span", { className: "opacity-70", children: ["(", count, ")"] })] }), children] }));
111
+ }
112
+ function Empty({ children }) {
113
+ return _jsx("div", { className: "text-xs text-muted-foreground italic", children: children });
114
+ }
115
+ function Pill({ icon: Icon, label, tone = 'gray', mono = false, }) {
116
+ const cls = tone === 'green'
117
+ ? 'text-emerald-700'
118
+ : tone === 'amber'
119
+ ? 'text-amber-700'
120
+ : 'text-foreground';
121
+ return (_jsxs("span", { className: "inline-flex items-center gap-1", children: [Icon && _jsx(Icon, { className: "h-3 w-3 text-muted-foreground" }), _jsx("span", { className: `${cls} ${mono ? 'font-mono' : ''}`, children: label })] }));
122
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * TranslationPreview — read-only coverage report for one locale bundle.
3
+ *
4
+ * A translation record represents exactly one locale (per the i18n ADR).
5
+ * This preview answers two questions an operator typically has when
6
+ * opening a translation:
7
+ *
8
+ * 1. "Which locale is this and how complete is it?" → header strip
9
+ * with the locale badge, total-key count, and an overall coverage
10
+ * bar (categories that have at least one entry).
11
+ * 2. "Where are the strings?" → a card per category in
12
+ * `TranslationDataSchema`: objects · apps · messages ·
13
+ * validationMessages · globalActions · dashboards · settings ·
14
+ * metadataForms. Each card shows the count of top-level keys and
15
+ * a sample of up to 5 keys so the user can confirm the right
16
+ * bundle is loaded.
17
+ *
18
+ * For flat string maps (messages, validationMessages, globalActions,
19
+ * settings) we render a small key→value sample table. For nested
20
+ * objects (objects, apps, dashboards, metadataForms) we list the
21
+ * top-level keys with their inner key count.
22
+ */
23
+ import * as React from 'react';
24
+ import type { MetadataPreviewProps } from '../preview-registry';
25
+ export declare function TranslationPreview({ name, draft }: MetadataPreviewProps): React.JSX.Element;
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AppWindow, ClipboardList, FileText, Gauge, Globe2, LayoutDashboard, Languages, ListChecks, MessageCircle, Settings2, ShieldAlert, } from 'lucide-react';
3
+ import { PreviewShell, PreviewMessage, PreviewErrorBoundary } from './PreviewShell';
4
+ const CATEGORIES = [
5
+ { key: 'objects', label: 'Objects', icon: ListChecks, flat: false },
6
+ { key: 'apps', label: 'Apps', icon: AppWindow, flat: false },
7
+ { key: 'messages', label: 'Messages', icon: MessageCircle, flat: true },
8
+ { key: 'validationMessages', label: 'Validation Messages', icon: ShieldAlert, flat: true },
9
+ { key: 'globalActions', label: 'Global Actions', icon: ClipboardList, flat: true },
10
+ { key: 'dashboards', label: 'Dashboards', icon: LayoutDashboard, flat: false },
11
+ { key: 'settings', label: 'Settings', icon: Settings2, flat: true },
12
+ { key: 'metadataForms', label: 'Metadata Forms', icon: FileText, flat: false },
13
+ ];
14
+ export function TranslationPreview({ name, draft }) {
15
+ const d = draft;
16
+ const locale = d.locale ?? d.language ?? '?';
17
+ const label = d.label ?? d.name ?? name ?? '';
18
+ const description = d.description;
19
+ const data = d.data ?? d;
20
+ const counts = CATEGORIES.map((cat) => {
21
+ const bag = data?.[cat.key];
22
+ if (!bag || typeof bag !== 'object')
23
+ return { ...cat, count: 0, sample: [] };
24
+ const entries = Object.entries(bag);
25
+ return { ...cat, count: entries.length, sample: entries.slice(0, 5) };
26
+ });
27
+ const totalKeys = counts.reduce((sum, c) => sum + c.count, 0);
28
+ const populated = counts.filter((c) => c.count > 0).length;
29
+ const coverage = Math.round((populated / CATEGORIES.length) * 100);
30
+ if (totalKeys === 0) {
31
+ return (_jsx(PreviewShell, { hint: `translation · ${locale}`, children: _jsx(PreviewMessage, { children: "This bundle is empty \u2014 add at least one translated string to see the coverage report." }) }));
32
+ }
33
+ return (_jsx(PreviewShell, { hint: `translation · ${locale} · ${totalKeys} keys`, children: _jsx(PreviewErrorBoundary, { children: _jsxs("div", { className: "p-3 space-y-3", children: [_jsx("div", { className: "rounded border bg-muted/30 p-3", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Languages, { className: "h-4 w-4 mt-0.5 text-muted-foreground shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [_jsx("span", { className: "text-sm font-medium truncate", children: label }), _jsxs("span", { className: "inline-flex items-center gap-1 rounded bg-emerald-50 border border-emerald-200 px-1.5 py-0.5 text-[10px] font-mono text-emerald-800", children: [_jsx(Globe2, { className: "h-3 w-3" }), " ", locale] })] }), description && _jsx("div", { className: "text-xs text-muted-foreground mt-0.5", children: description }), _jsxs("div", { className: "mt-2 flex items-center gap-2 text-[11px]", children: [_jsx(Gauge, { className: "h-3 w-3 text-muted-foreground" }), _jsx("span", { className: "text-muted-foreground", children: "Category coverage:" }), _jsx("div", { className: "h-1.5 w-32 rounded-full bg-muted overflow-hidden", children: _jsx("div", { className: "h-full bg-emerald-500", style: { width: `${coverage}%` } }) }), _jsxs("span", { className: "font-mono", children: [populated, "/", CATEGORIES.length, " (", coverage, "%)"] }), _jsxs("span", { className: "ml-3 text-muted-foreground", children: [totalKeys, " total keys"] })] })] })] }) }), _jsx("div", { className: "grid gap-2 sm:grid-cols-2", children: counts.map((c) => (_jsx(CategoryCard, { cat: c }, c.key))) })] }) }) }));
34
+ }
35
+ function CategoryCard({ cat, }) {
36
+ const Icon = cat.icon;
37
+ return (_jsxs("div", { className: `rounded border bg-background ${cat.count === 0 ? 'opacity-60' : ''}`, children: [_jsxs("div", { className: "flex items-center justify-between border-b px-2.5 py-1.5", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(Icon, { className: "h-3.5 w-3.5 text-muted-foreground" }), _jsx("span", { className: "text-xs font-medium", children: cat.label })] }), _jsx("span", { className: "rounded bg-muted px-1.5 py-0.5 text-[10px] font-mono", children: cat.count })] }), _jsx("div", { className: "px-2.5 py-1.5 min-h-[3.5rem]", children: cat.count === 0 ? (_jsx("div", { className: "text-[11px] text-muted-foreground italic", children: "empty" })) : (_jsxs("ul", { className: "space-y-0.5 text-[11px]", children: [cat.sample.map(([k, v]) => (_jsxs("li", { className: "flex items-baseline gap-2 truncate", children: [_jsx("code", { className: "font-mono text-muted-foreground shrink-0", children: k }), _jsx("span", { className: "truncate text-foreground/80", children: renderSampleValue(v, cat.flat) })] }, k))), cat.count > cat.sample.length && (_jsxs("li", { className: "text-[10px] text-muted-foreground italic", children: ["+", cat.count - cat.sample.length, " more\u2026"] }))] })) })] }));
38
+ }
39
+ function renderSampleValue(v, flat) {
40
+ if (flat) {
41
+ if (typeof v === 'string')
42
+ return `"${v}"`;
43
+ if (v == null)
44
+ return '∅';
45
+ return String(v);
46
+ }
47
+ if (v && typeof v === 'object') {
48
+ const n = Object.keys(v).length;
49
+ return `{${n} keys}`;
50
+ }
51
+ return String(v ?? '∅');
52
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * ValidationPreview — read-only summary of a Validation rule draft.
3
+ *
4
+ * Validation is a discriminated union by `type`:
5
+ * script · unique · state_machine · format · cross_field · async ·
6
+ * custom · conditional · plus the schema-style JSONValidationSchema.
7
+ *
8
+ * The preview shows a shared envelope (target, message, severity,
9
+ * active, events, priority, tags) and then a type-specific body so
10
+ * each rule shape gets the right vocabulary instead of a generic
11
+ * "field dump":
12
+ *
13
+ * • script → CEL condition block
14
+ * • unique → unique fields + scope (CEL)
15
+ * • state_machine → from→to transitions matrix
16
+ * • format → regex / built-in format name
17
+ * • cross_field → involved fields + cross-field condition
18
+ * • async → endpoint URL + timeout
19
+ * • custom → handler reference
20
+ * • conditional → predicate + nested rule reference
21
+ *
22
+ * Severity drives the accent color (error=red, warning=amber,
23
+ * info=blue) the same way runtime UI surfaces it.
24
+ */
25
+ import * as React from 'react';
26
+ import type { MetadataPreviewProps } from '../preview-registry';
27
+ export declare function ValidationPreview({ name, draft }: MetadataPreviewProps): React.JSX.Element;
@@ -0,0 +1,110 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { AlertTriangle, ArrowRight, Code2, Fingerprint, Globe2, Info, Power, Regex, ShieldAlert, Sigma, Workflow, XOctagon, } from 'lucide-react';
3
+ import { PreviewShell, PreviewMessage, PreviewErrorBoundary } from './PreviewShell';
4
+ function celText(c) {
5
+ if (!c)
6
+ return undefined;
7
+ if (typeof c === 'string')
8
+ return c;
9
+ if (typeof c === 'object' && typeof c.source === 'string')
10
+ return c.source;
11
+ return undefined;
12
+ }
13
+ function severityTone(s) {
14
+ switch (s) {
15
+ case 'error':
16
+ return {
17
+ ring: 'border-red-200 bg-red-50 dark:border-red-900 dark:bg-red-950/40',
18
+ text: 'text-red-700 dark:text-red-300',
19
+ icon: XOctagon,
20
+ };
21
+ case 'warning':
22
+ return {
23
+ ring: 'border-amber-200 bg-amber-50 dark:border-amber-900 dark:bg-amber-950/40',
24
+ text: 'text-amber-800 dark:text-amber-300',
25
+ icon: AlertTriangle,
26
+ };
27
+ case 'info':
28
+ default:
29
+ return {
30
+ ring: 'border-blue-200 bg-blue-50 dark:border-blue-900 dark:bg-blue-950/40',
31
+ text: 'text-blue-800 dark:text-blue-300',
32
+ icon: Info,
33
+ };
34
+ }
35
+ }
36
+ export function ValidationPreview({ name, draft }) {
37
+ const d = draft;
38
+ const ruleName = String(d.name ?? name ?? '');
39
+ const label = String(d.label ?? ruleName);
40
+ const description = d.description ?? '';
41
+ const type = d.type ?? 'script';
42
+ const object = d.object;
43
+ const message = d.message ?? '';
44
+ const severity = (d.severity ?? 'error');
45
+ const active = d.active !== false;
46
+ const events = Array.isArray(d.events) ? d.events : [];
47
+ const priority = d.priority;
48
+ const tags = Array.isArray(d.tags) ? d.tags : [];
49
+ const tone = severityTone(severity);
50
+ if (!ruleName) {
51
+ return (_jsx(PreviewShell, { hint: "validation", children: _jsx(PreviewMessage, { children: "Give the validation a name to see the preview." }) }));
52
+ }
53
+ return (_jsx(PreviewShell, { hint: `validation · ${type}`, children: _jsx(PreviewErrorBoundary, { children: _jsxs("div", { className: "p-3 space-y-3", children: [_jsx("div", { className: "rounded border bg-muted/30 p-3", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(ShieldAlert, { className: "h-4 w-4 mt-0.5 text-muted-foreground shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [_jsx("span", { className: "text-sm font-medium truncate", children: label }), _jsx("span", { className: "font-mono text-[10px] text-muted-foreground", children: ruleName }), _jsx("span", { className: "rounded border bg-background px-1.5 py-0.5 text-[10px] font-mono", children: type })] }), description && (_jsx("div", { className: "text-xs text-muted-foreground mt-0.5", children: description })), _jsxs("div", { className: "mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px]", children: [_jsx(Pill, { icon: Power, label: active ? 'Active' : 'Disabled', tone: active ? 'green' : 'gray' }), object && _jsx(Pill, { label: `object: ${object}`, mono: true }), priority != null && _jsx(Pill, { label: `priority ${priority}` }), events.length > 0 && (_jsx(Pill, { label: `on ${events.join(', ')}` }))] })] })] }) }), _jsx("div", { className: `rounded border p-2.5 text-xs ${tone.ring}`, children: _jsxs("div", { className: `flex items-start gap-1.5 ${tone.text}`, children: [_jsx(tone.icon, { className: "h-3.5 w-3.5 mt-0.5 shrink-0" }), _jsxs("div", { children: [_jsx("div", { className: "font-medium uppercase tracking-wider text-[10px]", children: severity }), _jsx("div", { className: "font-normal mt-0.5 text-foreground", children: message || _jsx("span", { className: "italic text-muted-foreground", children: "no message set" }) })] })] }) }), _jsx(TypeBody, { type: type, d: d }), tags.length > 0 && (_jsxs("div", { children: [_jsx("div", { className: "text-[11px] font-medium text-muted-foreground uppercase tracking-wider mb-1", children: "Tags" }), _jsx("div", { className: "flex flex-wrap gap-1", children: tags.map((t) => (_jsx("span", { className: "inline-flex items-center rounded border bg-muted/40 px-1.5 py-0.5 text-[11px] font-mono", children: t }, t))) })] }))] }) }) }));
54
+ }
55
+ function TypeBody({ type, d }) {
56
+ switch (type) {
57
+ case 'script':
58
+ case 'conditional':
59
+ return (_jsx(Section, { title: "Condition", icon: Code2, children: _jsx(CelBlock, { value: celText(d.condition) ?? celText(d.expression) }) }));
60
+ case 'unique': {
61
+ const fields = Array.isArray(d.fields) ? d.fields : [];
62
+ const scope = celText(d.scope) ?? celText(d.where);
63
+ return (_jsxs(_Fragment, { children: [_jsx(Section, { title: `Unique on ${fields.length} field${fields.length === 1 ? '' : 's'}`, icon: Fingerprint, children: _jsx("div", { className: "flex flex-wrap gap-1", children: fields.length === 0 ? (_jsx("span", { className: "text-xs text-amber-700 dark:text-amber-400", children: "no fields set" })) : (fields.map((f) => (_jsx("span", { className: "rounded border bg-muted/40 px-1.5 py-0.5 text-[11px] font-mono", children: f }, f)))) }) }), scope && (_jsx(Section, { title: "Scope", icon: Sigma, children: _jsx(CelBlock, { value: scope }) }))] }));
64
+ }
65
+ case 'state_machine': {
66
+ // ADR-0020 shape: transitions is a `{ fromState: [allowedToStates] }` map.
67
+ const transitionMap = d.transitions && typeof d.transitions === 'object' && !Array.isArray(d.transitions)
68
+ ? d.transitions
69
+ : {};
70
+ const entries = Object.entries(transitionMap);
71
+ const field = d.field;
72
+ return (_jsx(Section, { title: `Transitions${field ? ` on ${field}` : ''}`, icon: Workflow, children: entries.length === 0 ? (_jsx("div", { className: "text-xs text-amber-700 dark:text-amber-400", children: "No transitions declared." })) : (_jsx("ul", { className: "rounded border bg-background divide-y text-xs", children: entries.map(([from, tos]) => (_jsxs("li", { className: "flex items-center gap-2 px-2.5 py-1.5", children: [_jsx("span", { className: "font-mono", children: from }), _jsx(ArrowRight, { className: "h-3 w-3 text-muted-foreground" }), _jsx("span", { className: "font-mono text-emerald-700 dark:text-emerald-400", children: Array.isArray(tos) && tos.length > 0 ? tos.join(' | ') : '∅ (dead-end)' })] }, from))) })) }));
73
+ }
74
+ case 'format': {
75
+ const pattern = d.pattern ?? d.regex;
76
+ const format = d.format;
77
+ return (_jsx(Section, { title: "Format", icon: Regex, children: _jsxs("div", { className: "rounded border bg-background p-2.5 text-xs space-y-1", children: [format && (_jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Built-in:" }), ' ', _jsx("code", { className: "font-mono", children: format })] })), pattern && (_jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Pattern:" }), ' ', _jsx("code", { className: "font-mono break-all", children: pattern })] })), !format && !pattern && _jsx("span", { className: "text-amber-700 dark:text-amber-400", children: "No format or regex set." })] }) }));
78
+ }
79
+ case 'cross_field': {
80
+ const fields = Array.isArray(d.fields) ? d.fields : [];
81
+ const condition = celText(d.condition);
82
+ return (_jsxs(_Fragment, { children: [_jsx(Section, { title: "Fields involved", icon: Sigma, children: _jsxs("div", { className: "flex flex-wrap gap-1", children: [fields.map((f) => (_jsx("span", { className: "rounded border bg-muted/40 px-1.5 py-0.5 text-[11px] font-mono", children: f }, f))), fields.length === 0 && _jsx("span", { className: "text-xs text-muted-foreground italic", children: "none" })] }) }), _jsx(Section, { title: "Cross-field condition", icon: Code2, children: _jsx(CelBlock, { value: condition }) })] }));
83
+ }
84
+ case 'async': {
85
+ const endpoint = d.endpoint ?? d.url;
86
+ const timeout = d.timeoutMs;
87
+ const method = d.method ?? 'POST';
88
+ return (_jsx(Section, { title: "Async endpoint", icon: Globe2, children: _jsxs("div", { className: "rounded border bg-background p-2.5 text-xs space-y-1", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "rounded bg-muted px-1.5 py-0.5 text-[10px] font-mono", children: method }), _jsx("code", { className: "font-mono break-all", children: endpoint ?? '—' })] }), timeout != null && (_jsxs("div", { className: "text-muted-foreground", children: ["timeout: ", timeout, "ms"] }))] }) }));
89
+ }
90
+ case 'custom': {
91
+ const handler = d.handler ?? d.function;
92
+ return (_jsx(Section, { title: "Custom handler", icon: Code2, children: _jsx("div", { className: "rounded border bg-background px-2.5 py-1.5 text-xs", children: handler ? _jsx("code", { className: "font-mono break-all", children: handler }) : _jsx("span", { className: "text-amber-700 dark:text-amber-400", children: "No handler set." }) }) }));
93
+ }
94
+ default:
95
+ return (_jsx(Section, { title: "Rule", icon: ShieldAlert, children: _jsxs("div", { className: "rounded border bg-background p-2.5 text-xs text-muted-foreground italic", children: ["Unknown rule type \"", type, "\". Showing common fields only."] }) }));
96
+ }
97
+ }
98
+ function CelBlock({ value }) {
99
+ if (!value) {
100
+ return _jsx("div", { className: "text-xs text-amber-700 dark:text-amber-400", children: "No expression set." });
101
+ }
102
+ return (_jsx("pre", { className: "rounded border bg-background p-2.5 text-xs font-mono whitespace-pre-wrap break-words", children: value }));
103
+ }
104
+ function Section({ title, icon: Icon, children, }) {
105
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground uppercase tracking-wider", children: [Icon && _jsx(Icon, { className: "h-3 w-3" }), _jsx("span", { children: title })] }), children] }));
106
+ }
107
+ function Pill({ icon: Icon, label, tone = 'gray', mono = false, }) {
108
+ const cls = tone === 'green' ? 'text-emerald-700 dark:text-emerald-400' : 'text-foreground';
109
+ return (_jsxs("span", { className: "inline-flex items-center gap-1", children: [Icon && _jsx(Icon, { className: "h-3 w-3 text-muted-foreground" }), _jsx("span", { className: `${cls} ${mono ? 'font-mono' : ''}`, children: label })] }));
110
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Compact controls for the View column bar.
3
+ *
4
+ * • ColumnChip — a single draggable column "pill": click to
5
+ * select (→ inspector), drag to reorder, × to remove. Designed to
6
+ * sit in a one-line toolbar above the live grid preview so the
7
+ * preview — not the field manager — owns the canvas.
8
+ *
9
+ * • AddFieldPopover — an Airtable/Notion-style "+ Add field" button
10
+ * that opens a searchable checklist of the bound Object's fields.
11
+ * Click a field to append it as a column. Already-used fields are
12
+ * tagged "Added" but stay clickable (a table may show a field
13
+ * twice). Removal is explicit via the chip × so column-level config
14
+ * (label, width, sortable…) is never silently dropped.
15
+ */
16
+ import * as React from 'react';
17
+ import type { ObjectFieldInfo } from './useObjectFields';
18
+ export declare function ColumnChip({ index, label, fieldType, selected, canEdit, dragging, dropBefore, onSelect, onRemove, onDragStart, onDragEnd, onDragOverChip, onDropChip, }: {
19
+ index: number;
20
+ label: string;
21
+ fieldType: unknown;
22
+ selected: boolean;
23
+ canEdit: boolean;
24
+ dragging: boolean;
25
+ dropBefore: boolean;
26
+ onSelect: () => void;
27
+ onRemove: () => void;
28
+ onDragStart: () => void;
29
+ onDragEnd: () => void;
30
+ onDragOverChip: () => void;
31
+ onDropChip: () => void;
32
+ }): React.JSX.Element;
33
+ /**
34
+ * FieldListRow — a full-width, vertically-stacked variant of {@link ColumnChip}
35
+ * for the right-panel Fields list. Same HTML5 drag-and-drop contract (click to
36
+ * select, drag the handle to reorder, × to remove) but laid out as a list row
37
+ * (icon · label · machine name · remove) so it reads like a mainstream
38
+ * low-code field manager rather than a horizontal toolbar.
39
+ */
40
+ export declare function FieldListRow({ index, label, fieldName, fieldType, selected, canEdit, dragging, dropBefore, onSelect, onRemove, onDragStart, onDragEnd, onDragOverRow, onDropRow, }: {
41
+ index: number;
42
+ label: string;
43
+ fieldName?: string;
44
+ fieldType: unknown;
45
+ selected: boolean;
46
+ canEdit: boolean;
47
+ dragging: boolean;
48
+ dropBefore: boolean;
49
+ onSelect: () => void;
50
+ onRemove: () => void;
51
+ onDragStart: () => void;
52
+ onDragEnd: () => void;
53
+ onDragOverRow: () => void;
54
+ onDropRow: () => void;
55
+ }): React.JSX.Element;
56
+ export declare function AddFieldPopover({ fields, usedNames, loading, error, onAdd, }: {
57
+ fields: ObjectFieldInfo[];
58
+ usedNames: Set<string>;
59
+ loading: boolean;
60
+ error: string | null;
61
+ onAdd: (field: ObjectFieldInfo) => void;
62
+ }): React.JSX.Element;