@acorex/connectivity 21.0.0-next.8 → 21.0.0-next.85
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.
- package/fesm2022/{acorex-connectivity-api-execute.command-SGNBLcOi.mjs → acorex-connectivity-api-execute.command-CjCFEav4.mjs} +18 -8
- package/fesm2022/acorex-connectivity-api-execute.command-CjCFEav4.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-api.mjs +196 -192
- package/fesm2022/acorex-connectivity-api.mjs.map +1 -1
- package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-Btm13GJK.mjs +86927 -0
- package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-Btm13GJK.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-CY_5d0KF.mjs +288 -0
- package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-CY_5d0KF.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-category-metadata-inheritance.query-CIof4zTg.mjs +200 -0
- package/fesm2022/acorex-connectivity-mock-category-metadata-inheritance.query-CIof4zTg.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs → acorex-connectivity-mock-category-with-items.query-DAKUJIIt.mjs} +18 -17
- package/fesm2022/acorex-connectivity-mock-category-with-items.query-DAKUJIIt.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-chat-generate-image.command-Hj-2bHyJ.mjs +111 -0
- package/fesm2022/acorex-connectivity-mock-chat-generate-image.command-Hj-2bHyJ.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-0ZnevjmT.mjs +121 -0
- package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-0ZnevjmT.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-D8sCgp69.mjs +121 -0
- package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-D8sCgp69.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs +45 -0
- package/fesm2022/acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-contact-core.module-5TLCGWOR.mjs +968 -0
- package/fesm2022/acorex-connectivity-mock-contact-core.module-5TLCGWOR.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs +16 -0
- package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs → acorex-connectivity-mock-distribution-record.activity-a1_k9Czb.mjs} +29 -14
- package/fesm2022/acorex-connectivity-mock-distribution-record.activity-a1_k9Czb.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-entity-create.activity-CdoUzUvF.mjs +67 -0
- package/fesm2022/acorex-connectivity-mock-entity-create.activity-CdoUzUvF.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs +60 -0
- package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs +67 -0
- package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-entity-update.activity-06HTKiQQ.mjs +68 -0
- package/fesm2022/acorex-connectivity-mock-entity-update.activity-06HTKiQQ.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs +64 -0
- package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs → acorex-connectivity-mock-get-application-versions-chart-data.query-DwVuYuKx.mjs} +4 -4
- package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-DwVuYuKx.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs → acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs} +4 -4
- package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-CsmxwXsM.mjs +39 -0
- package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-CsmxwXsM.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs +69 -0
- package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-employee-list.query-BWbZj3tp.mjs +214 -0
- package/fesm2022/acorex-connectivity-mock-get-employee-list.query-BWbZj3tp.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-location-list.query-CQ2rFDUM.mjs +209 -0
- package/fesm2022/acorex-connectivity-mock-get-location-list.query-CQ2rFDUM.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs +186 -0
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs → acorex-connectivity-mock-get-product-list.query-Bv1im5yj.mjs} +111 -14
- package/fesm2022/acorex-connectivity-mock-get-product-list.query-Bv1im5yj.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-Cp65_mpB.mjs +192 -0
- package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-Cp65_mpB.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs → acorex-connectivity-mock-get-subscriptions-chart-data.query-CkQnH-F_.mjs} +5 -5
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-CkQnH-F_.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs → acorex-connectivity-mock-get-subscriptions-timeline.query-C_ecGCyk.mjs} +92 -14
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-C_ecGCyk.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs → acorex-connectivity-mock-get-tenant-application-access.query-t4BHU8qk.mjs} +92 -14
- package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-t4BHU8qk.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs → acorex-connectivity-mock-get-tenant-registration-chart-data.query-CgMZxfzh.mjs} +5 -5
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-CgMZxfzh.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs → acorex-connectivity-mock-get-tenant-registration-timeline.query-COmTsDCV.mjs} +92 -14
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-COmTsDCV.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs → acorex-connectivity-mock-get-tenant-user-distribution.query-jQAsUf_h.mjs} +92 -14
- package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-jQAsUf_h.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs +35 -0
- package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-notification-management-email-send.command-DAQfIWoD.mjs +73 -0
- package/fesm2022/acorex-connectivity-mock-notification-management-email-send.command-DAQfIWoD.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-report-summary.util-CGOhHIZr.mjs +56 -0
- package/fesm2022/acorex-connectivity-mock-report-summary.util-CGOhHIZr.mjs.map +1 -0
- package/fesm2022/{acorex-connectivity-mock-sample.command-CkH5bmEs.mjs → acorex-connectivity-mock-sample.command-CJmDL4pL.mjs} +4 -4
- package/fesm2022/acorex-connectivity-mock-sample.command-CJmDL4pL.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs +38 -0
- package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-user-roles-for-list-column.query-D2QjJXu4.mjs +30 -0
- package/fesm2022/acorex-connectivity-mock-user-roles-for-list-column.query-D2QjJXu4.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock.mjs +2 -50419
- package/fesm2022/acorex-connectivity-mock.mjs.map +1 -1
- package/fesm2022/acorex-connectivity-utils.mjs +7 -7
- package/fesm2022/acorex-connectivity-utils.mjs.map +1 -1
- package/fesm2022/acorex-connectivity.mjs.map +1 -1
- package/package.json +8 -7
- package/{api/index.d.ts → types/acorex-connectivity-api.d.ts} +14 -60
- package/types/acorex-connectivity-mock.d.ts +4224 -0
- package/fesm2022/acorex-connectivity-api-execute.command-SGNBLcOi.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs +0 -97
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs.map +0 -1
- package/fesm2022/acorex-connectivity-mock-sample.command-CkH5bmEs.mjs.map +0 -1
- package/mock/index.d.ts +0 -2669
- /package/{utils/index.d.ts → types/acorex-connectivity-utils.d.ts} +0 -0
- /package/{index.d.ts → types/acorex-connectivity.d.ts} +0 -0
|
@@ -1,19 +1,24 @@
|
|
|
1
|
-
import { RootConfig, AXMMetaDataDefinitionService } from '@acorex/modules/data-management';
|
|
2
|
-
import { AXMEntityCrudServiceImpl } from '@acorex/platform/layout/entity';
|
|
3
1
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { inject, Injector,
|
|
2
|
+
import { inject, Injector, Injectable } from '@angular/core';
|
|
3
|
+
import { AXPEntityService } from '@acorex/platform/layout/entity';
|
|
4
|
+
import { RootConfig } from '@acorex/modules/data-management';
|
|
5
5
|
|
|
6
6
|
class AXCQueryCategoryWithItemsQuery {
|
|
7
7
|
constructor() {
|
|
8
|
+
this.entityService = inject(AXPEntityService);
|
|
8
9
|
this.injector = inject(Injector);
|
|
9
|
-
this.
|
|
10
|
-
|
|
10
|
+
this.categoryEntityData = this.entityService
|
|
11
|
+
.withEntity(RootConfig.module.name, `${RootConfig.entities.metaDataDefinition.name}Category`)
|
|
12
|
+
.data();
|
|
13
|
+
this.metaDataService = this.entityService
|
|
14
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.metaDataDefinition.name)
|
|
15
|
+
.data();
|
|
11
16
|
}
|
|
12
17
|
fetch() {
|
|
13
18
|
return this.getAllWithItems();
|
|
14
19
|
}
|
|
15
20
|
async getAllWithItems() {
|
|
16
|
-
const rootCategories = await this.
|
|
21
|
+
const rootCategories = await this.categoryEntityData.query({
|
|
17
22
|
take: 1000,
|
|
18
23
|
skip: 0,
|
|
19
24
|
filter: {
|
|
@@ -28,10 +33,8 @@ class AXCQueryCategoryWithItemsQuery {
|
|
|
28
33
|
],
|
|
29
34
|
},
|
|
30
35
|
});
|
|
31
|
-
// Build the tree and prune empty categories (no children and no items)
|
|
32
36
|
const builtRoots = await Promise.all(rootCategories.items.map((category) => this.buildCategoryTree(category)));
|
|
33
37
|
const categories = builtRoots.filter((c) => Boolean(c));
|
|
34
|
-
// Aggregate all items across remaining categories
|
|
35
38
|
const allItems = [];
|
|
36
39
|
const collectItems = (nodes) => {
|
|
37
40
|
for (const node of nodes) {
|
|
@@ -44,14 +47,13 @@ class AXCQueryCategoryWithItemsQuery {
|
|
|
44
47
|
}
|
|
45
48
|
};
|
|
46
49
|
collectItems(categories);
|
|
47
|
-
// Add synthetic 'All' node at the beginning
|
|
48
50
|
const allNode = {
|
|
49
51
|
id: 'all',
|
|
50
52
|
title: 'All',
|
|
51
53
|
childrenCount: 0,
|
|
52
54
|
items: allItems,
|
|
53
55
|
children: [],
|
|
54
|
-
categories: []
|
|
56
|
+
categories: [],
|
|
55
57
|
};
|
|
56
58
|
return [allNode, ...categories];
|
|
57
59
|
}
|
|
@@ -72,7 +74,7 @@ class AXCQueryCategoryWithItemsQuery {
|
|
|
72
74
|
take: 1000,
|
|
73
75
|
skip: 0,
|
|
74
76
|
});
|
|
75
|
-
const childCategoriesResult = await this.
|
|
77
|
+
const childCategoriesResult = await this.categoryEntityData.query({
|
|
76
78
|
filter: {
|
|
77
79
|
logic: 'and',
|
|
78
80
|
filters: [
|
|
@@ -96,21 +98,20 @@ class AXCQueryCategoryWithItemsQuery {
|
|
|
96
98
|
categories: children,
|
|
97
99
|
children: children,
|
|
98
100
|
};
|
|
99
|
-
// Prune node if it has no items and no children
|
|
100
101
|
if ((!node.items || node.items.length === 0) && (!node.children || node.children.length === 0)) {
|
|
101
102
|
return null;
|
|
102
103
|
}
|
|
103
104
|
return node;
|
|
104
105
|
}
|
|
105
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
106
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
106
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
107
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, providedIn: 'root' }); }
|
|
107
108
|
}
|
|
108
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
109
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, decorators: [{
|
|
109
110
|
type: Injectable,
|
|
110
111
|
args: [{
|
|
111
|
-
providedIn: 'root'
|
|
112
|
+
providedIn: 'root',
|
|
112
113
|
}]
|
|
113
114
|
}] });
|
|
114
115
|
|
|
115
116
|
export { AXCQueryCategoryWithItemsQuery };
|
|
116
|
-
//# sourceMappingURL=acorex-connectivity-mock-category-with-items.query-
|
|
117
|
+
//# sourceMappingURL=acorex-connectivity-mock-category-with-items.query-DAKUJIIt.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-category-with-items.query-DAKUJIIt.mjs","sources":["../../../../libs/connectivity/mock/src/lib/data-management/metadata/queries/category-with-items.query.ts"],"sourcesContent":["import { Injector, inject, Injectable } from '@angular/core';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { AXMMetaDataDefinitionEntityModel, RootConfig } from '@acorex/modules/data-management';\nimport { AXPCategoryEntityWithItems } from '@acorex/platform/core';\nimport { AXPQuery } from '@acorex/platform/runtime';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXCQueryCategoryWithItemsQuery implements AXPQuery<void, AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel>[]> {\n private readonly entityService = inject(AXPEntityService);\n private readonly injector = inject(Injector);\n private readonly categoryEntityData = this.entityService\n .withEntity(RootConfig.module.name, `${RootConfig.entities.metaDataDefinition.name}Category`)\n .data<any, any>();\n private readonly metaDataService = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.metaDataDefinition.name)\n .data<any, any>();\n\n fetch(): Promise<any> {\n return this.getAllWithItems();\n }\n\n private async getAllWithItems(): Promise<AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel>[]> {\n const rootCategories = await this.categoryEntityData.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 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 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 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.categoryEntityData.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 if ((!node.items || node.items.length === 0) && (!node.children || node.children.length === 0)) {\n return null;\n }\n\n return node;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { RootConfig, modelRowHasPurpose, 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, a as AXMAiModelStableIds } from './acorex-connectivity-mock-acorex-connectivity-mock-Btm13GJK.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.fileStorage = inject(AXPFileStorageService);
|
|
35
|
+
this.entityService = inject(AXPEntityService);
|
|
36
|
+
this.modelData = this.entityService
|
|
37
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.model.name)
|
|
38
|
+
.data();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolves the image catalog row from the command `model` input only (invalid ids are ignored).
|
|
42
|
+
*/
|
|
43
|
+
async resolveImageModelEntityId(explicitModel) {
|
|
44
|
+
const candidates = [
|
|
45
|
+
explicitModel?.trim(),
|
|
46
|
+
AXMAiModelStableIds.openrouterGrokImagineImageQuality,
|
|
47
|
+
].filter((id) => Boolean(id?.trim()));
|
|
48
|
+
for (const candidate of candidates) {
|
|
49
|
+
const row = await this.modelData.byKey(candidate);
|
|
50
|
+
if (row && modelRowHasPurpose(row, 'image')) {
|
|
51
|
+
return candidate;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return AXMAiModelStableIds.openrouterGrokImagineImageQuality;
|
|
55
|
+
}
|
|
56
|
+
async execute(input) {
|
|
57
|
+
const parsed = parseGenerateImageInput(input);
|
|
58
|
+
if (!parsed.ok) {
|
|
59
|
+
return { success: false, message: { text: parsed.error } };
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const modelEntityId = await this.resolveImageModelEntityId(parsed.model);
|
|
63
|
+
let composedPrompt = parsed.prompt;
|
|
64
|
+
if (parsed.style?.trim()) {
|
|
65
|
+
composedPrompt = `${composedPrompt}\nStyle: ${parsed.style.trim()}`;
|
|
66
|
+
}
|
|
67
|
+
const { imageUrl } = await this.aiChatRouter.generateImage({
|
|
68
|
+
modelEntityId,
|
|
69
|
+
prompt: composedPrompt,
|
|
70
|
+
size: parsed.size?.trim() || undefined,
|
|
71
|
+
});
|
|
72
|
+
try {
|
|
73
|
+
const file = await blobOrFileFromImageResult(imageUrl);
|
|
74
|
+
const { fileId } = await persistAiGeneratedImage(this.fileStorage, file, {
|
|
75
|
+
refId: modelEntityId,
|
|
76
|
+
refType: AI_CHAT_GENERATED_IMAGE_REF_TYPE,
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
success: true,
|
|
80
|
+
data: {
|
|
81
|
+
fileId,
|
|
82
|
+
prompt: parsed.prompt,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (persistErr) {
|
|
87
|
+
const u = imageUrl.trim();
|
|
88
|
+
if (u.startsWith('https://') && u.length <= AI_GENERATED_IMAGE_MAX_REMOTE_URL_IN_TOOL) {
|
|
89
|
+
return {
|
|
90
|
+
success: true,
|
|
91
|
+
data: { prompt: parsed.prompt, imageUrl: u },
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const pmsg = persistErr instanceof Error ? persistErr.message : String(persistErr);
|
|
95
|
+
throw new Error(`Could not store generated image for chat replay. ${pmsg}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
100
|
+
return { success: false, message: { text: msg } };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatGenerateImageCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
104
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatGenerateImageCommand }); }
|
|
105
|
+
}
|
|
106
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatGenerateImageCommand, decorators: [{
|
|
107
|
+
type: Injectable
|
|
108
|
+
}] });
|
|
109
|
+
|
|
110
|
+
export { AiManagementChatGenerateImageCommand };
|
|
111
|
+
//# sourceMappingURL=acorex-connectivity-mock-chat-generate-image.command-Hj-2bHyJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-chat-generate-image.command-Hj-2bHyJ.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 blobOrFileFromImageResult,\n modelRowHasPurpose,\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 { AXMAiModelRow } from '../ai-agent-engine.types';\nimport { AXCAiChatRouterService } from '../chat/ai-chat-router.service';\nimport { AXMAiModelStableIds } from '../model/model.mock';\n\n//#endregion\n\n//#region ---- Command: AiManagement:ChatGenerateImage ----\n\nexport interface AiManagementChatGenerateImageInput {\n /**\n * Catalog `AiModel` row id (image purpose). Supplied on the command invocation or via\n * agent `commandIds[].command.options.model` defaults merged before execute.\n */\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\n AXPCommand<\n AiManagementChatGenerateImageInput,\n { fileId?: string; prompt: string; imageUrl?: string }\n >\n{\n private readonly aiChatRouter = inject(AXCAiChatRouterService);\n private readonly fileStorage = inject(AXPFileStorageService);\n private readonly entityService = inject(AXPEntityService);\n\n private readonly modelData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.model.name)\n .data<string, AXMAiModelRow, AXMAiModelRow, AXMAiModelRow, AXMAiModelRow>();\n\n /**\n * Resolves the image catalog row from the command `model` input only (invalid ids are ignored).\n */\n private async resolveImageModelEntityId(explicitModel: string | undefined): Promise<string> {\n const candidates = [\n explicitModel?.trim(),\n AXMAiModelStableIds.openrouterGrokImagineImageQuality,\n ].filter((id): id is string => Boolean(id?.trim()));\n\n for (const candidate of candidates) {\n const row = await this.modelData.byKey(candidate);\n if (row && modelRowHasPurpose(row as unknown as Record<string, unknown>, 'image')) {\n return candidate;\n }\n }\n\n return AXMAiModelStableIds.openrouterGrokImagineImageQuality;\n }\n\n async execute(\n input: AiManagementChatGenerateImageInput,\n ): Promise<\n AXPExecuteCommandResult<{\n fileId?: string;\n prompt: string;\n imageUrl?: string;\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 modelEntityId = await this.resolveImageModelEntityId(parsed.model);\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: modelEntityId,\n refType: AI_CHAT_GENERATED_IMAGE_REF_TYPE,\n });\n return {\n success: true,\n data: {\n fileId,\n prompt: parsed.prompt,\n },\n };\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,121 @@
|
|
|
1
|
+
import { AXPAiChatToolRunContextService, RootConfig, modelRowHasPurpose, prepareTtsBytesForBrowserPlayback, 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, a as AXMAiModelStableIds, c as resolveDelegatedAssistOptionString, d as resolveOpenAiCompatibleTtsVoice, O as OPENROUTER_GEMINI_FLASH_TTS_DEFAULT_FORMAT } from './acorex-connectivity-mock-acorex-connectivity-mock-Btm13GJK.mjs';
|
|
7
|
+
|
|
8
|
+
//#region ---- Imports ----
|
|
9
|
+
function parseSynthesizeInput(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 text = typeof obj['text'] === 'string' ? obj['text'].trim() : '';
|
|
17
|
+
if (!text) {
|
|
18
|
+
return { ok: false, error: 'Invalid arguments: "text" is required and must be non-empty.' };
|
|
19
|
+
}
|
|
20
|
+
const model = typeof obj['model'] === 'string' ? obj['model'].trim() : undefined;
|
|
21
|
+
const voice = typeof obj['voice'] === 'string' ? obj['voice'].trim() : undefined;
|
|
22
|
+
const responseFormat = typeof obj['responseFormat'] === 'string' ? obj['responseFormat'].trim() : undefined;
|
|
23
|
+
return {
|
|
24
|
+
ok: true,
|
|
25
|
+
text,
|
|
26
|
+
...(model ? { model } : {}),
|
|
27
|
+
...(voice ? { voice } : {}),
|
|
28
|
+
...(responseFormat ? { responseFormat } : {}),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
class AiManagementChatSynthesizeSpeechCommand {
|
|
32
|
+
constructor() {
|
|
33
|
+
this.aiChatRouter = inject(AXCAiChatRouterService);
|
|
34
|
+
this.runContext = inject(AXPAiChatToolRunContextService);
|
|
35
|
+
this.fileStorage = inject(AXPFileStorageService);
|
|
36
|
+
this.entityService = inject(AXPEntityService);
|
|
37
|
+
this.modelData = this.entityService
|
|
38
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.model.name)
|
|
39
|
+
.data();
|
|
40
|
+
this.assistData = this.entityService
|
|
41
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.assist.name)
|
|
42
|
+
.data();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolves the TTS catalog row from the command `model` input only (invalid ids are ignored).
|
|
46
|
+
*/
|
|
47
|
+
async resolveTtsModelEntityId(explicitModel) {
|
|
48
|
+
const candidates = [
|
|
49
|
+
explicitModel?.trim(),
|
|
50
|
+
AXMAiModelStableIds.openrouterGemini31FlashTtsPreview,
|
|
51
|
+
AXMAiModelStableIds.openrouterKokoro82m,
|
|
52
|
+
AXMAiModelStableIds.openrouterGrokVoiceTts10,
|
|
53
|
+
].filter((id) => Boolean(id?.trim()));
|
|
54
|
+
for (const candidate of candidates) {
|
|
55
|
+
const row = await this.modelData.byKey(candidate);
|
|
56
|
+
if (row && modelRowHasPurpose(row, 'tts')) {
|
|
57
|
+
return candidate;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return AXMAiModelStableIds.openrouterGemini31FlashTtsPreview;
|
|
61
|
+
}
|
|
62
|
+
async execute(input) {
|
|
63
|
+
const ctx = this.runContext.getContext();
|
|
64
|
+
if (!ctx?.assistId?.trim()) {
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
message: {
|
|
68
|
+
text: 'Text-to-speech requires an active AI chat run context (assist id).',
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const parsed = parseSynthesizeInput(input);
|
|
73
|
+
if (!parsed.ok) {
|
|
74
|
+
return { success: false, message: { text: parsed.error } };
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const modelEntityId = await this.resolveTtsModelEntityId(parsed.model);
|
|
78
|
+
const modelRow = await this.modelData.byKey(modelEntityId);
|
|
79
|
+
const catalogApiModelName = modelRow?.name?.trim() ?? '';
|
|
80
|
+
const assist = await this.assistData.byKey(ctx.assistId.trim());
|
|
81
|
+
const voiceFromAssist = assist ? resolveDelegatedAssistOptionString(assist, ctx.agentId, 'voice') || undefined : undefined;
|
|
82
|
+
const formatFromAssist = assist ? resolveDelegatedAssistOptionString(assist, ctx.agentId, 'responseFormat') || undefined : undefined;
|
|
83
|
+
const voice = resolveOpenAiCompatibleTtsVoice(catalogApiModelName, parsed.voice?.trim() || voiceFromAssist);
|
|
84
|
+
const responseFormat = parsed.responseFormat?.trim() ||
|
|
85
|
+
formatFromAssist?.trim() ||
|
|
86
|
+
OPENROUTER_GEMINI_FLASH_TTS_DEFAULT_FORMAT;
|
|
87
|
+
const { audioBytes, mimeType } = await this.aiChatRouter.synthesizeSpeech({
|
|
88
|
+
modelEntityId,
|
|
89
|
+
text: parsed.text,
|
|
90
|
+
voice,
|
|
91
|
+
responseFormat,
|
|
92
|
+
});
|
|
93
|
+
const prepared = prepareTtsBytesForBrowserPlayback(audioBytes, mimeType?.trim() || 'application/octet-stream');
|
|
94
|
+
const fileName = `ai-tts.${prepared.extension}`;
|
|
95
|
+
const file = new File([prepared.audioBytes], fileName, { type: prepared.mimeType });
|
|
96
|
+
try {
|
|
97
|
+
const { fileId } = await persistAiGeneratedSpeech(this.fileStorage, file, {
|
|
98
|
+
refId: ctx.assistId.trim(),
|
|
99
|
+
refType: AI_CHAT_GENERATED_SPEECH_REF_TYPE,
|
|
100
|
+
});
|
|
101
|
+
return { success: true, data: { fileId, text: parsed.text } };
|
|
102
|
+
}
|
|
103
|
+
catch (persistErr) {
|
|
104
|
+
const pmsg = persistErr instanceof Error ? persistErr.message : String(persistErr);
|
|
105
|
+
throw new Error(`Could not store synthesized speech for chat replay. ${pmsg}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
110
|
+
return { success: false, message: { text: msg } };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatSynthesizeSpeechCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
114
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatSynthesizeSpeechCommand }); }
|
|
115
|
+
}
|
|
116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatSynthesizeSpeechCommand, decorators: [{
|
|
117
|
+
type: Injectable
|
|
118
|
+
}] });
|
|
119
|
+
|
|
120
|
+
export { AiManagementChatSynthesizeSpeechCommand };
|
|
121
|
+
//# sourceMappingURL=acorex-connectivity-mock-chat-synthesize-speech.command-0ZnevjmT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-chat-synthesize-speech.command-0ZnevjmT.mjs","sources":["../../../../libs/connectivity/mock/src/lib/ai-management/commands/chat-synthesize-speech.command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport {\n AI_CHAT_GENERATED_SPEECH_REF_TYPE,\n AXPAiChatToolRunContextService,\n modelRowHasPurpose,\n persistAiGeneratedSpeech,\n prepareTtsBytesForBrowserPlayback,\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, AXMAiModelRow } from '../ai-agent-engine.types';\nimport {\n resolveDelegatedAssistOptionString,\n} from '../ai-delegated-agent-parameters.util';\nimport { AXCAiChatRouterService } from '../chat/ai-chat-router.service';\nimport {\n OPENROUTER_GEMINI_FLASH_TTS_DEFAULT_FORMAT,\n resolveOpenAiCompatibleTtsVoice,\n} from '../chat/open-ai-tts-compat.util';\nimport { AXMAiModelStableIds } from '../model/model.mock';\n\n//#endregion\n\n//#region ---- Command: AiManagement:ChatSynthesizeSpeech ----\n\nexport interface AiManagementChatSynthesizeSpeechInput {\n /**\n * Catalog `AiModel` row id (tts purpose). Supplied on the command invocation or via\n * agent `commandIds[].command.options.model` defaults merged before execute.\n */\n model?: string;\n text?: string;\n voice?: string;\n responseFormat?: string;\n}\n\nfunction parseSynthesizeInput(args: unknown):\n | { ok: true; model?: string; text: string; voice?: string; responseFormat?: 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 text = typeof obj['text'] === 'string' ? obj['text'].trim() : '';\n if (!text) {\n return { ok: false, error: 'Invalid arguments: \"text\" is required and must be non-empty.' };\n }\n const model = typeof obj['model'] === 'string' ? obj['model'].trim() : undefined;\n const voice = typeof obj['voice'] === 'string' ? obj['voice'].trim() : undefined;\n const responseFormat =\n typeof obj['responseFormat'] === 'string' ? obj['responseFormat'].trim() : undefined;\n return {\n ok: true,\n text,\n ...(model ? { model } : {}),\n ...(voice ? { voice } : {}),\n ...(responseFormat ? { responseFormat } : {}),\n };\n}\n\n@Injectable()\nexport class AiManagementChatSynthesizeSpeechCommand\n implements\n AXPCommand<\n AiManagementChatSynthesizeSpeechInput,\n { fileId?: string; text: string }\n >\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 modelData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.model.name)\n .data<string, AXMAiModelRow, AXMAiModelRow, AXMAiModelRow, AXMAiModelRow>();\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 /**\n * Resolves the TTS catalog row from the command `model` input only (invalid ids are ignored).\n */\n private async resolveTtsModelEntityId(explicitModel: string | undefined): Promise<string> {\n const candidates = [\n explicitModel?.trim(),\n AXMAiModelStableIds.openrouterGemini31FlashTtsPreview,\n AXMAiModelStableIds.openrouterKokoro82m,\n AXMAiModelStableIds.openrouterGrokVoiceTts10,\n ].filter((id): id is string => Boolean(id?.trim()));\n\n for (const candidate of candidates) {\n const row = await this.modelData.byKey(candidate);\n if (row && modelRowHasPurpose(row as unknown as Record<string, unknown>, 'tts')) {\n return candidate;\n }\n }\n\n return AXMAiModelStableIds.openrouterGemini31FlashTtsPreview;\n }\n\n async execute(\n input: AiManagementChatSynthesizeSpeechInput,\n ): Promise<AXPExecuteCommandResult<{ fileId?: string; text: string }>> {\n const ctx = this.runContext.getContext();\n if (!ctx?.assistId?.trim()) {\n return {\n success: false,\n message: {\n text: 'Text-to-speech requires an active AI chat run context (assist id).',\n },\n };\n }\n\n const parsed = parseSynthesizeInput(input);\n if (!parsed.ok) {\n return { success: false, message: { text: parsed.error } };\n }\n\n try {\n const modelEntityId = await this.resolveTtsModelEntityId(parsed.model);\n const modelRow = await this.modelData.byKey(modelEntityId);\n const catalogApiModelName = modelRow?.name?.trim() ?? '';\n\n const assist = await this.assistData.byKey(ctx.assistId.trim());\n const voiceFromAssist =\n assist ? resolveDelegatedAssistOptionString(assist, ctx.agentId, 'voice') || undefined : undefined;\n const formatFromAssist =\n assist ? resolveDelegatedAssistOptionString(assist, ctx.agentId, 'responseFormat') || undefined : undefined;\n const voice = resolveOpenAiCompatibleTtsVoice(\n catalogApiModelName,\n parsed.voice?.trim() || voiceFromAssist,\n );\n const responseFormat =\n parsed.responseFormat?.trim() ||\n formatFromAssist?.trim() ||\n OPENROUTER_GEMINI_FLASH_TTS_DEFAULT_FORMAT;\n\n const { audioBytes, mimeType } = await this.aiChatRouter.synthesizeSpeech({\n modelEntityId,\n text: parsed.text,\n voice,\n responseFormat,\n });\n\n const prepared = prepareTtsBytesForBrowserPlayback(audioBytes, mimeType?.trim() || 'application/octet-stream');\n const fileName = `ai-tts.${prepared.extension}`;\n const file = new File([prepared.audioBytes], fileName, { type: prepared.mimeType });\n\n try {\n const { fileId } = await persistAiGeneratedSpeech(this.fileStorage, file, {\n refId: ctx.assistId.trim(),\n refType: AI_CHAT_GENERATED_SPEECH_REF_TYPE,\n });\n return { success: true, data: { fileId, text: parsed.text } };\n } catch (persistErr) {\n const pmsg = persistErr instanceof Error ? persistErr.message : String(persistErr);\n throw new Error(`Could not store synthesized speech 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,121 @@
|
|
|
1
|
+
import { AXPAiChatToolRunContextService, RootConfig } 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, b as resolveAssistSpeechModelId, c as resolveDelegatedAssistOptionString } from './acorex-connectivity-mock-acorex-connectivity-mock-Btm13GJK.mjs';
|
|
7
|
+
|
|
8
|
+
//#region ---- Imports ----
|
|
9
|
+
function parseTranscribeInput(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 fileId = typeof obj['fileId'] === 'string' ? obj['fileId'].trim() : '';
|
|
17
|
+
if (!fileId) {
|
|
18
|
+
return { ok: false, error: 'Invalid arguments: "fileId" is required and must be non-empty.' };
|
|
19
|
+
}
|
|
20
|
+
const model = typeof obj['model'] === 'string' ? obj['model'].trim() : undefined;
|
|
21
|
+
const language = typeof obj['language'] === 'string' ? obj['language'].trim() : undefined;
|
|
22
|
+
return {
|
|
23
|
+
ok: true,
|
|
24
|
+
fileId,
|
|
25
|
+
...(model ? { model } : {}),
|
|
26
|
+
...(language ? { language } : {}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
class AiManagementChatTranscribeSpeechCommand {
|
|
30
|
+
constructor() {
|
|
31
|
+
this.aiChatRouter = inject(AXCAiChatRouterService);
|
|
32
|
+
this.runContext = inject(AXPAiChatToolRunContextService);
|
|
33
|
+
this.fileStorage = inject(AXPFileStorageService);
|
|
34
|
+
this.entityService = inject(AXPEntityService);
|
|
35
|
+
this.assistData = this.entityService
|
|
36
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.assist.name)
|
|
37
|
+
.data();
|
|
38
|
+
}
|
|
39
|
+
async execute(input) {
|
|
40
|
+
const ctx = this.runContext.getContext();
|
|
41
|
+
if (!ctx?.assistId?.trim()) {
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
message: {
|
|
45
|
+
text: 'Speech transcription requires an active AI chat run context (assist id).',
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const parsed = parseTranscribeInput(input);
|
|
50
|
+
if (!parsed.ok) {
|
|
51
|
+
return { success: false, message: { text: parsed.error } };
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const assist = await this.assistData.byKey(ctx.assistId.trim());
|
|
55
|
+
if (!assist) {
|
|
56
|
+
return {
|
|
57
|
+
success: false,
|
|
58
|
+
message: { text: `Assist row was not found (id: ${ctx.assistId.trim()}).` },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const modelEntityId = parsed.model?.trim() ||
|
|
62
|
+
resolveDelegatedAssistOptionModel(assist, ctx.agentId) ||
|
|
63
|
+
resolveAssistSpeechModelId(assist) ||
|
|
64
|
+
'';
|
|
65
|
+
if (!modelEntityId) {
|
|
66
|
+
return {
|
|
67
|
+
success: false,
|
|
68
|
+
message: {
|
|
69
|
+
text: 'No speech model: pass "model" (catalog id) or set options.model on the speech-to-text delegated specialist row for this assist.',
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
let mimeType = 'application/octet-stream';
|
|
74
|
+
let audioBytes;
|
|
75
|
+
let uploadFileName;
|
|
76
|
+
try {
|
|
77
|
+
const info = await this.fileStorage.getInfo(parsed.fileId);
|
|
78
|
+
const file = info.binary;
|
|
79
|
+
mimeType = info.mimeType?.trim() || file.type?.trim() || mimeType;
|
|
80
|
+
uploadFileName = info.name?.trim() || file.name?.trim() || undefined;
|
|
81
|
+
audioBytes = await file.arrayBuffer();
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
85
|
+
return {
|
|
86
|
+
success: false,
|
|
87
|
+
message: { text: `Could not read audio file (fileId: ${parsed.fileId}). ${msg}` },
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
if (audioBytes.byteLength === 0) {
|
|
91
|
+
return {
|
|
92
|
+
success: false,
|
|
93
|
+
message: { text: `Audio file is empty (fileId: ${parsed.fileId}).` },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const language = parsed.language?.trim() ||
|
|
97
|
+
resolveDelegatedAssistOptionString(assist, ctx.agentId, 'language') ||
|
|
98
|
+
undefined;
|
|
99
|
+
const { text } = await this.aiChatRouter.transcribeSpeech({
|
|
100
|
+
modelEntityId,
|
|
101
|
+
audioBytes,
|
|
102
|
+
mimeType,
|
|
103
|
+
...(uploadFileName ? { fileName: uploadFileName } : {}),
|
|
104
|
+
...(language ? { language } : {}),
|
|
105
|
+
});
|
|
106
|
+
return { success: true, data: { text } };
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
110
|
+
return { success: false, message: { text: msg } };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatTranscribeSpeechCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
114
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatTranscribeSpeechCommand }); }
|
|
115
|
+
}
|
|
116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatTranscribeSpeechCommand, decorators: [{
|
|
117
|
+
type: Injectable
|
|
118
|
+
}] });
|
|
119
|
+
|
|
120
|
+
export { AiManagementChatTranscribeSpeechCommand };
|
|
121
|
+
//# sourceMappingURL=acorex-connectivity-mock-chat-transcribe-speech.command-D8sCgp69.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-chat-transcribe-speech.command-D8sCgp69.mjs","sources":["../../../../libs/connectivity/mock/src/lib/ai-management/commands/chat-transcribe-speech.command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPAiChatToolRunContextService, RootConfig } 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 {\n resolveAssistSpeechModelId,\n resolveDelegatedAssistOptionModel,\n resolveDelegatedAssistOptionString,\n} from '../ai-delegated-agent-parameters.util';\nimport { AXCAiChatRouterService } from '../chat/ai-chat-router.service';\n\n//#endregion\n\n//#region ---- Command: AiManagement:ChatTranscribeSpeech ----\n\nexport interface AiManagementChatTranscribeSpeechInput {\n /** Catalog `AiModel` row id for a speech-purpose model. When omitted, uses `delegatedAgents[].options.model` for the active delegated specialist (`agentId` in run context). */\n model?: string;\n fileId?: string;\n language?: string;\n}\n\nfunction parseTranscribeInput(args: unknown):\n | { ok: true; model?: string; fileId: string; language?: 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 fileId = typeof obj['fileId'] === 'string' ? obj['fileId'].trim() : '';\n if (!fileId) {\n return { ok: false, error: 'Invalid arguments: \"fileId\" is required and must be non-empty.' };\n }\n const model = typeof obj['model'] === 'string' ? obj['model'].trim() : undefined;\n const language = typeof obj['language'] === 'string' ? obj['language'].trim() : undefined;\n return {\n ok: true,\n fileId,\n ...(model ? { model } : {}),\n ...(language ? { language } : {}),\n };\n}\n\n@Injectable()\nexport class AiManagementChatTranscribeSpeechCommand\n implements AXPCommand<AiManagementChatTranscribeSpeechInput, { text: 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: AiManagementChatTranscribeSpeechInput,\n ): Promise<AXPExecuteCommandResult<{ text: string }>> {\n const ctx = this.runContext.getContext();\n if (!ctx?.assistId?.trim()) {\n return {\n success: false,\n message: {\n text: 'Speech transcription requires an active AI chat run context (assist id).',\n },\n };\n }\n\n const parsed = parseTranscribeInput(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() ||\n resolveDelegatedAssistOptionModel(assist, ctx.agentId) ||\n resolveAssistSpeechModelId(assist) ||\n '';\n if (!modelEntityId) {\n return {\n success: false,\n message: {\n text:\n 'No speech model: pass \"model\" (catalog id) or set options.model on the speech-to-text delegated specialist row for this assist.',\n },\n };\n }\n\n let mimeType = 'application/octet-stream';\n let audioBytes: ArrayBuffer;\n let uploadFileName: string | undefined;\n try {\n const info = await this.fileStorage.getInfo(parsed.fileId);\n const file = info.binary;\n mimeType = info.mimeType?.trim() || file.type?.trim() || mimeType;\n uploadFileName = info.name?.trim() || file.name?.trim() || undefined;\n audioBytes = await file.arrayBuffer();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n success: false,\n message: { text: `Could not read audio file (fileId: ${parsed.fileId}). ${msg}` },\n };\n }\n\n if (audioBytes.byteLength === 0) {\n return {\n success: false,\n message: { text: `Audio file is empty (fileId: ${parsed.fileId}).` },\n };\n }\n\n const language =\n parsed.language?.trim() ||\n resolveDelegatedAssistOptionString(assist, ctx.agentId, 'language') ||\n undefined;\n\n const { text } = await this.aiChatRouter.transcribeSpeech({\n modelEntityId,\n audioBytes,\n mimeType,\n ...(uploadFileName ? { fileName: uploadFileName } : {}),\n ...(language ? { language } : {}),\n });\n\n return { success: true, data: { text } };\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,45 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Injectable } from '@angular/core';
|
|
3
|
+
import { AXPSessionService } from '@acorex/platform/auth';
|
|
4
|
+
|
|
5
|
+
//#endregion
|
|
6
|
+
/**
|
|
7
|
+
* CheckPermission Activity (Backend - Mock)
|
|
8
|
+
*
|
|
9
|
+
* Checks if a user has specific permission.
|
|
10
|
+
* Execution Mode: backend
|
|
11
|
+
* Activity Type: workflow-activity:check-permission
|
|
12
|
+
*
|
|
13
|
+
* Outcomes: HasPermission | NoPermission
|
|
14
|
+
*/
|
|
15
|
+
class CheckPermissionActivity {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.sessionService = inject(AXPSessionService);
|
|
18
|
+
}
|
|
19
|
+
async execute(input) {
|
|
20
|
+
const hasPermission = this.sessionService.authorize(input.permission);
|
|
21
|
+
const output = {
|
|
22
|
+
hasPermission,
|
|
23
|
+
userId: input.userId || 'current-user',
|
|
24
|
+
permission: input.permission,
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
success: true,
|
|
28
|
+
data: output,
|
|
29
|
+
metadata: {
|
|
30
|
+
outcome: hasPermission ? 'HasPermission' : 'NoPermission',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CheckPermissionActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
35
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CheckPermissionActivity, providedIn: 'root' }); }
|
|
36
|
+
}
|
|
37
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CheckPermissionActivity, decorators: [{
|
|
38
|
+
type: Injectable,
|
|
39
|
+
args: [{
|
|
40
|
+
providedIn: 'root',
|
|
41
|
+
}]
|
|
42
|
+
}] });
|
|
43
|
+
|
|
44
|
+
export { CheckPermissionActivity };
|
|
45
|
+
//# sourceMappingURL=acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs","sources":["../../../../libs/connectivity/mock/src/lib/workflow-management/activities/check-permission.activity.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPExecuteCommandResult } from '@acorex/platform/core';\nimport { AXPCommand } from '@acorex/platform/runtime';\nimport { AXPSessionService } from '@acorex/platform/auth';\n\n//#region ---- Types ----\n\nexport interface CheckPermissionInput {\n permission: string;\n userId?: string;\n}\n\nexport interface CheckPermissionOutput {\n hasPermission: boolean;\n userId: string;\n permission: string;\n}\n\n//#endregion\n\n/**\n * CheckPermission Activity (Backend - Mock)\n *\n * Checks if a user has specific permission.\n * Execution Mode: backend\n * Activity Type: workflow-activity:check-permission\n *\n * Outcomes: HasPermission | NoPermission\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class CheckPermissionActivity implements AXPCommand<CheckPermissionInput, CheckPermissionOutput> {\n private readonly sessionService = inject(AXPSessionService);\n\n async execute(\n input: CheckPermissionInput,\n ): Promise<AXPExecuteCommandResult<CheckPermissionOutput>> {\n const hasPermission = this.sessionService.authorize(input.permission);\n\n const output: CheckPermissionOutput = {\n hasPermission,\n userId: input.userId || 'current-user',\n permission: input.permission,\n };\n\n return {\n success: true,\n data: output,\n metadata: {\n outcome: hasPermission ? 'HasPermission' : 'NoPermission',\n },\n };\n }\n}\n"],"names":[],"mappings":";;;;AAkBA;AAEA;;;;;;;;AAQG;MAIU,uBAAuB,CAAA;AAHpC,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAqB5D,IAAA;IAnBC,MAAM,OAAO,CACX,KAA2B,EAAA;AAE3B,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC;AAErE,QAAA,MAAM,MAAM,GAA0B;YACpC,aAAa;AACb,YAAA,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,cAAc;YACtC,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B;QAED,OAAO;AACL,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE;gBACR,OAAO,EAAE,aAAa,GAAG,eAAe,GAAG,cAAc;AAC1D,aAAA;SACF;IACH;8GArBW,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;;;;;"}
|