adminizer 5.0.0-build.4 → 5.0.0-build.6

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 (126) hide show
  1. package/assets/{add-CoMADTQn.js → add-Brb-cV33.js} +1 -1
  2. package/assets/{add-group-CpYh05Gr.js → add-group-DY9pHQwo.js} +1 -1
  3. package/assets/{add-user-Z9WpJ_d_.js → add-user-DIuPWMB5.js} +1 -1
  4. package/assets/{app-layout-DVX2PU-T.js → app-layout-DPewS6HJ.js} +1 -1
  5. package/assets/app.js +33 -33
  6. package/assets/{catalog-KxmfEHFZ.js → catalog-BuJwUNfR.js} +1 -1
  7. package/assets/controls/ckeditor.es.js +267 -264
  8. package/assets/controls/jsoneditor.es.js +12955 -12879
  9. package/assets/controls/leaflet.es.js +1023 -1004
  10. package/assets/controls/toast-ui.es.js +1825 -1817
  11. package/assets/{dashboard-Fo2hkzUo.js → dashboard-1Qh1ZTlj.js} +1 -1
  12. package/assets/{history-BdY803dB.js → history-BG_35eEy.js} +1 -1
  13. package/assets/{list-CvvdHVTu.js → list-ChGmUbv1.js} +1 -1
  14. package/assets/manifest.json +24 -24
  15. package/assets/{module-CVMNuMJk.js → module-Ct-bvNzt.js} +1 -1
  16. package/assets/{notification-Bj9-bA_4.js → notification-DvCi_Ivk.js} +1 -1
  17. package/assets/{user-filters-list-Bxa5sRQ1.js → user-filters-list-CLQDcsCD.js} +1 -1
  18. package/assets/{welcome-Cv9aMbZo.js → welcome-CL4Z7ey_.js} +1 -1
  19. package/controllers/catalog/FrontendCatalogAdapter.d.ts +1 -1
  20. package/controllers/catalog/FrontentCatalogAdapter.d.ts +1 -1
  21. package/controllers/feedback/feedbackController.d.ts +1 -1
  22. package/controllers/history-actions/HistoryController.d.ts +1 -1
  23. package/controllers/media-manager/mediaManagerAdapter.d.ts +1 -1
  24. package/helpers/accessRightsHelper.d.ts +3 -3
  25. package/helpers/configHelper.d.ts +3 -3
  26. package/helpers/controllerHelper.d.ts +2 -2
  27. package/helpers/fieldsHelper.d.ts +2 -2
  28. package/helpers/filterDatetimeHelper.d.ts +1 -1
  29. package/helpers/inertiaActionsHelper.d.ts +2 -2
  30. package/helpers/inertiaAddHelper.d.ts +4 -4
  31. package/helpers/inertiaGroupHelper.d.ts +3 -3
  32. package/helpers/inertiaListHelper.d.ts +3 -3
  33. package/helpers/inertiaMenuHelper.d.ts +2 -2
  34. package/helpers/inertiaUserHelper.d.ts +3 -3
  35. package/helpers/menuHelper.d.ts +2 -2
  36. package/helpers/translationHelper.d.ts +2 -2
  37. package/index.d.ts +58 -58
  38. package/interfaces/adminpanelConfig.d.ts +4 -4
  39. package/interfaces/global.d.ts +6 -6
  40. package/interfaces/internalModelAccess.d.ts +1 -1
  41. package/interfaces/listQueryBuilder.d.ts +1 -1
  42. package/interfaces/types.d.ts +2 -2
  43. package/lib/Adminizer.d.ts +38 -26
  44. package/lib/Adminizer.js +19 -1
  45. package/lib/DataAccessor.d.ts +6 -6
  46. package/lib/MiddlewareManager.d.ts +1 -1
  47. package/lib/access-rights/AccessRightsHandler.d.ts +2 -2
  48. package/lib/ai-assistant/AbstractAiModelService.d.ts +2 -2
  49. package/lib/ai-assistant/AiAssistantHandler.d.ts +15 -5
  50. package/lib/ai-assistant/AiAssistantHandler.js +31 -1
  51. package/lib/app-manager/AdminizerApp.d.ts +10 -10
  52. package/lib/app-manager/AppManager.d.ts +2 -2
  53. package/lib/app-manager/AppManager.js +11 -8
  54. package/lib/app-manager/AssetHandler.d.ts +2 -2
  55. package/lib/app-manager/ConfigLayerHandler.d.ts +2 -2
  56. package/lib/app-manager/ControllerHandler.d.ts +2 -2
  57. package/lib/catalog/AbstractCatalog.d.ts +1 -1
  58. package/lib/catalog/CatalogHandler.d.ts +1 -1
  59. package/lib/controls/ControlsHandler.d.ts +1 -1
  60. package/lib/controls/codeEditor/MonacoEditor.d.ts +1 -1
  61. package/lib/controls/geojsoneditor/GeoEditor.d.ts +1 -1
  62. package/lib/controls/jsoneditor/JsonEditor.d.ts +1 -1
  63. package/lib/controls/markdown/ToastUiEditor.d.ts +1 -1
  64. package/lib/controls/table/Handsontable.d.ts +1 -1
  65. package/lib/controls/wysiwyg/CKeditor.d.ts +1 -1
  66. package/lib/feedback/FeedbackHandler.d.ts +2 -2
  67. package/lib/filters/ConditionValidator.d.ts +1 -1
  68. package/lib/filters/FilterCustomFieldHandler.d.ts +2 -2
  69. package/lib/filters/FilterService.d.ts +4 -4
  70. package/lib/filters/index.d.ts +6 -6
  71. package/lib/history-actions/AbstractHistoryAdapter.d.ts +6 -6
  72. package/lib/history-actions/DefaultHistoryAdapter.d.ts +4 -4
  73. package/lib/history-actions/HistoryHandler.d.ts +1 -1
  74. package/lib/list-query-builder/ListQueryBuilder.d.ts +7 -7
  75. package/lib/media-manager/AbstractMediaManager.d.ts +2 -2
  76. package/lib/media-manager/MediaManagerHandler.d.ts +1 -1
  77. package/lib/media-manager/Thumb.d.ts +1 -1
  78. package/lib/media-manager/helpers/MediaManagerHelper.d.ts +5 -5
  79. package/lib/model/AbstractModel.d.ts +3 -3
  80. package/lib/model/InternalModelAccessFactory.d.ts +2 -2
  81. package/lib/model/ModelHandler.d.ts +3 -3
  82. package/lib/model/adapter/sequelize.d.ts +2 -2
  83. package/lib/model/adapter/typeorm.d.ts +2 -2
  84. package/lib/model/internalModelRepository.d.ts +2 -2
  85. package/lib/notifications/AbstractNotificationService.d.ts +4 -4
  86. package/lib/notifications/GeneralNotificationService.d.ts +2 -2
  87. package/lib/notifications/NotificationHandler.d.ts +2 -2
  88. package/lib/notifications/SystemNotificationService.d.ts +2 -2
  89. package/lib/requestProcessor.d.ts +1 -1
  90. package/lib/widgets/abstractAction.d.ts +1 -1
  91. package/lib/widgets/abstractCustom.d.ts +2 -2
  92. package/lib/widgets/abstractInfo.d.ts +1 -1
  93. package/lib/widgets/abstractLink.d.ts +2 -2
  94. package/lib/widgets/abstractSwitch.d.ts +1 -1
  95. package/lib/widgets/abstractWidgetBase.d.ts +1 -1
  96. package/lib/widgets/widgetHandler.d.ts +9 -9
  97. package/models/Filter.d.ts +1 -1
  98. package/models/FilterColumn.d.ts +1 -1
  99. package/models/Group.d.ts +1 -1
  100. package/models/HistoryActions.d.ts +1 -1
  101. package/models/MediaManagerAP.d.ts +2 -2
  102. package/models/MediaManagerAssociationsAP.d.ts +1 -1
  103. package/models/MediaManagerMetaAP.d.ts +1 -1
  104. package/models/User.d.ts +2 -2
  105. package/models/UserNotification.d.ts +1 -1
  106. package/package.json +1 -1
  107. package/services/FeedService.d.ts +3 -3
  108. package/system/Router.d.ts +1 -1
  109. package/system/bindAccessRights.d.ts +1 -1
  110. package/system/bindAuthorization.d.ts +1 -1
  111. package/system/bindControls.d.ts +1 -1
  112. package/system/bindCors.d.ts +1 -1
  113. package/system/bindCustomFilterHandlers.d.ts +1 -1
  114. package/system/bindDashboardWidgets.d.ts +1 -1
  115. package/system/bindDev.d.ts +1 -1
  116. package/system/bindHistory.d.ts +1 -1
  117. package/system/bindInertia.d.ts +1 -1
  118. package/system/bindMediaManager.d.ts +1 -1
  119. package/system/bindNotifications.d.ts +1 -1
  120. package/system/bindReqFunctions.d.ts +1 -1
  121. package/system/bindTranslations.d.ts +1 -1
  122. package/system/buildInternalModelAccess.d.ts +3 -3
  123. package/system/defaults.d.ts +1 -1
  124. package/system/routePolicies.d.ts +1 -1
  125. package/system/systemModelContracts.d.ts +1 -1
  126. package/system/validateSystemModels.d.ts +1 -1
package/index.d.ts CHANGED
@@ -1,58 +1,58 @@
1
- export * from "./helpers/configHelper";
2
- export * from "./helpers/accessRightsHelper";
3
- export * from "./lib/widgets/abstractAction";
4
- export * from "./lib/widgets/abstractInfo";
5
- export * from "./lib/widgets/abstractCustom";
6
- export * from "./lib/widgets/abstractLink";
7
- export * from "./lib/widgets/abstractWidgetBase";
8
- export * from "./lib/widgets/abstractSwitch";
9
- export * from "./lib/widgets/widgetHandler";
10
- export * from "./lib/catalog/AbstractCatalog";
11
- export * from "./lib/catalog/CatalogHandler";
12
- export * from "./lib/catalog/CatalogTemplateComponentHandler";
13
- export * from "./lib/media-manager/MediaManagerHandler";
14
- export * from "./controllers/media-manager/mediaManagerAdapter";
15
- export * from "./interfaces/adminpanelConfig";
16
- export * from "./interfaces/types";
17
- export * from "./interfaces/queryCriteria";
18
- export * from "./interfaces/listQueryBuilder";
19
- export * from "./interfaces/internalModelAccess";
20
- export * from "./interfaces/MaaterialIcons";
21
- export * from "./lib/model/AbstractModel";
22
- export * from "./lib/model/InternalModelAccessFactory";
23
- export * from "./system/systemModelContracts";
24
- export * from "./lib/model/adapter/sequelize";
25
- export * from "./lib/model/adapter/typeorm";
26
- export * from "./lib/media-manager/AbstractMediaManager";
27
- export * from "./lib/controls/Control";
28
- export * from "./lib/controls/ControlsHandler";
29
- export * from "./lib/Adminizer";
30
- export * from "./lib/I18n";
31
- export * from "./models/Group";
32
- export * from "./models/User";
33
- export * from "./models/Filter";
34
- export * from "./models/FilterColumn";
35
- export * from "./models/HistoryActions";
36
- export * from "./models/Notification";
37
- export * from "./models/UserNotification";
38
- export * from "./models/MediaManagerAP";
39
- export * from "./models/MediaManagerAssociationsAP";
40
- export * from "./models/MediaManagerMetaAP";
41
- export * from "./policies/authPolicies";
42
- export * from "./lib/helper/jwt";
43
- export * from "./lib/notifications/AbstractNotificationService";
44
- export * from "./lib/POWCaptcha";
45
- export * from "./lib/ai-assistant/AbstractAiModelService";
46
- export * from "./lib/ai-assistant/AiAssistantHandler";
47
- export * from "./lib/DataAccessor";
48
- export * from "./lib/history-actions/AbstractHistoryAdapter";
49
- export * from "./lib/filters/CustomFilterHandler";
50
- export * from "./lib/feedback/AbstractFeedbackHandler";
51
- export * from "./lib/feedback/FeedbackHandler";
52
- export * from "./lib/app-manager/AdminizerApp";
53
- export * from "./lib/app-manager/AppManager";
54
- export * from "./lib/app-manager/ControllerHandler";
55
- export * from "./lib/app-manager/AssetHandler";
56
- export * from "./lib/app-manager/ConfigLayerHandler";
57
- export * from "./lib/access-rights/AccessRightsHandler";
58
- export * from "./lib/media-manager/helpers/MediaManagerHelper";
1
+ export * from "./helpers/configHelper.js";
2
+ export * from "./helpers/accessRightsHelper.js";
3
+ export * from "./lib/widgets/abstractAction.js";
4
+ export * from "./lib/widgets/abstractInfo.js";
5
+ export * from "./lib/widgets/abstractCustom.js";
6
+ export * from "./lib/widgets/abstractLink.js";
7
+ export * from "./lib/widgets/abstractWidgetBase.js";
8
+ export * from "./lib/widgets/abstractSwitch.js";
9
+ export * from "./lib/widgets/widgetHandler.js";
10
+ export * from "./lib/catalog/AbstractCatalog.js";
11
+ export * from "./lib/catalog/CatalogHandler.js";
12
+ export * from "./lib/catalog/CatalogTemplateComponentHandler.js";
13
+ export * from "./lib/media-manager/MediaManagerHandler.js";
14
+ export * from "./controllers/media-manager/mediaManagerAdapter.js";
15
+ export * from "./interfaces/adminpanelConfig.js";
16
+ export * from "./interfaces/types.js";
17
+ export * from "./interfaces/queryCriteria.js";
18
+ export * from "./interfaces/listQueryBuilder.js";
19
+ export * from "./interfaces/internalModelAccess.js";
20
+ export * from "./interfaces/MaaterialIcons.js";
21
+ export * from "./lib/model/AbstractModel.js";
22
+ export * from "./lib/model/InternalModelAccessFactory.js";
23
+ export * from "./system/systemModelContracts.js";
24
+ export * from "./lib/model/adapter/sequelize.js";
25
+ export * from "./lib/model/adapter/typeorm.js";
26
+ export * from "./lib/media-manager/AbstractMediaManager.js";
27
+ export * from "./lib/controls/Control.js";
28
+ export * from "./lib/controls/ControlsHandler.js";
29
+ export * from "./lib/Adminizer.js";
30
+ export * from "./lib/I18n.js";
31
+ export * from "./models/Group.js";
32
+ export * from "./models/User.js";
33
+ export * from "./models/Filter.js";
34
+ export * from "./models/FilterColumn.js";
35
+ export * from "./models/HistoryActions.js";
36
+ export * from "./models/Notification.js";
37
+ export * from "./models/UserNotification.js";
38
+ export * from "./models/MediaManagerAP.js";
39
+ export * from "./models/MediaManagerAssociationsAP.js";
40
+ export * from "./models/MediaManagerMetaAP.js";
41
+ export * from "./policies/authPolicies.js";
42
+ export * from "./lib/helper/jwt.js";
43
+ export * from "./lib/notifications/AbstractNotificationService.js";
44
+ export * from "./lib/POWCaptcha.js";
45
+ export * from "./lib/ai-assistant/AbstractAiModelService.js";
46
+ export * from "./lib/ai-assistant/AiAssistantHandler.js";
47
+ export * from "./lib/DataAccessor.js";
48
+ export * from "./lib/history-actions/AbstractHistoryAdapter.js";
49
+ export * from "./lib/filters/CustomFilterHandler.js";
50
+ export * from "./lib/feedback/AbstractFeedbackHandler.js";
51
+ export * from "./lib/feedback/FeedbackHandler.js";
52
+ export * from "./lib/app-manager/AdminizerApp.js";
53
+ export * from "./lib/app-manager/AppManager.js";
54
+ export * from "./lib/app-manager/ControllerHandler.js";
55
+ export * from "./lib/app-manager/AssetHandler.js";
56
+ export * from "./lib/app-manager/ConfigLayerHandler.js";
57
+ export * from "./lib/access-rights/AccessRightsHandler.js";
58
+ export * from "./lib/media-manager/helpers/MediaManagerHelper.js";
@@ -1,9 +1,9 @@
1
- import { MaterialIcon } from "./MaaterialIcons";
1
+ import { MaterialIcon } from "./MaaterialIcons.js";
2
2
  import { EditorOptions } from "@toast-ui/editor/types/editor";
3
3
  import { GridSettings as HandsontableSettings } from "handsontable/settings";
4
- import { Group } from "../models/Group";
5
- import { User } from "../models/User";
6
- import { InternalModelAccessMap } from "./internalModelAccess";
4
+ import { Group } from "../models/Group.js";
5
+ import { User } from "../models/User.js";
6
+ import { InternalModelAccessMap } from "./internalModelAccess.js";
7
7
  /**
8
8
  * Controller function type - async function that handles requests and returns a response
9
9
  */
@@ -1,11 +1,11 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  import { NextFunction, Request, Response } from "express";
3
3
  import multer from "multer";
4
- import { I18n } from "../lib/I18n";
5
- import { Inertia } from "../lib/inertia/inertiaAdapter";
6
- import { Flash } from "../lib/inertia/flash";
7
- import { User } from "../models/User";
8
- import { AppRuntime } from "../lib/app-manager/AdminizerApp";
4
+ import { I18n } from "../lib/I18n.js";
5
+ import { Inertia } from "../lib/inertia/inertiaAdapter.js";
6
+ import { Flash } from "../lib/inertia/flash.js";
7
+ import { User } from "../models/User.js";
8
+ import { AppRuntime } from "../lib/app-manager/AdminizerApp.js";
9
9
  declare global {
10
10
  /** @deprecated use import from TS model decalration */
11
11
  type ModelsAP = {
@@ -1,4 +1,4 @@
1
- import { IsAny, QueryCriteria } from "./queryCriteria";
1
+ import { IsAny, QueryCriteria } from "./queryCriteria.js";
2
2
  export type InternalModelAccessScope = string;
3
3
  export type InternalModelAccessMap = Record<InternalModelAccessScope, string[]>;
4
4
  export type InternalModelRelationId = string | number;
@@ -1,4 +1,4 @@
1
- import { FilterCondition } from "../models/Filter";
1
+ import { FilterCondition } from "../models/Filter.js";
2
2
  /**
3
3
  * Input format for list/feed/export query builder.
4
4
  * This is not the internal model query language.
@@ -1,5 +1,5 @@
1
- import { AbstractModel } from "../lib/model/AbstractModel";
2
- import { ModelConfig } from "./adminpanelConfig";
1
+ import { AbstractModel } from "../lib/model/AbstractModel.js";
2
+ import { ModelConfig } from "./adminpanelConfig.js";
3
3
  export interface ModelResource {
4
4
  name: string;
5
5
  config?: ModelConfig;
@@ -1,32 +1,32 @@
1
1
  import express, { Express } from "express";
2
2
  import winston from "winston";
3
3
  import EventEmitter from 'events';
4
- import { AdminpanelConfig } from "../interfaces/adminpanelConfig";
5
- import MiddlewareManager from "./MiddlewareManager";
6
- import Router from "./../system/Router";
7
- import { ModelHandler } from "./model/ModelHandler";
8
- import { WidgetHandler } from "./widgets/widgetHandler";
9
- import { AccessRightsHelper } from "../helpers/accessRightsHelper";
10
- import { ConfigHelper } from "../helpers/configHelper";
11
- import { I18n } from "./I18n";
12
- import { AbstractAdapter } from "./model/AbstractModel";
4
+ import { AdminpanelConfig } from "../interfaces/adminpanelConfig.js";
5
+ import MiddlewareManager from "./MiddlewareManager.js";
6
+ import Router from "./../system/Router.js";
7
+ import { ModelHandler } from "./model/ModelHandler.js";
8
+ import { WidgetHandler } from "./widgets/widgetHandler.js";
9
+ import { AccessRightsHelper } from "../helpers/accessRightsHelper.js";
10
+ import { ConfigHelper } from "../helpers/configHelper.js";
11
+ import { I18n } from "./I18n.js";
12
+ import { AbstractAdapter } from "./model/AbstractModel.js";
13
13
  import type { ViteDevServer } from 'vite';
14
- import { MenuHelper } from "../helpers/menuHelper";
15
- import { ControlsHandler } from "./controls/ControlsHandler";
16
- import { CatalogHandler } from "./catalog/CatalogHandler";
17
- import { CatalogTemplateComponentHandler } from "./catalog/CatalogTemplateComponentHandler";
18
- import { AiAssistantHandler } from './ai-assistant/AiAssistantHandler';
19
- import { NotificationHandler } from './notifications/NotificationHandler';
20
- import { INotification } from "../interfaces/types";
21
- import { MediaManagerHandler } from "./media-manager/MediaManagerHandler";
22
- import { HistoryHandler } from "./history-actions/HistoryHandler";
23
- import { CustomFilterHandler } from "./filters/CustomFilterHandler";
24
- import { FeedbackHandler } from "./feedback/FeedbackHandler";
25
- import { AppManager } from "./app-manager/AppManager";
26
- import { ControllerHandler } from "./app-manager/ControllerHandler";
27
- import { AssetHandler } from "./app-manager/AssetHandler";
28
- import { ConfigLayerHandler } from "./app-manager/ConfigLayerHandler";
29
- import { AccessRightsHandler } from "./access-rights/AccessRightsHandler";
14
+ import { MenuHelper } from "../helpers/menuHelper.js";
15
+ import { ControlsHandler } from "./controls/ControlsHandler.js";
16
+ import { CatalogHandler } from "./catalog/CatalogHandler.js";
17
+ import { CatalogTemplateComponentHandler } from "./catalog/CatalogTemplateComponentHandler.js";
18
+ import { AiAssistantHandler } from './ai-assistant/AiAssistantHandler.js';
19
+ import { NotificationHandler } from './notifications/NotificationHandler.js';
20
+ import { INotification } from "../interfaces/types.js";
21
+ import { MediaManagerHandler } from "./media-manager/MediaManagerHandler.js";
22
+ import { HistoryHandler } from "./history-actions/HistoryHandler.js";
23
+ import { CustomFilterHandler } from "./filters/CustomFilterHandler.js";
24
+ import { FeedbackHandler } from "./feedback/FeedbackHandler.js";
25
+ import { AppManager } from "./app-manager/AppManager.js";
26
+ import { ControllerHandler } from "./app-manager/ControllerHandler.js";
27
+ import { AssetHandler } from "./app-manager/AssetHandler.js";
28
+ import { ConfigLayerHandler } from "./app-manager/ConfigLayerHandler.js";
29
+ import { AccessRightsHandler } from "./access-rights/AccessRightsHandler.js";
30
30
  export declare function createAdminizerLogger(): winston.Logger;
31
31
  export interface EmitAsyncOptions {
32
32
  /**
@@ -53,7 +53,7 @@ export declare class Adminizer {
53
53
  router: Router;
54
54
  notificationHandler: NotificationHandler;
55
55
  historyHandler: HistoryHandler;
56
- aiAssistantHandler?: AiAssistantHandler;
56
+ private _aiAssistantHandler?;
57
57
  modelHandler: ModelHandler;
58
58
  widgetHandler: WidgetHandler;
59
59
  customFilterHandler: CustomFilterHandler;
@@ -71,6 +71,18 @@ export declare class Adminizer {
71
71
  jwtSecret: string;
72
72
  static logger: winston.Logger;
73
73
  constructor(ormAdapters: AbstractAdapter[]);
74
+ /**
75
+ * Shared AI assistant model registry.
76
+ *
77
+ * Created lazily on first access, so host code can register models
78
+ * directly (`adminizer.aiAssistantHandler.registerModel(service)`) without
79
+ * declaring an app. Apps register their models in the same handler through
80
+ * `ctx.aiAssistant()` and own only their entries.
81
+ * `config.aiAssistant.enabled` stays a gate for controllers and the UI, not
82
+ * for the registry itself.
83
+ */
84
+ get aiAssistantHandler(): AiAssistantHandler;
85
+ set aiAssistantHandler(handler: AiAssistantHandler | undefined);
74
86
  getMiddleware(): (req: express.Request, res: express.Response, next: () => void) => void;
75
87
  /**
76
88
  * Vite middleware
package/lib/Adminizer.js CHANGED
@@ -30,6 +30,7 @@ import { ControlsHandler } from "./controls/ControlsHandler.js";
30
30
  import { CatalogHandler } from "./catalog/CatalogHandler.js";
31
31
  import { CatalogTemplateComponentHandler } from "./catalog/CatalogTemplateComponentHandler.js";
32
32
  import { v4 as uuid } from "uuid";
33
+ import { AiAssistantHandler } from './ai-assistant/AiAssistantHandler.js';
33
34
  import { bindNotifications } from "../system/bindNotifications.js";
34
35
  import { MediaManagerHandler } from "./media-manager/MediaManagerHandler.js";
35
36
  import { bindCors } from "../system/bindCors.js";
@@ -107,7 +108,7 @@ export class Adminizer {
107
108
  router;
108
109
  notificationHandler;
109
110
  historyHandler;
110
- aiAssistantHandler;
111
+ _aiAssistantHandler;
111
112
  modelHandler;
112
113
  widgetHandler;
113
114
  customFilterHandler;
@@ -145,6 +146,23 @@ export class Adminizer {
145
146
  this.configLayerHandler = new ConfigLayerHandler(this);
146
147
  this.appManager = new AppManager(this);
147
148
  }
149
+ /**
150
+ * Shared AI assistant model registry.
151
+ *
152
+ * Created lazily on first access, so host code can register models
153
+ * directly (`adminizer.aiAssistantHandler.registerModel(service)`) without
154
+ * declaring an app. Apps register their models in the same handler through
155
+ * `ctx.aiAssistant()` and own only their entries.
156
+ * `config.aiAssistant.enabled` stays a gate for controllers and the UI, not
157
+ * for the registry itself.
158
+ */
159
+ get aiAssistantHandler() {
160
+ this._aiAssistantHandler ??= new AiAssistantHandler(this);
161
+ return this._aiAssistantHandler;
162
+ }
163
+ set aiAssistantHandler(handler) {
164
+ this._aiAssistantHandler = handler;
165
+ }
148
166
  getMiddleware() {
149
167
  return (req, res, next) => {
150
168
  try {
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * The class manages the interaction between the user and the database entry, taking into account user permissions and the main config file settings.
3
3
  */
4
- import { ModelResource } from "../interfaces/types";
5
- import { ActionType } from "../interfaces/adminpanelConfig";
6
- import { Fields } from "../helpers/fieldsHelper";
7
- import { Adminizer } from "./Adminizer";
8
- import { User } from "../models/User";
9
- import { QueryCriteria } from "../interfaces/queryCriteria";
4
+ import { ModelResource } from "../interfaces/types.js";
5
+ import { ActionType } from "../interfaces/adminpanelConfig.js";
6
+ import { Fields } from "../helpers/fieldsHelper.js";
7
+ import { Adminizer } from "./Adminizer.js";
8
+ import { User } from "../models/User.js";
9
+ import { QueryCriteria } from "../interfaces/queryCriteria.js";
10
10
  export declare class DataAccessor {
11
11
  readonly adminizer: Adminizer;
12
12
  user: User;
@@ -1,4 +1,4 @@
1
- import { Adminizer } from "./Adminizer";
1
+ import { Adminizer } from "./Adminizer.js";
2
2
  declare class MiddlewareManager {
3
3
  private readonly _adminizer;
4
4
  constructor(adminizer: Adminizer);
@@ -1,5 +1,5 @@
1
- import type { AccessRightsToken } from "../../interfaces/types";
2
- import type { Adminizer } from "../Adminizer";
1
+ import type { AccessRightsToken } from "../../interfaces/types.js";
2
+ import type { Adminizer } from "../Adminizer.js";
3
3
  export interface AccessRightsRecord {
4
4
  id: string;
5
5
  appName: string;
@@ -1,5 +1,5 @@
1
- import { AiAssistantMessage, AiAssistantModelInfo } from '../../interfaces/types';
2
- import { User } from '../../models/User';
1
+ import { AiAssistantMessage, AiAssistantModelInfo } from '../../interfaces/types.js';
2
+ import { User } from '../../models/User.js';
3
3
  /**
4
4
  * Base class for AI assistant models. App modules register access rights
5
5
  * and expose model metadata through this service.
@@ -1,13 +1,23 @@
1
- import { Adminizer } from '../Adminizer';
2
- import { AbstractAiModelService } from './AbstractAiModelService';
3
- import { AiAssistantMessage, AiAssistantModelInfo } from '../../interfaces/types';
4
- import { User } from '../../models/User';
1
+ import { Adminizer } from '../Adminizer.js';
2
+ import { AbstractAiModelService } from './AbstractAiModelService.js';
3
+ import { AiAssistantMessage, AiAssistantModelInfo } from '../../interfaces/types.js';
4
+ import { User } from '../../models/User.js';
5
5
  export declare class AiAssistantHandler {
6
6
  private readonly adminizer;
7
7
  private readonly models;
8
+ private readonly owners;
8
9
  private readonly history;
9
10
  constructor(adminizer: Adminizer);
10
- registerModel(service: AbstractAiModelService): void;
11
+ /**
12
+ * @param owner App name when the model belongs to an app. Models without an
13
+ * owner belong to the host application and are never removed automatically.
14
+ */
15
+ registerModel(service: AbstractAiModelService, owner?: string): void;
16
+ /**
17
+ * @param owner When passed, the model is kept if it is owned by someone
18
+ * else, so a disabled app never removes another owner's model.
19
+ */
20
+ unregisterModel(id: string, owner?: string): void;
11
21
  getModel(id: string): AbstractAiModelService | undefined;
12
22
  getModels(): AiAssistantModelInfo[];
13
23
  getHistory(userId: number, modelId: string): AiAssistantMessage[];
@@ -3,15 +3,45 @@ import { Adminizer } from '../Adminizer.js';
3
3
  export class AiAssistantHandler {
4
4
  adminizer;
5
5
  models = new Map();
6
+ owners = new Map();
6
7
  history = new Map();
7
8
  constructor(adminizer) {
8
9
  this.adminizer = adminizer;
9
10
  }
10
- registerModel(service) {
11
+ /**
12
+ * @param owner App name when the model belongs to an app. Models without an
13
+ * owner belong to the host application and are never removed automatically.
14
+ */
15
+ registerModel(service, owner) {
11
16
  if (this.models.has(service.id)) {
12
17
  Adminizer.log.warn(`AI assistant model with id "${service.id}" is already registered. Overwriting.`);
13
18
  }
14
19
  this.models.set(service.id, service);
20
+ if (owner) {
21
+ this.owners.set(service.id, owner);
22
+ }
23
+ else {
24
+ this.owners.delete(service.id);
25
+ }
26
+ }
27
+ /**
28
+ * @param owner When passed, the model is kept if it is owned by someone
29
+ * else, so a disabled app never removes another owner's model.
30
+ */
31
+ unregisterModel(id, owner) {
32
+ if (!this.models.has(id)) {
33
+ return;
34
+ }
35
+ if (owner && this.owners.get(id) !== owner) {
36
+ return;
37
+ }
38
+ this.models.delete(id);
39
+ this.owners.delete(id);
40
+ for (const key of this.history.keys()) {
41
+ if (key.endsWith(`:${id}`)) {
42
+ this.history.delete(key);
43
+ }
44
+ }
15
45
  }
16
46
  getModel(id) {
17
47
  return this.models.get(id);
@@ -1,13 +1,13 @@
1
- import type { ActionType, AdminpanelConfig, AdminpanelIcon, ModelConfig } from "../../interfaces/adminpanelConfig";
2
- import type { AccessRightsToken, INotification, ModelResource } from "../../interfaces/types";
3
- import type { AbstractCatalog } from "../catalog/AbstractCatalog";
4
- import type { CatalogTemplateComponentResource } from "../catalog/CatalogTemplateComponentHandler";
5
- import type { AppModelAccess } from "../model/ModelHandler";
6
- import type { AbstractMediaManager } from "../media-manager/AbstractMediaManager";
7
- import type { Config, ControlType } from "../controls/Control";
8
- import type { User } from "../../models/User";
9
- import type { DataAccessor } from "../DataAccessor";
10
- import type { AbstractAiModelService } from "../ai-assistant/AbstractAiModelService";
1
+ import type { ActionType, AdminpanelConfig, AdminpanelIcon, ModelConfig } from "../../interfaces/adminpanelConfig.js";
2
+ import type { AccessRightsToken, INotification, ModelResource } from "../../interfaces/types.js";
3
+ import type { AbstractCatalog } from "../catalog/AbstractCatalog.js";
4
+ import type { CatalogTemplateComponentResource } from "../catalog/CatalogTemplateComponentHandler.js";
5
+ import type { AppModelAccess } from "../model/ModelHandler.js";
6
+ import type { AbstractMediaManager } from "../media-manager/AbstractMediaManager.js";
7
+ import type { Config, ControlType } from "../controls/Control.js";
8
+ import type { User } from "../../models/User.js";
9
+ import type { DataAccessor } from "../DataAccessor.js";
10
+ import type { AbstractAiModelService } from "../ai-assistant/AbstractAiModelService.js";
11
11
  export type AppDisposer = () => void | Promise<void>;
12
12
  export type AppEventName = string | symbol;
13
13
  export type AppEventHandler<TPayload = any> = (payload: TPayload, runtime: AppRuntime) => void | Promise<void>;
@@ -1,5 +1,5 @@
1
- import { Adminizer } from "../Adminizer";
2
- import { AbstractAdminizerApp, AppRuntime, AppRuntimeAppState } from "./AdminizerApp";
1
+ import { Adminizer } from "../Adminizer.js";
2
+ import { AbstractAdminizerApp, AppRuntime, AppRuntimeAppState } from "./AdminizerApp.js";
3
3
  export type AppState = AppRuntimeAppState;
4
4
  export declare class AppManager {
5
5
  private adminizer;
@@ -1,5 +1,4 @@
1
1
  import { Adminizer } from "../Adminizer.js";
2
- import { AiAssistantHandler } from "../ai-assistant/AiAssistantHandler.js";
3
2
  import { DataAccessor } from "../DataAccessor.js";
4
3
  class RuntimeAppSetupContext {
5
4
  adminizer;
@@ -141,24 +140,28 @@ class RuntimeAppSetupContext {
141
140
  await this.runRegistrationPhase(this.pendingCatalogRegistrations);
142
141
  }
143
142
  async registerAiAssistant(resource) {
144
- const previousHandler = this.adminizer.aiAssistantHandler;
145
- const handler = new AiAssistantHandler(this.adminizer);
143
+ // Models go into the shared handler instead of replacing it, so models
144
+ // registered directly by the host application keep working and several
145
+ // apps can contribute models at the same time.
146
+ const handler = this.adminizer.aiAssistantHandler;
146
147
  const context = this.createAiAssistantContext();
148
+ const modelIds = [];
147
149
  for (const modelFactory of resource.models) {
148
150
  const model = await modelFactory(context);
149
- handler.registerModel(model);
151
+ handler.registerModel(model, this.appName);
152
+ modelIds.push(model.id);
150
153
  }
151
- this.adminizer.aiAssistantHandler = handler;
152
154
  this.adminizer.emitter.emit("app:ai-assistant:registered", {
153
155
  appName: this.appName,
154
- models: handler.getModels().map((model) => model.id),
156
+ models: modelIds,
155
157
  });
156
158
  this.disposers.push(() => {
157
- if (this.adminizer.aiAssistantHandler === handler) {
158
- this.adminizer.aiAssistantHandler = previousHandler;
159
+ for (const modelId of modelIds) {
160
+ this.adminizer.aiAssistantHandler.unregisterModel(modelId, this.appName);
159
161
  }
160
162
  this.adminizer.emitter.emit("app:ai-assistant:unregistered", {
161
163
  appName: this.appName,
164
+ models: modelIds,
162
165
  });
163
166
  });
164
167
  }
@@ -1,5 +1,5 @@
1
- import type { Adminizer } from "../Adminizer";
2
- import type { AppAsset } from "./AdminizerApp";
1
+ import type { Adminizer } from "../Adminizer.js";
2
+ import type { AppAsset } from "./AdminizerApp.js";
3
3
  interface AssetRecord {
4
4
  id: string;
5
5
  appName: string;
@@ -1,5 +1,5 @@
1
- import type { Adminizer } from "../Adminizer";
2
- import type { AppConfigPatch } from "./AdminizerApp";
1
+ import type { Adminizer } from "../Adminizer.js";
2
+ import type { AppConfigPatch } from "./AdminizerApp.js";
3
3
  export interface ConfigLayerRecord {
4
4
  id: string;
5
5
  appName: string;
@@ -1,5 +1,5 @@
1
- import type { Adminizer } from "../Adminizer";
2
- import type { AppController, AppControllerMethod } from "./AdminizerApp";
1
+ import type { Adminizer } from "../Adminizer.js";
2
+ import type { AppController, AppControllerMethod } from "./AdminizerApp.js";
3
3
  interface ControllerRecord {
4
4
  id: string;
5
5
  appName: string;
@@ -1,4 +1,4 @@
1
- import { Adminizer } from "../Adminizer";
1
+ import { Adminizer } from "../Adminizer.js";
2
2
  export interface CatalogStorageServices {
3
3
  }
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { AbstractCatalog } from "./AbstractCatalog";
1
+ import { AbstractCatalog } from "./AbstractCatalog.js";
2
2
  export interface CatalogRecord {
3
3
  id: string;
4
4
  appName: string;
@@ -1,4 +1,4 @@
1
- import { Control, ControlType } from "./Control";
1
+ import { Control, ControlType } from "./Control.js";
2
2
  export declare class ControlsHandler {
3
3
  private controls;
4
4
  add(control: Control): void;
@@ -1,4 +1,4 @@
1
- import { Control, ControlType, Config, Path } from "../Control";
1
+ import { Control, ControlType, Config, Path } from "../Control.js";
2
2
  export declare class MonacoEditor implements Control {
3
3
  readonly config: Config;
4
4
  readonly name: string;
@@ -1,4 +1,4 @@
1
- import { Control, ControlType, Config, Path } from "../Control";
1
+ import { Control, ControlType, Config, Path } from "../Control.js";
2
2
  export declare class GeoEditor implements Control {
3
3
  readonly config: Config;
4
4
  readonly name: string;
@@ -1,4 +1,4 @@
1
- import { Control, ControlType, Path, Config } from "../Control";
1
+ import { Control, ControlType, Path, Config } from "../Control.js";
2
2
  export declare class JsonEditor implements Control {
3
3
  readonly config: Record<string, string | string[] | object | number | boolean>;
4
4
  readonly name: string;
@@ -1,4 +1,4 @@
1
- import { Control, ControlType, Path, Config } from "../Control";
1
+ import { Control, ControlType, Path, Config } from "../Control.js";
2
2
  export declare class ToastUiEditor implements Control {
3
3
  readonly config: Record<string, string | string[] | object | number | boolean>;
4
4
  readonly name: string;
@@ -1,4 +1,4 @@
1
- import { Control, ControlType, Config, Path } from "../Control";
1
+ import { Control, ControlType, Config, Path } from "../Control.js";
2
2
  export declare class Handsontable implements Control {
3
3
  readonly config: Config;
4
4
  readonly name: string;
@@ -1,4 +1,4 @@
1
- import { Control, ControlType, Config, Path } from "../Control";
1
+ import { Control, ControlType, Config, Path } from "../Control.js";
2
2
  export declare class CKeditor implements Control {
3
3
  readonly name: string;
4
4
  readonly type: ControlType;
@@ -1,5 +1,5 @@
1
- import { Adminizer } from '../Adminizer';
2
- import { AbstractFeedbackHandler } from './AbstractFeedbackHandler';
1
+ import { Adminizer } from '../Adminizer.js';
2
+ import { AbstractFeedbackHandler } from './AbstractFeedbackHandler.js';
3
3
  export declare class FeedbackHandler {
4
4
  private handler;
5
5
  private adminizer;
@@ -1,4 +1,4 @@
1
- import { FilterCondition, FilterOperator } from '../../models/Filter';
1
+ import { FilterCondition, FilterOperator } from '../../models/Filter.js';
2
2
  /**
3
3
  * Security event types for logging suspicious filter attempts
4
4
  */
@@ -1,2 +1,2 @@
1
- export * from './CustomFilterHandler';
2
- export { default } from './CustomFilterHandler';
1
+ export * from './CustomFilterHandler.js';
2
+ export { default } from './CustomFilterHandler.js';