adminizer 5.0.0-build.2 → 5.0.0-build.21

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 (300) hide show
  1. package/assets/abnfDiagram-VCTEODGH-CkmsvdDi.js +1 -0
  2. package/assets/add-CESPH_aI.js +1 -0
  3. package/assets/add-group-CQ4Xm8Ru.js +1 -0
  4. package/assets/add-user-B-QNjR4B.js +1 -0
  5. package/assets/ai-assistant/agent.es.js +28362 -0
  6. package/assets/app-C5Ju5Zra.css +1 -0
  7. package/assets/app-Ca5yUSBv.js +138 -0
  8. package/assets/arc-B-Dt8YNl.js +1 -0
  9. package/assets/architectureDiagram-5GKGNRK7-Ca58kq-l.js +36 -0
  10. package/assets/asmcrypto-DZeQH0LC.js +1 -0
  11. package/assets/blockDiagram-NRAW4CY4-CuqE52IG.js +129 -0
  12. package/assets/c4Diagram-UCG6FXSJ-Cx8z-0Bw.js +38 -0
  13. package/assets/catalog-CkSbxvx0.js +6 -0
  14. package/assets/channel-C9z6Pi_j.js +1 -0
  15. package/assets/chunk-2Q5K7J3B-CXISVKTC.js +1 -0
  16. package/assets/chunk-5VM5RSS4-DYGeeVYe.js +15 -0
  17. package/assets/chunk-F27PBJKO-BeY-dbKj.js +1 -0
  18. package/assets/chunk-G27WJ6UU-DeX_eH7C.js +231 -0
  19. package/assets/chunk-JWPE2WC7-DaxI9q0u.js +1 -0
  20. package/assets/chunk-LCL6LL3I-B7PkaEz_.js +206 -0
  21. package/assets/chunk-POPQ4Y6H-lwu6ZpsN.js +1 -0
  22. package/assets/chunk-SVP7TREG-CVFllgl1.js +88 -0
  23. package/assets/chunk-XXDRQBXY-DDLN0rcg.js +1 -0
  24. package/assets/classDiagram-DTDB5LWJ-BKtCIC3B.js +1 -0
  25. package/assets/classDiagram-v2-JRS7N3AN-BKtCIC3B.js +1 -0
  26. package/assets/controls/ckeditor.es.js +9370 -9306
  27. package/assets/controls/handsontable.es.js +11971 -11938
  28. package/assets/controls/jsoneditor.es.js +13104 -13008
  29. package/assets/controls/leaflet.es.js +1023 -1004
  30. package/assets/controls/toast-ui.es.js +1843 -1834
  31. package/assets/cose-bilkent-JH36ORCC-CWRyUkhQ.js +1 -0
  32. package/assets/cynefin-OW5HDTMX-B1iLDXCC.js +166 -0
  33. package/assets/cynefinDiagram-5FMLGOSQ-DaXQHr3l.js +62 -0
  34. package/assets/cytoscape.esm-yzknjiTM.js +321 -0
  35. package/assets/dagre-3AP2YEHR-DFORa4Hz.js +4 -0
  36. package/assets/dashboard-Ssa1_Of3.js +3 -0
  37. package/assets/debounce-B3mXI_sx.js +1 -0
  38. package/assets/defaultLocale-DX6XiGOO.js +1 -0
  39. package/assets/diagram-S7CK7UJ4-CgP6KBo0.js +30 -0
  40. package/assets/diagram-UQ7AKVKN-oYfQe6w0.js +41 -0
  41. package/assets/diagram-VSXAHHWV-DfCU5wgt.js +3 -0
  42. package/assets/diagram-VX7I27RA-BITJVrNY.js +24 -0
  43. package/assets/diagram-Z3DM3KII-D8J9Ssjy.js +24 -0
  44. package/assets/docs-DHMt_Rq1.js +1 -0
  45. package/assets/ebnfDiagram-PWID7BFC-qpNmoYgx.js +1 -0
  46. package/assets/erDiagram-SSCWMZ5O-DDF-Y0zs.js +99 -0
  47. package/assets/flowDiagram-A5DVABFB-CjKVkR9T.js +168 -0
  48. package/assets/ganttDiagram-EL5Y4UJY-BXGQ53w6.js +292 -0
  49. package/assets/gitGraphDiagram-WWUBYQGX-BLMevdLh.js +106 -0
  50. package/assets/history-tBOo2gd5.js +1 -0
  51. package/assets/infoDiagram-RXCK75RN-BAnPdnyw.js +2 -0
  52. package/assets/init-Gi6I4Gst.js +1 -0
  53. package/assets/init-user-DrNUHa6r.js +1 -0
  54. package/assets/isObject-DL-BuaBl.js +1 -0
  55. package/assets/ishikawaDiagram-5VMMS53U-PnL0Z4Li.js +70 -0
  56. package/assets/journeyDiagram-EYS64GPL-CLcsCSwF.js +139 -0
  57. package/assets/kanban-definition-3QL26DDD-C2eU3uBE.js +89 -0
  58. package/assets/katex-HP8lGamR.js +257 -0
  59. package/assets/layout-BXoYdHdx.js +1 -0
  60. package/assets/linear-BSzrP0oP.js +1 -0
  61. package/assets/list-CLg6xeIK.js +4 -0
  62. package/assets/login-Ce7o3-o_.js +1 -0
  63. package/assets/manifest.json +834 -58
  64. package/assets/{media-manager-BDbpSSjH.js → media-manager-D7G1P3fz.js} +3 -3
  65. package/assets/mermaid.core-aKMJHeEk.js +310 -0
  66. package/assets/mindmap-definition-FBJOCRG2-Dzbz5ghA.js +96 -0
  67. package/assets/module-BsXph_pA.js +1 -0
  68. package/assets/notification-D-Zz1gF_.js +20 -0
  69. package/assets/ordinal-Cboi1Yqb.js +1 -0
  70. package/assets/pegDiagram-XKGWAZYB-BTdWkU0Y.js +1 -0
  71. package/assets/pieDiagram-E7YTZNPT-Dnw8-TB-.js +39 -0
  72. package/assets/quadrantDiagram-AXDQQJYC-CALzLlg9.js +7 -0
  73. package/assets/railroadDiagram-O6MQD6OU-CTA1vzcv.js +1 -0
  74. package/assets/register-CNnBkzej.js +1 -0
  75. package/assets/requirementDiagram-EFPCY7ZU-UX2CF5HA.js +84 -0
  76. package/assets/ru-CoNgAwFK.js +1 -0
  77. package/assets/sankeyDiagram-P5KCCOFB-4aPp3ATV.js +40 -0
  78. package/assets/sequenceDiagram-WJ2MYXX4--kltkwJw.js +162 -0
  79. package/assets/sizeCapture-X5ZJPWSS-Ca9-g5QY.js +1 -0
  80. package/assets/stateDiagram-HBIQ2CUA-Diaf5Q7I.js +1 -0
  81. package/assets/stateDiagram-v2-4QOOHH4V-C6FlRp7u.js +1 -0
  82. package/assets/swimlanes-XN3QIQJK-DhqX_myE.js +1 -0
  83. package/assets/swimlanesDiagram-VK2B7HYN-i_3LTEBk.js +8 -0
  84. package/assets/timeline-definition-24CTP7MA-CwkJQbhq.js +120 -0
  85. package/assets/toNumber-DZb-r9sy.js +1 -0
  86. package/assets/use-appearance-DC-DESKB.js +1 -0
  87. package/assets/user-filters-list-W47DTBp2.js +1 -0
  88. package/assets/vennDiagram-4TSXK5OY-BNM3_cVS.js +34 -0
  89. package/assets/wardleyDiagram-VM6X3IG4-BODb1NP8.js +78 -0
  90. package/assets/welcome-BeBm6NIi.js +1 -0
  91. package/assets/with-app-layout-B90DtzYC.js +31 -0
  92. package/assets/xychartDiagram-S5SC5T6Z-DthqEh3g.js +7 -0
  93. package/controllers/access-rights/permissionOptions.d.ts +2 -0
  94. package/controllers/access-rights/permissionOptions.js +23 -0
  95. package/controllers/add.js +1 -1
  96. package/controllers/addGroup.js +15 -6
  97. package/controllers/ai/AiAgentController.d.ts +66 -0
  98. package/controllers/ai/AiAgentController.js +435 -0
  99. package/controllers/ai/AiAssistantController.d.ts +0 -4
  100. package/controllers/ai/AiAssistantController.js +4 -78
  101. package/controllers/catalog/FrontendCatalogAdapter.d.ts +1 -1
  102. package/controllers/catalog/FrontentCatalogAdapter.d.ts +1 -1
  103. package/controllers/docs/index.d.ts +22 -0
  104. package/controllers/docs/index.js +126 -0
  105. package/controllers/edit.js +1 -1
  106. package/controllers/editGroup.js +15 -6
  107. package/controllers/feedback/feedbackController.d.ts +1 -1
  108. package/controllers/filter-fields/savedFilters.js +1 -1
  109. package/controllers/history-actions/HistoryController.d.ts +1 -1
  110. package/controllers/history-actions/HistoryController.js +6 -6
  111. package/controllers/list.js +1 -1
  112. package/controllers/login.js +1 -1
  113. package/controllers/media-manager/mediaManagerAdapter.d.ts +1 -1
  114. package/controllers/notifications/NotificationController.js +14 -8
  115. package/controllers/view.js +2 -2
  116. package/controllers/widgets/filterInfo.js +1 -1
  117. package/helpers/accessRightsHelper.d.ts +11 -4
  118. package/helpers/accessRightsHelper.js +82 -12
  119. package/helpers/assetVersionHelper.d.ts +14 -0
  120. package/helpers/assetVersionHelper.js +42 -0
  121. package/helpers/configHelper.d.ts +3 -3
  122. package/helpers/configHelper.js +20 -18
  123. package/helpers/controllerHelper.d.ts +3 -2
  124. package/helpers/controllerHelper.js +25 -15
  125. package/helpers/fieldsHelper.d.ts +2 -2
  126. package/helpers/fieldsHelper.js +3 -3
  127. package/helpers/filterDatetimeHelper.d.ts +1 -1
  128. package/helpers/inertiaActionsHelper.d.ts +3 -3
  129. package/helpers/inertiaActionsHelper.js +4 -5
  130. package/helpers/inertiaAddHelper.d.ts +5 -5
  131. package/helpers/inertiaAddHelper.js +7 -6
  132. package/helpers/inertiaGroupHelper.d.ts +3 -3
  133. package/helpers/inertiaGroupHelper.js +10 -2
  134. package/helpers/inertiaListHelper.d.ts +4 -4
  135. package/helpers/inertiaListHelper.js +7 -8
  136. package/helpers/inertiaMenuHelper.d.ts +2 -3
  137. package/helpers/inertiaMenuHelper.js +3 -26
  138. package/helpers/inertiaUserHelper.d.ts +3 -3
  139. package/helpers/menuHelper.d.ts +2 -2
  140. package/helpers/modelResourceHelper.d.ts +9 -0
  141. package/helpers/modelResourceHelper.js +43 -0
  142. package/helpers/navigationAccessHelper.d.ts +13 -0
  143. package/helpers/navigationAccessHelper.js +40 -0
  144. package/helpers/translationHelper.d.ts +2 -2
  145. package/index.d.ts +69 -58
  146. package/index.js +11 -0
  147. package/interfaces/adminpanelConfig.d.ts +18 -5
  148. package/interfaces/global.d.ts +6 -6
  149. package/interfaces/internalModelAccess.d.ts +1 -1
  150. package/interfaces/listQueryBuilder.d.ts +1 -1
  151. package/interfaces/types.d.ts +171 -2
  152. package/lib/Adminizer.d.ts +46 -26
  153. package/lib/Adminizer.js +37 -1
  154. package/lib/DataAccessor.d.ts +7 -6
  155. package/lib/DataAccessor.js +50 -48
  156. package/lib/MiddlewareManager.d.ts +1 -1
  157. package/lib/access-rights/AccessRightsHandler.d.ts +2 -2
  158. package/lib/admin-links/AdminLinkHandler.d.ts +72 -0
  159. package/lib/admin-links/AdminLinkHandler.js +175 -0
  160. package/lib/ai-assistant/AbstractAiConversationHistoryService.d.ts +39 -0
  161. package/lib/ai-assistant/AbstractAiConversationHistoryService.js +98 -0
  162. package/lib/ai-assistant/AbstractAiModelService.d.ts +140 -3
  163. package/lib/ai-assistant/AbstractAiModelService.js +154 -1
  164. package/lib/ai-assistant/AiAgentRunManager.d.ts +35 -0
  165. package/lib/ai-assistant/AiAgentRunManager.js +109 -0
  166. package/lib/ai-assistant/AiAssistantAgentSkillHandler.d.ts +58 -0
  167. package/lib/ai-assistant/AiAssistantAgentSkillHandler.js +87 -0
  168. package/lib/ai-assistant/AiAssistantHandler.d.ts +16 -5
  169. package/lib/ai-assistant/AiAssistantHandler.js +35 -1
  170. package/lib/ai-assistant/AiAssistantUiMethodHandler.d.ts +60 -0
  171. package/lib/ai-assistant/AiAssistantUiMethodHandler.js +138 -0
  172. package/lib/ai-assistant/builtinAgentSkills.d.ts +9 -0
  173. package/lib/ai-assistant/builtinAgentSkills.js +256 -0
  174. package/lib/ai-assistant/jsonSafe.d.ts +13 -0
  175. package/lib/ai-assistant/jsonSafe.js +81 -0
  176. package/lib/app-manager/AdminizerApp.d.ts +40 -11
  177. package/lib/app-manager/AppManager.d.ts +2 -2
  178. package/lib/app-manager/AppManager.js +54 -50
  179. package/lib/app-manager/AssetHandler.d.ts +2 -2
  180. package/lib/app-manager/ConfigLayerHandler.d.ts +2 -2
  181. package/lib/app-manager/ControllerHandler.d.ts +2 -2
  182. package/lib/catalog/AbstractCatalog.d.ts +1 -1
  183. package/lib/catalog/CatalogHandler.d.ts +1 -1
  184. package/lib/controls/ControlsHandler.d.ts +1 -1
  185. package/lib/controls/codeEditor/MonacoEditor.d.ts +1 -1
  186. package/lib/controls/geojsoneditor/GeoEditor.d.ts +1 -1
  187. package/lib/controls/jsoneditor/JsonEditor.d.ts +1 -1
  188. package/lib/controls/markdown/ToastUiEditor.d.ts +1 -1
  189. package/lib/controls/table/Handsontable.d.ts +1 -1
  190. package/lib/controls/wysiwyg/CKeditor.d.ts +1 -1
  191. package/lib/docs/AbstractDocumentation.d.ts +100 -0
  192. package/lib/docs/AbstractDocumentation.js +108 -0
  193. package/lib/docs/DocumentationHandler.d.ts +100 -0
  194. package/lib/docs/DocumentationHandler.js +198 -0
  195. package/lib/docs/FileDocumentation.d.ts +47 -0
  196. package/lib/docs/FileDocumentation.js +189 -0
  197. package/lib/docs/docsAgentSkills.d.ts +10 -0
  198. package/lib/docs/docsAgentSkills.js +93 -0
  199. package/lib/feedback/FeedbackHandler.d.ts +2 -2
  200. package/lib/filters/ConditionValidator.d.ts +1 -1
  201. package/lib/filters/FilterCustomFieldHandler.d.ts +2 -2
  202. package/lib/filters/FilterService.d.ts +4 -4
  203. package/lib/filters/FilterService.js +4 -3
  204. package/lib/filters/index.d.ts +6 -6
  205. package/lib/history-actions/AbstractHistoryAdapter.d.ts +6 -6
  206. package/lib/history-actions/AbstractHistoryAdapter.js +11 -9
  207. package/lib/history-actions/DefaultHistoryAdapter.d.ts +4 -4
  208. package/lib/history-actions/HistoryHandler.d.ts +1 -1
  209. package/lib/list-query-builder/ListQueryBuilder.d.ts +7 -7
  210. package/lib/media-manager/AbstractMediaManager.d.ts +2 -2
  211. package/lib/media-manager/MediaManagerHandler.d.ts +1 -1
  212. package/lib/media-manager/Thumb.d.ts +1 -1
  213. package/lib/media-manager/helpers/MediaManagerHelper.d.ts +5 -5
  214. package/lib/model/AbstractModel.d.ts +11 -4
  215. package/lib/model/InternalModelAccessFactory.d.ts +2 -2
  216. package/lib/model/ModelHandler.d.ts +50 -5
  217. package/lib/model/ModelHandler.js +107 -8
  218. package/lib/model/adapter/sequelize.d.ts +7 -5
  219. package/lib/model/adapter/sequelize.js +79 -46
  220. package/lib/model/adapter/typeorm.d.ts +2 -2
  221. package/lib/model/adapter/typeorm.js +1 -1
  222. package/lib/model/internalModelRepository.d.ts +2 -2
  223. package/lib/notifications/AbstractNotificationService.d.ts +4 -4
  224. package/lib/notifications/GeneralNotificationService.d.ts +2 -2
  225. package/lib/notifications/GeneralNotificationService.js +6 -5
  226. package/lib/notifications/NotificationHandler.d.ts +2 -2
  227. package/lib/notifications/SystemNotificationService.d.ts +2 -2
  228. package/lib/notifications/SystemNotificationService.js +1 -1
  229. package/lib/requestProcessor.d.ts +1 -1
  230. package/lib/ui-i18n/uiTranslationKeys.d.ts +2 -1
  231. package/lib/ui-i18n/uiTranslationKeys.js +42 -1
  232. package/lib/widgets/abstractAction.d.ts +1 -1
  233. package/lib/widgets/abstractCustom.d.ts +2 -2
  234. package/lib/widgets/abstractInfo.d.ts +1 -1
  235. package/lib/widgets/abstractLink.d.ts +2 -2
  236. package/lib/widgets/abstractSwitch.d.ts +1 -1
  237. package/lib/widgets/abstractWidgetBase.d.ts +1 -1
  238. package/lib/widgets/widgetHandler.d.ts +9 -9
  239. package/lib/widgets/widgetHandler.js +5 -1
  240. package/models/Filter.d.ts +1 -1
  241. package/models/FilterColumn.d.ts +1 -1
  242. package/models/Group.d.ts +3 -2
  243. package/models/HistoryActions.d.ts +1 -1
  244. package/models/MediaManagerAP.d.ts +2 -2
  245. package/models/MediaManagerAssociationsAP.d.ts +1 -1
  246. package/models/MediaManagerMetaAP.d.ts +1 -1
  247. package/models/User.d.ts +2 -2
  248. package/models/UserNotification.d.ts +1 -1
  249. package/package.json +29 -20
  250. package/policies/authPolicies.js +6 -6
  251. package/policies/permissionResolvers.d.ts +1 -0
  252. package/policies/permissionResolvers.js +3 -0
  253. package/services/FeedService.d.ts +3 -3
  254. package/system/Router.d.ts +1 -1
  255. package/system/Router.js +27 -1
  256. package/system/bindAccessRights.d.ts +1 -1
  257. package/system/bindAccessRights.js +2 -3
  258. package/system/bindAuthorization.d.ts +1 -1
  259. package/system/bindControls.d.ts +1 -1
  260. package/system/bindCors.d.ts +1 -1
  261. package/system/bindCustomFilterHandlers.d.ts +1 -1
  262. package/system/bindDashboardWidgets.d.ts +1 -1
  263. package/system/bindDev.d.ts +1 -1
  264. package/system/bindDocs.d.ts +13 -0
  265. package/system/bindDocs.js +77 -0
  266. package/system/bindHistory.d.ts +1 -1
  267. package/system/bindInertia.d.ts +1 -1
  268. package/system/bindInertia.js +23 -1
  269. package/system/bindMediaManager.d.ts +1 -1
  270. package/system/bindNotifications.d.ts +1 -1
  271. package/system/bindReqFunctions.d.ts +1 -1
  272. package/system/bindTranslations.d.ts +1 -1
  273. package/system/buildInternalModelAccess.d.ts +3 -3
  274. package/system/buildInternalModelAccess.js +5 -2
  275. package/system/defaults.d.ts +1 -1
  276. package/system/routePolicies.d.ts +1 -1
  277. package/system/systemModelContracts.d.ts +1 -1
  278. package/system/systemModelContracts.js +11 -7
  279. package/system/validateSystemModels.d.ts +1 -1
  280. package/system/validateSystemModels.js +29 -9
  281. package/assets/add-group-BdHFzKng.js +0 -1
  282. package/assets/add-p6yGCoZ7.js +0 -1
  283. package/assets/add-user-CDspCLu4.js +0 -1
  284. package/assets/app-DNXiApCk.css +0 -1
  285. package/assets/app-layout-DCr_-JY3.js +0 -1
  286. package/assets/app.js +0 -138
  287. package/assets/catalog-XN-_p9TB.js +0 -6
  288. package/assets/dashboard-CHZO2QFY.js +0 -3
  289. package/assets/debounce-BMmXVQ06.js +0 -1
  290. package/assets/history-CQd0FojQ.js +0 -1
  291. package/assets/init-user-8aUohVDq.js +0 -1
  292. package/assets/list-PHWgTHsg.js +0 -4
  293. package/assets/login-CO4laf6m.js +0 -1
  294. package/assets/module-DVyQtIxm.js +0 -1
  295. package/assets/notification-B87XG8nQ.js +0 -20
  296. package/assets/register-DBYIMXGQ.js +0 -1
  297. package/assets/ru-rYKdQbWF.js +0 -1
  298. package/assets/use-appearance-_EbbjHTh.js +0 -1
  299. package/assets/user-filters-list-BRzDbPkx.js +0 -1
  300. package/assets/welcome-DiXmrTgc.js +0 -1
@@ -1,4 +1,4 @@
1
- import type { Filter } from "./Filter";
1
+ import type { Filter } from "./Filter.js";
2
2
  /**
3
3
  * FilterColumn interface for TypeScript
4
4
  */
package/models/Group.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import type { User } from "./User";
1
+ import type { User } from "./User.js";
2
+ import type { PermissionGrant } from "../interfaces/types.js";
2
3
  export interface Group {
3
4
  id?: number;
4
5
  name: string;
5
6
  description?: string;
6
- tokens?: string[];
7
+ tokens?: PermissionGrant[];
7
8
  users?: User[];
8
9
  }
@@ -1,4 +1,4 @@
1
- import type { User } from "./User";
1
+ import type { User } from "./User.js";
2
2
  export interface HistoryActions {
3
3
  id?: number;
4
4
  modelId: number | string;
@@ -1,5 +1,5 @@
1
- import type { MediaManagerAssociationsAP } from "./MediaManagerAssociationsAP";
2
- import type { MediaManagerMetaAP } from "./MediaManagerMetaAP";
1
+ import type { MediaManagerAssociationsAP } from "./MediaManagerAssociationsAP.js";
2
+ import type { MediaManagerMetaAP } from "./MediaManagerMetaAP.js";
3
3
  export interface MediaManagerAP {
4
4
  id: string;
5
5
  parent?: MediaManagerAP;
@@ -1,4 +1,4 @@
1
- import type { MediaManagerAP } from "./MediaManagerAP";
1
+ import type { MediaManagerAP } from "./MediaManagerAP.js";
2
2
  export interface MediaManagerAssociationsAP {
3
3
  id: string;
4
4
  mediaManagerId?: string;
@@ -1,4 +1,4 @@
1
- import type { MediaManagerAP } from "./MediaManagerAP";
1
+ import type { MediaManagerAP } from "./MediaManagerAP.js";
2
2
  export interface MediaManagerMetaAP {
3
3
  id?: string;
4
4
  key?: string;
package/models/User.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { WidgetConfig, WidgetsLayouts } from "../lib/widgets/widgetHandler";
2
- import type { Group } from "./Group";
1
+ import type { WidgetConfig, WidgetsLayouts } from "../lib/widgets/widgetHandler.js";
2
+ import type { Group } from "./Group.js";
3
3
  export interface User {
4
4
  id?: number;
5
5
  login: string;
@@ -1,4 +1,4 @@
1
- import type { Notification } from "./Notification";
1
+ import type { Notification } from "./Notification.js";
2
2
  export interface UserNotification {
3
3
  id: number;
4
4
  userId: number;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "adminizer",
3
3
  "type": "module",
4
- "version": "5.0.0-build.2",
4
+ "version": "5.0.0-build.21",
5
5
  "main": "index.js",
6
6
  "exports": {
7
7
  ".": "./index.js",
@@ -21,7 +21,7 @@
21
21
  "dev:typeorm:no-seed": "cross-env ADMINIZER_ENV=dev NO_SEED_DATA=true ORM=typeorm tsx watch --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
22
22
  "dev:no-seed-clean": "cross-env ADMINIZER_ENV=dev NO_SEED_DATA=true CLEAN_TMP=true ORM=sequelize tsx watch --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
23
23
  "dev:cors": "cross-env ADMINIZER_ENV=dev NO_SEED_DATA=true ORM=sequelize FRONTEND_URL=http://localhost:8080 tsx watch --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
24
- "build:assets": "vite build && vite build --config vite.config.controls.ts && vite build --config fixture/widgets/vite.config.widget.ts",
24
+ "build:assets": "vite build && vite build --config vite.config.controls.ts && vite build --config vite.config.ai-assistant.ts && vite build --config fixture/widgets/vite.config.widget.ts",
25
25
  "build:controls": "vite build --config vite.config.controls.ts",
26
26
  "compile:backend": "tsc -p src/tsconfig.json && node ./scripts/appendJsExtension.js",
27
27
  "compile:ui": "tsc -p tsconfig.ui.json",
@@ -31,7 +31,8 @@
31
31
  "build": "npm run copy:backend && npm run compile:backend && npm run compile:ui && npm run build:assets",
32
32
  "build:catalog-modules": "cross-env CATALOG_COMPONENT=catalogAction vite build --config fixture/virtual-catalog/vite.config.module.ts && cross-env CATALOG_COMPONENT=Group vite build --config fixture/virtual-catalog/vite.config.module.ts",
33
33
  "start:typeorm:seed": "cross-env ORM=typeorm tsx --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
34
- "build:apps": "vite build --config fixture/apps/notification-sender/vite.config.module.ts && vite build --config fixture/apps/module-manager/vite.config.module.ts && vite build --config fixture/apps/navigation/vite.config.module.ts && vite build --config fixture/apps/quill-editor/vite.config.module.ts && vite build --config fixture/apps/widgets/vite.config.module.ts && vite build --config fixture/apps/handsontable-test/vite.config.module.ts && npm run build:catalog-modules"
34
+ "build:apps": "vite build --config fixture/apps/notification-sender/vite.config.module.ts && vite build --config fixture/apps/module-manager/vite.config.module.ts && vite build --config fixture/apps/navigation/vite.config.module.ts && vite build --config fixture/apps/quill-editor/vite.config.module.ts && vite build --config fixture/apps/widgets/vite.config.module.ts && vite build --config fixture/apps/handsontable-test/vite.config.module.ts && vite build --config fixture/apps/record-scope-test/vite.config.module.ts && npm run build:catalog-modules",
35
+ "build:ai-assistant": "vite build --config vite.config.ai-assistant.ts"
35
36
  },
36
37
  "keywords": [],
37
38
  "author": "Siziy Ivan <xziy88@gmail.com>",
@@ -59,41 +60,34 @@
59
60
  "jsonwebtoken": "^9.0.3",
60
61
  "multer": "^2.1.1",
61
62
  "password-hash": "^1.2.2",
63
+ "serve-static": "^2.2.1",
62
64
  "sharp": "^0.33.5",
63
65
  "sprintf-js": "^1.1.3",
66
+ "sqlite3": "^5.1.7",
67
+ "typeorm": "^0.3.20",
64
68
  "uuid": "^14.0.0",
65
69
  "winston": "^3.17.0",
66
70
  "xlsx": "^0.18.5",
67
- "zod": "^4.1.11",
68
- "sqlite3": "^5.1.7",
69
- "typeorm": "^0.3.20"
71
+ "zod": "^4.1.11"
70
72
  },
71
73
  "devDependencies": {
72
- "reflect-metadata": "^0.2.2",
73
- "react-dnd": "^16.0.1",
74
- "react-cropper": "^2.3.3",
75
- "material-icons": "^1.13.14",
76
- "next-themes": "^0.4.6",
77
- "dotenv": "^17.4.2",
78
- "date-fns": "^3.6.0",
79
- "cmdk": "^1.1.1",
80
- "@handsontable/react-wrapper": "^17.0.1",
81
- "@minoru/react-dnd-treeview": "^3.5.2",
82
- "@radix-ui/react-context-menu": "^2.2.15",
83
- "@radix-ui/react-tabs": "^1.1.12",
84
- "typescript": "^6.0.3",
74
+ "@assistant-ui/react": "^0.15.15",
75
+ "@assistant-ui/react-markdown": "^0.14.6",
85
76
  "@babel/plugin-proposal-decorators": "^7.27.1",
86
77
  "@ckeditor/ckeditor5-react": "^9.5.0",
87
78
  "@dnd-kit/core": "^6.3.1",
88
79
  "@dnd-kit/sortable": "^10.0.0",
89
80
  "@eslint/compat": "^1.2.9",
90
81
  "@faker-js/faker": "^9.7.0",
82
+ "@handsontable/react-wrapper": "^17.0.1",
91
83
  "@inertiajs/react": "^3.0.3",
84
+ "@minoru/react-dnd-treeview": "^3.5.2",
92
85
  "@monaco-editor/react": "^4.7.0",
93
86
  "@openai/agents": "^0.3.2",
94
87
  "@radix-ui/react-avatar": "^1.1.3",
95
88
  "@radix-ui/react-checkbox": "^1.1.4",
96
89
  "@radix-ui/react-collapsible": "^1.1.3",
90
+ "@radix-ui/react-context-menu": "^2.2.15",
97
91
  "@radix-ui/react-dialog": "^1.1.7",
98
92
  "@radix-ui/react-dropdown-menu": "^2.1.6",
99
93
  "@radix-ui/react-label": "^2.1.2",
@@ -105,6 +99,7 @@
105
99
  "@radix-ui/react-slider": "^1.2.3",
106
100
  "@radix-ui/react-slot": "^1.2.0",
107
101
  "@radix-ui/react-switch": "^1.2.4",
102
+ "@radix-ui/react-tabs": "^1.1.12",
108
103
  "@radix-ui/react-tooltip": "^1.1.8",
109
104
  "@tailwindcss/vite": "^4.0.15",
110
105
  "@tanstack/react-table": "^8.21.2",
@@ -129,10 +124,14 @@
129
124
  "@types/uuid": "^10.0.0",
130
125
  "@typescript-eslint/eslint-plugin": "^8.32.1",
131
126
  "@vitejs/plugin-react": "^5.2.0",
127
+ "asmcrypto.js": "^0.22.0",
132
128
  "ckeditor5": "^45.0.0",
133
129
  "class-variance-authority": "^0.7.1",
134
130
  "clsx": "^2.1.1",
131
+ "cmdk": "^1.1.1",
135
132
  "cross-env": "^7.0.3",
133
+ "date-fns": "^3.6.0",
134
+ "dotenv": "^17.4.2",
136
135
  "eslint": "^9.26.0",
137
136
  "handsontable": "^17.0.1",
138
137
  "isomorphic-webcrypto": "^2.3.8",
@@ -141,14 +140,22 @@
141
140
  "leaflet-draw": "^1.0.4",
142
141
  "lodash-es": "^4.17.21",
143
142
  "lucide-react": "^0.485.0",
143
+ "material-icons": "^1.13.14",
144
+ "mermaid": "^11.17.0",
145
+ "next-themes": "^0.4.6",
146
+ "radix-ui": "^1.6.7",
144
147
  "react": "^19.0.0",
148
+ "react-cropper": "^2.3.3",
145
149
  "react-day-picker": "^8.10.1",
150
+ "react-dnd": "^16.0.1",
146
151
  "react-dom": "^19.0.0",
147
152
  "react-grid-layout": "^1.5.1",
148
153
  "react-intersection-observer": "^9.16.0",
149
154
  "react-leaflet": "^5.0.0",
150
155
  "react-quill-new": "^3.4.6",
151
156
  "react-simple-wysiwyg": "^3.2.2",
157
+ "reflect-metadata": "^0.2.2",
158
+ "remark-gfm": "^4.0.1",
152
159
  "sequelize": "^6.37.7",
153
160
  "sequelize-typescript": "^2.1.6",
154
161
  "shelljs": "^0.9.2",
@@ -157,10 +164,12 @@
157
164
  "tailwindcss": "^4.0.15",
158
165
  "tsx": "^4.21.0",
159
166
  "tw-animate-css": "^1.2.5",
167
+ "typescript": "^6.0.3",
160
168
  "vanilla-jsoneditor": "^3.1.1",
161
169
  "vite": "^7.3.2",
162
170
  "vite-plugin-externals": "^0.6.2",
163
- "vitest": "^3.0.7"
171
+ "vitest": "^3.0.7",
172
+ "zustand": "^5.0.14"
164
173
  },
165
174
  "overrides": {
166
175
  "@toast-ui/react-editor": {
@@ -20,7 +20,7 @@ function resolveToken(token, req) {
20
20
  return token;
21
21
  }
22
22
  export function requireAuthEnabled() {
23
- return (req, res, next) => {
23
+ return async (req, res, next) => {
24
24
  if (!req.adminizer.config.auth.enable) {
25
25
  return res.status(403).json({ error: "Auth is disabled" });
26
26
  }
@@ -28,7 +28,7 @@ export function requireAuthEnabled() {
28
28
  };
29
29
  }
30
30
  export function requireAuthUI() {
31
- return (req, res, next) => {
31
+ return async (req, res, next) => {
32
32
  if (req.adminizer.config.auth.enable && !req.user) {
33
33
  unauthorized(req, res, "ui");
34
34
  return;
@@ -64,7 +64,7 @@ export function requireAdmin(options = {}) {
64
64
  }
65
65
  export function requirePermission(token, options = {}) {
66
66
  const mode = options.mode || "api";
67
- return (req, res, next) => {
67
+ return async (req, res, next) => {
68
68
  if (!req.adminizer.config.auth.enable) {
69
69
  return next();
70
70
  }
@@ -73,7 +73,7 @@ export function requirePermission(token, options = {}) {
73
73
  return;
74
74
  }
75
75
  const tokenId = resolveToken(token, req);
76
- const hasPermission = req.adminizer.accessRightsHelper.hasPermission(tokenId, req.user);
76
+ const hasPermission = await req.adminizer.accessRightsHelper.hasPermission(tokenId, req.user);
77
77
  if (!hasPermission) {
78
78
  forbidden(req, res, mode);
79
79
  return;
@@ -83,7 +83,7 @@ export function requirePermission(token, options = {}) {
83
83
  }
84
84
  export function requireAnyPermission(tokens, options = {}) {
85
85
  const mode = options.mode || "api";
86
- return (req, res, next) => {
86
+ return async (req, res, next) => {
87
87
  if (!req.adminizer.config.auth.enable) {
88
88
  return next();
89
89
  }
@@ -94,7 +94,7 @@ export function requireAnyPermission(tokens, options = {}) {
94
94
  const tokenIds = tokens
95
95
  .map((token) => resolveToken(token, req))
96
96
  .filter((token) => Boolean(token));
97
- const hasPermission = req.adminizer.accessRightsHelper.enoughPermissions(tokenIds, req.user);
97
+ const hasPermission = await req.adminizer.accessRightsHelper.enoughPermissions(tokenIds, req.user);
98
98
  if (!hasPermission) {
99
99
  forbidden(req, res, mode);
100
100
  return;
@@ -8,5 +8,6 @@ export declare function widgetsToken(): string;
8
8
  export declare function catalogToken(req: ReqType): string | undefined;
9
9
  export declare function mediaManagerToken(req: ReqType): string | undefined;
10
10
  export declare function aiModelToken(req: ReqType): string | undefined;
11
+ export declare function documentationToken(req: ReqType): string;
11
12
  export declare function historyToken(req: ReqType): string;
12
13
  export declare function groupFilterVisibilityToken(): string;
@@ -44,6 +44,9 @@ export function aiModelToken(req) {
44
44
  const modelId = req.params?.modelId || (typeof req.body?.modelId === "string" ? req.body.modelId : undefined);
45
45
  return modelId ? `ai-assistant-${modelId}` : undefined;
46
46
  }
47
+ export function documentationToken(req) {
48
+ return req.adminizer.documentationHandler.baseToken;
49
+ }
47
50
  export function historyToken(req) {
48
51
  return `history-${req.adminizer.config.history?.adapter ?? "default"}`;
49
52
  }
@@ -1,6 +1,6 @@
1
- import { Adminizer } from "../lib/Adminizer";
2
- import { Filter } from "../models/Filter";
3
- import { User } from "../models/User";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
+ import { Filter } from "../models/Filter.js";
3
+ import { User } from "../models/User.js";
4
4
  /**
5
5
  * Feed export format types
6
6
  */
@@ -1,4 +1,4 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export default class Router {
3
3
  adminizer: Adminizer;
4
4
  constructor(adminizer: Adminizer);
package/system/Router.js CHANGED
@@ -11,6 +11,7 @@ import { getSavedFilters, saveFilter, deleteFilter, applyTemporaryFilter, getTem
11
11
  import { getAllUserFilters } from "../controllers/filter-fields/getAllUserFilters.js";
12
12
  import { getModelColumns, updateFilterColumns } from "../controllers/filter-fields/columns.js";
13
13
  import { getAllGroups } from "../controllers/filter-fields/groups.js";
14
+ import { getPermissionOptions } from "../controllers/access-rights/permissionOptions.js";
14
15
  import { ckEditorUpload } from "../controllers/ckeditorUpload.js";
15
16
  import _exportData from "../controllers/exportData.js";
16
17
  import _feed from "../controllers/feed.js";
@@ -29,9 +30,11 @@ import { Adminizer } from "../lib/Adminizer.js";
29
30
  import timezones from "../controllers/timezones.js";
30
31
  import { NotificationController } from "../controllers/notifications/NotificationController.js";
31
32
  import { HistoryController } from "../controllers/history-actions/HistoryController.js";
33
+ import { AiAssistantController } from "../controllers/ai/AiAssistantController.js";
34
+ import { AiAgentController } from "../controllers/ai/AiAgentController.js";
32
35
  import listUserFilters from "../controllers/listUserFilters.js";
33
36
  import { requireAnyPermission, requireAuthAPI, requireAuthEnabled, requireAuthUI, requirePermission } from "../policies/authPolicies.js";
34
- import { catalogToken, groupFilterVisibilityToken, historyToken, mediaManagerToken, modelCreateToken, modelDeleteToken, modelReadToken, modelUpdateToken, widgetToken, widgetsToken } from "../policies/permissionResolvers.js";
37
+ import { aiModelToken, catalogToken, groupFilterVisibilityToken, historyToken, mediaManagerToken, modelCreateToken, modelDeleteToken, modelReadToken, modelUpdateToken, widgetToken, widgetsToken } from "../policies/permissionResolvers.js";
35
38
  import { bindWithMiddlewares } from "./routePolicies.js";
36
39
  export default class Router {
37
40
  adminizer;
@@ -69,6 +72,7 @@ export default class Router {
69
72
  const noCachePrefixes = [
70
73
  '/api',
71
74
  '/notifications/api',
75
+ '/docs/api',
72
76
  '/history',
73
77
  '/widgets-get-all',
74
78
  '/widgets-get-all-db',
@@ -166,6 +170,7 @@ export default class Router {
166
170
  /**
167
171
  * List of records
168
172
  */
173
+ adminizer.app.get(`${adminizer.config.routePrefix}/access-rights/permission-options`, withPolicies(getPermissionOptions, requireAuthAPI(), requireAnyPermission(["create-Group-model", "update-Group-model"])));
169
174
  adminizer.app.all(resourceRoute(), withPolicies(_list, requireAuthUI(), requirePermission(modelReadToken, { mode: "ui" })));
170
175
  if (adminizer.config.filters?.enabled) {
171
176
  /**
@@ -217,6 +222,27 @@ export default class Router {
217
222
  */
218
223
  adminizer.app.get(`${adminizer.config.routePrefix}/api/user-key`, withPolicies(getUserApiKey, requireAuthEnabled(), requireAuthAPI()));
219
224
  adminizer.app.post(`${adminizer.config.routePrefix}/api/user-key/regenerate`, withPolicies(regenerateUserApiKey, requireAuthEnabled(), requireAuthAPI()));
225
+ /**
226
+ * AI assistant — consumed by src/assets/js/contexts/AiAssistantContext.tsx
227
+ */
228
+ adminizer.app.get(`${adminizer.config.routePrefix}/api/ai-assistant/models`, withPolicies(AiAssistantController.getModels, requireAuthAPI()));
229
+ /**
230
+ * Streaming agent transport — consumed by the assistant panel bundle
231
+ * (src/assets/js/ai-assistant). Model services that implement only
232
+ * `generateReply` are served through the same routes.
233
+ */
234
+ const agentRoute = `${adminizer.config.routePrefix}/api/ai-assistant/agent/:modelId`;
235
+ adminizer.app.get(`${agentRoute}/status`, withPolicies(AiAgentController.getStatus, requireAuthAPI(), requirePermission(aiModelToken)));
236
+ adminizer.app.get(`${agentRoute}/limits`, withPolicies(AiAgentController.getLimits, requireAuthAPI(), requirePermission(aiModelToken)));
237
+ adminizer.app.get(`${agentRoute}/meta`, withPolicies(AiAgentController.getMeta, requireAuthAPI(), requirePermission(aiModelToken)));
238
+ adminizer.app.post(`${agentRoute}/model`, withPolicies(AiAgentController.setModel, requireAuthAPI(), requirePermission(aiModelToken)));
239
+ adminizer.app.get(`${agentRoute}/history`, withPolicies(AiAgentController.getHistory, requireAuthAPI(), requirePermission(aiModelToken)));
240
+ adminizer.app.get(`${agentRoute}/conversations`, withPolicies(AiAgentController.listConversations, requireAuthAPI(), requirePermission(aiModelToken)));
241
+ adminizer.app.post(`${agentRoute}/conversations`, withPolicies(AiAgentController.createConversation, requireAuthAPI(), requirePermission(aiModelToken)));
242
+ adminizer.app.post(`${agentRoute}/conversations/:conversationId/select`, withPolicies(AiAgentController.selectConversation, requireAuthAPI(), requirePermission(aiModelToken)));
243
+ adminizer.app.delete(`${agentRoute}/conversations/:conversationId`, withPolicies(AiAgentController.deleteConversation, requireAuthAPI(), requirePermission(aiModelToken)));
244
+ adminizer.app.post(`${agentRoute}/runs`, withPolicies(AiAgentController.startRun, requireAuthAPI(), requirePermission(aiModelToken)));
245
+ adminizer.app.get(`${agentRoute}/runs/:runId/stream`, withPolicies(AiAgentController.streamRun, requireAuthAPI(), requirePermission(aiModelToken)));
220
246
  adminizer.app.get(`${adminizer.config.routePrefix}/get-timezones`, withPolicies(timezones, requireAuthUI()));
221
247
  if (adminizer.config.models) {
222
248
  for (let model in adminizer.config.models) {
@@ -1,2 +1,2 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export default function bindAccessRights(adminizer: Adminizer): Promise<void>;
@@ -2,10 +2,9 @@ import { GROUP_FILTER_VISIBILITY_TOKEN } from "../policies/permissionResolvers.j
2
2
  export default async function bindAccessRights(adminizer) {
3
3
  if (adminizer.config.models) {
4
4
  let models = adminizer.config.models;
5
- for (let key of Object.keys(models)) {
6
- const model = models[key];
5
+ for (const [resourceName, model] of Object.entries(models)) {
7
6
  if (typeof model !== "boolean") {
8
- adminizer.accessRightsHelper.registerModelTokens(model.model);
7
+ adminizer.accessRightsHelper.registerModelTokens(resourceName);
9
8
  }
10
9
  }
11
10
  }
@@ -1,2 +1,2 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export default function bindAuthorization(adminizer: Adminizer): Promise<void>;
@@ -1,2 +1,2 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export declare function bindControls(adminizer: Adminizer): void;
@@ -1,2 +1,2 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export declare function bindCors(adminizer: Adminizer): void;
@@ -1,2 +1,2 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export default function bindCustomFilterHandlers(adminizer: Adminizer): void;
@@ -1,2 +1,2 @@
1
- import { Adminizer } from '../lib/Adminizer';
1
+ import { Adminizer } from '../lib/Adminizer.js';
2
2
  export default function bindDashboardWidgets(adminizer: Adminizer): Promise<void>;
@@ -1,2 +1,2 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export default function bindDev(adminizer: Adminizer): void;
@@ -0,0 +1,13 @@
1
+ import { Adminizer } from '../lib/Adminizer.js';
2
+ /**
3
+ * The single wiring point of the documentation subsystem: the base token, the
4
+ * navigation entries, the assistant skills and the HTTP routes.
5
+ *
6
+ * It is run by `DocumentationHandler.activate()` — at most once, and only when
7
+ * the feature has both of its switches: `config.documentation.enabled` is
8
+ * `true` AND an implementation is registered. Either one missing means none of
9
+ * this exists; the feature is indistinguishable from absent. The implementation
10
+ * arrives after `init()`, so the routes are mounted late — the same way the
11
+ * feedback controller is.
12
+ */
13
+ export default function bindDocs(adminizer: Adminizer): void;
@@ -0,0 +1,77 @@
1
+ import { DOCUMENTATION_DEPARTMENT } from '../lib/docs/DocumentationHandler.js';
2
+ import { buildDocumentationAgentSkills } from '../lib/docs/docsAgentSkills.js';
3
+ import { docsContext, docsDoc, docsKeywords, docsList, docsPage, docsResolve, docsSchema, docsSearch } from '../controllers/docs';
4
+ import { requireAuthAPI, requireAuthUI, requirePermission } from '../policies/authPolicies.js';
5
+ import { documentationToken } from '../policies/permissionResolvers.js';
6
+ import { bindWithMiddlewares } from './routePolicies.js';
7
+ /**
8
+ * The single wiring point of the documentation subsystem: the base token, the
9
+ * navigation entries, the assistant skills and the HTTP routes.
10
+ *
11
+ * It is run by `DocumentationHandler.activate()` — at most once, and only when
12
+ * the feature has both of its switches: `config.documentation.enabled` is
13
+ * `true` AND an implementation is registered. Either one missing means none of
14
+ * this exists; the feature is indistinguishable from absent. The implementation
15
+ * arrives after `init()`, so the routes are mounted late — the same way the
16
+ * feedback controller is.
17
+ */
18
+ export default function bindDocs(adminizer) {
19
+ adminizer.accessRightsHelper.registerToken({
20
+ id: adminizer.documentationHandler.baseToken,
21
+ name: 'Documentation',
22
+ description: 'Access to the built-in documentation (knowledge base)',
23
+ department: DOCUMENTATION_DEPARTMENT,
24
+ });
25
+ // The viewer in the navigation, and the per-document page as a template:
26
+ // the assistant discovers both through `list_admin_navigation` and can
27
+ // link a user straight to an article.
28
+ adminizer.adminLinkHandler.add({
29
+ id: 'documentation',
30
+ type: 'page',
31
+ name: 'Documentation',
32
+ title: 'Documentation',
33
+ link: `${adminizer.config.routePrefix}/docs`,
34
+ section: 'Platform',
35
+ accessRightsToken: adminizer.documentationHandler.baseToken,
36
+ });
37
+ adminizer.adminLinkHandler.addTemplate({
38
+ id: 'documentation-article',
39
+ title: 'Documentation article',
40
+ description: 'A single knowledge base article opened in the documentation viewer',
41
+ template: `${adminizer.config.routePrefix}/docs/:id`,
42
+ section: 'Platform',
43
+ accessRightsToken: adminizer.documentationHandler.baseToken,
44
+ params: [{ name: 'id', description: 'Document id as returned by the documentation skills' }],
45
+ });
46
+ // The assistant and the documentation are independent: skills are just
47
+ // registered; whether an agent picks them up is the assistant's business.
48
+ for (const skill of buildDocumentationAgentSkills(adminizer)) {
49
+ adminizer.aiAssistantAgentSkillHandler.add(skill);
50
+ }
51
+ /**
52
+ * HTTP routes — a thin proxy over DocumentationHandler. Mounted routes
53
+ * cannot be unmounted, so after a runtime `unregister()` the API answers
54
+ * the same `404` an unknown path gets, not a 500.
55
+ */
56
+ const requireDocsService = (req, res, next) => {
57
+ if (!req.adminizer.documentationHandler.isRegistered()) {
58
+ return res.status(404).json({ error: req.i18n?.__('Not found') || 'Not found' });
59
+ }
60
+ return next();
61
+ };
62
+ const middlewares = adminizer.config.middlewares ?? [];
63
+ const route = (action, ...policies) => bindWithMiddlewares(adminizer, middlewares, action, policies);
64
+ const prefix = adminizer.config.routePrefix;
65
+ adminizer.app.get(`${prefix}/docs/api/list`, route(docsList, requireDocsService, requireAuthAPI(), requirePermission(documentationToken)));
66
+ adminizer.app.get(`${prefix}/docs/api/keywords`, route(docsKeywords, requireDocsService, requireAuthAPI(), requirePermission(documentationToken)));
67
+ adminizer.app.get(`${prefix}/docs/api/search`, route(docsSearch, requireDocsService, requireAuthAPI(), requirePermission(documentationToken)));
68
+ adminizer.app.get(`${prefix}/docs/api/context`, route(docsContext, requireDocsService, requireAuthAPI(), requirePermission(documentationToken)));
69
+ adminizer.app.get(`${prefix}/docs/api/doc/:id`, route(docsDoc, requireDocsService, requireAuthAPI(), requirePermission(documentationToken)));
70
+ adminizer.app.get(`${prefix}/docs/api/resolve`, route(docsResolve, requireDocsService, requireAuthAPI(), requirePermission(documentationToken)));
71
+ adminizer.app.get(`${prefix}/docs/api/schema`, route(docsSchema, requireDocsService, requireAuthAPI(), requirePermission(documentationToken)));
72
+ // The viewer itself; registered after the API so that `/docs/api/...`
73
+ // never falls into `/docs/:id`. Without a service the page renders an
74
+ // empty knowledge base — the API behind it answers 404.
75
+ adminizer.app.get(`${prefix}/docs`, route(docsPage, requireAuthUI(), requirePermission(documentationToken, { mode: 'ui' })));
76
+ adminizer.app.get(`${prefix}/docs/:id`, route(docsPage, requireAuthUI(), requirePermission(documentationToken, { mode: 'ui' })));
77
+ }
@@ -1,2 +1,2 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export default function bindHistory(adminizer: Adminizer): void;
@@ -1,2 +1,2 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export declare function bindInertia(adminizer: Adminizer): void;
@@ -2,8 +2,10 @@ import flash from "../lib/inertia/flash.js";
2
2
  import inertia from "../lib/inertia/inertiaAdapter.js";
3
3
  import fs from "fs";
4
4
  import path from "node:path";
5
+ import { Adminizer } from "../lib/Adminizer.js";
5
6
  import { InertiaMenuHelper } from "../helpers/inertiaMenuHelper.js";
6
7
  import { getUiTranslations } from "../lib/ui-i18n/getUiTranslations.js";
8
+ import { getAssetVersion } from "../helpers/assetVersionHelper.js";
7
9
  import { COMMON_UI_TRANSLATION_KEYS } from "../lib/ui-i18n/uiTranslationKeys.js";
8
10
  export function bindInertia(adminizer) {
9
11
  const escapeHtmlAttribute = (value) => value
@@ -30,6 +32,10 @@ export function bindInertia(adminizer) {
30
32
  }
31
33
  return `${adminizer.config.routePrefix}/${customFavicon.replace(/^\/+/, "")}`;
32
34
  };
35
+ // The main bundle is content-hashed and needs no query string; the version
36
+ // is published to the page for the entries that are *not* hashed, because
37
+ // they are imported by a hard-coded path (agent.es.js, controls/*).
38
+ const assetVersion = getAssetVersion();
33
39
  const viteRender = () => {
34
40
  if (process.env.ADMINIZER_ENV === 'dev') {
35
41
  return `
@@ -72,6 +78,9 @@ export function bindInertia(adminizer) {
72
78
  }
73
79
  // JS resource
74
80
  if (entry.file) {
81
+ // Never append a query here: split chunks import the entry by its
82
+ // bare name, so `app.js?v=x` and `app.js` become two modules and
83
+ // the page ends up with two Reacts. The name is hashed instead.
75
84
  const href = `${adminizer.config.routePrefix}/assets/${entry.file}`;
76
85
  preloadLinks.push(`<link rel="modulepreload" href="${href}" as="script">`);
77
86
  scripts.push(`<script type="module" src="${href}"></script>`);
@@ -79,12 +88,14 @@ export function bindInertia(adminizer) {
79
88
  // Route prefix script
80
89
  const routePrefixScript = `<script>window.routePrefix = "${adminizer.config.routePrefix}";</script>`;
81
90
  const bindPublic = `<script>window.bindPublic = ${adminizer.config.bind?.public}</script>`;
91
+ const versionScript = `<script>window.adminizerVersion = "${assetVersion}";</script>`;
82
92
  return `
83
93
  ${preloadLinks.join('\n')}
84
94
  ${stylesheets.join('\n')}
85
95
  ${scripts.join('\n')}
86
96
  ${routePrefixScript}
87
97
  ${bindPublic}
98
+ ${versionScript}
88
99
  `;
89
100
  }
90
101
  };
@@ -121,7 +132,7 @@ export function bindInertia(adminizer) {
121
132
  headerName: 'x-xsrf-token'
122
133
  }
123
134
  }));
124
- adminizer.app.use((req, _, next) => {
135
+ adminizer.app.use(async (req, _, next) => {
125
136
  checkAuth(req, adminizer);
126
137
  const defaultLocale = typeof req.adminizer.config.translation !== "boolean"
127
138
  ? req.adminizer.config.translation.defaultLocale
@@ -132,6 +143,16 @@ export function bindInertia(adminizer) {
132
143
  lang: locale,
133
144
  });
134
145
  const menuHelper = new InertiaMenuHelper(adminizer);
146
+ // Contextual documentation of this page: metadata only, and null when
147
+ // the subsystem is off or the user may not read documentation.
148
+ // A broken implementation must never take the panel down with it.
149
+ let docs = null;
150
+ try {
151
+ docs = req.user ? await adminizer.documentationHandler.forContextMeta(req.user, req.path) : null;
152
+ }
153
+ catch (error) {
154
+ Adminizer.log.error(`bindInertia > documentation context failed: ${error}`);
155
+ }
135
156
  req.Inertia.shareProps({
136
157
  auth: {
137
158
  user: req.session.userPretended ?? req.user
@@ -169,6 +190,7 @@ export function bindInertia(adminizer) {
169
190
  return { text: v, link: null, hint: null };
170
191
  return { text: v.text ?? null, link: v.link ?? null, hint: v.hint ?? null };
171
192
  })(),
193
+ docs,
172
194
  showFeedback: req.adminizer.feedbackHandler?.isRegistered() ?? false,
173
195
  feedbackTriggerLabel: req.adminizer.feedbackHandler?.getTriggerLabel() ?? null,
174
196
  feedbackPlaceholder: req.adminizer.feedbackHandler?.getPlaceholder() ?? null,
@@ -1,2 +1,2 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export default function bindMediaManager(adminizer: Adminizer): void;
@@ -1,2 +1,2 @@
1
- import { Adminizer } from '../lib/Adminizer';
1
+ import { Adminizer } from '../lib/Adminizer.js';
2
2
  export declare function bindNotifications(adminizer: Adminizer): void;
@@ -1,3 +1,3 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export declare function createDeprecatedAdminizerProxy(adminizer: Adminizer, warn?: (message: string) => void): Adminizer;
3
3
  export default function bindReqFunctions(adminizer: Adminizer): void;
@@ -1,2 +1,2 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export default function bindTranslations(adminizer: Adminizer): void;
@@ -1,4 +1,4 @@
1
- import { AdminpanelConfig } from "../interfaces/adminpanelConfig";
2
- import { InternalModelAccessMap } from "../interfaces/internalModelAccess";
3
- import { ModelHandler } from "../lib/model/ModelHandler";
1
+ import { AdminpanelConfig } from "../interfaces/adminpanelConfig.js";
2
+ import { InternalModelAccessMap } from "../interfaces/internalModelAccess.js";
3
+ import { ModelHandler } from "../lib/model/ModelHandler.js";
4
4
  export declare function buildInternalModelAccess(config: AdminpanelConfig, modelHandler: ModelHandler): InternalModelAccessMap | undefined;