@object-ui/app-shell 6.2.2 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. package/CHANGELOG.md +967 -0
  2. package/README.md +292 -0
  3. package/dist/assistant/assistantBus.d.ts +72 -0
  4. package/dist/assistant/assistantBus.js +133 -0
  5. package/dist/chrome/CommandPalette.d.ts +1 -1
  6. package/dist/chrome/CommandPalette.js +26 -22
  7. package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
  8. package/dist/chrome/ConsoleToaster.d.ts +1 -1
  9. package/dist/chrome/ConsoleToaster.js +3 -1
  10. package/dist/chrome/ErrorBoundary.d.ts +1 -1
  11. package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
  12. package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
  13. package/dist/chrome/LoadingScreen.d.ts +1 -1
  14. package/dist/chrome/LoadingScreen.js +22 -26
  15. package/dist/chrome/RouteFader.d.ts +1 -1
  16. package/dist/chrome/ThemeProvider.d.ts +1 -1
  17. package/dist/components/ManagedByBadge.d.ts +1 -1
  18. package/dist/console/AppContent.d.ts +1 -1
  19. package/dist/console/AppContent.js +170 -37
  20. package/dist/console/ConsoleShell.d.ts +7 -7
  21. package/dist/console/ConsoleShell.js +32 -3
  22. package/dist/console/ai/AiChatPage.d.ts +88 -1
  23. package/dist/console/ai/AiChatPage.js +743 -66
  24. package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
  25. package/dist/console/ai/ConversationsSidebar.js +149 -34
  26. package/dist/console/ai/LiveCanvas.d.ts +22 -0
  27. package/dist/console/ai/LiveCanvas.js +78 -0
  28. package/dist/console/ai/reconcileTurn.d.ts +8 -0
  29. package/dist/console/ai/reconcileTurn.js +20 -0
  30. package/dist/console/auth/AuthPageLayout.d.ts +1 -1
  31. package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
  32. package/dist/console/auth/LoginPage.d.ts +1 -1
  33. package/dist/console/auth/RegisterPage.d.ts +1 -1
  34. package/dist/console/auth/RegisterPage.js +23 -3
  35. package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
  36. package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
  37. package/dist/console/home/AppCard.d.ts +1 -1
  38. package/dist/console/home/AppCard.js +6 -12
  39. package/dist/console/home/HomeAppsStrip.d.ts +8 -0
  40. package/dist/console/home/HomeAppsStrip.js +61 -0
  41. package/dist/console/home/HomeLayout.d.ts +1 -1
  42. package/dist/console/home/HomeLayout.js +3 -1
  43. package/dist/console/home/HomePage.d.ts +1 -2
  44. package/dist/console/home/HomePage.js +149 -21
  45. package/dist/console/home/HomeRail.d.ts +22 -0
  46. package/dist/console/home/HomeRail.js +62 -0
  47. package/dist/console/home/QuickActions.d.ts +1 -1
  48. package/dist/console/home/QuickActions.js +3 -11
  49. package/dist/console/home/RecentApps.d.ts +1 -1
  50. package/dist/console/home/RecentApps.js +2 -2
  51. package/dist/console/home/StarredApps.d.ts +1 -1
  52. package/dist/console/home/StarredApps.js +2 -2
  53. package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
  54. package/dist/console/marketplace/InstalledListWidget.js +93 -0
  55. package/dist/console/marketplace/MarkdownText.d.ts +1 -1
  56. package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
  57. package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
  58. package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
  59. package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
  60. package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
  61. package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
  62. package/dist/console/marketplace/MarketplacePage.js +60 -3
  63. package/dist/console/marketplace/PackageIcon.d.ts +1 -1
  64. package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
  65. package/dist/console/marketplace/PluginDisclosure.js +38 -0
  66. package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
  67. package/dist/console/marketplace/marketplaceApi.js +254 -1
  68. package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
  69. package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
  70. package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
  71. package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
  72. package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
  73. package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
  74. package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
  75. package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
  76. package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
  77. package/dist/context/CommandPaletteProvider.d.ts +44 -0
  78. package/dist/context/CommandPaletteProvider.js +71 -0
  79. package/dist/context/FavoritesProvider.d.ts +1 -1
  80. package/dist/context/NavigationContext.d.ts +1 -1
  81. package/dist/context/RecentItemsProvider.d.ts +2 -2
  82. package/dist/context/UserStateAdapters.d.ts +1 -1
  83. package/dist/context/index.d.ts +2 -0
  84. package/dist/context/index.js +1 -0
  85. package/dist/hooks/index.d.ts +5 -2
  86. package/dist/hooks/index.js +4 -1
  87. package/dist/hooks/useActionModal.d.ts +53 -0
  88. package/dist/hooks/useActionModal.js +111 -0
  89. package/dist/hooks/useChatConversation.d.ts +107 -4
  90. package/dist/hooks/useChatConversation.js +253 -25
  91. package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
  92. package/dist/hooks/useConsoleActionRuntime.js +560 -0
  93. package/dist/hooks/useConversationList.js +61 -3
  94. package/dist/hooks/useHomeInbox.d.ts +13 -0
  95. package/dist/hooks/useHomeInbox.js +142 -0
  96. package/dist/hooks/useNavPins.js +17 -23
  97. package/dist/hooks/useNavigationSync.d.ts +33 -0
  98. package/dist/hooks/useNavigationSync.js +98 -12
  99. package/dist/hooks/useReconcileOnError.d.ts +40 -0
  100. package/dist/hooks/useReconcileOnError.js +37 -0
  101. package/dist/hooks/useRecordApprovals.d.ts +18 -19
  102. package/dist/hooks/useRecordApprovals.js +24 -40
  103. package/dist/hooks/useResponsiveSidebar.js +14 -5
  104. package/dist/hooks/useSettleSignal.d.ts +19 -0
  105. package/dist/hooks/useSettleSignal.js +20 -0
  106. package/dist/hooks/useTrackRouteAsRecent.js +35 -0
  107. package/dist/hooks/useUrlOverlay.d.ts +62 -0
  108. package/dist/hooks/useUrlOverlay.js +88 -0
  109. package/dist/index.d.ts +16 -7
  110. package/dist/index.js +12 -4
  111. package/dist/layout/ActivityFeed.d.ts +1 -1
  112. package/dist/layout/AppHeader.d.ts +3 -2
  113. package/dist/layout/AppHeader.js +237 -72
  114. package/dist/layout/AppSidebar.d.ts +2 -1
  115. package/dist/layout/AppSidebar.js +26 -46
  116. package/dist/layout/AppSwitcher.d.ts +2 -1
  117. package/dist/layout/AppSwitcher.js +9 -5
  118. package/dist/layout/AuthPageLayout.d.ts +1 -1
  119. package/dist/layout/ConnectionStatus.d.ts +1 -1
  120. package/dist/layout/ConnectionStatus.js +9 -6
  121. package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
  122. package/dist/layout/ConsoleChatbotFab.js +16 -2
  123. package/dist/layout/ConsoleFloatingChatbot.d.ts +32 -2
  124. package/dist/layout/ConsoleFloatingChatbot.js +374 -41
  125. package/dist/layout/ConsoleLayout.d.ts +1 -1
  126. package/dist/layout/ConsoleLayout.js +27 -11
  127. package/dist/layout/ContextSelectors.d.ts +44 -0
  128. package/dist/layout/ContextSelectors.js +218 -0
  129. package/dist/layout/InboxPopover.d.ts +6 -1
  130. package/dist/layout/InboxPopover.js +25 -6
  131. package/dist/layout/LocaleSwitcher.d.ts +1 -1
  132. package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
  133. package/dist/layout/LocalizedSidebarTrigger.js +15 -0
  134. package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
  135. package/dist/layout/ModeToggle.d.ts +1 -1
  136. package/dist/layout/PageHeader.d.ts +1 -1
  137. package/dist/layout/UnifiedSidebar.d.ts +2 -1
  138. package/dist/layout/UnifiedSidebar.js +116 -15
  139. package/dist/observability/index.d.ts +1 -0
  140. package/dist/observability/index.js +1 -0
  141. package/dist/observability/settleSignal.d.ts +64 -0
  142. package/dist/observability/settleSignal.js +131 -0
  143. package/dist/preview/DraftChangesPanel.d.ts +19 -0
  144. package/dist/preview/DraftChangesPanel.js +114 -0
  145. package/dist/preview/DraftPreviewBar.d.ts +8 -0
  146. package/dist/preview/DraftPreviewBar.js +86 -0
  147. package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
  148. package/dist/preview/PreviewDraftEmptyState.js +47 -0
  149. package/dist/preview/PreviewModeContext.d.ts +57 -0
  150. package/dist/preview/PreviewModeContext.js +99 -0
  151. package/dist/preview/UnpublishedAppBar.d.ts +8 -0
  152. package/dist/preview/UnpublishedAppBar.js +79 -0
  153. package/dist/preview/draftStatus.d.ts +20 -0
  154. package/dist/preview/draftStatus.js +27 -0
  155. package/dist/preview/usePublishAllDrafts.d.ts +18 -0
  156. package/dist/preview/usePublishAllDrafts.js +106 -0
  157. package/dist/providers/AdapterProvider.d.ts +1 -1
  158. package/dist/providers/AdapterProvider.js +6 -1
  159. package/dist/providers/ExpressionProvider.d.ts +1 -1
  160. package/dist/providers/MetadataProvider.d.ts +17 -2
  161. package/dist/providers/MetadataProvider.js +183 -12
  162. package/dist/runtime-config.d.ts +46 -2
  163. package/dist/runtime-config.js +39 -2
  164. package/dist/services/builtinComponents.js +68 -59
  165. package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
  166. package/dist/skeletons/SkeletonDetail.d.ts +1 -1
  167. package/dist/skeletons/SkeletonGrid.d.ts +1 -1
  168. package/dist/utils/appRoute.d.ts +21 -0
  169. package/dist/utils/appRoute.js +25 -0
  170. package/dist/utils/deriveRelatedLists.d.ts +54 -0
  171. package/dist/utils/deriveRelatedLists.js +91 -0
  172. package/dist/utils/index.d.ts +4 -0
  173. package/dist/utils/index.js +3 -0
  174. package/dist/utils/managedByEmptyState.d.ts +8 -1
  175. package/dist/utils/managedByEmptyState.js +13 -7
  176. package/dist/utils/preferLocal.d.ts +18 -0
  177. package/dist/utils/preferLocal.js +24 -0
  178. package/dist/views/ActionConfirmDialog.d.ts +1 -1
  179. package/dist/views/ActionConfirmDialog.js +3 -1
  180. package/dist/views/ActionParamDialog.d.ts +6 -1
  181. package/dist/views/ActionParamDialog.js +9 -3
  182. package/dist/views/ActionResultDialog.d.ts +13 -0
  183. package/dist/views/ActionResultDialog.js +134 -0
  184. package/dist/views/ComponentNavView.d.ts +14 -1
  185. package/dist/views/CreateViewDialog.d.ts +1 -1
  186. package/dist/views/DashboardConfigPanel.d.ts +28 -0
  187. package/dist/views/DashboardConfigPanel.js +81 -0
  188. package/dist/views/DashboardView.d.ts +4 -3
  189. package/dist/views/DashboardView.js +38 -239
  190. package/dist/views/FlowRunner.d.ts +59 -0
  191. package/dist/views/FlowRunner.js +153 -0
  192. package/dist/views/InterfaceListPage.d.ts +49 -0
  193. package/dist/views/InterfaceListPage.js +347 -0
  194. package/dist/views/MetadataInspector.d.ts +2 -2
  195. package/dist/views/ObjectView.d.ts +1 -1
  196. package/dist/views/ObjectView.js +209 -532
  197. package/dist/views/PageView.d.ts +8 -3
  198. package/dist/views/PageView.js +45 -32
  199. package/dist/views/RecordDetailView.d.ts +1 -1
  200. package/dist/views/RecordDetailView.js +363 -148
  201. package/dist/views/RecordFormPage.d.ts +1 -1
  202. package/dist/views/RecordFormPage.js +26 -1
  203. package/dist/views/ReportConfigPanel.d.ts +37 -0
  204. package/dist/views/ReportConfigPanel.js +85 -0
  205. package/dist/views/ReportView.d.ts +1 -1
  206. package/dist/views/ReportView.js +116 -7
  207. package/dist/views/RuntimeDraftBar.d.ts +30 -0
  208. package/dist/views/RuntimeDraftBar.js +112 -0
  209. package/dist/views/SearchResultsPage.d.ts +1 -1
  210. package/dist/views/SearchResultsPage.js +8 -18
  211. package/dist/views/ViewConfigPanel.d.ts +24 -17
  212. package/dist/views/ViewConfigPanel.js +121 -77
  213. package/dist/views/index.d.ts +1 -1
  214. package/dist/views/index.js +1 -1
  215. package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
  216. package/dist/views/metadata-admin/AuditPanel.js +79 -0
  217. package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
  218. package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
  219. package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
  220. package/dist/views/metadata-admin/DirectoryPage.js +113 -24
  221. package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
  222. package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
  223. package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
  224. package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
  225. package/dist/views/metadata-admin/JsonSourceEditor.d.ts +37 -0
  226. package/dist/views/metadata-admin/JsonSourceEditor.js +178 -0
  227. package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
  228. package/dist/views/metadata-admin/LayeredDiff.js +171 -5
  229. package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
  230. package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
  231. package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
  232. package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
  233. package/dist/views/metadata-admin/PackagesPage.js +395 -0
  234. package/dist/views/metadata-admin/PageShell.d.ts +1 -1
  235. package/dist/views/metadata-admin/PageShell.js +9 -4
  236. package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
  237. package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
  238. package/dist/views/metadata-admin/QuickFind.js +6 -3
  239. package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
  240. package/dist/views/metadata-admin/RelatedPanel.js +20 -18
  241. package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
  242. package/dist/views/metadata-admin/ResourceEditPage.js +1223 -60
  243. package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
  244. package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
  245. package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
  246. package/dist/views/metadata-admin/ResourceListPage.js +266 -30
  247. package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
  248. package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
  249. package/dist/views/metadata-admin/SchemaForm.js +559 -49
  250. package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
  251. package/dist/views/metadata-admin/StudioHomePage.js +213 -0
  252. package/dist/views/metadata-admin/anchors.js +237 -24
  253. package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
  254. package/dist/views/metadata-admin/clientValidation.js +169 -0
  255. package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
  256. package/dist/views/metadata-admin/color-variant-field.js +38 -0
  257. package/dist/views/metadata-admin/createDerive.d.ts +75 -0
  258. package/dist/views/metadata-admin/createDerive.js +179 -0
  259. package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
  260. package/dist/views/metadata-admin/dashboard-schema.js +80 -0
  261. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
  262. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
  263. package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
  264. package/dist/views/metadata-admin/datasource/register.js +24 -0
  265. package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
  266. package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
  267. package/dist/views/metadata-admin/default-schemas.js +115 -10
  268. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
  269. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
  270. package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
  271. package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
  272. package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
  273. package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
  274. package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
  275. package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
  276. package/dist/views/metadata-admin/external/api.d.ts +100 -0
  277. package/dist/views/metadata-admin/external/api.js +124 -0
  278. package/dist/views/metadata-admin/i18n.d.ts +1 -0
  279. package/dist/views/metadata-admin/i18n.js +1166 -2
  280. package/dist/views/metadata-admin/index.d.ts +8 -5
  281. package/dist/views/metadata-admin/index.js +12 -2
  282. package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
  283. package/dist/views/metadata-admin/inspector-registry.js +11 -0
  284. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
  285. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
  286. package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
  287. package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
  288. package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
  289. package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
  290. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
  291. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
  292. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
  293. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
  294. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
  295. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +107 -0
  296. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
  297. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +45 -0
  298. package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
  299. package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
  300. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
  301. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
  302. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
  303. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
  304. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
  305. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +140 -0
  306. package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
  307. package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
  308. package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
  309. package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
  310. package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
  311. package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
  312. package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
  313. package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
  314. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
  315. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +54 -0
  316. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
  317. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +330 -0
  318. package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
  319. package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
  320. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
  321. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +160 -0
  322. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
  323. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
  324. package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
  325. package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
  326. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
  327. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
  328. package/dist/views/metadata-admin/inspectors/_shared.d.ts +124 -0
  329. package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
  330. package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
  331. package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
  332. package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
  333. package/dist/views/metadata-admin/inspectors/flow-node-config.js +461 -0
  334. package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
  335. package/dist/views/metadata-admin/inspectors/index.js +45 -0
  336. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
  337. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
  338. package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
  339. package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
  340. package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
  341. package/dist/views/metadata-admin/mergeServerFields.js +56 -0
  342. package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
  343. package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
  344. package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
  345. package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
  346. package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
  347. package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
  348. package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
  349. package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
  350. package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
  351. package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
  352. package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
  353. package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
  354. package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
  355. package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
  356. package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
  357. package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
  358. package/dist/views/metadata-admin/previews/DatasetPreview.js +89 -0
  359. package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
  360. package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
  361. package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
  362. package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
  363. package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
  364. package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
  365. package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
  366. package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +43 -0
  367. package/dist/views/metadata-admin/previews/FlowCanvas.js +328 -0
  368. package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
  369. package/dist/views/metadata-admin/previews/FlowPreview.js +92 -0
  370. package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
  371. package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
  372. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
  373. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +170 -0
  374. package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
  375. package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
  376. package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
  377. package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
  378. package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
  379. package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
  380. package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
  381. package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
  382. package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
  383. package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
  384. package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
  385. package/dist/views/metadata-admin/previews/PagePreview.js +90 -4
  386. package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
  387. package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
  388. package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
  389. package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
  390. package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
  391. package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
  392. package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
  393. package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
  394. package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
  395. package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
  396. package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
  397. package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
  398. package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
  399. package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
  400. package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
  401. package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
  402. package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
  403. package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
  404. package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
  405. package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
  406. package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
  407. package/dist/views/metadata-admin/previews/block-config.js +324 -0
  408. package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
  409. package/dist/views/metadata-admin/previews/block-types.js +110 -0
  410. package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
  411. package/dist/views/metadata-admin/previews/field-types.js +97 -0
  412. package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +88 -0
  413. package/dist/views/metadata-admin/previews/flow-canvas-layout.js +190 -0
  414. package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +88 -0
  415. package/dist/views/metadata-admin/previews/flow-canvas-parts.js +358 -0
  416. package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
  417. package/dist/views/metadata-admin/previews/form-preview.js +29 -0
  418. package/dist/views/metadata-admin/previews/index.js +43 -0
  419. package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
  420. package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
  421. package/dist/views/metadata-admin/previews/object-fields-io.d.ts +109 -0
  422. package/dist/views/metadata-admin/previews/object-fields-io.js +208 -0
  423. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +91 -0
  424. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
  425. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +8 -0
  426. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +113 -0
  427. package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +44 -0
  428. package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +316 -0
  429. package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
  430. package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
  431. package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
  432. package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
  433. package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
  434. package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
  435. package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
  436. package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
  437. package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
  438. package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
  439. package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
  440. package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
  441. package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
  442. package/dist/views/metadata-admin/previews/widget-types.js +40 -0
  443. package/dist/views/metadata-admin/registry.d.ts +140 -19
  444. package/dist/views/metadata-admin/report-schema.d.ts +26 -0
  445. package/dist/views/metadata-admin/report-schema.js +121 -0
  446. package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
  447. package/dist/views/metadata-admin/useMetadata.js +155 -4
  448. package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
  449. package/dist/views/metadata-admin/view-item-normalize.js +68 -0
  450. package/dist/views/metadata-admin/view-schema.d.ts +16 -0
  451. package/dist/views/metadata-admin/view-schema.js +107 -0
  452. package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
  453. package/dist/views/metadata-admin/view-variant-model.js +64 -0
  454. package/dist/views/metadata-admin/widgets.d.ts +89 -1
  455. package/dist/views/metadata-admin/widgets.js +491 -17
  456. package/dist/views/runtime-metadata-persistence.d.ts +78 -0
  457. package/dist/views/runtime-metadata-persistence.js +89 -0
  458. package/dist/views/useOpenRecordList.d.ts +18 -0
  459. package/dist/views/useOpenRecordList.js +36 -0
  460. package/dist/views/userFilterUrlState.d.ts +15 -0
  461. package/dist/views/userFilterUrlState.js +53 -0
  462. package/dist/views/view-config-adapter.d.ts +38 -0
  463. package/dist/views/view-config-adapter.js +80 -0
  464. package/package.json +52 -34
  465. package/dist/views/DesignDrawer.d.ts +0 -28
  466. package/dist/views/DesignDrawer.js +0 -51
  467. package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
  468. package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
@@ -12,10 +12,158 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
12
12
  * @module
13
13
  */
14
14
  import React from 'react';
15
- import { FloatingChatbot, useObjectChat, useAgents, useHitlInChat, } from '@object-ui/plugin-chatbot';
15
+ import { useReconcileOnError } from '../hooks/useReconcileOnError';
16
+ import { FloatingChatbot, useObjectChat, useAgents, useHitlInChat, resolveDefaultAgentName, uiMessagesToChatMessages, publishHealthFromResponse, agentRouteName, } from '@object-ui/plugin-chatbot';
16
17
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Button, ShareDialog, } from '@object-ui/components';
17
- import { Share2 } from 'lucide-react';
18
- import { useChatConversation } from '../hooks';
18
+ import { Share2, SquarePen } from 'lucide-react';
19
+ import { useObjectTranslation } from '@object-ui/i18n';
20
+ import { toast } from 'sonner';
21
+ import { useNavigate, useLocation } from 'react-router-dom';
22
+ import { sanitizeChatMessagesForCache, useChatConversation, writeConversationMessagesCache, } from '../hooks';
23
+ import { useAssistant, requestAssistantReview, emitCanvasInvalidate } from '../assistant/assistantBus';
24
+ import { fetchPendingDraftCount } from '../preview/draftStatus';
25
+ import { getRuntimeConfig } from '../runtime-config';
26
+ import { cloudPricingDeepLink } from '../console/marketplace/marketplaceApi';
27
+ /**
28
+ * Display names for the two built-in platform agents (ADR-0063: `ask` / `build`,
29
+ * bound by surface). The backend ships English labels ("Assistant" / "Builder");
30
+ * we localize the known ones here so the whole surface reads natively. Custom
31
+ * app agents fall back to whatever label the backend provides.
32
+ *
33
+ * Keyed by the FRIENDLY name (alias-group head) so the canonical id
34
+ * (`ask`/`build`) and the legacy alias (`data_chat`/`metadata_assistant`) both
35
+ * resolve — independent of whatever label the backend record carries.
36
+ */
37
+ const PLATFORM_AGENT_LABELS = {
38
+ ask: { zh: '智能助手', en: 'Assistant' },
39
+ build: { zh: '构建助手', en: 'Build assistant' },
40
+ };
41
+ function localizeAgentLabel(isZh, agentName, fallbackLabel) {
42
+ const known = agentName ? PLATFORM_AGENT_LABELS[agentRouteName(agentName)] : undefined;
43
+ if (known)
44
+ return isZh ? known.zh : known.en;
45
+ return fallbackLabel;
46
+ }
47
+ /**
48
+ * Localized UI strings + starter prompts for the floating assistant.
49
+ * Keeps the chat surface in the user's language and gives non-expert users
50
+ * concrete things to click instead of a blank input — the modern AI pattern.
51
+ */
52
+ function buildChatLocale(language, appLabel, agentName, fallbackAgentLabel, objects) {
53
+ const isZh = (language ?? '').toLowerCase().startsWith('zh');
54
+ const agentLabel = localizeAgentLabel(isZh, agentName, fallbackAgentLabel);
55
+ const sampleObjects = objects.slice(0, 2).map((o) => o.label || o.name);
56
+ if (isZh) {
57
+ const suggestions = [
58
+ sampleObjects[0] ? `查询最近创建的${sampleObjects[0]}` : '帮我查询最近的数据',
59
+ sampleObjects[0] ? `统计${sampleObjects[0]}的总数量` : '统计各对象的记录数量',
60
+ sampleObjects[1]
61
+ ? `${sampleObjects[1]}有哪些字段?`
62
+ : '当前应用里有哪些数据对象?',
63
+ ].filter(Boolean);
64
+ return {
65
+ agentLabel,
66
+ labels: {
67
+ emptyTitle: `你好,我是${agentLabel}`,
68
+ emptyDescription: `随时帮你查询和分析「${appLabel}」中的数据。试试下面的问题,或直接输入你的需求。`,
69
+ clear: '清空对话',
70
+ sendHint: '发送',
71
+ agentActivity: '执行过程',
72
+ toolCompleted: '已完成',
73
+ toolRunning: '运行中',
74
+ toolAwaitingApproval: '等待确认',
75
+ toolFailed: '失败',
76
+ toolDetailsHidden: '已隐藏工具参数和原始结果,仅保留过程摘要。',
77
+ copy: '复制',
78
+ copied: '已复制',
79
+ regenerate: '重新生成',
80
+ model: '模型',
81
+ submit: '发送',
82
+ uploadFiles: '上传文件',
83
+ stopResponse: '停止生成',
84
+ trace: '调试 trace',
85
+ viewTrace: '查看调试 trace',
86
+ },
87
+ placeholder: `向${agentLabel}提问…`,
88
+ loadingPlaceholder: '正在加载助手…',
89
+ title: `${appLabel} 智能助手`,
90
+ newChat: '开启新对话',
91
+ share: '分享对话',
92
+ reviewDraft: (n) => `查看 ${n} 项变更`,
93
+ publishDrafts: '发布',
94
+ published: '已发布',
95
+ nextSteps: '下一步',
96
+ planTitle: '方案预览',
97
+ planQuestions: '搭建前请确认',
98
+ planAssumptions: '假设',
99
+ planApproveHint: '回复以确认或调整该方案。',
100
+ planApprove: '开始搭建',
101
+ planAdjust: '调整方案',
102
+ planApproveMessage: '就按这个方案搭建吧。',
103
+ planApproveDefaultsMessage: '就按你的合理假设直接搭建,未决问题用默认即可。',
104
+ planAnswer: (question, option) => `关于「${question}」,我选择「${option}」。`,
105
+ publishOk: '已发布,对象已生效。',
106
+ publishFailed: '发布失败',
107
+ seedWarn: '已发布,但部分示例数据未能载入。',
108
+ openBuiltApp: '打开应用',
109
+ suggestions,
110
+ };
111
+ }
112
+ const suggestions = [
113
+ sampleObjects[0] ? `Show the latest ${sampleObjects[0]}` : 'Show my most recent records',
114
+ sampleObjects[0] ? `How many ${sampleObjects[0]} are there?` : 'Count records by status',
115
+ sampleObjects[1]
116
+ ? `What fields does ${sampleObjects[1]} have?`
117
+ : 'What data can I work with here?',
118
+ ].filter(Boolean);
119
+ return {
120
+ agentLabel,
121
+ labels: {
122
+ emptyTitle: `Hi, I'm ${agentLabel}`,
123
+ emptyDescription: `I can help you query and analyze your ${appLabel} data. Try a prompt below, or just type your question.`,
124
+ clear: 'Clear',
125
+ sendHint: 'to send',
126
+ agentActivity: 'Agent activity',
127
+ toolCompleted: 'Completed',
128
+ toolRunning: 'Running',
129
+ toolAwaitingApproval: 'Awaiting approval',
130
+ toolFailed: 'Failed',
131
+ toolDetailsHidden: 'Tool inputs and raw results are hidden in this view.',
132
+ copy: 'Copy',
133
+ copied: 'Copied',
134
+ regenerate: 'Regenerate',
135
+ model: 'Model',
136
+ submit: 'Submit',
137
+ uploadFiles: 'Upload files',
138
+ stopResponse: 'Stop response',
139
+ trace: 'trace',
140
+ viewTrace: 'View trace',
141
+ },
142
+ placeholder: `Ask ${agentLabel}...`,
143
+ loadingPlaceholder: 'Loading assistant...',
144
+ title: `${appLabel} Assistant`,
145
+ newChat: 'New chat',
146
+ share: 'Share conversation',
147
+ reviewDraft: (n) => `Review ${n} change${n === 1 ? '' : 's'}`,
148
+ publishDrafts: 'Publish',
149
+ published: 'Published',
150
+ nextSteps: "What's next",
151
+ planTitle: 'Proposed plan',
152
+ planQuestions: 'Confirm before building',
153
+ planAssumptions: 'Assumptions',
154
+ planApproveHint: 'Reply to approve or adjust this plan.',
155
+ planApprove: 'Build it',
156
+ planAdjust: 'Adjust',
157
+ planApproveMessage: 'Looks good — build it as proposed.',
158
+ planApproveDefaultsMessage: 'Build it with your best assumptions; use sensible defaults for the open questions.',
159
+ planAnswer: (question, option) => `For "${question}", go with: ${option}.`,
160
+ publishOk: 'Published — objects are now live.',
161
+ publishFailed: 'Publish failed',
162
+ seedWarn: 'Published, but some sample data failed to load.',
163
+ openBuiltApp: 'Open app',
164
+ suggestions,
165
+ };
166
+ }
19
167
  const DEFAULT_AI_PATH = '/api/v1/ai';
20
168
  function resolveApiBase(explicit) {
21
169
  if (explicit)
@@ -27,53 +175,139 @@ function resolveApiBase(explicit) {
27
175
  const serverUrl = env.VITE_SERVER_URL ?? '';
28
176
  return `${serverUrl.replace(/\/$/, '')}${DEFAULT_AI_PATH}`;
29
177
  }
30
- function ChatbotInner({ appLabel, objects, agents, agentsLoading, agentsError, activeAgent, onAgentChange, chatApi, apiBase, defaultOpen = false, conversationId, initialMessages: persistedMessages, }) {
31
- const objectNames = objects.map((o) => o.label || o.name).join(', ');
32
- // Replay persisted history when present. Suppress the static "welcome"
33
- // bubble in that case showing it above real prior turns is confusing.
178
+ /**
179
+ * Inner component that owns the chat hook. Re-mounted (via `key`) whenever
180
+ * the active agent changes so `useObjectChat`'s first-render mode lock
181
+ * (api vs local) picks up the new endpoint.
182
+ */
183
+ /**
184
+ * Starter prompts tailored to the metadata item currently open in a
185
+ * designer. Returns null when nothing relevant is being edited, so the
186
+ * caller falls back to the generic agent suggestions.
187
+ */
188
+ function buildEditorSuggestions(editor, language) {
189
+ if (!editor || editor.type !== 'object')
190
+ return null;
191
+ const subject = editor.label || editor.name || 'this object';
192
+ const zh = (language ?? '').toLowerCase().startsWith('zh');
193
+ return zh
194
+ ? [`为「${subject}」补充字段`, `为「${subject}」建议校验规则`, '添加一个状态选项字段']
195
+ : [`Add fields to ${subject}`, `Suggest validations for ${subject}`, 'Add a status picklist field'];
196
+ }
197
+ /** Segments after `:appName` that are route prefixes, not object names. */
198
+ const NON_OBJECT_ROUTE_SEGMENTS = new Set([
199
+ 'view', 'record', 'page', 'dashboard', 'design', 'report', 'metadata',
200
+ ]);
201
+ /** Decode a URL segment, falling back to the raw value on malformed input. */
202
+ function safeDecodeSegment(value) {
203
+ try {
204
+ return decodeURIComponent(value);
205
+ }
206
+ catch {
207
+ return value;
208
+ }
209
+ }
210
+ /**
211
+ * Derive the object (and record) the user is currently viewing from the
212
+ * console URL, so the agent can act on "this object" without the user
213
+ * restating it. Mirrors the URL layout parsed by `useTrackRouteAsRecent`:
214
+ *
215
+ * /apps/:appName/:objectName
216
+ * /apps/:appName/:objectName/:recordId
217
+ * /apps/:appName/:objectName/new
218
+ *
219
+ * Tolerates an optional shell prefix (e.g. `/_console`) by locating the
220
+ * `apps` segment dynamically. Returns an empty object when the path isn't an
221
+ * object route (dashboard/page/report/metadata) or the segment doesn't match
222
+ * a known object in the current app.
223
+ */
224
+ function resolveCurrentRouteObject(pathname, objects) {
225
+ const parts = pathname.split('/').filter(Boolean);
226
+ const appsIdx = parts.indexOf('apps');
227
+ // Need at least [apps, appName, objectName].
228
+ if (appsIdx === -1 || parts.length < appsIdx + 3)
229
+ return {};
230
+ const objectSeg = safeDecodeSegment(parts[appsIdx + 2]);
231
+ if (NON_OBJECT_ROUTE_SEGMENTS.has(objectSeg))
232
+ return {};
233
+ if (!objects.some((o) => o.name === objectSeg))
234
+ return {};
235
+ const recordSeg = parts[appsIdx + 3] ? safeDecodeSegment(parts[appsIdx + 3]) : undefined;
236
+ const recordId = recordSeg && recordSeg !== 'new' ? recordSeg : undefined;
237
+ return { objectName: objectSeg, ...(recordId ? { recordId } : {}) };
238
+ }
239
+ function ChatbotInner({ appLabel, appName, objects, agents, agentsLoading, activeAgent, onAgentChange, showAgentPicker, chatApi, apiBase, defaultOpen = false, conversationId, initialMessages: persistedMessages, }) {
240
+ const { language } = useObjectTranslation();
241
+ const navigate = useNavigate();
242
+ const location = useLocation();
243
+ // The object/record the user is currently viewing in the runtime console,
244
+ // derived from the route. Lets the agent answer "analyse this object" and
245
+ // scope data queries to the open page without the user naming it.
246
+ const currentRouteObject = React.useMemo(() => resolveCurrentRouteObject(location.pathname, objects), [location.pathname, objects]);
247
+ // What the user is currently editing in a designer (if any). Merged into
248
+ // the agent context so "add a priority field" acts on the open object,
249
+ // and drives context-aware starter suggestions.
250
+ const { editor } = useAssistant();
251
+ // Replay persisted history when present.
34
252
  const hydratedHistory = React.useMemo(() => {
35
253
  if (!persistedMessages || persistedMessages.length === 0)
36
254
  return [];
37
- return persistedMessages.map((m) => ({
38
- id: m.id,
39
- role: m.role,
40
- content: m.parts.map((p) => p.text).join(''),
41
- }));
255
+ return uiMessagesToChatMessages(persistedMessages);
42
256
  }, [persistedMessages]);
43
257
  const activeAgentLabel = React.useMemo(() => {
44
258
  const found = agents.find((a) => a.name === activeAgent);
45
259
  return found?.label ?? activeAgent ?? appLabel;
46
260
  }, [agents, activeAgent, appLabel]);
47
- const welcomeContent = activeAgent
48
- ? `Hello! I'm **${activeAgentLabel}**, your ${appLabel} assistant. How can I help you today?`
49
- : `Hello! I'm your **${appLabel}** assistant. ${agentsError ? '(Backend unreachable running in offline demo mode.)' : ''}`;
50
- const { messages, isLoading, error, sendMessage, stop, reload, clear, } = useObjectChat({
261
+ // Localized labels, placeholder, title and contextual starter prompts.
262
+ const locale = React.useMemo(() => buildChatLocale(language, appLabel, activeAgent, activeAgentLabel, objects), [language, appLabel, activeAgent, activeAgentLabel, objects]);
263
+ // When a designer is open, prefer starter prompts about that item.
264
+ const editorSuggestions = React.useMemo(() => buildEditorSuggestions(editor, language), [editor, language]);
265
+ // ADR-0013 D2: reconcile a stream-transport failure instead of blindly
266
+ // retrying. Shared across chat surfaces — see useReconcileOnError.
267
+ const { errorSuppressed, handleChatError, setMessagesRef, resetSuppression } = useReconcileOnError({ chatApi, conversationId });
268
+ const { messages, isLoading, error, sendMessage, stop, reload, clear, setMessages, } = useObjectChat({
51
269
  api: chatApi,
52
270
  conversationId,
271
+ onError: handleChatError,
53
272
  body: {
54
273
  context: {
55
274
  activeApp: appLabel,
275
+ appName,
56
276
  objects: objects.map((o) => ({ name: o.name, label: o.label })),
57
277
  agentName: activeAgent,
278
+ // Publish posture, so the agent's narration matches reality (an
279
+ // auto-published build is live, not "to publish").
280
+ autoPublishAiBuilds: getRuntimeConfig().features.autoPublishAiBuilds,
281
+ // The object/record currently open in the runtime console — the
282
+ // backend injects its schema and scopes data queries to it, so
283
+ // "analyse this object" works without the user naming it.
284
+ ...(currentRouteObject.objectName ? { objectName: currentRouteObject.objectName } : {}),
285
+ ...(currentRouteObject.recordId ? { recordId: currentRouteObject.recordId } : {}),
286
+ // The metadata item currently open in a designer, so the agent
287
+ // can act on "this object/view/…" without the user restating it.
288
+ ...(editor ? { editing: editor } : {}),
58
289
  },
59
290
  },
60
- initialMessages: hydratedHistory.length > 0
61
- ? hydratedHistory
62
- : [
63
- {
64
- id: 'welcome',
65
- role: 'assistant',
66
- content: welcomeContent,
67
- },
68
- ],
291
+ // Start empty so the modern empty-state + starter prompts render. We no
292
+ // longer inject a synthetic "welcome" bubble — the agent identity now
293
+ // lives in the empty-state title, matching mainstream AI tools.
294
+ initialMessages: hydratedHistory,
69
295
  // Local-mode fallback: only used when `chatApi` is undefined (no agent
70
296
  // resolved yet, or no backend available). Keeps the UI usable.
71
297
  autoResponse: !chatApi,
72
- autoResponseText: objectNames
73
- ? `I can help you work with ${objectNames}. What would you like to do?`
298
+ autoResponseText: objects.length > 0
299
+ ? `I can help you work with ${objects
300
+ .map((o) => o.label || o.name)
301
+ .join(', ')}. What would you like to do?`
74
302
  : "Thanks for your message! I'm here to help you navigate and manage your data.",
75
303
  autoResponseDelay: 600,
76
304
  });
305
+ React.useEffect(() => {
306
+ setMessagesRef.current = setMessages;
307
+ }, [setMessages]);
308
+ React.useEffect(() => {
309
+ writeConversationMessagesCache(conversationId, sanitizeChatMessagesForCache(messages));
310
+ }, [conversationId, messages]);
77
311
  // HITL bridge — turns the pending-approval tool result envelope from the
78
312
  // framework's action-tools.ts into inline approve/reject buttons that talk
79
313
  // directly to /api/v1/ai/pending-actions/:id/{approve,reject}. After a
@@ -83,40 +317,137 @@ function ChatbotInner({ appLabel, objects, agents, agentsLoading, agentsError, a
83
317
  messages: messages,
84
318
  apiBase,
85
319
  continueConversation: (prompt) => {
320
+ resetSuppression();
86
321
  sendMessage(prompt);
87
322
  },
88
323
  });
89
- const headerExtra = agents.length > 0 ? (_jsxs(Select, { value: activeAgent, onValueChange: onAgentChange, disabled: agentsLoading, children: [_jsx(SelectTrigger, { className: "h-7 w-[180px] text-xs", "data-testid": "floating-chatbot-agent-picker", children: _jsx(SelectValue, { placeholder: "Choose agent..." }) }), _jsx(SelectContent, { align: "end", children: agents.map((agent) => (_jsxs(SelectItem, { value: agent.name, className: "text-xs", children: [_jsx("span", { className: "font-medium", children: agent.label }), agent.description ? (_jsx("span", { className: "block text-muted-foreground text-[10px] truncate max-w-[220px]", children: agent.description })) : null] }, agent.name))) })] })) : null;
324
+ // Agent switcher deliberately hidden by default. End users get the
325
+ // single agent bound to their app (Studio → metadata_assistant, others
326
+ // → data_chat) and are never asked to choose. Only surfaces when the
327
+ // host explicitly opts in AND there is more than one agent to pick.
328
+ const headerExtra = showAgentPicker && agents.length > 1 ? (_jsxs(Select, { value: activeAgent, onValueChange: onAgentChange, disabled: agentsLoading, children: [_jsx(SelectTrigger, { className: "h-7 w-[180px] text-xs", "data-testid": "floating-chatbot-agent-picker", children: _jsx(SelectValue, { placeholder: "Choose agent..." }) }), _jsx(SelectContent, { align: "end", children: agents.map((agent) => (_jsxs(SelectItem, { value: agent.name, className: "text-xs", children: [_jsx("span", { className: "font-medium", children: agent.label }), agent.description ? (_jsx("span", { className: "block text-muted-foreground text-[10px] truncate max-w-[220px]", children: agent.description })) : null] }, agent.name))) })] })) : null;
90
329
  // Share-link control. Sits to the left of the panel's built-in
91
330
  // fullscreen / close buttons so users can mint a public link without
92
331
  // jumping out to the full `/ai/:id` page.
93
332
  const [shareOpen, setShareOpen] = React.useState(false);
94
333
  const restApiBase = React.useMemo(() => apiBase.replace(/\/v1\/ai$/, '').replace(/\/ai$/, '') || '/api', [apiBase]);
95
- const headerActions = conversationId ? (_jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7", "aria-label": "Share conversation", "data-testid": "floating-chatbot-share", onClick: () => setShareOpen(true), children: _jsx(Share2, { className: "h-4 w-4" }) })) : null;
96
- return (_jsxs(_Fragment, { children: [_jsx(FloatingChatbot, { floatingConfig: {
334
+ const headerActions = (_jsxs(_Fragment, { children: [messages.length > 0 ? (_jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7", "aria-label": locale.newChat, title: locale.newChat, "data-testid": "floating-chatbot-new", onClick: clear, children: _jsx(SquarePen, { className: "h-4 w-4" }) })) : null, conversationId ? (_jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7", "aria-label": locale.share, title: locale.share, "data-testid": "floating-chatbot-share", onClick: () => setShareOpen(true), children: _jsx(Share2, { className: "h-4 w-4" }) })) : null] }));
335
+ return (_jsxs(_Fragment, { children: [_jsx(FloatingChatbot, { onUpgrade: () => window.open(cloudPricingDeepLink(), '_blank', 'noopener,noreferrer'), floatingConfig: {
97
336
  position: 'bottom-right',
98
337
  defaultOpen,
99
338
  panelWidth: 420,
100
339
  panelHeight: 560,
101
- title: `${appLabel} Assistant`,
340
+ title: locale.title,
102
341
  triggerSize: 56,
103
- }, headerExtra: headerExtra, headerActions: headerActions, messages: messages, placeholder: activeAgent
104
- ? `Ask ${activeAgentLabel}...`
342
+ }, headerExtra: headerExtra, headerActions: headerActions, messages: messages, labels: locale.labels, showAvatars: true, hideClearBar: true, assistantAvatarFallback: locale.agentLabel, suggestions: messages.length === 0 ? (editorSuggestions ?? locale.suggestions) : undefined, placeholder: activeAgent
343
+ ? locale.placeholder
105
344
  : agentsLoading
106
- ? 'Loading agents...'
107
- : 'Ask anything...', onSendMessage: (content) => sendMessage(content), onClear: clear, onStop: isLoading ? stop : undefined, onReload: reload, isLoading: isLoading, error: error, enableMarkdown: true, onToolApprove: hitl.decide, toolDecisions: hitl.decisions, toolApproveLabel: "Approve & run", toolDenyLabel: "Reject", toolDenyReason: "Operator rejected from chat" }), conversationId && (_jsx(ShareDialog, { open: shareOpen, onOpenChange: setShareOpen, objectName: "ai_conversations", recordId: conversationId, recordLabel: "this conversation", apiBase: restApiBase }))] }));
345
+ ? locale.loadingPlaceholder
346
+ : locale.placeholder, onSendMessage: (content) => { resetSuppression(); sendMessage(content); }, onClear: clear, onStop: isLoading ? stop : undefined, onReload: reload, isLoading: isLoading, error: errorSuppressed ? undefined : error, enableMarkdown: true, onToolApprove: hitl.decide, toolDecisions: hitl.decisions, toolApproveLabel: "Approve & run", toolDenyLabel: "Reject", toolDenyReason: "Operator rejected from chat", onReviewDraft: (items) => {
347
+ // ADR-0033 Phase B: open the first drafted item in the designer's
348
+ // review/diff. The remaining items stay drafted and surface their
349
+ // own review when opened. The host navigator (AppContent) knows the
350
+ // app base and performs the routing.
351
+ if (items[0])
352
+ requestAssistantReview(items[0]);
353
+ }, toolReviewLabel: locale.reviewDraft,
354
+ // Build-tree "Open app": jump straight into the app the agent just
355
+ // built (the panel only shows this once the build reports done).
356
+ onOpenBuiltApp: (appName) => navigate(`/apps/${encodeURIComponent(appName)}`), openBuiltAppLabel: locale.openBuiltApp,
357
+ // ADR-0037: see the drafted app as-if-published before Publish — same
358
+ // route, draft overlay, watermark bar on top.
359
+ onPreviewDraftApp: (appName, opts) => navigate(
360
+ // ADR-0045: a materialized build is a REAL (unlisted) app — open it
361
+ // directly; the UnpublishedAppBar narrates. Drafts keep the overlay.
362
+ opts?.materialized
363
+ ? `/apps/${encodeURIComponent(appName)}`
364
+ : `/apps/${encodeURIComponent(appName)}?preview=draft`),
365
+ // ADR-0037 P2.5: announce drafted artifacts so an open ?preview=draft
366
+ // page (same document) drops its cache and refetches the new draft.
367
+ onDraftArtifacts: (artifacts) => {
368
+ for (const a of artifacts)
369
+ emitCanvasInvalidate(a);
370
+ },
371
+ // Live lifecycle truth for draft cards: the server's pending count per
372
+ // package, so reloaded conversations show Published/Publish honestly.
373
+ fetchPendingDraftCount: fetchPendingDraftCount, onPublishDrafts: async (packageId) => {
374
+ // ADR-0033 — promote the conversation's staged drafts to live in one
375
+ // click (the human still confirms here). Mirrors PackagesPage's
376
+ // publish-drafts call; cookie-authenticated like the rest of the SPA.
377
+ try {
378
+ const res = await fetch(`/api/v1/packages/${encodeURIComponent(packageId)}/publish-drafts`, {
379
+ method: 'POST',
380
+ credentials: 'include',
381
+ headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
382
+ body: '{}',
383
+ });
384
+ const payload = await res.json().catch(() => null);
385
+ if (!res.ok || payload?.success === false) {
386
+ throw new Error(payload?.error?.message || `HTTP ${res.status}`);
387
+ }
388
+ const failed = payload?.data?.failedCount ?? payload?.failedCount ?? 0;
389
+ if (failed)
390
+ throw new Error(String(failed));
391
+ // The protocol materializes published `seed` rows and reports under
392
+ // `seedApplied` — a data problem never fails the publish, so it
393
+ // must be surfaced HERE or the user lands on an app with silently
394
+ // empty tables (the staging "No rows" incident).
395
+ const seedApplied = payload?.data?.seedApplied ?? payload?.seedApplied;
396
+ if (seedApplied && seedApplied.success === false) {
397
+ toast.warning(locale.seedWarn, {
398
+ description: seedApplied.error ??
399
+ (Array.isArray(seedApplied.errors) && seedApplied.errors.length
400
+ ? String(seedApplied.errors[0])
401
+ : undefined),
402
+ });
403
+ }
404
+ else {
405
+ toast.success(locale.publishOk);
406
+ }
407
+ // Publish & Open: land the user ON the thing they just built rather
408
+ // than leaving them on an empty home with only a toast. Prefer the
409
+ // published App (a full navigable surface); the bare-object case has
410
+ // no app to open yet, so the toast is the only feedback there.
411
+ const published = payload?.data?.published ?? payload?.published ?? [];
412
+ const app = published.find((p) => p?.type === 'app' && p?.name);
413
+ if (app?.name)
414
+ navigate(`/apps/${encodeURIComponent(app.name)}`);
415
+ // ADR-0038 L3 — hand the runtime verification (seedApplied +
416
+ // probes) back to the chat so the Published card grows a
417
+ // build-health line instead of claiming bare success.
418
+ return { ok: true, health: publishHealthFromResponse(payload) };
419
+ }
420
+ catch (e) {
421
+ toast.error(locale.publishFailed, {
422
+ description: e instanceof Error ? e.message : undefined,
423
+ });
424
+ return false;
425
+ }
426
+ }, publishDraftsLabel: locale.publishDrafts, nextStepsLabel: locale.nextSteps, planTitleLabel: locale.planTitle, planQuestionsLabel: locale.planQuestions, planAssumptionsLabel: locale.planAssumptions, planApproveHintLabel: locale.planApproveHint, planApproveLabel: locale.planApprove, planAdjustLabel: locale.planAdjust, planApproveMessage: locale.planApproveMessage, planApproveDefaultsMessage: locale.planApproveDefaultsMessage, planAnswerMessage: locale.planAnswer, publishedLabel: locale.published,
427
+ // Self-use "magic moment": when the plan enables it, auto-publish the
428
+ // drafted app the instant the agent finishes — the success path above
429
+ // then navigates straight to the live app, so "build" lands the user on
430
+ // a populated, running app with no manual Publish click.
431
+ autoPublishDrafts: getRuntimeConfig().features.autoPublishAiBuilds }), conversationId && (_jsx(ShareDialog, { open: shareOpen, onOpenChange: setShareOpen, objectName: "ai_conversations", recordId: conversationId, recordLabel: "this conversation", apiBase: restApiBase }))] }));
108
432
  }
109
- export default function ConsoleFloatingChatbot({ appLabel, objects, apiBase: apiBaseProp, defaultAgent: defaultAgentProp, defaultOpen = false, userId, }) {
433
+ export default function ConsoleFloatingChatbot({ appLabel, appName, objects, apiBase: apiBaseProp, defaultAgent: defaultAgentProp, showAgentPicker: showAgentPickerProp, defaultOpen = false, userId, }) {
110
434
  const apiBase = React.useMemo(() => resolveApiBase(apiBaseProp), [apiBaseProp]);
111
435
  const env = import.meta.env ?? {};
112
436
  const envDefaultAgent = env.VITE_AI_DEFAULT_AGENT;
437
+ // Power-user / admin escape hatch: force the picker on globally without
438
+ // touching app metadata.
439
+ const showAgentPicker = showAgentPickerProp ?? env.VITE_AI_SHOW_AGENT_PICKER === 'true';
113
440
  const { agents, isLoading: agentsLoading, error: agentsError } = useAgents({ apiBase });
114
441
  const [activeAgent, setActiveAgent] = React.useState(undefined);
115
442
  React.useEffect(() => {
116
443
  if (!activeAgent && agents.length > 0) {
444
+ // Mirror the backend's resolution: app.defaultAgent → data_chat →
445
+ // first agent. This binds the right copilot per app instead of
446
+ // landing on whichever agent happens to be first in the catalog.
117
447
  const preferred = defaultAgentProp ?? envDefaultAgent;
118
- const match = preferred ? agents.find((a) => a.name === preferred) : undefined;
119
- setActiveAgent((match ?? agents[0]).name);
448
+ const resolved = resolveDefaultAgentName(agents, preferred);
449
+ if (resolved)
450
+ setActiveAgent(resolved);
120
451
  }
121
452
  }, [agents, activeAgent, defaultAgentProp, envDefaultAgent]);
122
453
  const chatApi = activeAgent
@@ -124,14 +455,16 @@ export default function ConsoleFloatingChatbot({ appLabel, objects, apiBase: api
124
455
  : undefined;
125
456
  // Server-backed conversation. Scoped by agent so each agent gets its own
126
457
  // persistent history. Hook is inert until `userId` is provided; without it
127
- // the FAB continues to work in local-only mode (no persistence).
458
+ // the FAB continues to work in local-only mode (no persistence). Gate `userId`
459
+ // on the agent being resolved so the conversation binds to the right scope
460
+ // from the first resolve (not a scopeless one during the catalog load).
128
461
  const { conversationId, initialMessages } = useChatConversation({
129
- userId,
462
+ userId: activeAgent ? userId : undefined,
130
463
  scope: activeAgent,
131
464
  apiBase,
132
465
  });
133
466
  // `key` forces a clean remount whenever the chat endpoint OR the resolved
134
467
  // conversation id changes — required because `useObjectChat` locks its mode
135
468
  // (api vs local) and its `conversationId` on first render.
136
- return (_jsx(ChatbotInner, { appLabel: appLabel, objects: objects, agents: agents, agentsLoading: agentsLoading, agentsError: agentsError, activeAgent: activeAgent, onAgentChange: setActiveAgent, chatApi: chatApi, apiBase: apiBase, defaultOpen: defaultOpen, conversationId: conversationId, initialMessages: initialMessages }, `${chatApi ?? 'local'}:${conversationId ?? 'pending'}`));
469
+ return (_jsx(ChatbotInner, { appLabel: appLabel, appName: appName, objects: objects, agents: agents, agentsLoading: agentsLoading, agentsError: agentsError, activeAgent: activeAgent, onAgentChange: setActiveAgent, showAgentPicker: showAgentPicker, chatApi: chatApi, apiBase: apiBase, defaultOpen: defaultOpen, conversationId: conversationId, initialMessages: initialMessages }, `${chatApi ?? 'local'}:${conversationId ?? 'pending'}`));
137
470
  }
@@ -23,5 +23,5 @@ interface ConsoleLayoutProps {
23
23
  userId?: string;
24
24
  }
25
25
  /** Floating chatbot wired with useObjectChat for demo auto-response */
26
- export declare function ConsoleLayout({ children, activeAppName, activeApp, onAppChange, objects, connectionState, userId, }: ConsoleLayoutProps): import("react/jsx-runtime").JSX.Element;
26
+ export declare function ConsoleLayout({ children, activeAppName, activeApp, onAppChange, objects, connectionState, userId, }: ConsoleLayoutProps): React.JSX.Element;
27
27
  export {};
@@ -11,16 +11,21 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
11
11
  import { useEffect } from 'react';
12
12
  import { AppShell } from '@object-ui/layout';
13
13
  import { useDiscovery } from '@object-ui/react';
14
+ import { isBuildAgent } from '@object-ui/plugin-chatbot';
14
15
  // Lightweight FAB stub — the heavy chat chunk graph (plugin-chatbot,
15
16
  // shiki, streamdown, mermaid, @ai-sdk, ~20MB) only downloads on first
16
17
  // hover/click. See ConsoleChatbotFab.tsx.
17
18
  import { ConsoleChatbotFab } from './ConsoleChatbotFab';
19
+ import { DraftPreviewBar } from '../preview/DraftPreviewBar';
20
+ import { UnpublishedAppBar } from '../preview/UnpublishedAppBar';
18
21
  import { UnifiedSidebar } from './UnifiedSidebar';
19
22
  import { AppHeader } from './AppHeader';
20
23
  import { MobileViewSwitcherProvider } from './MobileViewSwitcherContext';
21
24
  import { useResponsiveSidebar } from '../hooks/useResponsiveSidebar';
22
25
  import { useNavigationContext } from '../context/NavigationContext';
26
+ import { CommandPaletteProvider } from '../context/CommandPaletteProvider';
23
27
  import { resolveI18nLabel } from '../utils';
28
+ import { getProductName, getRuntimeConfig } from '../runtime-config';
24
29
  /** Inner component that can access SidebarProvider context */
25
30
  function ConsoleLayoutInner({ children }) {
26
31
  useResponsiveSidebar();
@@ -35,21 +40,32 @@ export function ConsoleLayout({ children, activeAppName, activeApp, onAppChange,
35
40
  // AI as disabled (e.g. framework started without `--preset full`).
36
41
  const aiBaseUrlConfigured = Boolean(import.meta.env?.VITE_AI_BASE_URL);
37
42
  const showChatbot = isAiEnabled || aiBaseUrlConfigured;
43
+ // AI Studio (AI-driven metadata authoring / "online development") can be
44
+ // turned off per deployment. When off, suppress the metadata-authoring
45
+ // assistant so the chatbot falls back to the generic data assistant — the
46
+ // generic data-chat experience stays available.
47
+ const aiStudioEnabled = getRuntimeConfig().features.aiStudio !== false;
48
+ // Alias-aware: the build/authoring agent is `build` (new) or
49
+ // `metadata_assistant` (legacy). When AI Studio is off, drop it so the FAB
50
+ // falls back to the generic data assistant.
51
+ const effectiveDefaultAgent = !aiStudioEnabled && isBuildAgent(activeApp?.defaultAgent)
52
+ ? undefined
53
+ : activeApp?.defaultAgent;
38
54
  const { setContext, setCurrentAppName } = useNavigationContext();
39
55
  // Set navigation context to 'app' when this layout mounts
40
56
  useEffect(() => {
41
57
  setContext('app');
42
58
  setCurrentAppName(activeAppName);
43
59
  }, [setContext, setCurrentAppName, activeAppName]);
44
- return (_jsx(MobileViewSwitcherProvider, { children: _jsxs(AppShell, { sidebar: _jsx(UnifiedSidebar, { activeAppName: activeAppName, onAppChange: onAppChange }), navbar: _jsx(AppHeader, { variant: "app", appName: appLabel, objects: objects, connectionState: connectionState, activeAppName: activeAppName, onAppChange: onAppChange }), className: "!p-0 overflow-y-auto overflow-x-hidden bg-muted/5", branding: activeApp?.branding
45
- ? {
46
- primaryColor: activeApp.branding.primaryColor,
47
- accentColor: activeApp.branding.accentColor,
48
- favicon: activeApp.branding.favicon,
49
- logo: activeApp.branding.logo,
50
- title: activeApp.label
51
- ? `${resolveI18nLabel(activeApp.label)} — ObjectStack Console`
52
- : undefined,
53
- }
54
- : undefined, children: [_jsx(ConsoleLayoutInner, { children: children }), showChatbot && (_jsx(ConsoleChatbotFab, { appLabel: appLabel, objects: objects, userId: userId }))] }) }));
60
+ return (_jsx(CommandPaletteProvider, { children: _jsx(MobileViewSwitcherProvider, { children: _jsxs(AppShell, { sidebar: _jsx(UnifiedSidebar, { activeAppName: activeAppName, onAppChange: onAppChange }), navbar: _jsx(AppHeader, { variant: "app", appName: appLabel, objects: objects, connectionState: connectionState, activeAppName: activeAppName, onAppChange: onAppChange }), className: "!p-0 overflow-y-auto overflow-x-hidden bg-muted/5", branding: activeApp?.branding
61
+ ? {
62
+ primaryColor: activeApp.branding.primaryColor,
63
+ accentColor: activeApp.branding.accentColor,
64
+ favicon: activeApp.branding.favicon,
65
+ logo: activeApp.branding.logo,
66
+ title: activeApp.label
67
+ ? `${resolveI18nLabel(activeApp.label)} — ${getProductName()}`
68
+ : undefined,
69
+ }
70
+ : undefined, children: [_jsxs(ConsoleLayoutInner, { children: [_jsx(DraftPreviewBar, {}), _jsx(UnpublishedAppBar, {}), children] }), showChatbot && (_jsx(ConsoleChatbotFab, { appLabel: appLabel, appName: activeAppName, defaultAgent: effectiveDefaultAgent, objects: objects, userId: userId }))] }) }) }));
55
71
  }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * AppContextSelectors — renders the app-level "scope" dropdowns declared
3
+ * in `App.contextSelectors` (e.g. the Studio package filter) and exposes
4
+ * their current values so the sidebar can feed them into
5
+ * `NavigationRenderer`'s `templateContext.contextValues`.
6
+ *
7
+ * Each selector's value is published under its `id` and referenced by
8
+ * nav items as `{<id>}` (e.g. `{active_package}`), exactly like the
9
+ * built-in `{current_user_id}` / `{current_org_id}` template vars.
10
+ * Selecting an option therefore transparently scopes every child nav
11
+ * item — no per-item wiring required.
12
+ *
13
+ * @module
14
+ */
15
+ import * as React from 'react';
16
+ export interface ContextSelectorFilter {
17
+ key: string;
18
+ op?: 'eq' | 'ne' | 'in' | 'nin';
19
+ value: string | string[];
20
+ }
21
+ export interface ContextSelectorDef {
22
+ id: string;
23
+ label?: unknown;
24
+ icon?: string;
25
+ optionsSource: {
26
+ endpoint: string;
27
+ valueKey?: string;
28
+ labelKey?: string;
29
+ filter?: ContextSelectorFilter[];
30
+ };
31
+ includeAll?: boolean;
32
+ allValue?: string;
33
+ persist?: 'query' | 'session' | 'none';
34
+ placement?: 'sidebar_header' | 'topbar';
35
+ }
36
+ /**
37
+ * Hook: resolves the active values for an app's context selectors and
38
+ * returns a ready-to-render UI element plus the `contextValues` map for
39
+ * `NavigationRenderer`.
40
+ */
41
+ export declare function useAppContextSelectors(appName: string, selectors: ContextSelectorDef[] | undefined, t?: (key: string, options?: any) => string): {
42
+ contextValues: Record<string, string>;
43
+ element: React.ReactNode;
44
+ };