@acorex/connectivity 21.0.0-next.3 → 21.0.0-next.31

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 (95) hide show
  1. package/fesm2022/{acorex-connectivity-api-execute.command-SGNBLcOi.mjs → acorex-connectivity-api-execute.command-CiBl7z_H.mjs} +6 -6
  2. package/fesm2022/acorex-connectivity-api-execute.command-CiBl7z_H.mjs.map +1 -0
  3. package/fesm2022/acorex-connectivity-api.mjs +101 -185
  4. package/fesm2022/acorex-connectivity-api.mjs.map +1 -1
  5. package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-G8Opk5JU.mjs +65509 -0
  6. package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-G8Opk5JU.mjs.map +1 -0
  7. package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-DTPM1eU1.mjs +79 -0
  8. package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-DTPM1eU1.mjs.map +1 -0
  9. package/fesm2022/acorex-connectivity-mock-category-metadata-inheritance.query-CWRL1dTa.mjs +198 -0
  10. package/fesm2022/acorex-connectivity-mock-category-metadata-inheritance.query-CWRL1dTa.mjs.map +1 -0
  11. package/fesm2022/{acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs → acorex-connectivity-mock-category-with-items.query-Cj6FWu7S.mjs} +4 -4
  12. package/fesm2022/acorex-connectivity-mock-category-with-items.query-Cj6FWu7S.mjs.map +1 -0
  13. package/fesm2022/acorex-connectivity-mock-chat-generate-image.command-CPGQNlRz.mjs +114 -0
  14. package/fesm2022/acorex-connectivity-mock-chat-generate-image.command-CPGQNlRz.mjs.map +1 -0
  15. package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-BXem7bHF.mjs +130 -0
  16. package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-BXem7bHF.mjs.map +1 -0
  17. package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-TP4dUKlp.mjs +110 -0
  18. package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-TP4dUKlp.mjs.map +1 -0
  19. package/fesm2022/acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs +45 -0
  20. package/fesm2022/acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs.map +1 -0
  21. package/fesm2022/acorex-connectivity-mock-complete-signature-process.activity-BO-IFsHT.mjs +56 -0
  22. package/fesm2022/acorex-connectivity-mock-complete-signature-process.activity-BO-IFsHT.mjs.map +1 -0
  23. package/fesm2022/acorex-connectivity-mock-contact-core.module-5TLCGWOR.mjs +968 -0
  24. package/fesm2022/acorex-connectivity-mock-contact-core.module-5TLCGWOR.mjs.map +1 -0
  25. package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs +16 -0
  26. package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs.map +1 -0
  27. package/fesm2022/{acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs → acorex-connectivity-mock-distribution-record.activity-DuNluOzA.mjs} +18 -6
  28. package/fesm2022/acorex-connectivity-mock-distribution-record.activity-DuNluOzA.mjs.map +1 -0
  29. package/fesm2022/acorex-connectivity-mock-entity-create.activity-Ca19tIj4.mjs +60 -0
  30. package/fesm2022/acorex-connectivity-mock-entity-create.activity-Ca19tIj4.mjs.map +1 -0
  31. package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs +60 -0
  32. package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs.map +1 -0
  33. package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs +67 -0
  34. package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs.map +1 -0
  35. package/fesm2022/acorex-connectivity-mock-entity-update.activity-D0hyBha-.mjs +70 -0
  36. package/fesm2022/acorex-connectivity-mock-entity-update.activity-D0hyBha-.mjs.map +1 -0
  37. package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs +64 -0
  38. package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs.map +1 -0
  39. package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-DwVuYuKx.mjs +115 -0
  40. package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-DwVuYuKx.mjs.map +1 -0
  41. package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs +163 -0
  42. package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs.map +1 -0
  43. package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-C6S4ZJgp.mjs +35 -0
  44. package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-C6S4ZJgp.mjs.map +1 -0
  45. package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs +69 -0
  46. package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs.map +1 -0
  47. package/fesm2022/acorex-connectivity-mock-get-employee-list.query-DifHwuqH.mjs +213 -0
  48. package/fesm2022/acorex-connectivity-mock-get-employee-list.query-DifHwuqH.mjs.map +1 -0
  49. package/fesm2022/acorex-connectivity-mock-get-location-list.query-bMjkZnzq.mjs +209 -0
  50. package/fesm2022/acorex-connectivity-mock-get-location-list.query-bMjkZnzq.mjs.map +1 -0
  51. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs +186 -0
  52. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs.map +1 -0
  53. package/fesm2022/acorex-connectivity-mock-get-product-list.query-B06aC73T.mjs +251 -0
  54. package/fesm2022/acorex-connectivity-mock-get-product-list.query-B06aC73T.mjs.map +1 -0
  55. package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-CM7bsjl7.mjs +192 -0
  56. package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-CM7bsjl7.mjs.map +1 -0
  57. package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-BQT5a_hn.mjs +56 -0
  58. package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-BQT5a_hn.mjs.map +1 -0
  59. package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-D4qfDfeV.mjs +246 -0
  60. package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-D4qfDfeV.mjs.map +1 -0
  61. package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-n1_Azada.mjs +258 -0
  62. package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-n1_Azada.mjs.map +1 -0
  63. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-Cg4ykZU2.mjs +56 -0
  64. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-Cg4ykZU2.mjs.map +1 -0
  65. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-0sCBtdbp.mjs +294 -0
  66. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-0sCBtdbp.mjs.map +1 -0
  67. package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-rD811gtM.mjs +212 -0
  68. package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-rD811gtM.mjs.map +1 -0
  69. package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs +35 -0
  70. package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs.map +1 -0
  71. package/fesm2022/acorex-connectivity-mock-notify-signers.activity-Dg0sKGip.mjs +49 -0
  72. package/fesm2022/acorex-connectivity-mock-notify-signers.activity-Dg0sKGip.mjs.map +1 -0
  73. package/fesm2022/acorex-connectivity-mock-request-signature.activity-CoRT_H2u.mjs +60 -0
  74. package/fesm2022/acorex-connectivity-mock-request-signature.activity-CoRT_H2u.mjs.map +1 -0
  75. package/fesm2022/{acorex-connectivity-mock-sample.command-CkH5bmEs.mjs → acorex-connectivity-mock-sample.command-CJmDL4pL.mjs} +4 -4
  76. package/fesm2022/acorex-connectivity-mock-sample.command-CJmDL4pL.mjs.map +1 -0
  77. package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs +38 -0
  78. package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs.map +1 -0
  79. package/fesm2022/acorex-connectivity-mock-validate-all-signatures.activity-JuHjNFFS.mjs +61 -0
  80. package/fesm2022/acorex-connectivity-mock-validate-all-signatures.activity-JuHjNFFS.mjs.map +1 -0
  81. package/fesm2022/acorex-connectivity-mock.mjs +1 -51504
  82. package/fesm2022/acorex-connectivity-mock.mjs.map +1 -1
  83. package/fesm2022/acorex-connectivity-utils.mjs +7 -7
  84. package/fesm2022/acorex-connectivity-utils.mjs.map +1 -1
  85. package/fesm2022/acorex-connectivity.mjs.map +1 -1
  86. package/package.json +8 -7
  87. package/{api/index.d.ts → types/acorex-connectivity-api.d.ts} +1 -59
  88. package/types/acorex-connectivity-mock.d.ts +3909 -0
  89. package/fesm2022/acorex-connectivity-api-execute.command-SGNBLcOi.mjs.map +0 -1
  90. package/fesm2022/acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs.map +0 -1
  91. package/fesm2022/acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs.map +0 -1
  92. package/fesm2022/acorex-connectivity-mock-sample.command-CkH5bmEs.mjs.map +0 -1
  93. package/mock/index.d.ts +0 -2775
  94. /package/{utils/index.d.ts → types/acorex-connectivity-utils.d.ts} +0 -0
  95. /package/{index.d.ts → types/acorex-connectivity.d.ts} +0 -0
@@ -0,0 +1,79 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import { AXPEntityStorageService } from '@acorex/platform/layout/entity';
4
+
5
+ const LEAVE_REQUEST_ENTITY = 'HumanCapitalManagement.LeaveRequest';
6
+ const EMPLOYEE_ENTITY = 'HumanCapitalManagement.Employee';
7
+ /**
8
+ * Assign To Manager Activity (Backend - Mock)
9
+ *
10
+ * Resolves the manager from Leave Request → Employee → managerId.
11
+ * Outputs managerId (and employee info) so the next human-task can use assignedUserIds: {{ variables.managerId }}
12
+ * and only that manager sees the task in the task board.
13
+ *
14
+ * Execution Mode: backend
15
+ * Activity Type: workflow-activity:assign-to-manager
16
+ */
17
+ class AssignToManagerActivity {
18
+ constructor() {
19
+ this.entityStorage = inject(AXPEntityStorageService);
20
+ }
21
+ async execute(input) {
22
+ const leaveRequestId = input.leaveRequestId;
23
+ let managerId = null;
24
+ let employee = { displayName: '' };
25
+ if (leaveRequestId) {
26
+ try {
27
+ const leaveRequest = (await this.entityStorage.getOne(LEAVE_REQUEST_ENTITY, leaveRequestId));
28
+ if (leaveRequest?.employeeId) {
29
+ const emp = (await this.entityStorage.getOne(EMPLOYEE_ENTITY, leaveRequest.employeeId));
30
+ if (emp) {
31
+ employee = {
32
+ displayName: emp.person?.displayName ?? emp.displayName ?? '',
33
+ ...emp,
34
+ };
35
+ const managerEmployeeId = emp.managerId;
36
+ if (managerEmployeeId) {
37
+ const managerEmp = (await this.entityStorage.getOne(EMPLOYEE_ENTITY, managerEmployeeId));
38
+ managerId = managerEmp?.userId ?? managerEmployeeId;
39
+ }
40
+ }
41
+ }
42
+ if (!employee.displayName && leaveRequest) {
43
+ employee = {
44
+ displayName: leaveRequest.employeeName ??
45
+ leaveRequest.employee?.person?.displayName ??
46
+ leaveRequest.employee?.displayName ??
47
+ '',
48
+ ...(leaveRequest.employee ?? {}),
49
+ };
50
+ }
51
+ }
52
+ catch {
53
+ // keep default employee and managerId null
54
+ }
55
+ }
56
+ return {
57
+ success: true,
58
+ data: {
59
+ managerId,
60
+ employee,
61
+ leaveRequestId,
62
+ },
63
+ metadata: {
64
+ outcome: 'done',
65
+ },
66
+ };
67
+ }
68
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AssignToManagerActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
69
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AssignToManagerActivity, providedIn: 'root' }); }
70
+ }
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AssignToManagerActivity, decorators: [{
72
+ type: Injectable,
73
+ args: [{
74
+ providedIn: 'root',
75
+ }]
76
+ }] });
77
+
78
+ export { AssignToManagerActivity };
79
+ //# sourceMappingURL=acorex-connectivity-mock-assign-to-manager.activity-DTPM1eU1.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-assign-to-manager.activity-DTPM1eU1.mjs","sources":["../../../../libs/connectivity/mock/src/lib/workflow-management/activities/assign-to-manager.activity.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPExecuteCommandResult } from '@acorex/platform/core';\nimport { AXPCommand } from '@acorex/platform/runtime';\nimport { AXPEntityStorageService } from '@acorex/platform/layout/entity';\n\nconst LEAVE_REQUEST_ENTITY = 'HumanCapitalManagement.LeaveRequest';\nconst EMPLOYEE_ENTITY = 'HumanCapitalManagement.Employee';\n\nexport interface AssignToManagerInput {\n leaveRequestId: string;\n}\n\nexport interface AssignToManagerOutput {\n managerId: string | null;\n employee: { displayName: string; [key: string]: any };\n leaveRequestId?: string;\n}\n\n/**\n * Assign To Manager Activity (Backend - Mock)\n *\n * Resolves the manager from Leave Request → Employee → managerId.\n * Outputs managerId (and employee info) so the next human-task can use assignedUserIds: {{ variables.managerId }}\n * and only that manager sees the task in the task board.\n *\n * Execution Mode: backend\n * Activity Type: workflow-activity:assign-to-manager\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AssignToManagerActivity implements AXPCommand<AssignToManagerInput, AssignToManagerOutput> {\n private readonly entityStorage = inject(AXPEntityStorageService);\n\n async execute(input: AssignToManagerInput): Promise<AXPExecuteCommandResult<AssignToManagerOutput>> {\n const leaveRequestId = input.leaveRequestId;\n let managerId: string | null = null;\n let employee: { displayName: string; [key: string]: any } = { displayName: '' };\n\n if (leaveRequestId) {\n try {\n const leaveRequest = (await this.entityStorage.getOne(LEAVE_REQUEST_ENTITY, leaveRequestId)) as {\n employeeId?: string;\n employee?: any;\n employeeName?: string;\n } | null;\n if (leaveRequest?.employeeId) {\n const emp = (await this.entityStorage.getOne(EMPLOYEE_ENTITY, leaveRequest.employeeId)) as {\n managerId?: string;\n userId?: string;\n displayName?: string;\n person?: { displayName?: string };\n } | null;\n if (emp) {\n employee = {\n displayName: emp.person?.displayName ?? emp.displayName ?? '',\n ...emp,\n };\n const managerEmployeeId = emp.managerId;\n if (managerEmployeeId) {\n const managerEmp = (await this.entityStorage.getOne(EMPLOYEE_ENTITY, managerEmployeeId)) as {\n userId?: string;\n } | null;\n managerId = managerEmp?.userId ?? managerEmployeeId;\n }\n }\n }\n if (!employee.displayName && leaveRequest) {\n employee = {\n displayName:\n (leaveRequest as any).employeeName ??\n (leaveRequest as any).employee?.person?.displayName ??\n (leaveRequest as any).employee?.displayName ??\n '',\n ...((leaveRequest as any).employee ?? {}),\n };\n }\n } catch {\n // keep default employee and managerId null\n }\n }\n\n return {\n success: true,\n data: {\n managerId,\n employee,\n leaveRequestId,\n },\n metadata: {\n outcome: 'done',\n },\n };\n }\n}\n"],"names":[],"mappings":";;;;AAKA,MAAM,oBAAoB,GAAG,qCAAqC;AAClE,MAAM,eAAe,GAAG,iCAAiC;AAYzD;;;;;;;;;AASG;MAIU,uBAAuB,CAAA;AAHpC,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,uBAAuB,CAAC;AA8DjE,IAAA;IA5DC,MAAM,OAAO,CAAC,KAA2B,EAAA;AACvC,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc;QAC3C,IAAI,SAAS,GAAkB,IAAI;AACnC,QAAA,IAAI,QAAQ,GAAgD,EAAE,WAAW,EAAE,EAAE,EAAE;QAE/E,IAAI,cAAc,EAAE;AAClB,YAAA,IAAI;AACF,gBAAA,MAAM,YAAY,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAInF;AACR,gBAAA,IAAI,YAAY,EAAE,UAAU,EAAE;AAC5B,oBAAA,MAAM,GAAG,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC,UAAU,CAAC,CAK9E;oBACR,IAAI,GAAG,EAAE;AACP,wBAAA,QAAQ,GAAG;4BACT,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE;AAC7D,4BAAA,GAAG,GAAG;yBACP;AACD,wBAAA,MAAM,iBAAiB,GAAG,GAAG,CAAC,SAAS;wBACvC,IAAI,iBAAiB,EAAE;AACrB,4BAAA,MAAM,UAAU,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAE/E;AACR,4BAAA,SAAS,GAAG,UAAU,EAAE,MAAM,IAAI,iBAAiB;wBACrD;oBACF;gBACF;AACA,gBAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,YAAY,EAAE;AACzC,oBAAA,QAAQ,GAAG;wBACT,WAAW,EACR,YAAoB,CAAC,YAAY;AACjC,4BAAA,YAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW;4BAClD,YAAoB,CAAC,QAAQ,EAAE,WAAW;4BAC3C,EAAE;AACJ,wBAAA,IAAK,YAAoB,CAAC,QAAQ,IAAI,EAAE,CAAC;qBAC1C;gBACH;YACF;AAAE,YAAA,MAAM;;YAER;QACF;QAEA,OAAO;AACL,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,IAAI,EAAE;gBACJ,SAAS;gBACT,QAAQ;gBACR,cAAc;AACf,aAAA;AACD,YAAA,QAAQ,EAAE;AACR,gBAAA,OAAO,EAAE,MAAM;AAChB,aAAA;SACF;IACH;8GA9DW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA,CAAA;;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;;;"}
@@ -0,0 +1,198 @@
1
+ import { AXMMetaDataDefinitionService, META_DATA_SELECTOR_FIELD } from '@acorex/modules/data-management';
2
+ import { AXMEntityCrudServiceImpl } from '@acorex/platform/layout/entity';
3
+ import * as i0 from '@angular/core';
4
+ import { inject, Injector, runInInjectionContext, Injectable } from '@angular/core';
5
+ import { get } from 'lodash-es';
6
+
7
+ class AXCQueryCategoryMetadataInheritanceQuery {
8
+ constructor() {
9
+ this.injector = inject(Injector);
10
+ this.metaDataService = inject(AXMMetaDataDefinitionService);
11
+ }
12
+ async fetch(params) {
13
+ const { entityName, categoryId } = params;
14
+ //1a25158a-3e0f-4e9c-bdc2-d6cc0ece86ba
15
+ const service = runInInjectionContext(this.injector, () => new AXMEntityCrudServiceImpl(`${params.entityName}Category`));
16
+ // Find the category by ID
17
+ const category = await this.findCategoryById(categoryId, service);
18
+ if (!category) {
19
+ throw new Error(`Category with ID ${categoryId} not found`);
20
+ }
21
+ // Build the hierarchy (traverse up to root)
22
+ const hierarchy = await this.buildCategoryHierarchy(category, service);
23
+ // Collect and merge groups from all categories in hierarchy
24
+ const mergedGroups = this.mergeMetadataGroupsFromHierarchy(hierarchy);
25
+ return mergedGroups;
26
+ }
27
+ async findCategoryById(categoryId, service) {
28
+ try {
29
+ const result = await service.query({
30
+ filter: {
31
+ logic: 'and',
32
+ filters: [
33
+ {
34
+ field: 'id',
35
+ operator: {
36
+ type: 'equal',
37
+ },
38
+ value: categoryId,
39
+ },
40
+ ],
41
+ },
42
+ take: 1,
43
+ skip: 0,
44
+ });
45
+ return result.items.length > 0 ? result.items[0] : null;
46
+ }
47
+ catch (error) {
48
+ console.error('Error finding category by ID:', error);
49
+ return null;
50
+ }
51
+ }
52
+ async buildCategoryHierarchy(category, service) {
53
+ const hierarchy = [category];
54
+ let currentCategory = category;
55
+ // Traverse up the parent hierarchy
56
+ while (currentCategory.parentId) {
57
+ try {
58
+ const parentResult = await service.query({
59
+ filter: {
60
+ logic: 'and',
61
+ filters: [
62
+ {
63
+ field: 'id',
64
+ operator: {
65
+ type: 'equal',
66
+ },
67
+ value: currentCategory.parentId,
68
+ },
69
+ ],
70
+ },
71
+ take: 1,
72
+ skip: 0,
73
+ });
74
+ if (parentResult.items.length > 0) {
75
+ const parent = parentResult.items[0];
76
+ hierarchy.unshift(parent); // Add to beginning to maintain hierarchy order
77
+ currentCategory = parent;
78
+ }
79
+ else {
80
+ break; // Parent not found, stop traversal
81
+ }
82
+ }
83
+ catch (error) {
84
+ console.error('Error finding parent category:', error);
85
+ break;
86
+ }
87
+ }
88
+ return hierarchy;
89
+ }
90
+ /**
91
+ * Merge metadata groups from category hierarchy, preserving group structure
92
+ * Groups are merged by name, with fields from child categories taking precedence
93
+ */
94
+ mergeMetadataGroupsFromHierarchy(hierarchy) {
95
+ const groupsMap = new Map();
96
+ const seenFieldIds = new Set();
97
+ // Process hierarchy from root to leaf (child categories override parent fields)
98
+ for (const category of hierarchy) {
99
+ // Type: AXMMetaDataBuilderValue from @acorex/modules/data-management
100
+ const metaDataList = get(category, META_DATA_SELECTOR_FIELD);
101
+ if (!metaDataList || !metaDataList.groups || !Array.isArray(metaDataList.groups)) {
102
+ continue;
103
+ }
104
+ // Process each group in the category's metadata
105
+ for (const group of metaDataList.groups) {
106
+ const groupName = group.name || 'default';
107
+ // Get or create group
108
+ if (!groupsMap.has(groupName)) {
109
+ groupsMap.set(groupName, {
110
+ name: groupName,
111
+ title: group.title,
112
+ description: group.description,
113
+ order: group.order ?? 0,
114
+ fields: [],
115
+ });
116
+ }
117
+ const mergedGroup = groupsMap.get(groupName);
118
+ // Process fields in this group
119
+ if (group.fields && Array.isArray(group.fields)) {
120
+ for (const field of group.fields) {
121
+ // Skip if we've already seen this field (child categories override)
122
+ if (seenFieldIds.has(field.id)) {
123
+ // Remove existing field and add new one (child overrides parent)
124
+ mergedGroup.fields = mergedGroup.fields.filter(f => f.id !== field.id);
125
+ }
126
+ // Add field to merged group
127
+ // Ensure title is always present (use name as fallback)
128
+ mergedGroup.fields.push({
129
+ id: field.id,
130
+ name: field.name,
131
+ title: field.title || field.name || 'Untitled Field',
132
+ description: field.description,
133
+ interface: field.interface,
134
+ configuration: field.configuration,
135
+ order: field.order ?? mergedGroup.fields.length,
136
+ });
137
+ seenFieldIds.add(field.id);
138
+ }
139
+ }
140
+ }
141
+ }
142
+ // Convert map to array and sort by order
143
+ const result = Array.from(groupsMap.values())
144
+ .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
145
+ .map(group => ({
146
+ ...group,
147
+ fields: group.fields.sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),
148
+ }));
149
+ return result;
150
+ }
151
+ async collectInheritedMetadata(hierarchy) {
152
+ const allMetadata = [];
153
+ const seenMetadataIds = new Set();
154
+ // Collect metadata from each level in the hierarchy
155
+ for (const category of hierarchy) {
156
+ try {
157
+ const metadataResult = await this.metaDataService.query({
158
+ filter: {
159
+ logic: 'and',
160
+ filters: [
161
+ {
162
+ field: 'categoryIds',
163
+ operator: {
164
+ type: 'contains',
165
+ },
166
+ value: category.id,
167
+ },
168
+ ],
169
+ },
170
+ take: 1000,
171
+ skip: 0,
172
+ });
173
+ // Add metadata fields that haven't been seen before (avoid duplicates)
174
+ for (const metadata of metadataResult.items) {
175
+ if (!seenMetadataIds.has(metadata.id)) {
176
+ allMetadata.push(metadata);
177
+ seenMetadataIds.add(metadata.id);
178
+ }
179
+ }
180
+ }
181
+ catch (error) {
182
+ console.error(`Error collecting metadata for category ${category.id}:`, error);
183
+ }
184
+ }
185
+ return allMetadata;
186
+ }
187
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
188
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, providedIn: 'root' }); }
189
+ }
190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, decorators: [{
191
+ type: Injectable,
192
+ args: [{
193
+ providedIn: 'root'
194
+ }]
195
+ }] });
196
+
197
+ export { AXCQueryCategoryMetadataInheritanceQuery };
198
+ //# sourceMappingURL=acorex-connectivity-mock-category-metadata-inheritance.query-CWRL1dTa.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-category-metadata-inheritance.query-CWRL1dTa.mjs","sources":["../../../../libs/connectivity/mock/src/lib/data-management/metadata/queries/category-metadata-inheritance.query.ts"],"sourcesContent":["import {\n AXMMetaDataDefinitionEntityModel,\n AXMMetaDataDefinitionService,\n META_DATA_SELECTOR_FIELD,\n RootConfig,\n} from '@acorex/modules/data-management';\nimport { AXPCategoryEntity } from '@acorex/platform/core';\nimport { AXMEntityCrudServiceImpl } from '@acorex/platform/layout/entity';\nimport { AXPQuery } from '@acorex/platform/runtime';\nimport { inject, Injectable, Injector, runInInjectionContext } from '@angular/core';\nimport { get } from 'lodash-es';\n\nexport interface CategoryMetadataInheritanceQueryParams {\n entityName: string;\n categoryId: string;\n}\n\n/**\n * Result structure that preserves groups organization\n */\nexport interface CategoryMetadataInheritanceGroupResult {\n name: string;\n title?: string;\n description?: string;\n order: number;\n fields: Array<{\n id: string;\n name: string;\n title: string;\n description?: string;\n interface: string;\n configuration?: any;\n defaultValue?: any;\n order: number;\n }>;\n}\n\nexport type CategoryMetadataInheritanceResult = CategoryMetadataInheritanceGroupResult[];\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AXCQueryCategoryMetadataInheritanceQuery implements AXPQuery<CategoryMetadataInheritanceQueryParams, CategoryMetadataInheritanceResult> {\n\n private injector = inject(Injector);\n\n private metaDataService = inject(AXMMetaDataDefinitionService);\n\n async fetch(params: CategoryMetadataInheritanceQueryParams): Promise<CategoryMetadataInheritanceResult> {\n const { entityName, categoryId } = params;\n //1a25158a-3e0f-4e9c-bdc2-d6cc0ece86ba\n const service = runInInjectionContext(this.injector, () => new AXMEntityCrudServiceImpl<any, any>(`${params.entityName}Category`));\n // Find the category by ID\n const category = await this.findCategoryById(categoryId, service);\n if (!category) {\n throw new Error(`Category with ID ${categoryId} not found`);\n }\n\n // Build the hierarchy (traverse up to root)\n const hierarchy = await this.buildCategoryHierarchy(category, service);\n\n // Collect and merge groups from all categories in hierarchy\n const mergedGroups = this.mergeMetadataGroupsFromHierarchy(hierarchy);\n return mergedGroups;\n }\n\n private async findCategoryById(categoryId: string, service: any): Promise<AXPCategoryEntity | null> {\n try {\n const result = await service.query({\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'id',\n operator: {\n type: 'equal',\n },\n value: categoryId,\n },\n ],\n },\n take: 1,\n skip: 0,\n });\n\n return result.items.length > 0 ? result.items[0] : null;\n } catch (error) {\n console.error('Error finding category by ID:', error);\n return null;\n }\n }\n\n private async buildCategoryHierarchy(category: AXPCategoryEntity, service: any): Promise<AXPCategoryEntity[]> {\n const hierarchy: AXPCategoryEntity[] = [category];\n let currentCategory = category;\n\n // Traverse up the parent hierarchy\n while (currentCategory.parentId) {\n try {\n const parentResult = await service.query({\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'id',\n operator: {\n type: 'equal',\n },\n value: currentCategory.parentId,\n },\n ],\n },\n take: 1,\n skip: 0,\n });\n\n if (parentResult.items.length > 0) {\n const parent = parentResult.items[0];\n hierarchy.unshift(parent); // Add to beginning to maintain hierarchy order\n currentCategory = parent;\n } else {\n break; // Parent not found, stop traversal\n }\n } catch (error) {\n console.error('Error finding parent category:', error);\n break;\n }\n }\n\n return hierarchy;\n }\n\n /**\n * Merge metadata groups from category hierarchy, preserving group structure\n * Groups are merged by name, with fields from child categories taking precedence\n */\n private mergeMetadataGroupsFromHierarchy(hierarchy: AXPCategoryEntity[]): CategoryMetadataInheritanceResult {\n const groupsMap = new Map<string, CategoryMetadataInheritanceGroupResult>();\n const seenFieldIds = new Set<string>();\n\n // Process hierarchy from root to leaf (child categories override parent fields)\n for (const category of hierarchy) {\n // Type: AXMMetaDataBuilderValue from @acorex/modules/data-management\n const metaDataList = get(category, META_DATA_SELECTOR_FIELD) as {\n groups?: Array<{\n name: string;\n title?: string;\n description?: string;\n order: number;\n fields?: Array<{\n id: string;\n name: string;\n title: string;\n description?: string;\n interface: string;\n configuration?: any;\n order: number;\n }>;\n }>;\n } | undefined;\n\n if (!metaDataList || !metaDataList.groups || !Array.isArray(metaDataList.groups)) {\n continue;\n }\n\n // Process each group in the category's metadata\n for (const group of metaDataList.groups) {\n const groupName = group.name || 'default';\n\n // Get or create group\n if (!groupsMap.has(groupName)) {\n groupsMap.set(groupName, {\n name: groupName,\n title: group.title,\n description: group.description,\n order: group.order ?? 0,\n fields: [],\n });\n }\n\n const mergedGroup = groupsMap.get(groupName)!;\n\n // Process fields in this group\n if (group.fields && Array.isArray(group.fields)) {\n for (const field of group.fields) {\n // Skip if we've already seen this field (child categories override)\n if (seenFieldIds.has(field.id)) {\n // Remove existing field and add new one (child overrides parent)\n mergedGroup.fields = mergedGroup.fields.filter(f => f.id !== field.id);\n }\n\n // Add field to merged group\n // Ensure title is always present (use name as fallback)\n mergedGroup.fields.push({\n id: field.id,\n name: field.name,\n title: field.title || field.name || 'Untitled Field',\n description: field.description,\n interface: field.interface,\n configuration: field.configuration,\n order: field.order ?? mergedGroup.fields.length,\n });\n\n seenFieldIds.add(field.id);\n }\n }\n }\n }\n\n // Convert map to array and sort by order\n const result = Array.from(groupsMap.values())\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n .map(group => ({\n ...group,\n fields: group.fields.sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),\n }));\n\n return result;\n }\n\n private async collectInheritedMetadata(hierarchy: AXPCategoryEntity[]): Promise<AXMMetaDataDefinitionEntityModel[]> {\n const allMetadata: AXMMetaDataDefinitionEntityModel[] = [];\n const seenMetadataIds = new Set<string>();\n\n // Collect metadata from each level in the hierarchy\n for (const category of hierarchy) {\n try {\n const metadataResult = await this.metaDataService.query({\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'categoryIds',\n operator: {\n type: 'contains',\n },\n value: category.id,\n },\n ],\n },\n take: 1000,\n skip: 0,\n });\n\n // Add metadata fields that haven't been seen before (avoid duplicates)\n for (const metadata of metadataResult.items) {\n if (!seenMetadataIds.has(metadata.id)) {\n allMetadata.push(metadata);\n seenMetadataIds.add(metadata.id);\n }\n }\n } catch (error) {\n console.error(`Error collecting metadata for category ${category.id}:`, error);\n }\n }\n\n return allMetadata;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -102,10 +102,10 @@ class AXCQueryCategoryWithItemsQuery {
102
102
  }
103
103
  return node;
104
104
  }
105
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
106
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, providedIn: 'root' }); }
105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
106
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, providedIn: 'root' }); }
107
107
  }
108
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, decorators: [{
108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, decorators: [{
109
109
  type: Injectable,
110
110
  args: [{
111
111
  providedIn: 'root'
@@ -113,4 +113,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
113
113
  }] });
114
114
 
115
115
  export { AXCQueryCategoryWithItemsQuery };
116
- //# sourceMappingURL=acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs.map
116
+ //# sourceMappingURL=acorex-connectivity-mock-category-with-items.query-Cj6FWu7S.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-category-with-items.query-Cj6FWu7S.mjs","sources":["../../../../libs/connectivity/mock/src/lib/data-management/metadata/queries/category-with-items.query.ts"],"sourcesContent":["import { AXMMetaDataDefinitionEntityModel, AXMMetaDataDefinitionService, RootConfig } from '@acorex/modules/data-management';\nimport { AXPCategoryEntityWithItems } from '@acorex/platform/core';\nimport { AXMEntityCrudServiceImpl } from '@acorex/platform/layout/entity';\nimport { AXPQuery } from '@acorex/platform/runtime';\nimport { inject, Injectable, Injector, runInInjectionContext } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AXCQueryCategoryWithItemsQuery implements AXPQuery<void, AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel>[]> {\n\n private injector = inject(Injector);\n private categoryEntityService = runInInjectionContext(this.injector, () => new AXMEntityCrudServiceImpl<any, any>(`${RootConfig.module.name}.${RootConfig.entities.metaDataDefinition.name}Category`));\n private metaDataService = inject(AXMMetaDataDefinitionService);\n\n\n fetch(): Promise<any> {\n return this.getAllWithItems();\n }\n\n private async getAllWithItems(): Promise<AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel>[]> {\n const rootCategories = await this.categoryEntityService.query({\n take: 1000,\n skip: 0,\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'parentId',\n operator: {\n type: 'isNull',\n },\n },\n ],\n },\n });\n\n // Build the tree and prune empty categories (no children and no items)\n const builtRoots = await Promise.all(rootCategories.items.map((category) => this.buildCategoryTree(category)));\n const categories = builtRoots.filter((c): c is AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel> => Boolean(c));\n\n // Aggregate all items across remaining categories\n const allItems: AXMMetaDataDefinitionEntityModel[] = [];\n const collectItems = (nodes: AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel>[]) => {\n for (const node of nodes) {\n if (node.items?.length) {\n allItems.push(...node.items);\n }\n if (node.children?.length) {\n collectItems(node.children);\n }\n }\n };\n collectItems(categories);\n\n // Add synthetic 'All' node at the beginning\n const allNode: AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel> & { categories?: any[] } = {\n id: 'all',\n title: 'All',\n childrenCount: 0,\n items: allItems,\n children: [],\n categories: []\n };\n\n return [allNode, ...categories];\n }\n\n private async buildCategoryTree(category: any): Promise<AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel> | null> {\n const itemsResult = await this.metaDataService.query({\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'categoryIds',\n operator: {\n type: 'contains',\n },\n value: category.id,\n },\n ],\n },\n take: 1000,\n skip: 0,\n });\n\n const childCategoriesResult = await this.categoryEntityService.query({\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'parentId',\n operator: {\n type: 'equal',\n },\n value: category.id,\n },\n ],\n },\n take: 1000,\n skip: 0,\n });\n\n const builtChildren = await Promise.all(childCategoriesResult.items.map((child) => this.buildCategoryTree(child)));\n const children = builtChildren.filter((c): c is AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel> => Boolean(c));\n\n const node: AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel> & { categories?: any[] } = {\n ...category,\n items: itemsResult.items,\n categories: children,\n children: children,\n };\n\n // Prune node if it has no items and no children\n if ((!node.items || node.items.length === 0) && (!node.children || node.children.length === 0)) {\n return null;\n }\n\n return node;\n }\n\n\n\n}"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ import { AXPAiChatToolRunContextService, RootConfig, blobOrFileFromImageResult, persistAiGeneratedImage, AI_CHAT_GENERATED_IMAGE_REF_TYPE, AI_GENERATED_IMAGE_MAX_REMOTE_URL_IN_TOOL } from '@acorex/modules/ai-management';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, Injectable } from '@angular/core';
4
+ import { AXPFileStorageService } from '@acorex/platform/common';
5
+ import { AXPEntityService } from '@acorex/platform/layout/entity';
6
+ import { A as AXCAiChatRouterService, r as resolveDelegatedAssistOptionModel } from './acorex-connectivity-mock-acorex-connectivity-mock-G8Opk5JU.mjs';
7
+
8
+ //#region ---- Imports ----
9
+ function parseGenerateImageInput(args) {
10
+ const obj = args != null && typeof args === 'object' && !Array.isArray(args)
11
+ ? args
12
+ : null;
13
+ if (!obj) {
14
+ return { ok: false, error: 'Invalid arguments: expected an object.' };
15
+ }
16
+ const prompt = typeof obj['prompt'] === 'string' ? obj['prompt'].trim() : '';
17
+ if (!prompt) {
18
+ return { ok: false, error: 'Invalid arguments: "prompt" is required and must be non-empty.' };
19
+ }
20
+ const model = typeof obj['model'] === 'string' ? obj['model'].trim() : undefined;
21
+ const size = typeof obj['size'] === 'string' ? obj['size'].trim() : undefined;
22
+ const style = typeof obj['style'] === 'string' ? obj['style'].trim() : undefined;
23
+ return {
24
+ ok: true,
25
+ prompt,
26
+ ...(model ? { model } : {}),
27
+ ...(size ? { size } : {}),
28
+ ...(style ? { style } : {}),
29
+ };
30
+ }
31
+ class AiManagementChatGenerateImageCommand {
32
+ constructor() {
33
+ this.aiChatRouter = inject(AXCAiChatRouterService);
34
+ this.runContext = inject(AXPAiChatToolRunContextService);
35
+ this.fileStorage = inject(AXPFileStorageService);
36
+ this.entityService = inject(AXPEntityService);
37
+ this.assistData = this.entityService
38
+ .withEntity(RootConfig.module.name, RootConfig.entities.assist.name)
39
+ .data();
40
+ }
41
+ async execute(input) {
42
+ const ctx = this.runContext.getContext();
43
+ if (!ctx?.assistId?.trim()) {
44
+ return {
45
+ success: false,
46
+ message: {
47
+ text: 'Image generation requires an active AI chat run context (assist id).',
48
+ },
49
+ };
50
+ }
51
+ const parsed = parseGenerateImageInput(input);
52
+ if (!parsed.ok) {
53
+ return { success: false, message: { text: parsed.error } };
54
+ }
55
+ try {
56
+ const assist = await this.assistData.byKey(ctx.assistId.trim());
57
+ if (!assist) {
58
+ return {
59
+ success: false,
60
+ message: { text: `Assist row was not found (id: ${ctx.assistId.trim()}).` },
61
+ };
62
+ }
63
+ const modelEntityId = parsed.model?.trim() || resolveDelegatedAssistOptionModel(assist, ctx.agentId) || '';
64
+ if (!modelEntityId) {
65
+ return {
66
+ success: false,
67
+ message: {
68
+ text: 'No image model: pass "model" (catalog id) or set options.model on the image-generation delegated specialist row for this assist.',
69
+ },
70
+ };
71
+ }
72
+ let composedPrompt = parsed.prompt;
73
+ if (parsed.style?.trim()) {
74
+ composedPrompt = `${composedPrompt}\nStyle: ${parsed.style.trim()}`;
75
+ }
76
+ const { imageUrl } = await this.aiChatRouter.generateImage({
77
+ modelEntityId,
78
+ prompt: composedPrompt,
79
+ size: parsed.size?.trim() || undefined,
80
+ });
81
+ try {
82
+ const file = await blobOrFileFromImageResult(imageUrl);
83
+ const { fileId } = await persistAiGeneratedImage(this.fileStorage, file, {
84
+ refId: assist.id,
85
+ refType: AI_CHAT_GENERATED_IMAGE_REF_TYPE,
86
+ });
87
+ return { success: true, data: { fileId, prompt: parsed.prompt } };
88
+ }
89
+ catch (persistErr) {
90
+ const u = imageUrl.trim();
91
+ if (u.startsWith('https://') && u.length <= AI_GENERATED_IMAGE_MAX_REMOTE_URL_IN_TOOL) {
92
+ return {
93
+ success: true,
94
+ data: { prompt: parsed.prompt, imageUrl: u },
95
+ };
96
+ }
97
+ const pmsg = persistErr instanceof Error ? persistErr.message : String(persistErr);
98
+ throw new Error(`Could not store generated image for chat replay. ${pmsg}`);
99
+ }
100
+ }
101
+ catch (e) {
102
+ const msg = e instanceof Error ? e.message : String(e);
103
+ return { success: false, message: { text: msg } };
104
+ }
105
+ }
106
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatGenerateImageCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
107
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatGenerateImageCommand }); }
108
+ }
109
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatGenerateImageCommand, decorators: [{
110
+ type: Injectable
111
+ }] });
112
+
113
+ export { AiManagementChatGenerateImageCommand };
114
+ //# sourceMappingURL=acorex-connectivity-mock-chat-generate-image.command-CPGQNlRz.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-chat-generate-image.command-CPGQNlRz.mjs","sources":["../../../../libs/connectivity/mock/src/lib/ai-management/commands/chat-generate-image.command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport {\n AI_CHAT_GENERATED_IMAGE_REF_TYPE,\n AI_GENERATED_IMAGE_MAX_REMOTE_URL_IN_TOOL,\n AXPAiChatToolRunContextService,\n blobOrFileFromImageResult,\n persistAiGeneratedImage,\n RootConfig,\n} from '@acorex/modules/ai-management';\nimport { Injectable, inject } from '@angular/core';\nimport { AXPExecuteCommandResult } from '@acorex/platform/core';\nimport { AXPCommand } from '@acorex/platform/runtime';\nimport { AXPFileStorageService } from '@acorex/platform/common';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\n\nimport type { AXMAiAssistRow } from '../ai-agent-engine.types';\nimport { resolveDelegatedAssistOptionModel } from '../ai-delegated-agent-parameters.util';\nimport { AXCAiChatRouterService } from '../chat/ai-chat-router.service';\n\n//#endregion\n\n//#region ---- Command: AiManagement:ChatGenerateImage ----\n\nexport interface AiManagementChatGenerateImageInput {\n /** Catalog `AiModel` row id for an image-purpose model. When omitted, uses `delegatedAgents[].options.model` for the active delegated specialist (`agentId` in run context). */\n model?: string;\n prompt?: string;\n size?: string;\n style?: string;\n}\n\nfunction parseGenerateImageInput(args: unknown):\n | { ok: true; model?: string; prompt: string; size?: string; style?: string }\n | { ok: false; error: string } {\n const obj =\n args != null && typeof args === 'object' && !Array.isArray(args)\n ? (args as Record<string, unknown>)\n : null;\n if (!obj) {\n return { ok: false, error: 'Invalid arguments: expected an object.' };\n }\n const prompt = typeof obj['prompt'] === 'string' ? obj['prompt'].trim() : '';\n if (!prompt) {\n return { ok: false, error: 'Invalid arguments: \"prompt\" is required and must be non-empty.' };\n }\n const model = typeof obj['model'] === 'string' ? obj['model'].trim() : undefined;\n const size = typeof obj['size'] === 'string' ? obj['size'].trim() : undefined;\n const style = typeof obj['style'] === 'string' ? obj['style'].trim() : undefined;\n return {\n ok: true,\n prompt,\n ...(model ? { model } : {}),\n ...(size ? { size } : {}),\n ...(style ? { style } : {}),\n };\n}\n\n@Injectable()\nexport class AiManagementChatGenerateImageCommand\n implements AXPCommand<AiManagementChatGenerateImageInput, { fileId?: string; prompt: string; imageUrl?: string }>\n{\n private readonly aiChatRouter = inject(AXCAiChatRouterService);\n private readonly runContext = inject(AXPAiChatToolRunContextService);\n private readonly fileStorage = inject(AXPFileStorageService);\n private readonly entityService = inject(AXPEntityService);\n\n private readonly assistData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.assist.name)\n .data<string, AXMAiAssistRow, AXMAiAssistRow, AXMAiAssistRow, AXMAiAssistRow>();\n\n async execute(\n input: AiManagementChatGenerateImageInput,\n ): Promise<AXPExecuteCommandResult<{ fileId?: string; prompt: string; imageUrl?: string }>> {\n const ctx = this.runContext.getContext();\n if (!ctx?.assistId?.trim()) {\n return {\n success: false,\n message: {\n text: 'Image generation requires an active AI chat run context (assist id).',\n },\n };\n }\n\n const parsed = parseGenerateImageInput(input);\n if (!parsed.ok) {\n return { success: false, message: { text: parsed.error } };\n }\n\n try {\n const assist = await this.assistData.byKey(ctx.assistId.trim());\n if (!assist) {\n return {\n success: false,\n message: { text: `Assist row was not found (id: ${ctx.assistId.trim()}).` },\n };\n }\n\n const modelEntityId =\n parsed.model?.trim() || resolveDelegatedAssistOptionModel(assist, ctx.agentId) || '';\n if (!modelEntityId) {\n return {\n success: false,\n message: {\n text:\n 'No image model: pass \"model\" (catalog id) or set options.model on the image-generation delegated specialist row for this assist.',\n },\n };\n }\n\n let composedPrompt = parsed.prompt;\n if (parsed.style?.trim()) {\n composedPrompt = `${composedPrompt}\\nStyle: ${parsed.style.trim()}`;\n }\n\n const { imageUrl } = await this.aiChatRouter.generateImage({\n modelEntityId,\n prompt: composedPrompt,\n size: parsed.size?.trim() || undefined,\n });\n\n try {\n const file = await blobOrFileFromImageResult(imageUrl);\n const { fileId } = await persistAiGeneratedImage(this.fileStorage, file, {\n refId: assist.id,\n refType: AI_CHAT_GENERATED_IMAGE_REF_TYPE,\n });\n return { success: true, data: { fileId, prompt: parsed.prompt } };\n } catch (persistErr) {\n const u = imageUrl.trim();\n if (u.startsWith('https://') && u.length <= AI_GENERATED_IMAGE_MAX_REMOTE_URL_IN_TOOL) {\n return {\n success: true,\n data: { prompt: parsed.prompt, imageUrl: u },\n };\n }\n const pmsg = persistErr instanceof Error ? persistErr.message : String(persistErr);\n throw new Error(`Could not store generated image for chat replay. ${pmsg}`);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { success: false, message: { text: msg } };\n }\n }\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ import { AXPAiChatToolRunContextService, RootConfig, persistAiGeneratedSpeech, AI_CHAT_GENERATED_SPEECH_REF_TYPE } from '@acorex/modules/ai-management';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, Injectable } from '@angular/core';
4
+ import { AXPFileStorageService } from '@acorex/platform/common';
5
+ import { AXPEntityService } from '@acorex/platform/layout/entity';
6
+ import { A as AXCAiChatRouterService, r as resolveDelegatedAssistOptionModel, a as resolveDelegatedAssistOptionString } from './acorex-connectivity-mock-acorex-connectivity-mock-G8Opk5JU.mjs';
7
+
8
+ //#region ---- Imports ----
9
+ function extForMime(mime) {
10
+ const m = mime.toLowerCase();
11
+ if (m.includes('mpeg') || m.includes('mp3')) {
12
+ return 'mp3';
13
+ }
14
+ if (m.includes('wav')) {
15
+ return 'wav';
16
+ }
17
+ if (m.includes('opus')) {
18
+ return 'opus';
19
+ }
20
+ if (m.includes('ogg')) {
21
+ return 'ogg';
22
+ }
23
+ if (m.includes('aac')) {
24
+ return 'aac';
25
+ }
26
+ if (m.includes('flac')) {
27
+ return 'flac';
28
+ }
29
+ return 'bin';
30
+ }
31
+ function parseSynthesizeInput(args) {
32
+ const obj = args != null && typeof args === 'object' && !Array.isArray(args)
33
+ ? args
34
+ : null;
35
+ if (!obj) {
36
+ return { ok: false, error: 'Invalid arguments: expected an object.' };
37
+ }
38
+ const text = typeof obj['text'] === 'string' ? obj['text'].trim() : '';
39
+ if (!text) {
40
+ return { ok: false, error: 'Invalid arguments: "text" is required and must be non-empty.' };
41
+ }
42
+ const model = typeof obj['model'] === 'string' ? obj['model'].trim() : undefined;
43
+ const voice = typeof obj['voice'] === 'string' ? obj['voice'].trim() : undefined;
44
+ const responseFormat = typeof obj['responseFormat'] === 'string' ? obj['responseFormat'].trim() : undefined;
45
+ return {
46
+ ok: true,
47
+ text,
48
+ ...(model ? { model } : {}),
49
+ ...(voice ? { voice } : {}),
50
+ ...(responseFormat ? { responseFormat } : {}),
51
+ };
52
+ }
53
+ class AiManagementChatSynthesizeSpeechCommand {
54
+ constructor() {
55
+ this.aiChatRouter = inject(AXCAiChatRouterService);
56
+ this.runContext = inject(AXPAiChatToolRunContextService);
57
+ this.fileStorage = inject(AXPFileStorageService);
58
+ this.entityService = inject(AXPEntityService);
59
+ this.assistData = this.entityService
60
+ .withEntity(RootConfig.module.name, RootConfig.entities.assist.name)
61
+ .data();
62
+ }
63
+ async execute(input) {
64
+ const ctx = this.runContext.getContext();
65
+ if (!ctx?.assistId?.trim()) {
66
+ return {
67
+ success: false,
68
+ message: {
69
+ text: 'Text-to-speech requires an active AI chat run context (assist id).',
70
+ },
71
+ };
72
+ }
73
+ const parsed = parseSynthesizeInput(input);
74
+ if (!parsed.ok) {
75
+ return { success: false, message: { text: parsed.error } };
76
+ }
77
+ try {
78
+ const assist = await this.assistData.byKey(ctx.assistId.trim());
79
+ if (!assist) {
80
+ return {
81
+ success: false,
82
+ message: { text: `Assist row was not found (id: ${ctx.assistId.trim()}).` },
83
+ };
84
+ }
85
+ const modelEntityId = parsed.model?.trim() || resolveDelegatedAssistOptionModel(assist, ctx.agentId) || '';
86
+ if (!modelEntityId) {
87
+ return {
88
+ success: false,
89
+ message: {
90
+ text: 'No TTS model: pass "model" (catalog id) or set options.model on the text-to-speech delegated specialist row for this assist.',
91
+ },
92
+ };
93
+ }
94
+ const voiceFromAssist = resolveDelegatedAssistOptionString(assist, ctx.agentId, 'voice') || undefined;
95
+ const voice = parsed.voice?.trim() || voiceFromAssist || 'alloy';
96
+ const { audioBytes, mimeType } = await this.aiChatRouter.synthesizeSpeech({
97
+ modelEntityId,
98
+ text: parsed.text,
99
+ voice,
100
+ ...(parsed.responseFormat?.trim() ? { responseFormat: parsed.responseFormat.trim() } : {}),
101
+ });
102
+ const mt = mimeType?.trim() || 'application/octet-stream';
103
+ const ext = extForMime(mt);
104
+ const file = new File([audioBytes], `ai-tts.${ext}`, { type: mt });
105
+ try {
106
+ const { fileId } = await persistAiGeneratedSpeech(this.fileStorage, file, {
107
+ refId: assist.id,
108
+ refType: AI_CHAT_GENERATED_SPEECH_REF_TYPE,
109
+ });
110
+ return { success: true, data: { fileId, text: parsed.text, mimeType: mt } };
111
+ }
112
+ catch (persistErr) {
113
+ const pmsg = persistErr instanceof Error ? persistErr.message : String(persistErr);
114
+ throw new Error(`Could not store synthesized speech for chat replay. ${pmsg}`);
115
+ }
116
+ }
117
+ catch (e) {
118
+ const msg = e instanceof Error ? e.message : String(e);
119
+ return { success: false, message: { text: msg } };
120
+ }
121
+ }
122
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatSynthesizeSpeechCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
123
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatSynthesizeSpeechCommand }); }
124
+ }
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatSynthesizeSpeechCommand, decorators: [{
126
+ type: Injectable
127
+ }] });
128
+
129
+ export { AiManagementChatSynthesizeSpeechCommand };
130
+ //# sourceMappingURL=acorex-connectivity-mock-chat-synthesize-speech.command-BXem7bHF.mjs.map