@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.
Files changed (55) hide show
  1. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-agent.mjs +30 -0
  2. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-agent.mjs.map +1 -1
  3. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-assist.mjs +16 -0
  4. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-assist.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-mcp-server.mjs +30 -0
  6. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-mcp-server.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-model.mjs +52 -15
  8. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-model.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-open-ai-endpoint.mjs +30 -0
  10. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-open-ai-endpoint.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-rule.mjs +30 -0
  12. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-rule.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-run-log.mjs +430 -0
  14. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-run-log.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-skill.mjs +30 -0
  16. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entities-skill.mjs.map +1 -1
  17. 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
  18. 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
  19. 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
  20. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-agent.entity-Dj7dZRjE.mjs.map +1 -0
  21. 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
  22. 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
  23. 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
  24. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-mcp-server.entity-BVI_7IhH.mjs.map +1 -0
  25. 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
  26. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-model.entity-Xd45s9xE.mjs.map +1 -0
  27. 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
  28. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-open-ai-endpoint.entity-CWsUMad_.mjs.map +1 -0
  29. 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
  30. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-rule.entity-Z6wYZrFU.mjs.map +1 -0
  31. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-run-log.entity-B2PG0QN0.mjs +343 -0
  32. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-run-log.entity-B2PG0QN0.mjs.map +1 -0
  33. 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
  34. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-skill.entity-sNsPtjnT.mjs.map +1 -0
  35. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog.mjs +1 -1
  36. package/fesm2022/acorex-platform-module-ai-management-client-contracts.mjs +598 -526
  37. package/fesm2022/acorex-platform-module-ai-management-client-contracts.mjs.map +1 -1
  38. 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
  39. package/fesm2022/acorex-platform-module-ai-management-client-list-ai-query-registry-catalog.query-BxL3pxzj.mjs.map +1 -0
  40. package/fesm2022/acorex-platform-module-ai-management-client-local-entities.mjs +1 -0
  41. package/fesm2022/acorex-platform-module-ai-management-client-local-entities.mjs.map +1 -1
  42. package/fesm2022/acorex-platform-module-ai-management-client.mjs +240 -109
  43. package/fesm2022/acorex-platform-module-ai-management-client.mjs.map +1 -1
  44. package/package.json +5 -1
  45. package/types/acorex-platform-module-ai-management-client-contracts-entities-run-log.d.ts +5 -0
  46. package/types/acorex-platform-module-ai-management-client-contracts.d.ts +149 -85
  47. package/types/acorex-platform-module-ai-management-client.d.ts +24 -18
  48. 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
  49. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-agent.entity-C75X-uZh.mjs.map +0 -1
  50. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-mcp-server.entity-UxFvQ92v.mjs.map +0 -1
  51. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-model.entity-DEdFUAPx.mjs.map +0 -1
  52. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-open-ai-endpoint.entity-CygH9dU_.mjs.map +0 -1
  53. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-rule.entity-Ddul_n4_.mjs.map +0 -1
  54. package/fesm2022/acorex-platform-module-ai-management-client-contracts-entity-catalog-skill.entity-CeMnKpRg.mjs.map +0 -1
  55. 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, AXP_MODULE_MANIFEST_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, AXP_TAG_PROVIDER, AXP_CONTEXT_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/core';
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 { RootConfig, AXPAiManagementFeatureKeys, AXPAdministrationPermissionKeys, AXPAiManagementMenuKeys, AXMAiAssistPermissionKeys, AXPAiManagementSettings, isChatPurposeModelRow, readModelPurposes } from '@acorex-platform/module-ai-management-client/contracts';
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 { AXLoadingDialogService } from '@acorex/components/loading-dialog';
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 = 128_000;
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.busy = signal(false, /* @ts-ignore */
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.busy() || this.isComposerSaving()) {
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.busy()) {
948
+ if (this.runPhase() !== 'idle') {
898
949
  return;
899
950
  }
900
951
  this.onCancel();
901
952
  }
902
953
  /**
903
- * Dismisses the prompt box like Cancel (disabled while a run is in flight, same as footer Cancel).
954
+ * Idle: close. Running: Stop (stay open). Stopping: ignore.
904
955
  */
905
956
  onDocumentEscape() {
906
- if (!isPlatformBrowser(this.platformId) || this.busy()) {
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
- this.busy.set(true);
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.busy.set(false);
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.settle(result);
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: true,
1398
- closeOnOutsideClick: true,
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.settle(null);
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
- const result = await params.executeRun(messages);
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 runLoadingSpec = options.runLoadingDialog;
2555
- const data = await this.assistPromptBox.open(options, async (payload) => {
2556
- let progressDialog;
2557
- if (runLoadingSpec) {
2558
- progressDialog = this.loadingDialog.show({
2559
- title: runLoadingSpec.title,
2560
- mode: 'indeterminate',
2561
- progressColor: 'primary',
2562
- text: runLoadingSpec.text,
2563
- });
2564
- }
2565
- try {
2566
- return await this.run({
2567
- prompt: payload.prompt,
2568
- userMediaAttachments: payload.userMediaAttachments.length > 0 ? payload.userMediaAttachments : undefined,
2569
- context: options.context,
2570
- assistId: payload.assistId,
2571
- maxSteps: options.maxSteps,
2572
- temperature: options.temperature,
2573
- maxTokens: options.maxTokens,
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-BX0uU1YX.mjs').then((c) => c.AXMListAiQueryRegistryCatalogQuery),
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-BX0uU1YX.mjs').then((c) => c.AXMListAiQueryRegistryCatalogQuery),
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 google/gemini-3.1-flash-tts-preview.',
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. Gemini default row: Zephyr, Puck, Charon, Kore, Fenrir, Leda, Orus, Aoede. Omit to use options.voice or Zephyr.',
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, AiManagementManifest, 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 };
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