@acorex-platform/module-ai-management-client 0.0.37 → 0.0.46
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-platform-module-ai-management-client-contracts-entities-agent.mjs +30 -0
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-agent.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-assist.mjs +16 -0
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-assist.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-mcp-server.mjs +30 -0
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-mcp-server.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-model.mjs +52 -15
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-model.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-open-ai-endpoint.mjs +30 -0
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-open-ai-endpoint.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-rule.mjs +30 -0
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-rule.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-run-log.mjs +430 -0
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-run-log.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-skill.mjs +30 -0
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-skill.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-ai-management-client-contracts-entity-catalog-acorex-platform-module-ai-management-client-contracts-entity-catalog-oTY4z5q8.mjs → acorex-platform-module-ai-management-client-contracts-entity-catalog-acorex-platform-module-ai-management-client-contracts-entity-catalog-D8jl5iFT.mjs} +25 -8
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-acorex-platform-module-ai-management-client-contracts-entity-catalog-D8jl5iFT.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-ai-management-client-contracts-entity-catalog-agent.entity-C75X-uZh.mjs → acorex-platform-module-ai-management-client-contracts-entity-catalog-agent.entity-Dj7dZRjE.mjs} +16 -2
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-agent.entity-Dj7dZRjE.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-ai-management-client-contracts-entity-catalog-assist.entity-DrlJo7CZ.mjs → acorex-platform-module-ai-management-client-contracts-entity-catalog-assist.entity-DUlikO9I.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-ai-management-client-contracts-entity-catalog-assist.entity-DrlJo7CZ.mjs.map → acorex-platform-module-ai-management-client-contracts-entity-catalog-assist.entity-DUlikO9I.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-ai-management-client-contracts-entity-catalog-mcp-server.entity-UxFvQ92v.mjs → acorex-platform-module-ai-management-client-contracts-entity-catalog-mcp-server.entity-BVI_7IhH.mjs} +16 -2
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-mcp-server.entity-BVI_7IhH.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-ai-management-client-contracts-entity-catalog-model.entity-DEdFUAPx.mjs → acorex-platform-module-ai-management-client-contracts-entity-catalog-model.entity-Xd45s9xE.mjs} +38 -17
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-model.entity-Xd45s9xE.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-ai-management-client-contracts-entity-catalog-open-ai-endpoint.entity-CygH9dU_.mjs → acorex-platform-module-ai-management-client-contracts-entity-catalog-open-ai-endpoint.entity-CWsUMad_.mjs} +16 -2
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-open-ai-endpoint.entity-CWsUMad_.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-ai-management-client-contracts-entity-catalog-rule.entity-Ddul_n4_.mjs → acorex-platform-module-ai-management-client-contracts-entity-catalog-rule.entity-Z6wYZrFU.mjs} +16 -2
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-rule.entity-Z6wYZrFU.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-run-log.entity-B2PG0QN0.mjs +343 -0
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-run-log.entity-B2PG0QN0.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-ai-management-client-contracts-entity-catalog-skill.entity-CeMnKpRg.mjs → acorex-platform-module-ai-management-client-contracts-entity-catalog-skill.entity-sNsPtjnT.mjs} +16 -2
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-skill.entity-sNsPtjnT.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog.mjs +1 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts.mjs +598 -526
- package/fesm2022/acorex-platform-module-ai-management-client-contracts.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-ai-management-client-list-ai-query-registry-catalog.query-BX0uU1YX.mjs → acorex-platform-module-ai-management-client-list-ai-query-registry-catalog.query-BxL3pxzj.mjs} +3 -3
- package/fesm2022/acorex-platform-module-ai-management-client-list-ai-query-registry-catalog.query-BxL3pxzj.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-ai-management-client-local-entities.mjs +1 -0
- package/fesm2022/acorex-platform-module-ai-management-client-local-entities.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-ai-management-client.mjs +240 -109
- package/fesm2022/acorex-platform-module-ai-management-client.mjs.map +1 -1
- package/package.json +5 -1
- package/types/acorex-platform-module-ai-management-client-contracts-entities-run-log.d.ts +5 -0
- package/types/acorex-platform-module-ai-management-client-contracts.d.ts +149 -85
- package/types/acorex-platform-module-ai-management-client.d.ts +24 -18
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-acorex-platform-module-ai-management-client-contracts-entity-catalog-oTY4z5q8.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-agent.entity-C75X-uZh.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-mcp-server.entity-UxFvQ92v.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-model.entity-DEdFUAPx.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-open-ai-endpoint.entity-CygH9dU_.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-rule.entity-Ddul_n4_.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-skill.entity-CeMnKpRg.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-ai-management-client-list-ai-query-registry-catalog.query-BX0uU1YX.mjs.map +0 -1
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { AXPSessionService, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';
|
|
2
2
|
import { AXPSettingsService, AXPFileStorageService, AXPOutputContractTranscriptSegmentService, AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER, AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER } from '@acorex-platform/framework-client/common';
|
|
3
3
|
import * as i1$1 from '@acorex-platform/framework-client/core';
|
|
4
|
-
import { objectKeyValueTransforms, AXPTagProvider, AXPComponentSlotModule,
|
|
4
|
+
import { objectKeyValueTransforms, AXPTagProvider, AXPComponentSlotModule, AXP_FEATURE_DEFINITION_PROVIDER, AXP_TAG_PROVIDER, AXP_CONTEXT_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/core';
|
|
5
5
|
import { AXP_WIDGETS_EDITOR_CATEGORY, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/layout/widget-core';
|
|
6
6
|
import { AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXPWidgetsModule } from '@acorex-platform/framework-client/layout/widgets';
|
|
7
7
|
import { AXPRuntimeModule, provideQuerySetups } from '@acorex-platform/framework-client/runtime';
|
|
8
8
|
import * as i0 from '@angular/core';
|
|
9
9
|
import { inject, Injectable, LOCALE_ID, PLATFORM_ID, input, signal, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
|
|
10
10
|
import { ROUTES } from '@angular/router';
|
|
11
|
-
import {
|
|
11
|
+
import { AXPAiManagementFeatureKeys, RootConfig, AXPAdministrationPermissionKeys, AXPAiManagementMenuKeys, AXMAiAssistPermissionKeys, AXPAiManagementSettings, isChatPurposeModelRow, readModelPurposes } from '@acorex-platform/module-ai-management-client/contracts';
|
|
12
|
+
export { AiManagementManifest } from '@acorex-platform/module-ai-management-client/contracts';
|
|
12
13
|
import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
|
|
13
14
|
import { AXPCommonPermissionGroupKeys } from '@acorex-platform/module-common-client/contracts';
|
|
14
15
|
import * as i7 from '@acorex/core/translation';
|
|
15
16
|
import { resolveMultiLanguageString, AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
|
|
16
17
|
import { AXPWidgetsList, AXPPlatformScope, AXPRegionalSetting, AXPFileStorageStatus, createRandomUuid } from '@acorex-platform/framework-shared/core';
|
|
17
|
-
import {
|
|
18
|
-
import { assembleAxpAiPlatformRuntimeContext, parseAgentOutputContract, axpAiChatMessageGetText, axpAiAgentOutputContractUsesStructuredFinalize, axpAiAgentOutputContractStructuredRetryCap, axpAiChatTextMessage, resolveAgentOutputContract, AXM_AI_PLATFORM_RUNTIME_CONTEXT_DEFINITIONS, AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY, AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY, AIMANAGEMENT_CHAT_GENERATE_IMAGE_COMMAND_KEY } from '@acorex-platform/module-ai-management-client/contracts';
|
|
18
|
+
import { assembleAxpAiPlatformRuntimeContext, parseAgentOutputContract, axpAiChatMessageGetText, axpAiAgentOutputContractUsesStructuredFinalize, axpAiAgentOutputContractStructuredRetryCap, axpAiChatTextMessage, resolveAgentOutputContract, AXM_AI_PLATFORM_RUNTIME_CONTEXT_DEFINITIONS, AIMANAGEMENT_RENDER_CHAT_CHART_COMMAND_KEY, AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY, AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY, AIMANAGEMENT_CHAT_GENERATE_IMAGE_COMMAND_KEY } from '@acorex-platform/module-ai-management-client/contracts';
|
|
19
19
|
export * from '@acorex-platform/module-ai-management-client/contracts';
|
|
20
20
|
import * as i2 from '@acorex/components/button';
|
|
21
21
|
import { AXButtonModule } from '@acorex/components/button';
|
|
@@ -35,25 +35,6 @@ import { FormsModule } from '@angular/forms';
|
|
|
35
35
|
import { AXOverlayService } from '@acorex/cdk/overlay';
|
|
36
36
|
import { AXPWidgetGroupEnum } from '@acorex-platform/framework-shared/widget-core';
|
|
37
37
|
|
|
38
|
-
//#region ---- Imports ----
|
|
39
|
-
//#endregion
|
|
40
|
-
//#region ---- Manifest Definition ----
|
|
41
|
-
/**
|
|
42
|
-
* AI Management Module Manifest.
|
|
43
|
-
* Defines module metadata for AI provider and API key management.
|
|
44
|
-
*/
|
|
45
|
-
const AiManagementManifest = {
|
|
46
|
-
name: RootConfig.module.name,
|
|
47
|
-
version: '1.0.0',
|
|
48
|
-
title: RootConfig.module.title,
|
|
49
|
-
icon: RootConfig.module.icon,
|
|
50
|
-
i18n: RootConfig.config.i18n,
|
|
51
|
-
type: 'domain',
|
|
52
|
-
domain: 'ai',
|
|
53
|
-
dependencies: [],
|
|
54
|
-
};
|
|
55
|
-
//#endregion
|
|
56
|
-
|
|
57
38
|
//#region ---- Imports ----
|
|
58
39
|
//#endregion
|
|
59
40
|
//#region ---- Feature Definition Provider ----
|
|
@@ -352,6 +333,13 @@ const AI_MODEL_PURPOSE_TAGS = [
|
|
|
352
333
|
description: 'Video generation',
|
|
353
334
|
scope: 'system',
|
|
354
335
|
},
|
|
336
|
+
{
|
|
337
|
+
id: 'ai-model-purpose-live-voice',
|
|
338
|
+
title: 'live-voice',
|
|
339
|
+
color: '#c026d3',
|
|
340
|
+
description: 'Realtime live voice (OpenAI Realtime / Gemini Live)',
|
|
341
|
+
scope: 'system',
|
|
342
|
+
},
|
|
355
343
|
];
|
|
356
344
|
//#region ---- Provider ----
|
|
357
345
|
class AXMAiModelPurposeTagProvider extends AXPTagProvider {
|
|
@@ -388,7 +376,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
388
376
|
//#endregion
|
|
389
377
|
//#region ---- Structured output ----
|
|
390
378
|
/** Default max completion tokens when the AiModel row has no `maxOutputTokens` and the caller omits `maxTokens`. */
|
|
391
|
-
const AXPAiAssistDefaultStructuredMaxTokens =
|
|
379
|
+
const AXPAiAssistDefaultStructuredMaxTokens = 32_000;
|
|
392
380
|
/** Default maximum follow-up turns after the first model response when validating structured JSON (implementation may use this). */
|
|
393
381
|
const AXPAiAssistDefaultMaxStructuredRetries = 3;
|
|
394
382
|
/**
|
|
@@ -526,6 +514,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
526
514
|
args: [{ providedIn: 'root' }]
|
|
527
515
|
}] });
|
|
528
516
|
|
|
517
|
+
//#region ---- Abort detection (client-only) ----
|
|
518
|
+
function errorName(value) {
|
|
519
|
+
if (!value || typeof value !== 'object') {
|
|
520
|
+
return undefined;
|
|
521
|
+
}
|
|
522
|
+
const name = value.name;
|
|
523
|
+
return typeof name === 'string' ? name : undefined;
|
|
524
|
+
}
|
|
525
|
+
function isAbortNamed(value) {
|
|
526
|
+
return errorName(value) === 'AbortError';
|
|
527
|
+
}
|
|
528
|
+
function isAiAssistAbortError(error, signal) {
|
|
529
|
+
if (signal?.aborted) {
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
if (isAbortNamed(error)) {
|
|
533
|
+
return true;
|
|
534
|
+
}
|
|
535
|
+
if (error && typeof error === 'object') {
|
|
536
|
+
const cause = error.cause;
|
|
537
|
+
if (isAbortNamed(cause)) {
|
|
538
|
+
return true;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
if (isAbortNamed(signal?.reason)) {
|
|
542
|
+
return true;
|
|
543
|
+
}
|
|
544
|
+
return false;
|
|
545
|
+
}
|
|
546
|
+
function createAiAssistAbortError(message = 'AI assist run cancelled', options) {
|
|
547
|
+
const error = options && 'cause' in options ? new Error(message, { cause: options.cause }) : new Error(message);
|
|
548
|
+
error.name = 'AbortError';
|
|
549
|
+
return error;
|
|
550
|
+
}
|
|
551
|
+
function assertAiAssistNotAborted(signal) {
|
|
552
|
+
if (!signal?.aborted) {
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
const reason = signal.reason;
|
|
556
|
+
if (reason instanceof Error && isAbortNamed(reason)) {
|
|
557
|
+
throw reason;
|
|
558
|
+
}
|
|
559
|
+
throw createAiAssistAbortError('AI assist run cancelled', reason !== undefined ? { cause: reason } : undefined);
|
|
560
|
+
}
|
|
561
|
+
//#endregion
|
|
562
|
+
|
|
529
563
|
//#region ---- Imports ----
|
|
530
564
|
//#endregion
|
|
531
565
|
//#region ---- Constants ----
|
|
@@ -820,7 +854,9 @@ class AXMAiAssistPromptBoxComponent {
|
|
|
820
854
|
//#region ---- State ----
|
|
821
855
|
this.promptDraft = signal('', /* @ts-ignore */
|
|
822
856
|
...(ngDevMode ? [{ debugName: "promptDraft" }] : /* istanbul ignore next */ []));
|
|
823
|
-
this.
|
|
857
|
+
this.runPhase = signal('idle', /* @ts-ignore */
|
|
858
|
+
...(ngDevMode ? [{ debugName: "runPhase" }] : /* istanbul ignore next */ []));
|
|
859
|
+
this.busy = computed(() => this.runPhase() !== 'idle', /* @ts-ignore */
|
|
824
860
|
...(ngDevMode ? [{ debugName: "busy" }] : /* istanbul ignore next */ []));
|
|
825
861
|
this.isComposerSaving = signal(false, /* @ts-ignore */
|
|
826
862
|
...(ngDevMode ? [{ debugName: "isComposerSaving" }] : /* istanbul ignore next */ []));
|
|
@@ -834,10 +870,11 @@ class AXMAiAssistPromptBoxComponent {
|
|
|
834
870
|
...(ngDevMode ? [{ debugName: "draftComposerFiles" }] : /* istanbul ignore next */ []));
|
|
835
871
|
this.assistTargetKey = signal('', /* @ts-ignore */
|
|
836
872
|
...(ngDevMode ? [{ debugName: "assistTargetKey" }] : /* istanbul ignore next */ []));
|
|
873
|
+
this.runAbortController = null;
|
|
837
874
|
//#endregion
|
|
838
875
|
//#region ---- Computed ----
|
|
839
876
|
this.canSend = computed(() => {
|
|
840
|
-
if (this.
|
|
877
|
+
if (this.runPhase() !== 'idle' || this.isComposerSaving()) {
|
|
841
878
|
return false;
|
|
842
879
|
}
|
|
843
880
|
const textOk = this.promptDraft().trim().length > 0;
|
|
@@ -870,6 +907,7 @@ class AXMAiAssistPromptBoxComponent {
|
|
|
870
907
|
}
|
|
871
908
|
}
|
|
872
909
|
ngOnDestroy() {
|
|
910
|
+
this.abortActiveRun();
|
|
873
911
|
for (const s of this.draftComposerImages()) {
|
|
874
912
|
URL.revokeObjectURL(s.previewUrl);
|
|
875
913
|
}
|
|
@@ -890,20 +928,40 @@ class AXMAiAssistPromptBoxComponent {
|
|
|
890
928
|
void this.onSend();
|
|
891
929
|
}
|
|
892
930
|
onCancel() {
|
|
931
|
+
if (this.runPhase() !== 'idle') {
|
|
932
|
+
return;
|
|
933
|
+
}
|
|
893
934
|
this.requestClose()(null);
|
|
894
935
|
}
|
|
936
|
+
abortActiveRun() {
|
|
937
|
+
this.runAbortController?.abort();
|
|
938
|
+
}
|
|
939
|
+
onStop() {
|
|
940
|
+
if (this.runPhase() !== 'running') {
|
|
941
|
+
return;
|
|
942
|
+
}
|
|
943
|
+
this.runPhase.set('stopping');
|
|
944
|
+
this.runAbortController?.abort();
|
|
945
|
+
}
|
|
895
946
|
onMenuCancel(panel) {
|
|
896
947
|
panel.close();
|
|
897
|
-
if (this.
|
|
948
|
+
if (this.runPhase() !== 'idle') {
|
|
898
949
|
return;
|
|
899
950
|
}
|
|
900
951
|
this.onCancel();
|
|
901
952
|
}
|
|
902
953
|
/**
|
|
903
|
-
*
|
|
954
|
+
* Idle: close. Running: Stop (stay open). Stopping: ignore.
|
|
904
955
|
*/
|
|
905
956
|
onDocumentEscape() {
|
|
906
|
-
if (!isPlatformBrowser(this.platformId)
|
|
957
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
958
|
+
return;
|
|
959
|
+
}
|
|
960
|
+
if (this.runPhase() === 'stopping') {
|
|
961
|
+
return;
|
|
962
|
+
}
|
|
963
|
+
if (this.runPhase() === 'running') {
|
|
964
|
+
this.onStop();
|
|
907
965
|
return;
|
|
908
966
|
}
|
|
909
967
|
this.onCancel();
|
|
@@ -918,6 +976,10 @@ class AXMAiAssistPromptBoxComponent {
|
|
|
918
976
|
void this.pickComposerDocuments();
|
|
919
977
|
}
|
|
920
978
|
async onSend() {
|
|
979
|
+
if (this.runPhase() === 'running') {
|
|
980
|
+
this.onStop();
|
|
981
|
+
return;
|
|
982
|
+
}
|
|
921
983
|
if (!this.canSend()) {
|
|
922
984
|
return;
|
|
923
985
|
}
|
|
@@ -979,19 +1041,27 @@ class AXMAiAssistPromptBoxComponent {
|
|
|
979
1041
|
assistId,
|
|
980
1042
|
userMediaAttachments,
|
|
981
1043
|
};
|
|
982
|
-
|
|
1044
|
+
const controller = new AbortController();
|
|
1045
|
+
this.runAbortController = controller;
|
|
1046
|
+
this.runPhase.set('running');
|
|
983
1047
|
try {
|
|
984
|
-
const result = await this.runPrompt()(payload);
|
|
1048
|
+
const result = await this.runPrompt()(payload, { abortSignal: controller.signal });
|
|
985
1049
|
this.requestClose()(result);
|
|
986
1050
|
}
|
|
987
1051
|
catch (err) {
|
|
1052
|
+
if (isAiAssistAbortError(err, controller.signal)) {
|
|
1053
|
+
return;
|
|
1054
|
+
}
|
|
988
1055
|
const errTitle = await this.translation.translateAsync('@general:messages.error.title');
|
|
989
1056
|
const fallback = await this.translation.translateAsync('@ai-management:assist-popup.run-error');
|
|
990
1057
|
const content = err instanceof Error ? err.message : fallback;
|
|
991
1058
|
await this.toastService.show({ color: 'danger', title: errTitle, content });
|
|
992
1059
|
}
|
|
993
1060
|
finally {
|
|
994
|
-
this.
|
|
1061
|
+
if (this.runAbortController === controller) {
|
|
1062
|
+
this.runAbortController = null;
|
|
1063
|
+
}
|
|
1064
|
+
this.runPhase.set('idle');
|
|
995
1065
|
}
|
|
996
1066
|
}
|
|
997
1067
|
removeDraftImage(clientId) {
|
|
@@ -1331,7 +1401,7 @@ class AXMAiAssistPromptBoxComponent {
|
|
|
1331
1401
|
await this.toastService.show({ color: 'warning', title: errTitle, content });
|
|
1332
1402
|
}
|
|
1333
1403
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAiAssistPromptBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1334
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMAiAssistPromptBoxComponent, isStandalone: true, selector: "axm-ai-assist-prompt-box", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, initialPrompt: { classPropertyName: "initialPrompt", publicName: "initialPrompt", isSignal: true, isRequired: false, transformFunction: null }, contentMaxWidthPx: { classPropertyName: "contentMaxWidthPx", publicName: "contentMaxWidthPx", isSignal: true, isRequired: false, transformFunction: null }, initialAssistId: { classPropertyName: "initialAssistId", publicName: "initialAssistId", isSignal: true, isRequired: false, transformFunction: null }, runPrompt: { classPropertyName: "runPrompt", publicName: "runPrompt", isSignal: true, isRequired: true, transformFunction: null }, requestClose: { classPropertyName: "requestClose", publicName: "requestClose", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "document:keydown.escape": "onDocumentEscape()" } }, ngImport: i0, template: "<div\n class=\"axm-ai-assist-prompt-box flex flex-col gap-2.5 min-h-0 w-full\"\n [style.max-width.px]=\"contentMaxWidthPx()\"\n>\n <div\n class=\"axm-ai-assist-prompt-box__eyebrow flex items-center justify-between gap-3 shrink-0 px-0.5\"\n >\n <div\n class=\"axm-ai-assist-prompt-box__brand inline-flex min-w-0 items-center gap-2\"\n >\n <span class=\"axm-ai-assist-prompt-box__brand-mark\" aria-hidden=\"true\">\n <i class=\"fa-light fa-sparkles\" aria-hidden=\"true\"></i>\n </span>\n <span class=\"axm-ai-assist-prompt-box__brand-title truncate\">{{\n title()\n }}</span>\n </div>\n <ax-button\n class=\"shrink-0 ax-sm\"\n look=\"blank\"\n color=\"default\"\n type=\"button\"\n [iconOnly]=\"true\"\n [disabled]=\"busy()\"\n [attr.aria-label]=\"\n ('@general:actions.close.title' | translate | async) ?? ''\n \"\n (onClick)=\"onCancel()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-xmark\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n </div>\n\n <div class=\"axm-ai-assist-prompt-box__sheet flex min-h-0 flex-col gap-2\">\n @if (\n draftComposerImages().length > 0 ||\n draftComposerAudios().length > 0 ||\n draftComposerFiles().length > 0 ||\n isComposerSaving()\n ) {\n <div\n class=\"shrink-0 rounded-xl border border-default/45 dark:border-darker bg-lightest/90 p-1.5 flex flex-col gap-1.5\"\n [attr.aria-label]=\"\n ('@ai-management:chat.composer-attachments-region'\n | translate\n | async) ?? ''\n \"\n >\n <div\n class=\"flex flex-wrap items-center justify-between gap-1.5 text-[0.65rem] text-muted\"\n >\n <span>\n @if (isComposerSaving()) {\n {{ '@ai-management:chat.composer-uploading' | translate | async }}\n } @else {\n @if (draftComposerImages().length > 0) {\n <span\n >{{ draftComposerImages().length }}\n {{\n '@ai-management:chat.composer-images-count'\n | translate\n | async\n }}</span\n >\n }\n @if (\n draftComposerImages().length > 0 &&\n draftComposerAudios().length > 0\n ) {\n <span class=\"mx-1\">\u00B7</span>\n }\n @if (draftComposerAudios().length > 0) {\n <span\n >{{ draftComposerAudios().length }}\n {{\n '@ai-management:chat.composer-audio-count'\n | translate\n | async\n }}</span\n >\n }\n @if (draftComposerFiles().length > 0) {\n @if (\n draftComposerImages().length > 0 ||\n draftComposerAudios().length > 0\n ) {\n <span class=\"mx-1\">\u00B7</span>\n }\n <span\n >{{ draftComposerFiles().length }}\n {{\n '@ai-management:chat.composer-documents-count'\n | translate\n | async\n }}</span\n >\n }\n }\n </span>\n </div>\n @if (draftComposerImages().length > 0) {\n <div class=\"flex flex-wrap gap-1.5\">\n @for (slot of draftComposerImages(); track slot.clientId) {\n <div\n class=\"relative h-12 w-12 shrink-0 overflow-hidden rounded-md border border-default/60 dark:border-darker bg-lightest\"\n >\n <img\n [src]=\"slot.previewUrl\"\n [alt]=\"slot.name ?? ''\"\n class=\"h-full w-full object-cover\"\n />\n @if (!slot.fileId) {\n <span\n class=\"absolute inset-0 flex items-center justify-center bg-default/40 text-[0.6rem] font-medium text-on-lightest\"\n >\u2026</span\n >\n }\n <button\n type=\"button\"\n class=\"absolute end-0.5 top-0.5 flex h-4 w-4 items-center justify-center rounded bg-default/80 text-[0.65rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\n [disabled]=\"busy() || isComposerSaving()\"\n [attr.aria-label]=\"\n ('@ai-management:chat.remove-draft-image'\n | translate\n | async) ?? ''\n \"\n (click)=\"removeDraftImage(slot.clientId)\"\n >\n \u00D7\n </button>\n </div>\n }\n </div>\n }\n @if (draftComposerAudios().length > 0) {\n <div class=\"flex flex-col gap-1\">\n @for (slot of draftComposerAudios(); track slot.clientId) {\n <div\n class=\"flex items-center justify-between gap-1.5 rounded border border-default/60 dark:border-darker bg-lightest px-1.5 py-1 text-[0.65rem] min-w-0\"\n >\n <span\n class=\"truncate text-on-lightest\"\n [attr.title]=\"slot.name ?? ''\"\n >\n {{\n '@ai-management:chat.attached-audio-label'\n | translate\n | async\n }}:\n {{\n slot.name?.trim() ||\n ('@ai-management:chat.audio-untitled' | translate | async)\n }}\n </span>\n @if (!slot.fileId) {\n <span class=\"text-muted shrink-0\">\u2026</span>\n }\n <button\n type=\"button\"\n class=\"shrink-0 flex h-5 w-5 items-center justify-center rounded bg-default/80 text-[0.75rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\n [disabled]=\"busy() || isComposerSaving()\"\n [attr.aria-label]=\"\n ('@ai-management:chat.remove-draft-audio'\n | translate\n | async) ?? ''\n \"\n (click)=\"removeDraftAudio(slot.clientId)\"\n >\n \u00D7\n </button>\n </div>\n }\n </div>\n }\n @if (draftComposerFiles().length > 0) {\n <div class=\"flex flex-col gap-1\">\n @for (slot of draftComposerFiles(); track slot.clientId) {\n <div\n class=\"flex items-center justify-between gap-1.5 rounded border border-default/60 dark:border-darker bg-lightest px-1.5 py-1 text-[0.65rem] min-w-0\"\n >\n <span\n class=\"truncate text-on-lightest\"\n [attr.title]=\"slot.name ?? ''\"\n >\n {{\n '@ai-management:chat.attached-document-label'\n | translate\n | async\n }}:\n {{\n slot.name?.trim() ||\n ('@ai-management:chat.document-untitled'\n | translate\n | async)\n }}\n </span>\n @if (!slot.fileId) {\n <span class=\"text-muted shrink-0\">\u2026</span>\n }\n <button\n type=\"button\"\n class=\"shrink-0 flex h-5 w-5 items-center justify-center rounded bg-default/80 text-[0.75rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\n [disabled]=\"busy() || isComposerSaving()\"\n [attr.aria-label]=\"\n ('@ai-management:chat.remove-draft-document'\n | translate\n | async) ?? ''\n \"\n (click)=\"removeDraftFile(slot.clientId)\"\n >\n \u00D7\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"axm-ai-assist-prompt-box__body flex min-h-0 flex-col\">\n <ax-text-area\n class=\"axm-ai-assist-prompt-box__prompt-input w-full min-h-0\"\n [rows]=\"3\"\n [disabled]=\"busy()\"\n [ngModel]=\"promptDraft()\"\n (ngModelChange)=\"onPromptDraftChange($event)\"\n (keydown)=\"onPromptKeydown($event)\"\n [placeholder]=\"\n placeholder().trim().length > 0\n ? placeholder()\n : (('@ai-management:assist-popup.placeholder'\n | translate\n | async) ?? '')\n \"\n ></ax-text-area>\n </div>\n\n <div\n class=\"axm-ai-assist-prompt-box__footer flex shrink-0 items-center justify-between gap-2\"\n >\n <ax-button\n class=\"axm-ai-assist-prompt-box__menu-trigger\"\n look=\"solid\"\n color=\"primary\"\n type=\"button\"\n [iconOnly]=\"true\"\n [disabled]=\"busy()\"\n [attr.aria-label]=\"\n ('@ai-management:assist-popup.composer-menu-aria'\n | translate\n | async) ?? ''\n \"\n >\n <ax-prefix>\n <i class=\"fa-light fa-plus text-sm\" aria-hidden=\"true\"></i>\n </ax-prefix>\n <ax-dropdown-panel #composerMenu>\n <ax-button-item-list class=\"min-w-56\">\n <ax-button-item\n [text]=\"\n ('@ai-management:chat.upload-images' | translate | async) ?? ''\n \"\n [attr.aria-label]=\"\n ('@ai-management:chat.upload-images-aria'\n | translate\n | async) ?? ''\n \"\n (onClick)=\"openImagePicker(); composerMenu.close()\"\n >\n <ax-prefix>\n <i\n class=\"fa-light fa-image size-4 text-center\"\n aria-hidden=\"true\"\n ></i>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n [text]=\"\n ('@ai-management:chat.upload-audio' | translate | async) ?? ''\n \"\n [attr.aria-label]=\"\n ('@ai-management:chat.upload-audio-aria' | translate | async) ??\n ''\n \"\n (onClick)=\"openAudioPicker(); composerMenu.close()\"\n >\n <ax-prefix>\n <i\n class=\"fa-light fa-microphone size-4 text-center\"\n aria-hidden=\"true\"\n ></i>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n [text]=\"\n ('@ai-management:chat.upload-documents' | translate | async) ??\n ''\n \"\n [attr.aria-label]=\"\n ('@ai-management:chat.upload-documents-aria'\n | translate\n | async) ?? ''\n \"\n (onClick)=\"openDocumentPicker(); composerMenu.close()\"\n >\n <ax-prefix>\n <i\n class=\"fa-light fa-paperclip size-4 text-center\"\n aria-hidden=\"true\"\n ></i>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n\n <ax-button\n class=\"axm-ai-assist-prompt-box__send axm-ai-assist-prompt-box__send-gradient\"\n color=\"primary\"\n type=\"button\"\n [disabled]=\"busy() || !canSend()\"\n [text]=\"\n busy()\n ? (('@ai-management:assist-popup.generating' | translate | async) ??\n '')\n : (('@ai-management:assist-popup.generate' | translate | async) ??\n '')\n \"\n (onClick)=\"onSend()\"\n ></ax-button>\n </div>\n </div>\n</div>\n", styles: ["@layer properties;.axm-ai-assist-prompt-box-shell{pointer-events:none;box-sizing:border-box;inset:0;display:flex;max-height:100%;width:100%;flex-direction:column;align-items:center;justify-content:flex-end;padding-left:max(.75rem,env(safe-area-inset-left,0px));padding-right:max(.75rem,env(safe-area-inset-right,0px));padding-bottom:max(.75rem,env(safe-area-inset-bottom,0px));padding-top:max(.5rem,env(safe-area-inset-top,0px))}.axm-ai-assist-prompt-box-shell .overlay-pane{pointer-events:auto;--tw-border-style: none;border-style:none;background-color:transparent;flex:0 0 auto;width:auto!important;max-width:calc(100vw - 1.5rem);min-width:min(480px,100vw - 1.5rem)}.axm-ai-assist-prompt-box{--axm-axm-ai-assist-prompt-chrome-gradient: linear-gradient( 125deg, rgb(var(--ax-sys-color-primary-200)) 0%, rgb(var(--ax-sys-color-primary-400)) 48%, rgb(var(--ax-sys-color-primary-300)) 100% );--axm-axm-ai-assist-prompt-send-gradient: linear-gradient( 90deg, rgb(var(--ax-sys-color-primary-500)), rgb(var(--ax-sys-color-primary-700)) );margin:0;box-sizing:border-box;overflow:hidden;padding:0;max-height:min(78vh,620px);padding:.65rem .7rem .7rem;border-radius:1.35rem;background:var(--axm-axm-ai-assist-prompt-chrome-gradient);box-shadow:0 18px 50px -12px rgba(var(--ax-sys-color-on-surface),.12),0 8px 20px -8px rgba(var(--ax-sys-color-primary-400),.2)}.dark .axm-ai-assist-prompt-box{--axm-axm-ai-assist-prompt-chrome-gradient: linear-gradient( 125deg, rgb(var(--ax-sys-color-primary-600)) 0%, rgb(var(--ax-sys-color-primary-500)) 48%, rgb(var(--ax-sys-color-primary-400)) 100% );box-shadow:0 20px 55px -14px rgba(var(--ax-sys-color-dark),.48),0 8px 24px -8px rgba(var(--ax-sys-color-primary-400),.26)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-title{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);font-size:.72rem;line-height:1.25;letter-spacing:.01em;color:rgb(var(--ax-sys-color-on-surface))}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-title){color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-mark{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);width:1.65rem;height:1.65rem;font-size:.75rem;line-height:1;color:rgb(var(--ax-sys-color-on-primary-surface));background:linear-gradient(145deg,rgb(var(--ax-sys-color-primary-500)),rgb(var(--ax-sys-color-primary-700)));box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.35)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__sheet{min-height:0px;flex:auto;padding:.65rem .65rem .55rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgba(var(--ax-sys-color-neutral-300),.35);box-shadow:inset 0 1px rgba(var(--ax-sys-color-lightest-surface),.95)}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__sheet){background:rgb(var(--ax-sys-color-neutral-800));border-color:rgba(var(--ax-sys-color-neutral-500),.4);box-shadow:inset 0 1px rgba(var(--ax-sys-color-lightest-surface),.06)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__body{min-height:0px;flex:auto;overflow-y:auto}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input{display:block;min-height:0px;width:100%;--tw-border-style: none !important;border-style:none!important;background-color:transparent!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input:focus-within{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input:focus-within>*{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea{min-height:4.5rem;max-height:min(30vh,240px);font-size:.8125rem;line-height:1.45;padding-block:.55rem;padding-inline:.65rem;border-radius:.65rem;--tw-border-style: none !important;border-style:none!important;background-color:transparent!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:focus,.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:focus-visible,.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:active{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important;outline-offset:0!important}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea){color:rgb(var(--ax-sys-color-on-lightest-surface));background:rgb(var(--ax-sys-color-neutral-900))!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__footer{min-height:0}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger{--ax-comp-button-normal-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-hover-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-pressed-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-border-width: 0 !important;overflow:hidden;border-radius:calc(infinity * 1px)!important;border-color:transparent!important;background-color:transparent!important;background:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:hover:not(.state-disabled,.state-loading,.state-selected),.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:active:not(.state-disabled,.state-loading,.state-selected){border-color:transparent!important;background-color:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger>button{border-radius:calc(infinity * 1px)!important;--tw-border-style: none !important;border-style:none!important;padding:0!important;width:2.25rem;height:2.25rem;min-width:2.25rem;min-height:2.25rem;color:rgb(var(--ax-sys-color-on-primary-surface))!important;background:linear-gradient(145deg,rgb(var(--ax-sys-color-primary-500)),rgb(var(--ax-sys-color-primary-700)))!important;box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.35)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger.ax-state-disabled>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger.ax-state-loading>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger>button:disabled{opacity:.55;box-shadow:none}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:hover:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.94)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:active:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.88)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient{--ax-comp-button-normal-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-hover-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-pressed-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-border-width: 0 !important;overflow:hidden;border-radius:calc(infinity * 1px)!important;border-color:transparent!important;background-color:transparent!important;background:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:hover:not(.state-disabled,.state-loading,.state-selected),.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:active:not(.state-disabled,.state-loading,.state-selected){border-color:transparent!important;background-color:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient>button{border-radius:calc(infinity * 1px)!important;--tw-border-style: none !important;border-style:none!important;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);min-height:2.25rem;padding-inline:1rem!important;font-size:.8rem;letter-spacing:.01em;color:rgb(var(--ax-sys-color-on-primary-surface))!important;background:var(--axm-axm-ai-assist-prompt-send-gradient)!important;box-shadow:0 3px 12px rgba(var(--ax-sys-color-secondary-400),.35)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient.ax-state-disabled>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient.ax-state-loading>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient>button:disabled{opacity:.55;box-shadow:none}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:hover:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.96)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:active:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.9)}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i4.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXTextAreaModule }, { kind: "component", type: i5.AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
1404
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMAiAssistPromptBoxComponent, isStandalone: true, selector: "axm-ai-assist-prompt-box", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, initialPrompt: { classPropertyName: "initialPrompt", publicName: "initialPrompt", isSignal: true, isRequired: false, transformFunction: null }, contentMaxWidthPx: { classPropertyName: "contentMaxWidthPx", publicName: "contentMaxWidthPx", isSignal: true, isRequired: false, transformFunction: null }, initialAssistId: { classPropertyName: "initialAssistId", publicName: "initialAssistId", isSignal: true, isRequired: false, transformFunction: null }, runPrompt: { classPropertyName: "runPrompt", publicName: "runPrompt", isSignal: true, isRequired: true, transformFunction: null }, requestClose: { classPropertyName: "requestClose", publicName: "requestClose", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "document:keydown.escape": "onDocumentEscape()" } }, ngImport: i0, template: "<div\r\n class=\"axm-ai-assist-prompt-box flex flex-col gap-2.5 min-h-0 w-full\"\r\n [style.max-width.px]=\"contentMaxWidthPx()\"\r\n>\r\n <div\r\n class=\"axm-ai-assist-prompt-box__eyebrow flex items-center justify-between gap-3 shrink-0 px-0.5\"\r\n >\r\n <div\r\n class=\"axm-ai-assist-prompt-box__brand inline-flex min-w-0 items-center gap-2\"\r\n >\r\n <span class=\"axm-ai-assist-prompt-box__brand-mark\" aria-hidden=\"true\">\r\n <i class=\"fa-light fa-sparkles\" aria-hidden=\"true\"></i>\r\n </span>\r\n <span class=\"axm-ai-assist-prompt-box__brand-title truncate\">{{\r\n title()\r\n }}</span>\r\n </div>\r\n <ax-button\r\n class=\"shrink-0 ax-sm\"\r\n look=\"blank\"\r\n color=\"default\"\r\n type=\"button\"\r\n [iconOnly]=\"true\"\r\n [disabled]=\"busy()\"\r\n [attr.aria-label]=\"\r\n ('@general:actions.close.title' | translate | async) ?? ''\r\n \"\r\n (onClick)=\"onCancel()\"\r\n >\r\n <ax-prefix>\r\n <i class=\"fa-light fa-xmark\" aria-hidden=\"true\"></i>\r\n </ax-prefix>\r\n </ax-button>\r\n </div>\r\n\r\n <div class=\"axm-ai-assist-prompt-box__sheet flex min-h-0 flex-col gap-2\">\r\n @if (\r\n draftComposerImages().length > 0 ||\r\n draftComposerAudios().length > 0 ||\r\n draftComposerFiles().length > 0 ||\r\n isComposerSaving()\r\n ) {\r\n <div\r\n class=\"shrink-0 rounded-xl border border-default/45 dark:border-darker bg-lightest/90 p-1.5 flex flex-col gap-1.5\"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.composer-attachments-region'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n >\r\n <div\r\n class=\"flex flex-wrap items-center justify-between gap-1.5 text-[0.65rem] text-muted\"\r\n >\r\n <span>\r\n @if (isComposerSaving()) {\r\n {{ '@ai-management:chat.composer-uploading' | translate | async }}\r\n } @else {\r\n @if (draftComposerImages().length > 0) {\r\n <span\r\n >{{ draftComposerImages().length }}\r\n {{\r\n '@ai-management:chat.composer-images-count'\r\n | translate\r\n | async\r\n }}</span\r\n >\r\n }\r\n @if (\r\n draftComposerImages().length > 0 &&\r\n draftComposerAudios().length > 0\r\n ) {\r\n <span class=\"mx-1\">\u00B7</span>\r\n }\r\n @if (draftComposerAudios().length > 0) {\r\n <span\r\n >{{ draftComposerAudios().length }}\r\n {{\r\n '@ai-management:chat.composer-audio-count'\r\n | translate\r\n | async\r\n }}</span\r\n >\r\n }\r\n @if (draftComposerFiles().length > 0) {\r\n @if (\r\n draftComposerImages().length > 0 ||\r\n draftComposerAudios().length > 0\r\n ) {\r\n <span class=\"mx-1\">\u00B7</span>\r\n }\r\n <span\r\n >{{ draftComposerFiles().length }}\r\n {{\r\n '@ai-management:chat.composer-documents-count'\r\n | translate\r\n | async\r\n }}</span\r\n >\r\n }\r\n }\r\n </span>\r\n </div>\r\n @if (draftComposerImages().length > 0) {\r\n <div class=\"flex flex-wrap gap-1.5\">\r\n @for (slot of draftComposerImages(); track slot.clientId) {\r\n <div\r\n class=\"relative h-12 w-12 shrink-0 overflow-hidden rounded-md border border-default/60 dark:border-darker bg-lightest\"\r\n >\r\n <img\r\n [src]=\"slot.previewUrl\"\r\n [alt]=\"slot.name ?? ''\"\r\n class=\"h-full w-full object-cover\"\r\n />\r\n @if (!slot.fileId) {\r\n <span\r\n class=\"absolute inset-0 flex items-center justify-center bg-default/40 text-[0.6rem] font-medium text-on-lightest\"\r\n >\u2026</span\r\n >\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"absolute end-0.5 top-0.5 flex h-4 w-4 items-center justify-center rounded bg-default/80 text-[0.65rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\r\n [disabled]=\"busy() || isComposerSaving()\"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.remove-draft-image'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n (click)=\"removeDraftImage(slot.clientId)\"\r\n >\r\n \u00D7\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (draftComposerAudios().length > 0) {\r\n <div class=\"flex flex-col gap-1\">\r\n @for (slot of draftComposerAudios(); track slot.clientId) {\r\n <div\r\n class=\"flex items-center justify-between gap-1.5 rounded border border-default/60 dark:border-darker bg-lightest px-1.5 py-1 text-[0.65rem] min-w-0\"\r\n >\r\n <span\r\n class=\"truncate text-on-lightest\"\r\n [attr.title]=\"slot.name ?? ''\"\r\n >\r\n {{\r\n '@ai-management:chat.attached-audio-label'\r\n | translate\r\n | async\r\n }}:\r\n {{\r\n slot.name?.trim() ||\r\n ('@ai-management:chat.audio-untitled' | translate | async)\r\n }}\r\n </span>\r\n @if (!slot.fileId) {\r\n <span class=\"text-muted shrink-0\">\u2026</span>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"shrink-0 flex h-5 w-5 items-center justify-center rounded bg-default/80 text-[0.75rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\r\n [disabled]=\"busy() || isComposerSaving()\"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.remove-draft-audio'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n (click)=\"removeDraftAudio(slot.clientId)\"\r\n >\r\n \u00D7\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (draftComposerFiles().length > 0) {\r\n <div class=\"flex flex-col gap-1\">\r\n @for (slot of draftComposerFiles(); track slot.clientId) {\r\n <div\r\n class=\"flex items-center justify-between gap-1.5 rounded border border-default/60 dark:border-darker bg-lightest px-1.5 py-1 text-[0.65rem] min-w-0\"\r\n >\r\n <span\r\n class=\"truncate text-on-lightest\"\r\n [attr.title]=\"slot.name ?? ''\"\r\n >\r\n {{\r\n '@ai-management:chat.attached-document-label'\r\n | translate\r\n | async\r\n }}:\r\n {{\r\n slot.name?.trim() ||\r\n ('@ai-management:chat.document-untitled'\r\n | translate\r\n | async)\r\n }}\r\n </span>\r\n @if (!slot.fileId) {\r\n <span class=\"text-muted shrink-0\">\u2026</span>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"shrink-0 flex h-5 w-5 items-center justify-center rounded bg-default/80 text-[0.75rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\r\n [disabled]=\"busy() || isComposerSaving()\"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.remove-draft-document'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n (click)=\"removeDraftFile(slot.clientId)\"\r\n >\r\n \u00D7\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"axm-ai-assist-prompt-box__body flex min-h-0 flex-col\">\r\n <ax-text-area\r\n class=\"axm-ai-assist-prompt-box__prompt-input w-full min-h-0\"\r\n [rows]=\"3\"\r\n [disabled]=\"busy()\"\r\n [ngModel]=\"promptDraft()\"\r\n (ngModelChange)=\"onPromptDraftChange($event)\"\r\n (keydown)=\"onPromptKeydown($event)\"\r\n [placeholder]=\"\r\n placeholder().trim().length > 0\r\n ? placeholder()\r\n : (('@ai-management:assist-popup.placeholder'\r\n | translate\r\n | async) ?? '')\r\n \"\r\n ></ax-text-area>\r\n </div>\r\n\r\n <div\r\n class=\"axm-ai-assist-prompt-box__footer flex shrink-0 items-center justify-between gap-2\"\r\n >\r\n <ax-button\r\n class=\"axm-ai-assist-prompt-box__menu-trigger\"\r\n look=\"solid\"\r\n color=\"primary\"\r\n type=\"button\"\r\n [iconOnly]=\"true\"\r\n [disabled]=\"busy()\"\r\n [attr.aria-label]=\"\r\n ('@ai-management:assist-popup.composer-menu-aria'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n >\r\n <ax-prefix>\r\n <i class=\"fa-light fa-plus text-sm\" aria-hidden=\"true\"></i>\r\n </ax-prefix>\r\n <ax-dropdown-panel #composerMenu>\r\n <ax-button-item-list class=\"min-w-56\">\r\n <ax-button-item\r\n [text]=\"\r\n ('@ai-management:chat.upload-images' | translate | async) ?? ''\r\n \"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.upload-images-aria'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n (onClick)=\"openImagePicker(); composerMenu.close()\"\r\n >\r\n <ax-prefix>\r\n <i\r\n class=\"fa-light fa-image size-4 text-center\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n </ax-prefix>\r\n </ax-button-item>\r\n <ax-button-item\r\n [text]=\"\r\n ('@ai-management:chat.upload-audio' | translate | async) ?? ''\r\n \"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.upload-audio-aria' | translate | async) ??\r\n ''\r\n \"\r\n (onClick)=\"openAudioPicker(); composerMenu.close()\"\r\n >\r\n <ax-prefix>\r\n <i\r\n class=\"fa-light fa-microphone size-4 text-center\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n </ax-prefix>\r\n </ax-button-item>\r\n <ax-button-item\r\n [text]=\"\r\n ('@ai-management:chat.upload-documents' | translate | async) ??\r\n ''\r\n \"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.upload-documents-aria'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n (onClick)=\"openDocumentPicker(); composerMenu.close()\"\r\n >\r\n <ax-prefix>\r\n <i\r\n class=\"fa-light fa-paperclip size-4 text-center\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n </ax-prefix>\r\n </ax-button-item>\r\n </ax-button-item-list>\r\n </ax-dropdown-panel>\r\n </ax-button>\r\n\r\n <ax-button\r\n class=\"axm-ai-assist-prompt-box__send axm-ai-assist-prompt-box__send-gradient\"\r\n color=\"primary\"\r\n type=\"button\"\r\n [disabled]=\"runPhase() === 'stopping' || (runPhase() === 'idle' && !canSend())\"\r\n [text]=\"\r\n runPhase() === 'stopping'\r\n ? (('@ai-management:assist-popup.stopping' | translate | async) ??\r\n '')\r\n : runPhase() === 'running'\r\n ? (('@ai-management:assist-popup.stop' | translate | async) ?? '')\r\n : (('@ai-management:assist-popup.generate' | translate | async) ??\r\n '')\r\n \"\r\n (onClick)=\"onSend()\"\r\n ></ax-button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["@layer properties;.axm-ai-assist-prompt-box-shell{pointer-events:none;box-sizing:border-box;inset:0;display:flex;max-height:100%;width:100%;flex-direction:column;align-items:center;justify-content:flex-end;padding-left:max(.75rem,env(safe-area-inset-left,0px));padding-right:max(.75rem,env(safe-area-inset-right,0px));padding-bottom:max(.75rem,env(safe-area-inset-bottom,0px));padding-top:max(.5rem,env(safe-area-inset-top,0px))}.axm-ai-assist-prompt-box-shell .overlay-pane{pointer-events:auto;--tw-border-style: none;border-style:none;background-color:transparent;flex:0 0 auto;width:auto!important;max-width:calc(100vw - 1.5rem);min-width:min(480px,100vw - 1.5rem)}.axm-ai-assist-prompt-box{--axm-axm-ai-assist-prompt-chrome-gradient: linear-gradient( 125deg, rgb(var(--ax-sys-color-primary-200)) 0%, rgb(var(--ax-sys-color-primary-400)) 48%, rgb(var(--ax-sys-color-primary-300)) 100% );--axm-axm-ai-assist-prompt-send-gradient: linear-gradient( 90deg, rgb(var(--ax-sys-color-primary-500)), rgb(var(--ax-sys-color-primary-700)) );margin:0;box-sizing:border-box;overflow:hidden;padding:0;max-height:min(78vh,620px);padding:.65rem .7rem .7rem;border-radius:1.35rem;background:var(--axm-axm-ai-assist-prompt-chrome-gradient);box-shadow:0 18px 50px -12px rgba(var(--ax-sys-color-on-surface),.12),0 8px 20px -8px rgba(var(--ax-sys-color-primary-400),.2)}.dark .axm-ai-assist-prompt-box{--axm-axm-ai-assist-prompt-chrome-gradient: linear-gradient( 125deg, rgb(var(--ax-sys-color-primary-600)) 0%, rgb(var(--ax-sys-color-primary-500)) 48%, rgb(var(--ax-sys-color-primary-400)) 100% );box-shadow:0 20px 55px -14px rgba(var(--ax-sys-color-dark),.48),0 8px 24px -8px rgba(var(--ax-sys-color-primary-400),.26)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-title{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);font-size:.72rem;line-height:1.25;letter-spacing:.01em;color:rgb(var(--ax-sys-color-on-surface))}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-title){color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-mark{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);width:1.65rem;height:1.65rem;font-size:.75rem;line-height:1;color:rgb(var(--ax-sys-color-on-primary-surface));background:linear-gradient(145deg,rgb(var(--ax-sys-color-primary-500)),rgb(var(--ax-sys-color-primary-700)));box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.35)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__sheet{min-height:0px;flex:auto;padding:.65rem .65rem .55rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgba(var(--ax-sys-color-neutral-300),.35);box-shadow:inset 0 1px rgba(var(--ax-sys-color-lightest-surface),.95)}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__sheet){background:rgb(var(--ax-sys-color-neutral-800));border-color:rgba(var(--ax-sys-color-neutral-500),.4);box-shadow:inset 0 1px rgba(var(--ax-sys-color-lightest-surface),.06)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__body{min-height:0px;flex:auto;overflow-y:auto}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input{display:block;min-height:0px;width:100%;--tw-border-style: none !important;border-style:none!important;background-color:transparent!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input:focus-within{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input:focus-within>*{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea{min-height:4.5rem;max-height:min(30vh,240px);font-size:.8125rem;line-height:1.45;padding-block:.55rem;padding-inline:.65rem;border-radius:.65rem;--tw-border-style: none !important;border-style:none!important;background-color:transparent!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:focus,.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:focus-visible,.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:active{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important;outline-offset:0!important}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea){color:rgb(var(--ax-sys-color-on-lightest-surface));background:rgb(var(--ax-sys-color-neutral-900))!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__footer{min-height:0}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger{--ax-comp-button-normal-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-hover-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-pressed-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-border-width: 0 !important;overflow:hidden;border-radius:calc(infinity * 1px)!important;border-color:transparent!important;background-color:transparent!important;background:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:hover:not(.state-disabled,.state-loading,.state-selected),.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:active:not(.state-disabled,.state-loading,.state-selected){border-color:transparent!important;background-color:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger>button{border-radius:calc(infinity * 1px)!important;--tw-border-style: none !important;border-style:none!important;padding:0!important;width:2.25rem;height:2.25rem;min-width:2.25rem;min-height:2.25rem;color:rgb(var(--ax-sys-color-on-primary-surface))!important;background:linear-gradient(145deg,rgb(var(--ax-sys-color-primary-500)),rgb(var(--ax-sys-color-primary-700)))!important;box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.35)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger.ax-state-disabled>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger.ax-state-loading>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger>button:disabled{opacity:.55;box-shadow:none}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:hover:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.94)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:active:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.88)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient{--ax-comp-button-normal-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-hover-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-pressed-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-border-width: 0 !important;overflow:hidden;border-radius:calc(infinity * 1px)!important;border-color:transparent!important;background-color:transparent!important;background:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:hover:not(.state-disabled,.state-loading,.state-selected),.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:active:not(.state-disabled,.state-loading,.state-selected){border-color:transparent!important;background-color:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient>button{border-radius:calc(infinity * 1px)!important;--tw-border-style: none !important;border-style:none!important;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);min-height:2.25rem;padding-inline:1rem!important;font-size:.8rem;letter-spacing:.01em;color:rgb(var(--ax-sys-color-on-primary-surface))!important;background:var(--axm-axm-ai-assist-prompt-send-gradient)!important;box-shadow:0 3px 12px rgba(var(--ax-sys-color-secondary-400),.35)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient.ax-state-disabled>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient.ax-state-loading>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient>button:disabled{opacity:.55;box-shadow:none}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:hover:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.96)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:active:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.9)}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i4.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXTextAreaModule }, { kind: "component", type: i5.AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
1335
1405
|
}
|
|
1336
1406
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAiAssistPromptBoxComponent, decorators: [{
|
|
1337
1407
|
type: Component,
|
|
@@ -1346,7 +1416,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
1346
1416
|
AXDropdownButtonModule,
|
|
1347
1417
|
AXTextAreaModule,
|
|
1348
1418
|
AXTranslationModule,
|
|
1349
|
-
], template: "<div\n class=\"axm-ai-assist-prompt-box flex flex-col gap-2.5 min-h-0 w-full\"\n [style.max-width.px]=\"contentMaxWidthPx()\"\n>\n <div\n class=\"axm-ai-assist-prompt-box__eyebrow flex items-center justify-between gap-3 shrink-0 px-0.5\"\n >\n <div\n class=\"axm-ai-assist-prompt-box__brand inline-flex min-w-0 items-center gap-2\"\n >\n <span class=\"axm-ai-assist-prompt-box__brand-mark\" aria-hidden=\"true\">\n <i class=\"fa-light fa-sparkles\" aria-hidden=\"true\"></i>\n </span>\n <span class=\"axm-ai-assist-prompt-box__brand-title truncate\">{{\n title()\n }}</span>\n </div>\n <ax-button\n class=\"shrink-0 ax-sm\"\n look=\"blank\"\n color=\"default\"\n type=\"button\"\n [iconOnly]=\"true\"\n [disabled]=\"busy()\"\n [attr.aria-label]=\"\n ('@general:actions.close.title' | translate | async) ?? ''\n \"\n (onClick)=\"onCancel()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-xmark\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n </div>\n\n <div class=\"axm-ai-assist-prompt-box__sheet flex min-h-0 flex-col gap-2\">\n @if (\n draftComposerImages().length > 0 ||\n draftComposerAudios().length > 0 ||\n draftComposerFiles().length > 0 ||\n isComposerSaving()\n ) {\n <div\n class=\"shrink-0 rounded-xl border border-default/45 dark:border-darker bg-lightest/90 p-1.5 flex flex-col gap-1.5\"\n [attr.aria-label]=\"\n ('@ai-management:chat.composer-attachments-region'\n | translate\n | async) ?? ''\n \"\n >\n <div\n class=\"flex flex-wrap items-center justify-between gap-1.5 text-[0.65rem] text-muted\"\n >\n <span>\n @if (isComposerSaving()) {\n {{ '@ai-management:chat.composer-uploading' | translate | async }}\n } @else {\n @if (draftComposerImages().length > 0) {\n <span\n >{{ draftComposerImages().length }}\n {{\n '@ai-management:chat.composer-images-count'\n | translate\n | async\n }}</span\n >\n }\n @if (\n draftComposerImages().length > 0 &&\n draftComposerAudios().length > 0\n ) {\n <span class=\"mx-1\">\u00B7</span>\n }\n @if (draftComposerAudios().length > 0) {\n <span\n >{{ draftComposerAudios().length }}\n {{\n '@ai-management:chat.composer-audio-count'\n | translate\n | async\n }}</span\n >\n }\n @if (draftComposerFiles().length > 0) {\n @if (\n draftComposerImages().length > 0 ||\n draftComposerAudios().length > 0\n ) {\n <span class=\"mx-1\">\u00B7</span>\n }\n <span\n >{{ draftComposerFiles().length }}\n {{\n '@ai-management:chat.composer-documents-count'\n | translate\n | async\n }}</span\n >\n }\n }\n </span>\n </div>\n @if (draftComposerImages().length > 0) {\n <div class=\"flex flex-wrap gap-1.5\">\n @for (slot of draftComposerImages(); track slot.clientId) {\n <div\n class=\"relative h-12 w-12 shrink-0 overflow-hidden rounded-md border border-default/60 dark:border-darker bg-lightest\"\n >\n <img\n [src]=\"slot.previewUrl\"\n [alt]=\"slot.name ?? ''\"\n class=\"h-full w-full object-cover\"\n />\n @if (!slot.fileId) {\n <span\n class=\"absolute inset-0 flex items-center justify-center bg-default/40 text-[0.6rem] font-medium text-on-lightest\"\n >\u2026</span\n >\n }\n <button\n type=\"button\"\n class=\"absolute end-0.5 top-0.5 flex h-4 w-4 items-center justify-center rounded bg-default/80 text-[0.65rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\n [disabled]=\"busy() || isComposerSaving()\"\n [attr.aria-label]=\"\n ('@ai-management:chat.remove-draft-image'\n | translate\n | async) ?? ''\n \"\n (click)=\"removeDraftImage(slot.clientId)\"\n >\n \u00D7\n </button>\n </div>\n }\n </div>\n }\n @if (draftComposerAudios().length > 0) {\n <div class=\"flex flex-col gap-1\">\n @for (slot of draftComposerAudios(); track slot.clientId) {\n <div\n class=\"flex items-center justify-between gap-1.5 rounded border border-default/60 dark:border-darker bg-lightest px-1.5 py-1 text-[0.65rem] min-w-0\"\n >\n <span\n class=\"truncate text-on-lightest\"\n [attr.title]=\"slot.name ?? ''\"\n >\n {{\n '@ai-management:chat.attached-audio-label'\n | translate\n | async\n }}:\n {{\n slot.name?.trim() ||\n ('@ai-management:chat.audio-untitled' | translate | async)\n }}\n </span>\n @if (!slot.fileId) {\n <span class=\"text-muted shrink-0\">\u2026</span>\n }\n <button\n type=\"button\"\n class=\"shrink-0 flex h-5 w-5 items-center justify-center rounded bg-default/80 text-[0.75rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\n [disabled]=\"busy() || isComposerSaving()\"\n [attr.aria-label]=\"\n ('@ai-management:chat.remove-draft-audio'\n | translate\n | async) ?? ''\n \"\n (click)=\"removeDraftAudio(slot.clientId)\"\n >\n \u00D7\n </button>\n </div>\n }\n </div>\n }\n @if (draftComposerFiles().length > 0) {\n <div class=\"flex flex-col gap-1\">\n @for (slot of draftComposerFiles(); track slot.clientId) {\n <div\n class=\"flex items-center justify-between gap-1.5 rounded border border-default/60 dark:border-darker bg-lightest px-1.5 py-1 text-[0.65rem] min-w-0\"\n >\n <span\n class=\"truncate text-on-lightest\"\n [attr.title]=\"slot.name ?? ''\"\n >\n {{\n '@ai-management:chat.attached-document-label'\n | translate\n | async\n }}:\n {{\n slot.name?.trim() ||\n ('@ai-management:chat.document-untitled'\n | translate\n | async)\n }}\n </span>\n @if (!slot.fileId) {\n <span class=\"text-muted shrink-0\">\u2026</span>\n }\n <button\n type=\"button\"\n class=\"shrink-0 flex h-5 w-5 items-center justify-center rounded bg-default/80 text-[0.75rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\n [disabled]=\"busy() || isComposerSaving()\"\n [attr.aria-label]=\"\n ('@ai-management:chat.remove-draft-document'\n | translate\n | async) ?? ''\n \"\n (click)=\"removeDraftFile(slot.clientId)\"\n >\n \u00D7\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"axm-ai-assist-prompt-box__body flex min-h-0 flex-col\">\n <ax-text-area\n class=\"axm-ai-assist-prompt-box__prompt-input w-full min-h-0\"\n [rows]=\"3\"\n [disabled]=\"busy()\"\n [ngModel]=\"promptDraft()\"\n (ngModelChange)=\"onPromptDraftChange($event)\"\n (keydown)=\"onPromptKeydown($event)\"\n [placeholder]=\"\n placeholder().trim().length > 0\n ? placeholder()\n : (('@ai-management:assist-popup.placeholder'\n | translate\n | async) ?? '')\n \"\n ></ax-text-area>\n </div>\n\n <div\n class=\"axm-ai-assist-prompt-box__footer flex shrink-0 items-center justify-between gap-2\"\n >\n <ax-button\n class=\"axm-ai-assist-prompt-box__menu-trigger\"\n look=\"solid\"\n color=\"primary\"\n type=\"button\"\n [iconOnly]=\"true\"\n [disabled]=\"busy()\"\n [attr.aria-label]=\"\n ('@ai-management:assist-popup.composer-menu-aria'\n | translate\n | async) ?? ''\n \"\n >\n <ax-prefix>\n <i class=\"fa-light fa-plus text-sm\" aria-hidden=\"true\"></i>\n </ax-prefix>\n <ax-dropdown-panel #composerMenu>\n <ax-button-item-list class=\"min-w-56\">\n <ax-button-item\n [text]=\"\n ('@ai-management:chat.upload-images' | translate | async) ?? ''\n \"\n [attr.aria-label]=\"\n ('@ai-management:chat.upload-images-aria'\n | translate\n | async) ?? ''\n \"\n (onClick)=\"openImagePicker(); composerMenu.close()\"\n >\n <ax-prefix>\n <i\n class=\"fa-light fa-image size-4 text-center\"\n aria-hidden=\"true\"\n ></i>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n [text]=\"\n ('@ai-management:chat.upload-audio' | translate | async) ?? ''\n \"\n [attr.aria-label]=\"\n ('@ai-management:chat.upload-audio-aria' | translate | async) ??\n ''\n \"\n (onClick)=\"openAudioPicker(); composerMenu.close()\"\n >\n <ax-prefix>\n <i\n class=\"fa-light fa-microphone size-4 text-center\"\n aria-hidden=\"true\"\n ></i>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n [text]=\"\n ('@ai-management:chat.upload-documents' | translate | async) ??\n ''\n \"\n [attr.aria-label]=\"\n ('@ai-management:chat.upload-documents-aria'\n | translate\n | async) ?? ''\n \"\n (onClick)=\"openDocumentPicker(); composerMenu.close()\"\n >\n <ax-prefix>\n <i\n class=\"fa-light fa-paperclip size-4 text-center\"\n aria-hidden=\"true\"\n ></i>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n\n <ax-button\n class=\"axm-ai-assist-prompt-box__send axm-ai-assist-prompt-box__send-gradient\"\n color=\"primary\"\n type=\"button\"\n [disabled]=\"busy() || !canSend()\"\n [text]=\"\n busy()\n ? (('@ai-management:assist-popup.generating' | translate | async) ??\n '')\n : (('@ai-management:assist-popup.generate' | translate | async) ??\n '')\n \"\n (onClick)=\"onSend()\"\n ></ax-button>\n </div>\n </div>\n</div>\n", styles: ["@layer properties;.axm-ai-assist-prompt-box-shell{pointer-events:none;box-sizing:border-box;inset:0;display:flex;max-height:100%;width:100%;flex-direction:column;align-items:center;justify-content:flex-end;padding-left:max(.75rem,env(safe-area-inset-left,0px));padding-right:max(.75rem,env(safe-area-inset-right,0px));padding-bottom:max(.75rem,env(safe-area-inset-bottom,0px));padding-top:max(.5rem,env(safe-area-inset-top,0px))}.axm-ai-assist-prompt-box-shell .overlay-pane{pointer-events:auto;--tw-border-style: none;border-style:none;background-color:transparent;flex:0 0 auto;width:auto!important;max-width:calc(100vw - 1.5rem);min-width:min(480px,100vw - 1.5rem)}.axm-ai-assist-prompt-box{--axm-axm-ai-assist-prompt-chrome-gradient: linear-gradient( 125deg, rgb(var(--ax-sys-color-primary-200)) 0%, rgb(var(--ax-sys-color-primary-400)) 48%, rgb(var(--ax-sys-color-primary-300)) 100% );--axm-axm-ai-assist-prompt-send-gradient: linear-gradient( 90deg, rgb(var(--ax-sys-color-primary-500)), rgb(var(--ax-sys-color-primary-700)) );margin:0;box-sizing:border-box;overflow:hidden;padding:0;max-height:min(78vh,620px);padding:.65rem .7rem .7rem;border-radius:1.35rem;background:var(--axm-axm-ai-assist-prompt-chrome-gradient);box-shadow:0 18px 50px -12px rgba(var(--ax-sys-color-on-surface),.12),0 8px 20px -8px rgba(var(--ax-sys-color-primary-400),.2)}.dark .axm-ai-assist-prompt-box{--axm-axm-ai-assist-prompt-chrome-gradient: linear-gradient( 125deg, rgb(var(--ax-sys-color-primary-600)) 0%, rgb(var(--ax-sys-color-primary-500)) 48%, rgb(var(--ax-sys-color-primary-400)) 100% );box-shadow:0 20px 55px -14px rgba(var(--ax-sys-color-dark),.48),0 8px 24px -8px rgba(var(--ax-sys-color-primary-400),.26)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-title{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);font-size:.72rem;line-height:1.25;letter-spacing:.01em;color:rgb(var(--ax-sys-color-on-surface))}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-title){color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-mark{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);width:1.65rem;height:1.65rem;font-size:.75rem;line-height:1;color:rgb(var(--ax-sys-color-on-primary-surface));background:linear-gradient(145deg,rgb(var(--ax-sys-color-primary-500)),rgb(var(--ax-sys-color-primary-700)));box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.35)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__sheet{min-height:0px;flex:auto;padding:.65rem .65rem .55rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgba(var(--ax-sys-color-neutral-300),.35);box-shadow:inset 0 1px rgba(var(--ax-sys-color-lightest-surface),.95)}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__sheet){background:rgb(var(--ax-sys-color-neutral-800));border-color:rgba(var(--ax-sys-color-neutral-500),.4);box-shadow:inset 0 1px rgba(var(--ax-sys-color-lightest-surface),.06)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__body{min-height:0px;flex:auto;overflow-y:auto}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input{display:block;min-height:0px;width:100%;--tw-border-style: none !important;border-style:none!important;background-color:transparent!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input:focus-within{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input:focus-within>*{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea{min-height:4.5rem;max-height:min(30vh,240px);font-size:.8125rem;line-height:1.45;padding-block:.55rem;padding-inline:.65rem;border-radius:.65rem;--tw-border-style: none !important;border-style:none!important;background-color:transparent!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:focus,.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:focus-visible,.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:active{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important;outline-offset:0!important}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea){color:rgb(var(--ax-sys-color-on-lightest-surface));background:rgb(var(--ax-sys-color-neutral-900))!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__footer{min-height:0}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger{--ax-comp-button-normal-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-hover-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-pressed-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-border-width: 0 !important;overflow:hidden;border-radius:calc(infinity * 1px)!important;border-color:transparent!important;background-color:transparent!important;background:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:hover:not(.state-disabled,.state-loading,.state-selected),.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:active:not(.state-disabled,.state-loading,.state-selected){border-color:transparent!important;background-color:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger>button{border-radius:calc(infinity * 1px)!important;--tw-border-style: none !important;border-style:none!important;padding:0!important;width:2.25rem;height:2.25rem;min-width:2.25rem;min-height:2.25rem;color:rgb(var(--ax-sys-color-on-primary-surface))!important;background:linear-gradient(145deg,rgb(var(--ax-sys-color-primary-500)),rgb(var(--ax-sys-color-primary-700)))!important;box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.35)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger.ax-state-disabled>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger.ax-state-loading>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger>button:disabled{opacity:.55;box-shadow:none}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:hover:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.94)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:active:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.88)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient{--ax-comp-button-normal-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-hover-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-pressed-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-border-width: 0 !important;overflow:hidden;border-radius:calc(infinity * 1px)!important;border-color:transparent!important;background-color:transparent!important;background:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:hover:not(.state-disabled,.state-loading,.state-selected),.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:active:not(.state-disabled,.state-loading,.state-selected){border-color:transparent!important;background-color:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient>button{border-radius:calc(infinity * 1px)!important;--tw-border-style: none !important;border-style:none!important;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);min-height:2.25rem;padding-inline:1rem!important;font-size:.8rem;letter-spacing:.01em;color:rgb(var(--ax-sys-color-on-primary-surface))!important;background:var(--axm-axm-ai-assist-prompt-send-gradient)!important;box-shadow:0 3px 12px rgba(var(--ax-sys-color-secondary-400),.35)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient.ax-state-disabled>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient.ax-state-loading>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient>button:disabled{opacity:.55;box-shadow:none}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:hover:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.96)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:active:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.9)}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
|
|
1419
|
+
], template: "<div\r\n class=\"axm-ai-assist-prompt-box flex flex-col gap-2.5 min-h-0 w-full\"\r\n [style.max-width.px]=\"contentMaxWidthPx()\"\r\n>\r\n <div\r\n class=\"axm-ai-assist-prompt-box__eyebrow flex items-center justify-between gap-3 shrink-0 px-0.5\"\r\n >\r\n <div\r\n class=\"axm-ai-assist-prompt-box__brand inline-flex min-w-0 items-center gap-2\"\r\n >\r\n <span class=\"axm-ai-assist-prompt-box__brand-mark\" aria-hidden=\"true\">\r\n <i class=\"fa-light fa-sparkles\" aria-hidden=\"true\"></i>\r\n </span>\r\n <span class=\"axm-ai-assist-prompt-box__brand-title truncate\">{{\r\n title()\r\n }}</span>\r\n </div>\r\n <ax-button\r\n class=\"shrink-0 ax-sm\"\r\n look=\"blank\"\r\n color=\"default\"\r\n type=\"button\"\r\n [iconOnly]=\"true\"\r\n [disabled]=\"busy()\"\r\n [attr.aria-label]=\"\r\n ('@general:actions.close.title' | translate | async) ?? ''\r\n \"\r\n (onClick)=\"onCancel()\"\r\n >\r\n <ax-prefix>\r\n <i class=\"fa-light fa-xmark\" aria-hidden=\"true\"></i>\r\n </ax-prefix>\r\n </ax-button>\r\n </div>\r\n\r\n <div class=\"axm-ai-assist-prompt-box__sheet flex min-h-0 flex-col gap-2\">\r\n @if (\r\n draftComposerImages().length > 0 ||\r\n draftComposerAudios().length > 0 ||\r\n draftComposerFiles().length > 0 ||\r\n isComposerSaving()\r\n ) {\r\n <div\r\n class=\"shrink-0 rounded-xl border border-default/45 dark:border-darker bg-lightest/90 p-1.5 flex flex-col gap-1.5\"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.composer-attachments-region'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n >\r\n <div\r\n class=\"flex flex-wrap items-center justify-between gap-1.5 text-[0.65rem] text-muted\"\r\n >\r\n <span>\r\n @if (isComposerSaving()) {\r\n {{ '@ai-management:chat.composer-uploading' | translate | async }}\r\n } @else {\r\n @if (draftComposerImages().length > 0) {\r\n <span\r\n >{{ draftComposerImages().length }}\r\n {{\r\n '@ai-management:chat.composer-images-count'\r\n | translate\r\n | async\r\n }}</span\r\n >\r\n }\r\n @if (\r\n draftComposerImages().length > 0 &&\r\n draftComposerAudios().length > 0\r\n ) {\r\n <span class=\"mx-1\">\u00B7</span>\r\n }\r\n @if (draftComposerAudios().length > 0) {\r\n <span\r\n >{{ draftComposerAudios().length }}\r\n {{\r\n '@ai-management:chat.composer-audio-count'\r\n | translate\r\n | async\r\n }}</span\r\n >\r\n }\r\n @if (draftComposerFiles().length > 0) {\r\n @if (\r\n draftComposerImages().length > 0 ||\r\n draftComposerAudios().length > 0\r\n ) {\r\n <span class=\"mx-1\">\u00B7</span>\r\n }\r\n <span\r\n >{{ draftComposerFiles().length }}\r\n {{\r\n '@ai-management:chat.composer-documents-count'\r\n | translate\r\n | async\r\n }}</span\r\n >\r\n }\r\n }\r\n </span>\r\n </div>\r\n @if (draftComposerImages().length > 0) {\r\n <div class=\"flex flex-wrap gap-1.5\">\r\n @for (slot of draftComposerImages(); track slot.clientId) {\r\n <div\r\n class=\"relative h-12 w-12 shrink-0 overflow-hidden rounded-md border border-default/60 dark:border-darker bg-lightest\"\r\n >\r\n <img\r\n [src]=\"slot.previewUrl\"\r\n [alt]=\"slot.name ?? ''\"\r\n class=\"h-full w-full object-cover\"\r\n />\r\n @if (!slot.fileId) {\r\n <span\r\n class=\"absolute inset-0 flex items-center justify-center bg-default/40 text-[0.6rem] font-medium text-on-lightest\"\r\n >\u2026</span\r\n >\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"absolute end-0.5 top-0.5 flex h-4 w-4 items-center justify-center rounded bg-default/80 text-[0.65rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\r\n [disabled]=\"busy() || isComposerSaving()\"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.remove-draft-image'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n (click)=\"removeDraftImage(slot.clientId)\"\r\n >\r\n \u00D7\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (draftComposerAudios().length > 0) {\r\n <div class=\"flex flex-col gap-1\">\r\n @for (slot of draftComposerAudios(); track slot.clientId) {\r\n <div\r\n class=\"flex items-center justify-between gap-1.5 rounded border border-default/60 dark:border-darker bg-lightest px-1.5 py-1 text-[0.65rem] min-w-0\"\r\n >\r\n <span\r\n class=\"truncate text-on-lightest\"\r\n [attr.title]=\"slot.name ?? ''\"\r\n >\r\n {{\r\n '@ai-management:chat.attached-audio-label'\r\n | translate\r\n | async\r\n }}:\r\n {{\r\n slot.name?.trim() ||\r\n ('@ai-management:chat.audio-untitled' | translate | async)\r\n }}\r\n </span>\r\n @if (!slot.fileId) {\r\n <span class=\"text-muted shrink-0\">\u2026</span>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"shrink-0 flex h-5 w-5 items-center justify-center rounded bg-default/80 text-[0.75rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\r\n [disabled]=\"busy() || isComposerSaving()\"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.remove-draft-audio'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n (click)=\"removeDraftAudio(slot.clientId)\"\r\n >\r\n \u00D7\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (draftComposerFiles().length > 0) {\r\n <div class=\"flex flex-col gap-1\">\r\n @for (slot of draftComposerFiles(); track slot.clientId) {\r\n <div\r\n class=\"flex items-center justify-between gap-1.5 rounded border border-default/60 dark:border-darker bg-lightest px-1.5 py-1 text-[0.65rem] min-w-0\"\r\n >\r\n <span\r\n class=\"truncate text-on-lightest\"\r\n [attr.title]=\"slot.name ?? ''\"\r\n >\r\n {{\r\n '@ai-management:chat.attached-document-label'\r\n | translate\r\n | async\r\n }}:\r\n {{\r\n slot.name?.trim() ||\r\n ('@ai-management:chat.document-untitled'\r\n | translate\r\n | async)\r\n }}\r\n </span>\r\n @if (!slot.fileId) {\r\n <span class=\"text-muted shrink-0\">\u2026</span>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"shrink-0 flex h-5 w-5 items-center justify-center rounded bg-default/80 text-[0.75rem] leading-none text-on-lightest hover:bg-default focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\"\r\n [disabled]=\"busy() || isComposerSaving()\"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.remove-draft-document'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n (click)=\"removeDraftFile(slot.clientId)\"\r\n >\r\n \u00D7\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"axm-ai-assist-prompt-box__body flex min-h-0 flex-col\">\r\n <ax-text-area\r\n class=\"axm-ai-assist-prompt-box__prompt-input w-full min-h-0\"\r\n [rows]=\"3\"\r\n [disabled]=\"busy()\"\r\n [ngModel]=\"promptDraft()\"\r\n (ngModelChange)=\"onPromptDraftChange($event)\"\r\n (keydown)=\"onPromptKeydown($event)\"\r\n [placeholder]=\"\r\n placeholder().trim().length > 0\r\n ? placeholder()\r\n : (('@ai-management:assist-popup.placeholder'\r\n | translate\r\n | async) ?? '')\r\n \"\r\n ></ax-text-area>\r\n </div>\r\n\r\n <div\r\n class=\"axm-ai-assist-prompt-box__footer flex shrink-0 items-center justify-between gap-2\"\r\n >\r\n <ax-button\r\n class=\"axm-ai-assist-prompt-box__menu-trigger\"\r\n look=\"solid\"\r\n color=\"primary\"\r\n type=\"button\"\r\n [iconOnly]=\"true\"\r\n [disabled]=\"busy()\"\r\n [attr.aria-label]=\"\r\n ('@ai-management:assist-popup.composer-menu-aria'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n >\r\n <ax-prefix>\r\n <i class=\"fa-light fa-plus text-sm\" aria-hidden=\"true\"></i>\r\n </ax-prefix>\r\n <ax-dropdown-panel #composerMenu>\r\n <ax-button-item-list class=\"min-w-56\">\r\n <ax-button-item\r\n [text]=\"\r\n ('@ai-management:chat.upload-images' | translate | async) ?? ''\r\n \"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.upload-images-aria'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n (onClick)=\"openImagePicker(); composerMenu.close()\"\r\n >\r\n <ax-prefix>\r\n <i\r\n class=\"fa-light fa-image size-4 text-center\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n </ax-prefix>\r\n </ax-button-item>\r\n <ax-button-item\r\n [text]=\"\r\n ('@ai-management:chat.upload-audio' | translate | async) ?? ''\r\n \"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.upload-audio-aria' | translate | async) ??\r\n ''\r\n \"\r\n (onClick)=\"openAudioPicker(); composerMenu.close()\"\r\n >\r\n <ax-prefix>\r\n <i\r\n class=\"fa-light fa-microphone size-4 text-center\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n </ax-prefix>\r\n </ax-button-item>\r\n <ax-button-item\r\n [text]=\"\r\n ('@ai-management:chat.upload-documents' | translate | async) ??\r\n ''\r\n \"\r\n [attr.aria-label]=\"\r\n ('@ai-management:chat.upload-documents-aria'\r\n | translate\r\n | async) ?? ''\r\n \"\r\n (onClick)=\"openDocumentPicker(); composerMenu.close()\"\r\n >\r\n <ax-prefix>\r\n <i\r\n class=\"fa-light fa-paperclip size-4 text-center\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n </ax-prefix>\r\n </ax-button-item>\r\n </ax-button-item-list>\r\n </ax-dropdown-panel>\r\n </ax-button>\r\n\r\n <ax-button\r\n class=\"axm-ai-assist-prompt-box__send axm-ai-assist-prompt-box__send-gradient\"\r\n color=\"primary\"\r\n type=\"button\"\r\n [disabled]=\"runPhase() === 'stopping' || (runPhase() === 'idle' && !canSend())\"\r\n [text]=\"\r\n runPhase() === 'stopping'\r\n ? (('@ai-management:assist-popup.stopping' | translate | async) ??\r\n '')\r\n : runPhase() === 'running'\r\n ? (('@ai-management:assist-popup.stop' | translate | async) ?? '')\r\n : (('@ai-management:assist-popup.generate' | translate | async) ??\r\n '')\r\n \"\r\n (onClick)=\"onSend()\"\r\n ></ax-button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["@layer properties;.axm-ai-assist-prompt-box-shell{pointer-events:none;box-sizing:border-box;inset:0;display:flex;max-height:100%;width:100%;flex-direction:column;align-items:center;justify-content:flex-end;padding-left:max(.75rem,env(safe-area-inset-left,0px));padding-right:max(.75rem,env(safe-area-inset-right,0px));padding-bottom:max(.75rem,env(safe-area-inset-bottom,0px));padding-top:max(.5rem,env(safe-area-inset-top,0px))}.axm-ai-assist-prompt-box-shell .overlay-pane{pointer-events:auto;--tw-border-style: none;border-style:none;background-color:transparent;flex:0 0 auto;width:auto!important;max-width:calc(100vw - 1.5rem);min-width:min(480px,100vw - 1.5rem)}.axm-ai-assist-prompt-box{--axm-axm-ai-assist-prompt-chrome-gradient: linear-gradient( 125deg, rgb(var(--ax-sys-color-primary-200)) 0%, rgb(var(--ax-sys-color-primary-400)) 48%, rgb(var(--ax-sys-color-primary-300)) 100% );--axm-axm-ai-assist-prompt-send-gradient: linear-gradient( 90deg, rgb(var(--ax-sys-color-primary-500)), rgb(var(--ax-sys-color-primary-700)) );margin:0;box-sizing:border-box;overflow:hidden;padding:0;max-height:min(78vh,620px);padding:.65rem .7rem .7rem;border-radius:1.35rem;background:var(--axm-axm-ai-assist-prompt-chrome-gradient);box-shadow:0 18px 50px -12px rgba(var(--ax-sys-color-on-surface),.12),0 8px 20px -8px rgba(var(--ax-sys-color-primary-400),.2)}.dark .axm-ai-assist-prompt-box{--axm-axm-ai-assist-prompt-chrome-gradient: linear-gradient( 125deg, rgb(var(--ax-sys-color-primary-600)) 0%, rgb(var(--ax-sys-color-primary-500)) 48%, rgb(var(--ax-sys-color-primary-400)) 100% );box-shadow:0 20px 55px -14px rgba(var(--ax-sys-color-dark),.48),0 8px 24px -8px rgba(var(--ax-sys-color-primary-400),.26)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-title{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);font-size:.72rem;line-height:1.25;letter-spacing:.01em;color:rgb(var(--ax-sys-color-on-surface))}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-title){color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__brand-mark{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);width:1.65rem;height:1.65rem;font-size:.75rem;line-height:1;color:rgb(var(--ax-sys-color-on-primary-surface));background:linear-gradient(145deg,rgb(var(--ax-sys-color-primary-500)),rgb(var(--ax-sys-color-primary-700)));box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.35)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__sheet{min-height:0px;flex:auto;padding:.65rem .65rem .55rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgba(var(--ax-sys-color-neutral-300),.35);box-shadow:inset 0 1px rgba(var(--ax-sys-color-lightest-surface),.95)}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__sheet){background:rgb(var(--ax-sys-color-neutral-800));border-color:rgba(var(--ax-sys-color-neutral-500),.4);box-shadow:inset 0 1px rgba(var(--ax-sys-color-lightest-surface),.06)}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__body{min-height:0px;flex:auto;overflow-y:auto}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input{display:block;min-height:0px;width:100%;--tw-border-style: none !important;border-style:none!important;background-color:transparent!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input:focus-within{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input:focus-within>*{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea{min-height:4.5rem;max-height:min(30vh,240px);font-size:.8125rem;line-height:1.45;padding-block:.55rem;padding-inline:.65rem;border-radius:.65rem;--tw-border-style: none !important;border-style:none!important;background-color:transparent!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:focus,.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:focus-visible,.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea:active{--tw-border-style: none !important;border-style:none!important;--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;--tw-outline-style: none !important;outline-style:none!important;outline-offset:0!important}.dark :is(.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__prompt-input textarea){color:rgb(var(--ax-sys-color-on-lightest-surface));background:rgb(var(--ax-sys-color-neutral-900))!important}.axm-ai-assist-prompt-box .axm-ai-assist-prompt-box__footer{min-height:0}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger{--ax-comp-button-normal-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-hover-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-pressed-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-border-width: 0 !important;overflow:hidden;border-radius:calc(infinity * 1px)!important;border-color:transparent!important;background-color:transparent!important;background:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:hover:not(.state-disabled,.state-loading,.state-selected),.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:active:not(.state-disabled,.state-loading,.state-selected){border-color:transparent!important;background-color:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger>button{border-radius:calc(infinity * 1px)!important;--tw-border-style: none !important;border-style:none!important;padding:0!important;width:2.25rem;height:2.25rem;min-width:2.25rem;min-height:2.25rem;color:rgb(var(--ax-sys-color-on-primary-surface))!important;background:linear-gradient(145deg,rgb(var(--ax-sys-color-primary-500)),rgb(var(--ax-sys-color-primary-700)))!important;box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.35)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger.ax-state-disabled>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger.ax-state-loading>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger>button:disabled{opacity:.55;box-shadow:none}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:hover:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.94)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__menu-trigger:active:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.88)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient{--ax-comp-button-normal-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-hover-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-pressed-bg-color: 0, 0, 0, 0 !important;--ax-comp-button-border-width: 0 !important;overflow:hidden;border-radius:calc(infinity * 1px)!important;border-color:transparent!important;background-color:transparent!important;background:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:hover:not(.state-disabled,.state-loading,.state-selected),.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:active:not(.state-disabled,.state-loading,.state-selected){border-color:transparent!important;background-color:transparent!important}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient>button{border-radius:calc(infinity * 1px)!important;--tw-border-style: none !important;border-style:none!important;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);min-height:2.25rem;padding-inline:1rem!important;font-size:.8rem;letter-spacing:.01em;color:rgb(var(--ax-sys-color-on-primary-surface))!important;background:var(--axm-axm-ai-assist-prompt-send-gradient)!important;box-shadow:0 3px 12px rgba(var(--ax-sys-color-secondary-400),.35)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient.ax-state-disabled>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient.ax-state-loading>button,.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient>button:disabled{opacity:.55;box-shadow:none}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:hover:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.96)}.axm-ai-assist-prompt-box ax-button.axm-ai-assist-prompt-box__send-gradient:active:not(.state-disabled,.state-loading,.state-selected)>button{filter:brightness(.9)}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
|
|
1350
1420
|
}], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], initialPrompt: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialPrompt", required: false }] }], contentMaxWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentMaxWidthPx", required: false }] }], initialAssistId: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialAssistId", required: false }] }], runPrompt: [{ type: i0.Input, args: [{ isSignal: true, alias: "runPrompt", required: true }] }], requestClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "requestClose", required: true }] }] } });
|
|
1351
1421
|
|
|
1352
1422
|
//#endregion
|
|
@@ -1363,6 +1433,7 @@ class AXMAiAssistPromptBoxService {
|
|
|
1363
1433
|
this.overlayRef = null;
|
|
1364
1434
|
this.pendingResolve = null;
|
|
1365
1435
|
this.settled = false;
|
|
1436
|
+
this.overlaySessionId = 0;
|
|
1366
1437
|
}
|
|
1367
1438
|
//#endregion
|
|
1368
1439
|
//#region ---- Public Methods ----
|
|
@@ -1376,11 +1447,15 @@ class AXMAiAssistPromptBoxService {
|
|
|
1376
1447
|
superseded(null);
|
|
1377
1448
|
}
|
|
1378
1449
|
this.disposeOverlayOnly();
|
|
1450
|
+
const sessionId = ++this.overlaySessionId;
|
|
1379
1451
|
return new Promise((resolve) => {
|
|
1380
1452
|
this.pendingResolve = resolve;
|
|
1381
1453
|
this.settled = false;
|
|
1382
1454
|
const requestClose = (result) => {
|
|
1383
|
-
this.
|
|
1455
|
+
if (this.overlaySessionId !== sessionId) {
|
|
1456
|
+
return;
|
|
1457
|
+
}
|
|
1458
|
+
this.settle(result, sessionId);
|
|
1384
1459
|
this.overlayRef?.dispose();
|
|
1385
1460
|
};
|
|
1386
1461
|
void this.overlayService
|
|
@@ -1394,8 +1469,8 @@ class AXMAiAssistPromptBoxService {
|
|
|
1394
1469
|
background: false,
|
|
1395
1470
|
closeOnClick: false,
|
|
1396
1471
|
},
|
|
1397
|
-
closeOnEscape:
|
|
1398
|
-
closeOnOutsideClick:
|
|
1472
|
+
closeOnEscape: false,
|
|
1473
|
+
closeOnOutsideClick: false,
|
|
1399
1474
|
inputs: {
|
|
1400
1475
|
title: options.title,
|
|
1401
1476
|
placeholder: options.placeholder ?? '',
|
|
@@ -1405,23 +1480,36 @@ class AXMAiAssistPromptBoxService {
|
|
|
1405
1480
|
requestClose,
|
|
1406
1481
|
},
|
|
1407
1482
|
onDispose: () => {
|
|
1483
|
+
if (this.overlaySessionId !== sessionId) {
|
|
1484
|
+
return;
|
|
1485
|
+
}
|
|
1408
1486
|
this.overlayRef = null;
|
|
1409
1487
|
if (!this.settled && this.pendingResolve) {
|
|
1410
|
-
this.settle(null);
|
|
1488
|
+
this.settle(null, sessionId);
|
|
1411
1489
|
}
|
|
1412
1490
|
},
|
|
1413
1491
|
})
|
|
1414
1492
|
.then((ref) => {
|
|
1493
|
+
if (this.overlaySessionId !== sessionId) {
|
|
1494
|
+
ref.dispose();
|
|
1495
|
+
return;
|
|
1496
|
+
}
|
|
1415
1497
|
this.overlayRef = ref;
|
|
1416
1498
|
})
|
|
1417
1499
|
.catch(() => {
|
|
1418
|
-
this.
|
|
1500
|
+
if (this.overlaySessionId !== sessionId) {
|
|
1501
|
+
return;
|
|
1502
|
+
}
|
|
1503
|
+
this.settle(null, sessionId);
|
|
1419
1504
|
});
|
|
1420
1505
|
});
|
|
1421
1506
|
}
|
|
1422
1507
|
//#endregion
|
|
1423
1508
|
//#region ---- Utility Methods ----
|
|
1424
|
-
settle(result) {
|
|
1509
|
+
settle(result, sessionId) {
|
|
1510
|
+
if (sessionId != null && this.overlaySessionId !== sessionId) {
|
|
1511
|
+
return;
|
|
1512
|
+
}
|
|
1425
1513
|
if (this.settled) {
|
|
1426
1514
|
return;
|
|
1427
1515
|
}
|
|
@@ -2141,7 +2229,16 @@ async function runStructuredOutputPipeline(params) {
|
|
|
2141
2229
|
let prevFailurePhase;
|
|
2142
2230
|
const perAttemptUsage = [];
|
|
2143
2231
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
2144
|
-
|
|
2232
|
+
assertAiAssistNotAborted(params.abortSignal);
|
|
2233
|
+
let result;
|
|
2234
|
+
try {
|
|
2235
|
+
result = await params.executeRun(messages);
|
|
2236
|
+
}
|
|
2237
|
+
catch (err) {
|
|
2238
|
+
assertAiAssistNotAborted(params.abortSignal);
|
|
2239
|
+
throw err;
|
|
2240
|
+
}
|
|
2241
|
+
assertAiAssistNotAborted(params.abortSignal);
|
|
2145
2242
|
mergedUsage = mergeEngineUsageTotals(mergedUsage, result.usageTotals);
|
|
2146
2243
|
if (result.lastProviderResult !== undefined) {
|
|
2147
2244
|
lastProvider = result.lastProviderResult;
|
|
@@ -2168,6 +2265,7 @@ async function runStructuredOutputPipeline(params) {
|
|
|
2168
2265
|
code: 'duplicate_assistant_output',
|
|
2169
2266
|
});
|
|
2170
2267
|
}
|
|
2268
|
+
assertAiAssistNotAborted(params.abortSignal);
|
|
2171
2269
|
const validation = await validateAgainstContract({
|
|
2172
2270
|
contract: params.contract,
|
|
2173
2271
|
assistantPlainText: structuredParts.combined,
|
|
@@ -2175,6 +2273,7 @@ async function runStructuredOutputPipeline(params) {
|
|
|
2175
2273
|
structuredValidator: params.structuredValidator,
|
|
2176
2274
|
commandExecutor: params.commandExecutor,
|
|
2177
2275
|
});
|
|
2276
|
+
assertAiAssistNotAborted(params.abortSignal);
|
|
2178
2277
|
if (validation.ok) {
|
|
2179
2278
|
const structuredRunRaw = {
|
|
2180
2279
|
kind: 'structured-output',
|
|
@@ -2205,10 +2304,12 @@ async function runStructuredOutputPipeline(params) {
|
|
|
2205
2304
|
code: 'validation_exhausted',
|
|
2206
2305
|
});
|
|
2207
2306
|
}
|
|
2307
|
+
assertAiAssistNotAborted(params.abortSignal);
|
|
2208
2308
|
messages = [
|
|
2209
2309
|
...result.messages,
|
|
2210
2310
|
axpAiChatTextMessage('user', buildStructuredOutputRetryUserText(firstError?.message ?? 'Validation failed.', schemaSummary, firstError?.phase ?? 'parse')),
|
|
2211
2311
|
];
|
|
2312
|
+
assertAiAssistNotAborted(params.abortSignal);
|
|
2212
2313
|
}
|
|
2213
2314
|
throw new AXPAiStructuredOutputError({
|
|
2214
2315
|
message: 'Structured output validation failed (unexpected end of retry loop).',
|
|
@@ -2292,9 +2393,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
2292
2393
|
|
|
2293
2394
|
//#region ---- Imports ----
|
|
2294
2395
|
//#endregion
|
|
2295
|
-
//#region ---- Assist prompt run loading dialog ----
|
|
2296
|
-
const AI_ASSIST_RUN_LOADING_DIALOG_CLOSE_DELAY_MS = 200;
|
|
2297
|
-
//#endregion
|
|
2298
2396
|
//#region ---- Assist run helpers ----
|
|
2299
2397
|
function mergePlatformRuntimeContext(base, notes) {
|
|
2300
2398
|
if (!notes || Object.keys(notes).length === 0) {
|
|
@@ -2374,7 +2472,6 @@ class AXPAiManagerService extends AXPAiAssistService {
|
|
|
2374
2472
|
this.runtimeContextBuilder = inject(AXPAiPlatformRuntimeContextBuilder);
|
|
2375
2473
|
this.assistPromptBox = inject(AXMAiAssistPromptBoxService);
|
|
2376
2474
|
this.localeId = inject(LOCALE_ID);
|
|
2377
|
-
this.loadingDialog = inject(AXLoadingDialogService);
|
|
2378
2475
|
this.assistData = this.entityService
|
|
2379
2476
|
.withEntity(RootConfig.module.name, RootConfig.entities.assist.name)
|
|
2380
2477
|
.data();
|
|
@@ -2495,10 +2592,12 @@ class AXPAiManagerService extends AXPAiAssistService {
|
|
|
2495
2592
|
}
|
|
2496
2593
|
/** @inheritdoc */
|
|
2497
2594
|
async run(input) {
|
|
2595
|
+
assertAiAssistNotAborted(input.abortSignal);
|
|
2498
2596
|
const baseCtx = await this.runtimeContextBuilder.build();
|
|
2499
2597
|
const platformRuntimeContext = mergePlatformRuntimeContext(baseCtx, input.platformRuntimeNotes ?? null);
|
|
2500
2598
|
const assistId = input.assistId?.trim();
|
|
2501
2599
|
const assistRow = await this.getAssistForChat(assistId);
|
|
2600
|
+
assertAiAssistNotAborted(input.abortSignal);
|
|
2502
2601
|
const inputContract = outputContractFromAssistRunInput(input);
|
|
2503
2602
|
const effectiveOutputContract = await this.outputContractResolve.resolveEffective({
|
|
2504
2603
|
input: inputContract,
|
|
@@ -2516,9 +2615,11 @@ class AXPAiManagerService extends AXPAiAssistService {
|
|
|
2516
2615
|
...(input.maxSteps !== undefined ? { maxSteps: input.maxSteps } : {}),
|
|
2517
2616
|
...(input.temperature !== undefined ? { temperature: input.temperature } : {}),
|
|
2518
2617
|
maxTokens: effectiveMaxTokens,
|
|
2618
|
+
...(input.abortSignal ? { abortSignal: input.abortSignal } : {}),
|
|
2519
2619
|
};
|
|
2520
2620
|
if (!usesStructuredPipeline) {
|
|
2521
2621
|
const result = await this.runEngine({ ...runOptions, messages });
|
|
2622
|
+
assertAiAssistNotAborted(input.abortSignal);
|
|
2522
2623
|
const text = extractLastAssistantPlainText(result.messages);
|
|
2523
2624
|
return { success: true, outputKind: effectiveOutputContract.kind,
|
|
2524
2625
|
text,
|
|
@@ -2537,6 +2638,7 @@ class AXPAiManagerService extends AXPAiAssistService {
|
|
|
2537
2638
|
retryOnInvalidStructure,
|
|
2538
2639
|
structuredValidator: input.structuredValidator,
|
|
2539
2640
|
structuredOutputSchemaSummary: input.structuredOutputSchemaSummary,
|
|
2641
|
+
abortSignal: input.abortSignal,
|
|
2540
2642
|
});
|
|
2541
2643
|
return {
|
|
2542
2644
|
success: pipelineResult.success,
|
|
@@ -2551,55 +2653,26 @@ class AXPAiManagerService extends AXPAiAssistService {
|
|
|
2551
2653
|
}
|
|
2552
2654
|
/** @inheritdoc */
|
|
2553
2655
|
async show(options) {
|
|
2554
|
-
const
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
outputContract: options.outputContract,
|
|
2575
|
-
expectStructuredOutput: options.expectStructuredOutput,
|
|
2576
|
-
structuredOutputInstruction: options.structuredOutputInstruction,
|
|
2577
|
-
platformRuntimeNotes: options.platformRuntimeNotes,
|
|
2578
|
-
maxStructuredRetries: options.maxStructuredRetries,
|
|
2579
|
-
structuredValidator: options.structuredValidator,
|
|
2580
|
-
retryOnInvalidStructure: options.retryOnInvalidStructure,
|
|
2581
|
-
structuredOutputSchemaSummary: options.structuredOutputSchemaSummary,
|
|
2582
|
-
structuredOutputMaxTokens: options.structuredOutputMaxTokens,
|
|
2583
|
-
});
|
|
2584
|
-
}
|
|
2585
|
-
catch (err) {
|
|
2586
|
-
if (progressDialog !== undefined) {
|
|
2587
|
-
try {
|
|
2588
|
-
progressDialog.setProgressColor('danger');
|
|
2589
|
-
progressDialog.setProgressText(err instanceof Error ? err.message : String(err));
|
|
2590
|
-
}
|
|
2591
|
-
catch {
|
|
2592
|
-
// Ignore dialog update failures.
|
|
2593
|
-
}
|
|
2594
|
-
}
|
|
2595
|
-
throw err;
|
|
2596
|
-
}
|
|
2597
|
-
finally {
|
|
2598
|
-
if (progressDialog !== undefined) {
|
|
2599
|
-
const dlg = progressDialog;
|
|
2600
|
-
setTimeout(() => dlg.close(), AI_ASSIST_RUN_LOADING_DIALOG_CLOSE_DELAY_MS);
|
|
2601
|
-
}
|
|
2602
|
-
}
|
|
2656
|
+
const data = await this.assistPromptBox.open(options, async (payload, execution) => {
|
|
2657
|
+
return await this.run({
|
|
2658
|
+
prompt: payload.prompt,
|
|
2659
|
+
userMediaAttachments: payload.userMediaAttachments.length > 0 ? payload.userMediaAttachments : undefined,
|
|
2660
|
+
context: options.context,
|
|
2661
|
+
assistId: payload.assistId,
|
|
2662
|
+
maxSteps: options.maxSteps,
|
|
2663
|
+
temperature: options.temperature,
|
|
2664
|
+
maxTokens: options.maxTokens,
|
|
2665
|
+
outputContract: options.outputContract,
|
|
2666
|
+
expectStructuredOutput: options.expectStructuredOutput,
|
|
2667
|
+
structuredOutputInstruction: options.structuredOutputInstruction,
|
|
2668
|
+
platformRuntimeNotes: options.platformRuntimeNotes,
|
|
2669
|
+
maxStructuredRetries: options.maxStructuredRetries,
|
|
2670
|
+
structuredValidator: options.structuredValidator,
|
|
2671
|
+
retryOnInvalidStructure: options.retryOnInvalidStructure,
|
|
2672
|
+
structuredOutputSchemaSummary: options.structuredOutputSchemaSummary,
|
|
2673
|
+
structuredOutputMaxTokens: options.structuredOutputMaxTokens,
|
|
2674
|
+
abortSignal: execution.abortSignal,
|
|
2675
|
+
});
|
|
2603
2676
|
});
|
|
2604
2677
|
return data ?? null;
|
|
2605
2678
|
}
|
|
@@ -2876,11 +2949,6 @@ class AXMAiManagementModule {
|
|
|
2876
2949
|
multi: true,
|
|
2877
2950
|
useFactory: routesFactory,
|
|
2878
2951
|
},
|
|
2879
|
-
{
|
|
2880
|
-
provide: AXP_MODULE_MANIFEST_PROVIDER,
|
|
2881
|
-
useValue: AiManagementManifest,
|
|
2882
|
-
multi: true,
|
|
2883
|
-
},
|
|
2884
2952
|
{
|
|
2885
2953
|
provide: AXP_PERMISSION_DEFINITION_PROVIDER,
|
|
2886
2954
|
useClass: AXMPermissionDefinitionProvider,
|
|
@@ -2917,7 +2985,7 @@ class AXMAiManagementModule {
|
|
|
2917
2985
|
},
|
|
2918
2986
|
{
|
|
2919
2987
|
key: 'AiManagement:ListAiQueryRegistryCatalog',
|
|
2920
|
-
loader: () => import('./acorex-platform-module-ai-management-client-list-ai-query-registry-catalog.query-
|
|
2988
|
+
loader: () => import('./acorex-platform-module-ai-management-client-list-ai-query-registry-catalog.query-BxL3pxzj.mjs').then((c) => c.AXMListAiQueryRegistryCatalogQuery),
|
|
2921
2989
|
},
|
|
2922
2990
|
]),
|
|
2923
2991
|
{
|
|
@@ -2957,11 +3025,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
2957
3025
|
multi: true,
|
|
2958
3026
|
useFactory: routesFactory,
|
|
2959
3027
|
},
|
|
2960
|
-
{
|
|
2961
|
-
provide: AXP_MODULE_MANIFEST_PROVIDER,
|
|
2962
|
-
useValue: AiManagementManifest,
|
|
2963
|
-
multi: true,
|
|
2964
|
-
},
|
|
2965
3028
|
{
|
|
2966
3029
|
provide: AXP_PERMISSION_DEFINITION_PROVIDER,
|
|
2967
3030
|
useClass: AXMPermissionDefinitionProvider,
|
|
@@ -2998,7 +3061,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
2998
3061
|
},
|
|
2999
3062
|
{
|
|
3000
3063
|
key: 'AiManagement:ListAiQueryRegistryCatalog',
|
|
3001
|
-
loader: () => import('./acorex-platform-module-ai-management-client-list-ai-query-registry-catalog.query-
|
|
3064
|
+
loader: () => import('./acorex-platform-module-ai-management-client-list-ai-query-registry-catalog.query-BxL3pxzj.mjs').then((c) => c.AXMListAiQueryRegistryCatalogQuery),
|
|
3002
3065
|
},
|
|
3003
3066
|
]),
|
|
3004
3067
|
{
|
|
@@ -3267,7 +3330,7 @@ function getAiChatCommandLlmParametersOverride(commandName) {
|
|
|
3267
3330
|
properties: {
|
|
3268
3331
|
model: {
|
|
3269
3332
|
type: 'string',
|
|
3270
|
-
description: 'Catalog AiModel row id for text-to-speech (purpose tts). Pass on the command or rely on agent commandIds options.model; mock default is OpenRouter
|
|
3333
|
+
description: 'Catalog AiModel row id for text-to-speech (purpose tts). Pass on the command or rely on agent commandIds options.model; mock default is OpenRouter x-ai/grok-voice-tts-1.0.',
|
|
3271
3334
|
},
|
|
3272
3335
|
text: {
|
|
3273
3336
|
type: 'string',
|
|
@@ -3275,7 +3338,7 @@ function getAiChatCommandLlmParametersOverride(commandName) {
|
|
|
3275
3338
|
},
|
|
3276
3339
|
voice: {
|
|
3277
3340
|
type: 'string',
|
|
3278
|
-
description: 'Optional voice.
|
|
3341
|
+
description: 'Optional voice. Grok Voice default row: ara, eve, rex, sal, leo (alloy maps to ara). Gemini TTS: Zephyr, Puck, Charon, Kore, Fenrir, Leda, Orus, Aoede.',
|
|
3279
3342
|
},
|
|
3280
3343
|
responseFormat: {
|
|
3281
3344
|
type: 'string',
|
|
@@ -3284,6 +3347,74 @@ function getAiChatCommandLlmParametersOverride(commandName) {
|
|
|
3284
3347
|
},
|
|
3285
3348
|
required: ['text'],
|
|
3286
3349
|
};
|
|
3350
|
+
case AIMANAGEMENT_RENDER_CHAT_CHART_COMMAND_KEY:
|
|
3351
|
+
return {
|
|
3352
|
+
type: 'object',
|
|
3353
|
+
properties: {
|
|
3354
|
+
kind: {
|
|
3355
|
+
type: 'string',
|
|
3356
|
+
enum: ['bar', 'line', 'donut', 'gauge', 'funnel', 'heatmap'],
|
|
3357
|
+
description: 'Chart kind. Bar for categorical counts, line for trends, donut for part-to-whole, gauge for one KPI, funnel for stages, heatmap for a matrix.',
|
|
3358
|
+
},
|
|
3359
|
+
title: { type: 'string', description: 'Optional chart title.' },
|
|
3360
|
+
xAxisLabel: { type: 'string', description: 'Optional X-axis caption.' },
|
|
3361
|
+
yAxisLabel: { type: 'string', description: 'Optional Y-axis caption.' },
|
|
3362
|
+
entity: {
|
|
3363
|
+
type: 'string',
|
|
3364
|
+
description: 'Module.Entity for stored rows. When set, this command runs one storage aggregate and ignores items. Do not call Entity:Query:Default first.',
|
|
3365
|
+
},
|
|
3366
|
+
filter: {
|
|
3367
|
+
description: 'Optional AXPQueryRequest.filter JSON applied to the aggregate.',
|
|
3368
|
+
},
|
|
3369
|
+
groupBy: {
|
|
3370
|
+
type: 'array',
|
|
3371
|
+
items: { type: 'string' },
|
|
3372
|
+
description: 'Field paths from the entity schema (source of x / series). Empty array is allowed for gauge.',
|
|
3373
|
+
},
|
|
3374
|
+
measures: {
|
|
3375
|
+
type: 'array',
|
|
3376
|
+
description: 'Aggregate measures. Always set alias. Each item: { reducer, field?, alias? }. First alias is y unless yField is set.',
|
|
3377
|
+
items: {
|
|
3378
|
+
type: 'object',
|
|
3379
|
+
properties: {
|
|
3380
|
+
reducer: { type: 'string', enum: ['count', 'sum', 'min', 'max', 'avg'] },
|
|
3381
|
+
field: { type: 'string' },
|
|
3382
|
+
alias: { type: 'string' },
|
|
3383
|
+
},
|
|
3384
|
+
},
|
|
3385
|
+
},
|
|
3386
|
+
xField: {
|
|
3387
|
+
type: 'string',
|
|
3388
|
+
description: 'Aggregate result column for x. Defaults to the first groupBy path.',
|
|
3389
|
+
},
|
|
3390
|
+
yField: {
|
|
3391
|
+
type: 'string',
|
|
3392
|
+
description: 'Aggregate result column for y. Defaults to the first measure alias.',
|
|
3393
|
+
},
|
|
3394
|
+
seriesField: {
|
|
3395
|
+
type: 'string',
|
|
3396
|
+
description: 'Optional line-series column. Defaults to the second groupBy path when kind is line.',
|
|
3397
|
+
},
|
|
3398
|
+
valueField: {
|
|
3399
|
+
type: 'string',
|
|
3400
|
+
description: 'Heatmap numeric column. Defaults to the first measure alias.',
|
|
3401
|
+
},
|
|
3402
|
+
items: {
|
|
3403
|
+
type: 'array',
|
|
3404
|
+
description: 'Escape hatch when numbers are already in chat (no entity). Ignored when entity is set. Bar/donut/funnel: { x, y }. Line: { x, y, series? }. Heatmap: { x, y, value }. Gauge: one { y } or { value }.',
|
|
3405
|
+
items: {
|
|
3406
|
+
type: 'object',
|
|
3407
|
+
properties: {
|
|
3408
|
+
x: { description: 'Category or X value.' },
|
|
3409
|
+
y: { description: 'Numeric Y for bar/line/donut/funnel/gauge; category for heatmap.' },
|
|
3410
|
+
value: { description: 'Numeric intensity for heatmap, or gauge fallback.' },
|
|
3411
|
+
series: { type: 'string', description: 'Optional line-series name.' },
|
|
3412
|
+
},
|
|
3413
|
+
},
|
|
3414
|
+
},
|
|
3415
|
+
},
|
|
3416
|
+
required: ['kind'],
|
|
3417
|
+
};
|
|
3287
3418
|
default:
|
|
3288
3419
|
return null;
|
|
3289
3420
|
}
|
|
@@ -3613,5 +3744,5 @@ function modelItemSupportsChatCatalogPurpose(m, purpose) {
|
|
|
3613
3744
|
* Generated bundle index. Do not edit.
|
|
3614
3745
|
*/
|
|
3615
3746
|
|
|
3616
|
-
export { AI_CHAT_ATTACHMENT_CATEGORY, AI_CHAT_ATTACHMENT_REF_TYPE, AI_CHAT_GENERATED_IMAGE_REF_TYPE, AI_CHAT_GENERATED_SPEECH_REF_TYPE, AI_CHAT_TTS_PCM_SAMPLE_RATE, AI_GENERATED_IMAGE_MAX_REMOTE_URL_IN_TOOL, AXMAiAssistPromptBoxComponent, AXMAiAssistPromptBoxService, AXMAiManagementMenuProvider, AXMAiManagementModule, AXMPermissionDefinitionProvider, AXPAiAssistChatModelCatalogService, AXPAiAssistDefaultMaxStructuredRetries, AXPAiAssistDefaultStructuredMaxTokens, AXPAiAssistService, AXPAiChatToolRunContextService, AXPAiDefaultModelPickerService, AXPAiEngine, AXPAiManagerService, AXPAiOutputContractResolveService, AXPAiPlatformRuntimeContextBuilder, AXPAiStructuredOutputError,
|
|
3747
|
+
export { AI_CHAT_ATTACHMENT_CATEGORY, AI_CHAT_ATTACHMENT_REF_TYPE, AI_CHAT_GENERATED_IMAGE_REF_TYPE, AI_CHAT_GENERATED_SPEECH_REF_TYPE, AI_CHAT_TTS_PCM_SAMPLE_RATE, AI_GENERATED_IMAGE_MAX_REMOTE_URL_IN_TOOL, AXMAiAssistPromptBoxComponent, AXMAiAssistPromptBoxService, AXMAiManagementMenuProvider, AXMAiManagementModule, AXMPermissionDefinitionProvider, AXPAiAssistChatModelCatalogService, AXPAiAssistDefaultMaxStructuredRetries, AXPAiAssistDefaultStructuredMaxTokens, AXPAiAssistService, AXPAiChatToolRunContextService, AXPAiDefaultModelPickerService, AXPAiEngine, AXPAiManagerService, AXPAiOutputContractResolveService, AXPAiPlatformRuntimeContextBuilder, AXPAiStructuredOutputError, axpAiAssistInitialMessagesToTranscript, axpAiAssistStarterPromptLabels, axpAiAssistStarterPromptTexts, axpAiChatMessageIsDelegatedReflectionExcluded, axpAiChatToolOrAgentResultBodyJson, axpAiChatToolResultBodyJson, axpAiChatUserMessage, axpAiDelegatedAgentOutcomeResponsesPlainText, axpAiDelegatedAgentPromptPreview, axpAiDelegatedAgentResultSegments, axpAiStripAssistInitialHtmlToPlain, axpBuildDelegatedAgentRunInputSnapshot, axpSanitizeLastProviderPayloadForPersistence, axpStripEphemeralStreamChunksFromProviderRaw, blobOrFileFromImageResult, buildStructuredOutputRetryUserText, createBrowserPlayableTtsBlobUrl, extractLastAssistantStructuredParts, getAiChatCommandLlmParametersOverride, isRawPcmMimeType, loadAssistPermissionRows, persistAiChatAttachmentImage, persistAiGeneratedImage, persistAiGeneratedSpeech, prepareTtsBytesForBrowserPlayback, validateAgainstContract, validateJsonSchemaMini, validateStructuredAssistantResponse, wrapPcm16LeInWav };
|
|
3617
3748
|
//# sourceMappingURL=acorex-platform-module-ai-management-client.mjs.map
|