@acorex/connectivity 21.0.0-next.7 → 21.0.0-next.71

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 (102) 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 +190 -188
  4. package/fesm2022/acorex-connectivity-api.mjs.map +1 -1
  5. package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-Wofp2dW8.mjs +84148 -0
  6. package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-Wofp2dW8.mjs.map +1 -0
  7. package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-C18ksdYp.mjs +288 -0
  8. package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-C18ksdYp.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-B4aTFrkL.mjs +111 -0
  14. package/fesm2022/acorex-connectivity-mock-chat-generate-image.command-B4aTFrkL.mjs.map +1 -0
  15. package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-WgAOpZ71.mjs +136 -0
  16. package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-WgAOpZ71.mjs.map +1 -0
  17. package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-BzqFA5rc.mjs +121 -0
  18. package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-BzqFA5rc.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-contact-core.module-5TLCGWOR.mjs +968 -0
  22. package/fesm2022/acorex-connectivity-mock-contact-core.module-5TLCGWOR.mjs.map +1 -0
  23. package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs +16 -0
  24. package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs.map +1 -0
  25. package/fesm2022/{acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs → acorex-connectivity-mock-distribution-record.activity-DuNluOzA.mjs} +18 -6
  26. package/fesm2022/acorex-connectivity-mock-distribution-record.activity-DuNluOzA.mjs.map +1 -0
  27. package/fesm2022/acorex-connectivity-mock-entity-create.activity-CdoUzUvF.mjs +67 -0
  28. package/fesm2022/acorex-connectivity-mock-entity-create.activity-CdoUzUvF.mjs.map +1 -0
  29. package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs +60 -0
  30. package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs.map +1 -0
  31. package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs +67 -0
  32. package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs.map +1 -0
  33. package/fesm2022/acorex-connectivity-mock-entity-update.activity-06HTKiQQ.mjs +68 -0
  34. package/fesm2022/acorex-connectivity-mock-entity-update.activity-06HTKiQQ.mjs.map +1 -0
  35. package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs +64 -0
  36. package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs.map +1 -0
  37. 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
  38. package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-DwVuYuKx.mjs.map +1 -0
  39. package/fesm2022/{acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs → acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs} +4 -4
  40. package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs.map +1 -0
  41. package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-CsmxwXsM.mjs +39 -0
  42. package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-CsmxwXsM.mjs.map +1 -0
  43. package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs +69 -0
  44. package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs.map +1 -0
  45. package/fesm2022/acorex-connectivity-mock-get-employee-list.query-DifHwuqH.mjs +213 -0
  46. package/fesm2022/acorex-connectivity-mock-get-employee-list.query-DifHwuqH.mjs.map +1 -0
  47. package/fesm2022/acorex-connectivity-mock-get-location-list.query-bMjkZnzq.mjs +209 -0
  48. package/fesm2022/acorex-connectivity-mock-get-location-list.query-bMjkZnzq.mjs.map +1 -0
  49. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs +186 -0
  50. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs.map +1 -0
  51. package/fesm2022/{acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs → acorex-connectivity-mock-get-product-list.query-f-mTj4ah.mjs} +107 -11
  52. package/fesm2022/acorex-connectivity-mock-get-product-list.query-f-mTj4ah.mjs.map +1 -0
  53. package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-Co1V52c4.mjs +192 -0
  54. package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-Co1V52c4.mjs.map +1 -0
  55. package/fesm2022/{acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs → acorex-connectivity-mock-get-subscriptions-chart-data.query-BQT5a_hn.mjs} +5 -5
  56. package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-BQT5a_hn.mjs.map +1 -0
  57. package/fesm2022/{acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs → acorex-connectivity-mock-get-subscriptions-timeline.query-D4qfDfeV.mjs} +91 -13
  58. package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-D4qfDfeV.mjs.map +1 -0
  59. package/fesm2022/{acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs → acorex-connectivity-mock-get-tenant-application-access.query-n1_Azada.mjs} +91 -13
  60. package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-n1_Azada.mjs.map +1 -0
  61. package/fesm2022/{acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs → acorex-connectivity-mock-get-tenant-registration-chart-data.query-Cg4ykZU2.mjs} +5 -5
  62. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-Cg4ykZU2.mjs.map +1 -0
  63. package/fesm2022/{acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs → acorex-connectivity-mock-get-tenant-registration-timeline.query-0sCBtdbp.mjs} +91 -13
  64. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-0sCBtdbp.mjs.map +1 -0
  65. package/fesm2022/{acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs → acorex-connectivity-mock-get-tenant-user-distribution.query-rD811gtM.mjs} +91 -13
  66. package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-rD811gtM.mjs.map +1 -0
  67. package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs +35 -0
  68. package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs.map +1 -0
  69. package/fesm2022/acorex-connectivity-mock-notification-management-email-send.command-DAQfIWoD.mjs +73 -0
  70. package/fesm2022/acorex-connectivity-mock-notification-management-email-send.command-DAQfIWoD.mjs.map +1 -0
  71. package/fesm2022/{acorex-connectivity-mock-sample.command-CkH5bmEs.mjs → acorex-connectivity-mock-sample.command-CJmDL4pL.mjs} +4 -4
  72. package/fesm2022/acorex-connectivity-mock-sample.command-CJmDL4pL.mjs.map +1 -0
  73. package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs +38 -0
  74. package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs.map +1 -0
  75. package/fesm2022/acorex-connectivity-mock-user-roles-for-list-column.query-DkMa4-Ju.mjs +30 -0
  76. package/fesm2022/acorex-connectivity-mock-user-roles-for-list-column.query-DkMa4-Ju.mjs.map +1 -0
  77. package/fesm2022/acorex-connectivity-mock.mjs +2 -50208
  78. package/fesm2022/acorex-connectivity-mock.mjs.map +1 -1
  79. package/fesm2022/acorex-connectivity-utils.mjs +7 -7
  80. package/fesm2022/acorex-connectivity-utils.mjs.map +1 -1
  81. package/fesm2022/acorex-connectivity.mjs.map +1 -1
  82. package/package.json +8 -7
  83. package/{api/index.d.ts → types/acorex-connectivity-api.d.ts} +13 -60
  84. package/types/acorex-connectivity-mock.d.ts +4291 -0
  85. package/fesm2022/acorex-connectivity-api-execute.command-SGNBLcOi.mjs.map +0 -1
  86. package/fesm2022/acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs.map +0 -1
  87. package/fesm2022/acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs.map +0 -1
  88. package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs.map +0 -1
  89. package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs.map +0 -1
  90. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs +0 -97
  91. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs.map +0 -1
  92. package/fesm2022/acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs.map +0 -1
  93. package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs.map +0 -1
  94. package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs.map +0 -1
  95. package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs.map +0 -1
  96. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs.map +0 -1
  97. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs.map +0 -1
  98. package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs.map +0 -1
  99. package/fesm2022/acorex-connectivity-mock-sample.command-CkH5bmEs.mjs.map +0 -1
  100. package/mock/index.d.ts +0 -2576
  101. /package/{utils/index.d.ts → types/acorex-connectivity-utils.d.ts} +0 -0
  102. /package/{index.d.ts → types/acorex-connectivity.d.ts} +0 -0
@@ -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-Wofp2dW8.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-B4aTFrkL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-chat-generate-image.command-B4aTFrkL.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,136 @@
1
+ import { AXPAiChatToolRunContextService, RootConfig, modelRowHasPurpose, 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 } from './acorex-connectivity-mock-acorex-connectivity-mock-Wofp2dW8.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.modelData = this.entityService
60
+ .withEntity(RootConfig.module.name, RootConfig.entities.model.name)
61
+ .data();
62
+ this.assistData = this.entityService
63
+ .withEntity(RootConfig.module.name, RootConfig.entities.assist.name)
64
+ .data();
65
+ }
66
+ /**
67
+ * Resolves the TTS catalog row from the command `model` input only (invalid ids are ignored).
68
+ */
69
+ async resolveTtsModelEntityId(explicitModel) {
70
+ const candidates = [
71
+ explicitModel?.trim(),
72
+ AXMAiModelStableIds.openrouterGrokVoiceTts10,
73
+ ].filter((id) => Boolean(id?.trim()));
74
+ for (const candidate of candidates) {
75
+ const row = await this.modelData.byKey(candidate);
76
+ if (row && modelRowHasPurpose(row, 'tts')) {
77
+ return candidate;
78
+ }
79
+ }
80
+ return AXMAiModelStableIds.openrouterGrokVoiceTts10;
81
+ }
82
+ async execute(input) {
83
+ const ctx = this.runContext.getContext();
84
+ if (!ctx?.assistId?.trim()) {
85
+ return {
86
+ success: false,
87
+ message: {
88
+ text: 'Text-to-speech requires an active AI chat run context (assist id).',
89
+ },
90
+ };
91
+ }
92
+ const parsed = parseSynthesizeInput(input);
93
+ if (!parsed.ok) {
94
+ return { success: false, message: { text: parsed.error } };
95
+ }
96
+ try {
97
+ const modelEntityId = await this.resolveTtsModelEntityId(parsed.model);
98
+ const assist = await this.assistData.byKey(ctx.assistId.trim());
99
+ const voiceFromAssist = assist ? resolveDelegatedAssistOptionString(assist, ctx.agentId, 'voice') || undefined : undefined;
100
+ const voice = parsed.voice?.trim() || voiceFromAssist || 'alloy';
101
+ const { audioBytes, mimeType } = await this.aiChatRouter.synthesizeSpeech({
102
+ modelEntityId,
103
+ text: parsed.text,
104
+ voice,
105
+ ...(parsed.responseFormat?.trim() ? { responseFormat: parsed.responseFormat.trim() } : {}),
106
+ });
107
+ const mt = mimeType?.trim() || 'application/octet-stream';
108
+ const ext = extForMime(mt);
109
+ const fileName = `ai-tts.${ext}`;
110
+ const file = new File([audioBytes], fileName, { type: mt });
111
+ try {
112
+ const { fileId } = await persistAiGeneratedSpeech(this.fileStorage, file, {
113
+ refId: ctx.assistId.trim(),
114
+ refType: AI_CHAT_GENERATED_SPEECH_REF_TYPE,
115
+ });
116
+ return { success: true, data: { fileId, text: parsed.text } };
117
+ }
118
+ catch (persistErr) {
119
+ const pmsg = persistErr instanceof Error ? persistErr.message : String(persistErr);
120
+ throw new Error(`Could not store synthesized speech for chat replay. ${pmsg}`);
121
+ }
122
+ }
123
+ catch (e) {
124
+ const msg = e instanceof Error ? e.message : String(e);
125
+ return { success: false, message: { text: msg } };
126
+ }
127
+ }
128
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatSynthesizeSpeechCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
129
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatSynthesizeSpeechCommand }); }
130
+ }
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AiManagementChatSynthesizeSpeechCommand, decorators: [{
132
+ type: Injectable
133
+ }] });
134
+
135
+ export { AiManagementChatSynthesizeSpeechCommand };
136
+ //# sourceMappingURL=acorex-connectivity-mock-chat-synthesize-speech.command-WgAOpZ71.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-chat-synthesize-speech.command-WgAOpZ71.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 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 { 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 extForMime(mime: string): string {\n const m = mime.toLowerCase();\n if (m.includes('mpeg') || m.includes('mp3')) {\n return 'mp3';\n }\n if (m.includes('wav')) {\n return 'wav';\n }\n if (m.includes('opus')) {\n return 'opus';\n }\n if (m.includes('ogg')) {\n return 'ogg';\n }\n if (m.includes('aac')) {\n return 'aac';\n }\n if (m.includes('flac')) {\n return 'flac';\n }\n return 'bin';\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.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.openrouterGrokVoiceTts10;\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\n const assist = await this.assistData.byKey(ctx.assistId.trim());\n const voiceFromAssist =\n assist ? resolveDelegatedAssistOptionString(assist, ctx.agentId, 'voice') || undefined : undefined;\n const voice = parsed.voice?.trim() || voiceFromAssist || 'alloy';\n\n const { audioBytes, mimeType } = await this.aiChatRouter.synthesizeSpeech({\n modelEntityId,\n text: parsed.text,\n voice,\n ...(parsed.responseFormat?.trim() ? { responseFormat: parsed.responseFormat.trim() } : {}),\n });\n\n const mt = mimeType?.trim() || 'application/octet-stream';\n const ext = extForMime(mt);\n const fileName = `ai-tts.${ext}`;\n const file = new File([audioBytes], fileName, { type: mt });\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":";;;;;;;AAAA;AAqCA,SAAS,UAAU,CAAC,IAAY,EAAA;AAC9B,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE;AAC5B,IAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC3C,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACrB,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACtB,QAAA,OAAO,MAAM;IACf;AACA,IAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACrB,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACrB,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACtB,QAAA,OAAO,MAAM;IACf;AACA,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,oBAAoB,CAAC,IAAa,EAAA;AAGzC,IAAA,MAAM,GAAG,GACP,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI;AAC7D,UAAG;UACD,IAAI;IACV,IAAI,CAAC,GAAG,EAAE;QACR,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,EAAE;IACvE;IACA,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE;IACtE,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8DAA8D,EAAE;IAC7F;IACA,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,SAAS;IAChF,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,SAAS;IAChF,MAAM,cAAc,GAClB,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,GAAG,SAAS;IACtF,OAAO;AACL,QAAA,EAAE,EAAE,IAAI;QACR,IAAI;AACJ,QAAA,IAAI,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC3B,QAAA,IAAI,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC3B,QAAA,IAAI,cAAc,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC;KAC9C;AACH;MAGa,uCAAuC,CAAA;AADpD,IAAA,WAAA,GAAA;AAQmB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,sBAAsB,CAAC;AAC7C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,8BAA8B,CAAC;AACnD,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC3C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAExC,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC;AAC/B,aAAA,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI;AACjE,aAAA,IAAI,EAAsE;QAE5D,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC;AAChC,aAAA,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI;AAClE,aAAA,IAAI,EAA0E;AA0ElF,IAAA;AAxEC;;AAEG;IACK,MAAM,uBAAuB,CAAC,aAAiC,EAAA;AACrE,QAAA,MAAM,UAAU,GAAG;YACjB,aAAa,EAAE,IAAI,EAAE;AACrB,YAAA,mBAAmB,CAAC,wBAAwB;AAC7C,SAAA,CAAC,MAAM,CAAC,CAAC,EAAE,KAAmB,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AAEnD,QAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC;YACjD,IAAI,GAAG,IAAI,kBAAkB,CAAC,GAAyC,EAAE,KAAK,CAAC,EAAE;AAC/E,gBAAA,OAAO,SAAS;YAClB;QACF;QAEA,OAAO,mBAAmB,CAAC,wBAAwB;IACrD;IAEA,MAAM,OAAO,CACX,KAA4C,EAAA;QAE5C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;QACxC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YAC1B,OAAO;AACL,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,OAAO,EAAE;AACP,oBAAA,IAAI,EAAE,oEAAoE;AAC3E,iBAAA;aACF;QACH;AAEA,QAAA,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC;AAC1C,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;AACd,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE;QAC5D;AAEA,QAAA,IAAI;YACF,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,KAAK,CAAC;AAEtE,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/D,MAAM,eAAe,GACnB,MAAM,GAAG,kCAAkC,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,SAAS,GAAG,SAAS;AACpG,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,eAAe,IAAI,OAAO;AAEhE,YAAA,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC;gBACxE,aAAa;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK;gBACL,IAAI,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC;AAC3F,aAAA,CAAC;YAEF,MAAM,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,0BAA0B;AACzD,YAAA,MAAM,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC;AAC1B,YAAA,MAAM,QAAQ,GAAG,CAAA,OAAA,EAAU,GAAG,EAAE;AAChC,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAE3D,YAAA,IAAI;AACF,gBAAA,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;AACxE,oBAAA,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;AAC1B,oBAAA,OAAO,EAAE,iCAAiC;AAC3C,iBAAA,CAAC;AACF,gBAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;YAC/D;YAAE,OAAO,UAAU,EAAE;AACnB,gBAAA,MAAM,IAAI,GAAG,UAAU,YAAY,KAAK,GAAG,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAClF,gBAAA,MAAM,IAAI,KAAK,CAAC,uDAAuD,IAAI,CAAA,CAAE,CAAC;YAChF;QACF;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;AACtD,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACnD;IACF;8GA3FW,uCAAuC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAvC,uCAAuC,EAAA,CAAA,CAAA;;2FAAvC,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBADnD;;;;;"}
@@ -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-Wofp2dW8.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-BzqFA5rc.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-chat-transcribe-speech.command-BzqFA5rc.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;;;;;"}