@webiny/app-admin 6.6.0-alpha.0 → 6.6.0-alpha.1

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 (293) hide show
  1. package/base/Admin.js +17 -2
  2. package/base/Admin.js.map +1 -1
  3. package/base/Base/DefaultFieldRenderers.js +17 -2
  4. package/base/Base/DefaultFieldRenderers.js.map +1 -1
  5. package/base/Base/FieldRenderers/AutoCompleteRenderer.d.ts +13 -0
  6. package/base/Base/FieldRenderers/AutoCompleteRenderer.js +29 -0
  7. package/base/Base/FieldRenderers/AutoCompleteRenderer.js.map +1 -0
  8. package/base/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +2 -2
  9. package/base/Base/FieldRenderers/LexicalRenderer.js +10 -6
  10. package/base/Base/FieldRenderers/LexicalRenderer.js.map +1 -1
  11. package/base/Base/FieldRenderers/MultiFilePickerRenderer.js +8 -5
  12. package/base/Base/FieldRenderers/MultiFilePickerRenderer.js.map +1 -1
  13. package/base/Base/FieldRenderers/MultiSelectRenderer.d.ts +15 -0
  14. package/base/Base/FieldRenderers/MultiSelectRenderer.js +31 -0
  15. package/base/Base/FieldRenderers/MultiSelectRenderer.js.map +1 -0
  16. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.d.ts +2 -0
  17. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js +5 -2
  18. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js.map +1 -1
  19. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.d.ts +11 -0
  20. package/base/Base/FieldRenderers/ObjectRenderer/{MultiValueDynamicZone.js → MultiValueDynamicZone/MultiValueDynamicZone.js} +65 -14
  21. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js.map +1 -0
  22. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZonePresenter.d.ts +13 -0
  23. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZonePresenter.js +28 -0
  24. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZonePresenter.js.map +1 -0
  25. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/abstractions.d.ts +15 -0
  26. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/abstractions.js +5 -0
  27. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/abstractions.js.map +1 -0
  28. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/feature.d.ts +1 -0
  29. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/feature.js +11 -0
  30. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/feature.js.map +1 -0
  31. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/index.d.ts +2 -0
  32. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/index.js +2 -0
  33. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.d.ts +1 -1
  34. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js +19 -3
  35. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js.map +1 -1
  36. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +10 -8
  37. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +34 -3
  38. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -1
  39. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +3 -2
  40. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +11 -5
  41. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -1
  42. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +1 -1
  43. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +1 -1
  44. package/base/Base/FieldRenderers/SelectRenderer.d.ts +6 -0
  45. package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
  46. package/base/Base/FieldRenderers/VerticalTabsRenderer.d.ts +2 -2
  47. package/base/Base/Menus.js +4 -4
  48. package/base/Base/Menus.js.map +1 -1
  49. package/base/createRootContainer.js +4 -2
  50. package/base/createRootContainer.js.map +1 -1
  51. package/components/Drawers/DrawerParamsContext.d.ts +6 -0
  52. package/components/Drawers/DrawerParamsContext.js +10 -0
  53. package/components/Drawers/DrawerParamsContext.js.map +1 -0
  54. package/components/Drawers/DrawersContext.d.ts +13 -0
  55. package/components/Drawers/DrawersContext.js +50 -0
  56. package/components/Drawers/DrawersContext.js.map +1 -0
  57. package/components/Drawers/useDrawers.d.ts +2 -0
  58. package/components/Drawers/useDrawers.js +10 -0
  59. package/components/Drawers/useDrawers.js.map +1 -0
  60. package/components/Filters/Filters.js +4 -3
  61. package/components/Filters/Filters.js.map +1 -1
  62. package/components/IconPicker/IconPickerComponent.d.ts +2 -2
  63. package/components/LexicalEditor/LexicalLinkForm.js +3 -0
  64. package/components/LexicalEditor/LexicalLinkForm.js.map +1 -1
  65. package/components/ListView/ListViewBulkActions.d.ts +2 -2
  66. package/components/ListView/ListViewContent.d.ts +2 -2
  67. package/components/ListView/ListViewFilters.d.ts +2 -2
  68. package/components/ListView/index.d.ts +6 -6
  69. package/components/OverlayLayout/OverlayLayout.js +4 -2
  70. package/components/OverlayLayout/OverlayLayout.js.map +1 -1
  71. package/components/OverlayLayout/components/OverlayContent.js +1 -0
  72. package/components/OverlayLayout/components/OverlayContent.js.map +1 -1
  73. package/components/RolesMultiAutocomplete/index.d.ts +4 -2
  74. package/components/SplitView/SplitView.js +1 -1
  75. package/components/SplitView/SplitView.js.map +1 -1
  76. package/components/Table/components/Table/TableInner.d.ts +2 -2
  77. package/components/TeamAutocomplete/index.d.ts +4 -2
  78. package/components/TeamsMultiAutocomplete/index.d.ts +4 -2
  79. package/components/index.d.ts +0 -1
  80. package/components/index.js +0 -1
  81. package/config/AdminConfig/Breadcrumbs.d.ts +42 -0
  82. package/config/AdminConfig/Breadcrumbs.js +24 -0
  83. package/config/AdminConfig/Breadcrumbs.js.map +1 -0
  84. package/config/AdminConfig/Drawer.d.ts +10 -0
  85. package/config/AdminConfig/Drawer.js +19 -0
  86. package/config/AdminConfig/Drawer.js.map +1 -0
  87. package/config/AdminConfig/LexicalTheme/AllowCustomColors.d.ts +5 -0
  88. package/config/AdminConfig/LexicalTheme/AllowCustomColors.js +18 -0
  89. package/config/AdminConfig/LexicalTheme/AllowCustomColors.js.map +1 -0
  90. package/config/AdminConfig/LexicalTheme.d.ts +2 -0
  91. package/config/AdminConfig/LexicalTheme.js +2 -0
  92. package/config/AdminConfig/LexicalTheme.js.map +1 -1
  93. package/config/AdminConfig.d.ts +8 -0
  94. package/config/AdminConfig.js +8 -1
  95. package/config/AdminConfig.js.map +1 -1
  96. package/exports/admin.d.ts +3 -0
  97. package/exports/admin.js +3 -0
  98. package/features/accessManagement/types.d.ts +3 -3
  99. package/features/aiChat/AiChatGateway.d.ts +30 -0
  100. package/features/aiChat/AiChatGateway.js +41 -0
  101. package/features/aiChat/AiChatGateway.js.map +1 -0
  102. package/features/aiChat/AiChatPresenter.d.ts +32 -0
  103. package/features/aiChat/AiChatPresenter.js +220 -0
  104. package/features/aiChat/AiChatPresenter.js.map +1 -0
  105. package/features/aiChat/abstractions.d.ts +124 -0
  106. package/features/aiChat/abstractions.js +6 -0
  107. package/features/aiChat/abstractions.js.map +1 -0
  108. package/features/aiChat/feature.d.ts +3 -0
  109. package/features/aiChat/feature.js +19 -0
  110. package/features/aiChat/feature.js.map +1 -0
  111. package/features/aiChat/index.d.ts +6 -0
  112. package/features/aiChat/index.js +3 -0
  113. package/features/dateFormatter/DefaultDateFormatter.d.ts +8 -0
  114. package/features/dateFormatter/DefaultDateFormatter.js +25 -0
  115. package/features/dateFormatter/DefaultDateFormatter.js.map +1 -0
  116. package/features/dateFormatter/abstractions.d.ts +13 -0
  117. package/features/dateFormatter/abstractions.js +5 -0
  118. package/features/dateFormatter/abstractions.js.map +1 -0
  119. package/features/dateFormatter/feature.d.ts +3 -0
  120. package/features/dateFormatter/feature.js +17 -0
  121. package/features/dateFormatter/feature.js.map +1 -0
  122. package/features/dateFormatter/index.d.ts +4 -0
  123. package/features/dateFormatter/index.js +4 -0
  124. package/features/dateFormatter/useDateFormatter.d.ts +5 -0
  125. package/features/dateFormatter/useDateFormatter.js +8 -0
  126. package/features/dateFormatter/useDateFormatter.js.map +1 -0
  127. package/features/featureFlags/FeatureFlagsGateway.d.ts +10 -0
  128. package/features/featureFlags/FeatureFlagsGateway.js +40 -0
  129. package/features/featureFlags/FeatureFlagsGateway.js.map +1 -0
  130. package/features/featureFlags/FeatureFlagsService.d.ts +16 -0
  131. package/features/featureFlags/FeatureFlagsService.js +64 -0
  132. package/features/featureFlags/FeatureFlagsService.js.map +1 -0
  133. package/features/featureFlags/abstractions.d.ts +19 -0
  134. package/features/featureFlags/abstractions.js +6 -0
  135. package/features/featureFlags/abstractions.js.map +1 -0
  136. package/features/featureFlags/feature.d.ts +3 -0
  137. package/features/featureFlags/feature.js +19 -0
  138. package/features/featureFlags/feature.js.map +1 -0
  139. package/features/formModel/Field.js +10 -0
  140. package/features/formModel/Field.js.map +1 -1
  141. package/features/formModel/FieldBuilder.js +1 -1
  142. package/features/formModel/FieldBuilder.js.map +1 -1
  143. package/features/formModel/FieldBuilder.test.js +4 -4
  144. package/features/formModel/FieldBuilder.test.js.map +1 -1
  145. package/features/formModel/FormErrors.d.ts +2 -2
  146. package/features/formModel/FormModel.test.js +50 -0
  147. package/features/formModel/FormModel.test.js.map +1 -1
  148. package/features/formModel/FormView.d.ts +8 -4
  149. package/features/formModel/PresenterErrors.d.ts +2 -2
  150. package/features/formModel/demo/FormModelDemo.d.ts +2 -2
  151. package/features/formModel/renderers.d.ts +1 -0
  152. package/features/formModel/renderers.js +1 -0
  153. package/features/notifications/NotificationsRenderer.d.ts +2 -2
  154. package/features/security/AuthenticationContext/ApiStreamClientDecorator.d.ts +22 -0
  155. package/features/security/AuthenticationContext/ApiStreamClientDecorator.js +32 -0
  156. package/features/security/AuthenticationContext/ApiStreamClientDecorator.js.map +1 -0
  157. package/features/security/AuthenticationContext/feature.js +2 -0
  158. package/features/security/AuthenticationContext/feature.js.map +1 -1
  159. package/features/slugify/DefaultSlugify.d.ts +8 -0
  160. package/features/slugify/DefaultSlugify.js +20 -0
  161. package/features/slugify/DefaultSlugify.js.map +1 -0
  162. package/features/slugify/abstractions.d.ts +12 -0
  163. package/features/slugify/abstractions.js +5 -0
  164. package/features/slugify/abstractions.js.map +1 -0
  165. package/features/slugify/feature.d.ts +1 -0
  166. package/features/slugify/feature.js +11 -0
  167. package/features/slugify/feature.js.map +1 -0
  168. package/features/slugify/index.d.ts +3 -0
  169. package/features/slugify/index.js +3 -0
  170. package/features/stringFormatter/DefaultStringFormatter.d.ts +17 -0
  171. package/features/stringFormatter/DefaultStringFormatter.js +19 -0
  172. package/features/stringFormatter/DefaultStringFormatter.js.map +1 -0
  173. package/features/stringFormatter/abstractions.d.ts +11 -0
  174. package/features/stringFormatter/abstractions.js +5 -0
  175. package/features/stringFormatter/abstractions.js.map +1 -0
  176. package/features/stringFormatter/feature.d.ts +3 -0
  177. package/features/stringFormatter/feature.js +19 -0
  178. package/features/stringFormatter/feature.js.map +1 -0
  179. package/features/stringFormatter/index.d.ts +4 -0
  180. package/features/stringFormatter/index.js +4 -0
  181. package/features/stringFormatter/useStringFormatter.d.ts +5 -0
  182. package/features/stringFormatter/useStringFormatter.js +8 -0
  183. package/features/stringFormatter/useStringFormatter.js.map +1 -0
  184. package/features/tenancy/ApiStreamClientDecorator.d.ts +16 -0
  185. package/features/tenancy/ApiStreamClientDecorator.js +30 -0
  186. package/features/tenancy/ApiStreamClientDecorator.js.map +1 -0
  187. package/features/tenancy/feature.js +2 -0
  188. package/features/tenancy/feature.js.map +1 -1
  189. package/features/wcp/ReactLicense.d.ts +6 -0
  190. package/features/wcp/ReactLicense.js +18 -0
  191. package/features/wcp/ReactLicense.js.map +1 -1
  192. package/features/wcp/WcpGateway.js +3 -0
  193. package/features/wcp/WcpGateway.js.map +1 -1
  194. package/hooks/index.d.ts +3 -0
  195. package/hooks/index.js +3 -0
  196. package/hooks/useDrawer.d.ts +9 -0
  197. package/hooks/useDrawer.js +19 -0
  198. package/hooks/useDrawer.js.map +1 -0
  199. package/hooks/useHotkeys.js +5 -3
  200. package/hooks/useHotkeys.js.map +1 -1
  201. package/hooks/useOpenDrawer.d.ts +7 -0
  202. package/hooks/useOpenDrawer.js +18 -0
  203. package/hooks/useOpenDrawer.js.map +1 -0
  204. package/hooks/useSnackbar.js.map +1 -1
  205. package/index.d.ts +18 -1
  206. package/index.js +23 -12
  207. package/modules/AccessManagementExtension.js +46 -22
  208. package/modules/AccessManagementExtension.js.map +1 -1
  209. package/package.json +31 -28
  210. package/presentation/accessManagement/SecurityPermissions.js +3 -3
  211. package/presentation/accessManagement/SecurityPermissions.js.map +1 -1
  212. package/presentation/accessManagement/apiKeys/ApiKeysPresenter.d.ts +3 -1
  213. package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js +13 -16
  214. package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js.map +1 -1
  215. package/presentation/accessManagement/apiKeys/components/ApiKeysView.d.ts +2 -2
  216. package/presentation/accessManagement/apiKeys/components/ApiKeysView.js +13 -7
  217. package/presentation/accessManagement/apiKeys/components/ApiKeysView.js.map +1 -1
  218. package/presentation/accessManagement/roles/RolesPresenter.d.ts +3 -1
  219. package/presentation/accessManagement/roles/RolesPresenter.js +11 -14
  220. package/presentation/accessManagement/roles/RolesPresenter.js.map +1 -1
  221. package/presentation/accessManagement/roles/components/RolesView.d.ts +2 -2
  222. package/presentation/accessManagement/roles/components/RolesView.js +10 -6
  223. package/presentation/accessManagement/roles/components/RolesView.js.map +1 -1
  224. package/presentation/accessManagement/teams/TeamsPresenter.d.ts +3 -1
  225. package/presentation/accessManagement/teams/TeamsPresenter.js +11 -14
  226. package/presentation/accessManagement/teams/TeamsPresenter.js.map +1 -1
  227. package/presentation/accessManagement/teams/components/TeamsView.d.ts +2 -2
  228. package/presentation/accessManagement/teams/components/TeamsView.js +10 -6
  229. package/presentation/accessManagement/teams/components/TeamsView.js.map +1 -1
  230. package/presentation/commandPalette/CommandPalettePresenter.d.ts +21 -0
  231. package/presentation/commandPalette/CommandPalettePresenter.js +91 -0
  232. package/presentation/commandPalette/CommandPalettePresenter.js.map +1 -0
  233. package/presentation/commandPalette/abstractions.d.ts +76 -0
  234. package/presentation/commandPalette/abstractions.js +7 -0
  235. package/presentation/commandPalette/abstractions.js.map +1 -0
  236. package/presentation/commandPalette/commands/AskAiCommand.d.ts +25 -0
  237. package/presentation/commandPalette/commands/AskAiCommand.js +33 -0
  238. package/presentation/commandPalette/commands/AskAiCommand.js.map +1 -0
  239. package/presentation/commandPalette/commands/CopyCurrentUrlCommand.d.ts +15 -0
  240. package/presentation/commandPalette/commands/CopyCurrentUrlCommand.js +33 -0
  241. package/presentation/commandPalette/commands/CopyCurrentUrlCommand.js.map +1 -0
  242. package/presentation/commandPalette/commands/SendMessageCommand.d.ts +23 -0
  243. package/presentation/commandPalette/commands/SendMessageCommand.js +66 -0
  244. package/presentation/commandPalette/commands/SendMessageCommand.js.map +1 -0
  245. package/presentation/commandPalette/commands/SignOutCommand.d.ts +18 -0
  246. package/presentation/commandPalette/commands/SignOutCommand.js +37 -0
  247. package/presentation/commandPalette/commands/SignOutCommand.js.map +1 -0
  248. package/presentation/commandPalette/commands/feature.d.ts +5 -0
  249. package/presentation/commandPalette/commands/feature.js +17 -0
  250. package/presentation/commandPalette/commands/feature.js.map +1 -0
  251. package/presentation/commandPalette/feature.d.ts +3 -0
  252. package/presentation/commandPalette/feature.js +17 -0
  253. package/presentation/commandPalette/feature.js.map +1 -0
  254. package/presentation/commandPalette/index.d.ts +3 -0
  255. package/presentation/commandPalette/index.js +2 -0
  256. package/presentation/featureFlags/FeatureFlagsProvider.d.ts +7 -0
  257. package/presentation/featureFlags/FeatureFlagsProvider.js +22 -0
  258. package/presentation/featureFlags/FeatureFlagsProvider.js.map +1 -0
  259. package/presentation/featureFlags/useFeatureFlags.d.ts +2 -0
  260. package/presentation/featureFlags/useFeatureFlags.js +17 -0
  261. package/presentation/featureFlags/useFeatureFlags.js.map +1 -0
  262. package/presentation/installation/components/SystemInstaller/SystemInstaller.d.ts +2 -2
  263. package/presentation/installation/components/SystemInstaller/steps/FinishSetup/handleStartUsing.js +0 -3
  264. package/presentation/installation/components/SystemInstaller/steps/FinishSetup/handleStartUsing.js.map +1 -1
  265. package/presentation/listPresenter/FolderAwareDataSource.js +4 -1
  266. package/presentation/listPresenter/FolderAwareDataSource.js.map +1 -1
  267. package/presentation/listPresenter/QueryMatcher.js +2 -2
  268. package/presentation/listPresenter/QueryMatcher.js.map +1 -1
  269. package/presentation/sortable/SortablePresenter.d.ts +23 -0
  270. package/presentation/sortable/SortablePresenter.js +175 -0
  271. package/presentation/sortable/SortablePresenter.js.map +1 -0
  272. package/presentation/sortable/abstractions.d.ts +24 -0
  273. package/presentation/sortable/abstractions.js +5 -0
  274. package/presentation/sortable/abstractions.js.map +1 -0
  275. package/presentation/sortable/feature.d.ts +1 -0
  276. package/presentation/sortable/feature.js +11 -0
  277. package/presentation/sortable/feature.js.map +1 -0
  278. package/presentation/sortable/index.d.ts +2 -0
  279. package/presentation/sortable/index.js +2 -0
  280. package/presentation/trashBin/components/BulkActions/DeleteItems.d.ts +2 -2
  281. package/presentation/trashBin/components/BulkActions/RestoreItems.d.ts +2 -2
  282. package/presentation/trashBin/components/TrashBinOverlay.d.ts +2 -2
  283. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.d.ts +0 -10
  284. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js.map +0 -1
  285. package/base/Base/Menus/WebinyVersion.d.ts +0 -2
  286. package/base/Base/Menus/WebinyVersion.js +0 -23
  287. package/base/Base/Menus/WebinyVersion.js.map +0 -1
  288. package/base/WebinyVersion.d.ts +0 -2
  289. package/base/WebinyVersion.js +0 -23
  290. package/base/WebinyVersion.js.map +0 -1
  291. package/components/Wcp.d.ts +0 -19
  292. package/components/Wcp.js +0 -37
  293. package/components/Wcp.js.map +0 -1
@@ -0,0 +1,24 @@
1
+ import react from "react";
2
+ import { ConnectToProperties, Property, useIdGenerator } from "@webiny/react-properties";
3
+ const Breadcrumb = ({ name, label, to, icon, before, after })=>{
4
+ const getId = useIdGenerator("Breadcrumb");
5
+ const id = name ?? label;
6
+ return /*#__PURE__*/ react.createElement(ConnectToProperties, {
7
+ name: "AdminConfig"
8
+ }, /*#__PURE__*/ react.createElement(Property, {
9
+ id: getId(id),
10
+ name: "breadcrumbs",
11
+ array: true,
12
+ before: before,
13
+ after: after,
14
+ value: {
15
+ name: id,
16
+ label,
17
+ to,
18
+ icon
19
+ }
20
+ }));
21
+ };
22
+ export { Breadcrumb };
23
+
24
+ //# sourceMappingURL=Breadcrumbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config/AdminConfig/Breadcrumbs.js","sources":["../../../src/config/AdminConfig/Breadcrumbs.tsx"],"sourcesContent":["import React from \"react\";\nimport { ConnectToProperties, Property, useIdGenerator } from \"@webiny/react-properties\";\nimport type { Route } from \"@webiny/app/features/router/Route.js\";\n\n/**\n * Where a breadcrumb navigates: either a raw path string, or a `Route` (optionally with\n * params) that the header resolves to a link via the router's `getLink`.\n */\nexport type BreadcrumbLink = string | { route: Route<any>; params?: Record<string, any> };\n\nexport interface BreadcrumbConfig {\n name: string;\n label: string;\n to?: BreadcrumbLink;\n icon?: React.ReactNode;\n}\n\nexport interface BreadcrumbProps {\n /** Stable id for ordering/diffing. Defaults to `label`. */\n name?: string;\n /** Text label shown for this location. */\n label: string;\n /** Where this item navigates — a path string or a `Route` (+ params). */\n to?: BreadcrumbLink;\n /** Optional leading icon. */\n icon?: React.ReactNode;\n /** Place this item before another (by name). */\n before?: string;\n /** Place this item after another (by name). */\n after?: string;\n}\n\n/**\n * Declares a single breadcrumb. Drop it anywhere in a view or sub-view — the header renders\n * every mounted `<Breadcrumb>` as the trail, in mount order, and clears each when it\n * unmounts. Breadcrumbs are pure presentation, so this composes through the React Config API\n * (like `AdminConfig.Menu` / `Dashboard.Widget`) rather than dependency injection.\n *\n * ```tsx\n * <Breadcrumb label=\"File Manager\" to={{ route: Routes.List }} />\n * <Breadcrumb label={folder.title} to={{ route: Routes.List, params: { folderId } }} />\n * ```\n */\nexport const Breadcrumb = ({ name, label, to, icon, before, after }: BreadcrumbProps) => {\n const getId = useIdGenerator(\"Breadcrumb\");\n const id = name ?? label;\n\n return (\n <ConnectToProperties name={\"AdminConfig\"}>\n <Property\n id={getId(id)}\n name={\"breadcrumbs\"}\n array={true}\n before={before}\n after={after}\n value={{ name: id, label, to, icon }}\n />\n </ConnectToProperties>\n );\n};\n"],"names":["Breadcrumb","name","label","to","icon","before","after","getId","useIdGenerator","id","ConnectToProperties","Property"],"mappings":";;AA2CO,MAAMA,aAAa,CAAC,EAAEC,IAAI,EAAEC,KAAK,EAAEC,EAAE,EAAEC,IAAI,EAAEC,MAAM,EAAEC,KAAK,EAAmB;IAChF,MAAMC,QAAQC,eAAe;IAC7B,MAAMC,KAAKR,QAAQC;IAEnB,OAAO,WAAP,GACI,oBAACQ,qBAAmBA;QAAC,MAAM;qBACvB,oBAACC,UAAQA;QACL,IAAIJ,MAAME;QACV,MAAM;QACN,OAAO;QACP,QAAQJ;QACR,OAAOC;QACP,OAAO;YAAE,MAAMG;YAAIP;YAAOC;YAAIC;QAAK;;AAInD"}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ export interface DrawerConfig {
3
+ name: string;
4
+ element: React.ReactElement;
5
+ }
6
+ export interface DrawerProps {
7
+ name: string;
8
+ element: React.ReactElement;
9
+ }
10
+ export declare const Drawer: ({ name, element }: DrawerProps) => React.JSX.Element;
@@ -0,0 +1,19 @@
1
+ import react from "react";
2
+ import { ConnectToProperties, Property, useIdGenerator } from "@webiny/react-properties";
3
+ const Drawer = ({ name, element })=>{
4
+ const getId = useIdGenerator("Drawer");
5
+ return /*#__PURE__*/ react.createElement(ConnectToProperties, {
6
+ name: "AdminConfig"
7
+ }, /*#__PURE__*/ react.createElement(Property, {
8
+ id: getId(name),
9
+ name: "drawers",
10
+ array: true,
11
+ value: {
12
+ name,
13
+ element
14
+ }
15
+ }));
16
+ };
17
+ export { Drawer };
18
+
19
+ //# sourceMappingURL=Drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config/AdminConfig/Drawer.js","sources":["../../../src/config/AdminConfig/Drawer.tsx"],"sourcesContent":["import React from \"react\";\nimport { ConnectToProperties, Property, useIdGenerator } from \"@webiny/react-properties\";\n\nexport interface DrawerConfig {\n name: string;\n element: React.ReactElement;\n}\n\nexport interface DrawerProps {\n name: string;\n element: React.ReactElement;\n}\n\nexport const Drawer = ({ name, element }: DrawerProps) => {\n const getId = useIdGenerator(\"Drawer\");\n\n return (\n <ConnectToProperties name={\"AdminConfig\"}>\n <Property id={getId(name)} name={\"drawers\"} array={true} value={{ name, element }} />\n </ConnectToProperties>\n );\n};\n"],"names":["Drawer","name","element","getId","useIdGenerator","ConnectToProperties","Property"],"mappings":";;AAaO,MAAMA,SAAS,CAAC,EAAEC,IAAI,EAAEC,OAAO,EAAe;IACjD,MAAMC,QAAQC,eAAe;IAE7B,OAAO,WAAP,GACI,oBAACC,qBAAmBA;QAAC,MAAM;qBACvB,oBAACC,UAAQA;QAAC,IAAIH,MAAMF;QAAO,MAAM;QAAW,OAAO;QAAM,OAAO;YAAEA;YAAMC;QAAQ;;AAG5F"}
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ export interface AllowCustomColorsProps {
3
+ value?: boolean;
4
+ }
5
+ export declare const AllowCustomColors: ({ value }: AllowCustomColorsProps) => React.JSX.Element;
@@ -0,0 +1,18 @@
1
+ import react from "react";
2
+ import { ConnectToProperties, Property, useIdGenerator } from "@webiny/react-properties";
3
+ const AllowCustomColors = ({ value = true })=>{
4
+ const getId = useIdGenerator("lexicalTheme");
5
+ return /*#__PURE__*/ react.createElement(ConnectToProperties, {
6
+ name: "AdminConfig"
7
+ }, /*#__PURE__*/ react.createElement(Property, {
8
+ id: "lexicalTheme",
9
+ name: "lexicalTheme"
10
+ }, /*#__PURE__*/ react.createElement(Property, {
11
+ id: getId("allowCustomColors"),
12
+ name: "allowCustomColors",
13
+ value: value
14
+ })));
15
+ };
16
+ export { AllowCustomColors };
17
+
18
+ //# sourceMappingURL=AllowCustomColors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config/AdminConfig/LexicalTheme/AllowCustomColors.js","sources":["../../../../src/config/AdminConfig/LexicalTheme/AllowCustomColors.tsx"],"sourcesContent":["import React from \"react\";\nimport { ConnectToProperties, Property, useIdGenerator } from \"@webiny/react-properties\";\n\nexport interface AllowCustomColorsProps {\n value?: boolean;\n}\n\nexport const AllowCustomColors = ({ value = true }: AllowCustomColorsProps) => {\n const getId = useIdGenerator(\"lexicalTheme\");\n\n return (\n <ConnectToProperties name={\"AdminConfig\"}>\n <Property id={\"lexicalTheme\"} name={\"lexicalTheme\"}>\n <Property\n id={getId(\"allowCustomColors\")}\n name={\"allowCustomColors\"}\n value={value}\n />\n </Property>\n </ConnectToProperties>\n );\n};\n"],"names":["AllowCustomColors","value","getId","useIdGenerator","ConnectToProperties","Property"],"mappings":";;AAOO,MAAMA,oBAAoB,CAAC,EAAEC,QAAQ,IAAI,EAA0B;IACtE,MAAMC,QAAQC,eAAe;IAE7B,OAAO,WAAP,GACI,oBAACC,qBAAmBA;QAAC,MAAM;qBACvB,oBAACC,UAAQA;QAAC,IAAI;QAAgB,MAAM;qBAChC,oBAACA,UAAQA;QACL,IAAIH,MAAM;QACV,MAAM;QACN,OAAOD;;AAK3B"}
@@ -1,5 +1,7 @@
1
+ import { AllowCustomColors } from "./LexicalTheme/AllowCustomColors.js";
1
2
  import { Color } from "./LexicalTheme/Color.js";
2
3
  export declare const LexicalTheme: {
4
+ AllowCustomColors: typeof AllowCustomColors;
3
5
  Color: typeof Color;
4
6
  Typography: {
5
7
  Heading: typeof import("./LexicalTheme/Typography.js").Heading;
@@ -1,6 +1,8 @@
1
+ import { AllowCustomColors } from "./LexicalTheme/AllowCustomColors.js";
1
2
  import { Color } from "./LexicalTheme/Color.js";
2
3
  import { Typography } from "./LexicalTheme/Typography.js";
3
4
  const LexicalTheme = {
5
+ AllowCustomColors: AllowCustomColors,
4
6
  Color: Color,
5
7
  Typography: Typography
6
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"config/AdminConfig/LexicalTheme.js","sources":["../../../src/config/AdminConfig/LexicalTheme.tsx"],"sourcesContent":["import { Color } from \"./LexicalTheme/Color.js\";\nimport { Typography } from \"./LexicalTheme/Typography.js\";\n\nexport const LexicalTheme = {\n Color,\n Typography\n};\n"],"names":["LexicalTheme","Color","Typography"],"mappings":";;AAGO,MAAMA,eAAe;IACxBC,OAAKA;IACLC,YAAUA;AACd"}
1
+ {"version":3,"file":"config/AdminConfig/LexicalTheme.js","sources":["../../../src/config/AdminConfig/LexicalTheme.tsx"],"sourcesContent":["import { AllowCustomColors } from \"./LexicalTheme/AllowCustomColors.js\";\nimport { Color } from \"./LexicalTheme/Color.js\";\nimport { Typography } from \"./LexicalTheme/Typography.js\";\n\nexport const LexicalTheme = {\n AllowCustomColors,\n Color,\n Typography\n};\n"],"names":["LexicalTheme","AllowCustomColors","Color","Typography"],"mappings":";;;AAIO,MAAMA,eAAe;IACxBC,mBAAiBA;IACjBC,OAAKA;IACLC,YAAUA;AACd"}
@@ -4,9 +4,12 @@ import type { SupportMenuConfig } from "./AdminConfig/Menu/SupportMenu.js";
4
4
  import type { UserMenuConfig } from "./AdminConfig/Menu/UserMenu.js";
5
5
  import { Route } from "./AdminConfig/Route.js";
6
6
  import { type WidgetConfig } from "./AdminConfig/Widget.js";
7
+ import { Breadcrumb, type BreadcrumbConfig } from "./AdminConfig/Breadcrumbs.js";
7
8
  import type { PermissionRendererConfig } from "../permissions/types.js";
8
9
  import { Dialog } from "./AdminConfig/Dialog.js";
9
10
  import type { DialogConfig } from "./AdminConfig/Dialog.js";
11
+ import { Drawer } from "./AdminConfig/Drawer.js";
12
+ import type { DrawerConfig } from "./AdminConfig/Drawer.js";
10
13
  import type { FieldRendererConfig } from "./AdminConfig/FieldRenderer.js";
11
14
  import type { LayoutRendererConfig } from "./AdminConfig/LayoutRenderer.js";
12
15
  import type { EditorTheme } from "@webiny/lexical-theme";
@@ -25,9 +28,11 @@ export declare const useAdminConfig: () => {
25
28
  horizontalLogo: React.ReactNode;
26
29
  };
27
30
  widgets: WidgetConfig[];
31
+ breadcrumbs: BreadcrumbConfig[];
28
32
  permissionRenderers: PermissionRendererConfig[];
29
33
  lexicalTheme: EditorTheme;
30
34
  dialogs: DialogConfig[];
35
+ drawers: DrawerConfig[];
31
36
  fieldRenderers: FieldRendererConfig[];
32
37
  layoutRenderers: LayoutRendererConfig[];
33
38
  };
@@ -468,10 +473,12 @@ export declare const AdminConfig: typeof Private & {
468
473
  Dashboard: {
469
474
  Widget: typeof import("./AdminConfig/Widget.js").Widget;
470
475
  };
476
+ Breadcrumb: typeof Breadcrumb;
471
477
  Security: {
472
478
  Permissions: typeof import("./AdminConfig/SecurityPermissions.js").SecurityPermissions;
473
479
  };
474
480
  LexicalTheme: {
481
+ AllowCustomColors: typeof import("./AdminConfig/LexicalTheme/AllowCustomColors.js").AllowCustomColors;
475
482
  Color: typeof import("./AdminConfig/LexicalTheme/Color.js").Color;
476
483
  Typography: {
477
484
  Heading: typeof import("./AdminConfig/LexicalTheme/Typography.js").Heading;
@@ -481,6 +488,7 @@ export declare const AdminConfig: typeof Private & {
481
488
  };
482
489
  };
483
490
  Dialog: typeof Dialog;
491
+ Drawer: typeof Drawer;
484
492
  Form: {
485
493
  FieldRenderer: typeof import("./AdminConfig/FieldRenderer.js").FieldRenderer;
486
494
  LayoutRenderer: typeof import("./AdminConfig/LayoutRenderer.js").LayoutRenderer;
@@ -5,11 +5,13 @@ import { Tenant } from "./AdminConfig/Tenant.js";
5
5
  import { Route } from "./AdminConfig/Route.js";
6
6
  import { Theme } from "./AdminConfig/Theme.js";
7
7
  import { Dashboard } from "./AdminConfig/Dashboard.js";
8
+ import { Breadcrumb } from "./AdminConfig/Breadcrumbs.js";
8
9
  import { Security } from "./AdminConfig/Security.js";
9
10
  import { LexicalTheme } from "./AdminConfig/LexicalTheme.js";
10
11
  import { Title } from "./AdminConfig/Title.js";
11
12
  import { Logo } from "./AdminConfig/Logo.js";
12
13
  import { Dialog } from "./AdminConfig/Dialog.js";
14
+ import { Drawer } from "./AdminConfig/Drawer.js";
13
15
  import { Form } from "./AdminConfig/Form.js";
14
16
  import { createAdminConfig } from "./createAdminConfig.js";
15
17
  import { createLexicalTokens } from "@webiny/lexical-theme/createLexicalEditorTokens.js";
@@ -28,7 +30,8 @@ const useAdminConfig = ()=>{
28
30
  colors: baseConfig.lexicalTheme?.colors,
29
31
  typography: baseConfig.lexicalTheme?.typography || {},
30
32
  fontSizes: [],
31
- tokens: lexicalTokens
33
+ tokens: lexicalTokens,
34
+ allowCustomColors: baseConfig.lexicalTheme?.allowCustomColors ?? false
32
35
  };
33
36
  return {
34
37
  menus: baseConfig.menus ?? [],
@@ -40,9 +43,11 @@ const useAdminConfig = ()=>{
40
43
  horizontalLogo: baseConfig.horizontalLogo
41
44
  },
42
45
  widgets: baseConfig.widgets ?? [],
46
+ breadcrumbs: baseConfig.breadcrumbs ?? [],
43
47
  permissionRenderers: baseConfig.permissionRenderers ?? [],
44
48
  lexicalTheme,
45
49
  dialogs: baseConfig.dialogs ?? [],
50
+ drawers: baseConfig.drawers ?? [],
46
51
  fieldRenderers: baseConfig.fieldRenderers ?? [],
47
52
  layoutRenderers: baseConfig.layoutRenderers ?? []
48
53
  };
@@ -58,9 +63,11 @@ const AdminConfig = Object.assign(Private, {
58
63
  Title: Title,
59
64
  Logo: Logo,
60
65
  Dashboard: Dashboard,
66
+ Breadcrumb: Breadcrumb,
61
67
  Security: Security,
62
68
  LexicalTheme: LexicalTheme,
63
69
  Dialog: Dialog,
70
+ Drawer: Drawer,
64
71
  Form: Form,
65
72
  useAdminConfig: useAdminConfig
66
73
  });
@@ -1 +1 @@
1
- {"version":3,"file":"config/AdminConfig.js","sources":["../../src/config/AdminConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { createProvider } from \"@webiny/app\";\nimport { Menu, type MenuConfig } from \"./AdminConfig/Menu.js\";\nimport type { TenantConfig } from \"./AdminConfig/Tenant.js\";\nimport { Tenant } from \"./AdminConfig/Tenant.js\";\nimport type { SupportMenuConfig } from \"./AdminConfig/Menu/SupportMenu.js\";\nimport type { UserMenuConfig } from \"./AdminConfig/Menu/UserMenu.js\";\nimport { Route } from \"./AdminConfig/Route.js\";\nimport { Theme } from \"./AdminConfig/Theme.js\";\nimport { Dashboard } from \"./AdminConfig/Dashboard.js\";\nimport { type WidgetConfig } from \"./AdminConfig/Widget.js\";\nimport { Security } from \"./AdminConfig/Security.js\";\nimport type { PermissionRendererConfig } from \"../permissions/types.js\";\nimport { LexicalTheme } from \"./AdminConfig/LexicalTheme.js\";\nimport { Title } from \"./AdminConfig/Title.js\";\nimport { Logo } from \"./AdminConfig/Logo.js\";\nimport { Dialog } from \"./AdminConfig/Dialog.js\";\nimport type { DialogConfig } from \"./AdminConfig/Dialog.js\";\nimport { Form } from \"./AdminConfig/Form.js\";\nimport type { FieldRendererConfig } from \"./AdminConfig/FieldRenderer.js\";\nimport type { LayoutRendererConfig } from \"./AdminConfig/LayoutRenderer.js\";\nimport { createAdminConfig } from \"./createAdminConfig.js\";\nimport type { EditorTheme } from \"@webiny/lexical-theme\";\nimport { createLexicalTokens } from \"@webiny/lexical-theme/createLexicalEditorTokens.js\";\n\nconst base = createAdminConfig<AdminConfig>();\n\nexport const AdminWithConfig = Object.assign(base.WithConfig, {\n displayName: \"AdminWithConfig\"\n});\n\ninterface AdminConfig {\n menus: MenuConfig[];\n supportMenus: SupportMenuConfig[];\n userMenus: UserMenuConfig[];\n tenant: TenantConfig;\n title: string;\n squareLogo: React.ReactNode;\n horizontalLogo: React.ReactNode;\n widgets: WidgetConfig[];\n permissionRenderers: PermissionRendererConfig[];\n lexicalTheme: EditorTheme;\n dialogs: DialogConfig[];\n fieldRenderers: FieldRendererConfig[];\n layoutRenderers: LayoutRendererConfig[];\n}\n\n/* Once the app fully renders (after the LoginScreen), apply protected configs. */\nexport const AdminConfigPlugin = <base.ApplyProtectedConfig />;\n\nexport const AdminConfigProvider = createProvider(Original => {\n return function AdminConfigProvider({ children }) {\n return (\n <AdminWithConfig>\n <base.ApplyPublicConfig />\n <Original>{children}</Original>\n </AdminWithConfig>\n );\n };\n});\n\nconst lexicalTokens = createLexicalTokens(\"wa-lx-\");\n\nexport const useAdminConfig = () => {\n const baseConfig = base.useConfig();\n\n const lexicalTheme: EditorTheme = {\n colors: baseConfig.lexicalTheme?.colors,\n typography: baseConfig.lexicalTheme?.typography || {},\n fontSizes: [],\n tokens: lexicalTokens\n };\n\n return {\n menus: baseConfig.menus ?? [],\n userMenus: baseConfig.userMenus ?? [],\n supportMenus: baseConfig.supportMenus ?? [],\n title: baseConfig.title,\n logo: {\n squareLogo: baseConfig.squareLogo,\n horizontalLogo: baseConfig.horizontalLogo\n },\n widgets: baseConfig.widgets ?? [],\n permissionRenderers: baseConfig.permissionRenderers ?? [],\n lexicalTheme,\n dialogs: baseConfig.dialogs ?? [],\n fieldRenderers: baseConfig.fieldRenderers ?? [],\n layoutRenderers: baseConfig.layoutRenderers ?? []\n };\n};\n\nexport interface PublicProps {\n children: React.ReactNode;\n}\n\nexport const Public = ({ children }: PublicProps) => {\n return <base.PublicConfig>{children}</base.PublicConfig>;\n};\n\nexport interface PrivateProps {\n children: React.ReactNode;\n}\n\nexport const Private = ({ children }: PrivateProps) => {\n return <base.PrivateConfig>{children}</base.PrivateConfig>;\n};\n\nexport const AdminConfig = Object.assign(Private, {\n Public,\n Theme,\n Menu,\n Route,\n Tenant,\n Title,\n Logo,\n Dashboard,\n Security,\n LexicalTheme,\n Dialog,\n Form,\n useAdminConfig\n});\n"],"names":["base","createAdminConfig","AdminWithConfig","Object","AdminConfigPlugin","AdminConfigProvider","createProvider","Original","children","lexicalTokens","createLexicalTokens","useAdminConfig","baseConfig","lexicalTheme","Public","Private","AdminConfig","Theme","Menu","Route","Tenant","Title","Logo","Dashboard","Security","LexicalTheme","Dialog","Form"],"mappings":";;;;;;;;;;;;;;;AAyBA,MAAMA,OAAOC;AAEN,MAAMC,kBAAkBC,OAAO,MAAM,CAACH,KAAK,UAAU,EAAE;IAC1D,aAAa;AACjB;AAmBO,MAAMI,oBAAoB,WAAHA,GAAG,oBAACJ,KAAK,oBAAoB;AAEpD,MAAMK,kCAAsBC,eAAeC,CAAAA,WACvC,SAA6B,EAAEC,QAAQ,EAAE;QAC5C,OAAO,WAAP,GACI,oBAACN,iBAAeA,MAAAA,WAAAA,GACZ,oBAACF,KAAK,iBAAiB,uBACvB,oBAACO,UAAAA,MAAUC;IAGvB;AAGJ,MAAMC,gBAAgBC,oBAAoB;AAEnC,MAAMC,iBAAiB;IAC1B,MAAMC,aAAaZ,KAAK,SAAS;IAEjC,MAAMa,eAA4B;QAC9B,QAAQD,WAAW,YAAY,EAAE;QACjC,YAAYA,WAAW,YAAY,EAAE,cAAc,CAAC;QACpD,WAAW,EAAE;QACb,QAAQH;IACZ;IAEA,OAAO;QACH,OAAOG,WAAW,KAAK,IAAI,EAAE;QAC7B,WAAWA,WAAW,SAAS,IAAI,EAAE;QACrC,cAAcA,WAAW,YAAY,IAAI,EAAE;QAC3C,OAAOA,WAAW,KAAK;QACvB,MAAM;YACF,YAAYA,WAAW,UAAU;YACjC,gBAAgBA,WAAW,cAAc;QAC7C;QACA,SAASA,WAAW,OAAO,IAAI,EAAE;QACjC,qBAAqBA,WAAW,mBAAmB,IAAI,EAAE;QACzDC;QACA,SAASD,WAAW,OAAO,IAAI,EAAE;QACjC,gBAAgBA,WAAW,cAAc,IAAI,EAAE;QAC/C,iBAAiBA,WAAW,eAAe,IAAI,EAAE;IACrD;AACJ;AAMO,MAAME,SAAS,CAAC,EAAEN,QAAQ,EAAe,GACrC,WAAP,GAAO,oBAACR,KAAK,YAAY,QAAEQ;AAOxB,MAAMO,UAAU,CAAC,EAAEP,QAAQ,EAAgB,GACvC,WAAP,GAAO,oBAACR,KAAK,aAAa,QAAEQ;AAGzB,MAAMQ,cAAcb,OAAO,MAAM,CAACY,SAAS;IAC9CD,QAAAA;IACAG,OAAKA;IACLC,MAAIA;IACJC,OAAKA;IACLC,QAAMA;IACNC,OAAKA;IACLC,MAAIA;IACJC,WAASA;IACTC,UAAQA;IACRC,cAAYA;IACZC,QAAMA;IACNC,MAAIA;IACJhB,gBAAAA;AACJ"}
1
+ {"version":3,"file":"config/AdminConfig.js","sources":["../../src/config/AdminConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { createProvider } from \"@webiny/app\";\nimport { Menu, type MenuConfig } from \"./AdminConfig/Menu.js\";\nimport type { TenantConfig } from \"./AdminConfig/Tenant.js\";\nimport { Tenant } from \"./AdminConfig/Tenant.js\";\nimport type { SupportMenuConfig } from \"./AdminConfig/Menu/SupportMenu.js\";\nimport type { UserMenuConfig } from \"./AdminConfig/Menu/UserMenu.js\";\nimport { Route } from \"./AdminConfig/Route.js\";\nimport { Theme } from \"./AdminConfig/Theme.js\";\nimport { Dashboard } from \"./AdminConfig/Dashboard.js\";\nimport { type WidgetConfig } from \"./AdminConfig/Widget.js\";\nimport { Breadcrumb, type BreadcrumbConfig } from \"./AdminConfig/Breadcrumbs.js\";\nimport { Security } from \"./AdminConfig/Security.js\";\nimport type { PermissionRendererConfig } from \"../permissions/types.js\";\nimport { LexicalTheme } from \"./AdminConfig/LexicalTheme.js\";\nimport { Title } from \"./AdminConfig/Title.js\";\nimport { Logo } from \"./AdminConfig/Logo.js\";\nimport { Dialog } from \"./AdminConfig/Dialog.js\";\nimport type { DialogConfig } from \"./AdminConfig/Dialog.js\";\nimport { Drawer } from \"./AdminConfig/Drawer.js\";\nimport type { DrawerConfig } from \"./AdminConfig/Drawer.js\";\nimport { Form } from \"./AdminConfig/Form.js\";\nimport type { FieldRendererConfig } from \"./AdminConfig/FieldRenderer.js\";\nimport type { LayoutRendererConfig } from \"./AdminConfig/LayoutRenderer.js\";\nimport { createAdminConfig } from \"./createAdminConfig.js\";\nimport type { EditorTheme } from \"@webiny/lexical-theme\";\nimport { createLexicalTokens } from \"@webiny/lexical-theme/createLexicalEditorTokens.js\";\n\nconst base = createAdminConfig<AdminConfig>();\n\nexport const AdminWithConfig = Object.assign(base.WithConfig, {\n displayName: \"AdminWithConfig\"\n});\n\ninterface AdminConfig {\n menus: MenuConfig[];\n supportMenus: SupportMenuConfig[];\n userMenus: UserMenuConfig[];\n tenant: TenantConfig;\n title: string;\n squareLogo: React.ReactNode;\n horizontalLogo: React.ReactNode;\n widgets: WidgetConfig[];\n breadcrumbs: BreadcrumbConfig[];\n permissionRenderers: PermissionRendererConfig[];\n lexicalTheme: EditorTheme;\n dialogs: DialogConfig[];\n drawers: DrawerConfig[];\n fieldRenderers: FieldRendererConfig[];\n layoutRenderers: LayoutRendererConfig[];\n}\n\n/* Once the app fully renders (after the LoginScreen), apply protected configs. */\nexport const AdminConfigPlugin = <base.ApplyProtectedConfig />;\n\nexport const AdminConfigProvider = createProvider(Original => {\n return function AdminConfigProvider({ children }) {\n return (\n <AdminWithConfig>\n <base.ApplyPublicConfig />\n <Original>{children}</Original>\n </AdminWithConfig>\n );\n };\n});\n\nconst lexicalTokens = createLexicalTokens(\"wa-lx-\");\n\nexport const useAdminConfig = () => {\n const baseConfig = base.useConfig();\n\n const lexicalTheme: EditorTheme = {\n colors: baseConfig.lexicalTheme?.colors,\n typography: baseConfig.lexicalTheme?.typography || {},\n fontSizes: [],\n tokens: lexicalTokens,\n allowCustomColors: baseConfig.lexicalTheme?.allowCustomColors ?? false\n };\n\n return {\n menus: baseConfig.menus ?? [],\n userMenus: baseConfig.userMenus ?? [],\n supportMenus: baseConfig.supportMenus ?? [],\n title: baseConfig.title,\n logo: {\n squareLogo: baseConfig.squareLogo,\n horizontalLogo: baseConfig.horizontalLogo\n },\n widgets: baseConfig.widgets ?? [],\n breadcrumbs: baseConfig.breadcrumbs ?? [],\n permissionRenderers: baseConfig.permissionRenderers ?? [],\n lexicalTheme,\n dialogs: baseConfig.dialogs ?? [],\n drawers: baseConfig.drawers ?? [],\n fieldRenderers: baseConfig.fieldRenderers ?? [],\n layoutRenderers: baseConfig.layoutRenderers ?? []\n };\n};\n\nexport interface PublicProps {\n children: React.ReactNode;\n}\n\nexport const Public = ({ children }: PublicProps) => {\n return <base.PublicConfig>{children}</base.PublicConfig>;\n};\n\nexport interface PrivateProps {\n children: React.ReactNode;\n}\n\nexport const Private = ({ children }: PrivateProps) => {\n return <base.PrivateConfig>{children}</base.PrivateConfig>;\n};\n\nexport const AdminConfig = Object.assign(Private, {\n Public,\n Theme,\n Menu,\n Route,\n Tenant,\n Title,\n Logo,\n Dashboard,\n Breadcrumb,\n Security,\n LexicalTheme,\n Dialog,\n Drawer,\n Form,\n useAdminConfig\n});\n"],"names":["base","createAdminConfig","AdminWithConfig","Object","AdminConfigPlugin","AdminConfigProvider","createProvider","Original","children","lexicalTokens","createLexicalTokens","useAdminConfig","baseConfig","lexicalTheme","Public","Private","AdminConfig","Theme","Menu","Route","Tenant","Title","Logo","Dashboard","Breadcrumb","Security","LexicalTheme","Dialog","Drawer","Form"],"mappings":";;;;;;;;;;;;;;;;;AA4BA,MAAMA,OAAOC;AAEN,MAAMC,kBAAkBC,OAAO,MAAM,CAACH,KAAK,UAAU,EAAE;IAC1D,aAAa;AACjB;AAqBO,MAAMI,oBAAoB,WAAHA,GAAG,oBAACJ,KAAK,oBAAoB;AAEpD,MAAMK,kCAAsBC,eAAeC,CAAAA,WACvC,SAA6B,EAAEC,QAAQ,EAAE;QAC5C,OAAO,WAAP,GACI,oBAACN,iBAAeA,MAAAA,WAAAA,GACZ,oBAACF,KAAK,iBAAiB,uBACvB,oBAACO,UAAAA,MAAUC;IAGvB;AAGJ,MAAMC,gBAAgBC,oBAAoB;AAEnC,MAAMC,iBAAiB;IAC1B,MAAMC,aAAaZ,KAAK,SAAS;IAEjC,MAAMa,eAA4B;QAC9B,QAAQD,WAAW,YAAY,EAAE;QACjC,YAAYA,WAAW,YAAY,EAAE,cAAc,CAAC;QACpD,WAAW,EAAE;QACb,QAAQH;QACR,mBAAmBG,WAAW,YAAY,EAAE,qBAAqB;IACrE;IAEA,OAAO;QACH,OAAOA,WAAW,KAAK,IAAI,EAAE;QAC7B,WAAWA,WAAW,SAAS,IAAI,EAAE;QACrC,cAAcA,WAAW,YAAY,IAAI,EAAE;QAC3C,OAAOA,WAAW,KAAK;QACvB,MAAM;YACF,YAAYA,WAAW,UAAU;YACjC,gBAAgBA,WAAW,cAAc;QAC7C;QACA,SAASA,WAAW,OAAO,IAAI,EAAE;QACjC,aAAaA,WAAW,WAAW,IAAI,EAAE;QACzC,qBAAqBA,WAAW,mBAAmB,IAAI,EAAE;QACzDC;QACA,SAASD,WAAW,OAAO,IAAI,EAAE;QACjC,SAASA,WAAW,OAAO,IAAI,EAAE;QACjC,gBAAgBA,WAAW,cAAc,IAAI,EAAE;QAC/C,iBAAiBA,WAAW,eAAe,IAAI,EAAE;IACrD;AACJ;AAMO,MAAME,SAAS,CAAC,EAAEN,QAAQ,EAAe,GACrC,WAAP,GAAO,oBAACR,KAAK,YAAY,QAAEQ;AAOxB,MAAMO,UAAU,CAAC,EAAEP,QAAQ,EAAgB,GACvC,WAAP,GAAO,oBAACR,KAAK,aAAa,QAAEQ;AAGzB,MAAMQ,cAAcb,OAAO,MAAM,CAACY,SAAS;IAC9CD,QAAAA;IACAG,OAAKA;IACLC,MAAIA;IACJC,OAAKA;IACLC,QAAMA;IACNC,OAAKA;IACLC,MAAIA;IACJC,WAASA;IACTC,YAAUA;IACVC,UAAQA;IACRC,cAAYA;IACZC,QAAMA;IACNC,QAAMA;IACNC,MAAIA;IACJlB,gBAAAA;AACJ"}
@@ -8,3 +8,6 @@ export { Tool, ToolPipelineRunner, LexicalContext } from "../features/tools/inde
8
8
  export { ToolsFeature } from "../features/tools/index.js";
9
9
  export { AdminConfig } from "../config/AdminConfig.js";
10
10
  export { Routes } from "../routes.js";
11
+ export { BulkActionButton, useBulkActionDialog } from "../components/BulkActions/index.js";
12
+ export { Notifications } from "../features/notifications/abstractions.js";
13
+ export { Command, CommandPalettePresenter } from "../presentation/commandPalette/index.js";
package/exports/admin.js CHANGED
@@ -7,3 +7,6 @@ export { useBuildParams } from "../presentation/buildParams/useBuildParams.js";
7
7
  export { LexicalContext, Tool, ToolPipelineRunner, ToolsFeature } from "../features/tools/index.js";
8
8
  export { AdminConfig } from "../config/AdminConfig.js";
9
9
  export { Routes } from "../routes.js";
10
+ export { BulkActionButton, useBulkActionDialog } from "../components/BulkActions/index.js";
11
+ export { Notifications } from "../features/notifications/abstractions.js";
12
+ export { Command, CommandPalettePresenter } from "../presentation/commandPalette/index.js";
@@ -2,7 +2,7 @@ import type { Identity } from "../../domain/Identity.js";
2
2
  export interface Role {
3
3
  id: string;
4
4
  name: string;
5
- description: string;
5
+ description: string | null;
6
6
  slug: string;
7
7
  system?: boolean;
8
8
  plugin: boolean | null;
@@ -12,7 +12,7 @@ export interface Role {
12
12
  export interface Team {
13
13
  id: string;
14
14
  name: string;
15
- description: string;
15
+ description: string | null;
16
16
  slug: string;
17
17
  system?: boolean;
18
18
  plugin: boolean | null;
@@ -28,7 +28,7 @@ export interface ApiKey {
28
28
  slug: string;
29
29
  token: string;
30
30
  name: string;
31
- description: string;
31
+ description: string | null;
32
32
  permissions: Identity.Permission[];
33
33
  createdOn: string;
34
34
  }
@@ -0,0 +1,30 @@
1
+ import { ApiStreamClient } from "@webiny/app/features/apiStreamClient";
2
+ import { EnvConfig } from "@webiny/app/features/envConfig";
3
+ import { AiChatGateway as Abstraction } from "./abstractions.js";
4
+ import type { AiChatRequest } from "./abstractions.js";
5
+ import type { AiChatStreamEvent } from "./abstractions.js";
6
+ import { AuthenticationContext } from "../../features/security/AuthenticationContext/index.js";
7
+ import { TenantContext } from "../../features/tenancy/abstractions.js";
8
+ /**
9
+ * Talks to the API app's chat routes.
10
+ *
11
+ * Streaming goes through `ApiStreamClient`, so auth and tenant headers come from the platform's own
12
+ * decorators — including `x-webiny-authorization`, which the streaming path needs because on AWS
13
+ * SigV4 occupies `Authorization`. Getting that wrong would silently make every streamed request
14
+ * anonymous.
15
+ *
16
+ * The buffered call still uses `fetch`: `ApiStreamClient` hands back an unread `Response` for a caller
17
+ * that owns a read loop, which is the wrong shape for a single JSON answer.
18
+ */
19
+ declare class AiChatGatewayImpl implements Abstraction.Interface {
20
+ private authContext;
21
+ private envConfig;
22
+ private tenantContext;
23
+ private streamClient;
24
+ constructor(authContext: AuthenticationContext.Interface, envConfig: EnvConfig.Interface, tenantContext: TenantContext.Interface, streamClient: ApiStreamClient.Interface);
25
+ stream(request: AiChatRequest, signal?: AbortSignal): AsyncIterable<AiChatStreamEvent>;
26
+ }
27
+ export declare const AiChatGateway: typeof AiChatGatewayImpl & {
28
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IAiChatGateway>;
29
+ };
30
+ export {};
@@ -0,0 +1,41 @@
1
+ import { ApiStreamClient, readServerSentEvents } from "@webiny/app/features/apiStreamClient";
2
+ import { EnvConfig } from "@webiny/app/features/envConfig";
3
+ import { AiChatGateway } from "./abstractions.js";
4
+ import { AuthenticationContext } from "../security/AuthenticationContext/index.js";
5
+ import { TenantContext } from "../tenancy/abstractions.js";
6
+ const CHAT_STREAM_PATH = "/stream/ai/chat";
7
+ const toBody = (request)=>{
8
+ const body = {
9
+ messages: request.messages
10
+ };
11
+ if (request.approvals?.length) body["approvals"] = request.approvals;
12
+ return body;
13
+ };
14
+ class AiChatGatewayImpl {
15
+ constructor(authContext, envConfig, tenantContext, streamClient){
16
+ this.authContext = authContext;
17
+ this.envConfig = envConfig;
18
+ this.tenantContext = tenantContext;
19
+ this.streamClient = streamClient;
20
+ }
21
+ async *stream(request, signal) {
22
+ const response = await this.streamClient.execute({
23
+ path: CHAT_STREAM_PATH,
24
+ body: toBody(request),
25
+ signal
26
+ });
27
+ yield* readServerSentEvents(response);
28
+ }
29
+ }
30
+ const AiChatGateway_AiChatGateway = AiChatGateway.createImplementation({
31
+ implementation: AiChatGatewayImpl,
32
+ dependencies: [
33
+ AuthenticationContext,
34
+ EnvConfig,
35
+ TenantContext,
36
+ ApiStreamClient
37
+ ]
38
+ });
39
+ export { AiChatGateway_AiChatGateway as AiChatGateway };
40
+
41
+ //# sourceMappingURL=AiChatGateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/aiChat/AiChatGateway.js","sources":["../../../src/features/aiChat/AiChatGateway.ts"],"sourcesContent":["import { ApiStreamClient } from \"@webiny/app/features/apiStreamClient\";\nimport { readServerSentEvents } from \"@webiny/app/features/apiStreamClient\";\nimport { EnvConfig } from \"@webiny/app/features/envConfig\";\nimport { AiChatGateway as Abstraction } from \"./abstractions.js\";\nimport type { AiChatRequest } from \"./abstractions.js\";\nimport type { AiChatStreamEvent } from \"./abstractions.js\";\nimport { AuthenticationContext } from \"~/features/security/AuthenticationContext/index.js\";\nimport { TenantContext } from \"~/features/tenancy/abstractions.js\";\n\n/*\n * The `/stream/` prefix is required, not cosmetic: it is the CloudFront behavior that targets the\n * Lambda Function URL. Any other path lands on API Gateway and gets buffered.\n */\nconst CHAT_STREAM_PATH = \"/stream/ai/chat\";\n\nconst toBody = (request: AiChatRequest): Record<string, unknown> => {\n const body: Record<string, unknown> = { messages: request.messages };\n\n if (request.approvals?.length) {\n body[\"approvals\"] = request.approvals;\n }\n\n return body;\n};\n\n/**\n * Talks to the API app's chat routes.\n *\n * Streaming goes through `ApiStreamClient`, so auth and tenant headers come from the platform's own\n * decorators — including `x-webiny-authorization`, which the streaming path needs because on AWS\n * SigV4 occupies `Authorization`. Getting that wrong would silently make every streamed request\n * anonymous.\n *\n * The buffered call still uses `fetch`: `ApiStreamClient` hands back an unread `Response` for a caller\n * that owns a read loop, which is the wrong shape for a single JSON answer.\n */\nclass AiChatGatewayImpl implements Abstraction.Interface {\n constructor(\n private authContext: AuthenticationContext.Interface,\n private envConfig: EnvConfig.Interface,\n private tenantContext: TenantContext.Interface,\n private streamClient: ApiStreamClient.Interface\n ) {}\n\n async *stream(request: AiChatRequest, signal?: AbortSignal): AsyncIterable<AiChatStreamEvent> {\n const response = await this.streamClient.execute({\n path: CHAT_STREAM_PATH,\n body: toBody(request),\n signal\n });\n\n yield* readServerSentEvents<AiChatStreamEvent>(response);\n }\n}\n\nexport const AiChatGateway = Abstraction.createImplementation({\n implementation: AiChatGatewayImpl,\n dependencies: [AuthenticationContext, EnvConfig, TenantContext, ApiStreamClient]\n});\n"],"names":["CHAT_STREAM_PATH","toBody","request","body","AiChatGatewayImpl","authContext","envConfig","tenantContext","streamClient","signal","response","readServerSentEvents","AiChatGateway","Abstraction","AuthenticationContext","EnvConfig","TenantContext","ApiStreamClient"],"mappings":";;;;;AAaA,MAAMA,mBAAmB;AAEzB,MAAMC,SAAS,CAACC;IACZ,MAAMC,OAAgC;QAAE,UAAUD,QAAQ,QAAQ;IAAC;IAEnE,IAAIA,QAAQ,SAAS,EAAE,QACnBC,IAAI,CAAC,YAAY,GAAGD,QAAQ,SAAS;IAGzC,OAAOC;AACX;AAaA,MAAMC;IACF,YACYC,WAA4C,EAC5CC,SAA8B,EAC9BC,aAAsC,EACtCC,YAAuC,CACjD;aAJUH,WAAW,GAAXA;aACAC,SAAS,GAATA;aACAC,aAAa,GAAbA;aACAC,YAAY,GAAZA;IACT;IAEH,OAAO,OAAON,OAAsB,EAAEO,MAAoB,EAAoC;QAC1F,MAAMC,WAAW,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;YAC7C,MAAMV;YACN,MAAMC,OAAOC;YACbO;QACJ;QAEA,OAAOE,qBAAwCD;IACnD;AACJ;AAEO,MAAME,8BAAgBC,cAAAA,oBAAgC,CAAC;IAC1D,gBAAgBT;IAChB,cAAc;QAACU;QAAuBC;QAAWC;QAAeC;KAAgB;AACpF"}
@@ -0,0 +1,32 @@
1
+ import { AiChatGateway } from "./abstractions.js";
2
+ import { AiChatPresenter as Abstraction, type IAiChatViewModel } from "./abstractions.js";
3
+ /**
4
+ * Owns the palette's AI conversation.
5
+ *
6
+ * A presenter rather than component state: several pieces change together, a network stream drives
7
+ * them, and an abort has to outlive any one render.
8
+ *
9
+ * Registered as a singleton, so `reset` genuinely clears rather than relying on unmount.
10
+ */
11
+ declare class AiChatPresenterImpl implements Abstraction.Interface {
12
+ private gateway;
13
+ private turns;
14
+ private busy;
15
+ private controller;
16
+ constructor(gateway: AiChatGateway.Interface);
17
+ get vm(): IAiChatViewModel;
18
+ ask(question: string): void;
19
+ decide(turnIndex: number, approved: boolean): void;
20
+ reset(): void;
21
+ /** Replays settled turns so a follow-up ("and which of those is cheapest?") has context. */
22
+ private historyBefore;
23
+ private run;
24
+ private addTurn;
25
+ private patch;
26
+ private setBusy;
27
+ private clear;
28
+ }
29
+ export declare const AiChatPresenter: typeof AiChatPresenterImpl & {
30
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IAiChatPresenter>;
31
+ };
32
+ export {};
@@ -0,0 +1,220 @@
1
+ import { makeAutoObservable } from "mobx";
2
+ import { AiChatGateway, AiChatPresenter } from "./abstractions.js";
3
+ const emptyTurn = (question)=>({
4
+ question,
5
+ text: "",
6
+ tools: [],
7
+ completed: [],
8
+ failed: [],
9
+ running: false,
10
+ pendingApprovals: [],
11
+ messages: [],
12
+ settled: false
13
+ });
14
+ class AiChatPresenterImpl {
15
+ constructor(gateway){
16
+ this.gateway = gateway;
17
+ this.turns = [];
18
+ this.busy = false;
19
+ this.controller = null;
20
+ makeAutoObservable(this, {
21
+ controller: false
22
+ });
23
+ }
24
+ get vm() {
25
+ return {
26
+ busy: this.busy,
27
+ turns: this.turns.map((turn)=>({
28
+ question: turn.question,
29
+ text: turn.text,
30
+ tools: turn.tools,
31
+ completed: turn.completed,
32
+ failed: turn.failed,
33
+ running: turn.running,
34
+ pendingApprovals: turn.pendingApprovals,
35
+ settled: turn.settled,
36
+ ...void 0 === turn.error ? {} : {
37
+ error: turn.error
38
+ }
39
+ }))
40
+ };
41
+ }
42
+ ask(question) {
43
+ const trimmed = question.trim();
44
+ if (!trimmed || this.busy) return;
45
+ const index = this.turns.length;
46
+ this.addTurn(trimmed);
47
+ this.run(index, {
48
+ messages: [
49
+ ...this.historyBefore(index),
50
+ {
51
+ role: "user",
52
+ content: trimmed
53
+ }
54
+ ]
55
+ });
56
+ }
57
+ decide(turnIndex, approved) {
58
+ const turn = this.turns[turnIndex];
59
+ if (!turn?.pendingApprovals.length || this.busy) return;
60
+ const approvals = turn.pendingApprovals.map((approval)=>({
61
+ approvalId: approval.approvalId,
62
+ approved
63
+ }));
64
+ const messages = [
65
+ ...this.historyBefore(turnIndex),
66
+ {
67
+ role: "user",
68
+ content: turn.question
69
+ },
70
+ ...turn.messages
71
+ ];
72
+ this.patch(turnIndex, {
73
+ pendingApprovals: [],
74
+ settled: false,
75
+ running: true
76
+ });
77
+ this.run(turnIndex, {
78
+ messages,
79
+ approvals
80
+ }, true);
81
+ }
82
+ reset() {
83
+ this.controller?.abort();
84
+ this.controller = null;
85
+ this.clear();
86
+ }
87
+ historyBefore(upTo) {
88
+ const history = [];
89
+ for (const turn of this.turns.slice(0, upTo))if (turn.settled && !turn.error) {
90
+ history.push({
91
+ role: "user",
92
+ content: turn.question
93
+ });
94
+ history.push(...turn.messages);
95
+ }
96
+ return history;
97
+ }
98
+ async run(index, request, resuming = false) {
99
+ this.controller?.abort();
100
+ const controller = new AbortController();
101
+ this.controller = controller;
102
+ this.setBusy(true);
103
+ try {
104
+ const existing = resuming ? this.turns[index] : void 0;
105
+ let text = existing?.text ?? "";
106
+ const tools = existing ? [
107
+ ...existing.tools
108
+ ] : [];
109
+ const completed = existing ? [
110
+ ...existing.completed
111
+ ] : [];
112
+ const failed = existing ? [
113
+ ...existing.failed
114
+ ] : [];
115
+ const priorMessages = existing ? [
116
+ ...existing.messages
117
+ ] : [];
118
+ for await (const event of this.gateway.stream(request, controller.signal)){
119
+ if ("text" === event.type) {
120
+ text += event.text;
121
+ this.patch(index, {
122
+ text,
123
+ running: false
124
+ });
125
+ continue;
126
+ }
127
+ if ("tool-call" === event.type) {
128
+ tools.push(event.name);
129
+ this.patch(index, {
130
+ tools: [
131
+ ...tools
132
+ ],
133
+ running: true
134
+ });
135
+ continue;
136
+ }
137
+ if ("tool-result" === event.type) {
138
+ completed.push(event.name);
139
+ this.patch(index, {
140
+ completed: [
141
+ ...completed
142
+ ]
143
+ });
144
+ continue;
145
+ }
146
+ if ("tool-error" === event.type) {
147
+ failed.push(event.name);
148
+ this.patch(index, {
149
+ failed: [
150
+ ...failed
151
+ ]
152
+ });
153
+ continue;
154
+ }
155
+ if ("approval" === event.type) {
156
+ this.patch(index, {
157
+ pendingApprovals: event.approvals,
158
+ running: false
159
+ });
160
+ continue;
161
+ }
162
+ if ("done" === event.type) {
163
+ this.patch(index, {
164
+ messages: [
165
+ ...priorMessages,
166
+ ...event.messages
167
+ ],
168
+ settled: true,
169
+ running: false
170
+ });
171
+ continue;
172
+ }
173
+ if ("error" === event.type) return void this.patch(index, {
174
+ error: event.message,
175
+ settled: true,
176
+ running: false
177
+ });
178
+ }
179
+ } catch (error) {
180
+ if (!controller.signal.aborted) this.patch(index, {
181
+ error: error instanceof Error ? error.message : String(error),
182
+ settled: true,
183
+ running: false
184
+ });
185
+ } finally{
186
+ this.setBusy(false);
187
+ }
188
+ }
189
+ addTurn(question) {
190
+ this.turns = [
191
+ ...this.turns,
192
+ {
193
+ ...emptyTurn(question),
194
+ running: true
195
+ }
196
+ ];
197
+ }
198
+ patch(index, change) {
199
+ this.turns = this.turns.map((turn, i)=>i === index ? {
200
+ ...turn,
201
+ ...change
202
+ } : turn);
203
+ }
204
+ setBusy(busy) {
205
+ this.busy = busy;
206
+ }
207
+ clear() {
208
+ this.turns = [];
209
+ this.busy = false;
210
+ }
211
+ }
212
+ const AiChatPresenter_AiChatPresenter = AiChatPresenter.createImplementation({
213
+ implementation: AiChatPresenterImpl,
214
+ dependencies: [
215
+ AiChatGateway
216
+ ]
217
+ });
218
+ export { AiChatPresenter_AiChatPresenter as AiChatPresenter };
219
+
220
+ //# sourceMappingURL=AiChatPresenter.js.map