@acorex-platform/extension-ai-document-client 0.0.53 → 0.0.56

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.
@@ -12,6 +12,7 @@ import { AXDialogService } from '@acorex/components/dialog';
12
12
  import { AXLoadingDialogService } from '@acorex/components/loading-dialog';
13
13
  import { AXTranslationService } from '@acorex/core/translation';
14
14
  import { AXPCommandService } from '@acorex-platform/framework-client/runtime';
15
+ import { resolveMetaDataFieldAppliesTo } from '@acorex-platform/module-data-management-client/contracts';
15
16
 
16
17
  //#region ---- Imports ----
17
18
  //#endregion
@@ -97,6 +98,9 @@ function collectMetadataFieldDescriptors(meta) {
97
98
  const out = [];
98
99
  for (const g of meta.groups) {
99
100
  for (const f of g.fields ?? []) {
101
+ if (resolveMetaDataFieldAppliesTo(f) === 'folder') {
102
+ continue;
103
+ }
100
104
  out.push({
101
105
  name: f.name,
102
106
  title: f.title ?? f.name,
@@ -120,7 +124,7 @@ function withDocumentExpirationField(fields, include) {
120
124
  ...fields,
121
125
  {
122
126
  name: DOCUMENT_EXPIRATION_DATE_FIELD_NAME,
123
- title: 'Expire Date',
127
+ title: '@extensions-ai-document:fields.expire-date.title',
124
128
  interfaceType: 'date-time-editor',
125
129
  },
126
130
  ];
@@ -481,13 +485,13 @@ class AXEDocumentMetadataAiPrefillService {
481
485
  message: info?.message,
482
486
  details: info?.details,
483
487
  }));
484
- if (this.debug.isDebugMode() && details) {
485
- return new Error(details);
486
- }
487
488
  const text = typeof info?.message === 'string' ? info.message.trim() : '';
488
489
  if (text.startsWith('@')) {
489
490
  return new Error(text);
490
491
  }
492
+ if (this.debug.isDebugMode() && details) {
493
+ return new Error(details);
494
+ }
491
495
  return new Error(OCR_FAILED_I18N);
492
496
  }
493
497
  resolveFileForUpload(item) {
@@ -732,6 +736,7 @@ function extractableAttachmentSlotsSignature(context) {
732
736
  * When document extraction is enabled and the attachment dialog has metadata + extractable files, prompts the user
733
737
  * after files appear. Yes → loading dialog + AI prefill; No → leave metadata form empty for manual entry.
734
738
  * Dedupes by attachment-slot signature so field edits do not re-prompt.
739
+ * Properties (`skipMetadataAiFill`) skips this prompt so existing metadata is not overwritten.
735
740
  */
736
741
  const AXEDocumentLayoutBuilderDialogContextChangedHookProvider = {
737
742
  key: AXP_LAYOUT_BUILDER_DIALOG_CONTEXT_CHANGED_HOOK_KEY,
@@ -741,6 +746,9 @@ const AXEDocumentLayoutBuilderDialogContextChangedHookProvider = {
741
746
  if (!isDocumentAttachmentDialogIntegration(integration)) {
742
747
  return data;
743
748
  }
749
+ if (integration['skipMetadataAiFill'] === true) {
750
+ return data;
751
+ }
744
752
  const prefill = inject(AXEDocumentMetadataAiPrefillService);
745
753
  const orchestrator = inject(AXEDocumentMetadataAiFillOrchestrator);
746
754
  if (!(await prefill.isMetadataOcrEnabled())) {
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-extension-ai-document-client.mjs","sources":["../../../../libs/extensions/ai/document/client/src/lib/document-metadata-ocr.settings.provider.ts","../../../../libs/extensions/ai/document/client/src/lib/document-metadata-schema.util.ts","../../../../libs/extensions/ai/document/client/src/lib/document-metadata-ai-prefill.service.ts","../../../../libs/extensions/ai/document/client/src/lib/document-metadata-ai-fill.orchestrator.ts","../../../../libs/extensions/ai/document/client/src/lib/document-layout-builder-dialog-context-changed.hook.ts","../../../../libs/extensions/ai/document/client/src/lib/ai-document-extension.module.ts","../../../../libs/extensions/ai/document/client/src/lib/document-attachment-dialog.hooks.ts","../../../../libs/extensions/ai/document/client/src/acorex-platform-extension-ai-document-client.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { RootConfig } from '@acorex-platform/module-ai-management-client/contracts';\nimport { AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '@acorex-platform/framework-client/common';\nimport { objectKeyValueTransforms } from '@acorex-platform/framework-client/core';\nimport { AXPWidgetsCatalog } from '@acorex-platform/framework-shared/core';\nimport { Injectable } from '@angular/core';\nimport { AXEDocumentMetadataOcrSettings } from '@acorex-platform/extension-ai-document-client/contracts';\n\n//#endregion\n\n//#region ---- Settings provider ----\n\nconst METADATA_OCR_I18N = '@extensions-ai-document:settings.metadata-ocr';\n\n/** Intelligence group created by `AXMAiManagementSettingProvider`. Module AI settings attach here. */\nconst AI_SETTINGS_GROUP = 'ai-settings';\n\n@Injectable()\nexport class AXEDocumentAiSettingProvider implements AXPSettingDefinitionProvider {\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n if (!context.hasGroup(AI_SETTINGS_GROUP)) {\n return;\n }\n\n const assistVisibility = `{{ context.eval('${AXEDocumentMetadataOcrSettings.Enabled}') }}`;\n\n const intelligence = context.group(AI_SETTINGS_GROUP);\n if (!intelligence) {\n return;\n }\n\n intelligence\n .addSection('metadata-ocr', `${METADATA_OCR_I18N}.section-title`, `${METADATA_OCR_I18N}.section-description`)\n .addSetting({\n key: AXEDocumentMetadataOcrSettings.Enabled,\n title: `${METADATA_OCR_I18N}.enabled-title`,\n scope: 'T',\n overridableAt: [],\n isInherited: true,\n defaultValue: true,\n searchTagKeys: [`${METADATA_OCR_I18N}.enabled-search-tags`],\n widget: {\n type: AXPWidgetsCatalog.toggle,\n },\n description: `${METADATA_OCR_I18N}.enabled-description`,\n })\n .addSetting({\n key: AXEDocumentMetadataOcrSettings.AssistId,\n title: `${METADATA_OCR_I18N}.assist-id-title`,\n scope: 'T',\n overridableAt: [],\n isInherited: true,\n // Persist assist primary key (`id`); demo defaults come from settings seed/overrides.\n searchTagKeys: [`${METADATA_OCR_I18N}.assist-search-tags`],\n valueTransforms: objectKeyValueTransforms('id'),\n widget: {\n type: AXPWidgetsCatalog.lookup,\n options: {\n entity: `${RootConfig.module.name}.${RootConfig.entities.assist.name}`,\n look: 'select',\n multiple: false,\n textField: 'title',\n valueField: 'id',\n hasClearButton: true,\n visibility: assistVisibility,\n },\n },\n description: `${METADATA_OCR_I18N}.assist-id-description`,\n })\n .endSection();\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXMMetaDataBuilderValue, AXMMetaDataLocalizedString } from '@acorex-platform/module-data-management-client/contracts';\nimport { canAiExtractDocument } from '@acorex-platform/module-ai-management-client/contracts';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface DocumentMetadataFieldDescriptor {\n name: string;\n title: AXMMetaDataLocalizedString;\n interfaceType: string;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\n/**\n * Synthetic mapping key for the document-level Expire Date control\n * (`file-*.expirationDate` when the document type has `enableExpiration`).\n * Not part of `metaDataForm`.\n */\nexport const DOCUMENT_EXPIRATION_DATE_FIELD_NAME = 'expirationDate';\n\n//#endregion\n\n//#region ---- Field collection ----\n\n/**\n * Flattens metadata selector value into field descriptors for LLM mapping prompts.\n */\nexport function collectMetadataFieldDescriptors(\n meta: AXMMetaDataBuilderValue | undefined | null,\n): DocumentMetadataFieldDescriptor[] {\n if (!meta?.groups?.length) {\n return [];\n }\n const out: DocumentMetadataFieldDescriptor[] = [];\n for (const g of meta.groups) {\n for (const f of g.fields ?? []) {\n out.push({\n name: f.name,\n title: f.title ?? f.name,\n interfaceType: f.interface,\n });\n }\n }\n return out;\n}\n\n/**\n * Appends the platform document expire-date field used by attachment dialogs.\n */\nexport function withDocumentExpirationField(\n fields: DocumentMetadataFieldDescriptor[],\n include: boolean,\n): DocumentMetadataFieldDescriptor[] {\n if (!include) {\n return fields;\n }\n if (fields.some((f) => f.name === DOCUMENT_EXPIRATION_DATE_FIELD_NAME)) {\n return fields;\n }\n return [\n ...fields,\n {\n name: DOCUMENT_EXPIRATION_DATE_FIELD_NAME,\n title: 'Expire Date',\n interfaceType: 'date-time-editor',\n },\n ];\n}\n\n//#endregion\n\n//#region ---- JSON parsing ----\n\n/**\n * Coerces common OCR / LLM date strings into YYYY-MM-DD (or leaves non-dates unchanged).\n */\nexport function normalizePrefillDateValue(value: unknown): unknown {\n if (value == null || value === '') {\n return value;\n }\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n return toIsoDateOnly(value);\n }\n if (typeof value !== 'string') {\n return value;\n }\n const raw = value.trim();\n if (!raw) {\n return value;\n }\n\n const iso = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(raw);\n if (iso) {\n return `${iso[1]}-${iso[2]}-${iso[3]}`;\n }\n\n // US-style MM/DD/YYYY (common on driver licences).\n const us = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/.exec(raw);\n if (us) {\n const month = Number(us[1]);\n const day = Number(us[2]);\n const year = Number(us[3]);\n if (month >= 1 && month <= 12 && day >= 1 && day <= 31) {\n return `${year}-${pad2(month)}-${pad2(day)}`;\n }\n }\n\n const parsed = new Date(raw);\n if (!Number.isNaN(parsed.getTime())) {\n return toIsoDateOnly(parsed);\n }\n return value;\n}\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nfunction toIsoDateOnly(d: Date): string {\n return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\n/**\n * Normalizes date-like mapped values for date widgets; strips the synthetic expiration key from meta.\n */\nexport function splitMappedPrefill(\n parsed: Record<string, unknown>,\n fields: DocumentMetadataFieldDescriptor[],\n): { meta: Record<string, unknown>; expirationDate?: string } {\n const dateNames = new Set(\n fields\n .filter((f) => {\n const t = String(f.interfaceType ?? '').toLowerCase();\n return t.includes('date-time') || t.includes('date');\n })\n .map((f) => f.name),\n );\n\n const meta: Record<string, unknown> = {};\n let expirationDate: string | undefined;\n\n for (const [k, v] of Object.entries(parsed)) {\n const normalized = dateNames.has(k) ? normalizePrefillDateValue(v) : v;\n if (k === DOCUMENT_EXPIRATION_DATE_FIELD_NAME) {\n if (typeof normalized === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(normalized)) {\n expirationDate = normalized;\n } else if (normalized instanceof Date && !Number.isNaN(normalized.getTime())) {\n expirationDate = toIsoDateOnly(normalized);\n }\n continue;\n }\n meta[k] = normalized;\n }\n\n return expirationDate ? { meta, expirationDate } : { meta };\n}\n\n/**\n * Parses a JSON object from an assistant reply (strips optional ```json fences).\n */\nexport function parseMetadataMappingJson(text: string): Record<string, unknown> {\n const trimmed = text.trim();\n const fence = /^```(?:json)?\\s*([\\s\\S]*?)```$/m.exec(trimmed);\n const raw = fence ? fence[1]!.trim() : trimmed;\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (parsed != null && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // ignore\n }\n return {};\n}\n\n/**\n * Shallow merge: only fills keys that are empty in `existing`.\n */\nexport function mergeMetadataPrefill(\n existing: Record<string, unknown> | undefined,\n partial: Record<string, unknown>,\n): Record<string, unknown> {\n const base = { ...(existing ?? {}) };\n for (const [k, v] of Object.entries(partial)) {\n const cur = base[k];\n const empty = cur === undefined || cur === null || cur === '';\n if (empty && v !== undefined && v !== null && v !== '') {\n base[k] = v;\n }\n }\n return base;\n}\n\n//#endregion\n\n//#region ---- File kind ----\n\ntype FileListItemLike = {\n name?: string;\n type?: string;\n source?: { kind?: string; value?: unknown };\n};\n\n/**\n * Returns true when the file list item is supported for AI document text extraction.\n */\nexport function isAiExtractableFileListItem(item: FileListItemLike | undefined): boolean {\n if (!item) {\n return false;\n }\n const t = typeof item.type === 'string' ? item.type : '';\n const name = String(item.name ?? '');\n if (canAiExtractDocument(t, name)) {\n return true;\n }\n const src = item.source?.value;\n if (src instanceof Blob) {\n const blobType = typeof src.type === 'string' ? src.type : '';\n if (canAiExtractDocument(blobType, name)) {\n return true;\n }\n }\n if (src instanceof File) {\n if (canAiExtractDocument(src.type, src.name || name)) {\n return true;\n }\n }\n return false;\n}\n\n//#endregion\n","//#region ----- Imports -----\r\n\r\nimport { AXPFileListItem, AXPFileStorageStatus, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\r\nimport {\r\n AIMANAGEMENT_EXTRACT_DOCUMENT_TEXT_COMMAND_KEY,\r\n} from '@acorex-platform/module-ai-management-client/contracts';\r\nimport type { AXMMetaDataBuilderValue } from '@acorex-platform/module-data-management-client/contracts';\r\n\r\nimport {\r\n AXPDebugService,\r\n AXPFileStorageService,\r\n AXPSettingsService,\r\n extractRequestErrorInfo,\r\n} from '@acorex-platform/framework-client/common';\r\n\r\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { AXEDocumentMetadataOcrSettings } from '@acorex-platform/extension-ai-document-client/contracts';\r\nimport {\r\n collectMetadataFieldDescriptors,\r\n isAiExtractableFileListItem,\r\n mergeMetadataPrefill,\r\n parseMetadataMappingJson,\r\n splitMappedPrefill,\r\n withDocumentExpirationField,\r\n} from './document-metadata-schema.util';\r\n\r\n/** Payload shape for ExtractDocumentText command `data`. */\r\ntype AiExtractCommandData = { text?: string; values?: Record<string, unknown> };\r\n\r\n//#endregion\r\n\r\n//#region ----- Constants -----\r\n\r\nconst DOCUMENT_MODULE_REF_TYPE = 'DocumentManagement.Document';\r\n\r\nconst SINGLE_DOCUMENT_PROGRESS_SCOPE = { documentIndex: 1, documentCount: 1 } as const;\r\n\r\n/** Phases surfaced to UI (loading dialog thinking text). */\r\nexport type AXEDocumentMetadataAiPrefillPhase =\r\n | 'preparing'\r\n | 'uploading'\r\n | 'extracting';\r\n\r\n/** Progress event for optional UI updates during metadata AI fill. */\r\nexport interface AXEDocumentMetadataAiPrefillProgressEvent {\r\n phase: AXEDocumentMetadataAiPrefillPhase;\r\n /** 1-based slot among documents processed in this run. */\r\n documentIndex: number;\r\n /** Total extractable document slots queued in this run. */\r\n documentCount: number;\r\n}\r\n\r\n//#endregion\r\n\r\n//#region ----- Local helpers -----\r\n\r\nconst OCR_FAILED_I18N = '@extensions-ai-document:widgets.metadata-ai-fill.ocr-failed';\r\n\r\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n}\r\n\r\nfunction stringifyErrorDetails(details: unknown): string {\r\n if (typeof details === 'string' && details.trim()) {\r\n return details.trim();\r\n }\r\n if (details == null) {\r\n return '';\r\n }\r\n try {\r\n return JSON.stringify(details);\r\n } catch {\r\n return String(details);\r\n }\r\n}\r\n\r\n//#endregion\r\n\r\n//#region ----- Service -----\r\n\r\n/**\r\n * Runs AI document text extraction for metadata prefill (images, PDF, simple text files).\r\n * ExtractDocumentText command; when field names are passed it returns a key/value object.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class AXEDocumentMetadataAiPrefillService {\r\n //#region ----- Services & Dependencies -----\r\n\r\n private readonly fileStorage = inject(AXPFileStorageService);\r\n private readonly commandService = inject(AXPCommandService);\r\n private readonly settings = inject(AXPSettingsService);\r\n private readonly debug = inject(AXPDebugService);\r\n\r\n //#endregion\r\n\r\n /**\r\n * Whether OCR metadata prefill is enabled in tenant settings.\r\n * Defaults to true when the setting has never been stored (opt-out via settings UI).\r\n */\r\n async isMetadataOcrEnabled(): Promise<boolean> {\r\n const v = await this.settings.get<boolean>(AXEDocumentMetadataOcrSettings.Enabled);\r\n if (v == null) {\r\n return true;\r\n }\r\n return v;\r\n }\r\n\r\n /**\r\n * Whether {@link applyDialogContextMetadataAiFillFromDocuments} would extract at least one document\r\n * (caller can safely show an indeterminate loading dialog).\r\n */\r\n willApplyMetadataAiFillFromDocuments(\r\n dialogRef: {\r\n context: () => Record<string, unknown>;\r\n patchContext?: (partial: Record<string, unknown>) => void;\r\n },\r\n integration: Record<string, unknown>,\r\n ): boolean {\r\n if (!dialogRef.patchContext) {\r\n return false;\r\n }\r\n const documentType = integration['documentType'] as {\r\n metaDataList?: AXMMetaDataBuilderValue | null;\r\n enableExpiration?: boolean;\r\n } | undefined;\r\n const metaDataList = documentType?.metaDataList;\r\n const fields = withDocumentExpirationField(\r\n collectMetadataFieldDescriptors(metaDataList ?? undefined),\r\n !!documentType?.enableExpiration,\r\n );\r\n if (fields.length === 0) {\r\n return false;\r\n }\r\n const ctx = dialogRef.context();\r\n const files = ctx['files'] as Array<{ file?: unknown[] }> | undefined;\r\n const n = files?.length ?? 0;\r\n for (let i = 0; i < n; i++) {\r\n const slot = files![i]?.file;\r\n const first = Array.isArray(slot) ? (slot[0] as (AXPFileListItem & { type?: string }) | undefined) : undefined;\r\n if (first && isAiExtractableFileListItem(first)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Uploads a blob-backed file item to storage for vision APIs that require {@link fileId}.\r\n */\r\n async ensureStoredFileId(fileItem: AXPFileListItem & { type?: string }, folderId: string): Promise<string | null> {\r\n // Only trust an explicit storage fileId. Chooser items use a client UUID on `id` with `source.kind === 'blob'`.\r\n if (fileItem.source?.kind === 'fileId' && typeof fileItem.source.value === 'string') {\r\n const storedId = fileItem.source.value.trim();\r\n if (storedId) {\r\n return storedId;\r\n }\r\n }\r\n\r\n const file = this.resolveFileForUpload(fileItem);\r\n if (!file) {\r\n return null;\r\n }\r\n\r\n const refId = folderId?.trim() || 'document-metadata-ocr-prefill';\r\n const saved = await this.fileStorage.save({\r\n file,\r\n name: fileItem.name,\r\n refId,\r\n refType: DOCUMENT_MODULE_REF_TYPE,\r\n category: 'document',\r\n status: AXPFileStorageStatus.Temporary,\r\n });\r\n return saved.fileId?.trim() || null;\r\n }\r\n\r\n /**\r\n * OCR + field extraction in one vision call; returns merged metadata (only fills empty keys in {@link existingMeta}).\r\n */\r\n async prefillFromDocumentExtract(options: {\r\n fileItem: AXPFileListItem & { type?: string };\r\n folderId: string;\r\n metaDataList: AXMMetaDataBuilderValue | undefined | null;\r\n existingMeta: Record<string, unknown> | undefined;\r\n /** When true, also map OCR EXP/expiry into document `expirationDate`. */\r\n includeDocumentExpiration?: boolean;\r\n existingExpirationDate?: unknown;\r\n /** When set with {@link signalProgress}, scopes step copy to multi-document dialogs. */\r\n progressScope?: { documentIndex: number; documentCount: number };\r\n /** When aborted, throws {@link DOMException} with name `AbortError`. */\r\n signal?: AbortSignal;\r\n /** Optional UI wiring (loading dialog thinking lines). */\r\n signalProgress?: (event: AXEDocumentMetadataAiPrefillProgressEvent) => void;\r\n }): Promise<{ extractText: string; merged: Record<string, unknown>; expirationDate?: string }> {\r\n const signal = options.signal;\r\n const notify = (\r\n phase: AXEDocumentMetadataAiPrefillPhase,\r\n scope: { documentIndex: number; documentCount: number } = options.progressScope ??\r\n SINGLE_DOCUMENT_PROGRESS_SCOPE,\r\n ) => options.signalProgress?.({ phase, ...scope });\r\n\r\n throwIfAborted(signal);\r\n\r\n const fields = withDocumentExpirationField(\r\n collectMetadataFieldDescriptors(options.metaDataList ?? undefined),\r\n !!options.includeDocumentExpiration,\r\n );\r\n if (fields.length === 0) {\r\n return { extractText: '', merged: { ...(options.existingMeta ?? {}) } };\r\n }\r\n\r\n notify('uploading');\r\n const fileId = await this.ensureStoredFileId(options.fileItem, options.folderId);\r\n throwIfAborted(signal);\r\n if (!fileId) {\r\n throw new Error('Could not upload the file for document extraction.');\r\n }\r\n\r\n notify('extracting');\r\n const extractResult = await this.commandService.execute(AIMANAGEMENT_EXTRACT_DOCUMENT_TEXT_COMMAND_KEY, {\r\n fileId,\r\n fields: fields.map((field) => field.name),\r\n });\r\n throwIfAborted(signal);\r\n if (extractResult?.success === false) {\r\n throw this.extractCommandFailure(extractResult);\r\n }\r\n const extractData = runtimeCommandPayloadData(extractResult) as AiExtractCommandData | undefined;\r\n const extractText = typeof extractData?.text === 'string' ? extractData.text : '';\r\n const parsed =\r\n extractData?.values && typeof extractData.values === 'object' && !Array.isArray(extractData.values)\r\n ? extractData.values\r\n : parseMetadataMappingJson(extractText);\r\n if (Object.keys(parsed).length === 0 && !extractText.trim()) {\r\n throw this.extractCommandFailure(extractResult);\r\n }\r\n const { meta, expirationDate } = splitMappedPrefill(parsed, fields);\r\n const merged = mergeMetadataPrefill(options.existingMeta, meta);\r\n\r\n const existingExpEmpty =\r\n options.existingExpirationDate === undefined ||\r\n options.existingExpirationDate === null ||\r\n options.existingExpirationDate === '';\r\n return {\r\n extractText,\r\n merged,\r\n ...(existingExpEmpty && expirationDate ? { expirationDate } : {}),\r\n };\r\n }\r\n\r\n /**\r\n * For each extractable document slot in `context.files`, merges extraction + AI metadata into `file-{i}.metaDataForm`.\r\n */\r\n async applyDialogContextMetadataAiFillFromDocuments(\r\n dialogRef: {\r\n context: () => Record<string, unknown>;\r\n patchContext?: (partial: Record<string, unknown>) => void;\r\n },\r\n integration: Record<string, unknown>,\r\n options?: {\r\n signal?: AbortSignal;\r\n signalProgress?: (event: AXEDocumentMetadataAiPrefillProgressEvent) => void;\r\n },\r\n ): Promise<void> {\r\n if (!dialogRef.patchContext) {\r\n return;\r\n }\r\n const folderId = String(integration['parentId'] ?? '').trim();\r\n const documentType = integration['documentType'] as {\r\n metaDataList?: AXMMetaDataBuilderValue | null;\r\n enableExpiration?: boolean;\r\n } | undefined;\r\n const metaDataList = documentType?.metaDataList;\r\n const includeDocumentExpiration = !!documentType?.enableExpiration;\r\n const ctx = dialogRef.context();\r\n const files = ctx['files'] as Array<{ file?: unknown[] }> | undefined;\r\n const n = files?.length ?? 0;\r\n const patch: Record<string, unknown> = {};\r\n\r\n const documentIndices: number[] = [];\r\n for (let i = 0; i < n; i++) {\r\n const slot = files![i]?.file;\r\n const first = Array.isArray(slot) ? (slot[0] as (AXPFileListItem & { type?: string }) | undefined) : undefined;\r\n if (first && isAiExtractableFileListItem(first)) {\r\n documentIndices.push(i);\r\n }\r\n }\r\n const signal = options?.signal;\r\n const documentCount = documentIndices.length;\r\n if (documentCount > 0) {\r\n options?.signalProgress?.({\r\n phase: 'preparing',\r\n documentIndex: 1,\r\n documentCount,\r\n });\r\n throwIfAborted(signal);\r\n }\r\n\r\n let processed = 0;\r\n for (const i of documentIndices) {\r\n throwIfAborted(signal);\r\n processed += 1;\r\n const slot = files![i]?.file;\r\n const first = Array.isArray(slot) ? (slot[0] as (AXPFileListItem & { type?: string }) | undefined) : undefined;\r\n if (!first) {\r\n continue;\r\n }\r\n const fileBlock = ctx[`file-${i}`] as Record<string, unknown> | undefined;\r\n const existingMeta = fileBlock?.['metaDataForm'] as Record<string, unknown> | undefined;\r\n const { merged, expirationDate } = await this.prefillFromDocumentExtract({\r\n fileItem: first,\r\n folderId,\r\n metaDataList,\r\n existingMeta,\r\n includeDocumentExpiration,\r\n existingExpirationDate: fileBlock?.['expirationDate'],\r\n progressScope: { documentIndex: processed, documentCount },\r\n signal,\r\n signalProgress: options?.signalProgress,\r\n });\r\n patch[`file-${i}`] = {\r\n ...(typeof fileBlock === 'object' && fileBlock ? fileBlock : {}),\r\n metaDataForm: merged,\r\n ...(expirationDate ? { expirationDate } : {}),\r\n };\r\n }\r\n\r\n if (Object.keys(patch).length > 0) {\r\n dialogRef.patchContext(patch);\r\n }\r\n }\r\n\r\n //#region ----- Utility Methods -----\r\n\r\n private extractCommandFailure(extractResult: unknown): Error {\r\n const info = extractRequestErrorInfo(extractResult);\r\n const details = stringifyErrorDetails(info?.details);\r\n this.debug.error('ai-document', 'extract-document-text', 'ExtractDocumentText failed', () => ({\r\n message: info?.message,\r\n details: info?.details,\r\n }));\r\n if (this.debug.isDebugMode() && details) {\r\n return new Error(details);\r\n }\r\n const text = typeof info?.message === 'string' ? info.message.trim() : '';\r\n if (text.startsWith('@')) {\r\n return new Error(text);\r\n }\r\n return new Error(OCR_FAILED_I18N);\r\n }\r\n\r\n private resolveFileForUpload(item: AXPFileListItem & { type?: string }): File | null {\r\n const v = item.source?.value;\r\n if (v instanceof File) {\r\n return v;\r\n }\r\n if (item.source?.kind === 'blob' && v instanceof Blob) {\r\n return new File([v], item.name, { type: item.type ?? v.type ?? 'application/octet-stream' });\r\n }\r\n return null;\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\n//#endregion\r\n","//#region ---- Imports ----\n\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXLoadingDialogService } from '@acorex/components/loading-dialog';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPDebugService } from '@acorex-platform/framework-client/common';\nimport { Injectable, inject } from '@angular/core';\nimport {\n AXEDocumentMetadataAiPrefillProgressEvent,\n AXEDocumentMetadataAiPrefillService,\n} from './document-metadata-ai-prefill.service';\n\n//#endregion\n\n//#region ---- Types ----\n\n/** Dialog surface that supports context patch (layout attachment dialog). */\nexport interface AXEDocumentMetadataAiFillDialogTarget {\n context: () => Record<string, unknown>;\n patchContext?: (partial: Record<string, unknown>) => void;\n}\n\nexport interface AXEDocumentMetadataAiFillRunResult {\n success: boolean;\n errorMessage?: string;\n /** User chose Skip on the loading dialog; treat as neutral (no failure toast) where applicable. */\n cancelled?: boolean;\n /** User declined OCR on the confirm dialog. */\n declined?: boolean;\n}\n\ntype MetadataAiProgressColor = 'primary' | 'danger' | 'success';\n\n/** Indeterminate loading dialog surface (see {@link AXLoadingDialogService.show}). */\ninterface MetadataAiLoadingDialogRef {\n close: () => void;\n setProgressText: (text: string) => void;\n setProgressColor: (color: MetadataAiProgressColor) => void;\n}\n\n//#endregion\n\nconst METADATA_AI_CONFIRM_I18N = '@extensions-ai-document:widgets.metadata-ai-fill.confirm';\nconst METADATA_AI_LOADING_I18N = '@extensions-ai-document:widgets.metadata-ai-fill.loading';\n\n/** Smoother dismiss after work completes. */\nconst LOADING_DIALOG_CLOSE_DELAY_MS = 400;\n\n//#region ---- Orchestrator ----\n\n/**\n * Shared OCR + AI metadata prefill UX: confirm after image choose, then indeterminate loading dialog.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXEDocumentMetadataAiFillOrchestrator {\n //#region ---- Dependencies ----\n\n private readonly prefill = inject(AXEDocumentMetadataAiPrefillService);\n private readonly dialogService = inject(AXDialogService);\n private readonly loadingDialog = inject(AXLoadingDialogService);\n private readonly translation = inject(AXTranslationService);\n private readonly debug = inject(AXPDebugService);\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Asks whether to run OCR; on Yes runs {@link run}, on No returns {@link AXEDocumentMetadataAiFillRunResult.declined}.\n */\n async confirmAndRun(\n dialogTarget: AXEDocumentMetadataAiFillDialogTarget,\n integration: Record<string, unknown>,\n ): Promise<AXEDocumentMetadataAiFillRunResult> {\n if (!this.prefill.willApplyMetadataAiFillFromDocuments(dialogTarget, integration)) {\n return { success: true };\n }\n\n const [title, message] = await Promise.all([\n this.translation.translateAsync(`${METADATA_AI_CONFIRM_I18N}.title`),\n this.translation.translateAsync(`${METADATA_AI_CONFIRM_I18N}.message`),\n ]);\n const dialogResult = await this.dialogService.confirm(title, message, 'primary', 'horizontal', false, 'cancel');\n if (!dialogResult.result) {\n return { success: true, declined: true };\n }\n\n return this.run(dialogTarget, integration);\n }\n\n /**\n * Runs metadata AI fill when eligible; shows an indeterminate loading dialog while work is in progress.\n */\n async run(\n dialogTarget: AXEDocumentMetadataAiFillDialogTarget,\n integration: Record<string, unknown>,\n ): Promise<AXEDocumentMetadataAiFillRunResult> {\n const showLoading = this.prefill.willApplyMetadataAiFillFromDocuments(dialogTarget, integration);\n\n const abortController = new AbortController();\n let loadingDismissedEarly = false;\n\n let progressDialog: MetadataAiLoadingDialogRef | undefined;\n\n if (showLoading) {\n const [title, initial, skipLabel] = await Promise.all([\n this.translation.translateAsync(`${METADATA_AI_LOADING_I18N}.title`),\n this.translation.translateAsync(`${METADATA_AI_LOADING_I18N}.initial`),\n this.translation.translateAsync(`${METADATA_AI_LOADING_I18N}.skip-button`),\n ]);\n progressDialog = this.loadingDialog.show({\n title,\n mode: 'indeterminate',\n progressColor: 'primary',\n text: initial,\n buttons: [\n {\n text: skipLabel,\n onClick: () => {\n loadingDismissedEarly = true;\n abortController.abort();\n progressDialog?.close();\n },\n },\n ],\n }) as MetadataAiLoadingDialogRef;\n }\n\n try {\n await this.prefill.applyDialogContextMetadataAiFillFromDocuments(dialogTarget, integration, {\n signal: showLoading ? abortController.signal : undefined,\n signalProgress: (event) => {\n if (!progressDialog) {\n return;\n }\n void this.applyProgressText(progressDialog, event);\n },\n });\n if (progressDialog && !loadingDismissedEarly) {\n await this.markProgressComplete(progressDialog);\n }\n return { success: true };\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return { success: false, cancelled: true };\n }\n const errorMessage = await this.resolveFailureMessage(err);\n if (progressDialog && !loadingDismissedEarly) {\n try {\n progressDialog.setProgressColor('danger');\n progressDialog.setProgressText(errorMessage);\n } catch {\n // Ignore dialog update failures.\n }\n }\n if (this.debug.isDebugMode() && progressDialog && !loadingDismissedEarly) {\n loadingDismissedEarly = true;\n }\n return { success: false, errorMessage };\n } finally {\n if (progressDialog !== undefined && !loadingDismissedEarly) {\n const dlg = progressDialog;\n setTimeout(() => dlg.close(), LOADING_DIALOG_CLOSE_DELAY_MS);\n }\n }\n }\n\n //#endregion\n\n //#region ---- Progress ----\n\n private async applyProgressText(\n dialog: MetadataAiLoadingDialogRef,\n event: AXEDocumentMetadataAiPrefillProgressEvent,\n ): Promise<void> {\n try {\n dialog.setProgressColor('primary');\n const line = await this.formatProgressLine(event);\n dialog.setProgressText(line);\n } catch {\n // Ignore translation / dialog failures; keep the previous UI state.\n }\n }\n\n private async markProgressComplete(dialog: MetadataAiLoadingDialogRef): Promise<void> {\n try {\n dialog.setProgressColor('success');\n dialog.setProgressText(await this.translation.translateAsync(`${METADATA_AI_LOADING_I18N}.complete`));\n } catch {\n dialog.setProgressColor('success');\n }\n }\n\n private async resolveFailureMessage(err: unknown): Promise<string> {\n const raw = err instanceof Error ? err.message.trim() : '';\n if (this.debug.isDebugMode() && raw && !raw.startsWith('@')) {\n const prefix = await this.translation.translateAsync(\n '@extensions-ai-document:widgets.metadata-ai-fill.ocr-failed-prefix',\n );\n return `${prefix} ${raw}`;\n }\n const key = raw.startsWith('@') ? raw : '@extensions-ai-document:widgets.metadata-ai-fill.ocr-failed';\n return this.translation.translateAsync(key);\n }\n\n private async formatProgressLine(event: AXEDocumentMetadataAiPrefillProgressEvent): Promise<string> {\n const phaseKey = `${METADATA_AI_LOADING_I18N}.thinking.${event.phase}`;\n const phaseText = await this.translation.translateAsync(phaseKey);\n if (event.documentCount > 1) {\n return this.translation.translateAsync(`${METADATA_AI_LOADING_I18N}.step-prefix`, {\n params: {\n current: event.documentIndex,\n total: event.documentCount,\n phase: phaseText,\n },\n });\n }\n return phaseText;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\r\n\r\nimport type { AXPHookProvider } from '@acorex-platform/framework-client/core';\r\nimport {\r\n AXP_LAYOUT_BUILDER_DIALOG_CONTEXT_CHANGED_HOOK_KEY,\r\n type AXPLayoutBuilderDialogContextChangedPayload,\r\n} from '@acorex-platform/framework-client/layout/builder';\r\nimport { inject } from '@angular/core';\r\nimport { AXEDocumentMetadataAiFillOrchestrator } from './document-metadata-ai-fill.orchestrator';\r\nimport { AXEDocumentMetadataAiPrefillService } from './document-metadata-ai-prefill.service';\r\nimport { isAiExtractableFileListItem } from './document-metadata-schema.util';\r\n\r\n//#endregion\r\n\r\n//#region ---- Local state (per-popup session keys from dialog renderer) ----\r\n\r\ntype AiPromptSessionState = {\r\n busy?: boolean;\r\n lastProcessedSig?: string;\r\n};\r\n\r\nconst promptSessions = new Map<string, AiPromptSessionState>();\r\n\r\nfunction sessionState(sessionKey: string): AiPromptSessionState {\r\n let s = promptSessions.get(sessionKey);\r\n if (!s) {\r\n s = {};\r\n promptSessions.set(sessionKey, s);\r\n }\r\n return s;\r\n}\r\n\r\n//#endregion\r\n\r\n//#region ---- Helpers ----\r\n\r\n/**\r\n * Document Management attachment dialogs expose this metadata so extensions can scope integration-only hooks.\r\n */\r\nfunction isDocumentAttachmentDialogIntegration(metadata: Record<string, unknown>): boolean {\r\n return metadata['showMeta'] === true && metadata['hasMetaFields'] === true && metadata['documentType'] != null;\r\n}\r\n\r\n/**\r\n * Stable fingerprint for extractable document slots — ignores metadata field edits so we do not re-prompt on every keystroke.\r\n */\r\nfunction extractableAttachmentSlotsSignature(context: Record<string, unknown>): string {\r\n const files = context['files'] as Array<{ file?: unknown[] }> | undefined;\r\n if (!Array.isArray(files) || files.length === 0) {\r\n return '';\r\n }\r\n const parts: string[] = [];\r\n for (let i = 0; i < files.length; i++) {\r\n const slot = files[i]?.file;\r\n const first = Array.isArray(slot) ? (slot[0] as Record<string, unknown> | undefined) : undefined;\r\n if (!first || !isAiExtractableFileListItem(first as { name?: string; type?: string })) {\r\n continue;\r\n }\r\n const name = String(first['name'] ?? '');\r\n const size = typeof first['size'] === 'number' ? first['size'] : '';\r\n const mime = String(first['type'] ?? '');\r\n const src = first['source'] as { kind?: string; value?: unknown } | undefined;\r\n const kind = String(src?.kind ?? '');\r\n let sourceFingerprint = '';\r\n if (kind === 'fileId' && typeof src?.value === 'string') {\r\n sourceFingerprint = `fileId:${src.value}`;\r\n } else if (kind === 'blob' && src?.value instanceof Blob) {\r\n sourceFingerprint = `blob:${src.value.size}:${src.value.type}`;\r\n } else if (src?.value instanceof File) {\r\n const f = src.value;\r\n sourceFingerprint = `file:${f.size}:${f.type}`;\r\n } else {\r\n sourceFingerprint = `${kind}:${typeof src?.value}`;\r\n }\r\n parts.push(`${i}:${name}:${size}:${mime}:${sourceFingerprint}`);\r\n }\r\n return parts.join('|');\r\n}\r\n\r\n//#endregion\r\n\r\n//#region ---- Hook provider ----\r\n\r\n/**\r\n * When document extraction is enabled and the attachment dialog has metadata + extractable files, prompts the user\r\n * after files appear. Yes → loading dialog + AI prefill; No → leave metadata form empty for manual entry.\r\n * Dedupes by attachment-slot signature so field edits do not re-prompt.\r\n */\r\nexport const AXEDocumentLayoutBuilderDialogContextChangedHookProvider: AXPHookProvider<\r\n AXPLayoutBuilderDialogContextChangedPayload,\r\n AXPLayoutBuilderDialogContextChangedPayload\r\n> = {\r\n key: AXP_LAYOUT_BUILDER_DIALOG_CONTEXT_CHANGED_HOOK_KEY,\r\n priority: 50,\r\n async execute(\r\n data: AXPLayoutBuilderDialogContextChangedPayload,\r\n ): Promise<AXPLayoutBuilderDialogContextChangedPayload> {\r\n const integration = data.metadata ?? {};\r\n\r\n if (!isDocumentAttachmentDialogIntegration(integration)) {\r\n return data;\r\n }\r\n\r\n const prefill = inject(AXEDocumentMetadataAiPrefillService);\r\n const orchestrator = inject(AXEDocumentMetadataAiFillOrchestrator);\r\n\r\n if (!(await prefill.isMetadataOcrEnabled())) {\r\n return data;\r\n }\r\n\r\n const ctx = data.getContext();\r\n const sig = extractableAttachmentSlotsSignature(ctx);\r\n if (!sig) {\r\n return data;\r\n }\r\n\r\n const st = sessionState(data.sessionKey);\r\n if (st.busy) {\r\n return data;\r\n }\r\n if (st.lastProcessedSig === sig) {\r\n return data;\r\n }\r\n\r\n const dialogTarget = {\r\n context: () => data.getContext(),\r\n patchContext: (partial: Record<string, unknown>) => data.patchContext(partial),\r\n };\r\n\r\n if (!prefill.willApplyMetadataAiFillFromDocuments(dialogTarget, integration)) {\r\n return data;\r\n }\r\n\r\n st.busy = true;\r\n try {\r\n await orchestrator.confirmAndRun(dialogTarget, integration);\r\n st.lastProcessedSig = sig;\r\n } catch {\r\n st.lastProcessedSig = sig;\r\n } finally {\r\n st.busy = false;\r\n }\r\n\r\n return data;\r\n },\r\n};\r\n\r\n//#endregion\r\n","//#region ---- Imports ----\r\n\r\nimport { NgModule } from '@angular/core';\r\nimport { AXMAiManagementModule } from '@acorex-platform/module-ai-management-client';\r\nimport { AXMDocumentManagementModule } from '@acorex-platform/module-document-management-client';\r\nimport { AXP_SETTING_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/common';\r\nimport { AXP_HOOK_PROVIDER } from '@acorex-platform/framework-client/core';\r\n\r\nimport { AXEDocumentAiSettingProvider } from './document-metadata-ocr.settings.provider';\r\nimport { AXEDocumentLayoutBuilderDialogContextChangedHookProvider } from './document-layout-builder-dialog-context-changed.hook';\r\n\r\n//#endregion\r\n\r\n//#region ---- Module ----\r\n\r\n/**\r\n * Optional AI + OCR metadata helpers for document flows.\r\n * Register in the app next to {@link AXMDocumentManagementModule} and {@link AXMAiManagementModule}.\r\n */\r\n@NgModule({\r\n imports: [AXMAiManagementModule, AXMDocumentManagementModule],\r\n providers: [\r\n {\r\n provide: AXP_SETTING_DEFINITION_PROVIDER,\r\n useClass: AXEDocumentAiSettingProvider,\r\n multi: true,\r\n },\r\n {\r\n provide: AXP_HOOK_PROVIDER,\r\n useValue: AXEDocumentLayoutBuilderDialogContextChangedHookProvider,\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class AXEAIDocumentExtensionModule {}\r\n\r\n//#endregion\r\n","//#region ---- Hook contract ----\n\n/**\n * Hook key for document attachment dialog integrations (caller wires `AXPHookService.runAsync` / listeners).\n * Payload carries the same dialog `context` object by reference so hooks can read or update nested paths\n * (for example `file-0.metaDataForm`, `files`) before the dialog is shown.\n */\nexport const AXE_DOCUMENT_ATTACHMENT_DIALOG_HOOK_KEY = 'document-management.attachment-dialog.configure';\n\n/**\n * Eligibility flags supplied by the caller (e.g. Document Management).\n */\nexport interface AXEDocumentAttachmentDialogEligibility {\n showMeta: boolean;\n hasMetaFields: boolean;\n hasImage: boolean;\n parentId: string;\n documentType: unknown;\n}\n\n/**\n * Payload for {@link AXE_DOCUMENT_ATTACHMENT_DIALOG_HOOK_KEY}.\n *\n * **Context by reference:** `context` must be the object that will be passed to the dialog (e.g. `setContext(context)`).\n * Hook providers may mutate or shallow-merge into this object so updates are visible when the dialog opens.\n */\nexport interface AXEDocumentAttachmentDialogHookPayload {\n context: Record<string, unknown>;\n eligibility: AXEDocumentAttachmentDialogEligibility;\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA;AASA;AAEA;AAEA,MAAM,iBAAiB,GAAG,+CAA+C;AAEzE;AACA,MAAM,iBAAiB,GAAG,aAAa;MAG1B,4BAA4B,CAAA;IACvC,MAAM,OAAO,CAAC,OAA4C,EAAA;QACxD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;YACxC;QACF;AAEA,QAAA,MAAM,gBAAgB,GAAG,CAAA,iBAAA,EAAoB,8BAA8B,CAAC,OAAO,OAAO;QAE1F,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACrD,IAAI,CAAC,YAAY,EAAE;YACjB;QACF;QAEA;aACG,UAAU,CAAC,cAAc,EAAE,CAAA,EAAG,iBAAiB,gBAAgB,EAAE,CAAA,EAAG,iBAAiB,CAAA,oBAAA,CAAsB;AAC3G,aAAA,UAAU,CAAC;YACV,GAAG,EAAE,8BAA8B,CAAC,OAAO;YAC3C,KAAK,EAAE,CAAA,EAAG,iBAAiB,CAAA,cAAA,CAAgB;AAC3C,YAAA,KAAK,EAAE,GAAG;AACV,YAAA,aAAa,EAAE,EAAE;AACjB,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,aAAa,EAAE,CAAC,CAAA,EAAG,iBAAiB,sBAAsB,CAAC;AAC3D,YAAA,MAAM,EAAE;gBACN,IAAI,EAAE,iBAAiB,CAAC,MAAM;AAC/B,aAAA;YACD,WAAW,EAAE,CAAA,EAAG,iBAAiB,CAAA,oBAAA,CAAsB;SACxD;AACA,aAAA,UAAU,CAAC;YACV,GAAG,EAAE,8BAA8B,CAAC,QAAQ;YAC5C,KAAK,EAAE,CAAA,EAAG,iBAAiB,CAAA,gBAAA,CAAkB;AAC7C,YAAA,KAAK,EAAE,GAAG;AACV,YAAA,aAAa,EAAE,EAAE;AACjB,YAAA,WAAW,EAAE,IAAI;;AAEjB,YAAA,aAAa,EAAE,CAAC,CAAA,EAAG,iBAAiB,qBAAqB,CAAC;AAC1D,YAAA,eAAe,EAAE,wBAAwB,CAAC,IAAI,CAAC;AAC/C,YAAA,MAAM,EAAE;gBACN,IAAI,EAAE,iBAAiB,CAAC,MAAM;AAC9B,gBAAA,OAAO,EAAE;AACP,oBAAA,MAAM,EAAE,CAAA,EAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAA,CAAA,EAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAA,CAAE;AACtE,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,QAAQ,EAAE,KAAK;AACf,oBAAA,SAAS,EAAE,OAAO;AAClB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,cAAc,EAAE,IAAI;AACpB,oBAAA,UAAU,EAAE,gBAAgB;AAC7B,iBAAA;AACF,aAAA;YACD,WAAW,EAAE,CAAA,EAAG,iBAAiB,CAAA,sBAAA,CAAwB;SAC1D;AACA,aAAA,UAAU,EAAE;IACjB;8GApDW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA5B,4BAA4B,EAAA,CAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC;;;AClBD;AAeA;AAEA;AAEA;;;;AAIG;AACI,MAAM,mCAAmC,GAAG;AAEnD;AAEA;AAEA;;AAEG;AACG,SAAU,+BAA+B,CAC7C,IAAgD,EAAA;AAEhD,IAAA,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;AACzB,QAAA,OAAO,EAAE;IACX;IACA,MAAM,GAAG,GAAsC,EAAE;AACjD,IAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;QAC3B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE;YAC9B,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,CAAC,CAAC,IAAI;AACZ,gBAAA,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI;gBACxB,aAAa,EAAE,CAAC,CAAC,SAAS;AAC3B,aAAA,CAAC;QACJ;IACF;AACA,IAAA,OAAO,GAAG;AACZ;AAEA;;AAEG;AACG,SAAU,2BAA2B,CACzC,MAAyC,EACzC,OAAgB,EAAA;IAEhB,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,OAAO,MAAM;IACf;AACA,IAAA,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,mCAAmC,CAAC,EAAE;AACtE,QAAA,OAAO,MAAM;IACf;IACA,OAAO;AACL,QAAA,GAAG,MAAM;AACT,QAAA;AACE,YAAA,IAAI,EAAE,mCAAmC;AACzC,YAAA,KAAK,EAAE,aAAa;AACpB,YAAA,aAAa,EAAE,kBAAkB;AAClC,SAAA;KACF;AACH;AAEA;AAEA;AAEA;;AAEG;AACG,SAAU,yBAAyB,CAAC,KAAc,EAAA;IACtD,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE;AACjC,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE;AAC3D,QAAA,OAAO,aAAa,CAAC,KAAK,CAAC;IAC7B;AACA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,KAAK;IACd;AACA,IAAA,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE;IACxB,IAAI,CAAC,GAAG,EAAE;AACR,QAAA,OAAO,KAAK;IACd;IAEA,MAAM,GAAG,GAAG,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC;IAChD,IAAI,GAAG,EAAE;AACP,QAAA,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE;IACxC;;IAGA,MAAM,EAAE,GAAG,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC;IACtD,IAAI,EAAE,EAAE;QACN,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1B,QAAA,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,EAAE;AACtD,YAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,EAAE;QAC9C;IACF;AAEA,IAAA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE;AACnC,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC;IAC9B;AACA,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,IAAI,CAAC,CAAS,EAAA;AACrB,IAAA,OAAO,CAAC,GAAG,EAAE,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,GAAG,MAAM,CAAC,CAAC,CAAC;AACrC;AAEA,SAAS,aAAa,CAAC,CAAO,EAAA;IAC5B,OAAO,CAAA,EAAG,CAAC,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA,CAAE;AAC5E;AAEA;;AAEG;AACG,SAAU,kBAAkB,CAChC,MAA+B,EAC/B,MAAyC,EAAA;AAEzC,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB;AACG,SAAA,MAAM,CAAC,CAAC,CAAC,KAAI;AACZ,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;AACrD,QAAA,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;AACtD,IAAA,CAAC;SACA,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CACtB;IAED,MAAM,IAAI,GAA4B,EAAE;AACxC,IAAA,IAAI,cAAkC;AAEtC,IAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC3C,QAAA,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC;AACtE,QAAA,IAAI,CAAC,KAAK,mCAAmC,EAAE;AAC7C,YAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBAC5E,cAAc,GAAG,UAAU;YAC7B;AAAO,iBAAA,IAAI,UAAU,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE;AAC5E,gBAAA,cAAc,GAAG,aAAa,CAAC,UAAU,CAAC;YAC5C;YACA;QACF;AACA,QAAA,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU;IACtB;AAEA,IAAA,OAAO,cAAc,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE;AAC7D;AAEA;;AAEG;AACG,SAAU,wBAAwB,CAAC,IAAY,EAAA;AACnD,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE;IAC3B,MAAM,KAAK,GAAG,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC;AAC7D,IAAA,MAAM,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,GAAG,OAAO;AAC9C,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY;AACzC,QAAA,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC1E,YAAA,OAAO,MAAiC;QAC1C;IACF;AAAE,IAAA,MAAM;;IAER;AACA,IAAA,OAAO,EAAE;AACX;AAEA;;AAEG;AACG,SAAU,oBAAoB,CAClC,QAA6C,EAC7C,OAAgC,EAAA;IAEhC,MAAM,IAAI,GAAG,EAAE,IAAI,QAAQ,IAAI,EAAE,CAAC,EAAE;AACpC,IAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,QAAA,MAAM,KAAK,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE;AAC7D,QAAA,IAAI,KAAK,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;AACtD,YAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACb;IACF;AACA,IAAA,OAAO,IAAI;AACb;AAYA;;AAEG;AACG,SAAU,2BAA2B,CAAC,IAAkC,EAAA;IAC5E,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,OAAO,KAAK;IACd;AACA,IAAA,MAAM,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;AACpC,IAAA,IAAI,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;AACjC,QAAA,OAAO,IAAI;IACb;AACA,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK;AAC9B,IAAA,IAAI,GAAG,YAAY,IAAI,EAAE;AACvB,QAAA,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE;AAC7D,QAAA,IAAI,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE;AACxC,YAAA,OAAO,IAAI;QACb;IACF;AACA,IAAA,IAAI,GAAG,YAAY,IAAI,EAAE;AACvB,QAAA,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE;AACpD,YAAA,OAAO,IAAI;QACb;IACF;AACA,IAAA,OAAO,KAAK;AACd;AAEA;;AC5OA;AA8BA;AAEA;AAEA,MAAM,wBAAwB,GAAG,6BAA6B;AAE9D,MAAM,8BAA8B,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAW;AAiBtF;AAEA;AAEA,MAAM,eAAe,GAAG,6DAA6D;AAErF,SAAS,cAAc,CAAC,MAA+B,EAAA;AACrD,IAAA,IAAI,MAAM,EAAE,OAAO,EAAE;AACnB,QAAA,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC;IACjD;AACF;AAEA,SAAS,qBAAqB,CAAC,OAAgB,EAAA;IAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE;AACjD,QAAA,OAAO,OAAO,CAAC,IAAI,EAAE;IACvB;AACA,IAAA,IAAI,OAAO,IAAI,IAAI,EAAE;AACnB,QAAA,OAAO,EAAE;IACX;AACA,IAAA,IAAI;AACF,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IAChC;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB;AACF;AAEA;AAEA;AAEA;;;AAGG;MAEU,mCAAmC,CAAA;AADhD,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC3C,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACrC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC;AA+QjD,IAAA;;AA3QC;;;AAGG;AACH,IAAA,MAAM,oBAAoB,GAAA;AACxB,QAAA,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAU,8BAA8B,CAAC,OAAO,CAAC;AAClF,QAAA,IAAI,CAAC,IAAI,IAAI,EAAE;AACb,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,CAAC;IACV;AAEA;;;AAGG;IACH,oCAAoC,CAClC,SAGC,EACD,WAAoC,EAAA;AAEpC,QAAA,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AAC3B,YAAA,OAAO,KAAK;QACd;AACA,QAAA,MAAM,YAAY,GAAG,WAAW,CAAC,cAAc,CAGlC;AACb,QAAA,MAAM,YAAY,GAAG,YAAY,EAAE,YAAY;AAC/C,QAAA,MAAM,MAAM,GAAG,2BAA2B,CACxC,+BAA+B,CAAC,YAAY,IAAI,SAAS,CAAC,EAC1D,CAAC,CAAC,YAAY,EAAE,gBAAgB,CACjC;AACD,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,YAAA,OAAO,KAAK;QACd;AACA,QAAA,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE;AAC/B,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAA4C;AACrE,QAAA,MAAM,CAAC,GAAG,KAAK,EAAE,MAAM,IAAI,CAAC;AAC5B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,IAAI,GAAG,KAAM,CAAC,CAAC,CAAC,EAAE,IAAI;AAC5B,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,CAAC,CAAuD,GAAG,SAAS;AAC9G,YAAA,IAAI,KAAK,IAAI,2BAA2B,CAAC,KAAK,CAAC,EAAE;AAC/C,gBAAA,OAAO,IAAI;YACb;QACF;AACA,QAAA,OAAO,KAAK;IACd;AAEA;;AAEG;AACH,IAAA,MAAM,kBAAkB,CAAC,QAA6C,EAAE,QAAgB,EAAA;;AAEtF,QAAA,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE;YACnF,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;YAC7C,IAAI,QAAQ,EAAE;AACZ,gBAAA,OAAO,QAAQ;YACjB;QACF;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,KAAK,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,+BAA+B;QACjE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACxC,IAAI;YACJ,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK;AACL,YAAA,OAAO,EAAE,wBAAwB;AACjC,YAAA,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,oBAAoB,CAAC,SAAS;AACvC,SAAA,CAAC;QACF,OAAO,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI;IACrC;AAEA;;AAEG;IACH,MAAM,0BAA0B,CAAC,OAchC,EAAA;AACC,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;QAC7B,MAAM,MAAM,GAAG,CACb,KAAwC,EACxC,KAAA,GAA0D,OAAO,CAAC,aAAa;AAC7E,YAAA,8BAA8B,KAC7B,OAAO,CAAC,cAAc,GAAG,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;QAElD,cAAc,CAAC,MAAM,CAAC;AAEtB,QAAA,MAAM,MAAM,GAAG,2BAA2B,CACxC,+BAA+B,CAAC,OAAO,CAAC,YAAY,IAAI,SAAS,CAAC,EAClE,CAAC,CAAC,OAAO,CAAC,yBAAyB,CACpC;AACD,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,YAAA,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,EAAE;QACzE;QAEA,MAAM,CAAC,WAAW,CAAC;AACnB,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC;QAChF,cAAc,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC;QACvE;QAEA,MAAM,CAAC,YAAY,CAAC;QACpB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,8CAA8C,EAAE;YACtG,MAAM;AACN,YAAA,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC;AAC1C,SAAA,CAAC;QACF,cAAc,CAAC,MAAM,CAAC;AACtB,QAAA,IAAI,aAAa,EAAE,OAAO,KAAK,KAAK,EAAE;AACpC,YAAA,MAAM,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC;QACjD;AACA,QAAA,MAAM,WAAW,GAAG,yBAAyB,CAAC,aAAa,CAAqC;AAChG,QAAA,MAAM,WAAW,GAAG,OAAO,WAAW,EAAE,IAAI,KAAK,QAAQ,GAAG,WAAW,CAAC,IAAI,GAAG,EAAE;QACjF,MAAM,MAAM,GACV,WAAW,EAAE,MAAM,IAAI,OAAO,WAAW,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM;cAC9F,WAAW,CAAC;AACd,cAAE,wBAAwB,CAAC,WAAW,CAAC;AAC3C,QAAA,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE;AAC3D,YAAA,MAAM,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC;QACjD;AACA,QAAA,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC;QACnE,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;AAE/D,QAAA,MAAM,gBAAgB,GACpB,OAAO,CAAC,sBAAsB,KAAK,SAAS;YAC5C,OAAO,CAAC,sBAAsB,KAAK,IAAI;AACvC,YAAA,OAAO,CAAC,sBAAsB,KAAK,EAAE;QACvC,OAAO;YACL,WAAW;YACX,MAAM;AACN,YAAA,IAAI,gBAAgB,IAAI,cAAc,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC;SAClE;IACH;AAEA;;AAEG;AACH,IAAA,MAAM,6CAA6C,CACjD,SAGC,EACD,WAAoC,EACpC,OAGC,EAAA;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;YAC3B;QACF;AACA,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AAC7D,QAAA,MAAM,YAAY,GAAG,WAAW,CAAC,cAAc,CAGlC;AACb,QAAA,MAAM,YAAY,GAAG,YAAY,EAAE,YAAY;AAC/C,QAAA,MAAM,yBAAyB,GAAG,CAAC,CAAC,YAAY,EAAE,gBAAgB;AAClE,QAAA,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE;AAC/B,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAA4C;AACrE,QAAA,MAAM,CAAC,GAAG,KAAK,EAAE,MAAM,IAAI,CAAC;QAC5B,MAAM,KAAK,GAA4B,EAAE;QAEzC,MAAM,eAAe,GAAa,EAAE;AACpC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,IAAI,GAAG,KAAM,CAAC,CAAC,CAAC,EAAE,IAAI;AAC5B,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,CAAC,CAAuD,GAAG,SAAS;AAC9G,YAAA,IAAI,KAAK,IAAI,2BAA2B,CAAC,KAAK,CAAC,EAAE;AAC/C,gBAAA,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;YACzB;QACF;AACA,QAAA,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM;AAC9B,QAAA,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM;AAC5C,QAAA,IAAI,aAAa,GAAG,CAAC,EAAE;YACrB,OAAO,EAAE,cAAc,GAAG;AACxB,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,aAAa,EAAE,CAAC;gBAChB,aAAa;AACd,aAAA,CAAC;YACF,cAAc,CAAC,MAAM,CAAC;QACxB;QAEA,IAAI,SAAS,GAAG,CAAC;AACjB,QAAA,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE;YAC/B,cAAc,CAAC,MAAM,CAAC;YACtB,SAAS,IAAI,CAAC;YACd,MAAM,IAAI,GAAG,KAAM,CAAC,CAAC,CAAC,EAAE,IAAI;AAC5B,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,CAAC,CAAuD,GAAG,SAAS;YAC9G,IAAI,CAAC,KAAK,EAAE;gBACV;YACF;YACA,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA,CAAE,CAAwC;AACzE,YAAA,MAAM,YAAY,GAAG,SAAS,GAAG,cAAc,CAAwC;YACvF,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC;AACvE,gBAAA,QAAQ,EAAE,KAAK;gBACf,QAAQ;gBACR,YAAY;gBACZ,YAAY;gBACZ,yBAAyB;AACzB,gBAAA,sBAAsB,EAAE,SAAS,GAAG,gBAAgB,CAAC;AACrD,gBAAA,aAAa,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE;gBAC1D,MAAM;gBACN,cAAc,EAAE,OAAO,EAAE,cAAc;AACxC,aAAA,CAAC;AACF,YAAA,KAAK,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAE,CAAC,GAAG;AACnB,gBAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,GAAG,SAAS,GAAG,EAAE,CAAC;AAChE,gBAAA,YAAY,EAAE,MAAM;AACpB,gBAAA,IAAI,cAAc,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC;aAC9C;QACH;QAEA,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,YAAA,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC;QAC/B;IACF;;AAIQ,IAAA,qBAAqB,CAAC,aAAsB,EAAA;AAClD,QAAA,MAAM,IAAI,GAAG,uBAAuB,CAAC,aAAa,CAAC;QACnD,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC;AACpD,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,OAAO;YAC5F,OAAO,EAAE,IAAI,EAAE,OAAO;YACtB,OAAO,EAAE,IAAI,EAAE,OAAO;AACvB,SAAA,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE;AACvC,YAAA,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;QAC3B;QACA,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE;AACzE,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACxB,YAAA,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC;QACxB;AACA,QAAA,OAAO,IAAI,KAAK,CAAC,eAAe,CAAC;IACnC;AAEQ,IAAA,oBAAoB,CAAC,IAAyC,EAAA;AACpE,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK;AAC5B,QAAA,IAAI,CAAC,YAAY,IAAI,EAAE;AACrB,YAAA,OAAO,CAAC;QACV;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,YAAY,IAAI,EAAE;YACrD,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,0BAA0B,EAAE,CAAC;QAC9F;AACA,QAAA,OAAO,IAAI;IACb;8GAlRW,mCAAmC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnC,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mCAAmC,cADtB,MAAM,EAAA,CAAA,CAAA;;2FACnB,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAD/C,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACvFlC;AAwCA;AAEA,MAAM,wBAAwB,GAAG,0DAA0D;AAC3F,MAAM,wBAAwB,GAAG,0DAA0D;AAE3F;AACA,MAAM,6BAA6B,GAAG,GAAG;AAEzC;AAEA;;AAEG;MAEU,qCAAqC,CAAA;AADlD,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,mCAAmC,CAAC;AACrD,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,sBAAsB,CAAC;AAC9C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC1C,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC;AAgKjD,IAAA;;;AA1JC;;AAEG;AACH,IAAA,MAAM,aAAa,CACjB,YAAmD,EACnD,WAAoC,EAAA;AAEpC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE;AACjF,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;QAC1B;QAEA,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA,EAAG,wBAAwB,QAAQ,CAAC;YACpE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA,EAAG,wBAAwB,UAAU,CAAC;AACvE,SAAA,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC;AAC/G,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC1C;QAEA,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC;IAC5C;AAEA;;AAEG;AACH,IAAA,MAAM,GAAG,CACP,YAAmD,EACnD,WAAoC,EAAA;AAEpC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAAC,YAAY,EAAE,WAAW,CAAC;AAEhG,QAAA,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE;QAC7C,IAAI,qBAAqB,GAAG,KAAK;AAEjC,QAAA,IAAI,cAAsD;QAE1D,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACpD,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA,EAAG,wBAAwB,QAAQ,CAAC;gBACpE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA,EAAG,wBAAwB,UAAU,CAAC;gBACtE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA,EAAG,wBAAwB,cAAc,CAAC;AAC3E,aAAA,CAAC;AACF,YAAA,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBACvC,KAAK;AACL,gBAAA,IAAI,EAAE,eAAe;AACrB,gBAAA,aAAa,EAAE,SAAS;AACxB,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,MAAK;4BACZ,qBAAqB,GAAG,IAAI;4BAC5B,eAAe,CAAC,KAAK,EAAE;4BACvB,cAAc,EAAE,KAAK,EAAE;wBACzB,CAAC;AACF,qBAAA;AACF,iBAAA;AACF,aAAA,CAA+B;QAClC;AAEA,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,OAAO,CAAC,6CAA6C,CAAC,YAAY,EAAE,WAAW,EAAE;gBAC1F,MAAM,EAAE,WAAW,GAAG,eAAe,CAAC,MAAM,GAAG,SAAS;AACxD,gBAAA,cAAc,EAAE,CAAC,KAAK,KAAI;oBACxB,IAAI,CAAC,cAAc,EAAE;wBACnB;oBACF;oBACA,KAAK,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC;gBACpD,CAAC;AACF,aAAA,CAAC;AACF,YAAA,IAAI,cAAc,IAAI,CAAC,qBAAqB,EAAE;AAC5C,gBAAA,MAAM,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;YACjD;AACA,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;QAC1B;QAAE,OAAO,GAAG,EAAE;YACZ,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE;gBAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE;YAC5C;YACA,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC;AAC1D,YAAA,IAAI,cAAc,IAAI,CAAC,qBAAqB,EAAE;AAC5C,gBAAA,IAAI;AACF,oBAAA,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AACzC,oBAAA,cAAc,CAAC,eAAe,CAAC,YAAY,CAAC;gBAC9C;AAAE,gBAAA,MAAM;;gBAER;YACF;AACA,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,cAAc,IAAI,CAAC,qBAAqB,EAAE;gBACxE,qBAAqB,GAAG,IAAI;YAC9B;AACA,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE;QACzC;gBAAU;AACR,YAAA,IAAI,cAAc,KAAK,SAAS,IAAI,CAAC,qBAAqB,EAAE;gBAC1D,MAAM,GAAG,GAAG,cAAc;gBAC1B,UAAU,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE,6BAA6B,CAAC;YAC9D;QACF;IACF;;;AAMQ,IAAA,MAAM,iBAAiB,CAC7B,MAAkC,EAClC,KAAgD,EAAA;AAEhD,QAAA,IAAI;AACF,YAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AACjD,YAAA,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;QAC9B;AAAE,QAAA,MAAM;;QAER;IACF;IAEQ,MAAM,oBAAoB,CAAC,MAAkC,EAAA;AACnE,QAAA,IAAI;AACF,YAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC;AAClC,YAAA,MAAM,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA,EAAG,wBAAwB,CAAA,SAAA,CAAW,CAAC,CAAC;QACvG;AAAE,QAAA,MAAM;AACN,YAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC;QACpC;IACF;IAEQ,MAAM,qBAAqB,CAAC,GAAY,EAAA;AAC9C,QAAA,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE;AAC1D,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAClD,oEAAoE,CACrE;AACD,YAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,EAAE;QAC3B;AACA,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,6DAA6D;QACrG,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC;IAC7C;IAEQ,MAAM,kBAAkB,CAAC,KAAgD,EAAA;QAC/E,MAAM,QAAQ,GAAG,CAAA,EAAG,wBAAwB,aAAa,KAAK,CAAC,KAAK,CAAA,CAAE;QACtE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,QAAQ,CAAC;AACjE,QAAA,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE;YAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA,EAAG,wBAAwB,CAAA,YAAA,CAAc,EAAE;AAChF,gBAAA,MAAM,EAAE;oBACN,OAAO,EAAE,KAAK,CAAC,aAAa;oBAC5B,KAAK,EAAE,KAAK,CAAC,aAAa;AAC1B,oBAAA,KAAK,EAAE,SAAS;AACjB,iBAAA;AACF,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,SAAS;IAClB;8GApKW,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArC,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qCAAqC,cADxB,MAAM,EAAA,CAAA,CAAA;;2FACnB,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBADjD,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACrDlC;AAqBA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAgC;AAE9D,SAAS,YAAY,CAAC,UAAkB,EAAA;IACtC,IAAI,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC;IACtC,IAAI,CAAC,CAAC,EAAE;QACN,CAAC,GAAG,EAAE;AACN,QAAA,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACnC;AACA,IAAA,OAAO,CAAC;AACV;AAEA;AAEA;AAEA;;AAEG;AACH,SAAS,qCAAqC,CAAC,QAAiC,EAAA;IAC9E,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,IAAI,QAAQ,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI;AAChH;AAEA;;AAEG;AACH,SAAS,mCAAmC,CAAC,OAAgC,EAAA;AAC3E,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAA4C;AACzE,IAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/C,QAAA,OAAO,EAAE;IACX;IACA,MAAM,KAAK,GAAa,EAAE;AAC1B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI;AAC3B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,CAAC,CAAyC,GAAG,SAAS;QAChG,IAAI,CAAC,KAAK,IAAI,CAAC,2BAA2B,CAAC,KAAyC,CAAC,EAAE;YACrF;QACF;QACA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;QACnE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACxC,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAmD;QAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;QACpC,IAAI,iBAAiB,GAAG,EAAE;QAC1B,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,EAAE,KAAK,KAAK,QAAQ,EAAE;AACvD,YAAA,iBAAiB,GAAG,CAAA,OAAA,EAAU,GAAG,CAAC,KAAK,EAAE;QAC3C;aAAO,IAAI,IAAI,KAAK,MAAM,IAAI,GAAG,EAAE,KAAK,YAAY,IAAI,EAAE;AACxD,YAAA,iBAAiB,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAC,KAAK,CAAC,IAAI,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;QAChE;AAAO,aAAA,IAAI,GAAG,EAAE,KAAK,YAAY,IAAI,EAAE;AACrC,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK;YACnB,iBAAiB,GAAG,CAAA,KAAA,EAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAA,CAAE;QAChD;aAAO;YACL,iBAAiB,GAAG,GAAG,IAAI,CAAA,CAAA,EAAI,OAAO,GAAG,EAAE,KAAK,CAAA,CAAE;QACpD;AACA,QAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,IAAI,CAAA,CAAA,EAAI,iBAAiB,CAAA,CAAE,CAAC;IACjE;AACA,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB;AAEA;AAEA;AAEA;;;;AAIG;AACI,MAAM,wDAAwD,GAGjE;AACF,IAAA,GAAG,EAAE,kDAAkD;AACvD,IAAA,QAAQ,EAAE,EAAE;IACZ,MAAM,OAAO,CACX,IAAiD,EAAA;AAEjD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE;AAEvC,QAAA,IAAI,CAAC,qCAAqC,CAAC,WAAW,CAAC,EAAE;AACvD,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,mCAAmC,CAAC;AAC3D,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,qCAAqC,CAAC;QAElE,IAAI,EAAE,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC,EAAE;AAC3C,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,MAAM,GAAG,GAAG,mCAAmC,CAAC,GAAG,CAAC;QACpD,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,QAAA,IAAI,EAAE,CAAC,IAAI,EAAE;AACX,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,EAAE,CAAC,gBAAgB,KAAK,GAAG,EAAE;AAC/B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,YAAY,GAAG;AACnB,YAAA,OAAO,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE;YAChC,YAAY,EAAE,CAAC,OAAgC,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;SAC/E;QAED,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE;AAC5E,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,EAAE,CAAC,IAAI,GAAG,IAAI;AACd,QAAA,IAAI;YACF,MAAM,YAAY,CAAC,aAAa,CAAC,YAAY,EAAE,WAAW,CAAC;AAC3D,YAAA,EAAE,CAAC,gBAAgB,GAAG,GAAG;QAC3B;AAAE,QAAA,MAAM;AACN,YAAA,EAAE,CAAC,gBAAgB,GAAG,GAAG;QAC3B;gBAAU;AACR,YAAA,EAAE,CAAC,IAAI,GAAG,KAAK;QACjB;AAEA,QAAA,OAAO,IAAI;IACb,CAAC;;AAGH;;ACnJA;AAWA;AAEA;AAEA;;;AAGG;MAgBU,4BAA4B,CAAA;8GAA5B,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;+GAA5B,4BAA4B,EAAA,OAAA,EAAA,CAd7B,qBAAqB,EAAE,2BAA2B,CAAA,EAAA,CAAA,CAAA;AAcjD,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,SAAA,EAb5B;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,+BAA+B;AACxC,gBAAA,QAAQ,EAAE,4BAA4B;AACtC,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,QAAQ,EAAE,wDAAwD;AAClE,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,OAAA,EAAA,CAZS,qBAAqB,EAAE,2BAA2B,CAAA,EAAA,CAAA,CAAA;;2FAcjD,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAfxC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;AAC7D,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,+BAA+B;AACxC,4BAAA,QAAQ,EAAE,4BAA4B;AACtC,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,QAAQ,EAAE,wDAAwD;AAClE,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA;AACF,iBAAA;;;ACjCD;AAEA;;;;AAIG;AACI,MAAM,uCAAuC,GAAG;AAwBvD;;AC/BA;;AAEG;;"}
1
+ {"version":3,"file":"acorex-platform-extension-ai-document-client.mjs","sources":["../../../../libs/extensions/ai/document/client/src/lib/document-metadata-ocr.settings.provider.ts","../../../../libs/extensions/ai/document/client/src/lib/document-metadata-schema.util.ts","../../../../libs/extensions/ai/document/client/src/lib/document-metadata-ai-prefill.service.ts","../../../../libs/extensions/ai/document/client/src/lib/document-metadata-ai-fill.orchestrator.ts","../../../../libs/extensions/ai/document/client/src/lib/document-layout-builder-dialog-context-changed.hook.ts","../../../../libs/extensions/ai/document/client/src/lib/ai-document-extension.module.ts","../../../../libs/extensions/ai/document/client/src/lib/document-attachment-dialog.hooks.ts","../../../../libs/extensions/ai/document/client/src/acorex-platform-extension-ai-document-client.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { RootConfig } from '@acorex-platform/module-ai-management-client/contracts';\nimport { AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '@acorex-platform/framework-client/common';\nimport { objectKeyValueTransforms } from '@acorex-platform/framework-client/core';\nimport { AXPWidgetsCatalog } from '@acorex-platform/framework-shared/core';\nimport { Injectable } from '@angular/core';\nimport { AXEDocumentMetadataOcrSettings } from '@acorex-platform/extension-ai-document-client/contracts';\n\n//#endregion\n\n//#region ---- Settings provider ----\n\nconst METADATA_OCR_I18N = '@extensions-ai-document:settings.metadata-ocr';\n\n/** Intelligence group created by `AXMAiManagementSettingProvider`. Module AI settings attach here. */\nconst AI_SETTINGS_GROUP = 'ai-settings';\n\n@Injectable()\nexport class AXEDocumentAiSettingProvider implements AXPSettingDefinitionProvider {\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n if (!context.hasGroup(AI_SETTINGS_GROUP)) {\n return;\n }\n\n const assistVisibility = `{{ context.eval('${AXEDocumentMetadataOcrSettings.Enabled}') }}`;\n\n const intelligence = context.group(AI_SETTINGS_GROUP);\n if (!intelligence) {\n return;\n }\n\n intelligence\n .addSection('metadata-ocr', `${METADATA_OCR_I18N}.section-title`, `${METADATA_OCR_I18N}.section-description`)\n .addSetting({\n key: AXEDocumentMetadataOcrSettings.Enabled,\n title: `${METADATA_OCR_I18N}.enabled-title`,\n scope: 'T',\n overridableAt: [],\n isInherited: true,\n defaultValue: true,\n searchTagKeys: [`${METADATA_OCR_I18N}.enabled-search-tags`],\n widget: {\n type: AXPWidgetsCatalog.toggle,\n },\n description: `${METADATA_OCR_I18N}.enabled-description`,\n })\n .addSetting({\n key: AXEDocumentMetadataOcrSettings.AssistId,\n title: `${METADATA_OCR_I18N}.assist-id-title`,\n scope: 'T',\n overridableAt: [],\n isInherited: true,\n // Persist assist primary key (`id`); demo defaults come from settings seed/overrides.\n searchTagKeys: [`${METADATA_OCR_I18N}.assist-search-tags`],\n valueTransforms: objectKeyValueTransforms('id'),\n widget: {\n type: AXPWidgetsCatalog.lookup,\n options: {\n entity: `${RootConfig.module.name}.${RootConfig.entities.assist.name}`,\n look: 'select',\n multiple: false,\n textField: 'title',\n valueField: 'id',\n hasClearButton: true,\n visibility: assistVisibility,\n },\n },\n description: `${METADATA_OCR_I18N}.assist-id-description`,\n })\n .endSection();\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport {\n resolveMetaDataFieldAppliesTo,\n type AXMMetaDataBuilderValue,\n type AXMMetaDataLocalizedString,\n} from '@acorex-platform/module-data-management-client/contracts';\nimport { canAiExtractDocument } from '@acorex-platform/module-ai-management-client/contracts';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface DocumentMetadataFieldDescriptor {\n name: string;\n title: AXMMetaDataLocalizedString;\n interfaceType: string;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\n/**\n * Synthetic mapping key for the document-level Expire Date control\n * (`file-*.expirationDate` when the document type has `enableExpiration`).\n * Not part of `metaDataForm`.\n */\nexport const DOCUMENT_EXPIRATION_DATE_FIELD_NAME = 'expirationDate';\n\n//#endregion\n\n//#region ---- Field collection ----\n\n/**\n * Flattens metadata selector value into field descriptors for LLM mapping prompts.\n */\nexport function collectMetadataFieldDescriptors(\n meta: AXMMetaDataBuilderValue | undefined | null,\n): DocumentMetadataFieldDescriptor[] {\n if (!meta?.groups?.length) {\n return [];\n }\n const out: DocumentMetadataFieldDescriptor[] = [];\n for (const g of meta.groups) {\n for (const f of g.fields ?? []) {\n if (resolveMetaDataFieldAppliesTo(f) === 'folder') {\n continue;\n }\n out.push({\n name: f.name,\n title: f.title ?? f.name,\n interfaceType: f.interface,\n });\n }\n }\n return out;\n}\n\n/**\n * Appends the platform document expire-date field used by attachment dialogs.\n */\nexport function withDocumentExpirationField(\n fields: DocumentMetadataFieldDescriptor[],\n include: boolean,\n): DocumentMetadataFieldDescriptor[] {\n if (!include) {\n return fields;\n }\n if (fields.some((f) => f.name === DOCUMENT_EXPIRATION_DATE_FIELD_NAME)) {\n return fields;\n }\n return [\n ...fields,\n {\n name: DOCUMENT_EXPIRATION_DATE_FIELD_NAME,\n title: '@extensions-ai-document:fields.expire-date.title',\n interfaceType: 'date-time-editor',\n },\n ];\n}\n\n//#endregion\n\n//#region ---- JSON parsing ----\n\n/**\n * Coerces common OCR / LLM date strings into YYYY-MM-DD (or leaves non-dates unchanged).\n */\nexport function normalizePrefillDateValue(value: unknown): unknown {\n if (value == null || value === '') {\n return value;\n }\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n return toIsoDateOnly(value);\n }\n if (typeof value !== 'string') {\n return value;\n }\n const raw = value.trim();\n if (!raw) {\n return value;\n }\n\n const iso = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(raw);\n if (iso) {\n return `${iso[1]}-${iso[2]}-${iso[3]}`;\n }\n\n // US-style MM/DD/YYYY (common on driver licences).\n const us = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/.exec(raw);\n if (us) {\n const month = Number(us[1]);\n const day = Number(us[2]);\n const year = Number(us[3]);\n if (month >= 1 && month <= 12 && day >= 1 && day <= 31) {\n return `${year}-${pad2(month)}-${pad2(day)}`;\n }\n }\n\n const parsed = new Date(raw);\n if (!Number.isNaN(parsed.getTime())) {\n return toIsoDateOnly(parsed);\n }\n return value;\n}\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nfunction toIsoDateOnly(d: Date): string {\n return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\n/**\n * Normalizes date-like mapped values for date widgets; strips the synthetic expiration key from meta.\n */\nexport function splitMappedPrefill(\n parsed: Record<string, unknown>,\n fields: DocumentMetadataFieldDescriptor[],\n): { meta: Record<string, unknown>; expirationDate?: string } {\n const dateNames = new Set(\n fields\n .filter((f) => {\n const t = String(f.interfaceType ?? '').toLowerCase();\n return t.includes('date-time') || t.includes('date');\n })\n .map((f) => f.name),\n );\n\n const meta: Record<string, unknown> = {};\n let expirationDate: string | undefined;\n\n for (const [k, v] of Object.entries(parsed)) {\n const normalized = dateNames.has(k) ? normalizePrefillDateValue(v) : v;\n if (k === DOCUMENT_EXPIRATION_DATE_FIELD_NAME) {\n if (typeof normalized === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(normalized)) {\n expirationDate = normalized;\n } else if (normalized instanceof Date && !Number.isNaN(normalized.getTime())) {\n expirationDate = toIsoDateOnly(normalized);\n }\n continue;\n }\n meta[k] = normalized;\n }\n\n return expirationDate ? { meta, expirationDate } : { meta };\n}\n\n/**\n * Parses a JSON object from an assistant reply (strips optional ```json fences).\n */\nexport function parseMetadataMappingJson(text: string): Record<string, unknown> {\n const trimmed = text.trim();\n const fence = /^```(?:json)?\\s*([\\s\\S]*?)```$/m.exec(trimmed);\n const raw = fence ? fence[1]!.trim() : trimmed;\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (parsed != null && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // ignore\n }\n return {};\n}\n\n/**\n * Shallow merge: only fills keys that are empty in `existing`.\n */\nexport function mergeMetadataPrefill(\n existing: Record<string, unknown> | undefined,\n partial: Record<string, unknown>,\n): Record<string, unknown> {\n const base = { ...(existing ?? {}) };\n for (const [k, v] of Object.entries(partial)) {\n const cur = base[k];\n const empty = cur === undefined || cur === null || cur === '';\n if (empty && v !== undefined && v !== null && v !== '') {\n base[k] = v;\n }\n }\n return base;\n}\n\n//#endregion\n\n//#region ---- File kind ----\n\ntype FileListItemLike = {\n name?: string;\n type?: string;\n source?: { kind?: string; value?: unknown };\n};\n\n/**\n * Returns true when the file list item is supported for AI document text extraction.\n */\nexport function isAiExtractableFileListItem(item: FileListItemLike | undefined): boolean {\n if (!item) {\n return false;\n }\n const t = typeof item.type === 'string' ? item.type : '';\n const name = String(item.name ?? '');\n if (canAiExtractDocument(t, name)) {\n return true;\n }\n const src = item.source?.value;\n if (src instanceof Blob) {\n const blobType = typeof src.type === 'string' ? src.type : '';\n if (canAiExtractDocument(blobType, name)) {\n return true;\n }\n }\n if (src instanceof File) {\n if (canAiExtractDocument(src.type, src.name || name)) {\n return true;\n }\n }\n return false;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPFileListItem, AXPFileStorageStatus, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport {\n AIMANAGEMENT_EXTRACT_DOCUMENT_TEXT_COMMAND_KEY,\n} from '@acorex-platform/module-ai-management-client/contracts';\nimport type { AXMMetaDataBuilderValue } from '@acorex-platform/module-data-management-client/contracts';\n\nimport {\n AXPDebugService,\n AXPFileStorageService,\n AXPSettingsService,\n extractRequestErrorInfo,\n} from '@acorex-platform/framework-client/common';\n\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { Injectable, inject } from '@angular/core';\nimport { AXEDocumentMetadataOcrSettings } from '@acorex-platform/extension-ai-document-client/contracts';\nimport {\n collectMetadataFieldDescriptors,\n isAiExtractableFileListItem,\n mergeMetadataPrefill,\n parseMetadataMappingJson,\n splitMappedPrefill,\n withDocumentExpirationField,\n} from './document-metadata-schema.util';\n\n/** Payload shape for ExtractDocumentText command `data`. */\ntype AiExtractCommandData = { text?: string; values?: Record<string, unknown> };\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst DOCUMENT_MODULE_REF_TYPE = 'DocumentManagement.Document';\n\nconst SINGLE_DOCUMENT_PROGRESS_SCOPE = { documentIndex: 1, documentCount: 1 } as const;\n\n/** Phases surfaced to UI (loading dialog thinking text). */\nexport type AXEDocumentMetadataAiPrefillPhase =\n | 'preparing'\n | 'uploading'\n | 'extracting';\n\n/** Progress event for optional UI updates during metadata AI fill. */\nexport interface AXEDocumentMetadataAiPrefillProgressEvent {\n phase: AXEDocumentMetadataAiPrefillPhase;\n /** 1-based slot among documents processed in this run. */\n documentIndex: number;\n /** Total extractable document slots queued in this run. */\n documentCount: number;\n}\n\n//#endregion\n\n//#region ----- Local helpers -----\n\nconst OCR_FAILED_I18N = '@extensions-ai-document:widgets.metadata-ai-fill.ocr-failed';\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n}\n\nfunction stringifyErrorDetails(details: unknown): string {\n if (typeof details === 'string' && details.trim()) {\n return details.trim();\n }\n if (details == null) {\n return '';\n }\n try {\n return JSON.stringify(details);\n } catch {\n return String(details);\n }\n}\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * Runs AI document text extraction for metadata prefill (images, PDF, simple text files).\n * ExtractDocumentText command; when field names are passed it returns a key/value object.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXEDocumentMetadataAiPrefillService {\n //#region ----- Services & Dependencies -----\n\n private readonly fileStorage = inject(AXPFileStorageService);\n private readonly commandService = inject(AXPCommandService);\n private readonly settings = inject(AXPSettingsService);\n private readonly debug = inject(AXPDebugService);\n\n //#endregion\n\n /**\n * Whether OCR metadata prefill is enabled in tenant settings.\n * Defaults to true when the setting has never been stored (opt-out via settings UI).\n */\n async isMetadataOcrEnabled(): Promise<boolean> {\n const v = await this.settings.get<boolean>(AXEDocumentMetadataOcrSettings.Enabled);\n if (v == null) {\n return true;\n }\n return v;\n }\n\n /**\n * Whether {@link applyDialogContextMetadataAiFillFromDocuments} would extract at least one document\n * (caller can safely show an indeterminate loading dialog).\n */\n willApplyMetadataAiFillFromDocuments(\n dialogRef: {\n context: () => Record<string, unknown>;\n patchContext?: (partial: Record<string, unknown>) => void;\n },\n integration: Record<string, unknown>,\n ): boolean {\n if (!dialogRef.patchContext) {\n return false;\n }\n const documentType = integration['documentType'] as {\n metaDataList?: AXMMetaDataBuilderValue | null;\n enableExpiration?: boolean;\n } | undefined;\n const metaDataList = documentType?.metaDataList;\n const fields = withDocumentExpirationField(\n collectMetadataFieldDescriptors(metaDataList ?? undefined),\n !!documentType?.enableExpiration,\n );\n if (fields.length === 0) {\n return false;\n }\n const ctx = dialogRef.context();\n const files = ctx['files'] as Array<{ file?: unknown[] }> | undefined;\n const n = files?.length ?? 0;\n for (let i = 0; i < n; i++) {\n const slot = files![i]?.file;\n const first = Array.isArray(slot) ? (slot[0] as (AXPFileListItem & { type?: string }) | undefined) : undefined;\n if (first && isAiExtractableFileListItem(first)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Uploads a blob-backed file item to storage for vision APIs that require {@link fileId}.\n */\n async ensureStoredFileId(fileItem: AXPFileListItem & { type?: string }, folderId: string): Promise<string | null> {\n // Only trust an explicit storage fileId. Chooser items use a client UUID on `id` with `source.kind === 'blob'`.\n if (fileItem.source?.kind === 'fileId' && typeof fileItem.source.value === 'string') {\n const storedId = fileItem.source.value.trim();\n if (storedId) {\n return storedId;\n }\n }\n\n const file = this.resolveFileForUpload(fileItem);\n if (!file) {\n return null;\n }\n\n const refId = folderId?.trim() || 'document-metadata-ocr-prefill';\n const saved = await this.fileStorage.save({\n file,\n name: fileItem.name,\n refId,\n refType: DOCUMENT_MODULE_REF_TYPE,\n category: 'document',\n status: AXPFileStorageStatus.Temporary,\n });\n return saved.fileId?.trim() || null;\n }\n\n /**\n * OCR + field extraction in one vision call; returns merged metadata (only fills empty keys in {@link existingMeta}).\n */\n async prefillFromDocumentExtract(options: {\n fileItem: AXPFileListItem & { type?: string };\n folderId: string;\n metaDataList: AXMMetaDataBuilderValue | undefined | null;\n existingMeta: Record<string, unknown> | undefined;\n /** When true, also map OCR EXP/expiry into document `expirationDate`. */\n includeDocumentExpiration?: boolean;\n existingExpirationDate?: unknown;\n /** When set with {@link signalProgress}, scopes step copy to multi-document dialogs. */\n progressScope?: { documentIndex: number; documentCount: number };\n /** When aborted, throws {@link DOMException} with name `AbortError`. */\n signal?: AbortSignal;\n /** Optional UI wiring (loading dialog thinking lines). */\n signalProgress?: (event: AXEDocumentMetadataAiPrefillProgressEvent) => void;\n }): Promise<{ extractText: string; merged: Record<string, unknown>; expirationDate?: string }> {\n const signal = options.signal;\n const notify = (\n phase: AXEDocumentMetadataAiPrefillPhase,\n scope: { documentIndex: number; documentCount: number } = options.progressScope ??\n SINGLE_DOCUMENT_PROGRESS_SCOPE,\n ) => options.signalProgress?.({ phase, ...scope });\n\n throwIfAborted(signal);\n\n const fields = withDocumentExpirationField(\n collectMetadataFieldDescriptors(options.metaDataList ?? undefined),\n !!options.includeDocumentExpiration,\n );\n if (fields.length === 0) {\n return { extractText: '', merged: { ...(options.existingMeta ?? {}) } };\n }\n\n notify('uploading');\n const fileId = await this.ensureStoredFileId(options.fileItem, options.folderId);\n throwIfAborted(signal);\n if (!fileId) {\n throw new Error('Could not upload the file for document extraction.');\n }\n\n notify('extracting');\n const extractResult = await this.commandService.execute(AIMANAGEMENT_EXTRACT_DOCUMENT_TEXT_COMMAND_KEY, {\n fileId,\n fields: fields.map((field) => field.name),\n });\n throwIfAborted(signal);\n if (extractResult?.success === false) {\n throw this.extractCommandFailure(extractResult);\n }\n const extractData = runtimeCommandPayloadData(extractResult) as AiExtractCommandData | undefined;\n const extractText = typeof extractData?.text === 'string' ? extractData.text : '';\n const parsed =\n extractData?.values && typeof extractData.values === 'object' && !Array.isArray(extractData.values)\n ? extractData.values\n : parseMetadataMappingJson(extractText);\n if (Object.keys(parsed).length === 0 && !extractText.trim()) {\n throw this.extractCommandFailure(extractResult);\n }\n const { meta, expirationDate } = splitMappedPrefill(parsed, fields);\n const merged = mergeMetadataPrefill(options.existingMeta, meta);\n\n const existingExpEmpty =\n options.existingExpirationDate === undefined ||\n options.existingExpirationDate === null ||\n options.existingExpirationDate === '';\n return {\n extractText,\n merged,\n ...(existingExpEmpty && expirationDate ? { expirationDate } : {}),\n };\n }\n\n /**\n * For each extractable document slot in `context.files`, merges extraction + AI metadata into `file-{i}.metaDataForm`.\n */\n async applyDialogContextMetadataAiFillFromDocuments(\n dialogRef: {\n context: () => Record<string, unknown>;\n patchContext?: (partial: Record<string, unknown>) => void;\n },\n integration: Record<string, unknown>,\n options?: {\n signal?: AbortSignal;\n signalProgress?: (event: AXEDocumentMetadataAiPrefillProgressEvent) => void;\n },\n ): Promise<void> {\n if (!dialogRef.patchContext) {\n return;\n }\n const folderId = String(integration['parentId'] ?? '').trim();\n const documentType = integration['documentType'] as {\n metaDataList?: AXMMetaDataBuilderValue | null;\n enableExpiration?: boolean;\n } | undefined;\n const metaDataList = documentType?.metaDataList;\n const includeDocumentExpiration = !!documentType?.enableExpiration;\n const ctx = dialogRef.context();\n const files = ctx['files'] as Array<{ file?: unknown[] }> | undefined;\n const n = files?.length ?? 0;\n const patch: Record<string, unknown> = {};\n\n const documentIndices: number[] = [];\n for (let i = 0; i < n; i++) {\n const slot = files![i]?.file;\n const first = Array.isArray(slot) ? (slot[0] as (AXPFileListItem & { type?: string }) | undefined) : undefined;\n if (first && isAiExtractableFileListItem(first)) {\n documentIndices.push(i);\n }\n }\n const signal = options?.signal;\n const documentCount = documentIndices.length;\n if (documentCount > 0) {\n options?.signalProgress?.({\n phase: 'preparing',\n documentIndex: 1,\n documentCount,\n });\n throwIfAborted(signal);\n }\n\n let processed = 0;\n for (const i of documentIndices) {\n throwIfAborted(signal);\n processed += 1;\n const slot = files![i]?.file;\n const first = Array.isArray(slot) ? (slot[0] as (AXPFileListItem & { type?: string }) | undefined) : undefined;\n if (!first) {\n continue;\n }\n const fileBlock = ctx[`file-${i}`] as Record<string, unknown> | undefined;\n const existingMeta = fileBlock?.['metaDataForm'] as Record<string, unknown> | undefined;\n const { merged, expirationDate } = await this.prefillFromDocumentExtract({\n fileItem: first,\n folderId,\n metaDataList,\n existingMeta,\n includeDocumentExpiration,\n existingExpirationDate: fileBlock?.['expirationDate'],\n progressScope: { documentIndex: processed, documentCount },\n signal,\n signalProgress: options?.signalProgress,\n });\n patch[`file-${i}`] = {\n ...(typeof fileBlock === 'object' && fileBlock ? fileBlock : {}),\n metaDataForm: merged,\n ...(expirationDate ? { expirationDate } : {}),\n };\n }\n\n if (Object.keys(patch).length > 0) {\n dialogRef.patchContext(patch);\n }\n }\n\n //#region ----- Utility Methods -----\n\n private extractCommandFailure(extractResult: unknown): Error {\n const info = extractRequestErrorInfo(extractResult);\n const details = stringifyErrorDetails(info?.details);\n this.debug.error('ai-document', 'extract-document-text', 'ExtractDocumentText failed', () => ({\n message: info?.message,\n details: info?.details,\n }));\n const text = typeof info?.message === 'string' ? info.message.trim() : '';\n if (text.startsWith('@')) {\n return new Error(text);\n }\n if (this.debug.isDebugMode() && details) {\n return new Error(details);\n }\n return new Error(OCR_FAILED_I18N);\n }\n\n private resolveFileForUpload(item: AXPFileListItem & { type?: string }): File | null {\n const v = item.source?.value;\n if (v instanceof File) {\n return v;\n }\n if (item.source?.kind === 'blob' && v instanceof Blob) {\n return new File([v], item.name, { type: item.type ?? v.type ?? 'application/octet-stream' });\n }\n return null;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXLoadingDialogService } from '@acorex/components/loading-dialog';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPDebugService } from '@acorex-platform/framework-client/common';\nimport { Injectable, inject } from '@angular/core';\nimport {\n AXEDocumentMetadataAiPrefillProgressEvent,\n AXEDocumentMetadataAiPrefillService,\n} from './document-metadata-ai-prefill.service';\n\n//#endregion\n\n//#region ---- Types ----\n\n/** Dialog surface that supports context patch (layout attachment dialog). */\nexport interface AXEDocumentMetadataAiFillDialogTarget {\n context: () => Record<string, unknown>;\n patchContext?: (partial: Record<string, unknown>) => void;\n}\n\nexport interface AXEDocumentMetadataAiFillRunResult {\n success: boolean;\n errorMessage?: string;\n /** User chose Skip on the loading dialog; treat as neutral (no failure toast) where applicable. */\n cancelled?: boolean;\n /** User declined OCR on the confirm dialog. */\n declined?: boolean;\n}\n\ntype MetadataAiProgressColor = 'primary' | 'danger' | 'success';\n\n/** Indeterminate loading dialog surface (see {@link AXLoadingDialogService.show}). */\ninterface MetadataAiLoadingDialogRef {\n close: () => void;\n setProgressText: (text: string) => void;\n setProgressColor: (color: MetadataAiProgressColor) => void;\n}\n\n//#endregion\n\nconst METADATA_AI_CONFIRM_I18N = '@extensions-ai-document:widgets.metadata-ai-fill.confirm';\nconst METADATA_AI_LOADING_I18N = '@extensions-ai-document:widgets.metadata-ai-fill.loading';\n\n/** Smoother dismiss after work completes. */\nconst LOADING_DIALOG_CLOSE_DELAY_MS = 400;\n\n//#region ---- Orchestrator ----\n\n/**\n * Shared OCR + AI metadata prefill UX: confirm after image choose, then indeterminate loading dialog.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXEDocumentMetadataAiFillOrchestrator {\n //#region ---- Dependencies ----\n\n private readonly prefill = inject(AXEDocumentMetadataAiPrefillService);\n private readonly dialogService = inject(AXDialogService);\n private readonly loadingDialog = inject(AXLoadingDialogService);\n private readonly translation = inject(AXTranslationService);\n private readonly debug = inject(AXPDebugService);\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Asks whether to run OCR; on Yes runs {@link run}, on No returns {@link AXEDocumentMetadataAiFillRunResult.declined}.\n */\n async confirmAndRun(\n dialogTarget: AXEDocumentMetadataAiFillDialogTarget,\n integration: Record<string, unknown>,\n ): Promise<AXEDocumentMetadataAiFillRunResult> {\n if (!this.prefill.willApplyMetadataAiFillFromDocuments(dialogTarget, integration)) {\n return { success: true };\n }\n\n const [title, message] = await Promise.all([\n this.translation.translateAsync(`${METADATA_AI_CONFIRM_I18N}.title`),\n this.translation.translateAsync(`${METADATA_AI_CONFIRM_I18N}.message`),\n ]);\n const dialogResult = await this.dialogService.confirm(title, message, 'primary', 'horizontal', false, 'cancel');\n if (!dialogResult.result) {\n return { success: true, declined: true };\n }\n\n return this.run(dialogTarget, integration);\n }\n\n /**\n * Runs metadata AI fill when eligible; shows an indeterminate loading dialog while work is in progress.\n */\n async run(\n dialogTarget: AXEDocumentMetadataAiFillDialogTarget,\n integration: Record<string, unknown>,\n ): Promise<AXEDocumentMetadataAiFillRunResult> {\n const showLoading = this.prefill.willApplyMetadataAiFillFromDocuments(dialogTarget, integration);\n\n const abortController = new AbortController();\n let loadingDismissedEarly = false;\n\n let progressDialog: MetadataAiLoadingDialogRef | undefined;\n\n if (showLoading) {\n const [title, initial, skipLabel] = await Promise.all([\n this.translation.translateAsync(`${METADATA_AI_LOADING_I18N}.title`),\n this.translation.translateAsync(`${METADATA_AI_LOADING_I18N}.initial`),\n this.translation.translateAsync(`${METADATA_AI_LOADING_I18N}.skip-button`),\n ]);\n progressDialog = this.loadingDialog.show({\n title,\n mode: 'indeterminate',\n progressColor: 'primary',\n text: initial,\n buttons: [\n {\n text: skipLabel,\n onClick: () => {\n loadingDismissedEarly = true;\n abortController.abort();\n progressDialog?.close();\n },\n },\n ],\n }) as MetadataAiLoadingDialogRef;\n }\n\n try {\n await this.prefill.applyDialogContextMetadataAiFillFromDocuments(dialogTarget, integration, {\n signal: showLoading ? abortController.signal : undefined,\n signalProgress: (event) => {\n if (!progressDialog) {\n return;\n }\n void this.applyProgressText(progressDialog, event);\n },\n });\n if (progressDialog && !loadingDismissedEarly) {\n await this.markProgressComplete(progressDialog);\n }\n return { success: true };\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return { success: false, cancelled: true };\n }\n const errorMessage = await this.resolveFailureMessage(err);\n if (progressDialog && !loadingDismissedEarly) {\n try {\n progressDialog.setProgressColor('danger');\n progressDialog.setProgressText(errorMessage);\n } catch {\n // Ignore dialog update failures.\n }\n }\n if (this.debug.isDebugMode() && progressDialog && !loadingDismissedEarly) {\n loadingDismissedEarly = true;\n }\n return { success: false, errorMessage };\n } finally {\n if (progressDialog !== undefined && !loadingDismissedEarly) {\n const dlg = progressDialog;\n setTimeout(() => dlg.close(), LOADING_DIALOG_CLOSE_DELAY_MS);\n }\n }\n }\n\n //#endregion\n\n //#region ---- Progress ----\n\n private async applyProgressText(\n dialog: MetadataAiLoadingDialogRef,\n event: AXEDocumentMetadataAiPrefillProgressEvent,\n ): Promise<void> {\n try {\n dialog.setProgressColor('primary');\n const line = await this.formatProgressLine(event);\n dialog.setProgressText(line);\n } catch {\n // Ignore translation / dialog failures; keep the previous UI state.\n }\n }\n\n private async markProgressComplete(dialog: MetadataAiLoadingDialogRef): Promise<void> {\n try {\n dialog.setProgressColor('success');\n dialog.setProgressText(await this.translation.translateAsync(`${METADATA_AI_LOADING_I18N}.complete`));\n } catch {\n dialog.setProgressColor('success');\n }\n }\n\n private async resolveFailureMessage(err: unknown): Promise<string> {\n const raw = err instanceof Error ? err.message.trim() : '';\n if (this.debug.isDebugMode() && raw && !raw.startsWith('@')) {\n const prefix = await this.translation.translateAsync(\n '@extensions-ai-document:widgets.metadata-ai-fill.ocr-failed-prefix',\n );\n return `${prefix} ${raw}`;\n }\n const key = raw.startsWith('@') ? raw : '@extensions-ai-document:widgets.metadata-ai-fill.ocr-failed';\n return this.translation.translateAsync(key);\n }\n\n private async formatProgressLine(event: AXEDocumentMetadataAiPrefillProgressEvent): Promise<string> {\n const phaseKey = `${METADATA_AI_LOADING_I18N}.thinking.${event.phase}`;\n const phaseText = await this.translation.translateAsync(phaseKey);\n if (event.documentCount > 1) {\n return this.translation.translateAsync(`${METADATA_AI_LOADING_I18N}.step-prefix`, {\n params: {\n current: event.documentIndex,\n total: event.documentCount,\n phase: phaseText,\n },\n });\n }\n return phaseText;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\r\n\r\nimport type { AXPHookProvider } from '@acorex-platform/framework-client/core';\r\nimport {\r\n AXP_LAYOUT_BUILDER_DIALOG_CONTEXT_CHANGED_HOOK_KEY,\r\n type AXPLayoutBuilderDialogContextChangedPayload,\r\n} from '@acorex-platform/framework-client/layout/builder';\r\nimport { inject } from '@angular/core';\r\nimport { AXEDocumentMetadataAiFillOrchestrator } from './document-metadata-ai-fill.orchestrator';\r\nimport { AXEDocumentMetadataAiPrefillService } from './document-metadata-ai-prefill.service';\r\nimport { isAiExtractableFileListItem } from './document-metadata-schema.util';\r\n\r\n//#endregion\r\n\r\n//#region ---- Local state (per-popup session keys from dialog renderer) ----\r\n\r\ntype AiPromptSessionState = {\r\n busy?: boolean;\r\n lastProcessedSig?: string;\r\n};\r\n\r\nconst promptSessions = new Map<string, AiPromptSessionState>();\r\n\r\nfunction sessionState(sessionKey: string): AiPromptSessionState {\r\n let s = promptSessions.get(sessionKey);\r\n if (!s) {\r\n s = {};\r\n promptSessions.set(sessionKey, s);\r\n }\r\n return s;\r\n}\r\n\r\n//#endregion\r\n\r\n//#region ---- Helpers ----\r\n\r\n/**\r\n * Document Management attachment dialogs expose this metadata so extensions can scope integration-only hooks.\r\n */\r\nfunction isDocumentAttachmentDialogIntegration(metadata: Record<string, unknown>): boolean {\r\n return metadata['showMeta'] === true && metadata['hasMetaFields'] === true && metadata['documentType'] != null;\r\n}\r\n\r\n/**\r\n * Stable fingerprint for extractable document slots — ignores metadata field edits so we do not re-prompt on every keystroke.\r\n */\r\nfunction extractableAttachmentSlotsSignature(context: Record<string, unknown>): string {\r\n const files = context['files'] as Array<{ file?: unknown[] }> | undefined;\r\n if (!Array.isArray(files) || files.length === 0) {\r\n return '';\r\n }\r\n const parts: string[] = [];\r\n for (let i = 0; i < files.length; i++) {\r\n const slot = files[i]?.file;\r\n const first = Array.isArray(slot) ? (slot[0] as Record<string, unknown> | undefined) : undefined;\r\n if (!first || !isAiExtractableFileListItem(first as { name?: string; type?: string })) {\r\n continue;\r\n }\r\n const name = String(first['name'] ?? '');\r\n const size = typeof first['size'] === 'number' ? first['size'] : '';\r\n const mime = String(first['type'] ?? '');\r\n const src = first['source'] as { kind?: string; value?: unknown } | undefined;\r\n const kind = String(src?.kind ?? '');\r\n let sourceFingerprint = '';\r\n if (kind === 'fileId' && typeof src?.value === 'string') {\r\n sourceFingerprint = `fileId:${src.value}`;\r\n } else if (kind === 'blob' && src?.value instanceof Blob) {\r\n sourceFingerprint = `blob:${src.value.size}:${src.value.type}`;\r\n } else if (src?.value instanceof File) {\r\n const f = src.value;\r\n sourceFingerprint = `file:${f.size}:${f.type}`;\r\n } else {\r\n sourceFingerprint = `${kind}:${typeof src?.value}`;\r\n }\r\n parts.push(`${i}:${name}:${size}:${mime}:${sourceFingerprint}`);\r\n }\r\n return parts.join('|');\r\n}\r\n\r\n//#endregion\r\n\r\n//#region ---- Hook provider ----\r\n\r\n/**\r\n * When document extraction is enabled and the attachment dialog has metadata + extractable files, prompts the user\r\n * after files appear. Yes → loading dialog + AI prefill; No → leave metadata form empty for manual entry.\r\n * Dedupes by attachment-slot signature so field edits do not re-prompt.\r\n * Properties (`skipMetadataAiFill`) skips this prompt so existing metadata is not overwritten.\r\n */\r\nexport const AXEDocumentLayoutBuilderDialogContextChangedHookProvider: AXPHookProvider<\r\n AXPLayoutBuilderDialogContextChangedPayload,\r\n AXPLayoutBuilderDialogContextChangedPayload\r\n> = {\r\n key: AXP_LAYOUT_BUILDER_DIALOG_CONTEXT_CHANGED_HOOK_KEY,\r\n priority: 50,\r\n async execute(\r\n data: AXPLayoutBuilderDialogContextChangedPayload,\r\n ): Promise<AXPLayoutBuilderDialogContextChangedPayload> {\r\n const integration = data.metadata ?? {};\r\n\r\n if (!isDocumentAttachmentDialogIntegration(integration)) {\r\n return data;\r\n }\r\n if (integration['skipMetadataAiFill'] === true) {\r\n return data;\r\n }\r\n\r\n const prefill = inject(AXEDocumentMetadataAiPrefillService);\r\n const orchestrator = inject(AXEDocumentMetadataAiFillOrchestrator);\r\n\r\n if (!(await prefill.isMetadataOcrEnabled())) {\r\n return data;\r\n }\r\n\r\n const ctx = data.getContext();\r\n const sig = extractableAttachmentSlotsSignature(ctx);\r\n if (!sig) {\r\n return data;\r\n }\r\n\r\n const st = sessionState(data.sessionKey);\r\n if (st.busy) {\r\n return data;\r\n }\r\n if (st.lastProcessedSig === sig) {\r\n return data;\r\n }\r\n\r\n const dialogTarget = {\r\n context: () => data.getContext(),\r\n patchContext: (partial: Record<string, unknown>) => data.patchContext(partial),\r\n };\r\n\r\n if (!prefill.willApplyMetadataAiFillFromDocuments(dialogTarget, integration)) {\r\n return data;\r\n }\r\n\r\n st.busy = true;\r\n try {\r\n await orchestrator.confirmAndRun(dialogTarget, integration);\r\n st.lastProcessedSig = sig;\r\n } catch {\r\n st.lastProcessedSig = sig;\r\n } finally {\r\n st.busy = false;\r\n }\r\n\r\n return data;\r\n },\r\n};\r\n\r\n//#endregion\r\n","//#region ---- Imports ----\r\n\r\nimport { NgModule } from '@angular/core';\r\nimport { AXMAiManagementModule } from '@acorex-platform/module-ai-management-client';\r\nimport { AXMDocumentManagementModule } from '@acorex-platform/module-document-management-client';\r\nimport { AXP_SETTING_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/common';\r\nimport { AXP_HOOK_PROVIDER } from '@acorex-platform/framework-client/core';\r\n\r\nimport { AXEDocumentAiSettingProvider } from './document-metadata-ocr.settings.provider';\r\nimport { AXEDocumentLayoutBuilderDialogContextChangedHookProvider } from './document-layout-builder-dialog-context-changed.hook';\r\n\r\n//#endregion\r\n\r\n//#region ---- Module ----\r\n\r\n/**\r\n * Optional AI + OCR metadata helpers for document flows.\r\n * Register in the app next to {@link AXMDocumentManagementModule} and {@link AXMAiManagementModule}.\r\n */\r\n@NgModule({\r\n imports: [AXMAiManagementModule, AXMDocumentManagementModule],\r\n providers: [\r\n {\r\n provide: AXP_SETTING_DEFINITION_PROVIDER,\r\n useClass: AXEDocumentAiSettingProvider,\r\n multi: true,\r\n },\r\n {\r\n provide: AXP_HOOK_PROVIDER,\r\n useValue: AXEDocumentLayoutBuilderDialogContextChangedHookProvider,\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class AXEAIDocumentExtensionModule {}\r\n\r\n//#endregion\r\n","//#region ---- Hook contract ----\n\n/**\n * Hook key for document attachment dialog integrations (caller wires `AXPHookService.runAsync` / listeners).\n * Payload carries the same dialog `context` object by reference so hooks can read or update nested paths\n * (for example `file-0.metaDataForm`, `files`) before the dialog is shown.\n */\nexport const AXE_DOCUMENT_ATTACHMENT_DIALOG_HOOK_KEY = 'document-management.attachment-dialog.configure';\n\n/**\n * Eligibility flags supplied by the caller (e.g. Document Management).\n */\nexport interface AXEDocumentAttachmentDialogEligibility {\n showMeta: boolean;\n hasMetaFields: boolean;\n hasImage: boolean;\n parentId: string;\n documentType: unknown;\n}\n\n/**\n * Payload for {@link AXE_DOCUMENT_ATTACHMENT_DIALOG_HOOK_KEY}.\n *\n * **Context by reference:** `context` must be the object that will be passed to the dialog (e.g. `setContext(context)`).\n * Hook providers may mutate or shallow-merge into this object so updates are visible when the dialog opens.\n */\nexport interface AXEDocumentAttachmentDialogHookPayload {\n context: Record<string, unknown>;\n eligibility: AXEDocumentAttachmentDialogEligibility;\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ {
2
+ "fields": {
3
+ "expire-date": {
4
+ "title": "Expire Date"
5
+ }
6
+ },
7
+ "settings": {
8
+ "metadata-ocr": {
9
+ "group-title": "Metadata from Documents (AI)",
10
+ "group-description": "Optional shortcut after document uploads: suggest metadata values from readable text. Nothing is saved until the person submits.",
11
+ "section-title": "Quick Fill from Document Text",
12
+ "section-description": "AI reads supported documents (images, PDF, simple text files) and suggests matching metadata values you can accept or edit.",
13
+ "enabled-title": "Document Text Metadata Suggestions",
14
+ "enabled-description": "When enabled, after someone chooses a supported document with metadata fields, they are asked whether to run AI extraction. Declining keeps the empty metadata form; accepting fills suggestions they can edit before submit.",
15
+ "enabled-search-tags": "OCR, Metadata, Document Upload, AI Fill, Quick Fill, PDF",
16
+ "assist-id-title": "Assist for Document Reading (Optional)",
17
+ "assist-id-description": "Choose which assist reads the file and maps it to your fields. Leave blank to use the tenant default from AI settings.",
18
+ "assist-search-tags": "Assist, AI, Default Assist, OCR, Document Reading, Metadata, PDF"
19
+ }
20
+ },
21
+ "widgets": {
22
+ "metadata-ai-fill": {
23
+ "hint": "Use AI to suggest empty metadata fields from text in this document.",
24
+ "confirm": {
25
+ "title": "Fill Metadata from This Document?",
26
+ "message": "AI can read the selected document and suggest values for metadata fields. Do you want to continue?"
27
+ },
28
+ "ocr-running": "Reading Text from Document…",
29
+ "ocr-done": "Document text suggestions applied — review fields before submit.",
30
+ "ocr-failed": "Could not read the document. Try again or fill the fields yourself.",
31
+ "ocr-failed-prefix": "Document Read Could Not Complete:",
32
+ "toast-error-title": "Could Not Complete AI Fill",
33
+ "loading": {
34
+ "title": "Filling Metadata With AI",
35
+ "initial": "Preparing…",
36
+ "skip-button": "Skip",
37
+ "complete": "Suggestions applied — review fields before submit.",
38
+ "step-prefix": "{{current}}/{{total}} · {{phase}}",
39
+ "thinking": {
40
+ "preparing": "Gathering Attachments to Process…",
41
+ "resolving-assist": "Selecting Assistant and Model…",
42
+ "uploading": "Uploading Document for Reading…",
43
+ "extracting": "Reading the Document and Filling Metadata Fields…",
44
+ "mapping": "Inferring Metadata Field Values…"
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "settings": {
3
+ "metadata-ocr": {
4
+ "group-title": "Metadata from Documents (AI)",
5
+ "group-description": "Optional shortcut after document uploads: suggest metadata values from readable text. Nothing is saved until the person submits.",
6
+ "section-title": "Quick Fill from Document Text",
7
+ "section-description": "AI reads supported documents (images, PDF, simple text files) and suggests matching metadata values you can accept or edit.",
8
+ "enabled-title": "Document Text Metadata Suggestions",
9
+ "enabled-description": "When enabled, after someone chooses a supported document with metadata fields, they are asked whether to run AI extraction. Declining keeps the empty metadata form; accepting fills suggestions they can edit before submit.",
10
+ "enabled-search-tags": "OCR, Metadata, Document Upload, AI Fill, Quick Fill, PDF",
11
+ "assist-id-title": "Assist for Document Reading (Optional)",
12
+ "assist-id-description": "Choose which assist reads the file and maps it to your fields. Leave blank to use the tenant default from AI settings.",
13
+ "assist-search-tags": "Assist, AI, Default Assist, OCR, Document Reading, Metadata, PDF"
14
+ }
15
+ },
16
+ "fields": {
17
+ "expire-date": {
18
+ "title": "Expire Date"
19
+ }
20
+ },
21
+ "widgets": {
22
+ "metadata-ai-fill": {
23
+ "hint": "Use AI to suggest empty metadata fields from text in this document.",
24
+ "confirm": {
25
+ "title": "Fill Metadata from This Document?",
26
+ "message": "AI can read the selected document and suggest values for metadata fields. Do you want to continue?"
27
+ },
28
+ "ocr-running": "Reading Text from Document…",
29
+ "ocr-done": "Document text suggestions applied — review fields before submit.",
30
+ "ocr-failed": "Could not read the document. Try again or fill the fields yourself.",
31
+ "ocr-failed-prefix": "Document Read Could Not Complete:",
32
+ "toast-error-title": "Could Not Complete AI Fill",
33
+ "loading": {
34
+ "title": "Filling Metadata With AI",
35
+ "initial": "Preparing…",
36
+ "skip-button": "Skip",
37
+ "complete": "Suggestions applied — review fields before submit.",
38
+ "step-prefix": "{{current}}/{{total}} · {{phase}}",
39
+ "thinking": {
40
+ "preparing": "Gathering Attachments to Process…",
41
+ "resolving-assist": "Selecting Assistant and Model…",
42
+ "uploading": "Uploading Document for Reading…",
43
+ "extracting": "Reading the Document and Filling Metadata Fields…",
44
+ "mapping": "Inferring Metadata Field Values…"
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "fields": {
3
+ "expire-date": {
4
+ "title": "تاریخ انقضا"
5
+ }
6
+ },
7
+ "settings": {
8
+ "metadata-ocr": {
9
+ "group-title": "فراداده از روی سند (هوش مصنوعی)",
10
+ "group-description": "میان‌بر اختیاری بعد از بارگذاری سند: پیشنهاد فراداده از متنِ خوانده‌شده. تا زمانی که کاربر ثبت نکند ذخیره نمی‌شود.",
11
+ "section-title": "پر کردن سریع از متن سند",
12
+ "section-description": "هوش مصنوعی سندهای پشتیبانی‌شده (تصویر، PDF، فایل متنی ساده) را می‌خواند و برای فیلدهای فراداده پیشنهاد می‌دهد؛ می‌توانید بپذیرید یا ویرایش کنید.",
13
+ "enabled-title": "پیشنهاد فراداده از متن سند",
14
+ "enabled-description": "اگر فعال باشد، بعد از انتخاب سند پشتیبانی‌شده وقتی فیلد فراداده وجود دارد از کاربر پرسیده می‌شود آیا استخراج متن با هوش مصنوعی اجرا شود. رد کردن فرم خالی را نگه می‌دارد؛ تأیید پیشنهادها را پر می‌کند تا قبل از ثبت ویرایش شوند.",
15
+ "enabled-search-tags": "OCR، فراداده، بارگذاری سند، پر کردن با هوش مصنوعی، پر کردن سریع، PDF",
16
+ "assist-id-title": "دستیار خواندن سند (اختیاری)",
17
+ "assist-id-description": "مشخص کنید کدام دستیار فایل را می‌خواند و به فیلدها نگاشت می‌کند. اگر خالی بماند، پیش‌فرض مستاجر از تنظیمات هوش مصنوعی استفاده می‌شود.",
18
+ "assist-search-tags": "دستیار، هوش مصنوعی، دستیار پیش‌فرض، OCR، خواندن سند، فراداده، PDF"
19
+ }
20
+ },
21
+ "widgets": {
22
+ "metadata-ai-fill": {
23
+ "hint": "برای فیلدهای خالی فراداده، پیشنهاد را از متن این سند با کمک هوش مصنوعی بگیرید.",
24
+ "confirm": {
25
+ "title": "فراداده از روی این سند پر شود؟",
26
+ "message": "هوش مصنوعی می‌تواند سند انتخاب‌شده را بخواند و برای فیلدهای فراداده پیشنهاد بدهد. ادامه می‌دهید؟"
27
+ },
28
+ "ocr-running": "در حال خواندن متن از سند…",
29
+ "ocr-done": "پیشنهادهای متن سند اعمال شد — قبل از ثبت، فیلدها را بررسی کنید.",
30
+ "ocr-failed": "خواندن سند انجام نشد. دوباره تلاش کنید یا فیلدها را خودتان پر کنید.",
31
+ "ocr-failed-prefix": "خواندن سند کامل نشد:",
32
+ "toast-error-title": "تکمیل پیشنهاد فراداده با هوش مصنوعی انجام نشد",
33
+ "loading": {
34
+ "title": "پر کردن فراداده با هوش مصنوعی",
35
+ "initial": "در حال آماده‌سازی…",
36
+ "skip-button": "پرش",
37
+ "complete": "پیشنهادها اعمال شد — قبل از ثبت، فیلدها را بررسی کنید.",
38
+ "step-prefix": "{{current}}/{{total}} · {{phase}}",
39
+ "thinking": {
40
+ "preparing": "در حال جمع‌کردن پیوست‌ها برای پردازش…",
41
+ "resolving-assist": "در حال انتخاب دستیار و مدل…",
42
+ "uploading": "در حال بارگذاری سند برای خواندن…",
43
+ "extracting": "در حال خواندن سند و پر کردن فیلدهای فراداده…",
44
+ "mapping": "در حال حدس زدن مقادیر فیلدهای فراداده…"
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acorex-platform/extension-ai-document-client",
3
- "version": "0.0.53",
3
+ "version": "0.0.56",
4
4
  "sideEffects": false,
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0 || ^22.0.0",
@@ -224,6 +224,7 @@ declare class AXEDocumentMetadataAiFillOrchestrator {
224
224
  * When document extraction is enabled and the attachment dialog has metadata + extractable files, prompts the user
225
225
  * after files appear. Yes → loading dialog + AI prefill; No → leave metadata form empty for manual entry.
226
226
  * Dedupes by attachment-slot signature so field edits do not re-prompt.
227
+ * Properties (`skipMetadataAiFill`) skips this prompt so existing metadata is not overwritten.
227
228
  */
228
229
  declare const AXEDocumentLayoutBuilderDialogContextChangedHookProvider: AXPHookProvider<AXPLayoutBuilderDialogContextChangedPayload, AXPLayoutBuilderDialogContextChangedPayload>;
229
230