@praxisui/ai 0.0.1 → 1.0.0-beta.41

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.
@@ -1 +1 @@
1
- {"version":3,"file":"praxisui-ai.mjs","sources":["../../../projects/praxis-ai/src/lib/praxis-ai.ts","../../../projects/praxis-ai/src/lib/core/models/ai-models.ts","../../../projects/praxis-ai/src/lib/core/prompts/prompt-templates.ts","../../../projects/praxis-ai/src/lib/core/services/praxis-ai.service.ts","../../../projects/praxis-ai/src/lib/core/services/ai-config.service.ts","../../../projects/praxis-ai/src/lib/core/contracts/ai-contract.generated.ts","../../../projects/praxis-ai/src/lib/core/services/ai-backend-api.service.ts","../../../projects/praxis-ai/src/lib/core/services/schema-minifier.service.ts","../../../projects/praxis-ai/src/lib/context/ai-context-builder.service.ts","../../../projects/praxis-ai/src/lib/ui/streaming-feedback.component.ts","../../../projects/praxis-ai/src/lib/core/services/dsl-parsing.service.ts","../../../projects/praxis-ai/src/lib/core/services/ai-response-validator.service.ts","../../../projects/praxis-ai/src/lib/ui/ai-rule-wizard-dialog.component.ts","../../../projects/praxis-ai/src/lib/core/services/ai-config-agent.service.ts","../../../projects/praxis-ai/src/lib/core/adapters/base-ai.adapter.ts","../../../projects/praxis-ai/src/lib/core/services/assistant-history.service.ts","../../../projects/praxis-ai/src/lib/ui/ai-assistant/ai-assistant.component.ts","../../../projects/praxis-ai/src/lib/ui/ai-assistant/ai-assistant.component.html","../../../projects/praxis-ai/src/public-api.ts","../../../projects/praxis-ai/src/praxisui-ai.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-praxis-ai',\n imports: [],\n template: `\n <p>\n praxis-ai works!\n </p>\n `,\n styles: ``,\n})\nexport class PraxisAi {\n\n}\n","/**\n * Models for Praxis AI (Centralized)\n */\n\nimport type { AiCapability, AiValueKind } from '@praxisui/core';\n\n/**\n * Response structure expected from the AI model\n */\nexport interface AiRuleResponse {\n /** Descriptive name for the rule */\n ruleName: string;\n \n /** Type of target (scope) */\n targetType: 'field' | 'section' | 'action' | 'row' | 'column';\n \n /** IDs of the target elements */\n targetIds: string[];\n \n /** Condition in DSL format (e.g., \"age >= 18\") or null for always applied */\n conditionDsl: string | null;\n \n /** Effects to apply */\n effects: {\n /** Properties to apply when condition is true */\n properties?: Record<string, any>;\n \n /** Properties to apply when condition is false (else) */\n propertiesWhenFalse?: Record<string, any>;\n };\n}\n\n/**\n * Minified field representation for AI context (token optimization)\n */\nexport interface MinifiedField {\n id: string;\n label: string;\n type: string;\n category?: string;\n allowedValues?: Array<{ value: any; label: string }>;\n}\n\n/**\n * Context structure sent to the AI\n */\nexport interface PromptContext {\n /** List of available fields formatted for the prompt */\n fieldsText: string;\n \n /** List of available properties for the selected target type */\n propertiesText: string;\n \n /** List of supported DSL operators */\n operatorsText: string;\n \n /** Selected target type */\n targetType: string;\n\n /** Structured list of fields for richer prompt suggestions */\n minifiedFields?: MinifiedField[];\n}\n\n/**\n * Example pair for Few-Shot Learning\n */\nexport interface AiExamplePair {\n userPrompt: string;\n expectedResponse: AiRuleResponse;\n}\n\n/**\n * Configuration for the AI Service\n */\nexport interface AiIntegrationConfig {\n /** LLM provider (gemini/openai/xai/mock) */\n provider?: string;\n /** Gemini API Key (optional if using proxy/env) */\n apiKey?: string;\n \n /** Model version to use */\n model: string;\n \n /** Temperature (creativity vs determinism) */\n temperature: number;\n \n /** Max output tokens */\n maxTokens: number;\n \n /** Request timeout in ms */\n timeout: number;\n \n /** Number of retry attempts */\n retryAttempts: number;\n \n /** Optional: Backend gateway URL for Enterprise mode */\n gatewayUrl?: string;\n}\n\n/**\n * Result of validating an AI response\n */\nexport interface AiValidationResult {\n valid: boolean;\n errors: AiValidationError[];\n warnings: AiValidationWarning[];\n correctedResponse?: AiRuleResponse;\n}\n\nexport interface AiValidationError {\n field: string;\n message: string;\n severity: 'critical' | 'error' | 'warning';\n code: string;\n}\n\nexport interface AiValidationWarning {\n field: string;\n message: string;\n suggestion?: string;\n}\n\nexport interface AiModel {\n name: string;\n version: string;\n displayName: string;\n description: string;\n inputTokenLimit: number;\n outputTokenLimit: number;\n supportedGenerationMethods: string[];\n temperature?: number;\n topP?: number;\n topK?: number;\n}\n\n// --- Configuration Capabilities Models ---\n\nexport type ValueKind = AiValueKind;\nexport type Capability = AiCapability;\n","/**\n * Templates de Prompt Estruturados para o Fluxo de IA em Dois Passos.\n * Focados em precisão, contratos de renderização e segurança.\n */\n\nexport const CONTRACT_RULES = {\n dsl: `\n - SINTAXE OBRIGATÓRIA: Use DSL específica, NÃO use JavaScript puro.\n - ERRADO: \"row.status === 'Active'\", \"value.includes('A')\", \"item.price > 10\"\n - CERTO: \"status == 'Active'\", \"contains(name, 'A')\", \"price > 10\"\n - Operadores: ==, !=, >, <, >=, <=, in, contains, startsWith, endsWith.\n - Contexto: O campo é implícito. Não use prefixos como \"row.\" ou \"this.\".\n `,\n icons: `\n - Use apenas nomes de ícones do Google Material Symbols (ex: check_circle, warning, edit, delete, add).\n - Não use URLs ou classes CSS para ícones.\n `,\n formatting: `\n - Datas: Use { \"type\": \"date\", \"format\": \"dd/MM/yyyy\" } (ou similar).\n - Moeda: Use \"BRL|symbol|2\" (currencyCode|display|decimals) ou \"USD|code|0\". Formato aceito é string.\n - Número: Use padrões do DecimalPipe, ex.: \"1.2-2\" (mínimo 2, máximo 2 decimais).\n - Percentual: Use padrões do PercentPipe, ex.: \"1.0-0|x100\" para converter 0.1 -> 10%.\n - Boolean: Use { \"type\": \"boolean\" } e, opcionalmente, format strings como \"true-false\", \"yes-no\", \"active-inactive\".\n `,\n safety: `\n - PRESERVAÇÃO: Ao atualizar listas (ex: conditionalRenderers), mantenha os itens existentes que não foram alterados.\n - DESTRUIÇÃO: Não remova colunas ou regras a menos que explicitamente solicitado.\n `,\n rendererPayloads: `\n - CONDITIONAL RENDERERS: 'columns[].conditionalRenderers[].renderer' deve seguir o mesmo schema dos renderers principais.\n - CORRETO: { type: 'badge', badge: { text: 'Ativo', color: 'success' } }\n - ERRADO (Flatten): { type: 'badge', text: 'Ativo', color: 'success' }\n - ERRADO (Vazio): { type: 'badge' }\n - BADGE: Exige 'badge.textField' (dinâmico) ou 'badge.text' (fixo).\n - Para booleanos (true/false): Sugira \"valueMapping\" ({ \"true\": \"Ativo\", \"false\": \"Inativo\" }) e use \"conditionalStyles\" para cores.\n - Default variant: 'filled'. Default color: 'primary'.\n - TOGGLE: Exige 'toggle.stateExpr' e 'toggle.action.id' quando interativo.\n - Use DSL em disabledCondition (ex.: ativo == false).\n - Prefer ariaLabel explícito para acessibilidade.\n - PROGRESS: Exige 'progress.valueExpr' (0-100). Cor opcional. 'showLabel' habilita o número.\n - Evite deixar apenas type; sempre informe a origem do valor.\n - RATING: Preferir modo somente leitura em tabela. Exige 'rating.valueExpr'; 'max' padrão 5.\n - Inclua 'color' e, se usado, 'outlineColor' e 'size'; ariaLabel é recomendado.\n - PREENCHIMENTO MÍNIMO: Não responda apenas com \"renderer.type\". Preencha as subpropriedades necessárias (ex: text, valueExpr, src).\n - Evite objetos vazios: Se usar renderer.badge, preencha suas propriedades.\n `\n};\n\n/**\n * Prompt para o Classificador de Intenção (Passo 1).\n * Leve, focado em identificar O QUE e ONDE.\n */\nexport const PROMPT_INTENT_CLASSIFIER = `\nVocê é um especialista em UX e configuração de Tabelas de Dados.\nSua tarefa é analisar o pedido do usuário e classificar a intenção para direcionar o fluxo de processamento.\n\nENTRADA DO USUÁRIO: \"{{USER_INPUT}}\"\nCOLUNAS DISPONÍVEIS: {{COLUMNS_LIST}}\n\nCATEGORIAS POSSÍVEIS:\n- columns: Adicionar, remover, renomear, reordenar, visibilidade.\n- appearance: Densidade, cores, bordas, fontes.\n- conditional: Regras visuais (cores, ícones) baseadas em valores (conditionalStyles/Renderers).\n- behavior: Paginação, filtro, sort, seleção, loading.\n- actions: Botões de ação, toolbar, exportação.\n- unknown: Não foi possível determinar.\n\nREGRAS:\n1. Identifique o \"targetField\" (nome técnico da coluna) se a intenção for específica de uma coluna. Use fuzzy match se necessário.\n2. Se o usuário for ambíguo (ex: \"muda a cor\" e houver ambiguidade), marque \"needsClarification\": true.\n3. Se o usuário fizer uma PERGUNTA sobre o estado atual (ex: \"quais colunas estão ocultas?\", \"o filtro está ativo?\"), use \"intent\": \"ask_about_config\".\n4. Se o usuário pedir criação de página/fluxo, use \"intent\": \"create_flow\".\n5. Retorne APENAS um objeto JSON válido.\n\nSCHEMA DE RESPOSTA (JSON):\n{\n \"intent\": \"add_column_computed\" | \"add_column\" | \"create_flow\" | \"update_column\" | \"remove_column\" | \"toggle_feature\" | \"global_style\" | \"ask_about_config\" | \"unknown\",\n \"targetField\": \"string\" | null,\n \"category\": \"columns\" | \"appearance\" | \"conditional\" | \"behavior\" | \"actions\",\n \"needsClarification\": boolean,\n \"options\": [\"string\"] // Sugestões se precisar de clarificação\n}\n`;\n\n/**\n * Prompt para QA (Perguntas sobre a config atual).\n */\nexport const PROMPT_QA = `\nVocê é um especialista em Tabelas de Dados. Responda à pergunta do usuário com base na configuração fornecida.\n\nCONFIGURAÇÃO ATUAL:\n{{TARGET_CONFIG}}\n\nPERGUNTA DO USUÁRIO: \"{{USER_INPUT}}\"\n\nINSTRUÇÕES:\n- Responda de forma direta e concisa em português.\n- Liste os itens solicitados se houver (ex: nomes das colunas ocultas).\n- Não invente informações que não estejam no JSON.\n\nRESPOSTA:\n`;\n\n/**\n * Prompt para o Executor Enriquecido (Passo 2/3).\n * Pesado, contém o contrato exato e o contexto específico.\n */\nexport const PROMPT_EXECUTION_ENRICHED = `\nVocê é um Engenheiro de Configuração de UI. Sua tarefa é gerar um JSON PATCH para atualizar uma tabela.\n\nCONTEXTO ALVO:\n{{CONTEXT_DESCRIPTION}}\n\nCAPABILITIES PERMITIDAS (Use APENAS estes paths/valores):\n{{CAPABILITIES_RESTRICTION}}\n\nCONFIGURAÇÃO ATUAL (Do Alvo):\n{{TARGET_CONFIG}}\n\nCONTRATO TÉCNICO (Siga Rigorosamente):\n{{CONTRACT_DSL}}\n{{CONTRACT_ICONS}}\n{{CONTRACT_SAFETY}}\n{{CONTRACT_RENDERER_PAYLOADS}}\n\nPEDIDO DO USUÁRIO: \"{{USER_INPUT}}\"\n\nINSTRUÇÕES:\n1. Analise a Configuração Atual e o Pedido.\n2. Gere um JSON Patch parcial que satisfaça o pedido, usando SOMENTE chaves listadas em CAPABILITIES PERMITIDAS.\n3. O patch será aplicado via \"Smart Merge\".\n - Arrays (ex: columns): Use a chave de identidade (ex: \"field\") para atualizar itens existentes.\n - Exemplo: { \"columns\": [{ \"field\": \"status\", \"header\": \"Estado\" }] } (Atualiza header da col status).\n - NÃO use índices numéricos ou JSON Pointer.\n4. Valide se sua DSL segue as regras (sem \"row.\").\n\nSAÍDA ESPERADA (JSON):\n{\n \"patch\": { ... },\n \"explanation\": \"Resumo curto do que foi feito.\"\n}\n`;\n\n/**\n * Helper para injeção simples de variáveis.\n */\nexport function buildPrompt(template: string, variables: Record<string, string>): string {\n return Object.keys(variables).reduce((str, key) => {\n const regex = new RegExp(`{{${key}}}`, 'g');\n return str.replace(regex, variables[key]);\n }, template);\n}\n","import { Injectable, Optional } from '@angular/core';\nimport { GoogleGenerativeAI, GenerationConfig } from '@google/generative-ai';\nimport { Observable, from, of, throwError } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { GlobalConfigService } from '@praxisui/core';\nimport { AiModel, AiIntegrationConfig } from '../models/ai-models';\nimport { PROMPT_INTENT_CLASSIFIER, PROMPT_EXECUTION_ENRICHED, PROMPT_QA, CONTRACT_RULES, buildPrompt } from '../prompts/prompt-templates';\n\n@Injectable({ providedIn: 'root' })\nexport class PraxisAiService {\n private genAI: GoogleGenerativeAI | null = null;\n private config: AiIntegrationConfig = {\n provider: 'gemini',\n apiKey: '',\n model: 'gemini-2.0-flash',\n temperature: 0.1,\n maxTokens: 2048,\n timeout: 30000,\n retryAttempts: 2,\n };\n\n constructor(@Optional() private globalConfigService: GlobalConfigService) {\n this.syncConfig();\n if (this.globalConfigService?.configChanges$ && typeof (this.globalConfigService as any).configChanges$.subscribe === 'function') {\n this.globalConfigService.configChanges$.subscribe(() => this.syncConfig());\n }\n }\n\n private syncConfig(): void {\n if (!this.globalConfigService) return;\n if (typeof (this.globalConfigService as any).get !== 'function') return;\n const aiCfg = this.globalConfigService.get<any>('ai');\n if (aiCfg) {\n this.config = { ...this.config, ...aiCfg };\n const provider = this.resolveProvider();\n if (provider === 'gemini' && this.config.apiKey) {\n this.genAI = new GoogleGenerativeAI(this.config.apiKey);\n } else {\n this.genAI = null;\n }\n }\n }\n\n // -------- Two-step helpers --------\n\n classifyIntent(userInput: string, columns: string[]): Observable<any> {\n const prompt = buildPrompt(PROMPT_INTENT_CLASSIFIER, {\n USER_INPUT: userInput,\n COLUMNS_LIST: JSON.stringify(columns),\n });\n\n return this.generateJson<any>(prompt, undefined, {\n type: 'OBJECT',\n properties: {\n intent: {\n type: 'STRING',\n enum: [\n 'add_column_computed',\n 'add_column',\n 'create_flow',\n 'update_column',\n 'remove_column',\n 'toggle_feature',\n 'global_style',\n 'ask_about_config',\n 'unknown',\n // Alias legado aceito para garantir backward compatibility.\n 'update_column_rules',\n ],\n },\n targetField: { type: 'STRING', nullable: true },\n category: { type: 'STRING', enum: ['columns', 'appearance', 'conditional', 'behavior', 'actions'] },\n needsClarification: { type: 'BOOLEAN' },\n options: { type: 'ARRAY', items: { type: 'STRING' } },\n },\n required: ['intent', 'category', 'needsClarification'],\n } as any).pipe(\n map((classification) => this.normalizeIntentClassification(classification)),\n );\n }\n\n answerQuestion(userInput: string, targetConfig: any): Observable<string> {\n const prompt = buildPrompt(PROMPT_QA, {\n USER_INPUT: userInput,\n TARGET_CONFIG: JSON.stringify(targetConfig, null, 2),\n });\n \n return this.generateContent(prompt);\n }\n\n executeEnrichedPrompt(\n userInput: string,\n contextDescription: string,\n targetConfig: any,\n capabilities: any, // Expects Capability[]\n ): Observable<any> {\n const configJson = JSON.stringify(targetConfig, null, 2);\n const capsList = this.formatCapabilities(capabilities);\n \n const prompt = buildPrompt(PROMPT_EXECUTION_ENRICHED, {\n USER_INPUT: userInput,\n CONTEXT_DESCRIPTION: contextDescription,\n TARGET_CONFIG: configJson,\n CAPABILITIES_RESTRICTION: capsList,\n CONTRACT_DSL: CONTRACT_RULES.dsl,\n CONTRACT_ICONS: CONTRACT_RULES.icons,\n CONTRACT_SAFETY: CONTRACT_RULES.safety,\n CONTRACT_RENDERER_PAYLOADS: CONTRACT_RULES.rendererPayloads || '',\n });\n\n return this.generateJson<any>(prompt, undefined, undefined);\n }\n\n private formatCapabilities(caps: any[]): string {\n if (!Array.isArray(caps) || caps.length === 0) return 'Todas as configurações permitidas.';\n \n // Group by category for readability\n const groups: Record<string, string[]> = {};\n const enums: Record<string, string[]> = {};\n\n caps.forEach(c => {\n const cat = c.category || 'Geral';\n if (!groups[cat]) groups[cat] = [];\n \n let line = `- ${c.path}`;\n if (c.allowedValues) {\n const enumKey = c.path.split('.').pop() || c.path;\n enums[enumKey] = c.allowedValues;\n line += ` (Enum: ${c.allowedValues.join(', ')})`;\n } else if (c.valueKind) {\n line += ` (${c.valueKind})`;\n }\n if (c.description) line += `: ${c.description}`;\n \n groups[cat].push(line);\n });\n\n return Object.entries(groups)\n .map(([cat, lines]) => `### ${cat.toUpperCase()}\\n${lines.join('\\n')}`)\n .join('\\n\\n');\n }\n\n private normalizeIntentClassification(classification: any): any {\n if (!classification || typeof classification !== 'object') {\n return classification;\n }\n const intent = typeof classification.intent === 'string'\n ? classification.intent.trim().toLowerCase()\n : '';\n if (intent === 'update_column_rules') {\n return { ...classification, intent: 'update_column' };\n }\n return classification;\n }\n\n // -------- Core generation --------\n\n generateContent(prompt: string, modelName?: string): Observable<string> {\n if (!this.isGeminiProvider()) {\n return throwError(() => new Error('LLM provider not supported in browser mode.'));\n }\n if (!this.genAI) return throwError(() => new Error('API Key not configured'));\n const model = this.genAI.getGenerativeModel({\n model: modelName || this.config.model,\n generationConfig: {\n temperature: this.config.temperature,\n maxOutputTokens: this.config.maxTokens,\n },\n });\n return from(model.generateContent(prompt)).pipe(map((result) => result.response.text()));\n }\n\n generateContentStream(prompt: string, modelName?: string): Observable<string> {\n if (!this.isGeminiProvider()) {\n return throwError(() => new Error('LLM provider not supported in browser mode.'));\n }\n if (!this.genAI) return throwError(() => new Error('API Key not configured'));\n const model = this.genAI.getGenerativeModel({\n model: modelName || this.config.model,\n generationConfig: {\n temperature: this.config.temperature,\n maxOutputTokens: this.config.maxTokens,\n },\n });\n\n return new Observable<string>((observer) => {\n model\n .generateContentStream(prompt)\n .then(async (result) => {\n try {\n for await (const chunk of result.stream) {\n const text = chunk.text();\n if (text) observer.next(text);\n }\n observer.complete();\n } catch (err) {\n observer.error(err);\n }\n })\n .catch((err) => observer.error(err));\n });\n }\n\n generateJson<T>(prompt: string, modelName?: string, schema?: any): Observable<T | null> {\n if (!this.isGeminiProvider()) {\n return throwError(() => new Error('LLM provider not supported in browser mode.'));\n }\n const intentOnly = this.extractUserIntent(prompt);\n \n // Only check for mock triggers in the specific user intent, not the full prompt template\n if (intentOnly) {\n const mockPatch = this.getMockPatch(intentOnly);\n if (mockPatch) {\n console.warn('PraxisAI: Using mock response for prompt intent:', intentOnly);\n return of(mockPatch as T);\n }\n }\n\n if (!this.genAI) return throwError(() => new Error('API Key not configured'));\n\n const generationConfig: GenerationConfig = {\n temperature: this.config.temperature,\n maxOutputTokens: this.config.maxTokens,\n responseMimeType: 'application/json',\n ...(schema ? { responseSchema: schema } : {}),\n };\n\n const model = this.genAI.getGenerativeModel({\n model: modelName || this.config.model,\n generationConfig,\n });\n\n return from(model.generateContent(prompt)).pipe(\n map((result) => {\n let text = '';\n try {\n text = result.response.text();\n } catch (e) {\n // If response.text() fails, it means no text was generated or an error occurred.\n // Return null as per the signature.\n console.warn('[PraxisAiService] generateJson: AI response.text() failed, returning null.', e);\n return null;\n }\n let cleaned = text.replace(/```json\\n?|\\n?```/g, '').trim();\n // Find the first '{' or '[' and the last '}' or ']' to handle preamble/postamble text\n const firstOpen = cleaned.search(/[{[]/);\n const lastClose = cleaned.search(/[}\\]]$/); // Optimized search from end not supported in all environments, use lastIndexOf\n const lastCloseBrace = cleaned.lastIndexOf('}');\n const lastCloseBracket = cleaned.lastIndexOf(']');\n const lastCloseIndex = Math.max(lastCloseBrace, lastCloseBracket);\n\n if (firstOpen !== -1 && lastCloseIndex !== -1 && lastCloseIndex > firstOpen) {\n cleaned = cleaned.substring(firstOpen, lastCloseIndex + 1);\n }\n\n try {\n return JSON.parse(cleaned) as T;\n } catch (e) {\n console.warn('[PraxisAiService] generateJson: JSON parsing failed, returning null.', e);\n return null;\n }\n }),\n );\n }\n\n isMockMode(): boolean {\n return !this.genAI;\n }\n\n // -------- Helpers --------\n\n private extractUserIntent(prompt: string): string | null {\n // Tenta capturar o conteúdo entre aspas após os marcadores conhecidos\n const patterns = [\n /ENTRADA DO USUÁRIO:\\s*\"([^\"]+)\"/i,\n /PEDIDO DO USUÁRIO:\\s*\"([^\"]+)\"/i,\n /USER INTENT:\\s*\"([^\"]+)\"/i\n ];\n\n for (const regex of patterns) {\n const match = prompt.match(regex);\n if (match && match[1]) {\n return match[1].trim();\n }\n }\n return null;\n }\n\n private getMockPatch(prompt: string | null): any {\n if (!prompt) return null;\n const p = prompt.toLowerCase();\n // ... rest of the function\n if (p.includes('compacta') && p.includes('bordas')) {\n return {\n patch: { appearance: { density: 'compact', borders: { showRowBorders: false } } },\n explanation: 'Ajustei a tabela para o modo compacto e removi as bordas das linhas (MOCK).',\n };\n }\n if (p.includes('seleção múltipla') && p.includes('filtros no cabeçalho')) {\n return {\n patch: {\n behavior: {\n selection: { enabled: true, type: 'multiple', mode: 'checkbox' },\n filtering: { enabled: true, columnFilters: { enabled: true, position: 'header' } },\n sorting: { enabled: true },\n },\n },\n explanation: 'Ativei seleção múltipla, filtros no cabeçalho e ordenação (MOCK Power User).',\n };\n }\n if (p.includes('paginação') || p.includes('paginacao')) {\n return { patch: { behavior: { pagination: { enabled: false } } }, explanation: 'Desativei a paginação da tabela (MOCK).' };\n }\n return null;\n }\n\n listModels(apiKey?: string): Observable<AiModel[]> {\n if (!this.isGeminiProvider()) {\n return throwError(() => new Error('Model listing only available for Gemini.'));\n }\n const key = apiKey || this.config.apiKey;\n if (!key) return throwError(() => new Error('API Key required'));\n\n return from(\n fetch(`/gemini-api/v1beta/models?key=${key}`).then(async (res) => {\n if (!res.ok) {\n const err = await res.json();\n throw new Error(err.error?.message || res.statusText);\n }\n return res.json();\n }),\n ).pipe(map((data) => (data.models || []) as AiModel[]));\n }\n\n testConnection(apiKey?: string, model?: string): Observable<boolean> {\n if (!this.isGeminiProvider()) {\n return throwError(() => new Error('Connection test only available for Gemini.'));\n }\n const key = apiKey || this.config.apiKey;\n if (!key) return throwError(() => new Error('API Key required'));\n\n const tempGenAI = new GoogleGenerativeAI(key);\n const tempModel = tempGenAI.getGenerativeModel({ model: model || this.config.model });\n\n return from(\n tempModel.generateContent({\n contents: [{ role: 'user', parts: [{ text: 'Hello' }] }],\n generationConfig: { maxOutputTokens: 5 },\n }),\n ).pipe(\n map(() => true),\n catchError((err) => throwError(() => err)),\n );\n }\n\n private resolveProvider(): string {\n const provider = this.config.provider || 'gemini';\n return provider.toString().trim().toLowerCase();\n }\n\n private isGeminiProvider(): boolean {\n return this.resolveProvider() === 'gemini';\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { GlobalConfigService } from '@praxisui/core';\nimport { AiIntegrationConfig } from '../models/ai-models';\n\n@Injectable({ providedIn: 'root' })\nexport class AiConfigService {\n private globalConfig = inject(GlobalConfigService);\n\n getConfig(): AiIntegrationConfig {\n const global = this.globalConfig.get<any>('ai') || {};\n return {\n provider: global.provider || 'gemini',\n apiKey: global.apiKey || '',\n model: global.model || 'gemini-2.0-flash',\n temperature: global.temperature ?? 0.1,\n maxTokens: global.maxTokens ?? 2048,\n timeout: global.timeout ?? 30000,\n retryAttempts: global.retryAttempts ?? 2,\n gatewayUrl: global.gatewayUrl\n };\n }\n}\n","/**\n * Generated from praxis-config-starter/docs/ai/contracts/praxis-ai-api-contract-v1.1.openapi.yaml.\n * Do not edit manually. Run praxis-config-starter/tools/contracts/generate-ai-contract-bindings.js.\n */\nexport const AI_CONTRACT_VERSION = 'v1.1' as const;\nexport const AI_CONTRACT_SCHEMA_HASH = '51b7901f1df633d89fc019a2e41f675cc5b87b135dfc8335aa96e53205034b26' as const;\nexport const AI_STREAM_EVENT_SCHEMA_VERSION = 'v1' as const;\nexport const AI_STREAM_EVENT_TYPES = ['status', 'thought.step', 'heartbeat', 'result', 'error', 'cancelled'] as const;\n\nexport type AiJsonPrimitive = string | number | boolean | null;\nexport type AiJsonArray = AiJsonValue[];\nexport interface AiJsonObject {\n [key: string]: AiJsonValue;\n}\nexport type AiJsonValue = AiJsonPrimitive | AiJsonObject | AiJsonArray;\n\nexport interface AiSchemaContextContract {\n path?: string | null;\n operation?: string | null;\n schemaType?: string | null;\n}\n\nexport interface AiChatMessageContract {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\nexport interface AiUiContextRefContract {\n componentType?: string | null;\n componentId?: string | null;\n routeKey?: string | null;\n schemaHash?: string | null;\n variantId?: string | null;\n}\n\nexport interface AiCurrentStateDigestContract {\n columns?: string[] | null;\n sort?: string | null;\n rowCount?: number | null;\n}\n\nexport interface AiOrchestratorRequestContract {\n componentId: string;\n componentType: string;\n userPrompt?: string;\n sessionId?: string;\n mode?: 'new' | 'continue';\n clientTurnId?: string;\n messages?: AiChatMessageContract[];\n summary?: string;\n uiContextRef?: AiUiContextRefContract;\n currentStateDigest?: AiCurrentStateDigestContract;\n currentState: AiJsonObject;\n dataProfile?: AiJsonObject | null;\n schemaFields?: AiJsonObject[] | null;\n runtimeState?: AiJsonObject | null;\n suggestedPatch?: AiJsonObject | null;\n contextHints?: AiJsonObject | null;\n aiMode?: string;\n requireSchema?: boolean;\n resourcePath?: string;\n contractVersion?: string;\n schemaHash?: string;\n schemaContext?: AiSchemaContextContract | null;\n variantId?: string;\n apiMethod?: string;\n apiTags?: string;\n apiSearchLimit?: number;\n}\n\nexport type AiOrchestratorResponseType = 'patch' | 'clarification' | 'error' | 'info';\n\nexport interface AiPatchDiffContract {\n path: string;\n before?: AiJsonValue;\n after?: AiJsonValue;\n}\n\nexport interface AiOptionContract {\n value?: string | null;\n label?: string | null;\n example?: string | null;\n contextHints?: AiJsonObject | null;\n}\n\nexport interface AiClarificationUiContract {\n responseType?: 'text' | 'choice' | 'confirm' | 'mixed' | 'context';\n selectionMode?: 'single' | 'multiple';\n presentation?: 'buttons' | 'list' | 'chips';\n allowCustom?: boolean | null;\n}\n\nexport interface AiMemoryInfoContract {\n summaryUpdated?: boolean | null;\n windowSize?: number | null;\n cached?: boolean | null;\n}\n\nexport interface AiOrchestratorResponseContract {\n sessionId?: string | null;\n code?: string | null;\n type?: AiOrchestratorResponseType;\n contractVersion?: string | null;\n schemaHash?: string | null;\n patch?: AiJsonObject | null;\n diff?: AiPatchDiffContract[] | null;\n explanation?: string | null;\n warnings?: string[] | null;\n message?: string | null;\n options?: string[] | null;\n optionPayloads?: AiOptionContract[] | null;\n contextRequest?: number[] | null;\n clarification?: AiClarificationUiContract;\n componentId?: string | null;\n componentType?: string | null;\n path?: string | null;\n providedValue?: AiJsonValue;\n allowedValues?: string[] | null;\n memory?: AiMemoryInfoContract;\n}\n\nexport interface AiPatchStreamStartResponseContract {\n streamId: string;\n threadId: string;\n turnId: string;\n eventSchemaVersion: string;\n streamAuthMode?: 'cookie' | 'signed_url_token' | null;\n streamAccessToken?: string | null;\n expiresAt: string;\n fallbackPatchUrl: string;\n}\n\nexport interface AiPatchStreamCancelResponseContract {\n streamId?: string | null;\n threadId?: string | null;\n turnId?: string | null;\n terminalState: 'cancelled' | 'completed' | 'not_found';\n message?: string | null;\n}\n\nexport interface AiPatchStreamEnvelopeContract<TPayload extends AiJsonObject = AiJsonObject> {\n eventId?: string | null;\n streamId: string;\n threadId: string;\n turnId: string;\n seq: number;\n eventSchemaVersion: string;\n timestamp: string;\n type: AiPatchStreamEventType;\n payload: TPayload;\n}\n\nexport interface ProblemResponseContract {\n timestamp?: string | null;\n status?: number | null;\n error?: string | null;\n message?: string | null;\n path?: string | null;\n detail?: string | null;\n [key: string]: AiJsonValue | undefined;\n}\n\nexport type AiPatchStreamEventType = (typeof AI_STREAM_EVENT_TYPES)[number];\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { ApiConfigStorageOptions, API_CONFIG_STORAGE_OPTIONS, GlobalAiConfig, GlobalConfig, GlobalConfigService } from '@praxisui/core';\nimport { Observable, from, of } from 'rxjs';\nimport { filter, map, take } from 'rxjs/operators';\nimport { AiSuggestion } from '../adapters/ai-config.adapter';\nimport {\n AI_CONTRACT_SCHEMA_HASH,\n AI_CONTRACT_VERSION,\n AI_STREAM_EVENT_SCHEMA_VERSION,\n AI_STREAM_EVENT_TYPES,\n AiChatMessageContract,\n AiCurrentStateDigestContract,\n AiJsonObject,\n AiOrchestratorRequestContract,\n AiOrchestratorResponseContract,\n AiPatchDiffContract,\n AiPatchStreamCancelResponseContract,\n AiPatchStreamEnvelopeContract,\n AiPatchStreamEventType as AiPatchStreamEventTypeContract,\n AiPatchStreamStartResponseContract,\n AiSchemaContextContract,\n AiUiContextRefContract,\n} from '../contracts/ai-contract.generated';\nimport { AiModel } from '../models/ai-models';\n\nexport const AI_INTENT_CONTRACT_VERSION = AI_CONTRACT_VERSION;\nexport const AI_INTENT_CONTRACT_SCHEMA_HASH = AI_CONTRACT_SCHEMA_HASH;\nconst AI_CONTRACT_VERSION_HEADER = 'X-Praxis-Contract-Version';\nconst AI_CONTRACT_SCHEMA_HASH_HEADER = 'X-Praxis-Schema-Hash';\nconst AI_STREAM_EVENT_TYPE_SET = new Set<string>(AI_STREAM_EVENT_TYPES);\n\nexport type AiSchemaContext = AiSchemaContextContract;\n\nexport interface AiSuggestionsRequest {\n componentId: string;\n componentType: string;\n currentState: AiJsonObject;\n dataProfile?: AiJsonObject | null;\n variantId?: string;\n maxSuggestions?: number;\n forceRefresh?: boolean;\n locale?: string;\n}\n\nexport interface AiSuggestionsResponse {\n suggestions: AiSuggestion[];\n source?: string;\n cacheKey?: string;\n cacheHit?: boolean;\n warnings?: string[];\n}\n\nexport type AiOrchestratorRequest = AiOrchestratorRequestContract;\nexport type AiChatMessage = AiChatMessageContract;\nexport type AiUiContextRef = AiUiContextRefContract;\nexport type AiCurrentStateDigest = AiCurrentStateDigestContract;\nexport type AiPatchDiff = AiPatchDiffContract;\n\nexport type AiOrchestratorResponse = AiOrchestratorResponseContract & {\n // Campos legados ainda utilizados no frontend enquanto o contrato v1.1 e a implementação convergem.\n riskLevel?: string;\n requiresConfirmation?: boolean;\n questions?: string[];\n};\n\nexport type AiPatchStreamEventType = AiPatchStreamEventTypeContract;\n\nexport type AiPatchStreamStartResponse = AiPatchStreamStartResponseContract;\nexport type AiPatchStreamCancelResponse = AiPatchStreamCancelResponseContract;\nexport type AiPatchStreamEnvelope<TPayload extends AiJsonObject = AiJsonObject> = AiPatchStreamEnvelopeContract<TPayload>;\n\nexport interface AiPatchStreamConnection {\n events$: Observable<AiPatchStreamEnvelope>;\n close: () => void;\n}\n\nexport type AiPatchStreamConnectionErrorKind = 'unsupported' | 'http_status' | 'transport' | 'parse' | 'schema';\n\nexport class AiPatchStreamConnectionError extends Error {\n constructor(\n public readonly kind: AiPatchStreamConnectionErrorKind,\n message: string,\n public readonly status?: number,\n ) {\n super(message);\n this.name = 'AiPatchStreamConnectionError';\n }\n}\n\nexport interface AiProviderModelsRequest {\n provider?: string;\n apiKey?: string;\n}\n\nexport interface AiProviderModelsResponse {\n provider?: string;\n success?: boolean;\n message?: string;\n models?: AiModel[];\n}\n\nexport interface AiProviderCatalogItem {\n id: string;\n label: string;\n description?: string;\n defaultModel?: string;\n requiresApiKey?: boolean;\n supportsModels?: boolean;\n supportsEmbeddings?: boolean;\n supportsTextStreaming?: boolean;\n supportsTurnCancellation?: boolean;\n iconKey?: string;\n}\n\nexport interface AiProviderCatalogResponse {\n providers: AiProviderCatalogItem[];\n}\n\nexport interface AiProviderTestRequest {\n provider?: string;\n apiKey?: string;\n model?: string;\n}\n\nexport interface AiProviderTestResponse {\n provider?: string;\n model?: string;\n success?: boolean;\n message?: string;\n}\n\nexport interface AiProviderStatusResponse {\n provider?: string;\n model?: string;\n hasApiKey?: boolean;\n source?: string;\n success?: boolean;\n message?: string;\n}\n\nexport interface AiContextTemplateMeta {\n variants?: Array<{ id?: string; registryKey?: string } | string>;\n defaultVariantId?: string;\n}\n\nexport interface AiContextTemplate {\n templateMeta?: AiContextTemplateMeta;\n}\n\nexport interface AiContextDTO {\n componentId?: string;\n componentType?: string;\n template?: AiContextTemplate | null;\n}\n\nexport interface AiHeaderContext {\n tenantId: string;\n env: string;\n userId: string;\n missing: string[];\n}\n\nconst DEFAULT_USER_ID_STORAGE_KEY = 'praxis.demoUserId';\n\nfunction buildDemoUserId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `demo-${crypto.randomUUID()}`;\n }\n return `demo-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction getOrCreateDefaultUserId(): string {\n if (typeof localStorage === 'undefined') return 'demo';\n try {\n const existing = localStorage.getItem(DEFAULT_USER_ID_STORAGE_KEY);\n if (existing && existing.trim()) return existing.trim();\n const generated = buildDemoUserId();\n localStorage.setItem(DEFAULT_USER_ID_STORAGE_KEY, generated);\n return generated;\n } catch {\n return 'demo';\n }\n}\n\nfunction resolveDefaultHeaders(): Record<string, string> {\n return {\n 'X-Tenant-ID': 'demo',\n 'X-User-ID': getOrCreateDefaultUserId(),\n 'X-Env': 'local',\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AiBackendApiService {\n private readonly http = inject(HttpClient);\n private readonly globalConfig = inject(GlobalConfigService);\n private readonly storageOpts = inject<ApiConfigStorageOptionsExtended | null>(API_CONFIG_STORAGE_OPTIONS, { optional: true });\n\n private readonly baseUrl = '/api/praxis/config/ai';\n private readonly contextUrl = '/api/praxis/config/ai-context';\n\n getSuggestions(request: AiSuggestionsRequest): Observable<AiSuggestionsResponse> {\n return this.http.post<AiSuggestionsResponse>(\n `${this.baseUrl}/suggestions`,\n request,\n { headers: this.buildHeaders() },\n );\n }\n\n getPatch(request: AiOrchestratorRequest): Observable<AiOrchestratorResponse> {\n const normalizedRequest: AiOrchestratorRequest = {\n ...request,\n contractVersion: this.normalizeContractVersion(request.contractVersion),\n schemaHash: this.normalizeContractSchemaHash(request.schemaHash),\n };\n return this.http.post<AiOrchestratorResponse>(\n `${this.baseUrl}/patch`,\n normalizedRequest,\n {\n headers: this.buildHeaders({\n [AI_CONTRACT_VERSION_HEADER]: normalizedRequest.contractVersion,\n [AI_CONTRACT_SCHEMA_HASH_HEADER]: normalizedRequest.schemaHash,\n }),\n },\n );\n }\n\n startPatchStream(request: AiOrchestratorRequest): Observable<AiPatchStreamStartResponse> {\n const normalizedRequest: AiOrchestratorRequest = {\n ...request,\n contractVersion: this.normalizeContractVersion(request.contractVersion),\n schemaHash: this.normalizeContractSchemaHash(request.schemaHash),\n };\n return this.http.post<AiPatchStreamStartResponse>(\n `${this.baseUrl}/patch/stream/start`,\n normalizedRequest,\n {\n headers: this.buildHeaders({\n [AI_CONTRACT_VERSION_HEADER]: normalizedRequest.contractVersion,\n [AI_CONTRACT_SCHEMA_HASH_HEADER]: normalizedRequest.schemaHash,\n }),\n withCredentials: true,\n },\n );\n }\n\n connectPatchStream(streamId: string, lastEventId?: string, accessToken?: string): AiPatchStreamConnection {\n const queryParams: string[] = [];\n if (lastEventId?.trim()) {\n queryParams.push(`lastEventId=${encodeURIComponent(lastEventId.trim())}`);\n }\n if (accessToken?.trim()) {\n queryParams.push(`accessToken=${encodeURIComponent(accessToken.trim())}`);\n }\n const query = queryParams.length > 0 ? `?${queryParams.join('&')}` : '';\n const streamPath = `${this.baseUrl}/patch/stream/${encodeURIComponent(streamId)}`;\n const endpoint = `${streamPath}${query}`;\n const probeEndpoint = `${streamPath}/probe${accessToken?.trim()\n ? `?accessToken=${encodeURIComponent(accessToken.trim())}`\n : ''}`;\n let source: EventSource | null = null;\n\n const events$ = new Observable<AiPatchStreamEnvelope>((subscriber) => {\n let disposed = false;\n const openStream = async () => {\n if (typeof EventSource === 'undefined') {\n subscriber.error(new AiPatchStreamConnectionError(\n 'unsupported',\n 'EventSource is not supported in this environment.',\n ));\n return;\n }\n const probeStatus = await this.probePatchStreamEndpoint(probeEndpoint);\n if (disposed) {\n return;\n }\n if (typeof probeStatus === 'number' && probeStatus >= 400) {\n subscriber.error(new AiPatchStreamConnectionError(\n 'http_status',\n `Patch stream probe failed with status ${probeStatus}.`,\n probeStatus,\n ));\n return;\n }\n source = new EventSource(endpoint, { withCredentials: true });\n source.onmessage = (messageEvent: MessageEvent<string>) => {\n try {\n const parsed = this.parsePatchStreamEnvelope(messageEvent.data);\n subscriber.next(parsed);\n } catch (error) {\n if (error instanceof AiPatchStreamConnectionError) {\n subscriber.error(error);\n return;\n }\n subscriber.error(new AiPatchStreamConnectionError(\n 'parse',\n 'Failed to parse stream event payload.',\n ));\n }\n };\n source.onerror = () => {\n if (!source) {\n subscriber.error(new AiPatchStreamConnectionError(\n 'transport',\n 'Patch stream connection error.',\n ));\n return;\n }\n // EventSource reconnects automatically for transient transport failures.\n // Only surface fatal closure so caller can decide fallback policy.\n if (source.readyState === EventSource.CLOSED) {\n subscriber.error(new AiPatchStreamConnectionError(\n 'transport',\n 'Patch stream connection closed unexpectedly.',\n ));\n }\n };\n };\n void openStream();\n return () => {\n disposed = true;\n if (source) {\n source.close();\n source = null;\n }\n };\n });\n\n return {\n events$,\n close: () => {\n if (source) {\n source.close();\n source = null;\n }\n },\n };\n }\n\n cancelPatchStream(streamId: string, accessToken?: string): Observable<AiPatchStreamCancelResponse> {\n const endpoint = `${this.baseUrl}/patch/stream/${encodeURIComponent(streamId)}/cancel${accessToken?.trim()\n ? `?accessToken=${encodeURIComponent(accessToken.trim())}`\n : ''}`;\n return this.http.post<AiPatchStreamCancelResponse>(\n endpoint,\n {},\n {\n headers: this.buildHeaders(),\n withCredentials: true,\n },\n );\n }\n\n listModels(request: AiProviderModelsRequest): Observable<AiProviderModelsResponse> {\n return this.http.post<AiProviderModelsResponse>(\n `${this.baseUrl}/providers/models`,\n request,\n { headers: this.buildHeaders() },\n );\n }\n\n listProviderCatalog(): Observable<AiProviderCatalogResponse> {\n return this.http.get<AiProviderCatalogResponse>(\n `${this.baseUrl}/providers/catalog`,\n { headers: this.buildHeaders() },\n );\n }\n\n testProvider(request: AiProviderTestRequest): Observable<AiProviderTestResponse> {\n return this.http.post<AiProviderTestResponse>(\n `${this.baseUrl}/providers/test`,\n request,\n { headers: this.buildHeaders() },\n );\n }\n\n getAiStatus(): Observable<AiProviderStatusResponse> {\n return this.http.get<AiProviderStatusResponse>(\n `${this.baseUrl}/status`,\n { headers: this.buildHeaders() },\n );\n }\n\n getAiContext(componentId: string, componentType: string): Observable<AiContextDTO> {\n const params = new HttpParams({ fromObject: { componentType } });\n return this.http.get<AiContextDTO>(\n `${this.contextUrl}/${componentId}`,\n { headers: this.buildHeaders(), params },\n );\n }\n\n loadGlobalAiConfig(): Observable<GlobalAiConfig | null> {\n const snapshot = this.globalConfig.get<GlobalAiConfig>('ai');\n if (snapshot !== undefined) {\n return of(snapshot ?? null);\n }\n return this.globalConfig.configChanges$.pipe(\n filter((cfg): cfg is GlobalConfig => !!cfg),\n map((cfg) => cfg.ai ?? null),\n take(1),\n );\n }\n\n saveGlobalAiConfig(aiConfig: GlobalAiConfig): Observable<void> {\n return from(this.globalConfig.saveGlobalConfig({ ai: aiConfig }));\n }\n\n getHeaderContext(): AiHeaderContext {\n const { merged, missing } = this.resolveHeaderMap();\n return {\n tenantId: merged['X-Tenant-ID'] || 'server',\n env: merged['X-Env'] || 'server',\n userId: merged['X-User-ID'] || 'server',\n missing,\n };\n }\n\n private buildHeaders(extra?: Record<string, string | undefined>): HttpHeaders {\n const { merged } = this.resolveHeaderMap(extra);\n return new HttpHeaders(merged);\n }\n\n private normalizeContractVersion(version?: string): string {\n const normalized = typeof version === 'string' ? version.trim() : '';\n return normalized || AI_INTENT_CONTRACT_VERSION;\n }\n\n private normalizeContractSchemaHash(schemaHash?: string): string {\n const normalized = typeof schemaHash === 'string' ? schemaHash.trim().toLowerCase() : '';\n if (/^[a-f0-9]{64}$/.test(normalized)) {\n return normalized;\n }\n return AI_INTENT_CONTRACT_SCHEMA_HASH;\n }\n\n private resolveHeaderMap(\n extra?: Record<string, string | undefined>,\n ): { merged: Record<string, string>; missing: string[] } {\n const allowLocalIdentityFallback = !!this.storageOpts?.allowLocalIdentityFallback;\n const defaults: Record<string, string> = this.storageOpts?.defaultHeaders\n ?? (allowLocalIdentityFallback ? resolveDefaultHeaders() : {});\n const base: Record<string, string | undefined> = this.storageOpts?.headersFactory?.() ?? {};\n const merged: Record<string, string> = { ...defaults };\n\n for (const [key, value] of Object.entries(base)) {\n if (typeof value === 'string' && value.trim()) {\n merged[key] = value;\n }\n }\n\n if (extra) {\n for (const [key, value] of Object.entries(extra)) {\n if (typeof value === 'string' && value.trim()) {\n merged[key] = value;\n }\n }\n }\n\n const missing: string[] = [];\n const requiredKeys = ['X-Tenant-ID', 'X-User-ID', 'X-Env'];\n const hasCustomDefaults = !!this.storageOpts?.defaultHeaders || allowLocalIdentityFallback;\n\n for (const key of requiredKeys) {\n const baseValue = base[key];\n const extraValue = extra?.[key];\n const providedByFactory = typeof baseValue === 'string' && baseValue.trim().length > 0;\n const providedByExtra = typeof extraValue === 'string' && extraValue.trim().length > 0;\n\n if (!providedByFactory && !providedByExtra && !hasCustomDefaults) {\n missing.push(key);\n }\n }\n\n return { merged, missing };\n }\n\n private parsePatchStreamEnvelope(rawData: string): AiPatchStreamEnvelope {\n let parsedValue: unknown;\n try {\n parsedValue = JSON.parse(rawData) as unknown;\n } catch {\n throw new AiPatchStreamConnectionError(\n 'parse',\n 'Failed to parse stream event payload.',\n );\n }\n if (!this.isPatchStreamEnvelope(parsedValue)) {\n throw new AiPatchStreamConnectionError(\n 'schema',\n 'Patch stream event payload does not match the contract envelope.',\n );\n }\n return parsedValue;\n }\n\n private isPatchStreamEnvelope(value: unknown): value is AiPatchStreamEnvelope {\n if (!this.isJsonObject(value)) {\n return false;\n }\n const eventId = value['eventId'];\n const streamId = value['streamId'];\n const threadId = value['threadId'];\n const turnId = value['turnId'];\n const seq = value['seq'];\n const eventSchemaVersion = value['eventSchemaVersion'];\n const timestamp = value['timestamp'];\n const type = value['type'];\n const payload = value['payload'];\n return (eventId === undefined || eventId === null || typeof eventId === 'string')\n && typeof streamId === 'string'\n && typeof threadId === 'string'\n && typeof turnId === 'string'\n && typeof seq === 'number'\n && Number.isFinite(seq)\n && typeof eventSchemaVersion === 'string'\n && eventSchemaVersion === AI_STREAM_EVENT_SCHEMA_VERSION\n && typeof timestamp === 'string'\n && typeof type === 'string'\n && AI_STREAM_EVENT_TYPE_SET.has(type)\n && this.isJsonObject(payload);\n }\n\n private isJsonObject(value: unknown): value is AiJsonObject {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n\n private async probePatchStreamEndpoint(endpoint: string): Promise<number | null> {\n if (typeof fetch === 'undefined') {\n return null;\n }\n try {\n const response = await fetch(endpoint, {\n method: 'GET',\n credentials: 'include',\n cache: 'no-store',\n });\n return response.status;\n } catch {\n return null;\n }\n }\n}\n\ntype ApiConfigStorageOptionsExtended = ApiConfigStorageOptions & {\n defaultHeaders?: Record<string, string>;\n allowLocalIdentityFallback?: boolean;\n};\n","import { Injectable } from '@angular/core';\nimport { SchemaType, Schema } from '@google/generative-ai';\nimport { MinifiedField } from '../models/ai-models';\n\n// Interface compatible with FieldSchema from visual-builder and FieldMetadata from core\nexport interface FieldSchemaLike {\n label: string;\n type: string;\n description?: string;\n required?: boolean;\n uiConfig?: { category?: string };\n allowedValues?: Array<{ value: any; label: string }>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SchemaMinifierService {\n\n /**\n * Converts complete FieldSchemas into a minified version for AI context (Token optimized)\n */\n minify(schemas: Record<string, FieldSchemaLike>): MinifiedField[] {\n return Object.entries(schemas).map(([id, schema]) => ({\n id,\n label: schema.label,\n type: schema.type,\n category: schema.uiConfig?.category,\n ...(schema.allowedValues ? {\n allowedValues: schema.allowedValues.map(v => ({\n value: v.value,\n label: v.label\n }))\n } : {})\n }));\n }\n\n /**\n * Formats minified fields into a string for the AI prompt (Legacy/Text mode)\n */\n toPromptFormat(fields: MinifiedField[]): string {\n return fields.map(f => {\n let line = `• ${f.id} (${f.type}): ${f.label}`;\n\n if (f.allowedValues && f.allowedValues.length > 0) {\n const values = f.allowedValues\n .map(v => `'${v.value}'`)\n .join(', ');\n line += ` [valores permitidos: ${values}]`;\n }\n\n return line;\n }).join('\\n');\n }\n\n /**\n * Transforms Praxis FieldSchemas into Google Gemini JSON Schema format.\n * This enables \"Response Schema\" enforcement in the API.\n */\n toGeminiSchema(fields: Record<string, FieldSchemaLike>): Schema {\n const properties: Record<string, Schema> = {};\n const required: string[] = [];\n\n Object.entries(fields).forEach(([key, field]) => {\n if (field.required) required.push(key);\n \n properties[key] = {\n type: this.mapTypeToGemini(field.type) as any,\n description: field.label + (field.description ? ` - ${field.description}` : ''),\n ...(field.allowedValues ? {\n enum: field.allowedValues.map(v => String(v.value))\n } : {})\n };\n });\n\n return {\n type: SchemaType.OBJECT,\n properties,\n required: required.length > 0 ? required : undefined\n };\n }\n\n private mapTypeToGemini(praxisType: string): SchemaType {\n switch (praxisType.toLowerCase()) {\n case 'number':\n case 'integer':\n case 'currency':\n return SchemaType.NUMBER;\n case 'boolean':\n case 'toggle':\n return SchemaType.BOOLEAN;\n case 'array':\n case 'multiselect':\n return SchemaType.ARRAY;\n case 'object':\n return SchemaType.OBJECT;\n default:\n return SchemaType.STRING;\n }\n }\n}","import { Injectable } from '@angular/core';\nimport { PromptContext } from '../core/models/ai-models';\nimport { SchemaMinifierService, FieldSchemaLike } from '../core/services/schema-minifier.service';\nimport { RulePropertyDefinition, RulePropertySchema } from '@praxisui/core';\n\n@Injectable({ providedIn: 'root' })\nexport class AiContextBuilderService {\n\n constructor(private schemaMinifier: SchemaMinifierService) {}\n\n /**\n * Builds the complete context for the AI prompt\n */\n buildPromptContext(\n fieldSchemas: Record<string, FieldSchemaLike>,\n targetType: 'field' | 'section' | 'action' | 'row' | 'column',\n propertySchema: RulePropertySchema\n ): PromptContext {\n\n const minifiedFields = this.schemaMinifier.minify(fieldSchemas);\n const fieldsText = this.schemaMinifier.toPromptFormat(minifiedFields);\n \n const properties = propertySchema[targetType] || [];\n const propertiesText = this.formatProperties(properties);\n \n const operatorsText = this.formatOperators();\n\n return {\n fieldsText,\n propertiesText,\n operatorsText,\n targetType,\n minifiedFields\n };\n }\n\n buildRulePrompt(userPrompt: string, context: PromptContext): string {\n return `\nVocê é um assistente especializado em criar regras de formulário.\n\nCAMPOS DISPONÍVEIS NO FORMULÁRIO:\n${context.fieldsText}\n\nPROPRIEDADES QUE VOCÊ PODE APLICAR EM \"${context.targetType.toUpperCase()}\":\n${context.propertiesText}\n\nOPERADORES DSL PERMITIDOS:\n${context.operatorsText}\n\nFORMATO DE RESPOSTA (JSON ESTRITO):\n{\n \"ruleName\": \"string - Nome descritivo da regra\",\n \"targetType\": \"${context.targetType}\",\n \"targetIds\": [\"id1\", \"id2\"],\n \"conditionDsl\": \"string - Condição em DSL ou null para sempre aplicar\",\n \"effects\": {\n \"properties\": { \"prop1\": valor1, \"prop2\": valor2 },\n \"propertiesWhenFalse\": { \"prop1\": valorAlternativo }\n }\n}\n\nREGRAS CRÍTICAS:\n1. Use APENAS campos listados acima\n2. Use APENAS propriedades listadas para o targetType especificado\n3. Use APENAS operadores DSL permitidos\n4. Se o usuário pedir \"sempre\", use \"conditionDsl\": null\n5. Para condições negativas (\"esconder se NÃO...\"), inverta a lógica na condição\n6. Retorne APENAS o JSON, sem markdown, comentários ou explicações\n\nEXEMPLOS DE SAÍDA:\n\n1. Usuário: \"Esconder telefone se for menor de idade\"\n Resposta:\n {\n \"ruleName\": \"Ocultar telefone menores\",\n \"targetType\": \"field\",\n \"targetIds\": [\"telefone\"],\n \"conditionDsl\": \"idade lt 18\",\n \"effects\": {\n \"properties\": { \"visible\": false }\n }\n }\n\n2. Usuário: \"Tornar email obrigatório se tipo for Pessoa Física\"\n Resposta:\n {\n \"ruleName\": \"Email obrigatório PF\",\n \"targetType\": \"field\",\n \"targetIds\": [\"email\"],\n \"conditionDsl\": \"tipoPessoa eq 'PF'\",\n \"effects\": {\n \"properties\": { \"required\": true },\n \"propertiesWhenFalse\": { \"required\": false }\n }\n }\n\nPERGUNTA DO USUÁRIO:\n\"${userPrompt}\"\n\nResposta (JSON puro, sem markdown):\n`.trim();\n }\n\n buildSuggestionPrompt(context: PromptContext): string {\n return `\nVocê é um assistente de UX para formulários.\n\nCAMPOS DISPONÍVEIS:\n${context.fieldsText}\n\nALVO ATUAL: ${context.targetType}\n\nTAREFA:\n- Analise os campos e sugira 3 regras de negócio plausíveis em português que façam sentido para \"${context.targetType}\".\n- Seja direto e específico, citando nomes reais dos campos.\n- Misture condições com null/empty/valores de lista quando fizer sentido.\n- Não use markdown nem explicações.\n\nFORMATO DE RESPOSTA:\n[\"Sugestão 1\", \"Sugestão 2\", \"Sugestão 3\"]\n`.trim();\n }\n\n /**\n * Formats available properties by targetType\n */\n private formatProperties(properties: RulePropertyDefinition[]): string {\n return properties\n .map(prop => {\n let line = `• ${prop.name} (${prop.type}): ${prop.label}`;\n\n if (prop.enumValues && prop.enumValues.length > 0) {\n const values = prop.enumValues\n .map(v => `'${v.value}'`)\n .join(', ');\n line += ` [valores: ${values}]`;\n }\n\n if (prop.description) {\n line += ` - ${prop.description}`;\n }\n\n return line;\n })\n .join('\\n');\n }\n\n /**\n * Lists DSL operators with examples\n */\n private formatOperators(): string {\n return `\nCOMPARAÇÃO:\n• eq (igual): campo eq 'valor'\n• neq (diferente): campo neq 'valor'\n• lt (menor): idade lt 18\n• lte (menor ou igual): idade lte 18\n• gt (maior): preco gt 100\n• gte (maior ou igual): preco gte 100\n\nTEXTO:\n• contains (contém): nome contains 'Silva'\n• startsWith (começa com): email startsWith 'admin'\n• endsWith (termina com): arquivo endsWith '.pdf'\n\nCONJUNTO:\n• in (está em): status in ['ativo', 'pendente']\n• notIn (não está em): tipo notIn ['cancelado']\n\nREGEX:\n• matches (corresponde): cpf matches '^\\\\d{11}$'\n• notMatches (não corresponde): senha notMatches 'senha123'\n\nNULIDADE:\n• isEmpty (vazio): campo isEmpty\n• isNotEmpty (não vazio): campo isNotEmpty\n• isNull (nulo): campo isNull\n• isNotNull (não nulo): campo isNotNull\n\nLÓGICOS:\n• and: condicao1 and condicao2\n• or: condicao1 or condicao2\n• not: not(condicao)\n `.trim();\n }\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'praxis-ai-streaming-feedback',\n standalone: true,\n imports: [CommonModule, MatIconModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ai-processing-overlay\">\n <div class=\"ai-pulse-ring\"></div>\n <mat-icon class=\"sparkle-icon\">auto_awesome</mat-icon>\n <div class=\"processing-text\">\n <h3 *ngIf=\"title\">{{ title }}</h3>\n <div class=\"stream-content\">\n <p class=\"fade-text\" [class.thinking]=\"isThinking\">{{ displayText }}<span class=\"cursor\">|</span></p>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .ai-processing-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.92);\n backdrop-filter: blur(6px);\n z-index: 100;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 24px;\n border-radius: 8px;\n padding: 32px;\n text-align: center;\n }\n\n .sparkle-icon {\n font-size: 48px;\n width: 48px;\n height: 48px;\n color: #673ab7;\n animation: ai-pulse 2s infinite;\n z-index: 2;\n }\n\n .ai-pulse-ring {\n position: absolute;\n width: 120px;\n height: 120px;\n border-radius: 50%;\n background: radial-gradient(circle, rgba(103, 58, 183, 0.15) 0%, rgba(103, 58, 183, 0) 70%);\n animation: ai-ripple 2s infinite;\n z-index: 1;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n margin-top: -40px; /* Adjust for icon position */\n }\n\n .processing-text {\n z-index: 2;\n max-width: 400px;\n width: 100%;\n }\n\n .processing-text h3 {\n margin: 0 0 12px 0;\n color: #311b92;\n font-size: 18px;\n font-weight: 500;\n }\n\n .stream-content {\n min-height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .fade-text {\n margin: 0;\n color: #455a64;\n font-size: 14px;\n line-height: 1.5;\n white-space: pre-wrap;\n font-family: monospace; /* Code-like feel for \"thinking\" */\n }\n \n .fade-text.thinking {\n color: #673ab7;\n font-style: italic;\n }\n\n .cursor {\n display: inline-block;\n width: 2px;\n background-color: #673ab7;\n animation: blink 1s step-end infinite;\n margin-left: 2px;\n vertical-align: text-bottom;\n }\n\n @keyframes ai-pulse {\n 0% { transform: scale(1); opacity: 1; text-shadow: 0 0 10px rgba(103, 58, 183, 0.5); }\n 50% { transform: scale(1.1); opacity: 0.8; text-shadow: 0 0 20px rgba(103, 58, 183, 0.8); }\n 100% { transform: scale(1); opacity: 1; text-shadow: 0 0 10px rgba(103, 58, 183, 0.5); }\n }\n\n @keyframes ai-ripple {\n 0% { transform: translate(-50%, -50%) scale(0.8); opacity: 0.6; }\n 100% { transform: translate(-50%, -50%) scale(2.5); opacity: 0; }\n }\n\n @keyframes blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0; }\n }\n `]\n})\nexport class StreamingFeedbackComponent {\n @Input() title = 'Processando...';\n @Input() displayText = '';\n @Input() isThinking = false;\n}\n","import { Injectable } from '@angular/core';\nimport {\n DslParser,\n DslValidator,\n ValidationIssue,\n ValidationSeverity,\n ValidationIssueType,\n FunctionRegistry,\n} from '@praxisui/specification';\nimport { ContextProvider } from '@praxisui/specification';\n\n/**\n * Normalize DSL expression by replacing aliases with standard operators\n */\nexport function normalizeDsl(dsl: string): string {\n if (!dsl) return dsl;\n return dsl\n .replace(/\\beq\\b/gi, '==')\n .replace(/\\bneq\\b/gi, '!=')\n .replace(/\\blt\\b/gi, '<')\n .replace(/\\blte\\b/gi, '<=')\n .replace(/\\bgt\\b/gi, '>')\n .replace(/\\bgte\\b/gi, '>=');\n}\n\n/**\n * Configuration for parsing DSL expressions\n */\nexport interface DslParsingConfig {\n /** Available function registry */\n functionRegistry?: FunctionRegistry<any>;\n /** Context provider for variable resolution */\n contextProvider?: ContextProvider;\n /** Known field names for validation */\n knownFields?: string[];\n /** Enable performance warnings */\n enablePerformanceWarnings?: boolean;\n /** Maximum expression complexity */\n maxComplexity?: number;\n}\n\n/**\n * Result of parsing a DSL expression\n */\nexport interface DslParsingResult<T extends object = any> {\n /** Whether parsing was successful */\n success: boolean;\n /** Parsed specification (if successful) */\n specification?: any; // Would be Specification<T> but avoiding circular import\n /** Validation issues found */\n issues: ValidationIssue[];\n /** Performance metrics */\n metrics?: {\n parseTime: number;\n complexity: number;\n };\n}\n\n/**\n * Dedicated service for DSL parsing and validation\n * Extracted from SpecificationBridgeService to follow SRP\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class DslParsingService {\n constructor() { }\n\n /**\n * Parse a DSL expression into a specification\n */\n parseDsl<T extends object = any>(\n dslExpression: string,\n config?: DslParsingConfig,\n ): DslParsingResult<T> {\n const startTime = performance.now();\n const issues: ValidationIssue[] = [];\n\n // Normalize DSL (handle aliases like eq, lt, etc.)\n const normalizedDsl = DslParsingService.normalizeDsl(dslExpression);\n console.log(`[DslParsingService] Input: \"${dslExpression}\" -> Normalized: \"${normalizedDsl}\"`);\n\n try {\n const validator = new DslValidator({\n knownFields: config?.knownFields,\n functionRegistry: config?.functionRegistry,\n enablePerformanceWarnings: config?.enablePerformanceWarnings,\n maxComplexity: config?.maxComplexity,\n });\n const validationIssues = validator.validate(normalizedDsl);\n if (validationIssues.length > 0) {\n console.log('[DslParsingService] Validation Issues:', validationIssues);\n }\n issues.push(...validationIssues);\n\n const criticalErrors = issues.filter(\n (issue) => issue.severity === ValidationSeverity.ERROR,\n );\n if (criticalErrors.length > 0) {\n return {\n success: false,\n issues,\n metrics: {\n parseTime: performance.now() - startTime,\n complexity: this.calculateComplexity(normalizedDsl),\n },\n };\n }\n\n const parser = new DslParser<any>(config?.functionRegistry);\n const specification = parser.parse(normalizedDsl);\n const endTime = performance.now();\n\n return {\n success: true,\n specification,\n issues,\n metrics: {\n parseTime: endTime - startTime,\n complexity: this.calculateComplexity(normalizedDsl),\n },\n };\n } catch (error) {\n issues.push({\n type: ValidationIssueType.SYNTAX_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Failed to parse DSL: ${error instanceof Error ? error.message : 'Unknown error'\n }`,\n position: { start: 0, end: dslExpression.length, line: 1, column: 1 },\n });\n\n return {\n success: false,\n issues,\n metrics: {\n parseTime: performance.now() - startTime,\n complexity: this.calculateComplexity(dslExpression),\n },\n };\n }\n }\n\n\n\n /**\n * Normalize DSL expression (delegates to utility)\n */\n normalizeDsl(dsl: string): string {\n return normalizeDsl(dsl);\n }\n\n /**\n * Static wrapper for backward compatibility if needed\n */\n static normalizeDsl(dsl: string): string {\n return normalizeDsl(dsl);\n }\n\n /**\n * Validate DSL syntax without parsing\n */\n validateDsl(\n dslExpression: string,\n config?: DslParsingConfig,\n ): ValidationIssue[] {\n try {\n const validator = new DslValidator({\n knownFields: config?.knownFields,\n functionRegistry: config?.functionRegistry,\n enablePerformanceWarnings: config?.enablePerformanceWarnings,\n maxComplexity: config?.maxComplexity,\n });\n return validator.validate(dslExpression);\n } catch (error) {\n return [\n {\n type: ValidationIssueType.SYNTAX_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Validation failed: ${error instanceof Error ? error.message : 'Unknown error'\n }`,\n position: { start: 0, end: dslExpression.length, line: 1, column: 1 },\n },\n ];\n }\n }\n\n /**\n * Get suggestions for DSL completion\n */\n getDslSuggestions(\n partialExpression: string,\n cursorPosition: number,\n config?: DslParsingConfig,\n ): string[] {\n try {\n // This would typically use a language service or parser\n const suggestions: string[] = [];\n\n // Add field suggestions\n if (config?.knownFields) {\n const currentToken = this.getCurrentToken(\n partialExpression,\n cursorPosition,\n );\n const matchingFields = config.knownFields.filter((field) =>\n field.toLowerCase().startsWith(currentToken.toLowerCase()),\n );\n suggestions.push(...matchingFields);\n }\n\n // Add operator suggestions\n const operators = [\n '==',\n '!=',\n '>',\n '<',\n '>=',\n '<=',\n 'contains',\n 'startsWith',\n 'endsWith',\n ];\n suggestions.push(...operators);\n\n // Add function suggestions\n if (config?.functionRegistry) {\n // Would get function names from registry\n suggestions.push('sum()', 'count()', 'avg()', 'max()', 'min()');\n }\n\n return suggestions;\n } catch (error) {\n console.warn('Failed to get DSL suggestions:', error);\n return [];\n }\n }\n\n /**\n * Format DSL expression for readability\n */\n formatDsl(dslExpression: string): string {\n try {\n // Simple formatting rules\n return dslExpression\n .replace(/\\s*&&\\s*/g, ' && ')\n .replace(/\\s*\\|\\|\\s*/g, ' || ')\n .replace(/\\s*==\\s*/g, ' == ')\n .replace(/\\s*!=\\s*/g, ' != ')\n .replace(/\\s*>=\\s*/g, ' >= ')\n .replace(/\\s*<=\\s*/g, ' <= ')\n .replace(/\\s*>\\s*/g, ' > ')\n .replace(/\\s*<\\s*/g, ' < ')\n .replace(/\\(\\s+/g, '(')\n .replace(/\\s+\\)/g, ')')\n .trim();\n } catch (error) {\n console.warn('Failed to format DSL:', error);\n return dslExpression;\n }\n }\n\n /**\n * Check if DSL expression is syntactically valid\n */\n isValidDsl(dslExpression: string, config?: DslParsingConfig): boolean {\n const issues = this.validateDsl(dslExpression, config);\n return !issues.some((issue) => issue.severity === 'error');\n }\n\n private calculateComplexity(dslExpression: string): number {\n // Simple complexity calculation based on operators and nesting\n let complexity = 1;\n\n // Count operators\n complexity += (dslExpression.match(/&&|\\|\\|/g) || []).length * 2;\n complexity += (dslExpression.match(/==|!=|>=|<=|>|</g) || []).length;\n\n // Count parentheses (nesting)\n complexity += (dslExpression.match(/\\(/g) || []).length;\n\n // Count function calls\n complexity += (dslExpression.match(/\\w+\\(/g) || []).length * 3;\n\n return complexity;\n }\n\n private getCurrentToken(expression: string, cursorPosition: number): string {\n // Extract the current word/token at cursor position\n const beforeCursor = expression.substring(0, cursorPosition);\n const afterCursor = expression.substring(cursorPosition);\n\n const beforeMatch = beforeCursor.match(/(\\w+)$/);\n const afterMatch = afterCursor.match(/^(\\w*)/);\n\n const before = beforeMatch ? beforeMatch[1] : '';\n const after = afterMatch ? afterMatch[1] : '';\n\n return before + after;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AiRuleResponse, AiValidationResult, AiValidationError, AiValidationWarning } from '../models/ai-models';\nimport { DslParsingService } from './dsl-parsing.service';\nimport { FieldSchemaLike } from './schema-minifier.service';\nimport { RulePropertySchema, RulePropertyDefinition } from '@praxisui/core';\n\nexport interface ValidationContext {\n fieldSchemas: Record<string, FieldSchemaLike>;\n targetSchemas?: any;\n propertySchema: RulePropertySchema;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AiResponseValidatorService {\n\n constructor(\n private dslParsingService: DslParsingService\n ) {}\n\n /**\n * Validates the complete AI response\n */\n validate(\n response: AiRuleResponse,\n context: ValidationContext\n ): AiValidationResult {\n\n const errors: AiValidationError[] = [];\n const warnings: AiValidationWarning[] = [];\n let correctedResponse: AiRuleResponse = { ...response };\n\n // 1. Validate JSON Structure\n const structureErrors = this.validateStructure(response);\n errors.push(...structureErrors);\n\n if (structureErrors.length > 0) {\n return { valid: false, errors, warnings };\n }\n\n // 2. Validate Target IDs\n const { invalidIds, suggestions } = this.validateTargetIds(\n response.targetIds,\n response.targetType,\n context\n );\n\n if (invalidIds.length > 0) {\n errors.push({\n field: 'targetIds',\n message: `IDs inválidos: ${invalidIds.join(', ')}`,\n severity: 'error',\n code: 'INVALID_TARGET_IDS'\n });\n\n // Auto-correction attempt\n if (suggestions.length === invalidIds.length) {\n warnings.push({\n field: 'targetIds',\n message: `Autocorrigido: ${invalidIds.join(', ')} → ${suggestions.join(', ')}`,\n suggestion: suggestions.join(', ')\n });\n correctedResponse.targetIds = suggestions;\n }\n }\n\n // 3. Validate DSL Condition\n if (response.conditionDsl) {\n // Normalize DSL (e.g. == to eq) before validation if needed, \n // but dslParsingService usually handles standard operators.\n const dslResult = this.dslParsingService.parseDsl(\n response.conditionDsl,\n {\n knownFields: Object.keys(context.fieldSchemas)\n }\n );\n\n if (!dslResult.success) {\n const dslErrors = dslResult.issues.map(issue => ({\n field: 'conditionDsl',\n message: issue.message,\n severity: 'critical' as const,\n code: (issue as any).code || 'DSL_PARSE_ERROR'\n }));\n errors.push(...dslErrors);\n }\n }\n\n // 4. Validate Properties\n const validProps = ((context.propertySchema as any)[response.targetType] || [])\n .map((p: any) => p.name);\n\n const invalidProps = Object.keys(response.effects.properties || {})\n .filter(prop => !validProps.includes(prop));\n\n if (invalidProps.length > 0) {\n errors.push({\n field: 'effects.properties',\n message: `Propriedades inválidas para ${response.targetType}: ${invalidProps.join(', ')}`,\n severity: 'error',\n code: 'INVALID_PROPERTIES'\n });\n }\n\n // 5. Validate Property Types\n const propSchema: RulePropertyDefinition[] = (context.propertySchema as any)[response.targetType] || [];\n\n for (const [propName, propValue] of Object.entries(response.effects.properties || {})) {\n const schema = propSchema.find(p => p.name === propName);\n\n if (schema) {\n const typeValid = this.validatePropertyType(propValue, schema);\n\n if (!typeValid) {\n errors.push({\n field: `effects.properties.${propName}`,\n message: `Tipo inválido: esperado ${schema.type}, recebido ${typeof propValue}`,\n severity: 'error',\n code: 'INVALID_PROPERTY_TYPE'\n });\n }\n }\n }\n\n return {\n valid: errors.filter(e => e.severity !== 'warning').length === 0,\n errors,\n warnings,\n correctedResponse: warnings.length > 0 ? correctedResponse : undefined\n };\n }\n\n private validateStructure(response: any): AiValidationError[] {\n const errors: AiValidationError[] = [];\n\n if (!response.ruleName || typeof response.ruleName !== 'string') {\n errors.push({\n field: 'ruleName',\n message: 'ruleName é obrigatório e deve ser string',\n severity: 'critical',\n code: 'MISSING_RULE_NAME'\n });\n }\n\n if (!response.targetType || !['field', 'section', 'action', 'row', 'column'].includes(response.targetType)) {\n errors.push({\n field: 'targetType',\n message: 'targetType inválido',\n severity: 'critical',\n code: 'INVALID_TARGET_TYPE'\n });\n }\n\n if (!Array.isArray(response.targetIds) || response.targetIds.length === 0) {\n errors.push({\n field: 'targetIds',\n message: 'targetIds deve ser array não-vazio',\n severity: 'critical',\n code: 'MISSING_TARGET_IDS'\n });\n }\n\n if (!response.effects || typeof response.effects !== 'object') {\n errors.push({\n field: 'effects',\n message: 'effects é obrigatório e deve ser objeto',\n severity: 'critical',\n code: 'MISSING_EFFECTS'\n });\n }\n\n return errors;\n }\n\n private validateTargetIds(\n targetIds: string[],\n targetType: string,\n context: ValidationContext\n ): { invalidIds: string[]; suggestions: string[] } {\n\n const invalidIds: string[] = [];\n const suggestions: string[] = [];\n\n for (const id of targetIds) {\n const isValid = this.isValidTargetId(id, targetType, context);\n\n if (!isValid) {\n invalidIds.push(id);\n\n // Find similar ID\n const similar = this.findSimilarTargetId(id, targetType, context);\n if (similar) {\n suggestions.push(similar);\n }\n } else {\n suggestions.push(id); // Keep valid IDs in the suggestion list for reconstruction\n }\n }\n\n return { invalidIds, suggestions: suggestions.length === targetIds.length ? suggestions : [] };\n }\n\n private isValidTargetId(\n id: string,\n targetType: string,\n context: ValidationContext\n ): boolean {\n\n if (targetType === 'field') {\n return id in context.fieldSchemas;\n }\n\n if (targetType === 'section' && context.targetSchemas?.sections) {\n return id in context.targetSchemas.sections;\n }\n if (targetType === 'action' && context.targetSchemas?.actions) {\n return id in context.targetSchemas.actions;\n }\n if (targetType === 'row' && context.targetSchemas?.rows) {\n return id in context.targetSchemas.rows;\n }\n if (targetType === 'column' && context.targetSchemas?.columns) {\n return id in context.targetSchemas.columns;\n }\n\n // If we don't have schema validation for non-fields, we assume valid or check basic format\n // But for safety, return false if schema is missing but type is known\n return false;\n }\n\n private findSimilarTargetId(\n invalidId: string,\n targetType: string,\n context: ValidationContext\n ): string | null {\n\n let candidates: string[] = [];\n\n if (targetType === 'field') {\n candidates = Object.keys(context.fieldSchemas);\n } else if (targetType === 'section' && context.targetSchemas?.sections) {\n candidates = Object.keys(context.targetSchemas.sections);\n } else if (targetType === 'action' && context.targetSchemas?.actions) {\n candidates = Object.keys(context.targetSchemas.actions);\n }\n\n if (candidates.length === 0) return null;\n\n const similarities = candidates.map(candidate => ({\n id: candidate,\n score: this.calculateSimilarity(invalidId, candidate)\n }));\n\n similarities.sort((a, b) => b.score - a.score);\n\n // Threshold 0.6 for suggestion\n return similarities[0].score > 0.6 ? similarities[0].id : null;\n }\n\n private calculateSimilarity(str1: string, str2: string): number {\n const longer = str1.length > str2.length ? str1 : str2;\n const shorter = str1.length > str2.length ? str2 : str1;\n\n if (longer.length === 0) return 1.0;\n\n const editDistance = this.levenshteinDistance(longer, shorter);\n return (longer.length - editDistance) / longer.length;\n }\n\n private levenshteinDistance(str1: string, str2: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= str2.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= str1.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= str2.length; i++) {\n for (let j = 1; j <= str1.length; j++) {\n if (str2.charAt(i - 1) === str1.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j] + 1\n );\n }\n }\n }\n\n return matrix[str2.length][str1.length];\n }\n\n private validatePropertyType(\n value: any,\n schema: RulePropertyDefinition\n ): boolean {\n\n switch (schema.type) {\n case 'boolean':\n return typeof value === 'boolean';\n\n case 'string':\n return typeof value === 'string';\n\n case 'number':\n return typeof value === 'number';\n\n case 'enum':\n return schema.enumValues?.some(e => e.value === value) || false;\n\n case 'object':\n return typeof value === 'object' && value !== null;\n\n default:\n return true;\n }\n }\n}","import { Component, Inject, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { firstValueFrom } from 'rxjs';\n\nimport { PraxisAiService } from '../core/services/praxis-ai.service';\nimport { AiContextBuilderService } from '../context/ai-context-builder.service';\nimport { AiResponseValidatorService, ValidationContext } from '../core/services/ai-response-validator.service';\nimport { AiRuleResponse, AiValidationWarning } from '../core/models/ai-models';\nimport { FieldSchemaLike } from '../core/services/schema-minifier.service';\nimport { RulePropertySchema } from '@praxisui/core';\nimport { StreamingFeedbackComponent } from './streaming-feedback.component';\n\nexport interface AiWizardData {\n fieldSchemas: Record<string, FieldSchemaLike>;\n targetSchemas?: any;\n propertySchema: RulePropertySchema;\n}\n\ntype WizardStep = 'prompt' | 'review';\n\n@Component({\n selector: 'praxis-ai-rule-wizard-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatDialogModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatProgressSpinnerModule,\n MatSnackBarModule,\n MatExpansionModule,\n MatTabsModule,\n MatChipsModule,\n StreamingFeedbackComponent\n ],\n template: `\n <div class=\"ai-wizard-container\">\n <h2 mat-dialog-title class=\"wizard-title\">\n <mat-icon class=\"ai-icon\">auto_awesome</mat-icon>\n <span>Criar Regra com IA</span>\n <span class=\"step-badge\" *ngIf=\"currentStep === 'review'\">Revisão</span>\n </h2>\n\n <mat-dialog-content class=\"wizard-content\">\n \n <!-- STEP 1: PROMPT -->\n <div *ngIf=\"currentStep === 'prompt'\" class=\"step-prompt\">\n <p class=\"intro-text\">\n Descreva a regra que você deseja criar em linguagem natural e a IA irá gerar a configuração para você revisar.\n </p>\n\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"type-select\">\n <mat-label>Tipo de Alvo</mat-label>\n <mat-select [(ngModel)]=\"selectedTargetType\" (selectionChange)=\"onTargetTypeChange()\">\n <mat-option value=\"field\">Campo (Field)</mat-option>\n <mat-option value=\"section\">Seção (Section)</mat-option>\n <mat-option value=\"action\">Ação (Action)</mat-option>\n <mat-option value=\"row\">Linha (Row)</mat-option>\n <mat-option value=\"column\">Coluna (Column)</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <mat-form-field appearance=\"outline\" class=\"prompt-input\">\n <mat-label>Descreva sua regra</mat-label>\n <textarea \n matInput \n [(ngModel)]=\"userPrompt\" \n rows=\"6\" \n placeholder=\"Ex: Esconder o campo telefone se a idade for menor que 18 anos...\"\n [disabled]=\"isGenerating\"\n ></textarea>\n <mat-hint align=\"end\">{{userPrompt.length}} caracteres</mat-hint>\n </mat-form-field>\n\n <div class=\"suggestions-card\" data-testid=\"ai-suggestions\">\n <div class=\"suggestions-header\">\n <div class=\"title\">\n <mat-icon>lightbulb</mat-icon>\n Sugestões da IA\n </div>\n <button mat-icon-button type=\"button\" (click)=\"reloadSuggestions()\" [disabled]=\"loadingSuggestions\">\n <mat-icon>refresh</mat-icon>\n </button>\n </div>\n <div class=\"suggestions-body\" *ngIf=\"!loadingSuggestions && suggestions.length > 0; else suggestionsState\">\n <mat-chip-set aria-label=\"Sugestões de regras\">\n <mat-chip *ngFor=\"let suggestion of suggestions\" (click)=\"applySuggestion(suggestion)\" class=\"suggestion-chip\">\n {{ suggestion }}\n </mat-chip>\n </mat-chip-set>\n </div>\n <ng-template #suggestionsState>\n <div class=\"suggestions-loading\" *ngIf=\"loadingSuggestions\">\n <mat-progress-spinner diameter=\"20\" mode=\"indeterminate\"></mat-progress-spinner>\n <span>Gerando sugestões...</span>\n </div>\n <div class=\"suggestions-empty\" *ngIf=\"!loadingSuggestions && suggestions.length === 0\">\n Nenhuma sugestão disponível no momento.\n </div>\n </ng-template>\n </div>\n\n <mat-expansion-panel class=\"properties-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>info</mat-icon>\n Ver propriedades disponíveis\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"properties-list\">\n <div *ngFor=\"let prop of getAvailableProperties()\" class=\"prop-item\">\n <span class=\"prop-name\">{{prop.name}}</span>\n <span class=\"prop-type\">{{prop.type}}</span>\n <span class=\"prop-desc\" *ngIf=\"prop.label\">- {{prop.label}}</span>\n </div>\n </div>\n </mat-expansion-panel>\n </div>\n\n <!-- STEP 2: REVIEW -->\n <div *ngIf=\"currentStep === 'review' && generatedResponse\" class=\"step-review\">\n <div class=\"review-header\">\n <h3>{{ generatedResponse.ruleName }}</h3>\n <div class=\"target-badges\">\n <span class=\"badge-type\">{{ generatedResponse.targetType }}</span>\n <span *ngFor=\"let id of generatedResponse.targetIds\" class=\"badge-id\">{{ id }}</span>\n </div>\n </div>\n\n <div *ngIf=\"warnings.length > 0\" class=\"warnings-box\">\n <div class=\"warning-title\">\n <mat-icon>auto_fix_high</mat-icon>\n Correções Automáticas\n </div>\n <ul class=\"warning-list\">\n <li *ngFor=\"let w of warnings\">\n {{ w.message }}\n </li>\n </ul>\n </div>\n\n <mat-tab-group class=\"preview-tabs\" animationDuration=\"0ms\">\n <mat-tab label=\"Resumo\">\n <div class=\"summary-view\">\n <div class=\"summary-row\">\n <span class=\"label\">Condição:</span>\n <code class=\"value condition\" *ngIf=\"generatedResponse.conditionDsl\">{{ generatedResponse.conditionDsl }}</code>\n <span class=\"value\" *ngIf=\"!generatedResponse.conditionDsl\"><em>(Sempre aplicada)</em></span>\n </div>\n \n <div class=\"summary-row\">\n <span class=\"label\">Propriedades (True):</span>\n <div class=\"props-grid\">\n <div *ngFor=\"let p of getProps(generatedResponse.effects.properties)\" class=\"prop-pair\">\n <span class=\"p-key\">{{p.key}}:</span>\n <span class=\"p-val\">{{p.value}}</span>\n </div>\n <span *ngIf=\"!hasProps(generatedResponse.effects.properties)\">-</span>\n </div>\n </div>\n\n <div class=\"summary-row\" *ngIf=\"hasProps(generatedResponse.effects.propertiesWhenFalse)\">\n <span class=\"label\">Propriedades (False):</span>\n <div class=\"props-grid\">\n <div *ngFor=\"let p of getProps(generatedResponse.effects.propertiesWhenFalse)\" class=\"prop-pair\">\n <span class=\"p-key\">{{p.key}}:</span>\n <span class=\"p-val\">{{p.value}}</span>\n </div>\n </div>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"JSON\">\n <pre class=\"json-preview\">{{ generatedResponse | json }}</pre>\n </mat-tab>\n </mat-tab-group>\n\n </div>\n\n <!-- COMMON: LOADING & ERROR -->\n <div *ngIf=\"validationError\" class=\"error-box\">\n <mat-icon>error</mat-icon>\n <span>{{validationError}}</span>\n </div>\n\n <praxis-ai-streaming-feedback\n *ngIf=\"isGenerating\"\n [displayText]=\"streamingText || currentLoadingMessage\"\n [isThinking]=\"true\"\n [title]=\"'Criando sua regra...'\"\n ></praxis-ai-streaming-feedback>\n </mat-dialog-content>\n\n <mat-dialog-actions align=\"end\" class=\"sticky-actions\">\n <!-- ACTIONS: PROMPT -->\n <ng-container *ngIf=\"currentStep === 'prompt'\">\n <button mat-button mat-dialog-close [disabled]=\"isGenerating\">Cancelar</button>\n <button \n mat-flat-button \n color=\"primary\" \n (click)=\"generate()\" \n [disabled]=\"!userPrompt.trim() || isGenerating\"\n >\n <mat-icon>auto_awesome</mat-icon>\n Gerar Regra\n </button>\n </ng-container>\n\n <!-- ACTIONS: REVIEW -->\n <ng-container *ngIf=\"currentStep === 'review'\">\n <button mat-button (click)=\"backToPrompt()\">\n <mat-icon>arrow_back</mat-icon>\n Refinar Prompt\n </button>\n <button \n mat-flat-button \n color=\"primary\" \n (click)=\"confirm()\"\n >\n <mat-icon>check</mat-icon>\n Aplicar Regra\n </button>\n </ng-container>\n </mat-dialog-actions>\n </div>\n `,\n styles: [`\n .ai-wizard-container {\n position: relative;\n padding-bottom: 0;\n max-height: 85vh;\n display: flex;\n flex-direction: column;\n }\n \n .wizard-title {\n display: flex;\n align-items: center;\n gap: 12px;\n color: #673ab7; /* Deep Purple */\n margin: 0;\n padding: 20px 24px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n background: var(--md-sys-color-surface);\n z-index: 1;\n }\n\n .step-badge {\n font-size: 12px;\n background: rgba(103, 58, 183, 0.1);\n padding: 2px 8px;\n border-radius: 12px;\n margin-left: auto;\n }\n \n .ai-icon {\n color: #673ab7;\n }\n\n .wizard-content {\n flex: 1;\n overflow-y: auto;\n padding: 0; /* Remove default padding */\n min-height: 300px;\n }\n\n /* Add internal padding to steps instead */\n .step-prompt, .step-review {\n padding: 20px 24px;\n }\n\n .intro-text {\n color: var(--md-sys-color-on-surface-variant);\n margin-bottom: 24px;\n font-size: 14px;\n }\n\n .form-row {\n display: flex;\n gap: 16px;\n margin-bottom: 8px;\n }\n\n .type-select {\n width: 200px;\n }\n\n .prompt-input {\n width: 100%;\n }\n\n .properties-panel {\n margin-top: 16px;\n box-shadow: none;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 8px !important;\n }\n\n .suggestions-card {\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 8px;\n padding: 12px;\n margin: 12px 0 4px;\n background: var(--md-sys-color-surface-container-low);\n }\n .suggestions-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n gap: 8px;\n }\n .suggestions-header .title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n font-size: 14px;\n }\n .suggestions-body {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n .suggestion-chip {\n cursor: pointer;\n max-width: 100%;\n white-space: normal;\n line-height: 1.3;\n }\n .suggestions-loading,\n .suggestions-empty {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--md-sys-color-on-surface-variant);\n font-size: 13px;\n }\n\n .properties-list {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 8px;\n padding: 8px 0;\n }\n\n .prop-item {\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .prop-name {\n font-weight: 600;\n font-family: monospace;\n }\n\n .prop-type {\n color: var(--md-sys-color-primary);\n background: var(--md-sys-color-primary-container);\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 10px;\n }\n \n .prop-desc {\n color: var(--md-sys-color-on-surface-variant);\n font-style: italic;\n }\n\n /* REVIEW STYLES */\n .review-header {\n margin-bottom: 20px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n padding-bottom: 12px;\n }\n .review-header h3 { margin: 0 0 8px 0; font-size: 18px; }\n\n .target-badges { display: flex; gap: 8px; }\n .badge-type { \n background: #e0e0e0; color: #424242; \n padding: 2px 8px; border-radius: 4px; font-size: 11px; text-transform: uppercase; font-weight: bold;\n }\n .badge-id { \n background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); \n padding: 2px 8px; border-radius: 4px; font-size: 12px; font-family: monospace;\n }\n\n .warnings-box {\n background: #fff8e1;\n border: 1px solid #ffecb3;\n border-radius: 8px;\n padding: 12px;\n margin-bottom: 16px;\n }\n .warning-title {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #f57f17;\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 8px;\n }\n .warning-title mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .warning-list { margin: 0; padding-left: 24px; font-size: 13px; color: #5d4037; }\n\n .summary-view {\n padding: 16px;\n background: var(--md-sys-color-surface-container-low);\n border-radius: 8px;\n margin-top: 12px;\n }\n .summary-row { margin-bottom: 12px; }\n .summary-row:last-child { margin-bottom: 0; }\n .label { display: block; font-size: 11px; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant); margin-bottom: 4px; }\n .value { font-size: 14px; }\n .value.condition { font-family: monospace; color: var(--md-sys-color-primary); background: rgba(0,0,0,0.03); padding: 2px 4px; border-radius: 4px; }\n\n .props-grid { display: flex; flex-wrap: wrap; gap: 12px; }\n .prop-pair { \n background: white; border: 1px solid var(--md-sys-color-outline-variant); \n padding: 4px 8px; border-radius: 4px; font-size: 13px; \n }\n .p-key { font-weight: 600; margin-right: 4px; }\n .p-val { color: var(--md-sys-color-primary); }\n\n .json-preview {\n background: #f5f5f5;\n padding: 12px;\n border-radius: 8px;\n font-size: 12px;\n max-height: 300px;\n overflow: auto;\n margin-top: 12px;\n }\n\n /* COMMON */\n .error-box {\n margin-top: 16px;\n padding: 12px;\n background-color: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n border-radius: 8px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n font-size: 13px;\n }\n\n .ai-processing-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.85);\n backdrop-filter: blur(4px);\n z-index: 10;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 24px;\n border-radius: 8px;\n }\n\n .sparkle-icon {\n font-size: 48px;\n width: 48px;\n height: 48px;\n color: #673ab7;\n animation: ai-pulse 2s infinite;\n z-index: 2;\n }\n\n .ai-pulse-ring {\n position: absolute;\n width: 80px;\n height: 80px;\n border-radius: 50%;\n background: radial-gradient(circle, rgba(103, 58, 183, 0.2) 0%, rgba(103, 58, 183, 0) 70%);\n animation: ai-ripple 2s infinite;\n z-index: 1;\n }\n\n .processing-text {\n text-align: center;\n z-index: 2;\n }\n\n .processing-text h3 {\n margin: 0 0 8px 0;\n color: #311b92;\n font-size: 18px;\n font-weight: 500;\n }\n\n .fade-text {\n margin: 0;\n color: #673ab7;\n font-size: 14px;\n font-style: italic;\n min-height: 20px;\n animation: text-fade 0.5s ease-in-out;\n }\n\n @keyframes ai-pulse {\n 0% { transform: scale(1); opacity: 1; text-shadow: 0 0 10px rgba(103, 58, 183, 0.5); }\n 50% { transform: scale(1.1); opacity: 0.8; text-shadow: 0 0 20px rgba(103, 58, 183, 0.8); }\n 100% { transform: scale(1); opacity: 1; text-shadow: 0 0 10px rgba(103, 58, 183, 0.5); }\n }\n\n @keyframes ai-ripple {\n 0% { transform: scale(0.8); opacity: 0.6; }\n 100% { transform: scale(2.5); opacity: 0; }\n }\n\n @keyframes text-fade {\n 0% { opacity: 0; transform: translateY(5px); }\n 100% { opacity: 1; transform: translateY(0); }\n }\n `]\n})\nexport class AiRuleWizardDialogComponent implements OnInit {\n \n selectedTargetType: 'field' | 'section' | 'action' | 'row' | 'column' = 'field';\n userPrompt = '';\n isGenerating = false;\n validationError: string | null = null;\n loadingSuggestions = false;\n suggestions: string[] = [];\n private suggestionsCache = new Map<string, string[]>();\n private suggestionsRequestId = 0;\n \n // Step Management\n currentStep: WizardStep = 'prompt';\n generatedResponse: AiRuleResponse | null = null;\n warnings: AiValidationWarning[] = [];\n\n // Loading UX\n loadingMessages = [\n 'Analisando estrutura do formulário...',\n 'Interpretando sua solicitação...',\n 'Construindo regra lógica...',\n 'Validando compatibilidade...',\n 'Finalizando detalhes...'\n ];\n currentLoadingMessage = this.loadingMessages[0];\n streamingText = '';\n private loadingInterval: any;\n\n constructor(\n public dialogRef: MatDialogRef<AiRuleWizardDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: AiWizardData,\n private aiService: PraxisAiService,\n private validator: AiResponseValidatorService,\n private snackBar: MatSnackBar,\n private contextBuilder: AiContextBuilderService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.loadSuggestions();\n }\n\n onTargetTypeChange(): void {\n this.loadSuggestions();\n }\n\n getAvailableProperties() {\n return this.data.propertySchema[this.selectedTargetType] || [];\n }\n\n async loadSuggestions(forceRefresh = false): Promise<void> {\n const cacheKey = `${this.selectedTargetType}`;\n if (!forceRefresh && this.suggestionsCache.has(cacheKey)) {\n this.suggestions = this.suggestionsCache.get(cacheKey) || [];\n return;\n }\n\n const context = this.contextBuilder.buildPromptContext(\n this.data.fieldSchemas as any,\n this.selectedTargetType,\n this.data.propertySchema\n );\n\n const requestId = ++this.suggestionsRequestId;\n this.loadingSuggestions = true;\n try {\n const prompt = this.contextBuilder.buildSuggestionPrompt(context);\n const suggestions = await firstValueFrom(\n this.aiService.generateJson<string[]>(prompt)\n );\n \n if (this.suggestionsRequestId !== requestId) return;\n this.suggestions = suggestions || [];\n this.suggestionsCache.set(cacheKey, this.suggestions);\n } catch {\n if (this.suggestionsRequestId !== requestId) return;\n this.suggestions = [];\n } finally {\n if (this.suggestionsRequestId === requestId) {\n this.loadingSuggestions = false;\n this.cdr.detectChanges();\n }\n }\n }\n\n reloadSuggestions(): void {\n this.loadSuggestions(true);\n }\n\n applySuggestion(text: string): void {\n this.userPrompt = text;\n this.currentStep = 'prompt';\n }\n\n async generate(): Promise<void> {\n this.startLoadingUX();\n this.validationError = null;\n this.warnings = [];\n this.streamingText = '';\n\n try {\n const context = this.contextBuilder.buildPromptContext(\n this.data.fieldSchemas as any,\n this.selectedTargetType,\n this.data.propertySchema\n );\n const prompt = this.contextBuilder.buildRulePrompt(this.userPrompt, context);\n \n // Use streaming for better UX\n let fullText = '';\n await new Promise<void>((resolve, reject) => {\n this.aiService.generateContentStream(prompt).subscribe({\n next: (chunk) => {\n fullText += chunk;\n // Only show a preview of the stream to avoid UI jumpiness with large JSON\n // or show \"Thinking...\" messages if we had a thinking model.\n // For now, let's show the raw text building up, it looks \"techy\".\n // Truncate if too long to keep overlay clean? \n // Actually, let's just show the last few lines or a generic \"Building...\" \n // if it looks like code.\n // For this demo, let's stream it all.\n this.streamingText = fullText.length > 300 ? fullText.slice(-300) + '...' : fullText;\n this.cdr.detectChanges();\n },\n error: reject,\n complete: resolve\n });\n });\n\n // Parse the full accumulated text\n const cleaned = fullText.replace(/```json\\n?|\\n?```/g, '').trim();\n const response = JSON.parse(cleaned) as AiRuleResponse;\n\n const valContext: ValidationContext = {\n fieldSchemas: this.data.fieldSchemas,\n targetSchemas: this.data.targetSchemas,\n propertySchema: this.data.propertySchema\n };\n\n const validation = this.validator.validate(response, valContext);\n\n if (!validation.valid) {\n this.validationError = `A IA gerou uma regra inválida: ${validation.errors[0].message}`;\n this.stopLoadingUX();\n return;\n }\n\n // Use corrected response if available (autocorrect)\n this.generatedResponse = validation.correctedResponse || response;\n this.warnings = validation.warnings;\n \n // Advance to Review Step instead of closing\n this.currentStep = 'review';\n\n } catch (error: any) {\n console.error('Generation error:', error);\n this.validationError = `Erro ao comunicar com a IA: ${error.message || error}`;\n } finally {\n this.stopLoadingUX();\n }\n }\n\n private startLoadingUX(): void {\n this.isGenerating = true;\n this.currentLoadingMessage = this.loadingMessages[0];\n let i = 0;\n this.loadingInterval = setInterval(() => {\n i = (i + 1) % this.loadingMessages.length;\n this.currentLoadingMessage = this.loadingMessages[i];\n }, 2000);\n }\n\n private stopLoadingUX(): void {\n this.isGenerating = false;\n if (this.loadingInterval) {\n clearInterval(this.loadingInterval);\n }\n }\n\n backToPrompt(): void {\n this.currentStep = 'prompt';\n this.validationError = null;\n }\n\n confirm(): void {\n if (this.generatedResponse) {\n this.dialogRef.close(this.generatedResponse);\n }\n }\n\n // Helpers for Template\n getProps(obj: any): {key: string, value: any}[] {\n if (!obj) return [];\n return Object.entries(obj).map(([key, value]) => ({key, value}));\n }\n\n hasProps(obj: any): boolean {\n return obj && Object.keys(obj).length > 0;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { PraxisAiService } from './praxis-ai.service';\nimport { AiConfigAdapter } from '../adapters/ai-config.adapter';\nimport { Capability } from '../models/ai-models';\n\nexport interface ConfigAgentRequest {\n adapter: AiConfigAdapter;\n userIntent: string;\n}\n\nexport interface ConfigAgentResponse {\n patch: any;\n explanation: string;\n applied: boolean;\n mockMode: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AiConfigAgentService {\n constructor(private ai: PraxisAiService) {}\n\n isMockMode(): boolean {\n return this.ai.isMockMode();\n }\n\n /**\n * Legacy single-shot flow: builds a prompt with full config + capabilities.\n * Two-step flow is preferred (see TableAiAdapter.processUserIntent), but this remains as fallback.\n */\n async generateConfigPatch(request: ConfigAgentRequest): Promise<ConfigAgentResponse> {\n const { adapter, userIntent } = request;\n const capabilities = adapter.getCapabilities();\n const currentConfig = adapter.getCurrentConfig();\n const runtimeState = adapter.getRuntimeState ? adapter.getRuntimeState() : {};\n\n const prompt = this.buildPrompt(adapter.componentName, userIntent, currentConfig, capabilities, runtimeState);\n\n const response = await firstValueFrom(\n this.ai.generateJson<{ patch: any; explanation: string }>(prompt, undefined, undefined)\n );\n\n return {\n patch: (response as any)?.patch,\n explanation: (response as any)?.explanation,\n applied: false,\n mockMode: this.ai.isMockMode(),\n };\n }\n\n private buildPrompt(\n componentName: string,\n intent: string,\n config: any,\n capabilities: Capability[],\n runtime: any\n ): string {\n const capsList = capabilities\n .map((c) => `- ${c.path} (${c.valueKind}): ${c.description}`)\n .join('\\n');\n const configStr = JSON.stringify(config, null, 2);\n const runtimeStr = JSON.stringify(runtime, null, 2);\n\n return `\nYou are an expert configuration assistant for a UI component: ${componentName}.\n\nCONTEXT:\n1. **Capabilities** (What you can modify):\n${capsList}\n\n2. **Current Configuration** (JSON):\n${configStr}\n\n3. **Runtime State** (Read-only info):\n${runtimeStr}\n\nUSER INTENT:\n\"${intent}\"\n\nINSTRUCTIONS:\n- Analyze the user intent and the current configuration.\n- Generate a JSON PATCH that satisfies the intent.\n- The patch must be a partial object that can be deep-merged into the current configuration.\n- ONLY modify properties listed in the Capabilities.\n- If the intent is vague, make a best-effort reasonable guess based on standard UI patterns.\n- Provide a short explanation of what you changed.\n\nOUTPUT FORMAT (JSON):\n{\n \"patch\": { ... partial config object ... },\n \"explanation\": \"Brief summary of changes for the user.\"\n}\n `.trim();\n }\n}\n","import { Capability } from '../models/ai-models';\r\nimport { AiConfigAdapter, PatchResult, AiSuggestion } from './ai-config.adapter';\r\n\r\n/**\r\n * Base implementation for AI Adapters.\r\n * Provides common validation logic against the Capabilities Catalog.\r\n */\r\nexport abstract class BaseAiAdapter<TConfig = any> implements AiConfigAdapter<TConfig> {\r\n abstract componentName: string;\r\n\r\n abstract getCurrentConfig(): TConfig;\r\n abstract getCapabilities(): Capability[];\r\n abstract applyPatch(patch: Partial<TConfig>, intent?: string): Promise<PatchResult>;\r\n \r\n abstract createSnapshot(): any;\r\n abstract restoreSnapshot(snapshot: any): Promise<void>;\r\n\r\n // Optional methods that can be overridden\r\n getTaskPresets?(): Record<string, string[]> {\r\n return {};\r\n }\r\n\r\n async getSuggestions(_forceReload = false): Promise<AiSuggestion[]> {\r\n return [];\r\n }\r\n\r\n getSuggestionContext?(): Record<string, any> {\r\n return {};\r\n }\r\n\r\n getRuntimeState?(): Record<string, any> {\r\n return {};\r\n }\r\n\r\n /**\r\n * Helper to validate a patch against the capabilities catalog.\r\n * Removes keys that are not in the allowed paths.\r\n */\r\n protected validatePatchAgainstCapabilities(patch: any): any {\r\n // TODO: Implement deep validation\r\n return patch;\r\n }\r\n\r\n /**\r\n * Helper to check if a patch contains critical changes.\r\n */\r\n protected getCriticalWarnings(patch: any): string[] {\r\n const warnings: string[] = [];\r\n const capabilities = this.getCapabilities();\r\n \r\n // Simple check: flatten patch keys and check against critical paths\r\n // In a real implementation, we would traverse the patch object\r\n \r\n return warnings;\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\nimport { AiBackendApiService, AiHeaderContext } from './ai-backend-api.service';\n\nexport type AssistantMessageRole = 'user' | 'assistant' | 'system';\n\nexport interface AssistantHistoryMessage {\n id: string;\n role: AssistantMessageRole;\n text: string;\n createdAt: string;\n context?: {\n componentId?: string;\n componentType?: string;\n variantId?: string;\n suggestionId?: string;\n usedRag?: boolean;\n };\n}\n\nexport interface AssistantHistorySession {\n id: string;\n title: string;\n tenantId: string;\n env: string;\n userId: string;\n componentId?: string;\n componentType?: string;\n serverSessionId?: string | null;\n createdAt: string;\n updatedAt: string;\n messages: AssistantHistoryMessage[];\n summary?: string;\n}\n\nexport interface AssistantHistoryIndex {\n version: 1;\n tenantId: string;\n env: string;\n userId: string;\n sessions: Array<{\n id: string;\n title: string;\n updatedAt: string;\n componentId?: string;\n componentType?: string;\n }>;\n}\n\nexport interface AssistantHistoryContext extends AiHeaderContext {\n storageAvailable: boolean;\n}\n\nconst HISTORY_INDEX_PREFIX = 'praxis.ai.history.index';\nconst HISTORY_SESSION_PREFIX = 'praxis.ai.history.session';\nconst DEFAULT_SESSION_TITLE = 'Nova sessão';\nconst MAX_SESSIONS = 50;\nconst TTL_DAYS = 30;\nconst REDACTED_TOKEN = '[REDACTED]';\nconst REDACTED_JWT_TOKEN = '[JWT_REDACTED]';\n\n@Injectable({ providedIn: 'root' })\nexport class AssistantHistoryService {\n private readonly aiApi = inject(AiBackendApiService);\n private readonly storageAvailable = this.checkStorage();\n\n getContext(): AssistantHistoryContext {\n const context = this.aiApi.getHeaderContext();\n return { ...context, storageAvailable: this.storageAvailable };\n }\n\n listSessions(context: AssistantHistoryContext, limit = 10): AssistantHistoryIndex['sessions'] {\n if (!context.storageAvailable) return [];\n const index = this.sanitizeIndexTitles(context, this.ensureIndex(context));\n this.pruneOldSessions(context, index);\n const sorted = [...index.sessions].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n return sorted.slice(0, limit);\n }\n\n getSession(sessionId: string): AssistantHistorySession | null {\n const session = this.readJson<AssistantHistorySession>(this.sessionKey(sessionId));\n if (!session) return null;\n const sanitized = this.sanitizeSession(session);\n if (sanitized !== session) {\n this.writeJson(this.sessionKey(sessionId), sanitized);\n }\n return sanitized;\n }\n\n createSession(\n context: AssistantHistoryContext,\n componentId?: string | null,\n componentType?: string | null,\n title?: string,\n ): AssistantHistorySession | null {\n if (!context.storageAvailable) return null;\n const now = new Date().toISOString();\n const session: AssistantHistorySession = {\n id: this.generateId('session'),\n title: this.normalizeTitle(title),\n tenantId: context.tenantId,\n env: context.env,\n userId: context.userId,\n componentId: componentId || undefined,\n componentType: componentType || undefined,\n serverSessionId: null,\n createdAt: now,\n updatedAt: now,\n messages: [],\n };\n this.saveSession(context, session);\n return session;\n }\n\n addMessage(\n context: AssistantHistoryContext,\n sessionId: string,\n role: AssistantMessageRole,\n text: string,\n meta?: AssistantHistoryMessage['context'],\n ): AssistantHistorySession | null {\n if (!context.storageAvailable) return null;\n const session = this.getSession(sessionId);\n if (!session || !this.matchesContext(session, context)) return null;\n const cleaned = this.sanitizeForStorage(text);\n if (!cleaned) return session;\n const message: AssistantHistoryMessage = {\n id: this.generateId('msg'),\n role,\n text: cleaned,\n createdAt: new Date().toISOString(),\n context: meta,\n };\n session.messages = [...(session.messages || []), message];\n session.updatedAt = new Date().toISOString();\n if (role === 'user' && this.isDefaultTitle(session.title)) {\n session.title = this.normalizeTitle(cleaned);\n }\n if (role === 'assistant') {\n session.summary = this.normalizeSummary(cleaned);\n }\n this.saveSession(context, session);\n return session;\n }\n\n touchSession(context: AssistantHistoryContext, sessionId: string): void {\n if (!context.storageAvailable) return;\n const session = this.getSession(sessionId);\n if (!session || !this.matchesContext(session, context)) return;\n session.updatedAt = new Date().toISOString();\n this.saveSession(context, session);\n }\n\n updateServerSessionId(\n context: AssistantHistoryContext,\n sessionId: string,\n serverSessionId: string | null,\n ): AssistantHistorySession | null {\n if (!context.storageAvailable) return null;\n const session = this.getSession(sessionId);\n if (!session || !this.matchesContext(session, context)) return null;\n session.serverSessionId = serverSessionId;\n session.updatedAt = new Date().toISOString();\n this.saveSession(context, session);\n return session;\n }\n\n deleteSession(context: AssistantHistoryContext, sessionId: string): boolean {\n if (!context.storageAvailable) return false;\n const session = this.getSession(sessionId);\n if (session && !this.matchesContext(session, context)) return false;\n this.removeItem(this.sessionKey(sessionId));\n const index = this.ensureIndex(context);\n const nextSessions = index.sessions.filter((item) => item.id !== sessionId);\n if (nextSessions.length !== index.sessions.length) {\n index.sessions = nextSessions;\n this.writeJson(this.indexKey(context), index);\n }\n return true;\n }\n\n restoreSession(\n context: AssistantHistoryContext,\n session: AssistantHistorySession,\n touchUpdatedAt = true,\n ): AssistantHistorySession | null {\n if (!context.storageAvailable || !session) return null;\n if (!this.matchesContext(session, context)) return null;\n const restored: AssistantHistorySession = {\n ...session,\n updatedAt: touchUpdatedAt ? new Date().toISOString() : session.updatedAt,\n };\n this.saveSession(context, restored);\n return restored;\n }\n\n clearHistory(context: AssistantHistoryContext): void {\n if (!context.storageAvailable) return;\n const index = this.readJson<AssistantHistoryIndex>(this.indexKey(context));\n if (index?.sessions?.length) {\n for (const session of index.sessions) {\n this.removeItem(this.sessionKey(session.id));\n }\n }\n this.removeItem(this.indexKey(context));\n }\n\n private saveSession(context: AssistantHistoryContext, session: AssistantHistorySession): void {\n this.writeJson(this.sessionKey(session.id), session);\n const index = this.ensureIndex(context);\n const entry = {\n id: session.id,\n title: session.title,\n updatedAt: session.updatedAt,\n componentId: session.componentId,\n componentType: session.componentType,\n };\n const filtered = index.sessions.filter((item) => item.id !== session.id);\n index.sessions = [entry, ...filtered].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n if (index.sessions.length > MAX_SESSIONS) {\n index.sessions = index.sessions.slice(0, MAX_SESSIONS);\n }\n this.writeJson(this.indexKey(context), index);\n }\n\n private ensureIndex(context: AssistantHistoryContext): AssistantHistoryIndex {\n const key = this.indexKey(context);\n const existing = this.readJson<AssistantHistoryIndex>(key);\n if (existing && existing.version === 1 && this.matchesContext(existing, context)) {\n return existing;\n }\n const fresh: AssistantHistoryIndex = {\n version: 1,\n tenantId: context.tenantId,\n env: context.env,\n userId: context.userId,\n sessions: [],\n };\n this.writeJson(key, fresh);\n return fresh;\n }\n\n private pruneOldSessions(context: AssistantHistoryContext, index: AssistantHistoryIndex): void {\n if (!index.sessions.length) return;\n const cutoff = Date.now() - TTL_DAYS * 24 * 60 * 60 * 1000;\n const toKeep: typeof index.sessions = [];\n for (const session of index.sessions) {\n const ts = Date.parse(session.updatedAt);\n if (Number.isFinite(ts) && ts < cutoff) {\n this.removeItem(this.sessionKey(session.id));\n } else {\n toKeep.push(session);\n }\n }\n if (toKeep.length !== index.sessions.length) {\n index.sessions = toKeep;\n this.writeJson(this.indexKey(context), index);\n }\n }\n\n private matchesContext(\n value: { tenantId: string; env: string; userId: string },\n context: AssistantHistoryContext,\n ): boolean {\n return value.tenantId === context.tenantId\n && value.env === context.env\n && value.userId === context.userId;\n }\n\n private indexKey(context: AssistantHistoryContext): string {\n return `${HISTORY_INDEX_PREFIX}:${context.tenantId}:${context.env}:${context.userId}`;\n }\n\n private sessionKey(sessionId: string): string {\n return `${HISTORY_SESSION_PREFIX}:${sessionId}`;\n }\n\n private normalizeTitle(value?: string | null): string {\n const cleaned = this.sanitizeForStorage(value);\n if (!cleaned) return DEFAULT_SESSION_TITLE;\n return cleaned.length > 60 ? `${cleaned.slice(0, 57)}...` : cleaned;\n }\n\n private normalizeSummary(value?: string | null): string {\n const cleaned = this.sanitizeForStorage(value);\n if (!cleaned) return '';\n return cleaned.length > 200 ? `${cleaned.slice(0, 197)}...` : cleaned;\n }\n\n private sanitizeForStorage(value?: string | null): string {\n const raw = (value || '').trim();\n if (!raw) return '';\n let sanitized = raw;\n\n // Remove explicit secret assignments and query params before saving local history.\n sanitized = sanitized.replace(\n /((?:api[-_ ]?key|token|secret|senha|password)\\s*[:=]\\s*)(?:\"[^\"]*\"|'[^']*'|[^\\s,;]+)/gi,\n `$1${REDACTED_TOKEN}`,\n );\n sanitized = sanitized.replace(\n /([?&](?:api[-_]?key|token|secret|password|senha)=)[^&\\s]+/gi,\n `$1${REDACTED_TOKEN}`,\n );\n sanitized = sanitized.replace(/\\bBearer\\s+[A-Za-z0-9\\-._~+/]+=*/gi, `Bearer ${REDACTED_TOKEN}`);\n sanitized = sanitized.replace(/\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/g, REDACTED_JWT_TOKEN);\n sanitized = sanitized.replace(/\\bsk-[A-Za-z0-9]{20,}\\b/g, REDACTED_TOKEN);\n sanitized = sanitized.replace(\n /\\b(token|secret|senha|password)\\s+([A-Za-z0-9\\-._~+/=]{16,})\\b/gi,\n `$1 ${REDACTED_TOKEN}`,\n );\n\n return sanitized.replace(/\\s+/g, ' ').trim();\n }\n\n private sanitizeSession(session: AssistantHistorySession): AssistantHistorySession {\n let changed = false;\n const messages = (session.messages || []).map((msg) => {\n const text = this.sanitizeForStorage(msg.text);\n if (text === msg.text) return msg;\n changed = true;\n return { ...msg, text };\n });\n\n const title = this.normalizeTitle(session.title);\n const summary = this.normalizeSummary(session.summary);\n if (title !== session.title || summary !== (session.summary || '')) {\n changed = true;\n }\n if (!changed) return session;\n return {\n ...session,\n title,\n summary: summary || undefined,\n messages,\n };\n }\n\n private sanitizeIndexTitles(\n context: AssistantHistoryContext,\n index: AssistantHistoryIndex,\n ): AssistantHistoryIndex {\n let changed = false;\n const sessions = index.sessions.map((item) => {\n const title = this.normalizeTitle(item.title);\n if (title === item.title) return item;\n changed = true;\n return { ...item, title };\n });\n if (!changed) return index;\n const next: AssistantHistoryIndex = { ...index, sessions };\n this.writeJson(this.indexKey(context), next);\n return next;\n }\n\n private isDefaultTitle(value?: string | null): boolean {\n const normalized = (value || '').trim().toLowerCase();\n return !normalized || normalized === DEFAULT_SESSION_TITLE.toLowerCase();\n }\n\n private readJson<T>(key: string): T | null {\n if (!this.storageAvailable) return null;\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n }\n\n private writeJson(key: string, value: unknown): void {\n if (!this.storageAvailable) return;\n try {\n localStorage.setItem(key, JSON.stringify(value));\n } catch {\n // ignore quota errors\n }\n }\n\n private removeItem(key: string): void {\n if (!this.storageAvailable) return;\n try {\n localStorage.removeItem(key);\n } catch {\n // ignore\n }\n }\n\n private checkStorage(): boolean {\n if (typeof localStorage === 'undefined') return false;\n try {\n const key = '__praxis_ai_history_probe__';\n localStorage.setItem(key, '1');\n localStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n }\n\n private generateId(prefix: string): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `${prefix}-${crypto.randomUUID()}`;\n }\n return `${prefix}-${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n","import {\n Component,\n Input,\n ViewChild,\n ElementRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n OnDestroy,\n Inject,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { FormsModule } from '@angular/forms';\nimport { OverlayModule, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDialog, MatDialogModule, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { Subscription, firstValueFrom } from 'rxjs';\n\nimport { AiConfigAdapter, AiSuggestion } from '../../core/adapters/ai-config.adapter';\nimport {\n AiBackendApiService,\n AiPatchDiff,\n AiContextDTO,\n AiOrchestratorRequest,\n AiOrchestratorResponse,\n AiSuggestionsRequest,\n AiPatchStreamConnection,\n AiPatchStreamConnectionError,\n AiPatchStreamEnvelope,\n} from '../../core/services/ai-backend-api.service';\nimport { AiJsonObject, AiJsonValue } from '../../core/contracts/ai-contract.generated';\nimport {\n AssistantHistoryContext,\n AssistantHistoryMessage,\n AssistantHistoryService,\n AssistantHistorySession,\n} from '../../core/services/assistant-history.service';\nimport { GlobalAiConfig } from '@praxisui/core';\nimport { AssistantState } from './ai-assistant.types';\n\ninterface ClarificationOption {\n label: string;\n value: string;\n example?: string;\n}\n\ntype ClarificationContextHints = AiJsonObject;\n\ninterface ClarificationRichOption extends ClarificationOption {\n contextHints?: ClarificationContextHints;\n}\n\ninterface PatchPathEdit {\n path: string;\n valueText: string;\n error?: string;\n}\n\ntype JsonMap = Record<string, unknown>;\n\ntype SuggestionPolicy = {\n mode: 'force';\n fallback: Array<'availableFeatures' | 'missingCapabilities'>;\n reason?: string;\n};\n\ntype RiskPolicy = 'strict' | 'standard';\ntype ReviewRiskLevel = 'baixo' | 'médio' | 'alto';\ntype StreamTerminalState = 'idle' | 'in_progress' | 'completed' | 'failed' | 'cancelled' | 'expired';\ntype StreamTimelineMode = 'stream' | 'snapshot';\ntype StreamStepState = 'pending' | 'active' | 'done';\n\ninterface AssistantConfirmDialogData {\n title: string;\n message: string;\n confirmLabel: string;\n cancelLabel: string;\n confirmColor?: 'primary' | 'warn';\n}\n\nconst AI_SESSION_STORAGE_PREFIX = 'praxis.ai.session';\n\n@Component({\n selector: 'praxis-ai-assistant-confirm-dialog',\n standalone: true,\n imports: [CommonModule, MatButtonModule, MatDialogModule],\n template: `\n <h2 mat-dialog-title>{{ data.title }}</h2>\n <mat-dialog-content>{{ data.message }}</mat-dialog-content>\n <mat-dialog-actions align=\"end\">\n <button mat-button type=\"button\" [mat-dialog-close]=\"false\">{{ data.cancelLabel }}</button>\n <button\n mat-flat-button\n type=\"button\"\n [color]=\"data.confirmColor || 'primary'\"\n [mat-dialog-close]=\"true\"\n >\n {{ data.confirmLabel }}\n </button>\n </mat-dialog-actions>\n `,\n})\nclass PraxisAiAssistantConfirmDialogComponent {\n constructor(@Inject(MAT_DIALOG_DATA) readonly data: AssistantConfirmDialogData) {}\n}\n\n@Component({\n selector: 'praxis-ai-assistant',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n OverlayModule,\n A11yModule,\n MatDialogModule,\n MatButtonModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n MatChipsModule,\n MatMenuModule,\n ],\n templateUrl: './ai-assistant.component.html',\n styleUrls: ['./ai-assistant.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PraxisAiAssistantComponent implements OnDestroy {\n @Input({ required: true }) adapter!: AiConfigAdapter;\n @Input() riskPolicy: RiskPolicy | null = null;\n @Input() allowManualPatchEdit = false;\n\n @ViewChild(CdkOverlayOrigin) overlayOrigin!: CdkOverlayOrigin;\n @ViewChild('triggerBtn', { read: ElementRef }) triggerButton?: ElementRef<HTMLButtonElement>;\n @ViewChild('inputEl') inputElement!: ElementRef<HTMLInputElement>;\n\n state: AssistantState | 'clarification' = 'idle';\n activeTab: 'task' | 'chat' | 'suggestions' = 'suggestions';\n private readonly tabOrder: Array<'task' | 'chat' | 'suggestions'> = ['task', 'chat', 'suggestions'];\n readonly flowSteps = [\n { step: 1, label: 'Pedido' },\n { step: 2, label: 'Proposta' },\n { step: 3, label: 'Impacto' },\n { step: 4, label: 'Aplicação' },\n ] as const;\n private taskFlowActive = false;\n processingInfoVisible = false;\n isOpen = false;\n loadingSuggestions = false;\n\n userPrompt = '';\n aiExplanation = '';\n pendingPatch: Record<string, unknown> | null = null;\n pendingDiff: AiPatchDiff[] = [];\n patchEditorText = '';\n patchEditorError = '';\n patchEditorExpanded = false;\n patchPathEditorExpanded = false;\n patchPathEdits: PatchPathEdit[] = [];\n patchPathEditorError = '';\n applyWarnings: string[] = [];\n lastApplyAt: string | null = null;\n lastSnapshot: unknown = null;\n errorMsg = '';\n warnings: string[] = [];\n private backendRiskLevel: ReviewRiskLevel | null = null;\n private backendRequiresConfirmation: boolean | null = null;\n private effectiveRiskPolicy: RiskPolicy = 'strict';\n suggestionsWarnings: string[] = [];\n mockMode = false;\n\n clarificationMessage = '';\n clarificationOptions: ClarificationRichOption[] = [];\n clarificationQuestions: string[] = [];\n clarificationAnswers: string[] = [];\n clarificationFreeText = '';\n showManualInput = false;\n private clarificationBasePrompt: string | null = null;\n private skipClarificationAppend = false;\n clarificationResponseType: 'text' | 'choice' | 'confirm' | 'mixed' | 'context' = 'text';\n clarificationSelectionMode: 'single' | 'multiple' = 'single';\n clarificationAllowCustom = true;\n clarificationPresentation: 'buttons' | 'list' | 'chips' = 'list';\n selectedClarificationOptions: ClarificationRichOption[] = [];\n\n richSuggestions: AiSuggestion[] = [];\n private dismissedSuggestionIds = new Set<string>();\n\n private readonly aiApi = inject(AiBackendApiService);\n private readonly historyService = inject(AssistantHistoryService);\n private readonly dialog = inject(MatDialog);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly suggestionsCache = new Map<string, AiSuggestion[]>();\n private readonly templateVariantsCache = new Map<string, Set<string>>();\n private activeVariantId: string | null = null;\n private promptFromSuggestion = false;\n private activeSuggestion: AiSuggestion | null = null;\n private activeContextHints: ClarificationContextHints | null = null;\n private activeResourcePath: string | null = null;\n private activeServerSessionId: string | null = null;\n private activeStreamId: string | null = null;\n private activeStreamAccessToken: string | null = null;\n private activeStreamConnection: AiPatchStreamConnection | null = null;\n private streamSeenEventIds = new Set<string>();\n private streamLastSeqByStream = new Map<string, number>();\n private streamLastEventIdByStream = new Map<string, string>();\n private streamLastSeq = 0;\n private streamLastEventId: string | null = null;\n private streamTerminalState: StreamTerminalState = 'idle';\n private streamTimelineMode: StreamTimelineMode = 'snapshot';\n private streamFallbackActive = false;\n private streamTimelineStepState: Record<1 | 2 | 3, StreamStepState> = {\n 1: 'pending',\n 2: 'pending',\n 3: 'pending',\n };\n private streamTimelineStepDetail: Partial<Record<1 | 2 | 3, string>> = {};\n private currentComponentId: string | null = null;\n private currentComponentType: string | null = null;\n private forceNewSession = false;\n private readonly sessionStorageAvailable = this.checkSessionStorage();\n\n historyContext: AssistantHistoryContext | null = null;\n historyWarnings: string[] = [];\n historySessions: Array<{\n id: string;\n title: string;\n updatedAt: string;\n componentId?: string;\n componentType?: string;\n }> = [];\n activeHistorySession: AssistantHistorySession | null = null;\n activeHistoryMessages: AssistantHistoryMessage[] = [];\n activeHistoryTotalMessages = 0;\n historyExpanded = true;\n historyUndoDeleteSession: AssistantHistorySession | null = null;\n private historyUndoTimerId: ReturnType<typeof setTimeout> | null = null;\n highlightClarificationDetails = false;\n highlightReviewDetails = false;\n private thoughtDetailsHighlightTimerId: ReturnType<typeof setTimeout> | null = null;\n showFullDiff = false;\n private processingStartedAt: number | null = null;\n private lastProcessingDurationMs: number | null = null;\n private readonly westernTwoDigitFormatter = new Intl.NumberFormat('en-US-u-nu-latn', {\n minimumIntegerDigits: 2,\n useGrouping: false,\n });\n\n private readonly maxHistoryMessages = 6;\n\n ngOnDestroy(): void {\n if (this.state === 'processing') {\n this.requestStreamCancel();\n }\n this.closeActiveStreamConnection();\n this.clearHistoryUndoTimer();\n this.clearThoughtDetailsHighlightTimer();\n }\n\n async open(): Promise<void> {\n this.setState('listening');\n this.isOpen = true;\n this.initHistory();\n this.mockMode = await this.resolveMockMode();\n void this.loadTemplateVariants();\n await this.loadSuggestions();\n setTimeout(() => {\n if (!this.isTaskMode()) {\n this.inputElement?.nativeElement?.focus();\n }\n }, 50);\n }\n\n close(): void {\n const wasOpen = this.isOpen;\n if (this.state === 'processing') {\n this.requestStreamCancel();\n }\n this.closeActiveStreamConnection();\n this.isOpen = false;\n this.setState('idle');\n this.userPrompt = '';\n this.errorMsg = '';\n this.warnings = [];\n this.processingInfoVisible = false;\n this.suggestionsWarnings = [];\n this.pendingPatch = null;\n this.pendingDiff = [];\n this.patchEditorText = '';\n this.patchEditorError = '';\n this.patchEditorExpanded = false;\n this.patchPathEditorExpanded = false;\n this.patchPathEdits = [];\n this.patchPathEditorError = '';\n this.applyWarnings = [];\n this.lastApplyAt = null;\n this.backendRiskLevel = null;\n this.backendRequiresConfirmation = null;\n this.clarificationOptions = [];\n this.clarificationMessage = '';\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n this.clarificationBasePrompt = null;\n this.activeVariantId = null;\n this.activeSuggestion = null;\n this.activeContextHints = null;\n this.activeResourcePath = null;\n this.skipClarificationAppend = false;\n this.clarificationResponseType = 'text';\n this.clarificationSelectionMode = 'single';\n this.clarificationAllowCustom = true;\n this.clarificationPresentation = 'list';\n this.selectedClarificationOptions = [];\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.dismissedSuggestionIds = new Set<string>();\n this.taskFlowActive = false;\n this.activeTab = 'suggestions';\n this.highlightClarificationDetails = false;\n this.highlightReviewDetails = false;\n this.clearThoughtDetailsHighlightTimer();\n this.processingStartedAt = null;\n this.lastProcessingDurationMs = null;\n this.resetStreamTracking();\n this.currentComponentId = null;\n this.currentComponentType = null;\n this.clearPendingHistoryUndo();\n if (this.historyContext && this.activeHistorySession) {\n this.historyService.touchSession(this.historyContext, this.activeHistorySession.id);\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n }\n if (wasOpen) {\n this.restoreFocusToTrigger();\n }\n }\n\n async submitPrompt(overridePrompt?: string): Promise<void> {\n const prompt = overridePrompt || this.userPrompt;\n const hasClarificationQuestions = this.state === 'clarification' && this.clarificationQuestions.length > 0;\n if ((!prompt.trim() && !hasClarificationQuestions) || this.state === 'processing') return;\n\n if (this.state !== 'clarification') {\n const promptResourcePath = this.extractResourcePath(prompt);\n if (promptResourcePath) {\n this.setResourcePathHint(promptResourcePath);\n } else {\n this.clearResourcePathHint();\n }\n }\n\n if (this.state === 'clarification') {\n const base = (this.clarificationBasePrompt || '').trim();\n const answer = prompt.trim();\n const resourcePath = this.extractResourcePath(answer) || this.matchClarificationOptionPath(answer);\n if (resourcePath) {\n this.setResourcePathHint(resourcePath);\n this.userPrompt = base || answer;\n this.skipClarificationAppend = false;\n } else if (this.skipClarificationAppend) {\n this.userPrompt = base || answer;\n this.skipClarificationAppend = false;\n } else if (this.clarificationQuestions.length) {\n const responses = this.buildClarificationAnswers(answer);\n this.userPrompt = base\n ? `${base}\\nRespostas: ${responses}`\n : `Respostas: ${responses}`;\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n } else {\n this.userPrompt = base ? `${base} (${answer})` : answer;\n }\n this.clarificationBasePrompt = null;\n } else if (!this.promptFromSuggestion) {\n this.activeVariantId = null;\n }\n if (this.state !== 'clarification' && overridePrompt !== undefined) {\n this.userPrompt = prompt.trim();\n }\n\n this.setState('processing');\n this.errorMsg = '';\n this.warnings = [];\n this.pendingPatch = null;\n this.pendingDiff = [];\n this.patchEditorText = '';\n this.patchEditorError = '';\n this.patchEditorExpanded = false;\n this.patchPathEditorExpanded = false;\n this.patchPathEdits = [];\n this.patchPathEditorError = '';\n this.applyWarnings = [];\n this.lastApplyAt = null;\n this.backendRiskLevel = null;\n this.backendRequiresConfirmation = null;\n this.streamTerminalState = 'in_progress';\n this.processingInfoVisible = false;\n this.cdr.markForCheck();\n\n let keepContextHints = false;\n\n try {\n const componentId = this.resolveComponentId();\n const componentType = this.resolveComponentType();\n this.currentComponentId = componentId || null;\n this.currentComponentType = componentType || null;\n const configRoot = this.resolveConfigRoot(this.adapter.getCurrentConfig?.());\n const dataProfile = this.adapter.getDataProfile ? this.adapter.getDataProfile() : null;\n const schemaFields = this.adapter.getSchemaFields ? this.adapter.getSchemaFields() : undefined;\n const runtimeState = this.adapter.getRuntimeState ? this.adapter.getRuntimeState() : undefined;\n const suggestion = this.activeSuggestion;\n const mergedContextHints = this.mergeContextHints(suggestion?.contextHints, this.activeContextHints);\n\n if (!componentId || !componentType) {\n this.errorMsg = 'Componente sem identificacao para usar o backend de IA.';\n this.setState('error');\n return;\n }\n\n this.appendHistoryMessage('user', this.userPrompt, {\n componentId,\n componentType,\n variantId: this.activeVariantId || undefined,\n suggestionId: this.activeSuggestion?.id,\n });\n\n const clientTurnId = this.buildClientTurnId();\n const sessionId = this.forceNewSession ? undefined : this.activeServerSessionId || undefined;\n const mode: 'new' | 'continue' | undefined = this.forceNewSession ? 'new' : undefined;\n const uiContextRef = this.buildUiContextRef(componentId, componentType);\n const currentStateDigest = this.buildCurrentStateDigest(runtimeState);\n const inferredAiMode = this.inferAiMode(runtimeState, configRoot);\n const normalizedDataProfile = dataProfile ? this.toAiJsonObject(dataProfile) : undefined;\n const normalizedSchemaFields = schemaFields && schemaFields.length > 0\n ? schemaFields.map((field) => this.toAiJsonObject(field))\n : undefined;\n const normalizedRuntimeState = runtimeState !== undefined ? this.toAiJsonObject(runtimeState) : undefined;\n const normalizedSuggestedPatch = suggestion?.patch ? this.toAiJsonObject(suggestion.patch) : undefined;\n const normalizedContextHints = this.toClarificationContextHints(mergedContextHints);\n const patchRequest: AiOrchestratorRequest = {\n componentId,\n componentType,\n userPrompt: this.userPrompt,\n sessionId,\n mode,\n clientTurnId,\n messages: [{ role: 'user' as const, content: this.userPrompt }],\n uiContextRef,\n currentStateDigest,\n currentState: this.toAiJsonObject(configRoot),\n aiMode: inferredAiMode,\n ...(this.activeResourcePath ? { resourcePath: this.activeResourcePath } : {}),\n ...(normalizedDataProfile ? { dataProfile: normalizedDataProfile } : {}),\n ...(normalizedSchemaFields && normalizedSchemaFields.length > 0 ? { schemaFields: normalizedSchemaFields } : {}),\n ...(normalizedRuntimeState ? { runtimeState: normalizedRuntimeState } : {}),\n ...(normalizedSuggestedPatch ? { suggestedPatch: normalizedSuggestedPatch } : {}),\n ...(normalizedContextHints ? { contextHints: normalizedContextHints } : {}),\n variantId: this.activeVariantId || undefined,\n };\n const result = await this.getPatchViaStreamWithFallback(patchRequest);\n\n if (result?.sessionId) {\n this.activeServerSessionId = result.sessionId;\n this.forceNewSession = false;\n this.persistServerSessionId(result.sessionId);\n if (this.historyContext && this.activeHistorySession) {\n this.historyService.updateServerSessionId(\n this.historyContext,\n this.activeHistorySession.id,\n result.sessionId,\n );\n }\n }\n\n keepContextHints = result?.type === 'clarification';\n const handled = this.handlePatchResponse(result, configRoot, componentId, componentType);\n if (handled) {\n this.appendHistoryAssistantResponse(result, componentId, componentType);\n return;\n }\n\n const isEmptyPatch =\n !this.pendingPatch || (typeof this.pendingPatch === 'object' && Object.keys(this.pendingPatch).length === 0);\n if (isEmptyPatch) {\n this.aiExplanation = this.aiExplanation || 'Nenhuma alteração necessária.';\n this.setState('success');\n setTimeout(() => {\n if (this.state === 'success') this.close();\n }, 1500);\n } else {\n this.setState('review');\n }\n this.appendHistoryAssistantResponse(result, componentId, componentType);\n } catch (err) {\n this.streamTerminalState = 'failed';\n this.errorMsg = this.normalizeError(err);\n this.setState('error');\n this.appendHistoryMessage('assistant', this.errorMsg, {\n componentId: this.resolveComponentId() || undefined,\n componentType: this.resolveComponentType() || undefined,\n });\n } finally {\n this.promptFromSuggestion = false;\n if (!keepContextHints) {\n this.activeSuggestion = null;\n this.activeContextHints = null;\n }\n const stillInProgress = this.streamTerminalState === 'in_progress';\n if (\n this.processingInfoVisible\n && !stillInProgress\n && this.state !== 'success'\n && this.state !== 'review'\n && this.state !== 'error'\n ) {\n this.setState('error');\n this.errorMsg = this.errorMsg || 'Falha desconhecida ao gerar o patch.';\n this.processingInfoVisible = false;\n }\n this.cdr.markForCheck();\n }\n }\n\n isTaskMode(): boolean {\n return this.state === 'processing'\n || this.state === 'clarification'\n || this.state === 'review'\n || this.taskFlowActive\n || this.hasPendingClarification();\n }\n\n hasPendingClarification(): boolean {\n if (this.state !== 'clarification') return false;\n return this.clarificationOptions.length > 0 || this.clarificationQuestions.length > 0;\n }\n\n isActiveTab(tab: 'task' | 'chat' | 'suggestions'): boolean {\n if (this.isTaskMode() && !this.activeTab) return tab === 'task';\n return this.activeTab === tab;\n }\n\n setActiveTab(tab: 'task' | 'chat' | 'suggestions'): void {\n if (tab === 'task' && !this.isTaskMode()) return;\n this.activeTab = tab;\n }\n\n onTabsKeydown(event: KeyboardEvent): void {\n const key = event.key;\n if (key !== 'ArrowRight' && key !== 'ArrowLeft' && key !== 'Home' && key !== 'End') {\n return;\n }\n const enabledTabs = this.tabOrder.filter((tab) => tab !== 'task' || this.isTaskMode());\n if (!enabledTabs.length) return;\n\n event.preventDefault();\n\n if (key === 'Home') {\n const first = enabledTabs[0];\n this.setActiveTab(first);\n this.focusTab(first);\n return;\n }\n if (key === 'End') {\n const last = enabledTabs[enabledTabs.length - 1];\n this.setActiveTab(last);\n this.focusTab(last);\n return;\n }\n\n const currentIndex = Math.max(enabledTabs.indexOf(this.activeTab), 0);\n const direction = key === 'ArrowRight' ? 1 : -1;\n const nextIndex = (currentIndex + direction + enabledTabs.length) % enabledTabs.length;\n const nextTab = enabledTabs[nextIndex];\n this.setActiveTab(nextTab);\n this.focusTab(nextTab);\n }\n\n private focusTab(tab: 'task' | 'chat' | 'suggestions'): void {\n if (typeof document === 'undefined') return;\n const id = tab === 'task'\n ? 'assistant-tab-task'\n : tab === 'chat'\n ? 'assistant-tab-chat'\n : 'assistant-tab-suggestions';\n setTimeout(() => {\n const element = document.getElementById(id);\n if (element instanceof HTMLElement) {\n element.focus();\n }\n }, 0);\n }\n\n getTaskTitle(): string {\n if (this.isDatasetSelection()) return 'Selecionar fonte de dados';\n if (this.state === 'review') return 'Revisar alterações';\n return 'Faltam informações para continuar';\n }\n\n getTaskSubtitle(): string {\n if (this.isDatasetSelection()) {\n return 'Escolha o recurso base para montar a lista e o detalhe desta página.';\n }\n if (this.state === 'review') {\n return 'Confira o resumo e o impacto antes de aplicar as alterações.';\n }\n return this.clarificationMessage || 'Informe os dados solicitados para concluir a proposta.';\n }\n\n getTaskPrimaryLabel(): string {\n if (this.state === 'review') return 'Aplicar alterações';\n if (this.state === 'clarification' && this.clarificationOptions.length === 1) return 'Continuar';\n return this.clarificationSelectionMode === 'multiple' ? 'Confirmar seleção' : 'Selecionar';\n }\n\n getTaskSecondaryLabel(): string {\n if (this.state === 'review') return 'Editar pedido';\n return 'Cancelar';\n }\n\n getTaskCancelLabel(): string {\n if (this.state === 'processing') return 'Interromper';\n return 'Cancelar';\n }\n\n isTaskPrimaryDisabled(): boolean {\n if (this.state === 'processing' || this.state === 'applying') return true;\n if (this.state === 'review') return !this.pendingPatch;\n if (this.state !== 'clarification') return false;\n return !this.hasClarificationSelection()\n && !(this.clarificationAllowCustom && this.clarificationFreeText.trim());\n }\n\n isBusyState(): boolean {\n return this.state === 'processing' || this.state === 'applying';\n }\n\n getSystemStatusLabel(): string {\n if (this.state === 'processing') return 'Analisando solicitação';\n if (this.state === 'clarification') return 'Aguardando informações';\n if (this.state === 'review') return 'Proposta pronta para revisão';\n if (this.state === 'applying') return 'Aplicando alterações';\n if (this.state === 'success') return 'Alterações aplicadas';\n if (this.state === 'error') return 'Falha ao processar solicitação';\n if (this.mockMode) return 'Modo demonstração ativo';\n return 'IA conectada e pronta';\n }\n\n getSystemStatusDetail(): string {\n if (this.state === 'processing') {\n return this.withSnapshotFallbackDetail(\n this.aiExplanation || 'Preparando proposta com validação de impacto...',\n );\n }\n if (this.state === 'clarification') {\n return this.withSnapshotFallbackDetail(\n this.clarificationMessage || 'Informe os dados pendentes para continuar.',\n );\n }\n if (this.state === 'review') {\n return this.withSnapshotFallbackDetail('Revise o resumo e a prévia de mudanças antes de aplicar.');\n }\n if (this.state === 'applying') {\n return this.withSnapshotFallbackDetail('Aplicando alterações no componente atual.');\n }\n if (this.state === 'success') {\n return this.withSnapshotFallbackDetail('Alterações aplicadas. Você pode desfazer se necessário.');\n }\n if (this.state === 'error') {\n return this.withSnapshotFallbackDetail(\n this.errorMsg || 'Não foi possível concluir. Ajuste o pedido e tente novamente.',\n );\n }\n if (this.activeTab === 'suggestions') {\n return 'Selecione uma sugestão ou descreva uma alteração no campo inferior.';\n }\n if (this.activeTab === 'chat') {\n return 'Consulte o histórico ou inicie uma nova conversa.';\n }\n return this.mockMode\n ? 'As respostas são simuladas para validação da interface.'\n : 'Pronto para receber uma solicitação.';\n }\n\n shouldShowSystemStatusDetail(): boolean {\n return this.state === 'processing'\n || this.state === 'clarification'\n || this.state === 'review'\n || this.state === 'applying'\n || this.state === 'error';\n }\n\n getSystemStatusAriaLive(): 'polite' | 'assertive' {\n return this.state === 'error' ? 'assertive' : 'polite';\n }\n\n shouldShowSnapshotFallbackBadge(): boolean {\n if (!this.streamFallbackActive) return false;\n return this.state === 'processing'\n || this.state === 'clarification'\n || this.state === 'review'\n || this.state === 'applying'\n || this.state === 'success'\n || this.state === 'error';\n }\n\n getRiskPolicyLabel(): string {\n return this.getEffectiveRiskPolicy() === 'strict'\n ? 'Política: Estrita'\n : 'Política: Padrão';\n }\n\n getRiskPolicyTooltip(): string {\n return this.getEffectiveRiskPolicy() === 'strict'\n ? 'Política estrita: risco médio/alto sempre exige confirmação antes de aplicar.'\n : 'Política padrão: segue a sinalização de confirmação retornada pelo backend.';\n }\n\n isStrictRiskPolicy(): boolean {\n return this.getEffectiveRiskPolicy() === 'strict';\n }\n\n getFlowStepState(step: number): 'done' | 'active' | 'pending' {\n if (this.shouldUseStreamTimeline() && (step === 1 || step === 2 || step === 3)) {\n return this.streamTimelineStepState[step];\n }\n const currentStep = this.getCurrentFlowStep();\n if (step < currentStep) return 'done';\n if (step === currentStep) return 'active';\n return 'pending';\n }\n\n getFlowStepDetail(step: number): string {\n if (this.shouldUseStreamTimeline() && (step === 1 || step === 2 || step === 3)) {\n const streamDetail = this.streamTimelineStepDetail[step]?.trim();\n if (streamDetail) {\n return streamDetail;\n }\n }\n const state = this.getFlowStepState(step);\n if (step === 1) {\n if (state === 'done') return 'Pedido consolidado';\n return this.state === 'processing' ? 'Analisando solicitação' : 'Aguardando pedido';\n }\n if (step === 2) {\n if (state === 'done') return 'Proposta estruturada';\n if (state === 'active') return 'Selecionar dados faltantes';\n return 'Aguardando dados';\n }\n if (step === 3) {\n if (state === 'done') return 'Impacto validado';\n if (state === 'active') return 'Revisar resumo e diff';\n return 'Prévia pendente';\n }\n if (state === 'done') return this.state === 'success' ? 'Aplicação concluída' : 'Fluxo finalizado';\n if (state === 'active') {\n if (this.state === 'applying') return 'Aplicando alterações';\n if (this.state === 'error') return 'Ajuste necessário';\n if (this.state === 'success') return 'Alterações aplicadas';\n }\n return 'Aguardando confirmação';\n }\n\n shouldShowTaskFlow(): boolean {\n return this.isTaskMode();\n }\n\n shouldShowThoughtCard(): boolean {\n if (!this.isTaskMode()) return false;\n if (this.activeTab === 'chat') return false;\n return this.state === 'processing'\n || this.state === 'clarification'\n || this.state === 'review'\n || this.state === 'applying'\n || this.state === 'success'\n || this.state === 'error';\n }\n\n getThoughtTimingLabel(): string {\n const seconds = this.getThoughtDurationSeconds();\n if (seconds === null) return 'Pensamento concluído';\n const formatted = this.formatDurationClock(seconds);\n if (this.state === 'processing') return `Pensando por ${formatted}`;\n return `Pensou por ${formatted}`;\n }\n\n getThoughtSummary(): string {\n const explanation = (this.aiExplanation || '').trim();\n if (explanation) return explanation;\n if (this.state === 'clarification') {\n return this.clarificationMessage || 'Preciso de mais detalhes para continuar.';\n }\n if (this.state === 'review') {\n return 'Proposta pronta. Revise resumo e impacto antes de aplicar.';\n }\n if (this.state === 'error') {\n return this.errorMsg || 'Falha ao processar solicitação.';\n }\n if (this.state === 'success') {\n return 'Alterações aplicadas com sucesso.';\n }\n return this.getSystemStatusDetail();\n }\n\n getThoughtPlanTitle(): string {\n const raw = (\n this.activeSuggestion?.label\n || this.clarificationBasePrompt\n || this.userPrompt\n || this.getTaskTitle()\n || 'Refinar configuração'\n ).trim();\n if (!raw) return 'Refinar configuração';\n if (raw.length <= 78) return raw;\n return `${raw.slice(0, 75)}...`;\n }\n\n getThoughtChecklist(): string[] {\n if (this.state === 'review') {\n return [\n 'Conferir resumo e escopo',\n 'Validar diff antes/depois',\n 'Aplicar conforme política de risco',\n ];\n }\n return [];\n }\n\n openThoughtDetails(): void {\n if (this.isTaskMode()) {\n this.setActiveTab('task');\n if (this.state === 'review' && this.showFullDiff) {\n this.showFullDiff = false;\n }\n if (this.state === 'review') {\n this.flashThoughtDetails('review');\n this.focusTaskPanelTarget('.review-summary');\n } else if (this.state === 'clarification') {\n this.flashThoughtDetails('clarification');\n this.focusTaskPanelTarget('.clarification-options-block, .clarification-questions, .task-header');\n } else {\n this.focusTaskPanelTarget('.apply-details, .warnings-area, .task-header');\n }\n return;\n }\n this.setActiveTab('suggestions');\n }\n\n openThoughtPreview(): void {\n if (!this.shouldShowThoughtPreviewAction()) {\n return;\n }\n if (!this.isTaskMode()) {\n this.setActiveTab('suggestions');\n return;\n }\n this.setActiveTab('task');\n if (this.state === 'review' && this.pendingDiff.length && !this.showFullDiff) {\n this.showFullDiff = true;\n }\n }\n\n getThoughtDetailsTooltip(): string {\n if (this.shouldUseStreamTimeline() && this.streamTerminalState === 'in_progress') {\n return 'Mostra o progresso real recebido via eventos do stream.';\n }\n if (this.state === 'review') {\n return 'Foca no resumo consolidado e no escopo da proposta.';\n }\n if (this.state === 'clarification') {\n return 'Destaca decisões sugeridas e contexto pendente para avançar.';\n }\n if (this.state === 'error' || this.state === 'success' || this.state === 'applying') {\n return 'Leva para os detalhes de aplicação e avisos da execução.';\n }\n return 'Mostra o contexto da proposta e dados pendentes.';\n }\n\n getThoughtDetailsLabel(): string {\n if (this.shouldUseStreamTimeline() && this.streamTerminalState === 'in_progress') return 'Progresso';\n if (this.state === 'review') return 'Resumo';\n if (this.state === 'clarification') return 'Decisões';\n if (this.state === 'applying') return 'Execução';\n if (this.state === 'success') return 'Aplicação';\n if (this.state === 'error') return 'Diagnóstico';\n return 'Detalhes';\n }\n\n getThoughtPreviewTooltip(): string {\n return 'Abre a prévia técnica com diff antes/depois.';\n }\n\n getThoughtActionHint(): string {\n if (this.shouldUseStreamTimeline() && this.streamTerminalState === 'in_progress') {\n return 'Progresso exibe as etapas reais emitidas pelo backend durante o stream.';\n }\n if (this.state === 'review') {\n return 'Resumo mantém a visão consolidada. Prévia abre o diff completo antes/depois.';\n }\n if (this.state === 'clarification') {\n return 'Decisões destaca opções sugeridas e contexto pendente para escolha.';\n }\n if (this.state === 'error' || this.state === 'success' || this.state === 'applying') {\n const actionLabel = this.getThoughtDetailsLabel();\n return `${actionLabel} leva para os detalhes de aplicação e avisos operacionais.`;\n }\n return 'Use detalhes para revisar o contexto e decidir o próximo passo.';\n }\n\n shouldShowThoughtPreviewAction(): boolean {\n if (this.state !== 'review') return false;\n if (!this.pendingDiff.length) return false;\n if (!this.shouldUseStreamTimeline()) return true;\n return this.streamTerminalState === 'completed';\n }\n\n shouldShowTaskTimeline(): boolean {\n return this.isTaskMode();\n }\n\n getTaskTimelineItems(): Array<{\n step: number;\n title: string;\n detail: string;\n state: 'done' | 'active' | 'pending';\n }> {\n const items = [\n { step: 1, title: 'Pedido', detail: 'Intenção e escopo da solicitação' },\n { step: 2, title: 'Proposta', detail: 'Dados pendentes e decisão guiada' },\n { step: 3, title: 'Impacto', detail: 'Resumo e diff para validação' },\n { step: 4, title: 'Aplicação', detail: 'Patch aplicado com segurança' },\n ];\n return items.map((item) => ({\n ...item,\n state: this.getFlowStepState(item.step),\n }));\n }\n\n private getThoughtDurationSeconds(): number | null {\n if (this.state === 'processing' && this.processingStartedAt !== null) {\n const delta = Date.now() - this.processingStartedAt;\n return Math.max(1, Math.round(delta / 1000));\n }\n if (this.lastProcessingDurationMs !== null) {\n return Math.max(1, Math.round(this.lastProcessingDurationMs / 1000));\n }\n return null;\n }\n\n private formatDurationClock(totalSeconds: number): string {\n const safe = Math.max(0, Math.floor(totalSeconds));\n const hours = Math.floor(safe / 3600);\n const minutes = Math.floor((safe % 3600) / 60);\n const seconds = safe % 60;\n const mm = this.formatWesternTwoDigits(minutes);\n const ss = this.formatWesternTwoDigits(seconds);\n if (hours > 0) {\n const hh = this.formatWesternTwoDigits(hours);\n return `${hh}:${mm}:${ss}`;\n }\n return `${mm}:${ss}`;\n }\n\n private formatWesternTwoDigits(value: number): string {\n const safe = Math.max(0, Math.floor(value));\n return this.westernTwoDigitFormatter.format(safe);\n }\n\n getReviewRiskLevel(): ReviewRiskLevel {\n if (this.backendRiskLevel) return this.backendRiskLevel;\n const changes = this.getReviewChangeCount();\n if (this.warnings.length >= 3) return 'alto';\n if (this.warnings.length > 0 || changes > 6) return 'médio';\n return 'baixo';\n }\n\n getReviewSummary(): string {\n const changes = this.getReviewChangeCount();\n const changeLabel = changes === 1 ? 'mudança' : 'mudanças';\n const undo = this.lastSnapshot ? 'desfazer disponível' : 'desfazer disponível após aplicar';\n return `${changes} ${changeLabel} • ${undo}`;\n }\n\n getDiffToggleLabel(): string {\n if (this.showFullDiff) return 'Ocultar diff completo';\n const count = this.pendingDiff.length || this.getReviewChangeCount();\n const label = count === 1 ? 'mudança' : 'mudanças';\n return `Abrir diff completo (${count} ${label})`;\n }\n\n private getReviewChangeCount(): number {\n if (this.pendingDiff.length) return this.pendingDiff.length;\n return this.estimatePatchChangeCount(this.pendingPatch);\n }\n\n private estimatePatchChangeCount(value: unknown): number {\n if (value == null) return 0;\n if (Array.isArray(value)) return value.length > 0 ? 1 : 0;\n if (typeof value !== 'object') return 1;\n const entries = Object.entries(value as Record<string, unknown>);\n if (!entries.length) return 0;\n return entries.reduce((acc, [, child]) => {\n const childCount = this.estimatePatchChangeCount(child);\n return acc + (childCount > 0 ? childCount : 1);\n }, 0);\n }\n\n private getCurrentFlowStep(): number {\n if (this.shouldUseStreamTimeline()) {\n return this.resolveCurrentFlowStepFromStream();\n }\n if (this.state === 'listening' || this.state === 'processing') return 1;\n if (this.state === 'clarification') return 2;\n if (this.state === 'review') return 3;\n if (this.state === 'applying' || this.state === 'success' || this.state === 'error') return 4;\n return 1;\n }\n\n private resolveCurrentFlowStepFromStream(): number {\n if (this.streamTimelineStepState[3] === 'active' || this.streamTimelineStepState[3] === 'done') return 3;\n if (this.streamTimelineStepState[2] === 'active' || this.streamTimelineStepState[2] === 'done') return 2;\n return 1;\n }\n\n private shouldUseStreamTimeline(): boolean {\n return this.streamTimelineMode === 'stream';\n }\n\n private initializeStreamTimeline(): void {\n this.streamTimelineStepState = {\n 1: 'pending',\n 2: 'pending',\n 3: 'pending',\n };\n this.streamTimelineStepDetail = {};\n }\n\n private markStreamStep(step: 1 | 2 | 3, state: StreamStepState, detail?: string): void {\n this.streamTimelineStepState = {\n ...this.streamTimelineStepState,\n [step]: state,\n };\n if (detail && detail.trim()) {\n this.streamTimelineStepDetail = {\n ...this.streamTimelineStepDetail,\n [step]: detail.trim(),\n };\n }\n if (step === 2 && (state === 'active' || state === 'done') && this.streamTimelineStepState[1] !== 'done') {\n this.streamTimelineStepState = {\n ...this.streamTimelineStepState,\n 1: 'done',\n };\n }\n if (step === 3 && (state === 'active' || state === 'done')) {\n if (this.streamTimelineStepState[1] !== 'done') {\n this.streamTimelineStepState = { ...this.streamTimelineStepState, 1: 'done' };\n }\n if (this.streamTimelineStepState[2] === 'pending') {\n this.streamTimelineStepState = { ...this.streamTimelineStepState, 2: 'done' };\n }\n }\n }\n\n shouldShowTaskSteps(): boolean {\n return this.isDatasetSelection();\n }\n\n getTaskSelectionSummary(): string | null {\n if (!this.selectedClarificationOptions.length) return null;\n if (this.selectedClarificationOptions.length === 1) {\n return this.selectedClarificationOptions[0]?.label || null;\n }\n return `${this.selectedClarificationOptions.length} selecionados`;\n }\n\n getHistorySessionTooltip(session: {\n componentType?: string;\n componentId?: string;\n }): string {\n if (!session) return '';\n const parts: string[] = [];\n if (session.componentType) parts.push(`Tipo: ${session.componentType}`);\n if (session.componentId) parts.push(`Componente: ${session.componentId}`);\n return parts.join(' • ');\n }\n\n getVisibleSuggestions(): AiSuggestion[] {\n if (!this.dismissedSuggestionIds.size) return this.richSuggestions;\n return this.richSuggestions.filter((item) => !this.dismissedSuggestionIds.has(item.id));\n }\n\n hasDismissedSuggestions(): boolean {\n return this.dismissedSuggestionIds.size > 0;\n }\n\n getDismissedSuggestionCount(): number {\n return this.dismissedSuggestionIds.size;\n }\n\n restoreDismissedSuggestions(): void {\n if (!this.dismissedSuggestionIds.size) return;\n this.dismissedSuggestionIds = new Set<string>();\n this.cdr.markForCheck();\n }\n\n isDatasetSelection(): boolean {\n return this.clarificationOptions.some((opt) => this.isEndpointOption(opt));\n }\n\n hasClarificationSelection(): boolean {\n return this.selectedClarificationOptions.length > 0;\n }\n\n confirmTaskAction(): void {\n if (this.state === 'review') {\n this.confirmPatch();\n return;\n }\n if (!this.hasClarificationSelection()) {\n if (this.clarificationAllowCustom && this.clarificationFreeText.trim()) {\n const answer = this.clarificationFreeText.trim();\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.submitPrompt(answer);\n }\n return;\n }\n if (this.clarificationSelectionMode === 'multiple') {\n this.submitClarificationSelection();\n return;\n }\n const selected = this.selectedClarificationOptions[0];\n if (selected) {\n this.handleClarificationOption(selected);\n }\n }\n\n handleTaskSecondary(): void {\n if (this.state === 'processing') {\n this.cancelProcessing('Solicitação interrompida.');\n return;\n }\n this.close();\n }\n\n onClarificationOptionClick(opt: ClarificationRichOption): void {\n if (!this.isTaskMode()) {\n this.handleClarificationOption(opt);\n return;\n }\n if (this.clarificationSelectionMode === 'multiple') {\n this.toggleClarificationSelection(opt);\n } else {\n this.selectedClarificationOptions = [opt];\n }\n this.showManualInput = false;\n this.cdr.markForCheck();\n }\n\n toggleManualInput(): void {\n if (!this.clarificationAllowCustom) return;\n this.showManualInput = !this.showManualInput;\n }\n\n private toggleClarificationSelection(opt: ClarificationRichOption): void {\n const idx = this.selectedClarificationOptions.findIndex((sel) => sel.value === opt.value);\n if (idx >= 0) {\n this.selectedClarificationOptions = this.selectedClarificationOptions.filter((_, i) => i !== idx);\n } else {\n this.selectedClarificationOptions = [...this.selectedClarificationOptions, opt];\n }\n }\n\n private setState(next: AssistantState | 'clarification'): void {\n const prev = this.state;\n if (next === 'processing' && prev !== 'processing') {\n this.processingStartedAt = Date.now();\n this.lastProcessingDurationMs = null;\n }\n if (prev === 'processing' && next !== 'processing' && this.processingStartedAt !== null) {\n const elapsed = Date.now() - this.processingStartedAt;\n this.lastProcessingDurationMs = elapsed > 0 ? elapsed : null;\n this.processingStartedAt = null;\n }\n this.state = next;\n if (next === 'clarification' || next === 'review') {\n this.taskFlowActive = true;\n } else if ((next === 'processing' || next === 'applying') && (prev === 'clarification' || prev === 'review' || this.taskFlowActive)) {\n this.taskFlowActive = true;\n }\n if (next === 'listening' || next === 'idle' || next === 'success') {\n this.taskFlowActive = false;\n }\n if (next === 'idle') {\n this.processingStartedAt = null;\n this.lastProcessingDurationMs = null;\n }\n if (next === 'review') {\n this.showFullDiff = false;\n }\n if (next !== 'clarification' && next !== 'review') {\n this.highlightClarificationDetails = false;\n this.highlightReviewDetails = false;\n this.clearThoughtDetailsHighlightTimer();\n }\n if (this.isTaskMode()) {\n this.activeTab = 'task';\n } else if (this.activeTab === 'task') {\n this.activeTab = 'suggestions';\n }\n }\n\n private flashThoughtDetails(mode: 'clarification' | 'review'): void {\n this.clearThoughtDetailsHighlightTimer();\n this.highlightClarificationDetails = mode === 'clarification';\n this.highlightReviewDetails = mode === 'review';\n this.cdr.markForCheck();\n this.thoughtDetailsHighlightTimerId = setTimeout(() => {\n this.highlightClarificationDetails = false;\n this.highlightReviewDetails = false;\n this.cdr.markForCheck();\n this.thoughtDetailsHighlightTimerId = null;\n }, 1300);\n }\n\n private clearThoughtDetailsHighlightTimer(): void {\n if (!this.thoughtDetailsHighlightTimerId) return;\n clearTimeout(this.thoughtDetailsHighlightTimerId);\n this.thoughtDetailsHighlightTimerId = null;\n }\n\n private focusTaskPanelTarget(selector: string): void {\n if (typeof document === 'undefined') return;\n setTimeout(() => {\n const panel = document.getElementById('assistant-panel-task');\n if (!(panel instanceof HTMLElement)) return;\n const target = panel.querySelector(selector);\n if (!(target instanceof HTMLElement)) return;\n try {\n target.scrollIntoView({ block: 'start', behavior: 'smooth' });\n } catch {\n target.scrollIntoView({ block: 'start' });\n }\n if (!target.hasAttribute('tabindex')) {\n target.setAttribute('tabindex', '-1');\n }\n target.focus({ preventScroll: true });\n }, 0);\n }\n\n toggleFullDiff(): void {\n this.showFullDiff = !this.showFullDiff;\n }\n\n getDiffSummaryLines(): string[] {\n if (!this.pendingDiff?.length) return [];\n return this.pendingDiff.slice(0, 3).map((diff) => this.summarizeDiff(diff));\n }\n\n private summarizeDiff(diff: AiPatchDiff): string {\n const hadBefore = diff.before !== null && diff.before !== undefined;\n const hasAfter = diff.after !== null && diff.after !== undefined;\n const prefix = !hadBefore && hasAfter ? '+' : hadBefore && !hasAfter ? '-' : '~';\n return `${prefix} ${diff.path}`;\n }\n\n shouldShowApplyDetails(): boolean {\n return !!this.pendingPatch || this.pendingDiff.length > 0 || this.applyWarnings.length > 0;\n }\n\n getApplyPaths(): string[] {\n const fromDiff = this.pendingDiff\n .map((item) => (item?.path || '').trim())\n .filter((path) => path.length > 0);\n if (fromDiff.length) return Array.from(new Set(fromDiff));\n if (!this.pendingPatch || typeof this.pendingPatch !== 'object') return [];\n return this.collectPatchPaths(this.pendingPatch);\n }\n\n getEditablePatchPathEdits(): PatchPathEdit[] {\n return this.patchPathEdits;\n }\n\n togglePatchEditor(): void {\n if (!this.allowManualPatchEdit) return;\n if (!this.pendingPatch) return;\n this.patchEditorExpanded = !this.patchEditorExpanded;\n if (this.patchEditorExpanded && !this.patchEditorText.trim()) {\n this.patchEditorText = this.serializePatch(this.pendingPatch);\n this.patchEditorError = '';\n }\n }\n\n resetPatchEditor(): void {\n if (!this.pendingPatch) {\n this.patchEditorText = '';\n this.patchEditorError = '';\n return;\n }\n this.patchEditorText = this.serializePatch(this.pendingPatch);\n this.patchEditorError = '';\n }\n\n togglePatchPathEditor(): void {\n if (!this.allowManualPatchEdit) return;\n if (!this.pendingPatch) return;\n this.patchPathEditorExpanded = !this.patchPathEditorExpanded;\n if (this.patchPathEditorExpanded && !this.patchPathEdits.length) {\n this.syncPatchPathEdits();\n }\n }\n\n resetPatchPathEdits(): void {\n this.patchPathEditorError = '';\n this.syncPatchPathEdits();\n }\n\n applyPathEditsToPatch(): boolean {\n if (!this.allowManualPatchEdit) return false;\n if (!this.pendingPatch) return false;\n if (!this.patchPathEdits.length) {\n this.patchPathEditorError = 'Nenhum path editável disponível para este patch.';\n return false;\n }\n const nextPatch = this.clonePatch(this.pendingPatch);\n const nextEdits = this.patchPathEdits.map((item) => ({ ...item, error: '' }));\n let hasError = false;\n\n for (const edit of nextEdits) {\n if (!edit.path || !edit.path.trim()) continue;\n const parsed = this.parsePathEditValue(edit.valueText);\n if (parsed.ok === false) {\n edit.error = parsed.error;\n hasError = true;\n continue;\n }\n this.setPatchValueAtPath(nextPatch, edit.path, parsed.value);\n }\n\n this.patchPathEdits = nextEdits;\n if (hasError) {\n this.patchPathEditorError = 'Corrija os campos destacados antes de aplicar.';\n return false;\n }\n this.patchPathEditorError = '';\n this.pendingPatch = nextPatch;\n this.pendingDiff = [];\n this.patchEditorText = this.serializePatch(nextPatch);\n this.patchEditorError = '';\n return true;\n }\n\n async reapplyPathEdits(): Promise<void> {\n if (!this.allowManualPatchEdit || this.state === 'applying') return;\n const updated = this.applyPathEditsToPatch();\n if (!updated || !this.pendingPatch) return;\n const confirmed = await this.confirmEditedPatchBeforeApply('path');\n if (!confirmed) return;\n await this.applyPatchPayload(this.pendingPatch, true);\n }\n\n async reapplyEditedPatch(): Promise<void> {\n if (!this.allowManualPatchEdit || this.state === 'applying') return;\n const parsed = this.parsePatchEditorText();\n if (!parsed) return;\n const confirmed = await this.confirmEditedPatchBeforeApply('json');\n if (!confirmed) return;\n await this.applyPatchPayload(parsed, true);\n }\n\n private async confirmEditedPatchBeforeApply(mode: 'path' | 'json'): Promise<boolean> {\n const policy = this.getEffectiveRiskPolicy();\n const risk = this.getReviewRiskLevel();\n const requiresRiskConfirmation = policy === 'strict' || this.requiresApplyConfirmation();\n const editedLabel = mode === 'path'\n ? 'Você alterou valores do patch por path.'\n : 'Você editou o patch JSON manualmente.';\n\n if (requiresRiskConfirmation) {\n return this.openConfirmationDialog({\n title: 'Confirmar reaplicação',\n message: `${editedLabel} ${this.buildRiskConfirmationMessage(risk)}`,\n confirmLabel: 'Reaplicar alterações',\n cancelLabel: 'Revisar novamente',\n confirmColor: policy === 'strict' || risk === 'alto' ? 'warn' : 'primary',\n });\n }\n\n return this.openConfirmationDialog({\n title: 'Reaplicar alterações',\n message: `${editedLabel} Deseja reaplicar agora?`,\n confirmLabel: 'Reaplicar',\n cancelLabel: 'Cancelar',\n confirmColor: 'primary',\n });\n }\n\n getScopeLabel(): string {\n const type = (this.currentComponentType || '').toLowerCase();\n if (type.includes('page')) return 'Somente esta página';\n if (type.includes('table')) return 'Somente esta tabela';\n if (type.includes('form')) return 'Somente este formulário';\n return 'Somente este componente';\n }\n\n getScopeTooltip(): string {\n return 'As mudanças afetam apenas este componente e suas configurações.';\n }\n\n getConfidenceLabel(): string {\n if (this.warnings.length) return 'Revisão recomendada';\n return 'Validação automática concluída';\n }\n\n getConfidenceTooltip(): string {\n if (this.warnings.length) {\n return 'Pode exigir ajustes; revise antes de aplicar.';\n }\n return 'Baseado na configuração atual e no contexto disponível.';\n }\n\n isClarificationSelected(option: ClarificationRichOption): boolean {\n if (!option) return false;\n return this.selectedClarificationOptions?.some(item => item?.value === option.value) ?? false;\n }\n\n getClarificationOptionLayout(option: ClarificationRichOption): 'endpoint' | 'color' | 'description' | 'default' {\n if (this.isEndpointOption(option)) return 'endpoint';\n if (this.isColorOption(option)) return 'color';\n if (this.hasRichDescription(option)) return 'description';\n return 'default';\n }\n\n getClarificationOptionKindLabel(option: ClarificationRichOption): string {\n const layout = this.getClarificationOptionLayout(option);\n if (layout === 'endpoint') return 'API';\n if (layout === 'color') return 'Cor';\n if (layout === 'description') return 'Descrição';\n return 'Opção';\n }\n\n isEndpointOption(option: ClarificationRichOption): boolean {\n const hints = option?.contextHints;\n return !!hints && (\n typeof hints.method === 'string'\n || typeof hints.path === 'string'\n );\n }\n\n isColorOption(option: ClarificationRichOption): boolean {\n const hex = option?.contextHints?.hexColor;\n return typeof hex === 'string' && hex.trim().length > 0;\n }\n\n hasRichDescription(option: ClarificationRichOption): boolean {\n const desc = option?.contextHints?.description;\n return typeof desc === 'string' && desc.trim().length > 0;\n }\n\n getEndpointIcon(option: ClarificationRichOption): string {\n const icon = option?.contextHints?.icon;\n const trimmed = typeof icon === 'string' ? icon.trim() : '';\n return trimmed || 'api';\n }\n\n getEndpointMethod(option: ClarificationRichOption): string | null {\n const method = option?.contextHints?.method;\n const trimmed = typeof method === 'string' ? method.trim() : '';\n return trimmed ? trimmed.toUpperCase() : null;\n }\n\n getEndpointPath(option: ClarificationRichOption): string | null {\n const path = option?.contextHints?.path;\n const trimmed = typeof path === 'string' ? path.trim() : '';\n if (trimmed) return trimmed;\n const label = (option?.label || '').trim();\n return label || null;\n }\n\n shouldShowClarificationTooltip(option: ClarificationRichOption): boolean {\n if (!option) return false;\n if (this.getClarificationOptionLayout(option) === 'description') return false;\n const desc = option?.contextHints?.description;\n if (typeof desc === 'string' && desc.trim()) return true;\n return !!option.example;\n }\n\n getClarificationTooltip(option: ClarificationRichOption): string {\n const desc = option?.contextHints?.description;\n if (typeof desc === 'string' && desc.trim()) return desc.trim();\n return option?.example || '';\n }\n\n getSafeHexColor(option: ClarificationRichOption): string | null {\n const value = option?.contextHints?.hexColor;\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n const normalized = trimmed.startsWith('#') ? trimmed : `#${trimmed}`;\n return /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(normalized)\n ? normalized\n : null;\n }\n\n shouldShowDescriptionTooltip(option: ClarificationRichOption): boolean {\n if (!this.shouldShowDescription(option)) return false;\n const desc = option?.contextHints?.description;\n if (typeof desc !== 'string') return false;\n const trimmed = desc.trim();\n return trimmed.length > 60;\n }\n\n getDescriptionTooltip(option: ClarificationRichOption): string {\n const desc = option?.contextHints?.description;\n if (typeof desc !== 'string') return '';\n return desc.trim();\n }\n\n shouldShowDescription(option: ClarificationRichOption): boolean {\n const desc = option?.contextHints?.description;\n if (typeof desc !== 'string') return false;\n const trimmed = desc.trim();\n if (!trimmed) return false;\n const label = (option?.label || '').trim();\n if (!label) return true;\n return trimmed.toLowerCase() !== label.toLowerCase();\n }\n\n async handleClarificationOption(option: ClarificationRichOption | string): Promise<void> {\n if (this.clarificationSelectionMode === 'multiple' && typeof option !== 'string') {\n this.toggleClarificationSelection(option);\n return;\n }\n if (typeof option !== 'string' && option.contextHints) {\n this.activeContextHints = this.mergeContextHints(this.activeContextHints, option.contextHints);\n const hintedResource = this.asRecord(option.contextHints)?.['resourcePath'];\n if (typeof hintedResource === 'string' && hintedResource.trim()) {\n this.setResourcePathHint(hintedResource);\n }\n this.skipClarificationAppend = true;\n const base = (this.clarificationBasePrompt || '').trim();\n await this.submitPrompt(base || option.value);\n return;\n }\n const selected = typeof option === 'string' ? option : option.value;\n const base = (this.clarificationBasePrompt || '').trim();\n const resourcePath = this.extractResourcePath(selected);\n if (resourcePath) {\n this.setResourcePathHint(resourcePath);\n this.skipClarificationAppend = true;\n await this.submitPrompt(base || selected);\n return;\n }\n const maskHints = this.buildMaskSelectionHints(selected, base);\n if (maskHints) {\n this.activeContextHints = this.mergeContextHints(this.activeContextHints, maskHints);\n this.skipClarificationAppend = true;\n await this.submitPrompt(base || selected);\n return;\n }\n await this.submitPrompt(selected);\n }\n\n async confirmPatch(): Promise<void> {\n if (!this.pendingPatch) return;\n if (this.requiresApplyConfirmation() && !(await this.confirmRiskApply())) return;\n await this.applyPatchPayload(this.pendingPatch, false);\n }\n\n private requiresApplyConfirmation(): boolean {\n const policy = this.getEffectiveRiskPolicy();\n if (policy === 'standard') {\n if (this.backendRequiresConfirmation !== null) return this.backendRequiresConfirmation;\n if (this.backendRiskLevel) return this.backendRiskLevel !== 'baixo';\n return this.getReviewRiskLevel() !== 'baixo';\n }\n if (this.backendRequiresConfirmation === true) return true;\n if (this.backendRequiresConfirmation === false) {\n // Fail-safe corporativo: risco médio/alto sempre exige confirmação explícita.\n if (this.backendRiskLevel && this.backendRiskLevel !== 'baixo') return true;\n return false;\n }\n if (this.backendRiskLevel) return this.backendRiskLevel !== 'baixo';\n return this.getReviewRiskLevel() !== 'baixo';\n }\n\n private async confirmRiskApply(): Promise<boolean> {\n if (typeof window === 'undefined') return true;\n const risk = this.getReviewRiskLevel();\n return this.openConfirmationDialog({\n title: 'Confirmar aplicação',\n message: this.buildRiskConfirmationMessage(risk),\n confirmLabel: 'Aplicar alterações',\n cancelLabel: 'Revisar novamente',\n confirmColor: risk === 'alto' ? 'warn' : 'primary',\n });\n }\n\n private buildRiskConfirmationMessage(risk: ReviewRiskLevel): string {\n if (risk === 'alto') {\n return 'Esta proposta foi classificada como risco alto. Deseja aplicar as alterações agora?';\n }\n if (risk === 'médio') {\n return 'Esta proposta possui risco médio. Deseja aplicar as alterações agora?';\n }\n return 'Deseja aplicar as alterações agora?';\n }\n\n private async openConfirmationDialog(data: AssistantConfirmDialogData): Promise<boolean> {\n const dialogRef = this.dialog.open(PraxisAiAssistantConfirmDialogComponent, {\n data,\n width: '420px',\n disableClose: false,\n autoFocus: false,\n restoreFocus: true,\n });\n try {\n const confirmed = await firstValueFrom(dialogRef.afterClosed());\n return confirmed === true;\n } catch {\n return false;\n }\n }\n\n private normalizeRiskLevel(value: unknown): ReviewRiskLevel | null {\n if (typeof value !== 'string') return null;\n const normalized = value\n .trim()\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '');\n if (normalized === 'baixo' || normalized === 'low') return 'baixo';\n if (normalized === 'medio' || normalized === 'medium') return 'médio';\n if (normalized === 'alto' || normalized === 'high') return 'alto';\n return null;\n }\n\n async undoLastChange(): Promise<void> {\n if (!this.lastSnapshot) return;\n this.setState('processing');\n this.cdr.markForCheck();\n try {\n await this.adapter.restoreSnapshot(this.lastSnapshot);\n this.lastSnapshot = null;\n this.close();\n } catch {\n this.errorMsg = 'Falha ao desfazer.';\n this.setState('error');\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n retry(): void {\n this.setState('listening');\n setTimeout(() => this.inputElement?.nativeElement?.focus(), 50);\n }\n\n private async applyPatchPayload(patch: Record<string, unknown>, edited: boolean): Promise<void> {\n this.setState('applying');\n this.patchEditorError = '';\n this.cdr.markForCheck();\n\n try {\n this.lastSnapshot = this.adapter.createSnapshot();\n const result = await this.adapter.applyPatch(patch, this.userPrompt);\n this.applyWarnings = result.warnings || [];\n this.lastApplyAt = new Date().toISOString();\n\n if (result.success) {\n this.pendingPatch = patch;\n if (edited) {\n this.pendingDiff = [];\n }\n this.patchEditorText = this.serializePatch(patch);\n this.syncPatchPathEdits();\n this.aiExplanation = edited\n ? 'Patch reaplicado com sucesso.'\n : (this.aiExplanation || 'Configuração atualizada.');\n this.setState('success');\n } else {\n this.errorMsg = result.error || 'O componente recusou a alteração.';\n this.setState('error');\n }\n } catch {\n this.errorMsg = 'Erro crítico ao aplicar configuração.';\n this.setState('error');\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n private parsePatchEditorText(): Record<string, unknown> | null {\n const raw = (this.patchEditorText || '').trim();\n if (!raw) {\n this.patchEditorError = 'Patch vazio. Informe um JSON válido para reaplicar.';\n return null;\n }\n try {\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n this.patchEditorError = 'O patch precisa ser um objeto JSON (ex.: {\"columns\": [...]}).';\n return null;\n }\n this.patchEditorError = '';\n return parsed as Record<string, unknown>;\n } catch {\n this.patchEditorError = 'JSON inválido. Revise o patch antes de reaplicar.';\n return null;\n }\n }\n\n private collectPatchPaths(\n value: unknown,\n prefix = '',\n acc: string[] = [],\n limit = 30,\n ): string[] {\n if (acc.length >= limit) return acc;\n if (value == null) {\n if (prefix) acc.push(prefix);\n return acc;\n }\n if (Array.isArray(value)) {\n if (prefix) acc.push(`${prefix}[]`);\n return acc;\n }\n if (typeof value !== 'object') {\n if (prefix) acc.push(prefix);\n return acc;\n }\n const entries = Object.entries(value as Record<string, unknown>);\n if (!entries.length) {\n if (prefix) acc.push(prefix);\n return acc;\n }\n for (const [key, child] of entries) {\n if (acc.length >= limit) break;\n const nextPrefix = prefix ? `${prefix}.${key}` : key;\n this.collectPatchPaths(child, nextPrefix, acc, limit);\n }\n if (!prefix && acc.length > limit) {\n return acc.slice(0, limit);\n }\n return Array.from(new Set(acc));\n }\n\n private serializePatch(value: unknown): string {\n try {\n return JSON.stringify(value ?? {}, null, 2);\n } catch {\n return '{}';\n }\n }\n\n private syncPatchPathEdits(): void {\n if (!this.pendingPatch) {\n this.patchPathEdits = [];\n return;\n }\n const paths = this.collectEditablePatchPaths(this.pendingPatch)\n .filter((path) => path.trim().length > 0)\n .slice(0, 20);\n this.patchPathEdits = paths.map((path) => ({\n path,\n valueText: this.serializePathValue(this.getPatchValueAtPath(this.pendingPatch, path)),\n error: '',\n }));\n }\n\n private serializePathValue(value: unknown): string {\n if (value === undefined) return '';\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return '';\n }\n }\n\n private collectEditablePatchPaths(\n value: unknown,\n prefix = '',\n acc: string[] = [],\n limit = 40,\n ): string[] {\n if (acc.length >= limit) return acc;\n\n if (value === null || value === undefined) {\n if (prefix) acc.push(prefix);\n return acc;\n }\n\n if (Array.isArray(value)) {\n if (!value.length) {\n if (prefix) acc.push(prefix);\n return acc;\n }\n for (let i = 0; i < value.length; i += 1) {\n if (acc.length >= limit) break;\n const nextPrefix = prefix ? `${prefix}[${i}]` : `[${i}]`;\n this.collectEditablePatchPaths(value[i], nextPrefix, acc, limit);\n }\n return acc;\n }\n\n if (typeof value !== 'object') {\n if (prefix) acc.push(prefix);\n return acc;\n }\n\n const entries = Object.entries(value as Record<string, unknown>);\n if (!entries.length) {\n if (prefix) acc.push(prefix);\n return acc;\n }\n\n for (const [key, child] of entries) {\n if (acc.length >= limit) break;\n const nextPrefix = prefix ? `${prefix}.${key}` : key;\n this.collectEditablePatchPaths(child, nextPrefix, acc, limit);\n }\n return acc;\n }\n\n private parsePathEditValue(\n valueText: string,\n ): { ok: true; value: unknown } | { ok: false; error: string } {\n const raw = (valueText || '').trim();\n if (!raw) {\n return { ok: false, error: 'Informe um valor JSON válido.' };\n }\n try {\n return { ok: true, value: JSON.parse(raw) };\n } catch {\n // Fallback pragmático: texto simples sem aspas vira string.\n return { ok: true, value: raw };\n }\n }\n\n private getPatchValueAtPath(source: unknown, path: string): unknown {\n const tokens = this.tokenizePatchPath(path);\n let cursor: unknown = source;\n for (const token of tokens) {\n if (cursor == null) return undefined;\n if (Array.isArray(cursor)) {\n if (typeof token !== 'number') return undefined;\n cursor = cursor[token];\n continue;\n }\n const record = this.asRecord(cursor);\n if (!record || typeof token !== 'string') return undefined;\n cursor = record[token];\n }\n return cursor;\n }\n\n private setPatchValueAtPath(target: Record<string, unknown>, path: string, value: unknown): void {\n const tokens = this.tokenizePatchPath(path);\n if (!tokens.length) return;\n let cursor: unknown = target;\n for (let i = 0; i < tokens.length - 1; i += 1) {\n const token = tokens[i];\n const nextToken = tokens[i + 1];\n const nextIsIndex = typeof nextToken === 'number';\n if (Array.isArray(cursor)) {\n if (typeof token !== 'number') return;\n if (cursor[token] == null || typeof cursor[token] !== 'object') {\n cursor[token] = nextIsIndex ? [] : {};\n }\n cursor = cursor[token];\n continue;\n }\n const record = this.asRecord(cursor);\n if (!record || typeof token !== 'string') return;\n if (record[token] == null || typeof record[token] !== 'object') {\n record[token] = nextIsIndex ? [] : {};\n }\n cursor = record[token];\n }\n const lastToken = tokens[tokens.length - 1];\n if (Array.isArray(cursor)) {\n if (typeof lastToken !== 'number') return;\n cursor[lastToken] = value;\n return;\n }\n const record = this.asRecord(cursor);\n if (!record || typeof lastToken !== 'string') return;\n record[lastToken] = value;\n }\n\n private tokenizePatchPath(path: string): Array<string | number> {\n return path\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .map((part) => (/^\\d+$/.test(part) ? Number(part) : part));\n }\n\n private clonePatch<T>(value: T): T {\n try {\n if (typeof structuredClone === 'function') {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n } catch {\n return value;\n }\n }\n\n prepareSuggestionPrompt(sug: AiSuggestion, event?: Event): void {\n event?.preventDefault();\n event?.stopPropagation();\n this.promptFromSuggestion = true;\n this.activeVariantId = this.resolveVariantIdForSuggestion(sug);\n this.activeSuggestion = sug;\n this.userPrompt = sug.intent;\n this.activeTab = 'suggestions';\n setTimeout(() => this.inputElement?.nativeElement?.focus(), 50);\n this.cdr.markForCheck();\n }\n\n dismissSuggestion(sug: AiSuggestion, event?: Event): void {\n event?.preventDefault();\n event?.stopPropagation();\n if (!sug?.id) return;\n const next = new Set(this.dismissedSuggestionIds);\n next.add(sug.id);\n this.dismissedSuggestionIds = next;\n this.cdr.markForCheck();\n }\n\n onSuggestionCardKeydown(event: KeyboardEvent, sug: AiSuggestion): void {\n if (event.target !== event.currentTarget) return;\n if (event.key === 'Enter') {\n this.selectSuggestion(sug);\n return;\n }\n if (event.key === ' ') {\n event.preventDefault();\n this.selectSuggestion(sug);\n }\n }\n\n selectSuggestion(sug: AiSuggestion): void {\n this.promptFromSuggestion = true;\n this.activeVariantId = this.resolveVariantIdForSuggestion(sug);\n this.activeSuggestion = sug;\n this.userPrompt = sug.intent;\n if (this.needsBadgeValueClarification(sug)) {\n const configRoot = this.resolveConfigRoot(this.adapter.getCurrentConfig?.());\n const options = this.buildValueColorClarificationPayloads(configRoot, sug.intent);\n if (options.length) {\n this.enterClarificationWithOptions('Escolha valores e cores para os badges.', options, sug.intent);\n return;\n }\n }\n this.submitPrompt();\n }\n\n // Helpers\n\n async refreshSuggestions(): Promise<void> {\n await this.loadSuggestions(true);\n }\n\n async submitClarificationSelection(): Promise<void> {\n if (this.clarificationSelectionMode !== 'multiple') return;\n if (!this.selectedClarificationOptions.length) return;\n const base = (this.clarificationBasePrompt || '').trim();\n const combined = this.selectedClarificationOptions.map((opt) => opt.value).join(', ');\n const mergedHints = this.selectedClarificationOptions\n .map((opt) => opt.contextHints)\n .filter((hint): hint is ClarificationContextHints => !!hint)\n .reduce<ClarificationContextHints | null>((acc, hint) => this.mergeContextHints(acc, hint), null);\n if (mergedHints) {\n this.activeContextHints = mergedHints;\n this.skipClarificationAppend = true;\n await this.submitPrompt(base || combined);\n return;\n }\n await this.submitPrompt(combined);\n }\n\n startNewSession(resetUi = true): void {\n if (!this.historyContext) return;\n this.clearPendingHistoryUndo();\n const session = this.historyService.createSession(\n this.historyContext,\n this.resolveComponentId(),\n this.resolveComponentType(),\n );\n if (!session) return;\n this.activeHistorySession = session;\n this.activeHistoryMessages = [];\n this.activeHistoryTotalMessages = 0;\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n this.activeServerSessionId = null;\n this.forceNewSession = true;\n this.persistServerSessionId(null);\n this.historyService.updateServerSessionId(this.historyContext, session.id, null);\n if (resetUi) {\n this.resetAssistantStateForSession();\n }\n this.cdr.markForCheck();\n }\n\n async clearHistory(): Promise<void> {\n if (!this.historyContext) return;\n if (!(await this.confirmHistoryClear())) return;\n this.historyService.clearHistory(this.historyContext);\n this.historySessions = [];\n this.activeHistorySession = null;\n this.activeHistoryMessages = [];\n this.activeHistoryTotalMessages = 0;\n this.clearPendingHistoryUndo();\n this.resetAssistantStateForSession();\n }\n\n async removeHistorySession(sessionId: string, event?: Event): Promise<void> {\n event?.preventDefault();\n event?.stopPropagation();\n if (!this.historyContext || !sessionId) return;\n const session = this.historyService.getSession(sessionId);\n if (!session || !this.matchesHistoryContext(session)) return;\n const confirmed = await this.openConfirmationDialog({\n title: 'Excluir sessão',\n message: `Deseja excluir a sessão \"${session.title}\" do histórico local?`,\n confirmLabel: 'Excluir sessão',\n cancelLabel: 'Cancelar',\n confirmColor: 'warn',\n });\n if (!confirmed) return;\n this.historyService.deleteSession(this.historyContext, sessionId);\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n if (this.activeHistorySession?.id === sessionId) {\n this.activeHistorySession = null;\n this.activeHistoryMessages = [];\n this.activeHistoryTotalMessages = 0;\n this.activeServerSessionId = null;\n this.forceNewSession = true;\n this.persistServerSessionId(null);\n this.historySessions[0]?.id && this.selectHistorySession(this.historySessions[0].id);\n }\n this.setHistoryUndo(session);\n this.cdr.markForCheck();\n }\n\n onHistorySessionCardKeydown(event: KeyboardEvent, sessionId: string): void {\n if (event.target !== event.currentTarget) return;\n if (event.key === 'Enter') {\n this.selectHistorySession(sessionId);\n return;\n }\n if (event.key === ' ') {\n event.preventDefault();\n this.selectHistorySession(sessionId);\n }\n }\n\n reuseHistorySessionPrompt(sessionId: string, event?: Event): void {\n event?.preventDefault();\n event?.stopPropagation();\n const session = this.historyService.getSession(sessionId);\n if (!session || !this.matchesHistoryContext(session)) return;\n const lastUserPrompt = [...(session.messages || [])]\n .reverse()\n .find((msg) => msg.role === 'user' && !!msg.text?.trim())?.text;\n if (!lastUserPrompt) return;\n this.userPrompt = lastUserPrompt;\n this.activeTab = 'chat';\n setTimeout(() => this.inputElement?.nativeElement?.focus(), 50);\n this.cdr.markForCheck();\n }\n\n undoRemoveHistorySession(): void {\n if (!this.historyContext || !this.historyUndoDeleteSession) return;\n const previousActiveId = this.activeHistorySession?.id || null;\n const restored = this.historyService.restoreSession(this.historyContext, this.historyUndoDeleteSession);\n this.clearPendingHistoryUndo();\n if (!restored) {\n this.cdr.markForCheck();\n return;\n }\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n if (!previousActiveId || previousActiveId === restored.id) {\n this.selectHistorySession(restored.id);\n return;\n }\n this.selectHistorySession(previousActiveId);\n }\n\n selectHistorySession(sessionId: string): void {\n if (!this.historyContext) return;\n const session = this.historyService.getSession(sessionId);\n if (!session || !this.matchesHistoryContext(session)) return;\n this.activeHistorySession = session;\n const messages = session.messages || [];\n this.activeHistoryMessages = this.sliceHistoryMessages(messages);\n this.activeHistoryTotalMessages = messages.length;\n this.activeServerSessionId = session.serverSessionId || null;\n this.forceNewSession = !this.activeServerSessionId;\n this.persistServerSessionId(this.activeServerSessionId);\n this.cdr.markForCheck();\n }\n\n private async loadSuggestions(force = false): Promise<void> {\n if (this.loadingSuggestions && !force) return;\n this.loadingSuggestions = true;\n this.richSuggestions = [];\n this.suggestionsWarnings = [];\n this.cdr.markForCheck();\n const componentId = this.resolveComponentId();\n const componentType = this.resolveComponentType();\n this.currentComponentId = componentId || this.currentComponentId;\n this.currentComponentType = componentType || this.currentComponentType;\n const configRoot = this.resolveConfigRoot(this.adapter.getCurrentConfig?.());\n const dataProfile = this.adapter.getDataProfile ? this.adapter.getDataProfile() : null;\n const schemaFields = this.adapter.getSchemaFields ? this.adapter.getSchemaFields() : undefined;\n const capabilities = this.adapter.getCapabilities?.() || [];\n const runtimeState = this.adapter.getRuntimeState ? this.adapter.getRuntimeState() : undefined;\n const suggestionContext = this.adapter.getSuggestionContext?.();\n\n if (!componentId || !componentType) {\n this.suggestionsWarnings = ['Sugestoes indisponiveis sem componente registrado.'];\n this.dismissedSuggestionIds = new Set<string>();\n this.loadingSuggestions = false;\n this.cdr.markForCheck();\n return;\n }\n\n let cacheKey: string | null = null;\n try {\n cacheKey = this.buildSuggestionsCacheKey(\n componentId,\n componentType,\n configRoot,\n dataProfile,\n schemaFields,\n capabilities,\n runtimeState,\n suggestionContext,\n this.resolveLocale(),\n );\n } catch {\n cacheKey = null;\n }\n\n if (cacheKey && !force && this.suggestionsCache.has(cacheKey)) {\n this.richSuggestions = this.suggestionsCache.get(cacheKey) || [];\n this.suggestionsWarnings = [];\n this.pruneDismissedSuggestions();\n this.loadingSuggestions = false;\n this.cdr.markForCheck();\n return;\n }\n\n try {\n const response = await firstValueFrom(this.aiApi.getSuggestions(\n this.buildSuggestionsRequest(\n componentId,\n componentType,\n configRoot,\n capabilities,\n dataProfile,\n schemaFields,\n runtimeState,\n suggestionContext,\n force,\n ),\n ));\n const initialSuggestions = response?.suggestions || [];\n if (initialSuggestions.length === 0) {\n const retry = await firstValueFrom(this.aiApi.getSuggestions(\n this.buildSuggestionsRequest(\n componentId,\n componentType,\n configRoot,\n capabilities,\n dataProfile,\n schemaFields,\n runtimeState,\n suggestionContext,\n true,\n {\n mode: 'force',\n fallback: ['availableFeatures', 'missingCapabilities'],\n reason: 'empty-suggestions',\n },\n ),\n ));\n this.richSuggestions = retry?.suggestions || [];\n this.suggestionsWarnings = retry?.warnings || response?.warnings || [];\n } else {\n this.richSuggestions = initialSuggestions;\n this.suggestionsWarnings = response?.warnings || [];\n }\n if (cacheKey && this.richSuggestions.length > 0) {\n this.suggestionsCache.set(cacheKey, this.richSuggestions);\n }\n if (this.richSuggestions.length === 0 && this.suggestionsWarnings.length === 0) {\n this.suggestionsWarnings = ['Sem sugestões retornadas pelo backend.'];\n }\n } catch (err) {\n this.richSuggestions = [];\n this.suggestionsWarnings = ['Falha ao carregar sugestoes do backend.'];\n } finally {\n this.pruneDismissedSuggestions();\n this.loadingSuggestions = false;\n this.cdr.markForCheck();\n }\n }\n\n private async getPatchViaStreamWithFallback(request: AiOrchestratorRequest): Promise<AiOrchestratorResponse> {\n this.resetStreamTracking();\n try {\n const startResponse = await firstValueFrom(this.aiApi.startPatchStream(request));\n this.streamTimelineMode = 'stream';\n this.initializeStreamTimeline();\n return await this.consumePatchStream(\n startResponse.streamId,\n startResponse.expiresAt,\n startResponse.streamAccessToken ?? undefined,\n );\n } catch (error) {\n this.closeActiveStreamConnection();\n this.streamTerminalState = 'idle';\n this.processingInfoVisible = false;\n if (!this.shouldFallbackToPatch(error)) {\n throw error;\n }\n this.streamTimelineMode = 'snapshot';\n this.streamFallbackActive = true;\n this.aiExplanation = 'Conexão de stream indisponível. Usando resposta snapshot.';\n return await firstValueFrom(this.aiApi.getPatch(request));\n }\n }\n\n private async consumePatchStream(\n streamId: string,\n expiresAt?: string,\n accessToken?: string,\n ): Promise<AiOrchestratorResponse> {\n this.activeStreamId = streamId;\n this.activeStreamAccessToken = accessToken?.trim() || null;\n this.activeStreamConnection = this.aiApi.connectPatchStream(\n streamId,\n this.resolveLastEventIdForStream(streamId) || undefined,\n this.activeStreamAccessToken || undefined,\n );\n this.streamTerminalState = 'in_progress';\n this.streamTimelineMode = 'stream';\n\n const absoluteTimeoutMs = this.resolveStreamTimeoutMs(expiresAt);\n const idleTimeoutMs = this.resolveStreamIdleTimeoutMs();\n\n return await new Promise<AiOrchestratorResponse>((resolve, reject) => {\n let settled = false;\n let subscription: Subscription | null = null;\n let idleTimerId: ReturnType<typeof setTimeout> | null = null;\n const connection = this.activeStreamConnection;\n if (!connection) {\n reject(new Error('Stream connection unavailable.'));\n return;\n }\n\n const clearIdleTimer = () => {\n if (idleTimerId) {\n clearTimeout(idleTimerId);\n idleTimerId = null;\n }\n };\n\n const resetIdleTimer = () => {\n clearIdleTimer();\n idleTimerId = setTimeout(() => {\n if (settled) return;\n settled = true;\n this.streamTerminalState = 'failed';\n this.processingInfoVisible = false;\n subscription?.unsubscribe();\n this.closeActiveStreamConnection();\n reject(new AiPatchStreamConnectionError(\n 'transport',\n 'Patch stream inactive timeout.',\n ));\n }, idleTimeoutMs);\n };\n\n const absoluteTimerId = setTimeout(() => {\n if (settled) return;\n settled = true;\n this.streamTerminalState = 'expired';\n this.processingInfoVisible = false;\n clearIdleTimer();\n subscription?.unsubscribe();\n this.closeActiveStreamConnection();\n reject(new Error('Patch stream expired.'));\n }, absoluteTimeoutMs);\n\n resetIdleTimer();\n\n subscription = connection.events$.subscribe({\n next: (event) => {\n if (settled) return;\n try {\n resetIdleTimer();\n const terminal = this.applyStreamEvent(event);\n if (!terminal) {\n return;\n }\n settled = true;\n clearTimeout(absoluteTimerId);\n clearIdleTimer();\n subscription?.unsubscribe();\n this.closeActiveStreamConnection();\n resolve(terminal);\n } catch (error) {\n settled = true;\n clearTimeout(absoluteTimerId);\n clearIdleTimer();\n subscription?.unsubscribe();\n this.closeActiveStreamConnection();\n reject(error);\n }\n },\n error: (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(absoluteTimerId);\n clearIdleTimer();\n subscription?.unsubscribe();\n this.closeActiveStreamConnection();\n reject(error);\n },\n });\n });\n }\n\n private applyStreamEvent(event: AiPatchStreamEnvelope | null | undefined): AiOrchestratorResponse | null {\n if (!this.acceptStreamEvent(event)) return null;\n const schemaVersion = typeof event.eventSchemaVersion === 'string'\n ? event.eventSchemaVersion.trim()\n : '';\n if (schemaVersion !== 'v1') {\n throw new AiPatchStreamConnectionError(\n 'schema',\n `Unsupported stream schema version: ${schemaVersion || 'unknown'}.`,\n );\n }\n\n const payload = this.asRecord(event.payload);\n const message = this.extractStreamMessage(payload);\n\n if (event.type === 'status') {\n const state = typeof payload?.['state'] === 'string' ? payload?.['state'].trim().toLowerCase() : '';\n if (state === 'expired') {\n this.streamTerminalState = 'expired';\n this.markStreamStep(2, 'done', 'Stream expirado antes da finalização.');\n return {\n type: 'error',\n message: message || 'Stream expirado.',\n };\n }\n if (state === 'started') {\n this.markStreamStep(1, 'done', message || 'Pedido validado.');\n this.markStreamStep(2, 'active', 'Preparando proposta.');\n } else if (state === 'in_progress') {\n this.markStreamStep(2, 'active', message || 'Turno em processamento.');\n }\n this.streamTerminalState = 'in_progress';\n if (message) {\n this.aiExplanation = message;\n }\n this.processingInfoVisible = true;\n this.setState('processing');\n return null;\n }\n\n if (event.type === 'thought.step') {\n const step = Number(payload?.['step']);\n const stepStateRaw = typeof payload?.['state'] === 'string' ? payload['state'].trim().toLowerCase() : '';\n const stepState: StreamStepState =\n stepStateRaw === 'done'\n ? 'done'\n : stepStateRaw === 'pending'\n ? 'pending'\n : 'active';\n if (step === 1 || step === 2 || step === 3) {\n const detail = this.firstNonBlank(\n typeof payload?.['detail'] === 'string' ? payload['detail'] : null,\n typeof payload?.['title'] === 'string' ? payload['title'] : null,\n message,\n );\n this.markStreamStep(step, stepState, detail || undefined);\n }\n if (message) {\n this.aiExplanation = message;\n }\n if (this.streamTerminalState !== 'completed' && this.streamTerminalState !== 'cancelled' && this.streamTerminalState !== 'failed') {\n this.streamTerminalState = 'in_progress';\n this.processingInfoVisible = true;\n this.setState('processing');\n }\n return null;\n }\n\n if (event.type === 'heartbeat') {\n this.streamTerminalState = 'in_progress';\n this.processingInfoVisible = true;\n return null;\n }\n\n if (event.type === 'result') {\n this.streamTerminalState = 'completed';\n this.processingInfoVisible = false;\n const response = this.asRecord(payload?.['response']);\n if (!response) {\n return {\n type: 'error',\n message: 'Resposta de stream inválida.',\n };\n }\n return response as unknown as AiOrchestratorResponse;\n }\n\n if (event.type === 'cancelled') {\n this.streamTerminalState = 'cancelled';\n this.processingInfoVisible = false;\n this.markStreamStep(2, 'done', message || 'Solicitação cancelada.');\n return {\n type: 'error',\n code: 'CANCELLED',\n message: message || 'Solicitação cancelada.',\n };\n }\n\n if (event.type === 'error') {\n this.streamTerminalState = 'failed';\n this.processingInfoVisible = false;\n this.markStreamStep(2, 'done', message || 'Falha no processamento do stream.');\n return {\n type: 'error',\n message: message || 'Falha no processamento do stream.',\n };\n }\n\n return null;\n }\n\n private resolveStreamTimeoutMs(expiresAt?: string): number {\n const fallback = 90_000;\n if (!expiresAt) return fallback;\n const targetTs = Date.parse(expiresAt);\n if (!Number.isFinite(targetTs)) return fallback;\n const remaining = targetTs - Date.now();\n return remaining > 3_000 ? remaining : 3_000;\n }\n\n private resolveStreamIdleTimeoutMs(): number {\n return 30_000;\n }\n\n private acceptStreamEvent(event: AiPatchStreamEnvelope | null | undefined): event is AiPatchStreamEnvelope {\n if (!event || !event.type) {\n return false;\n }\n const streamId = (event.streamId || '').trim();\n if (!streamId) {\n return false;\n }\n if (this.activeStreamId && streamId !== this.activeStreamId) {\n return false;\n }\n\n const eventId = typeof event.eventId === 'string' ? event.eventId.trim() : '';\n if (eventId) {\n const eventKey = `${streamId}:${eventId}`;\n if (this.streamSeenEventIds.has(eventKey)) {\n return false;\n }\n this.streamSeenEventIds.add(eventKey);\n this.streamLastEventIdByStream.set(streamId, eventId);\n this.streamLastEventId = eventId;\n }\n\n if (Number.isFinite(event.seq) && event.seq > 0) {\n const lastSeq = this.streamLastSeqByStream.get(streamId) || 0;\n if (event.seq <= lastSeq) {\n return false;\n }\n this.streamLastSeqByStream.set(streamId, event.seq);\n if (this.activeStreamId === streamId) {\n this.streamLastSeq = Math.max(this.streamLastSeq, event.seq);\n }\n }\n return true;\n }\n\n private resolveLastEventIdForStream(streamId: string): string | null {\n const normalized = (streamId || '').trim();\n if (!normalized) return this.streamLastEventId;\n return this.streamLastEventIdByStream.get(normalized) || this.streamLastEventId;\n }\n\n private extractStreamMessage(payload: Record<string, unknown> | null): string {\n if (!payload) return '';\n const direct = payload['message'];\n if (typeof direct === 'string' && direct.trim()) {\n return direct.trim();\n }\n const nested = this.asRecord(payload['error']);\n const nestedMsg = nested?.['message'];\n if (typeof nestedMsg === 'string' && nestedMsg.trim()) {\n return nestedMsg.trim();\n }\n return '';\n }\n\n private requestStreamCancel(): void {\n if (!this.activeStreamId) {\n return;\n }\n const streamId = this.activeStreamId;\n const accessToken = this.activeStreamAccessToken || undefined;\n void firstValueFrom(this.aiApi.cancelPatchStream(streamId, accessToken)).catch(() => undefined);\n }\n\n private closeActiveStreamConnection(): void {\n if (this.activeStreamConnection) {\n this.activeStreamConnection.close();\n this.activeStreamConnection = null;\n }\n this.activeStreamId = null;\n this.activeStreamAccessToken = null;\n }\n\n private resetStreamTracking(): void {\n this.closeActiveStreamConnection();\n this.streamSeenEventIds = new Set<string>();\n this.streamLastSeqByStream = new Map<string, number>();\n this.streamLastEventIdByStream = new Map<string, string>();\n this.streamLastSeq = 0;\n this.streamLastEventId = null;\n this.streamTerminalState = 'idle';\n this.streamTimelineMode = 'snapshot';\n this.streamFallbackActive = false;\n this.initializeStreamTimeline();\n }\n\n private shouldFallbackToPatch(error: unknown): boolean {\n if (error instanceof AiPatchStreamConnectionError) {\n if (error.kind === 'unsupported') {\n return true;\n }\n if (error.kind === 'schema') {\n return true;\n }\n if (error.kind === 'http_status') {\n return [0, 404, 405, 406, 415, 500, 501, 502, 503, 504].includes(error.status || 0);\n }\n if (error.kind === 'transport') {\n return true;\n }\n if (error.kind === 'parse') {\n return false;\n }\n }\n if (error instanceof HttpErrorResponse) {\n return [0, 404, 405, 406, 415, 500, 501, 502, 503, 504].includes(error.status);\n }\n if (error instanceof Error) {\n const normalized = (error.message || '').toLowerCase();\n if (normalized.includes('forbidden')\n || normalized.includes('unauthorized')\n || normalized.includes('invalid')\n || normalized.includes('expired')\n || normalized.includes('cancel')\n || normalized.includes('conflict')) {\n return false;\n }\n if (normalized.includes('stream disabled')\n || normalized.includes('not supported')) {\n return true;\n }\n }\n return false;\n }\n\n private handlePatchResponse(\n result: AiOrchestratorResponse | null | undefined,\n configRoot: JsonMap,\n componentId: string,\n componentType: string,\n ): boolean {\n if (!result) {\n this.streamTerminalState = 'failed';\n this.errorMsg = 'Resposta vazia da IA.';\n this.setState('error');\n return true;\n }\n\n if (result.code === 'UNKNOWN_COMPONENT') {\n this.streamTerminalState = 'failed';\n this.errorMsg = result.message || 'Componente desconhecido.';\n this.setState('error');\n return true;\n }\n\n this.warnings = result.warnings || [];\n this.backendRiskLevel = this.normalizeRiskLevel(result.riskLevel);\n this.backendRequiresConfirmation = typeof result.requiresConfirmation === 'boolean'\n ? result.requiresConfirmation\n : null;\n\n if (result.type === 'clarification') {\n const questions = result.questions?.filter((q) => !!q && q.trim().length > 0) || [];\n if (questions.length && (!result.options || result.options.length === 0)\n && (!result.optionPayloads || result.optionPayloads.length === 0)) {\n this.enterClarificationWithQuestions(\n result.message,\n questions,\n configRoot,\n componentId,\n componentType,\n );\n this.applyClarificationUi(result);\n return true;\n }\n const enriched = this.enrichClarification(result, configRoot, componentId, componentType);\n this.enterClarification(\n enriched.message,\n enriched.options,\n configRoot,\n componentId,\n componentType,\n undefined,\n enriched.optionPayloads,\n );\n this.applyClarificationUi(enriched);\n return true;\n }\n\n if (result.type === 'info') {\n const message = result.message || result.explanation || 'Informacao gerada.';\n if (this.isProcessingMessage(message)) {\n this.streamTerminalState = 'in_progress';\n this.aiExplanation = message;\n this.setState('processing');\n this.processingInfoVisible = true;\n return true;\n }\n this.streamTerminalState = 'completed';\n this.aiExplanation = message;\n this.setState('success');\n this.processingInfoVisible = false;\n return true;\n }\n\n if (result.type === 'error') {\n if (result.code === 'CANCELLED') {\n this.streamTerminalState = 'cancelled';\n this.errorMsg = '';\n this.aiExplanation = result.message || 'Solicitação cancelada.';\n this.processingInfoVisible = false;\n this.setState('listening');\n return true;\n }\n this.streamTerminalState = 'failed';\n this.errorMsg = result.message || 'Falha ao gerar configuracao.';\n this.setState('error');\n return true;\n }\n\n if (result.patch) {\n this.streamTerminalState = 'completed';\n this.pendingPatch = result.patch;\n this.pendingDiff = Array.isArray(result.diff) ? result.diff : [];\n this.patchEditorText = this.serializePatch(result.patch);\n this.patchEditorError = '';\n this.patchEditorExpanded = false;\n this.patchPathEditorExpanded = false;\n this.patchPathEditorError = '';\n this.applyWarnings = [];\n this.syncPatchPathEdits();\n this.aiExplanation = result.explanation || '';\n return false;\n }\n\n if (result.message) {\n this.streamTerminalState = 'failed';\n this.errorMsg = result.message;\n this.setState('error');\n return true;\n }\n\n return false;\n }\n\n private initHistory(): void {\n this.historyContext = this.historyService.getContext();\n this.historyWarnings = this.buildHistoryWarnings(this.historyContext);\n this.restoreServerSessionId();\n if (!this.historyContext.storageAvailable) {\n this.historySessions = [];\n this.activeHistorySession = null;\n this.activeHistoryMessages = [];\n this.activeHistoryTotalMessages = 0;\n return;\n }\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n if (this.activeHistorySession && this.matchesHistoryContext(this.activeHistorySession)) {\n const messages = this.activeHistorySession.messages || [];\n this.activeHistoryMessages = this.sliceHistoryMessages(messages);\n this.activeHistoryTotalMessages = messages.length;\n return;\n }\n const mostRecent = this.historySessions[0]?.id;\n if (mostRecent) {\n this.selectHistorySession(mostRecent);\n }\n }\n\n private buildHistoryWarnings(context: AssistantHistoryContext): string[] {\n const warnings: string[] = [];\n if (!context.storageAvailable) {\n warnings.push('Histórico local indisponível neste navegador.');\n return warnings;\n }\n const missing = new Set(context.missing || []);\n if (missing.has('X-User-ID')) {\n warnings.push('X-User-ID não informado. Identidade será resolvida no servidor.');\n }\n if (missing.has('X-Tenant-ID')) {\n warnings.push('X-Tenant-ID não informado. Identidade será resolvida no servidor.');\n }\n if (missing.has('X-Env')) {\n warnings.push('X-Env não informado. Ambiente será resolvido no servidor.');\n }\n return warnings;\n }\n\n private matchesHistoryContext(session: AssistantHistorySession): boolean {\n if (!this.historyContext) return false;\n return session.tenantId === this.historyContext.tenantId\n && session.env === this.historyContext.env\n && session.userId === this.historyContext.userId;\n }\n\n private buildClientTurnId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `turn-${Math.random().toString(36).slice(2, 10)}`;\n }\n\n private buildUiContextRef(componentId: string, componentType: string): {\n componentId: string;\n componentType: string;\n routeKey?: string;\n schemaHash?: string;\n variantId?: string;\n } {\n const routeKey = this.resolveRouteKey();\n const schemaHash = this.resolveSchemaHash();\n return {\n componentId,\n componentType,\n ...(routeKey ? { routeKey } : {}),\n ...(schemaHash ? { schemaHash } : {}),\n ...(this.activeVariantId ? { variantId: this.activeVariantId } : {}),\n };\n }\n\n private buildCurrentStateDigest(runtimeState: unknown): {\n columns?: string[];\n sort?: string;\n rowCount?: number;\n } | undefined {\n const state = this.asRecord(runtimeState);\n if (!state) return undefined;\n const rawColumns = Array.isArray(state['columns']) ? state['columns'] : undefined;\n const columns = rawColumns\n ? rawColumns\n .map((item) => (item == null ? '' : String(item).trim()))\n .filter((item) => item.length > 0)\n : undefined;\n const sortValue = state['sort'];\n const sort = typeof sortValue === 'string' ? sortValue : undefined;\n const rowCountValue = state['rowCount'];\n const rowCount = typeof rowCountValue === 'number' && Number.isFinite(rowCountValue)\n ? rowCountValue\n : undefined;\n if (!columns && !sort && rowCount === undefined) return undefined;\n return {\n ...(columns ? { columns } : {}),\n ...(sort ? { sort } : {}),\n ...(rowCount !== undefined ? { rowCount } : {}),\n };\n }\n\n private inferAiMode(\n runtimeState: JsonMap | undefined,\n configRoot: JsonMap,\n ): string | undefined {\n const widgetsCount = Number(runtimeState?.['widgetsCount'] ?? 0);\n const connectionsCount = Number(runtimeState?.['connectionsCount'] ?? 0);\n const configEmpty = !configRoot || Object.keys(configRoot).length === 0;\n const hasStructure = widgetsCount > 0 || connectionsCount > 0;\n if (!hasStructure && configEmpty) return 'create';\n if (hasStructure) return 'edit';\n return undefined;\n }\n\n private resolveRouteKey(): string | undefined {\n try {\n if (typeof window === 'undefined') return undefined;\n const path = window.location?.pathname || '';\n return path || undefined;\n } catch {\n return undefined;\n }\n }\n\n private resolveSchemaHash(): string | undefined {\n try {\n type AdapterWithSchemaHash = { getSchemaHash?: () => unknown };\n const hash = (this.adapter as unknown as AdapterWithSchemaHash)?.getSchemaHash?.();\n return typeof hash === 'string' && hash.trim() ? hash.trim() : undefined;\n } catch {\n return undefined;\n }\n }\n\n private checkSessionStorage(): boolean {\n if (typeof localStorage === 'undefined') return false;\n try {\n const key = `${AI_SESSION_STORAGE_PREFIX}.probe`;\n localStorage.setItem(key, '1');\n localStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n }\n\n private resolveSessionStorageKey(): string | null {\n const componentId = this.resolveComponentId();\n const componentType = this.resolveComponentType();\n if (!componentId || !componentType) return null;\n const context = this.historyContext || this.aiApi.getHeaderContext();\n return `${AI_SESSION_STORAGE_PREFIX}:${context.tenantId}:${context.env}:${context.userId}:${componentType}:${componentId}`;\n }\n\n private restoreServerSessionId(): void {\n if (!this.sessionStorageAvailable) return;\n const key = this.resolveSessionStorageKey();\n if (!key) return;\n try {\n const stored = localStorage.getItem(key);\n this.activeServerSessionId = stored && stored.trim() ? stored.trim() : null;\n } catch {\n this.activeServerSessionId = null;\n }\n }\n\n private persistServerSessionId(sessionId: string | null): void {\n if (!this.sessionStorageAvailable) return;\n const key = this.resolveSessionStorageKey();\n if (!key) return;\n try {\n if (sessionId && sessionId.trim()) {\n localStorage.setItem(key, sessionId.trim());\n } else {\n localStorage.removeItem(key);\n }\n } catch {\n // ignore storage errors\n }\n }\n\n private appendHistoryMessage(\n role: AssistantHistoryMessage['role'],\n text: string,\n context?: AssistantHistoryMessage['context'],\n ): void {\n if (!this.historyContext) return;\n if (!this.activeHistorySession) {\n this.startNewSession(false);\n }\n if (!this.activeHistorySession) return;\n const updated = this.historyService.addMessage(this.historyContext, this.activeHistorySession.id, role, text, context);\n if (updated) {\n this.activeHistorySession = updated;\n const messages = updated.messages || [];\n this.activeHistoryMessages = this.sliceHistoryMessages(messages);\n this.activeHistoryTotalMessages = messages.length;\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n }\n }\n\n private appendHistoryAssistantResponse(\n result: AiOrchestratorResponse | null | undefined,\n componentId: string,\n componentType: string,\n ): void {\n const text = this.resolveAssistantSummary(result);\n if (!text) return;\n this.appendHistoryMessage('assistant', text, {\n componentId,\n componentType,\n usedRag: this.resolveUsedRag(result),\n });\n }\n\n private resolveAssistantSummary(result: AiOrchestratorResponse | null | undefined): string {\n if (!result) return '';\n const text = (result.explanation || result.message || '').trim();\n if (text) return text;\n if (result.type === 'clarification') {\n return 'Faltam informações para concluir a proposta.';\n }\n if (result.type === 'error') {\n return 'Falha ao gerar configuração.';\n }\n if (result.patch) {\n return this.aiExplanation || 'Proposta pronta para revisão.';\n }\n return '';\n }\n\n private isProcessingMessage(message: string): boolean {\n const normalized = (message || '').toLowerCase();\n return normalized.includes('processamento') || normalized.includes('in progress') || normalized.includes('in_progress');\n }\n\n async retryProcessing(): Promise<void> {\n if (this.state !== 'processing') return;\n this.cancelProcessing();\n await this.submitPrompt();\n }\n\n private cancelProcessing(message?: string): void {\n if (this.state === 'processing') {\n this.requestStreamCancel();\n }\n this.closeActiveStreamConnection();\n this.streamTerminalState = 'cancelled';\n this.processingInfoVisible = false;\n this.errorMsg = '';\n if (message) {\n this.aiExplanation = message;\n }\n this.setState('listening');\n this.cdr.markForCheck();\n }\n\n private withSnapshotFallbackDetail(detail: string): string {\n if (!this.streamFallbackActive) return detail;\n const fallback = 'Stream indisponível nesta solicitação. Operando em modo snapshot.';\n const clean = (detail || '').trim();\n return clean ? `${fallback} ${clean}` : fallback;\n }\n\n private resolveUsedRag(result: AiOrchestratorResponse | null | undefined): boolean {\n return Array.isArray(result?.contextRequest) && result.contextRequest.length > 0;\n }\n\n private sliceHistoryMessages(messages: AssistantHistoryMessage[]): AssistantHistoryMessage[] {\n if (!messages.length) return [];\n return messages.slice(-this.maxHistoryMessages);\n }\n\n private applyClarificationUi(result?: AiOrchestratorResponse | null): void {\n const ui = result?.clarification;\n const hasOptions = this.clarificationOptions.length > 0;\n const responseType = ui?.responseType || (hasOptions ? 'choice' : 'text');\n const selectionMode = ui?.selectionMode || 'single';\n const allowCustom = ui?.allowCustom ?? (responseType === 'mixed' || responseType === 'text');\n\n this.clarificationResponseType = responseType;\n this.clarificationSelectionMode = selectionMode;\n this.clarificationAllowCustom = allowCustom;\n this.clarificationPresentation = ui?.presentation || this.resolveClarificationPresentation(responseType, selectionMode, hasOptions);\n const hasEndpoint = this.clarificationOptions.some((opt) => this.isEndpointOption(opt));\n if (hasEndpoint) {\n this.clarificationPresentation = 'list';\n }\n\n if (responseType === 'confirm' && !hasOptions) {\n this.clarificationOptions = [\n { label: 'Sim', value: 'Sim' },\n { label: 'Não', value: 'Não' },\n ];\n }\n if (responseType === 'context') {\n this.clarificationOptions = [];\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n this.clarificationAllowCustom = false;\n }\n }\n\n private resolveClarificationPresentation(\n responseType: 'text' | 'choice' | 'confirm' | 'mixed' | 'context',\n selectionMode: 'single' | 'multiple',\n hasOptions: boolean,\n ): 'buttons' | 'list' | 'chips' {\n if (!hasOptions) return 'chips';\n if (responseType === 'confirm') return 'buttons';\n if (selectionMode === 'multiple') return 'buttons';\n return 'chips';\n }\n\n private resetAssistantStateForSession(): void {\n if (!this.isOpen) return;\n this.setState('listening');\n this.userPrompt = '';\n this.aiExplanation = '';\n this.pendingPatch = null;\n this.pendingDiff = [];\n this.patchEditorText = '';\n this.patchEditorError = '';\n this.patchEditorExpanded = false;\n this.patchPathEditorExpanded = false;\n this.patchPathEdits = [];\n this.patchPathEditorError = '';\n this.applyWarnings = [];\n this.lastApplyAt = null;\n this.backendRiskLevel = null;\n this.backendRequiresConfirmation = null;\n this.errorMsg = '';\n this.warnings = [];\n this.suggestionsWarnings = [];\n this.clarificationOptions = [];\n this.clarificationMessage = '';\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n this.clarificationBasePrompt = null;\n this.activeVariantId = null;\n this.activeSuggestion = null;\n this.activeContextHints = null;\n this.activeResourcePath = null;\n this.skipClarificationAppend = false;\n this.clarificationResponseType = 'text';\n this.clarificationSelectionMode = 'single';\n this.clarificationAllowCustom = true;\n this.clarificationPresentation = 'list';\n this.selectedClarificationOptions = [];\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.dismissedSuggestionIds = new Set<string>();\n this.processingStartedAt = null;\n this.lastProcessingDurationMs = null;\n setTimeout(() => this.inputElement?.nativeElement?.focus(), 50);\n }\n\n private setHistoryUndo(session: AssistantHistorySession): void {\n this.historyUndoDeleteSession = session;\n this.clearHistoryUndoTimer();\n this.historyUndoTimerId = setTimeout(() => {\n this.historyUndoDeleteSession = null;\n this.historyUndoTimerId = null;\n this.cdr.markForCheck();\n }, 8000);\n }\n\n private clearPendingHistoryUndo(): void {\n this.historyUndoDeleteSession = null;\n this.clearHistoryUndoTimer();\n }\n\n private clearHistoryUndoTimer(): void {\n if (!this.historyUndoTimerId) return;\n clearTimeout(this.historyUndoTimerId);\n this.historyUndoTimerId = null;\n }\n\n private pruneDismissedSuggestions(): void {\n if (!this.dismissedSuggestionIds.size) return;\n if (!this.richSuggestions.length) {\n this.dismissedSuggestionIds = new Set<string>();\n return;\n }\n const allowedIds = new Set(this.richSuggestions.map((item) => item.id));\n const next = new Set(\n Array.from(this.dismissedSuggestionIds).filter((id) => allowedIds.has(id)),\n );\n if (next.size !== this.dismissedSuggestionIds.size) {\n this.dismissedSuggestionIds = next;\n }\n }\n\n private async confirmHistoryClear(): Promise<boolean> {\n if (typeof window === 'undefined') return true;\n return this.openConfirmationDialog({\n title: 'Limpar histórico local',\n message: 'Deseja remover todas as sessões salvas localmente para este usuário?',\n confirmLabel: 'Limpar histórico',\n cancelLabel: 'Cancelar',\n confirmColor: 'warn',\n });\n }\n\n private enterClarification(\n message: string | null | undefined,\n options: string[] | null | undefined,\n configRoot: JsonMap,\n componentId: string | null,\n componentType: string | null,\n basePrompt?: string,\n optionPayloads?: Array<{ value?: string | null; label?: string | null; example?: string | null; contextHints?: AiJsonObject | null }> | null,\n ): void {\n this.setState('clarification');\n this.clarificationMessage = message || 'Preciso de mais detalhes para continuar.';\n const base = (basePrompt ?? this.userPrompt).trim();\n this.clarificationBasePrompt = base || null;\n this.userPrompt = '';\n this.activeContextHints = null;\n this.activeResourcePath = null;\n this.clarificationOptions = this.resolveClarificationOptions(\n options,\n optionPayloads,\n configRoot,\n componentId || '',\n componentType || '',\n );\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n this.selectedClarificationOptions = [];\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.applyClarificationUi();\n if (this.clarificationSelectionMode === 'single' && this.clarificationOptions.length === 1) {\n this.selectedClarificationOptions = [this.clarificationOptions[0]];\n }\n this.cdr.markForCheck();\n }\n\n private enterClarificationWithOptions(\n message: string,\n options: ClarificationRichOption[],\n basePrompt?: string,\n ): void {\n this.setState('clarification');\n this.clarificationMessage = message || 'Preciso de mais detalhes para continuar.';\n const base = (basePrompt ?? this.userPrompt).trim();\n this.clarificationBasePrompt = base || null;\n this.userPrompt = '';\n this.activeContextHints = null;\n this.activeResourcePath = null;\n this.clarificationOptions = options;\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n this.selectedClarificationOptions = [];\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.applyClarificationUi();\n if (this.clarificationSelectionMode === 'single' && this.clarificationOptions.length === 1) {\n this.selectedClarificationOptions = [this.clarificationOptions[0]];\n }\n this.cdr.markForCheck();\n }\n\n private enterClarificationWithQuestions(\n message: string | null | undefined,\n questions: string[],\n configRoot: JsonMap,\n componentId: string | null,\n componentType: string | null,\n ): void {\n this.setState('clarification');\n this.clarificationMessage = message || 'Preciso de mais detalhes para continuar.';\n const base = (this.userPrompt || '').trim();\n this.clarificationBasePrompt = base || null;\n this.userPrompt = '';\n this.activeContextHints = null;\n this.activeResourcePath = null;\n this.clarificationOptions = [];\n this.clarificationQuestions = questions;\n this.clarificationAnswers = new Array(questions.length).fill('');\n this.selectedClarificationOptions = [];\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.applyClarificationUi();\n this.cdr.markForCheck();\n }\n\n private resolveClarificationOptions(\n options: string[] | null | undefined,\n optionPayloads: Array<{ value?: string | null; label?: string | null; example?: string | null; contextHints?: AiJsonObject | null }> | null | undefined,\n configRoot: JsonMap,\n componentId: string,\n componentType: string,\n ): ClarificationRichOption[] {\n const payloads = (optionPayloads || [])\n .map((opt) => ({\n label: (opt.label || opt.value || '').trim(),\n value: (opt.value || opt.label || '').trim(),\n example: opt.example || undefined,\n contextHints: this.toClarificationContextHints(opt.contextHints),\n }))\n .filter((opt) => opt.label.length > 0 && opt.value.length > 0);\n\n if (payloads.length) return payloads;\n\n const normalized = (options || [])\n .map((opt) => (opt != null ? String(opt).trim() : ''))\n .filter((opt) => opt.length > 0)\n .map((opt) => ({\n label: opt,\n value: this.extractOptionValue(opt),\n }));\n\n if (normalized.length) return normalized;\n\n if (this.isTable(componentId, componentType)) {\n return this.extractColumnNames(configRoot).map((name) => ({ label: name, value: name }));\n }\n if (this.isForm(componentId, componentType)) {\n return this.extractFieldNames(configRoot).map((name) => ({ label: name, value: name }));\n }\n return [];\n }\n\n private enrichClarification(\n result: AiOrchestratorResponse,\n configRoot: JsonMap,\n componentId: string,\n componentType: string,\n ): AiOrchestratorResponse {\n const hasOptions = (result.options && result.options.length > 0) || (result.optionPayloads && result.optionPayloads.length > 0);\n if (hasOptions || !this.isTable(componentId, componentType)) {\n return result;\n }\n if (this.needsValueColorClarification(result.message)) {\n const optionPayloads = this.buildValueColorClarificationPayloads(configRoot, this.userPrompt);\n if (!optionPayloads.length) return result;\n return { ...result, optionPayloads };\n }\n if (!this.needsRuleClarification(result.message)) {\n return result;\n }\n const optionPayloads = this.buildRuleClarificationPayloads(configRoot, this.userPrompt);\n if (!optionPayloads.length) return result;\n return { ...result, optionPayloads };\n }\n\n private buildClarificationAnswers(fallbackAnswer: string): string {\n const pairs = this.clarificationQuestions\n .map((question, index) => {\n const answer = (this.clarificationAnswers[index] || '').trim();\n if (!answer) return null;\n return `${question}: ${answer}`;\n })\n .filter((entry): entry is string => !!entry);\n\n if (pairs.length) {\n return pairs.join('; ');\n }\n if (fallbackAnswer) {\n return fallbackAnswer;\n }\n return 'sem resposta';\n }\n\n private needsRuleClarification(message?: string | null): boolean {\n if (!message) return false;\n return /\\brules\\b/i.test(message) || /\\bregras\\b/i.test(message);\n }\n\n private needsValueColorClarification(message?: string | null): boolean {\n if (!message) return false;\n return /\\bvalues[_\\s-]?and[_\\s-]?colors\\b/i.test(message)\n || /\\bvalues[_\\s-]?colors\\b/i.test(message)\n || /\\bvalores[_\\s-]?e[_\\s-]?cores\\b/i.test(message)\n || /\\bbadge\\.values\\b/i.test(message);\n }\n\n private needsBadgeValueClarification(suggestion: AiSuggestion): boolean {\n const missing = this.normalizeMissingContext(suggestion.missingContext);\n if (!missing.length) return false;\n const requiresValuesAndColors = missing.includes('values_and_colors');\n const requiresValuesOnly = missing.includes('badge.values');\n if (!requiresValuesAndColors && !requiresValuesOnly) return false;\n const badgeHints = this.resolveBadgeContextHints(\n this.toClarificationContextHints(suggestion.contextHints) ?? null,\n );\n if (requiresValuesAndColors) {\n return !this.hasBadgeField(badgeHints) || !this.hasBadgeValues(badgeHints) || !this.hasBadgeColors(badgeHints);\n }\n return !this.hasBadgeField(badgeHints) || !this.hasBadgeValues(badgeHints);\n }\n\n private normalizeMissingContext(missingContext?: string[]): string[] {\n return (missingContext || [])\n .map((value) => (value != null ? String(value).trim().toLowerCase() : ''))\n .filter((value) => value.length > 0);\n }\n\n private resolveBadgeContextHints(\n contextHints: AiJsonObject | null | undefined,\n ): AiJsonObject | null {\n if (!contextHints || typeof contextHints !== 'object') return null;\n const badge = this.asRecord(contextHints['badge']);\n if (badge) return this.toAiJsonObject(badge);\n const candidate = contextHints;\n const hasBadgeKeys = ['field', 'values', 'valueColorMap', 'palette', 'inferredType', 'explicitType']\n .some((key) => Object.prototype.hasOwnProperty.call(candidate, key));\n return hasBadgeKeys ? candidate : null;\n }\n\n private hasBadgeValues(badgeHints: AiJsonObject | null): boolean {\n if (!badgeHints) return false;\n const values = badgeHints['values'];\n if (Array.isArray(values) && values.length > 0) return true;\n const valueColorMap = this.asRecord(badgeHints['valueColorMap']);\n return !!valueColorMap && Object.keys(valueColorMap).length > 0;\n }\n\n private hasBadgeColors(badgeHints: AiJsonObject | null): boolean {\n if (!badgeHints) return false;\n const valueColorMap = this.asRecord(badgeHints['valueColorMap']);\n if (valueColorMap && Object.keys(valueColorMap).length > 0) return true;\n const palette = badgeHints['palette'];\n return Array.isArray(palette) && palette.length > 0;\n }\n\n private hasBadgeField(badgeHints: AiJsonObject | null): boolean {\n if (!badgeHints) return false;\n const field = badgeHints['field'];\n return typeof field === 'string' && field.trim().length > 0;\n }\n\n private mergeContextHints(\n base?: unknown | null,\n override?: unknown | null,\n ): ClarificationContextHints | null {\n const baseHints = this.toAiJsonObject(base);\n const overrideHints = this.toAiJsonObject(override);\n if (!Object.keys(baseHints).length && !Object.keys(overrideHints).length) return null;\n const merged: AiJsonObject = { ...baseHints, ...overrideHints };\n const baseBadge = this.asRecord(baseHints['badge']);\n const overrideBadge = this.asRecord(overrideHints['badge']);\n if (baseBadge || overrideBadge) {\n merged['badge'] = this.toAiJsonObject({ ...(baseBadge || {}), ...(overrideBadge || {}) });\n }\n const baseComputed = this.asRecord(baseHints['computed']);\n const overrideComputed = this.asRecord(overrideHints['computed']);\n if (baseComputed || overrideComputed) {\n merged['computed'] = this.toAiJsonObject({ ...(baseComputed || {}), ...(overrideComputed || {}) });\n }\n return this.toClarificationContextHints(merged) ?? null;\n }\n\n private setResourcePathHint(resourcePath: string): void {\n const raw = (resourcePath || '').trim();\n const normalized = this.normalizeResourcePath(raw);\n if (!normalized) return;\n this.activeResourcePath = normalized;\n this.activeContextHints = this.mergeContextHints(this.activeContextHints, {\n resourcePath: normalized,\n resourcePathRaw: raw,\n });\n }\n\n private clearResourcePathHint(): void {\n this.activeResourcePath = null;\n if (!this.activeContextHints) return;\n const { resourcePath, resourcePathRaw, ...rest } = this.activeContextHints;\n const remaining = this.toClarificationContextHints(rest);\n this.activeContextHints = remaining ?? null;\n }\n\n private matchClarificationOptionPath(answer: string): string | null {\n if (!answer || !this.clarificationOptions.length) return null;\n const normalized = answer.trim().toLowerCase();\n if (!normalized) return null;\n const match = this.clarificationOptions.find((opt) =>\n String(opt?.label || '').trim().toLowerCase() === normalized,\n );\n if (!match) return null;\n if (this.extractResourcePath(match.value)) return match.value;\n return null;\n }\n\n private normalizeResourcePath(value: string): string | null {\n let raw = (value || '').trim();\n if (!raw) return null;\n if (raw.includes('://')) {\n try {\n const url = new URL(raw);\n raw = url.pathname || '';\n } catch {\n return null;\n }\n }\n raw = raw.replace(/[)\\].,;:!?]+$/g, '');\n raw = raw.replace(/^\\/+/, '').trim();\n return raw ? `/${raw}` : null;\n }\n\n private extractResourcePath(text: string): string | null {\n if (!text) return null;\n const direct = text.match(/(\\/api\\/[A-Za-z0-9._~\\-\\/]+)/);\n if (direct?.[1]) return direct[1].replace(/[)\\].,;:!?]+$/g, '');\n const loose = text.match(/\\bapi\\/[A-Za-z0-9._~\\-\\/]+/);\n if (loose?.[0]) return `/${loose[0].replace(/[)\\].,;:!?]+$/g, '')}`;\n return null;\n }\n\n private asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n }\n\n private toAiJsonObject(value: unknown, seen = new WeakSet<object>()): AiJsonObject {\n const record = this.asRecord(value);\n if (!record) return {};\n if (seen.has(record)) return {};\n seen.add(record);\n const normalized: AiJsonObject = {};\n for (const [key, entry] of Object.entries(record)) {\n if (entry === undefined) continue;\n normalized[key] = this.toAiJsonValue(entry, seen);\n }\n return normalized;\n }\n\n private toAiJsonValue(value: unknown, seen: WeakSet<object>): AiJsonValue {\n if (value == null) return null;\n if (typeof value === 'string' || typeof value === 'boolean') return value;\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'bigint') return String(value);\n if (Array.isArray(value)) return value.map((entry) => this.toAiJsonValue(entry, seen));\n const record = this.asRecord(value);\n if (record) return this.toAiJsonObject(record, seen);\n return String(value);\n }\n\n private toClarificationContextHints(value: unknown): ClarificationContextHints | undefined {\n const normalized = this.toAiJsonObject(value);\n if (!Object.keys(normalized).length) return undefined;\n return normalized as ClarificationContextHints;\n }\n\n private firstNonBlank(...values: Array<string | null | undefined>): string {\n for (const value of values) {\n if (typeof value !== 'string') continue;\n const normalized = value.trim();\n if (normalized) return normalized;\n }\n return '';\n }\n\n private buildRuleClarificationPayloads(\n configRoot: JsonMap,\n prompt: string,\n ): ClarificationRichOption[] {\n if (!this.adapter?.getDataProfile) return [];\n const columns = this.extractColumnNames(configRoot);\n const targetField = this.findColumnInPrompt(prompt, columns);\n if (!targetField) return [];\n const profile = this.adapter.getDataProfile();\n const stats = profile?.columns?.[targetField] as\n | { topValues?: unknown[]; cardinality?: number }\n | undefined;\n const rawValues = Array.isArray(stats?.topValues) ? stats.topValues : [];\n const normalized = rawValues\n .map((v) => (v != null ? String(v).trim() : ''))\n .filter((v) => v.length > 0);\n const unique = Array.from(new Set(normalized));\n if (!unique.length) return [];\n const maxValues = 4;\n const values = unique.slice(0, maxValues);\n const suffix = typeof stats?.cardinality === 'number' && stats.cardinality > values.length ? ', ...' : '';\n const list = `${values.join(', ')}${suffix}`;\n return [\n {\n label: `Usar valores detectados (${list})`,\n value: `Valores da coluna ${targetField}: ${list}. Crie regras de badge com cores distintas para cada valor.`,\n example: values.length ? `${targetField} == '${values[0]}' -> badge azul` : undefined,\n },\n ];\n }\n\n private buildValueColorClarificationPayloads(\n configRoot: JsonMap,\n prompt: string,\n ): ClarificationRichOption[] {\n const columns = this.extractColumnNames(configRoot);\n const targetField = this.findColumnInPrompt(prompt, columns);\n if (!targetField) return [];\n const context = this.resolveBadgeValuesContext(targetField);\n if (!context || !context.values.length) return [];\n const palette = ['primary', 'accent', 'warn', 'success', 'info'];\n const maxValues = 5;\n const values = context.values.slice(0, maxValues);\n const valueColorMap = this.buildValueColorMap(values, palette);\n const pairs = values.map((value) => `${value}=${valueColorMap[value]}`);\n const suffix = typeof context.cardinality === 'number' && context.cardinality > values.length ? ', ...' : '';\n const list = `${pairs.join(', ')}${suffix}`;\n const badgeHints: AiJsonObject = {\n field: targetField,\n values,\n valueColorMap,\n palette,\n };\n if (context.inferredType) {\n badgeHints['inferredType'] = context.inferredType;\n }\n if (context.explicitType) {\n badgeHints['explicitType'] = context.explicitType;\n }\n return [\n {\n label: `Usar valores detectados (${list})`,\n value: `Valores da coluna ${targetField}: ${list}. Use essas cores nos badges.`,\n example: values.length ? `${targetField} == '${values[0]}' -> badge ${palette[0]}` : undefined,\n contextHints: this.toClarificationContextHints({ badge: badgeHints }),\n },\n ];\n }\n\n private resolveBadgeValuesContext(\n targetField: string,\n ): { values: string[]; inferredType?: string; explicitType?: string; cardinality?: number } | null {\n let values: string[] = [];\n let inferredType: string | undefined;\n let explicitType: string | undefined;\n let cardinality: number | undefined;\n\n if (this.adapter?.getDataProfile) {\n const profile = this.adapter.getDataProfile();\n const stats = profile?.columns?.[targetField] as\n | { topValues?: unknown[]; cardinality?: number; inferredType?: string }\n | undefined;\n values = this.normalizeStringList(Array.isArray(stats?.topValues) ? stats.topValues : []);\n if (typeof stats?.inferredType === 'string') {\n inferredType = stats.inferredType;\n }\n if (typeof stats?.cardinality === 'number') {\n cardinality = stats.cardinality;\n }\n }\n\n if (!values.length) {\n const schemaField = this.resolveSchemaField(targetField);\n explicitType = typeof schemaField?.type === 'string' ? schemaField.type : undefined;\n values = this.extractSchemaValues(schemaField);\n if (values.length) {\n cardinality = values.length;\n }\n }\n\n if (!values.length) return null;\n return { values, inferredType, explicitType, cardinality };\n }\n\n private resolveSchemaField(targetField: string): JsonMap | null {\n if (!this.adapter?.getSchemaFields) return null;\n const schemaFields = this.adapter.getSchemaFields() || [];\n return schemaFields.find((field) => String(field?.name) === targetField) || null;\n }\n\n private extractSchemaValues(schemaField: JsonMap | null | undefined): string[] {\n if (!schemaField || typeof schemaField !== 'object') return [];\n const enumValues = this.normalizeStringList(\n Array.isArray(schemaField['enumValues']) ? schemaField['enumValues'] : [],\n );\n if (enumValues.length) return enumValues;\n const options = Array.isArray(schemaField['options']) ? schemaField['options'] : [];\n if (!options.length) return [];\n const optionValueKey = this.normalizeOptionKey(schemaField['optionValueKey']);\n const optionLabelKey = this.normalizeOptionKey(schemaField['optionLabelKey']);\n const values = options\n .map((option) => this.extractOptionValueFromSchema(option, optionValueKey, optionLabelKey))\n .filter((value): value is string => !!value);\n return this.normalizeStringList(values);\n }\n\n private extractOptionValueFromSchema(\n option: unknown,\n optionValueKey: string | null,\n optionLabelKey: string | null,\n ): string | null {\n if (option == null) return null;\n if (typeof option === 'string' || typeof option === 'number' || typeof option === 'boolean') {\n const text = String(option).trim();\n return text.length ? text : null;\n }\n if (typeof option === 'object') {\n const candidate = option as Record<string, unknown>;\n const rawValue = optionValueKey ? candidate[optionValueKey] : candidate['key'];\n const rawLabel = optionLabelKey ? candidate[optionLabelKey] : candidate['value'];\n const fallback = rawValue ?? rawLabel ?? candidate['value'] ?? candidate['key'];\n if (fallback == null) return null;\n const text = String(fallback).trim();\n return text.length ? text : null;\n }\n return null;\n }\n\n private normalizeOptionKey(value: unknown): string | null {\n const text = value != null ? String(value).trim() : '';\n return text.length ? text : null;\n }\n\n private normalizeStringList(values: unknown[]): string[] {\n const unique = new Set<string>();\n const output: string[] = [];\n for (const value of values) {\n const text = value != null ? String(value).trim() : '';\n if (!text || unique.has(text)) continue;\n unique.add(text);\n output.push(text);\n }\n return output;\n }\n\n private buildValueColorMap(values: string[], palette: string[]): Record<string, string> {\n const colors = palette.length ? palette : ['primary', 'accent', 'warn', 'success', 'info'];\n return values.reduce<Record<string, string>>((acc, value, index) => {\n acc[value] = colors[index % colors.length];\n return acc;\n }, {});\n }\n\n private findColumnInPrompt(prompt: string, columns: string[]): string | null {\n const text = (prompt || '').toLowerCase();\n if (!text || !columns.length) return null;\n const matches = columns.filter((col) => text.includes(col.toLowerCase()));\n if (matches.length === 1) return matches[0];\n return null;\n }\n\n private extractOptionValue(option: string): string {\n const match = option.match(/\\(([^)]+)\\)/);\n if (match && match[1]) {\n const candidate = match[1].trim();\n if (candidate && /^[A-Za-z0-9|._-]+$/.test(candidate)) {\n return candidate;\n }\n }\n return option;\n }\n\n private buildMaskSelectionHints(optionText: string, basePrompt: string): ClarificationContextHints | null {\n const mask = this.extractMaskFromText(optionText);\n if (!mask) return null;\n const configRoot = this.resolveConfigRoot(this.adapter?.getCurrentConfig?.());\n const columns = this.extractColumnNames(configRoot);\n let targetField = basePrompt ? this.findColumnInPrompt(basePrompt, columns) : null;\n if (!targetField) {\n targetField = this.findColumnInPrompt(optionText, columns);\n }\n if (!targetField && columns.length) {\n const lowered = `${basePrompt} ${optionText}`.toLowerCase();\n if (lowered.includes('cpf') && columns.includes('cpf')) targetField = 'cpf';\n if (lowered.includes('cnpj') && columns.includes('cnpj')) targetField = 'cnpj';\n if (lowered.includes('cep') && columns.includes('cep')) targetField = 'cep';\n }\n const hints: AiJsonObject = {\n optionSelected: {\n selection: { value: mask, mode: 'mask' },\n },\n };\n if (targetField) {\n const optionSelected = this.asRecord(hints['optionSelected']);\n if (optionSelected) {\n optionSelected['targetField'] = targetField;\n }\n }\n return this.toClarificationContextHints(hints) ?? null;\n }\n\n private extractMaskFromText(text: string): string | null {\n const pattern = /(0{3}\\.0{3}\\.0{3}-0{2}|0{2}\\.0{3}\\.0{3}\\/0{4}-0{2}|0{5}-0{3}|\\(0{2}\\)\\s*0{4,5}-0{4}|0{8,14})/;\n const match = text.match(pattern);\n return match ? match[1] : null;\n }\n\n private resolveComponentId(): string | null {\n if (this.adapter.componentId) return this.adapter.componentId;\n const name = (this.adapter.componentName || '').toLowerCase();\n if (name.includes('table')) return 'praxis-table';\n if (name.includes('form')) return 'praxis-dynamic-form';\n return null;\n }\n\n private resolveComponentType(): string | null {\n if (this.adapter.componentType) return this.adapter.componentType;\n const componentId = this.resolveComponentId();\n if (componentId === 'praxis-table') return 'table';\n if (componentId === 'praxis-dynamic-form') return 'form';\n return null;\n }\n\n private buildSuggestionsRequest(\n componentId: string,\n componentType: string,\n configRoot: JsonMap,\n capabilities: unknown[],\n dataProfile: JsonMap | null,\n schemaFields: JsonMap[] | undefined,\n runtimeState: JsonMap | undefined,\n suggestionContext: JsonMap | undefined,\n forceRefresh: boolean,\n policy?: SuggestionPolicy,\n ): AiSuggestionsRequest {\n const resolvedSuggestionContext = suggestionContext ?? this.adapter.getSuggestionContext?.();\n const currentState = this.toAiJsonObject({\n config: configRoot,\n capabilities,\n ...(schemaFields && schemaFields.length > 0 ? { schemaFields } : {}),\n ...(runtimeState !== undefined ? { runtimeState } : {}),\n ...(policy ? { suggestionPolicy: policy } : {}),\n ...(resolvedSuggestionContext ? { suggestionContext: resolvedSuggestionContext } : {}),\n });\n return {\n componentId,\n componentType,\n currentState,\n dataProfile: dataProfile ? this.toAiJsonObject(dataProfile) : null,\n maxSuggestions: 5,\n forceRefresh,\n locale: this.resolveLocale(),\n };\n }\n\n private resolveLocale(): string | undefined {\n if (typeof navigator !== 'undefined' && navigator.language) {\n return navigator.language;\n }\n return undefined;\n }\n\n private resolveConfigRoot(value: unknown): JsonMap {\n const candidate = this.asRecord(value);\n if (!candidate) return {};\n const nestedConfig = this.asRecord(candidate['config']);\n if (nestedConfig) {\n return nestedConfig;\n }\n const inputs = this.asRecord(candidate['inputs']);\n const nestedFromInputs = this.asRecord(inputs?.['config']);\n if (nestedFromInputs) {\n return nestedFromInputs;\n }\n return candidate;\n }\n\n private async resolveMockMode(): Promise<boolean> {\n try {\n const config = (await firstValueFrom(this.aiApi.loadGlobalAiConfig())) as GlobalAiConfigExtended | null;\n this.effectiveRiskPolicy = this.resolveConfiguredRiskPolicy(config);\n if (!this.hasProviderOverride(config)) {\n return await this.resolveMockModeFromStatus();\n }\n const provider = (config?.provider || '').toLowerCase();\n if (provider === 'mock') return true;\n const hasKey = !!config?.apiKey || !!config?.hasApiKey || !!config?.apiKeyLast4;\n return !hasKey;\n } catch {\n this.effectiveRiskPolicy = this.resolveConfiguredRiskPolicy(null);\n return true;\n }\n }\n\n private resolveConfiguredRiskPolicy(config: GlobalAiConfigExtended | null | undefined): RiskPolicy {\n const fromInput = this.normalizeRiskPolicy(this.riskPolicy);\n if (fromInput) return fromInput;\n const fromConfig = this.normalizeRiskPolicy(config?.riskPolicy);\n return fromConfig || 'strict';\n }\n\n private getEffectiveRiskPolicy(): RiskPolicy {\n return this.normalizeRiskPolicy(this.riskPolicy) || this.effectiveRiskPolicy;\n }\n\n private normalizeRiskPolicy(value: unknown): RiskPolicy | null {\n if (typeof value !== 'string') return null;\n const normalized = value.trim().toLowerCase();\n if (normalized === 'strict' || normalized === 'standard') return normalized;\n return null;\n }\n\n private hasProviderOverride(config: GlobalAiConfigExtended | null | undefined): boolean {\n if (!config) return false;\n return !!(\n config.provider ||\n config.apiKey ||\n config.apiKeyLast4 ||\n config.hasApiKey\n );\n }\n\n private async resolveMockModeFromStatus(): Promise<boolean> {\n try {\n const status = await firstValueFrom(this.aiApi.getAiStatus());\n if (!status || status.success === false) return true;\n const provider = (status.provider || '').toLowerCase();\n if (!provider || provider === 'mock') return true;\n return !status.hasApiKey;\n } catch {\n return true;\n }\n }\n\n private async loadTemplateVariants(): Promise<void> {\n const componentId = this.resolveComponentId();\n const componentType = this.resolveComponentType();\n if (!componentId || !componentType) return;\n const cacheKey = `${componentId}:${componentType}`;\n if (this.templateVariantsCache.has(cacheKey)) return;\n\n try {\n const context = await firstValueFrom(this.aiApi.getAiContext(componentId, componentType));\n const variants = this.extractVariantIds(context);\n if (variants.size) {\n this.templateVariantsCache.set(cacheKey, variants);\n }\n } catch {\n // optional optimization; fallback to server-driven variant selection\n }\n }\n\n private extractVariantIds(context: AiContextDTO | null | undefined): Set<string> {\n const ids = new Set<string>();\n const variants = context?.template?.templateMeta?.variants;\n if (!variants || !Array.isArray(variants)) {\n return ids;\n }\n for (const variant of variants) {\n if (typeof variant === 'string') {\n ids.add(variant);\n continue;\n }\n if (variant && typeof variant === 'object' && variant.id) {\n ids.add(String(variant.id));\n }\n }\n return ids;\n }\n\n private resolveVariantIdForSuggestion(sug: AiSuggestion): string | null {\n const componentId = this.resolveComponentId();\n const componentType = this.resolveComponentType();\n if (!componentId || !componentType) return null;\n\n if (sug.variantId) {\n const normalized = String(sug.variantId).trim();\n if (!normalized) return null;\n const allowed = this.getTemplateVariants(componentId, componentType);\n if (allowed && allowed.size > 0 && !allowed.has(normalized)) {\n return null;\n }\n return normalized;\n }\n\n const candidate = this.mapSuggestionToVariantId(sug, componentId);\n if (!candidate) return null;\n\n const allowed = this.getTemplateVariants(componentId, componentType);\n if (allowed && allowed.size > 0 && !allowed.has(candidate)) {\n return null;\n }\n return candidate;\n }\n\n private mapSuggestionToVariantId(sug: AiSuggestion, componentId: string): string | null {\n const id = (sug.id || '').toLowerCase();\n if (!id) return null;\n\n if (componentId === 'praxis-table') {\n if (this.includesAny(id, ['behavior', 'pagination', 'sorting', 'filtering', 'selection'])) {\n return 'behavior';\n }\n if (this.includesAny(id, ['format', 'renderer'])) return 'columns';\n if (id.includes('toolbar')) return 'toolbar';\n if (id.includes('actions')) return 'actions';\n }\n\n if (componentId === 'praxis-dynamic-form') {\n if (this.includesAny(id, ['sections', 'layout'])) return 'layout';\n if (this.includesAny(id, ['labels', 'options'])) return 'fields';\n if (id.includes('actions')) return 'actions';\n }\n\n return null;\n }\n\n private getTemplateVariants(componentId: string, componentType: string): Set<string> | null {\n const cacheKey = `${componentId}:${componentType}`;\n return this.templateVariantsCache.get(cacheKey) || null;\n }\n\n private includesAny(value: string, keys: string[]): boolean {\n for (const key of keys) {\n if (value.includes(key)) return true;\n }\n return false;\n }\n\n private buildSuggestionsCacheKey(\n componentId: string,\n componentType: string,\n configRoot: JsonMap,\n dataProfile: JsonMap | null,\n schemaFields: JsonMap[] | undefined,\n capabilities: unknown[],\n runtimeState: JsonMap | undefined,\n suggestionContext: JsonMap | undefined,\n locale: string | undefined,\n ): string {\n const payload = {\n componentId,\n componentType,\n config: configRoot,\n dataProfile: dataProfile || null,\n schemaFields: schemaFields && schemaFields.length > 0 ? schemaFields : null,\n capabilities,\n runtimeState: runtimeState || null,\n suggestionContext: suggestionContext || null,\n locale: locale || null,\n };\n const serialized = this.stableStringify(payload);\n return `${componentId}:${componentType}:${this.hashString(serialized)}`;\n }\n\n private stableStringify(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map((item) => this.stableStringify(item)).join(',')}]`;\n }\n const objectValue = this.asRecord(value);\n if (objectValue) {\n const keys = Object.keys(objectValue).sort();\n const entries = keys.map((key) => `${JSON.stringify(key)}:${this.stableStringify(objectValue[key])}`);\n return `{${entries.join(',')}}`;\n }\n const serialized = JSON.stringify(value);\n return serialized === undefined ? 'null' : serialized;\n }\n\n private hashString(value: string): string {\n let hash = 5381;\n for (let i = 0; i < value.length; i += 1) {\n hash = (hash * 33) ^ value.charCodeAt(i);\n }\n return (hash >>> 0).toString(36);\n }\n\n private isTable(componentId: string, componentType: string): boolean {\n return componentId === 'praxis-table' || componentType === 'table';\n }\n\n private isForm(componentId: string, componentType: string): boolean {\n return componentId === 'praxis-dynamic-form' || componentType === 'form';\n }\n\n private extractColumnNames(configRoot: JsonMap): string[] {\n const columns = Array.isArray(configRoot?.columns) ? configRoot.columns : [];\n return columns\n .map((col: unknown) => this.asRecord(col)?.['field'])\n .filter((field: unknown) => field != null && String(field).trim().length > 0)\n .map((field: unknown) => String(field));\n }\n\n private extractFieldNames(configRoot: JsonMap): string[] {\n const fields = Array.isArray(configRoot?.fieldMetadata) ? configRoot.fieldMetadata : [];\n return fields\n .map((field: unknown) => this.asRecord(field)?.['name'])\n .filter((name: unknown) => name != null && String(name).trim().length > 0)\n .map((name: unknown) => String(name));\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.close();\n } else if (this.shouldSubmitFromKeydown(event)) {\n event.preventDefault();\n this.submitPrompt();\n }\n }\n\n private shouldSubmitFromKeydown(event: KeyboardEvent): boolean {\n if (event.key !== 'Enter') return false;\n if (event.defaultPrevented || event.isComposing || event.repeat) return false;\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return false;\n if (this.state !== 'listening') return false;\n if (!this.userPrompt.trim()) return false;\n return !!this.inputElement?.nativeElement && event.target === this.inputElement.nativeElement;\n }\n\n private restoreFocusToTrigger(): void {\n if (typeof window === 'undefined') return;\n setTimeout(() => this.triggerButton?.nativeElement?.focus(), 0);\n }\n\n private normalizeError(err: unknown): string {\n const record = this.asRecord(err);\n const nestedError = this.asRecord(record?.['error']);\n const apiMsg = nestedError?.['message'] || record?.['message'];\n if (apiMsg) {\n return String(apiMsg);\n }\n return 'Erro ao comunicar com a IA. Tente novamente.';\n }\n}\n\ntype GlobalAiConfigExtended = GlobalAiConfig & {\n provider?: string;\n riskPolicy?: RiskPolicy;\n hasApiKey?: boolean;\n apiKeyLast4?: string;\n};\n","<!-- Trigger Button -->\n<button \n mat-icon-button \n cdkOverlayOrigin \n #trigger=\"cdkOverlayOrigin\"\n #triggerBtn\n (click)=\"open()\"\n [disabled]=\"isOpen\"\n class=\"ai-trigger-btn\"\n matTooltip=\"Assistente de Configuração\"\n aria-label=\"Abrir Assistente IA\">\n <mat-icon>auto_awesome</mat-icon>\n</button>\n\n<!-- Overlay Template -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"ai-assistant-backdrop\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\">\n\n <div\n class=\"ai-assistant-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Assistente de Configuração\"\n [attr.aria-busy]=\"isBusyState() ? 'true' : null\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (keydown)=\"onKeydown($event)\"\n >\n \n <!-- HEADER -->\n <div class=\"assistant-header\">\n <div class=\"assistant-header__left\">\n <mat-icon class=\"magic-icon\">auto_awesome</mat-icon>\n <div class=\"assistant-title-group\">\n <div class=\"assistant-title\">Assistente de Configuração</div>\n <div class=\"assistant-subtitle\">Copiloto contextual para ajustes guiados</div>\n <div class=\"assistant-header-chips\">\n <span\n class=\"mode-chip\"\n [class.mock]=\"mockMode\"\n [matTooltip]=\"mockMode ? 'Sem chave de API: respostas de demonstração' : 'Conectado ao assistente configurado'\"\n >\n {{ mockMode ? 'Mock' : 'Conectado' }}\n </span>\n <span\n class=\"policy-chip\"\n [class.strict]=\"isStrictRiskPolicy()\"\n [matTooltip]=\"getRiskPolicyTooltip()\"\n >\n {{ getRiskPolicyLabel() }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"assistant-header__right\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"assistant-close-btn\"\n (click)=\"close()\"\n aria-label=\"Fechar assistente\"\n matTooltip=\"Fechar assistente\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n <div\n class=\"assistant-status\"\n [class.processing]=\"isBusyState()\"\n [class.pending]=\"state === 'clarification'\"\n [class.warning]=\"state === 'error'\"\n [class.success]=\"state === 'review' || state === 'success'\"\n [class.compact]=\"!shouldShowSystemStatusDetail()\"\n role=\"status\"\n [attr.aria-live]=\"getSystemStatusAriaLive()\"\n aria-atomic=\"true\"\n >\n <span class=\"assistant-status-dot\" aria-hidden=\"true\"></span>\n <div class=\"assistant-status-content\">\n <div class=\"assistant-status-label\">\n <span class=\"assistant-status-label-prefix\">Status:</span>\n <span>{{ getSystemStatusLabel() }}</span>\n <span *ngIf=\"shouldShowSnapshotFallbackBadge()\" class=\"assistant-status-mode\">Snapshot</span>\n </div>\n <div *ngIf=\"shouldShowSystemStatusDetail()\" class=\"assistant-status-detail\">{{ getSystemStatusDetail() }}</div>\n </div>\n </div>\n <div class=\"assistant-flow\" *ngIf=\"shouldShowTaskFlow()\" role=\"list\" aria-label=\"Fluxo da proposta\">\n <div\n class=\"flow-step\"\n role=\"listitem\"\n *ngFor=\"let step of flowSteps\"\n [class.active]=\"getFlowStepState(step.step) === 'active'\"\n [class.done]=\"getFlowStepState(step.step) === 'done'\"\n >\n <span class=\"flow-step-index\">{{ step.step }}</span>\n <span class=\"flow-step-content\">\n <span class=\"flow-step-label\">{{ step.label }}</span>\n <span class=\"flow-step-detail\">{{ getFlowStepDetail(step.step) }}</span>\n </span>\n </div>\n </div>\n <div class=\"assistant-nav\">\n <div\n class=\"assistant-tabs\"\n role=\"tablist\"\n aria-label=\"Seções do assistente\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n <button\n class=\"assistant-tab\"\n type=\"button\"\n *ngIf=\"isTaskMode()\"\n id=\"assistant-tab-task\"\n role=\"tab\"\n aria-label=\"Proposta atual\"\n [attr.aria-selected]=\"isActiveTab('task')\"\n aria-controls=\"assistant-panel-task\"\n [attr.tabindex]=\"isActiveTab('task') ? 0 : -1\"\n [class.active]=\"isActiveTab('task')\"\n (click)=\"setActiveTab('task')\"\n >\n Proposta\n <span *ngIf=\"hasPendingClarification() && !isActiveTab('task')\" class=\"assistant-tab-badge\">1</span>\n </button>\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-chat\"\n role=\"tab\"\n aria-label=\"Histórico\"\n [attr.aria-selected]=\"isActiveTab('chat')\"\n aria-controls=\"assistant-panel-chat\"\n [attr.tabindex]=\"isActiveTab('chat') ? 0 : -1\"\n [class.active]=\"isActiveTab('chat')\"\n (click)=\"setActiveTab('chat')\"\n >\n Histórico\n </button>\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-suggestions\"\n role=\"tab\"\n aria-label=\"Sugestões de melhoria\"\n [attr.aria-selected]=\"isActiveTab('suggestions')\"\n aria-controls=\"assistant-panel-suggestions\"\n [attr.tabindex]=\"isActiveTab('suggestions') ? 0 : -1\"\n [class.active]=\"isActiveTab('suggestions')\"\n (click)=\"setActiveTab('suggestions')\"\n >\n Sugestões\n </button>\n </div>\n </div>\n\n <!-- BODY: Dynamic Content based on State -->\n <div class=\"assistant-body\">\n <div class=\"assistant-thought assistant-section\" *ngIf=\"shouldShowThoughtCard()\">\n <div class=\"assistant-thought-meta\">\n <mat-icon>psychology</mat-icon>\n <span>{{ getThoughtTimingLabel() }}</span>\n </div>\n <div class=\"assistant-thought-summary\">{{ getThoughtSummary() }}</div>\n <div class=\"assistant-thought-plan\">\n <div class=\"assistant-thought-plan-title\">{{ getThoughtPlanTitle() }}</div>\n <div class=\"assistant-thought-plan-actions\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"thought-action-details\"\n (click)=\"openThoughtDetails()\"\n [attr.aria-label]=\"getThoughtDetailsLabel()\"\n [matTooltip]=\"getThoughtDetailsTooltip()\"\n >\n {{ getThoughtDetailsLabel() }}\n </button>\n <button\n *ngIf=\"shouldShowThoughtPreviewAction()\"\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"thought-action-preview\"\n (click)=\"openThoughtPreview()\"\n [matTooltip]=\"getThoughtPreviewTooltip()\"\n >\n Prévia\n </button>\n </div>\n <div class=\"assistant-thought-plan-hint\">{{ getThoughtActionHint() }}</div>\n <ng-container *ngIf=\"getThoughtChecklist() as thoughtChecklist\">\n <div class=\"assistant-thought-checklist\" *ngIf=\"thoughtChecklist.length\">\n <div *ngFor=\"let item of thoughtChecklist\" class=\"assistant-thought-checklist-item\">\n <mat-icon>radio_button_unchecked</mat-icon>\n <span>{{ item }}</span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <div *ngIf=\"processingInfoVisible\" class=\"processing-banner\">\n <mat-spinner diameter=\"16\"></mat-spinner>\n <span>{{ aiExplanation || 'Analisando solicitação e preparando proposta...' }}</span>\n <button mat-button type=\"button\" class=\"processing-retry\" (click)=\"retryProcessing()\">Tentar novamente</button>\n </div>\n <div\n class=\"assistant-history assistant-section\"\n *ngIf=\"historyContext && isActiveTab('chat')\"\n id=\"assistant-panel-chat\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-chat\"\n >\n <div class=\"section-header\">\n <div class=\"section-heading\">\n <div class=\"section-title\">Histórico</div>\n <div class=\"section-subtitle\">Sessões recentes, pedidos reaproveitáveis e desfazer rápido.</div>\n </div>\n <div class=\"history-actions\" role=\"group\" aria-label=\"Ações do histórico\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"historyExpanded = !historyExpanded\"\n [matTooltip]=\"historyExpanded ? 'Recolher histórico' : 'Expandir histórico'\"\n [attr.aria-label]=\"historyExpanded ? 'Recolher histórico' : 'Expandir histórico'\"\n [disabled]=\"!historyWarnings.length && !historySessions.length && !activeHistoryMessages.length\"\n >\n <mat-icon>{{ historyExpanded ? 'expand_less' : 'expand_more' }}</mat-icon>\n <span>{{ historyExpanded ? 'Recolher' : 'Expandir' }}</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"startNewSession()\"\n matTooltip=\"Nova conversa\"\n aria-label=\"Nova conversa\"\n [disabled]=\"isBusyState()\"\n >\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"clearHistory()\"\n matTooltip=\"Limpar histórico local\"\n aria-label=\"Limpar histórico local\"\n class=\"history-action-btn history-action-btn--danger\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar</span>\n </button>\n </div>\n </div>\n <div *ngIf=\"historyUndoDeleteSession\" class=\"history-undo\">\n <span>Sessão removida.</span>\n <button mat-button type=\"button\" (click)=\"undoRemoveHistorySession()\">\n Desfazer\n </button>\n </div>\n\n <div *ngIf=\"historyExpanded && historyWarnings.length\" class=\"history-warnings\">\n <mat-icon>info</mat-icon>\n <div class=\"history-warnings-list\">\n <div *ngFor=\"let warning of historyWarnings\">{{ warning }}</div>\n <div class=\"history-warnings-hint\">\n Configure headers via API_CONFIG_STORAGE_OPTIONS no host.\n </div>\n </div>\n </div>\n\n <div *ngIf=\"historyExpanded && historySessions.length\" class=\"history-sessions\">\n <div\n class=\"history-session\"\n *ngFor=\"let session of historySessions\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"selectHistorySession(session.id)\"\n (keydown)=\"onHistorySessionCardKeydown($event, session.id)\"\n [class.active]=\"session.id === activeHistorySession?.id\"\n [matTooltip]=\"getHistorySessionTooltip(session)\"\n [matTooltipDisabled]=\"!session.componentType && !session.componentId\"\n >\n <div class=\"history-session-main\">\n <span class=\"history-session-title\">{{ session.title }}</span>\n <div class=\"history-session-main-right\">\n <span class=\"history-session-time\">{{ session.updatedAt | date:'short' }}</span>\n <div class=\"history-session-tools\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool\"\n (click)=\"reuseHistorySessionPrompt(session.id, $event)\"\n matTooltip=\"Reusar último pedido\"\n aria-label=\"Reusar último pedido\"\n >\n <mat-icon>edit_note</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool history-session-tool--danger\"\n (click)=\"removeHistorySession(session.id, $event)\"\n matTooltip=\"Excluir sessão\"\n aria-label=\"Excluir sessão\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <div class=\"history-session-meta\">\n <span *ngIf=\"session.componentType\" class=\"history-chip\">{{ session.componentType }}</span>\n <span *ngIf=\"session.componentId\" class=\"history-chip\">{{ session.componentId }}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"historyExpanded && !historySessions.length\" class=\"history-empty\">\n Nenhuma sessão salva ainda.\n </div>\n\n <div *ngIf=\"historyExpanded && activeHistoryMessages.length\" class=\"history-messages\">\n <div\n *ngIf=\"activeHistoryTotalMessages > activeHistoryMessages.length\"\n class=\"history-messages-hint\"\n >\n Mostrando últimas {{ activeHistoryMessages.length }} de {{ activeHistoryTotalMessages }} mensagens.\n </div>\n <div\n *ngFor=\"let msg of activeHistoryMessages\"\n class=\"history-message\"\n [class.user]=\"msg.role === 'user'\"\n [class.assistant]=\"msg.role === 'assistant'\"\n >\n <div class=\"history-message-header\">\n <span class=\"history-message-role\">{{ msg.role === 'user' ? 'Você' : 'Assistente' }}</span>\n <span class=\"history-message-time\">{{ msg.createdAt | date:'shortTime' }}</span>\n <span\n *ngIf=\"msg.context?.usedRag\"\n class=\"history-rag\"\n matTooltip=\"Resposta baseada em contexto recuperado (RAG)\"\n >RAG</span>\n </div>\n <div class=\"history-message-text\">{{ msg.text }}</div>\n </div>\n </div>\n <div *ngIf=\"historyExpanded && historySessions.length && !activeHistoryMessages.length\" class=\"history-empty history-empty--panel\">\n Selecione uma sessão para visualizar as mensagens.\n </div>\n <div class=\"history-helper\" *ngIf=\"historyExpanded\">\n O histórico é local ao usuário e ao componente atual.\n </div>\n </div>\n\n <div\n class=\"loading-suggestions assistant-section\"\n *ngIf=\"loadingSuggestions && isActiveTab('suggestions')\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <mat-spinner diameter=\"20\"></mat-spinner>\n <span>Carregando sugestões de melhoria...</span>\n </div>\n \n <!-- STATE: LISTENING (Suggestions) -->\n <div\n *ngIf=\"state === 'listening' && isActiveTab('suggestions')\"\n class=\"suggestions-area assistant-section\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <div class=\"section-header\">\n <div class=\"section-title\">Sugestões de melhoria</div>\n <div class=\"suggestions-actions\">\n <button mat-icon-button type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\" matTooltip=\"Atualizar sugestões\">\n <mat-icon>refresh</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"suggestions-hero\" *ngIf=\"!loadingSuggestions\">\n <div class=\"suggestions-hero__label\">Contexto ativo</div>\n <div class=\"suggestions-hero__title\">{{ adapter.componentName || 'Componente atual' }}</div>\n <div class=\"suggestions-hero__detail\">{{ getSystemStatusDetail() }}</div>\n </div>\n <div *ngIf=\"suggestionsWarnings.length\" class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n <div *ngFor=\"let warning of suggestionsWarnings\">{{ warning }}</div>\n </div>\n </div>\n </div>\n <div class=\"suggestions-content\" *ngIf=\"!loadingSuggestions && (richSuggestions.length || hasDismissedSuggestions())\">\n <div class=\"suggestions-filter\" *ngIf=\"hasDismissedSuggestions()\">\n <span>{{ getDismissedSuggestionCount() }} oculta(s)</span>\n <button mat-button type=\"button\" (click)=\"restoreDismissedSuggestions()\">\n Restaurar\n </button>\n </div>\n <div class=\"suggestions-list\" *ngIf=\"getVisibleSuggestions().length; else allSuggestionsHidden\">\n <div\n class=\"suggestion-item\"\n *ngFor=\"let sug of getVisibleSuggestions()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Selecionar sugestão: ' + sug.label\"\n (click)=\"selectSuggestion(sug)\"\n (keydown)=\"onSuggestionCardKeydown($event, sug)\"\n >\n <div class=\"suggestion-copy\">\n <div class=\"suggestion-main\">\n <mat-icon *ngIf=\"sug.icon\" class=\"suggestion-icon\">{{ sug.icon }}</mat-icon>\n <span class=\"suggestion-label\">{{ sug.label }}</span>\n <span *ngIf=\"sug.group\" class=\"suggestion-group\">{{ sug.group }}</span>\n </div>\n <div *ngIf=\"sug.description\" class=\"suggestion-desc\">{{ sug.description }}</div>\n </div>\n <div class=\"suggestion-actions\">\n <span class=\"suggestion-arrow\" aria-hidden=\"true\">\n <mat-icon>chevron_right</mat-icon>\n </span>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn\"\n (click)=\"prepareSuggestionPrompt(sug, $event)\"\n matTooltip=\"Refinar pedido\"\n aria-label=\"Refinar pedido\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn suggestion-action-btn--danger\"\n (click)=\"dismissSuggestion(sug, $event)\"\n matTooltip=\"Ocultar sugestão\"\n aria-label=\"Ocultar sugestão\"\n >\n <mat-icon>visibility_off</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <ng-template #allSuggestionsHidden>\n <div class=\"suggestions-empty suggestions-empty--inline\">\n Todas as sugestões foram ocultadas.\n </div>\n </ng-template>\n </div>\n <div class=\"suggestions-empty\" *ngIf=\"!loadingSuggestions && !richSuggestions.length\">\n Nenhuma sugestão disponível no momento.\n </div>\n <div class=\"suggestions-helper\" *ngIf=\"!loadingSuggestions && !richSuggestions.length\">\n Selecione uma sugestão acima ou descreva uma alteração no campo inferior.\n </div>\n </div>\n\n <!-- STATE: CLARIFICATION (Two-Step Flow) -->\n <div\n *ngIf=\"state === 'clarification' && isActiveTab('task')\"\n class=\"clarification-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n <div class=\"task-header\" *ngIf=\"!shouldShowThoughtCard()\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n <div *ngIf=\"clarificationOptions.length > 1 && getTaskSelectionSummary() as selectionSummary\" class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n <div *ngIf=\"shouldShowTaskSteps()\" class=\"task-steps\">\n <span class=\"task-step active\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step\">3 Revisão</span>\n </div>\n </div>\n <div *ngIf=\"clarificationResponseType === 'context'\" class=\"context-only\">\n <mat-spinner diameter=\"24\"></mat-spinner>\n <div class=\"context-only-hint\">Buscando contexto adicional...</div>\n </div>\n <ng-template #clarificationOptionContent let-opt let-index=\"index\" let-compact=\"compact\">\n <div class=\"clarification-decision-head\" *ngIf=\"!compact\">\n <span class=\"clarification-decision-index\">{{ index + 1 }}</span>\n <span class=\"clarification-decision-type\">{{ getClarificationOptionKindLabel(opt) }}</span>\n <span class=\"spacer\"></span>\n <span class=\"clarification-decision-state\" *ngIf=\"isClarificationSelected(opt)\">Selecionado</span>\n </div>\n <ng-container [ngSwitch]=\"getClarificationOptionLayout(opt)\">\n <div *ngSwitchCase=\"'endpoint'\" class=\"clarification-card\">\n <div class=\"clarification-card-header\">\n <mat-icon class=\"endpoint-icon\">{{ getEndpointIcon(opt) }}</mat-icon>\n <ng-container *ngIf=\"getEndpointMethod(opt) as method\">\n <span class=\"endpoint-method\" [attr.data-method]=\"method\">{{ method }}</span>\n </ng-container>\n <span class=\"endpoint-label\">{{ opt.label }}</span>\n <span class=\"spacer\"></span>\n <mat-icon class=\"select-indicator\">\n {{ isClarificationSelected(opt) ? 'check_circle' : 'radio_button_unchecked' }}\n </mat-icon>\n </div>\n <div class=\"clarification-card-body\">\n <ng-container *ngIf=\"getEndpointPath(opt) as path\">\n <div class=\"endpoint-path\">{{ path }}</div>\n </ng-container>\n <div\n *ngIf=\"opt.contextHints?.description\"\n class=\"endpoint-description\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </div>\n </div>\n </div>\n <div *ngSwitchCase=\"'color'\" class=\"clarification-color\">\n <span\n class=\"color-swatch\"\n [style.background]=\"getSafeHexColor(opt) || 'var(--md-sys-color-surface-container-highest)'\"\n ></span>\n <div class=\"color-meta\">\n <span class=\"color-label\">{{ opt.label }}</span>\n <span *ngIf=\"opt.contextHints?.hexColor\" class=\"color-value\">{{ opt.contextHints?.hexColor }}</span>\n </div>\n </div>\n <div *ngSwitchCase=\"'description'\" class=\"clarification-description\">\n <span class=\"clarification-label\">{{ opt.label }}</span>\n <span\n *ngIf=\"opt.contextHints?.description\"\n class=\"clarification-subtitle\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </span>\n </div>\n <span *ngSwitchDefault class=\"clarification-plain-label\">{{ opt.label }}</span>\n </ng-container>\n </ng-template>\n <div *ngIf=\"warnings.length\" class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n <div *ngFor=\"let warning of warnings\">{{ warning }}</div>\n </div>\n </div>\n </div>\n <div\n *ngIf=\"clarificationQuestions.length\"\n class=\"clarification-questions\"\n [class.attention-highlight]=\"highlightClarificationDetails && !clarificationOptions.length\"\n >\n <div *ngFor=\"let question of clarificationQuestions; let i = index\" class=\"clarification-question\">\n <div class=\"clarification-question-label\">{{ question }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationAnswers[i]\"\n [placeholder]=\"'Resposta ' + (i + 1)\"\n autocomplete=\"off\">\n </div>\n </div>\n <div\n *ngIf=\"clarificationOptions.length\"\n class=\"clarification-options-block\"\n [class.attention-highlight]=\"highlightClarificationDetails\"\n >\n <div class=\"clarification-options-title\">\n {{ clarificationOptions.length === 1 ? 'Decisão sugerida' : 'Decisões sugeridas' }}\n </div>\n <div *ngIf=\"clarificationOptions.length === 1\" class=\"clarification-options-hint\">\n Etapa 2 de 4: confirme a melhor opção para continuar.\n </div>\n <div *ngIf=\"clarificationOptions.length > 1\" class=\"clarification-options-hint\">\n Etapa 2 de 4: selecione a alternativa mais aderente para gerar a proposta.\n </div>\n <div\n *ngIf=\"clarificationResponseType === 'confirm'\"\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n <button\n mat-button\n type=\"button\"\n *ngFor=\"let opt of clarificationOptions; let i = index\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n </div>\n <div\n *ngIf=\"clarificationSelectionMode === 'multiple'\"\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n <button\n mat-button\n type=\"button\"\n *ngFor=\"let opt of clarificationOptions; let i = index\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n class=\"clarification-option\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n </div>\n <div\n *ngIf=\"clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation !== 'chips'\"\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n <button\n mat-button\n type=\"button\"\n *ngFor=\"let opt of clarificationOptions; let i = index\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n </div>\n <div\n *ngIf=\"clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation === 'chips'\"\n class=\"clarification-chips\"\n >\n <ng-container *ngFor=\"let opt of clarificationOptions; let i = index\">\n <button\n *ngIf=\"isEndpointOption(opt); else chipOption\"\n mat-button\n type=\"button\"\n class=\"clarification-option clarification-card-button\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n <ng-template #chipOption>\n <mat-chip\n (click)=\"onClarificationOptionClick(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt)\"\n class=\"clarification-chip\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: true }\"></ng-container>\n </mat-chip>\n </ng-template>\n </ng-container>\n </div>\n </div>\n <div\n *ngIf=\"clarificationAllowCustom && clarificationResponseType !== 'context'\"\n class=\"clarification-manual-toggle\"\n >\n <span class=\"clarification-manual-label\">Não encontrou o recurso?</span>\n <button mat-button type=\"button\" (click)=\"toggleManualInput()\">\n {{ showManualInput ? 'Ocultar resposta manual' : 'Responder manualmente' }}\n </button>\n </div>\n <div\n *ngIf=\"clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context'\"\n class=\"clarification-free\"\n >\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationFreeText\"\n placeholder=\"Digite sua resposta…\"\n autocomplete=\"off\"\n (keydown.enter)=\"confirmTaskAction()\"\n />\n </div>\n <div\n *ngIf=\"clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context'\"\n class=\"clarification-free-hint\"\n >\n Pressione Enter para enviar.\n </div>\n </div>\n\n <!-- STATE: REVIEW (Diff/Explanation) -->\n <div\n *ngIf=\"state === 'review' && isActiveTab('task')\"\n class=\"review-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n <div class=\"task-header\" *ngIf=\"!shouldShowThoughtCard()\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n <div *ngIf=\"clarificationOptions.length > 1 && getTaskSelectionSummary() as selectionSummary\" class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n <div *ngIf=\"shouldShowTaskSteps()\" class=\"task-steps\">\n <span class=\"task-step\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step active\">3 Revisão</span>\n </div>\n </div>\n <div *ngIf=\"warnings.length\" class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n <div *ngFor=\"let warning of warnings\">{{ warning }}</div>\n </div>\n </div>\n </div>\n <div class=\"review-trust\">\n <span class=\"trust-chip\" [matTooltip]=\"getScopeTooltip()\">{{ getScopeLabel() }}</span>\n <span class=\"trust-chip\" [matTooltip]=\"getConfidenceTooltip()\">{{ getConfidenceLabel() }}</span>\n <span class=\"trust-chip risk-chip\" [class.medium]=\"getReviewRiskLevel() === 'médio'\" [class.high]=\"getReviewRiskLevel() === 'alto'\">\n Risco {{ getReviewRiskLevel() }}\n </span>\n </div>\n <div class=\"review-summary\" [class.attention-highlight]=\"highlightReviewDetails\">\n <div class=\"review-summary-title\">Resumo da proposta</div>\n <div class=\"review-summary-line\">{{ getReviewSummary() }}</div>\n </div>\n <div class=\"review-diff\">\n <div class=\"review-diff-title\">Prévia de mudanças</div>\n <ng-container *ngIf=\"pendingDiff.length; else noDiffPreview\">\n <div class=\"review-diff-summary\">\n <div *ngFor=\"let line of getDiffSummaryLines()\" class=\"review-diff-line\">{{ line }}</div>\n <div *ngIf=\"pendingDiff.length > 3\" class=\"review-diff-more\">… +{{ pendingDiff.length - 3 }} mudanças</div>\n </div>\n <button mat-stroked-button type=\"button\" class=\"review-diff-toggle\" (click)=\"toggleFullDiff()\">\n {{ getDiffToggleLabel() }}\n </button>\n </ng-container>\n <ng-template #noDiffPreview>\n <div class=\"review-diff-empty\">\n Não foi possível gerar um diff estruturado. Revise o resumo e aplique com cautela.\n </div>\n </ng-template>\n <div *ngIf=\"showFullDiff && pendingDiff.length\" class=\"review-diff-full\">\n <div *ngFor=\"let diff of pendingDiff\" class=\"review-diff-block\">\n <div class=\"review-diff-path\">{{ diff.path }}</div>\n <div class=\"review-diff-label\">Antes:</div>\n <pre>{{ diff.before | json }}</pre>\n <div class=\"review-diff-label\">Depois:</div>\n <pre>{{ diff.after | json }}</pre>\n </div>\n </div>\n </div>\n <div class=\"ai-explanation\" *ngIf=\"aiExplanation.trim()\">\n {{ aiExplanation }}\n </div>\n </div>\n\n <!-- STATE: ERROR -->\n <div\n *ngIf=\"state === 'error' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))\"\n class=\"error-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"error-msg\">\n <mat-icon color=\"warn\">error_outline</mat-icon>\n <span>{{ errorMsg }}</span>\n </div>\n <div *ngIf=\"warnings.length\" class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n <div *ngFor=\"let warning of warnings\">{{ warning }}</div>\n </div>\n </div>\n </div>\n <div *ngIf=\"shouldShowApplyDetails()\" class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplicação</div>\n <div class=\"apply-details-actions\" *ngIf=\"allowManualPatchEdit\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar patch' }}\n </button>\n </div>\n </div>\n <div class=\"apply-details-meta\" *ngIf=\"lastApplyAt\">\n Última tentativa: {{ lastApplyAt | date:'short' }}\n </div>\n <div class=\"apply-paths\" *ngIf=\"getApplyPaths().length\">\n <span class=\"apply-path-chip\" *ngFor=\"let path of getApplyPaths()\">{{ path }}</span>\n </div>\n <div class=\"apply-warnings\" *ngIf=\"applyWarnings.length\">\n <div class=\"apply-warnings-title\">Avisos da aplicação</div>\n <div class=\"apply-warnings-list\">\n <div *ngFor=\"let warning of applyWarnings\">{{ warning }}</div>\n </div>\n </div>\n <div class=\"patch-path-editor\" *ngIf=\"allowManualPatchEdit && patchPathEditorExpanded\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para forçar texto em true/false/número, use aspas.</div>\n <div class=\"patch-path-editor-empty\" *ngIf=\"!getEditablePatchPathEdits().length\">\n Nenhum path editável disponível para este patch.\n </div>\n <div class=\"patch-path-rows\" *ngIf=\"getEditablePatchPathEdits().length\">\n <div class=\"patch-path-row\" *ngFor=\"let edit of getEditablePatchPathEdits(); let i = index\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n <div *ngIf=\"patchPathEdits[i].error\" class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n </div>\n </div>\n <div *ngIf=\"patchPathEditorError\" class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n <div class=\"patch-editor\" *ngIf=\"allowManualPatchEdit && patchEditorExpanded\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n <div *ngIf=\"patchEditorError\" class=\"patch-editor-error\">{{ patchEditorError }}</div>\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n </div>\n <div class=\"review-actions\">\n <button mat-button (click)=\"close()\">Fechar</button>\n <button mat-stroked-button (click)=\"retry()\">Tentar Novamente</button>\n </div>\n </div>\n\n <!-- STATE: SUCCESS -->\n <div\n *ngIf=\"state === 'success' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))\"\n class=\"success-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"success-msg\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <span>{{ aiExplanation || 'Configuração atualizada.' }}</span>\n </div>\n <div *ngIf=\"warnings.length\" class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n <div *ngFor=\"let warning of warnings\">{{ warning }}</div>\n </div>\n </div>\n </div>\n <div *ngIf=\"shouldShowApplyDetails()\" class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplicação</div>\n <div class=\"apply-details-actions\" *ngIf=\"allowManualPatchEdit\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar e reaplicar' }}\n </button>\n </div>\n </div>\n <div class=\"apply-details-meta\" *ngIf=\"lastApplyAt\">\n Aplicado em {{ lastApplyAt | date:'short' }}\n </div>\n <div class=\"apply-paths\" *ngIf=\"getApplyPaths().length\">\n <span class=\"apply-path-chip\" *ngFor=\"let path of getApplyPaths()\">{{ path }}</span>\n </div>\n <div class=\"apply-warnings\" *ngIf=\"applyWarnings.length\">\n <div class=\"apply-warnings-title\">Avisos da aplicação</div>\n <div class=\"apply-warnings-list\">\n <div *ngFor=\"let warning of applyWarnings\">{{ warning }}</div>\n </div>\n </div>\n <div class=\"patch-path-editor\" *ngIf=\"allowManualPatchEdit && patchPathEditorExpanded\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para forçar texto em true/false/número, use aspas.</div>\n <div class=\"patch-path-editor-empty\" *ngIf=\"!getEditablePatchPathEdits().length\">\n Nenhum path editável disponível para este patch.\n </div>\n <div class=\"patch-path-rows\" *ngIf=\"getEditablePatchPathEdits().length\">\n <div class=\"patch-path-row\" *ngFor=\"let edit of getEditablePatchPathEdits(); let i = index\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n <div *ngIf=\"patchPathEdits[i].error\" class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n </div>\n </div>\n <div *ngIf=\"patchPathEditorError\" class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n <div class=\"patch-editor\" *ngIf=\"allowManualPatchEdit && patchEditorExpanded\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n <div *ngIf=\"patchEditorError\" class=\"patch-editor-error\">{{ patchEditorError }}</div>\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n </div>\n <button mat-button color=\"warn\" (click)=\"undoLastChange()\">\n <mat-icon>undo</mat-icon> Desfazer\n </button>\n </div>\n\n </div>\n\n <div class=\"assistant-footer\">\n <ng-container *ngIf=\"!isTaskMode(); else taskFooter\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"composer-leading composer-leading-btn\"\n [matMenuTriggerFor]=\"assistantQuickMenu\"\n aria-label=\"Abrir ações rápidas\"\n matTooltip=\"Ações rápidas\"\n >\n <mat-icon>add</mat-icon>\n </button>\n <input\n #inputEl\n type=\"text\"\n [(ngModel)]=\"userPrompt\"\n [disabled]=\"state === 'processing' || state === 'applying'\"\n placeholder=\"Descreva a alteração que deseja aplicar…\"\n autocomplete=\"off\"\n />\n <div class=\"send-actions\">\n <button\n mat-icon-button\n class=\"send-btn\"\n *ngIf=\"state === 'listening'\"\n (click)=\"submitPrompt()\"\n [disabled]=\"!userPrompt.trim()\"\n [class.ready]=\"!!userPrompt.trim()\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <mat-spinner diameter=\"20\" *ngIf=\"state === 'processing' || state === 'applying'\"></mat-spinner>\n </div>\n </ng-container>\n <ng-template #taskFooter>\n <div class=\"task-footer\">\n <div class=\"task-footer-left\">\n <button mat-button type=\"button\" (click)=\"handleTaskSecondary()\">{{ getTaskCancelLabel() }}</button>\n <button\n *ngIf=\"state === 'review'\"\n mat-stroked-button\n type=\"button\"\n (click)=\"retry()\"\n >\n {{ getTaskSecondaryLabel() }}\n </button>\n </div>\n <div class=\"task-footer-right\">\n <button\n class=\"task-primary-btn\"\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"confirmTaskAction()\"\n [disabled]=\"isTaskPrimaryDisabled()\"\n >\n {{ getTaskPrimaryLabel() }}\n </button>\n <mat-spinner diameter=\"20\" *ngIf=\"state === 'processing' || state === 'applying'\"></mat-spinner>\n </div>\n </div>\n </ng-template>\n </div>\n\n <mat-menu #assistantQuickMenu=\"matMenu\" panelClass=\"assistant-quick-menu-panel\">\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('chat')\">\n <mat-icon>history</mat-icon>\n <span>Histórico</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('suggestions')\">\n <mat-icon>lightbulb</mat-icon>\n <span>Sugestões</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"startNewSession()\">\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\">\n <mat-icon>refresh</mat-icon>\n <span>Atualizar sugestões</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n (click)=\"restoreDismissedSuggestions()\"\n [disabled]=\"!hasDismissedSuggestions()\"\n >\n <mat-icon>visibility</mat-icon>\n <span>Restaurar sugestões ocultas</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n class=\"assistant-quick-menu-danger\"\n (click)=\"clearHistory()\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar histórico local</span>\n </button>\n </mat-menu>\n </div>\n\n</ng-template>\n","/*\n * Public API Surface of praxis-ai\n */\n\nexport * from './lib/praxis-ai';\nexport * from './lib/core/models/ai-models';\nexport * from './lib/core/services/praxis-ai.service';\nexport * from './lib/core/services/ai-config.service';\nexport * from './lib/core/services/ai-backend-api.service';\nexport * from './lib/context/ai-context-builder.service';\nexport * from './lib/ui/ai-rule-wizard-dialog.component';\nexport * from './lib/ui/streaming-feedback.component';\nexport * from './lib/core/services/ai-response-validator.service';\nexport * from './lib/core/services/dsl-parsing.service';\nexport * from './lib/core/services/schema-minifier.service';\nexport * from './lib/core/services/ai-config-agent.service';\n\n// Adapters\nexport * from './lib/core/adapters/ai-config.adapter';\nexport * from './lib/core/adapters/base-ai.adapter';\n\n// UI\nexport * from './lib/ui/ai-assistant/ai-assistant.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SchemaMinifierService","i1.DslParsingService","i2.PraxisAiService","i3.AiResponseValidatorService","i5.AiContextBuilderService","i6","i1","i8","i9","i1.PraxisAiService","i2","i4","i7","i10","i11"],"mappings":"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"}
1
+ {"version":3,"file":"praxisui-ai.mjs","sources":["../../../projects/praxis-ai/src/lib/praxis-ai.ts","../../../projects/praxis-ai/src/lib/core/models/ai-models.ts","../../../projects/praxis-ai/src/lib/core/prompts/prompt-templates.ts","../../../projects/praxis-ai/src/lib/core/services/praxis-ai.service.ts","../../../projects/praxis-ai/src/lib/core/services/ai-config.service.ts","../../../projects/praxis-ai/src/lib/core/contracts/ai-contract.generated.ts","../../../projects/praxis-ai/src/lib/core/services/ai-backend-api.service.ts","../../../projects/praxis-ai/src/lib/core/services/schema-minifier.service.ts","../../../projects/praxis-ai/src/lib/context/ai-context-builder.service.ts","../../../projects/praxis-ai/src/lib/ui/streaming-feedback.component.ts","../../../projects/praxis-ai/src/lib/core/services/dsl-parsing.service.ts","../../../projects/praxis-ai/src/lib/core/services/ai-response-validator.service.ts","../../../projects/praxis-ai/src/lib/ui/ai-rule-wizard-dialog.component.ts","../../../projects/praxis-ai/src/lib/core/services/ai-config-agent.service.ts","../../../projects/praxis-ai/src/lib/core/adapters/base-ai.adapter.ts","../../../projects/praxis-ai/src/lib/core/services/assistant-history.service.ts","../../../projects/praxis-ai/src/lib/ui/ai-assistant/ai-assistant.component.ts","../../../projects/praxis-ai/src/lib/ui/ai-assistant/ai-assistant.component.html","../../../projects/praxis-ai/src/public-api.ts","../../../projects/praxis-ai/src/praxisui-ai.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-praxis-ai',\n imports: [],\n template: `\n <p>\n praxis-ai works!\n </p>\n `,\n styles: ``,\n})\nexport class PraxisAi {\n\n}\n","/**\n * Models for Praxis AI (Centralized)\n */\n\nimport type { AiCapability, AiValueKind } from '@praxisui/core';\n\n/**\n * Response structure expected from the AI model\n */\nexport interface AiRuleResponse {\n /** Descriptive name for the rule */\n ruleName: string;\n \n /** Type of target (scope) */\n targetType: 'field' | 'section' | 'action' | 'row' | 'column';\n \n /** IDs of the target elements */\n targetIds: string[];\n \n /** Condition in DSL format (e.g., \"age >= 18\") or null for always applied */\n conditionDsl: string | null;\n \n /** Effects to apply */\n effects: {\n /** Properties to apply when condition is true */\n properties?: Record<string, any>;\n \n /** Properties to apply when condition is false (else) */\n propertiesWhenFalse?: Record<string, any>;\n };\n}\n\n/**\n * Minified field representation for AI context (token optimization)\n */\nexport interface MinifiedField {\n id: string;\n label: string;\n type: string;\n category?: string;\n allowedValues?: Array<{ value: any; label: string }>;\n}\n\n/**\n * Context structure sent to the AI\n */\nexport interface PromptContext {\n /** List of available fields formatted for the prompt */\n fieldsText: string;\n \n /** List of available properties for the selected target type */\n propertiesText: string;\n \n /** List of supported DSL operators */\n operatorsText: string;\n \n /** Selected target type */\n targetType: string;\n\n /** Structured list of fields for richer prompt suggestions */\n minifiedFields?: MinifiedField[];\n}\n\n/**\n * Example pair for Few-Shot Learning\n */\nexport interface AiExamplePair {\n userPrompt: string;\n expectedResponse: AiRuleResponse;\n}\n\n/**\n * Configuration for the AI Service\n */\nexport interface AiIntegrationConfig {\n /** LLM provider (gemini/openai/xai/mock) */\n provider?: string;\n /** Gemini API Key (optional if using proxy/env) */\n apiKey?: string;\n \n /** Model version to use */\n model: string;\n \n /** Temperature (creativity vs determinism) */\n temperature: number;\n \n /** Max output tokens */\n maxTokens: number;\n \n /** Request timeout in ms */\n timeout: number;\n \n /** Number of retry attempts */\n retryAttempts: number;\n \n /** Optional: Backend gateway URL for Enterprise mode */\n gatewayUrl?: string;\n}\n\n/**\n * Result of validating an AI response\n */\nexport interface AiValidationResult {\n valid: boolean;\n errors: AiValidationError[];\n warnings: AiValidationWarning[];\n correctedResponse?: AiRuleResponse;\n}\n\nexport interface AiValidationError {\n field: string;\n message: string;\n severity: 'critical' | 'error' | 'warning';\n code: string;\n}\n\nexport interface AiValidationWarning {\n field: string;\n message: string;\n suggestion?: string;\n}\n\nexport interface AiModel {\n name: string;\n version: string;\n displayName: string;\n description: string;\n inputTokenLimit: number;\n outputTokenLimit: number;\n supportedGenerationMethods: string[];\n temperature?: number;\n topP?: number;\n topK?: number;\n}\n\n// --- Configuration Capabilities Models ---\n\nexport type ValueKind = AiValueKind;\nexport type Capability = AiCapability;\n","/**\n * Templates de Prompt Estruturados para o Fluxo de IA em Dois Passos.\n * Focados em precisão, contratos de renderização e segurança.\n */\n\nexport const CONTRACT_RULES = {\n dsl: `\n - SINTAXE OBRIGATÓRIA: Use DSL específica, NÃO use JavaScript puro.\n - ERRADO: \"row.status === 'Active'\", \"value.includes('A')\", \"item.price > 10\"\n - CERTO: \"status == 'Active'\", \"contains(name, 'A')\", \"price > 10\"\n - Operadores: ==, !=, >, <, >=, <=, in, contains, startsWith, endsWith.\n - Contexto: O campo é implícito. Não use prefixos como \"row.\" ou \"this.\".\n `,\n icons: `\n - Use apenas nomes de ícones do Google Material Symbols (ex: check_circle, warning, edit, delete, add).\n - Não use URLs ou classes CSS para ícones.\n `,\n formatting: `\n - Datas: Use { \"type\": \"date\", \"format\": \"dd/MM/yyyy\" } (ou similar).\n - Moeda: Use \"BRL|symbol|2\" (currencyCode|display|decimals) ou \"USD|code|0\". Formato aceito é string.\n - Número: Use padrões do DecimalPipe, ex.: \"1.2-2\" (mínimo 2, máximo 2 decimais).\n - Percentual: Use padrões do PercentPipe, ex.: \"1.0-0|x100\" para converter 0.1 -> 10%.\n - Boolean: Use { \"type\": \"boolean\" } e, opcionalmente, format strings como \"true-false\", \"yes-no\", \"active-inactive\".\n `,\n safety: `\n - PRESERVAÇÃO: Ao atualizar listas (ex: conditionalRenderers), mantenha os itens existentes que não foram alterados.\n - DESTRUIÇÃO: Não remova colunas ou regras a menos que explicitamente solicitado.\n `,\n rendererPayloads: `\n - CONDITIONAL RENDERERS: 'columns[].conditionalRenderers[].renderer' deve seguir o mesmo schema dos renderers principais.\n - CORRETO: { type: 'badge', badge: { text: 'Ativo', color: 'success' } }\n - ERRADO (Flatten): { type: 'badge', text: 'Ativo', color: 'success' }\n - ERRADO (Vazio): { type: 'badge' }\n - BADGE: Exige 'badge.textField' (dinâmico) ou 'badge.text' (fixo).\n - Para booleanos (true/false): Sugira \"valueMapping\" ({ \"true\": \"Ativo\", \"false\": \"Inativo\" }) e use \"conditionalStyles\" para cores.\n - Default variant: 'filled'. Default color: 'primary'.\n - TOGGLE: Exige 'toggle.stateExpr' e 'toggle.action.id' quando interativo.\n - Use DSL em disabledCondition (ex.: ativo == false).\n - Prefer ariaLabel explícito para acessibilidade.\n - PROGRESS: Exige 'progress.valueExpr' (0-100). Cor opcional. 'showLabel' habilita o número.\n - Evite deixar apenas type; sempre informe a origem do valor.\n - RATING: Preferir modo somente leitura em tabela. Exige 'rating.valueExpr'; 'max' padrão 5.\n - Inclua 'color' e, se usado, 'outlineColor' e 'size'; ariaLabel é recomendado.\n - PREENCHIMENTO MÍNIMO: Não responda apenas com \"renderer.type\". Preencha as subpropriedades necessárias (ex: text, valueExpr, src).\n - Evite objetos vazios: Se usar renderer.badge, preencha suas propriedades.\n `\n};\n\n/**\n * Prompt para o Classificador de Intenção (Passo 1).\n * Leve, focado em identificar O QUE e ONDE.\n */\nexport const PROMPT_INTENT_CLASSIFIER = `\nVocê é um especialista em UX e configuração de Tabelas de Dados.\nSua tarefa é analisar o pedido do usuário e classificar a intenção para direcionar o fluxo de processamento.\n\nENTRADA DO USUÁRIO: \"{{USER_INPUT}}\"\nCOLUNAS DISPONÍVEIS: {{COLUMNS_LIST}}\n\nCATEGORIAS POSSÍVEIS:\n- columns: Adicionar, remover, renomear, reordenar, visibilidade.\n- appearance: Densidade, cores, bordas, fontes.\n- conditional: Regras visuais (cores, ícones) baseadas em valores (conditionalStyles/Renderers).\n- behavior: Paginação, filtro, sort, seleção, loading.\n- actions: Botões de ação, toolbar, exportação.\n- unknown: Não foi possível determinar.\n\nREGRAS:\n1. Identifique o \"targetField\" (nome técnico da coluna) se a intenção for específica de uma coluna. Use fuzzy match se necessário.\n2. Se o usuário for ambíguo (ex: \"muda a cor\" e houver ambiguidade), marque \"needsClarification\": true.\n3. Se o usuário fizer uma PERGUNTA sobre o estado atual (ex: \"quais colunas estão ocultas?\", \"o filtro está ativo?\"), use \"intent\": \"ask_about_config\".\n4. Se o usuário pedir criação de página/fluxo, use \"intent\": \"create_flow\".\n5. Retorne APENAS um objeto JSON válido.\n\nSCHEMA DE RESPOSTA (JSON):\n{\n \"intent\": \"add_column_computed\" | \"add_column\" | \"create_flow\" | \"update_column\" | \"remove_column\" | \"toggle_feature\" | \"global_style\" | \"ask_about_config\" | \"unknown\",\n \"targetField\": \"string\" | null,\n \"category\": \"columns\" | \"appearance\" | \"conditional\" | \"behavior\" | \"actions\",\n \"needsClarification\": boolean,\n \"options\": [\"string\"] // Sugestões se precisar de clarificação\n}\n`;\n\n/**\n * Prompt para QA (Perguntas sobre a config atual).\n */\nexport const PROMPT_QA = `\nVocê é um especialista em Tabelas de Dados. Responda à pergunta do usuário com base na configuração fornecida.\n\nCONFIGURAÇÃO ATUAL:\n{{TARGET_CONFIG}}\n\nPERGUNTA DO USUÁRIO: \"{{USER_INPUT}}\"\n\nINSTRUÇÕES:\n- Responda de forma direta e concisa em português.\n- Liste os itens solicitados se houver (ex: nomes das colunas ocultas).\n- Não invente informações que não estejam no JSON.\n\nRESPOSTA:\n`;\n\n/**\n * Prompt para o Executor Enriquecido (Passo 2/3).\n * Pesado, contém o contrato exato e o contexto específico.\n */\nexport const PROMPT_EXECUTION_ENRICHED = `\nVocê é um Engenheiro de Configuração de UI. Sua tarefa é gerar um JSON PATCH para atualizar uma tabela.\n\nCONTEXTO ALVO:\n{{CONTEXT_DESCRIPTION}}\n\nCAPABILITIES PERMITIDAS (Use APENAS estes paths/valores):\n{{CAPABILITIES_RESTRICTION}}\n\nCONFIGURAÇÃO ATUAL (Do Alvo):\n{{TARGET_CONFIG}}\n\nCONTRATO TÉCNICO (Siga Rigorosamente):\n{{CONTRACT_DSL}}\n{{CONTRACT_ICONS}}\n{{CONTRACT_SAFETY}}\n{{CONTRACT_RENDERER_PAYLOADS}}\n\nPEDIDO DO USUÁRIO: \"{{USER_INPUT}}\"\n\nINSTRUÇÕES:\n1. Analise a Configuração Atual e o Pedido.\n2. Gere um JSON Patch parcial que satisfaça o pedido, usando SOMENTE chaves listadas em CAPABILITIES PERMITIDAS.\n3. O patch será aplicado via \"Smart Merge\".\n - Arrays (ex: columns): Use a chave de identidade (ex: \"field\") para atualizar itens existentes.\n - Exemplo: { \"columns\": [{ \"field\": \"status\", \"header\": \"Estado\" }] } (Atualiza header da col status).\n - NÃO use índices numéricos ou JSON Pointer.\n4. Valide se sua DSL segue as regras (sem \"row.\").\n\nSAÍDA ESPERADA (JSON):\n{\n \"patch\": { ... },\n \"explanation\": \"Resumo curto do que foi feito.\"\n}\n`;\n\n/**\n * Helper para injeção simples de variáveis.\n */\nexport function buildPrompt(template: string, variables: Record<string, string>): string {\n return Object.keys(variables).reduce((str, key) => {\n const regex = new RegExp(`{{${key}}}`, 'g');\n return str.replace(regex, variables[key]);\n }, template);\n}\n","import { Injectable, Optional } from '@angular/core';\nimport { GoogleGenerativeAI, GenerationConfig } from '@google/generative-ai';\nimport { Observable, from, of, throwError } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { GlobalConfigService } from '@praxisui/core';\nimport { AiModel, AiIntegrationConfig } from '../models/ai-models';\nimport { PROMPT_INTENT_CLASSIFIER, PROMPT_EXECUTION_ENRICHED, PROMPT_QA, CONTRACT_RULES, buildPrompt } from '../prompts/prompt-templates';\n\n@Injectable({ providedIn: 'root' })\nexport class PraxisAiService {\n private genAI: GoogleGenerativeAI | null = null;\n private config: AiIntegrationConfig = {\n provider: 'gemini',\n apiKey: '',\n model: 'gemini-2.0-flash',\n temperature: 0.1,\n maxTokens: 2048,\n timeout: 30000,\n retryAttempts: 2,\n };\n\n constructor(@Optional() private globalConfigService: GlobalConfigService) {\n this.syncConfig();\n if (this.globalConfigService?.configChanges$ && typeof (this.globalConfigService as any).configChanges$.subscribe === 'function') {\n this.globalConfigService.configChanges$.subscribe(() => this.syncConfig());\n }\n }\n\n private syncConfig(): void {\n if (!this.globalConfigService) return;\n if (typeof (this.globalConfigService as any).get !== 'function') return;\n const aiCfg = this.globalConfigService.get<any>('ai');\n if (aiCfg) {\n this.config = { ...this.config, ...aiCfg };\n const provider = this.resolveProvider();\n if (provider === 'gemini' && this.config.apiKey) {\n this.genAI = new GoogleGenerativeAI(this.config.apiKey);\n } else {\n this.genAI = null;\n }\n }\n }\n\n // -------- Two-step helpers --------\n\n classifyIntent(userInput: string, columns: string[]): Observable<any> {\n const prompt = buildPrompt(PROMPT_INTENT_CLASSIFIER, {\n USER_INPUT: userInput,\n COLUMNS_LIST: JSON.stringify(columns),\n });\n\n return this.generateJson<any>(prompt, undefined, {\n type: 'OBJECT',\n properties: {\n intent: {\n type: 'STRING',\n enum: [\n 'add_column_computed',\n 'add_column',\n 'create_flow',\n 'update_column',\n 'remove_column',\n 'toggle_feature',\n 'global_style',\n 'ask_about_config',\n 'unknown',\n // Alias legado aceito para garantir backward compatibility.\n 'update_column_rules',\n ],\n },\n targetField: { type: 'STRING', nullable: true },\n category: { type: 'STRING', enum: ['columns', 'appearance', 'conditional', 'behavior', 'actions'] },\n needsClarification: { type: 'BOOLEAN' },\n options: { type: 'ARRAY', items: { type: 'STRING' } },\n },\n required: ['intent', 'category', 'needsClarification'],\n } as any).pipe(\n map((classification) => this.normalizeIntentClassification(classification)),\n );\n }\n\n answerQuestion(userInput: string, targetConfig: any): Observable<string> {\n const prompt = buildPrompt(PROMPT_QA, {\n USER_INPUT: userInput,\n TARGET_CONFIG: JSON.stringify(targetConfig, null, 2),\n });\n \n return this.generateContent(prompt);\n }\n\n executeEnrichedPrompt(\n userInput: string,\n contextDescription: string,\n targetConfig: any,\n capabilities: any, // Expects Capability[]\n ): Observable<any> {\n const configJson = JSON.stringify(targetConfig, null, 2);\n const capsList = this.formatCapabilities(capabilities);\n \n const prompt = buildPrompt(PROMPT_EXECUTION_ENRICHED, {\n USER_INPUT: userInput,\n CONTEXT_DESCRIPTION: contextDescription,\n TARGET_CONFIG: configJson,\n CAPABILITIES_RESTRICTION: capsList,\n CONTRACT_DSL: CONTRACT_RULES.dsl,\n CONTRACT_ICONS: CONTRACT_RULES.icons,\n CONTRACT_SAFETY: CONTRACT_RULES.safety,\n CONTRACT_RENDERER_PAYLOADS: CONTRACT_RULES.rendererPayloads || '',\n });\n\n return this.generateJson<any>(prompt, undefined, undefined);\n }\n\n private formatCapabilities(caps: any[]): string {\n if (!Array.isArray(caps) || caps.length === 0) return 'Todas as configurações permitidas.';\n \n // Group by category for readability\n const groups: Record<string, string[]> = {};\n const enums: Record<string, string[]> = {};\n\n caps.forEach(c => {\n const cat = c.category || 'Geral';\n if (!groups[cat]) groups[cat] = [];\n \n let line = `- ${c.path}`;\n if (c.allowedValues) {\n const enumKey = c.path.split('.').pop() || c.path;\n enums[enumKey] = c.allowedValues;\n line += ` (Enum: ${c.allowedValues.join(', ')})`;\n } else if (c.valueKind) {\n line += ` (${c.valueKind})`;\n }\n if (c.description) line += `: ${c.description}`;\n \n groups[cat].push(line);\n });\n\n return Object.entries(groups)\n .map(([cat, lines]) => `### ${cat.toUpperCase()}\\n${lines.join('\\n')}`)\n .join('\\n\\n');\n }\n\n private normalizeIntentClassification(classification: any): any {\n if (!classification || typeof classification !== 'object') {\n return classification;\n }\n const intent = typeof classification.intent === 'string'\n ? classification.intent.trim().toLowerCase()\n : '';\n if (intent === 'update_column_rules') {\n return { ...classification, intent: 'update_column' };\n }\n return classification;\n }\n\n // -------- Core generation --------\n\n generateContent(prompt: string, modelName?: string): Observable<string> {\n if (!this.isGeminiProvider()) {\n return throwError(() => new Error('LLM provider not supported in browser mode.'));\n }\n if (!this.genAI) return throwError(() => new Error('API Key not configured'));\n const model = this.genAI.getGenerativeModel({\n model: modelName || this.config.model,\n generationConfig: {\n temperature: this.config.temperature,\n maxOutputTokens: this.config.maxTokens,\n },\n });\n return from(model.generateContent(prompt)).pipe(map((result) => result.response.text()));\n }\n\n generateContentStream(prompt: string, modelName?: string): Observable<string> {\n if (!this.isGeminiProvider()) {\n return throwError(() => new Error('LLM provider not supported in browser mode.'));\n }\n if (!this.genAI) return throwError(() => new Error('API Key not configured'));\n const model = this.genAI.getGenerativeModel({\n model: modelName || this.config.model,\n generationConfig: {\n temperature: this.config.temperature,\n maxOutputTokens: this.config.maxTokens,\n },\n });\n\n return new Observable<string>((observer) => {\n model\n .generateContentStream(prompt)\n .then(async (result) => {\n try {\n for await (const chunk of result.stream) {\n const text = chunk.text();\n if (text) observer.next(text);\n }\n observer.complete();\n } catch (err) {\n observer.error(err);\n }\n })\n .catch((err) => observer.error(err));\n });\n }\n\n generateJson<T>(prompt: string, modelName?: string, schema?: any): Observable<T | null> {\n if (!this.isGeminiProvider()) {\n return throwError(() => new Error('LLM provider not supported in browser mode.'));\n }\n const intentOnly = this.extractUserIntent(prompt);\n \n // Only check for mock triggers in the specific user intent, not the full prompt template\n if (intentOnly) {\n const mockPatch = this.getMockPatch(intentOnly);\n if (mockPatch) {\n console.warn('PraxisAI: Using mock response for prompt intent:', intentOnly);\n return of(mockPatch as T);\n }\n }\n\n if (!this.genAI) return throwError(() => new Error('API Key not configured'));\n\n const generationConfig: GenerationConfig = {\n temperature: this.config.temperature,\n maxOutputTokens: this.config.maxTokens,\n responseMimeType: 'application/json',\n ...(schema ? { responseSchema: schema } : {}),\n };\n\n const model = this.genAI.getGenerativeModel({\n model: modelName || this.config.model,\n generationConfig,\n });\n\n return from(model.generateContent(prompt)).pipe(\n map((result) => {\n let text = '';\n try {\n text = result.response.text();\n } catch (e) {\n // If response.text() fails, it means no text was generated or an error occurred.\n // Return null as per the signature.\n console.warn('[PraxisAiService] generateJson: AI response.text() failed, returning null.', e);\n return null;\n }\n let cleaned = text.replace(/```json\\n?|\\n?```/g, '').trim();\n // Find the first '{' or '[' and the last '}' or ']' to handle preamble/postamble text\n const firstOpen = cleaned.search(/[{[]/);\n const lastClose = cleaned.search(/[}\\]]$/); // Optimized search from end not supported in all environments, use lastIndexOf\n const lastCloseBrace = cleaned.lastIndexOf('}');\n const lastCloseBracket = cleaned.lastIndexOf(']');\n const lastCloseIndex = Math.max(lastCloseBrace, lastCloseBracket);\n\n if (firstOpen !== -1 && lastCloseIndex !== -1 && lastCloseIndex > firstOpen) {\n cleaned = cleaned.substring(firstOpen, lastCloseIndex + 1);\n }\n\n try {\n return JSON.parse(cleaned) as T;\n } catch (e) {\n console.warn('[PraxisAiService] generateJson: JSON parsing failed, returning null.', e);\n return null;\n }\n }),\n );\n }\n\n isMockMode(): boolean {\n return !this.genAI;\n }\n\n // -------- Helpers --------\n\n private extractUserIntent(prompt: string): string | null {\n // Tenta capturar o conteúdo entre aspas após os marcadores conhecidos\n const patterns = [\n /ENTRADA DO USUÁRIO:\\s*\"([^\"]+)\"/i,\n /PEDIDO DO USUÁRIO:\\s*\"([^\"]+)\"/i,\n /USER INTENT:\\s*\"([^\"]+)\"/i\n ];\n\n for (const regex of patterns) {\n const match = prompt.match(regex);\n if (match && match[1]) {\n return match[1].trim();\n }\n }\n return null;\n }\n\n private getMockPatch(prompt: string | null): any {\n if (!prompt) return null;\n const p = prompt.toLowerCase();\n // ... rest of the function\n if (p.includes('compacta') && p.includes('bordas')) {\n return {\n patch: { appearance: { density: 'compact', borders: { showRowBorders: false } } },\n explanation: 'Ajustei a tabela para o modo compacto e removi as bordas das linhas (MOCK).',\n };\n }\n if (p.includes('seleção múltipla') && p.includes('filtros no cabeçalho')) {\n return {\n patch: {\n behavior: {\n selection: { enabled: true, type: 'multiple', mode: 'checkbox' },\n filtering: { enabled: true, columnFilters: { enabled: true, position: 'header' } },\n sorting: { enabled: true },\n },\n },\n explanation: 'Ativei seleção múltipla, filtros no cabeçalho e ordenação (MOCK Power User).',\n };\n }\n if (p.includes('paginação') || p.includes('paginacao')) {\n return { patch: { behavior: { pagination: { enabled: false } } }, explanation: 'Desativei a paginação da tabela (MOCK).' };\n }\n return null;\n }\n\n listModels(apiKey?: string): Observable<AiModel[]> {\n if (!this.isGeminiProvider()) {\n return throwError(() => new Error('Model listing only available for Gemini.'));\n }\n const key = apiKey || this.config.apiKey;\n if (!key) return throwError(() => new Error('API Key required'));\n\n return from(\n fetch(`/gemini-api/v1beta/models?key=${key}`).then(async (res) => {\n if (!res.ok) {\n const err = await res.json();\n throw new Error(err.error?.message || res.statusText);\n }\n return res.json();\n }),\n ).pipe(map((data) => (data.models || []) as AiModel[]));\n }\n\n testConnection(apiKey?: string, model?: string): Observable<boolean> {\n if (!this.isGeminiProvider()) {\n return throwError(() => new Error('Connection test only available for Gemini.'));\n }\n const key = apiKey || this.config.apiKey;\n if (!key) return throwError(() => new Error('API Key required'));\n\n const tempGenAI = new GoogleGenerativeAI(key);\n const tempModel = tempGenAI.getGenerativeModel({ model: model || this.config.model });\n\n return from(\n tempModel.generateContent({\n contents: [{ role: 'user', parts: [{ text: 'Hello' }] }],\n generationConfig: { maxOutputTokens: 5 },\n }),\n ).pipe(\n map(() => true),\n catchError((err) => throwError(() => err)),\n );\n }\n\n private resolveProvider(): string {\n const provider = this.config.provider || 'gemini';\n return provider.toString().trim().toLowerCase();\n }\n\n private isGeminiProvider(): boolean {\n return this.resolveProvider() === 'gemini';\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { GlobalConfigService } from '@praxisui/core';\nimport { AiIntegrationConfig } from '../models/ai-models';\n\n@Injectable({ providedIn: 'root' })\nexport class AiConfigService {\n private globalConfig = inject(GlobalConfigService);\n\n getConfig(): AiIntegrationConfig {\n const global = this.globalConfig.get<any>('ai') || {};\n return {\n provider: global.provider || 'gemini',\n apiKey: global.apiKey || '',\n model: global.model || 'gemini-2.0-flash',\n temperature: global.temperature ?? 0.1,\n maxTokens: global.maxTokens ?? 2048,\n timeout: global.timeout ?? 30000,\n retryAttempts: global.retryAttempts ?? 2,\n gatewayUrl: global.gatewayUrl\n };\n }\n}\n","/**\n * Generated from praxis-config-starter/docs/ai/contracts/praxis-ai-api-contract-v1.1.openapi.yaml.\n * Do not edit manually. Run praxis-config-starter/tools/contracts/generate-ai-contract-bindings.js.\n */\nexport const AI_CONTRACT_VERSION = 'v1.1' as const;\nexport const AI_CONTRACT_SCHEMA_HASH = '51b7901f1df633d89fc019a2e41f675cc5b87b135dfc8335aa96e53205034b26' as const;\nexport const AI_STREAM_EVENT_SCHEMA_VERSION = 'v1' as const;\nexport const AI_STREAM_EVENT_TYPES = ['status', 'thought.step', 'heartbeat', 'result', 'error', 'cancelled'] as const;\n\nexport type AiJsonPrimitive = string | number | boolean | null;\nexport type AiJsonArray = AiJsonValue[];\nexport interface AiJsonObject {\n [key: string]: AiJsonValue;\n}\nexport type AiJsonValue = AiJsonPrimitive | AiJsonObject | AiJsonArray;\n\nexport interface AiSchemaContextContract {\n path?: string | null;\n operation?: string | null;\n schemaType?: string | null;\n}\n\nexport interface AiChatMessageContract {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\nexport interface AiUiContextRefContract {\n componentType?: string | null;\n componentId?: string | null;\n routeKey?: string | null;\n schemaHash?: string | null;\n variantId?: string | null;\n}\n\nexport interface AiCurrentStateDigestContract {\n columns?: string[] | null;\n sort?: string | null;\n rowCount?: number | null;\n}\n\nexport interface AiOrchestratorRequestContract {\n componentId: string;\n componentType: string;\n userPrompt?: string;\n sessionId?: string;\n mode?: 'new' | 'continue';\n clientTurnId?: string;\n messages?: AiChatMessageContract[];\n summary?: string;\n uiContextRef?: AiUiContextRefContract;\n currentStateDigest?: AiCurrentStateDigestContract;\n currentState: AiJsonObject;\n dataProfile?: AiJsonObject | null;\n schemaFields?: AiJsonObject[] | null;\n runtimeState?: AiJsonObject | null;\n suggestedPatch?: AiJsonObject | null;\n contextHints?: AiJsonObject | null;\n aiMode?: string;\n requireSchema?: boolean;\n resourcePath?: string;\n contractVersion?: string;\n schemaHash?: string;\n schemaContext?: AiSchemaContextContract | null;\n variantId?: string;\n apiMethod?: string;\n apiTags?: string;\n apiSearchLimit?: number;\n}\n\nexport type AiOrchestratorResponseType = 'patch' | 'clarification' | 'error' | 'info';\n\nexport interface AiPatchDiffContract {\n path: string;\n before?: AiJsonValue;\n after?: AiJsonValue;\n}\n\nexport interface AiOptionContract {\n value?: string | null;\n label?: string | null;\n example?: string | null;\n contextHints?: AiJsonObject | null;\n}\n\nexport interface AiClarificationUiContract {\n responseType?: 'text' | 'choice' | 'confirm' | 'mixed' | 'context';\n selectionMode?: 'single' | 'multiple';\n presentation?: 'buttons' | 'list' | 'chips';\n allowCustom?: boolean | null;\n}\n\nexport interface AiMemoryInfoContract {\n summaryUpdated?: boolean | null;\n windowSize?: number | null;\n cached?: boolean | null;\n}\n\nexport interface AiOrchestratorResponseContract {\n sessionId?: string | null;\n code?: string | null;\n type?: AiOrchestratorResponseType;\n contractVersion?: string | null;\n schemaHash?: string | null;\n patch?: AiJsonObject | null;\n diff?: AiPatchDiffContract[] | null;\n explanation?: string | null;\n warnings?: string[] | null;\n message?: string | null;\n options?: string[] | null;\n optionPayloads?: AiOptionContract[] | null;\n contextRequest?: number[] | null;\n clarification?: AiClarificationUiContract;\n componentId?: string | null;\n componentType?: string | null;\n path?: string | null;\n providedValue?: AiJsonValue;\n allowedValues?: string[] | null;\n memory?: AiMemoryInfoContract;\n}\n\nexport interface AiPatchStreamStartResponseContract {\n streamId: string;\n threadId: string;\n turnId: string;\n eventSchemaVersion: string;\n streamAuthMode?: 'cookie' | 'signed_url_token' | null;\n streamAccessToken?: string | null;\n expiresAt: string;\n fallbackPatchUrl: string;\n}\n\nexport interface AiPatchStreamCancelResponseContract {\n streamId?: string | null;\n threadId?: string | null;\n turnId?: string | null;\n terminalState: 'cancelled' | 'completed' | 'not_found';\n message?: string | null;\n}\n\nexport interface AiPatchStreamEnvelopeContract<TPayload extends AiJsonObject = AiJsonObject> {\n eventId?: string | null;\n streamId: string;\n threadId: string;\n turnId: string;\n seq: number;\n eventSchemaVersion: string;\n timestamp: string;\n type: AiPatchStreamEventType;\n payload: TPayload;\n}\n\nexport interface ProblemResponseContract {\n timestamp?: string | null;\n status?: number | null;\n error?: string | null;\n message?: string | null;\n path?: string | null;\n detail?: string | null;\n [key: string]: AiJsonValue | undefined;\n}\n\nexport type AiPatchStreamEventType = (typeof AI_STREAM_EVENT_TYPES)[number];\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { ApiConfigStorageOptions, API_CONFIG_STORAGE_OPTIONS, GlobalAiConfig, GlobalConfig, GlobalConfigService } from '@praxisui/core';\nimport { Observable, from, of } from 'rxjs';\nimport { filter, map, take } from 'rxjs/operators';\nimport { AiSuggestion } from '../adapters/ai-config.adapter';\nimport {\n AI_CONTRACT_SCHEMA_HASH,\n AI_CONTRACT_VERSION,\n AI_STREAM_EVENT_SCHEMA_VERSION,\n AI_STREAM_EVENT_TYPES,\n AiChatMessageContract,\n AiCurrentStateDigestContract,\n AiJsonObject,\n AiOrchestratorRequestContract,\n AiOrchestratorResponseContract,\n AiPatchDiffContract,\n AiPatchStreamCancelResponseContract,\n AiPatchStreamEnvelopeContract,\n AiPatchStreamEventType as AiPatchStreamEventTypeContract,\n AiPatchStreamStartResponseContract,\n AiSchemaContextContract,\n AiUiContextRefContract,\n} from '../contracts/ai-contract.generated';\nimport { AiModel } from '../models/ai-models';\n\nexport const AI_INTENT_CONTRACT_VERSION = AI_CONTRACT_VERSION;\nexport const AI_INTENT_CONTRACT_SCHEMA_HASH = AI_CONTRACT_SCHEMA_HASH;\nconst AI_CONTRACT_VERSION_HEADER = 'X-Praxis-Contract-Version';\nconst AI_CONTRACT_SCHEMA_HASH_HEADER = 'X-Praxis-Schema-Hash';\nconst AI_STREAM_EVENT_TYPE_SET = new Set<string>(AI_STREAM_EVENT_TYPES);\n\nexport type AiSchemaContext = AiSchemaContextContract;\n\nexport interface AiSuggestionsRequest {\n componentId: string;\n componentType: string;\n currentState: AiJsonObject;\n dataProfile?: AiJsonObject | null;\n variantId?: string;\n maxSuggestions?: number;\n forceRefresh?: boolean;\n locale?: string;\n}\n\nexport interface AiSuggestionsResponse {\n suggestions: AiSuggestion[];\n source?: string;\n cacheKey?: string;\n cacheHit?: boolean;\n warnings?: string[];\n}\n\nexport type AiOrchestratorRequest = AiOrchestratorRequestContract;\nexport type AiChatMessage = AiChatMessageContract;\nexport type AiUiContextRef = AiUiContextRefContract;\nexport type AiCurrentStateDigest = AiCurrentStateDigestContract;\nexport type AiPatchDiff = AiPatchDiffContract;\n\nexport type AiOrchestratorResponse = AiOrchestratorResponseContract & {\n // Campos legados ainda utilizados no frontend enquanto o contrato v1.1 e a implementação convergem.\n riskLevel?: string;\n requiresConfirmation?: boolean;\n questions?: string[];\n};\n\nexport type AiPatchStreamEventType = AiPatchStreamEventTypeContract;\n\nexport type AiPatchStreamStartResponse = AiPatchStreamStartResponseContract;\nexport type AiPatchStreamCancelResponse = AiPatchStreamCancelResponseContract;\nexport type AiPatchStreamEnvelope<TPayload extends AiJsonObject = AiJsonObject> = AiPatchStreamEnvelopeContract<TPayload>;\n\nexport interface AiPatchStreamConnection {\n events$: Observable<AiPatchStreamEnvelope>;\n close: () => void;\n}\n\nexport type AiPatchStreamConnectionErrorKind = 'unsupported' | 'http_status' | 'transport' | 'parse' | 'schema';\n\nexport class AiPatchStreamConnectionError extends Error {\n constructor(\n public readonly kind: AiPatchStreamConnectionErrorKind,\n message: string,\n public readonly status?: number,\n ) {\n super(message);\n this.name = 'AiPatchStreamConnectionError';\n }\n}\n\nexport interface AiProviderModelsRequest {\n provider?: string;\n apiKey?: string;\n}\n\nexport interface AiProviderModelsResponse {\n provider?: string;\n success?: boolean;\n message?: string;\n models?: AiModel[];\n}\n\nexport interface AiProviderCatalogItem {\n id: string;\n label: string;\n description?: string;\n defaultModel?: string;\n requiresApiKey?: boolean;\n supportsModels?: boolean;\n supportsEmbeddings?: boolean;\n supportsTextStreaming?: boolean;\n supportsTurnCancellation?: boolean;\n iconKey?: string;\n}\n\nexport interface AiProviderCatalogResponse {\n providers: AiProviderCatalogItem[];\n}\n\nexport interface AiProviderTestRequest {\n provider?: string;\n apiKey?: string;\n model?: string;\n}\n\nexport interface AiProviderTestResponse {\n provider?: string;\n model?: string;\n success?: boolean;\n message?: string;\n}\n\nexport interface AiProviderStatusResponse {\n provider?: string;\n model?: string;\n hasApiKey?: boolean;\n source?: string;\n success?: boolean;\n message?: string;\n}\n\nexport interface AiContextTemplateMeta {\n variants?: Array<{ id?: string; registryKey?: string } | string>;\n defaultVariantId?: string;\n}\n\nexport interface AiContextTemplate {\n templateMeta?: AiContextTemplateMeta;\n}\n\nexport interface AiContextDTO {\n componentId?: string;\n componentType?: string;\n template?: AiContextTemplate | null;\n}\n\nexport interface AiHeaderContext {\n tenantId: string;\n env: string;\n userId: string;\n missing: string[];\n}\n\nconst DEFAULT_USER_ID_STORAGE_KEY = 'praxis.demoUserId';\n\nfunction buildDemoUserId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `demo-${crypto.randomUUID()}`;\n }\n return `demo-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction getOrCreateDefaultUserId(): string {\n if (typeof localStorage === 'undefined') return 'demo';\n try {\n const existing = localStorage.getItem(DEFAULT_USER_ID_STORAGE_KEY);\n if (existing && existing.trim()) return existing.trim();\n const generated = buildDemoUserId();\n localStorage.setItem(DEFAULT_USER_ID_STORAGE_KEY, generated);\n return generated;\n } catch {\n return 'demo';\n }\n}\n\nfunction resolveDefaultHeaders(): Record<string, string> {\n return {\n 'X-Tenant-ID': 'demo',\n 'X-User-ID': getOrCreateDefaultUserId(),\n 'X-Env': 'local',\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AiBackendApiService {\n private readonly http = inject(HttpClient);\n private readonly globalConfig = inject(GlobalConfigService);\n private readonly storageOpts = inject<ApiConfigStorageOptionsExtended | null>(API_CONFIG_STORAGE_OPTIONS, { optional: true });\n\n private readonly baseUrl = '/api/praxis/config/ai';\n private readonly contextUrl = '/api/praxis/config/ai-context';\n\n getSuggestions(request: AiSuggestionsRequest): Observable<AiSuggestionsResponse> {\n return this.http.post<AiSuggestionsResponse>(\n `${this.baseUrl}/suggestions`,\n request,\n { headers: this.buildHeaders() },\n );\n }\n\n getPatch(request: AiOrchestratorRequest): Observable<AiOrchestratorResponse> {\n const normalizedRequest: AiOrchestratorRequest = {\n ...request,\n contractVersion: this.normalizeContractVersion(request.contractVersion),\n schemaHash: this.normalizeContractSchemaHash(request.schemaHash),\n };\n return this.http.post<AiOrchestratorResponse>(\n `${this.baseUrl}/patch`,\n normalizedRequest,\n {\n headers: this.buildHeaders({\n [AI_CONTRACT_VERSION_HEADER]: normalizedRequest.contractVersion,\n [AI_CONTRACT_SCHEMA_HASH_HEADER]: normalizedRequest.schemaHash,\n }),\n },\n );\n }\n\n startPatchStream(request: AiOrchestratorRequest): Observable<AiPatchStreamStartResponse> {\n const normalizedRequest: AiOrchestratorRequest = {\n ...request,\n contractVersion: this.normalizeContractVersion(request.contractVersion),\n schemaHash: this.normalizeContractSchemaHash(request.schemaHash),\n };\n return this.http.post<AiPatchStreamStartResponse>(\n `${this.baseUrl}/patch/stream/start`,\n normalizedRequest,\n {\n headers: this.buildHeaders({\n [AI_CONTRACT_VERSION_HEADER]: normalizedRequest.contractVersion,\n [AI_CONTRACT_SCHEMA_HASH_HEADER]: normalizedRequest.schemaHash,\n }),\n withCredentials: true,\n },\n );\n }\n\n connectPatchStream(streamId: string, lastEventId?: string, accessToken?: string): AiPatchStreamConnection {\n const queryParams: string[] = [];\n if (lastEventId?.trim()) {\n queryParams.push(`lastEventId=${encodeURIComponent(lastEventId.trim())}`);\n }\n if (accessToken?.trim()) {\n queryParams.push(`accessToken=${encodeURIComponent(accessToken.trim())}`);\n }\n const query = queryParams.length > 0 ? `?${queryParams.join('&')}` : '';\n const streamPath = `${this.baseUrl}/patch/stream/${encodeURIComponent(streamId)}`;\n const endpoint = `${streamPath}${query}`;\n const probeEndpoint = `${streamPath}/probe${accessToken?.trim()\n ? `?accessToken=${encodeURIComponent(accessToken.trim())}`\n : ''}`;\n let source: EventSource | null = null;\n\n const events$ = new Observable<AiPatchStreamEnvelope>((subscriber) => {\n let disposed = false;\n const openStream = async () => {\n if (typeof EventSource === 'undefined') {\n subscriber.error(new AiPatchStreamConnectionError(\n 'unsupported',\n 'EventSource is not supported in this environment.',\n ));\n return;\n }\n const probeStatus = await this.probePatchStreamEndpoint(probeEndpoint);\n if (disposed) {\n return;\n }\n if (typeof probeStatus === 'number' && probeStatus >= 400) {\n subscriber.error(new AiPatchStreamConnectionError(\n 'http_status',\n `Patch stream probe failed with status ${probeStatus}.`,\n probeStatus,\n ));\n return;\n }\n source = new EventSource(endpoint, { withCredentials: true });\n source.onmessage = (messageEvent: MessageEvent<string>) => {\n try {\n const parsed = this.parsePatchStreamEnvelope(messageEvent.data);\n subscriber.next(parsed);\n } catch (error) {\n if (error instanceof AiPatchStreamConnectionError) {\n subscriber.error(error);\n return;\n }\n subscriber.error(new AiPatchStreamConnectionError(\n 'parse',\n 'Failed to parse stream event payload.',\n ));\n }\n };\n source.onerror = () => {\n if (!source) {\n subscriber.error(new AiPatchStreamConnectionError(\n 'transport',\n 'Patch stream connection error.',\n ));\n return;\n }\n // EventSource reconnects automatically for transient transport failures.\n // Only surface fatal closure so caller can decide fallback policy.\n if (source.readyState === EventSource.CLOSED) {\n subscriber.error(new AiPatchStreamConnectionError(\n 'transport',\n 'Patch stream connection closed unexpectedly.',\n ));\n }\n };\n };\n void openStream();\n return () => {\n disposed = true;\n if (source) {\n source.close();\n source = null;\n }\n };\n });\n\n return {\n events$,\n close: () => {\n if (source) {\n source.close();\n source = null;\n }\n },\n };\n }\n\n cancelPatchStream(streamId: string, accessToken?: string): Observable<AiPatchStreamCancelResponse> {\n const endpoint = `${this.baseUrl}/patch/stream/${encodeURIComponent(streamId)}/cancel${accessToken?.trim()\n ? `?accessToken=${encodeURIComponent(accessToken.trim())}`\n : ''}`;\n return this.http.post<AiPatchStreamCancelResponse>(\n endpoint,\n {},\n {\n headers: this.buildHeaders(),\n withCredentials: true,\n },\n );\n }\n\n listModels(request: AiProviderModelsRequest): Observable<AiProviderModelsResponse> {\n return this.http.post<AiProviderModelsResponse>(\n `${this.baseUrl}/providers/models`,\n request,\n { headers: this.buildHeaders() },\n );\n }\n\n listProviderCatalog(): Observable<AiProviderCatalogResponse> {\n return this.http.get<AiProviderCatalogResponse>(\n `${this.baseUrl}/providers/catalog`,\n { headers: this.buildHeaders() },\n );\n }\n\n testProvider(request: AiProviderTestRequest): Observable<AiProviderTestResponse> {\n return this.http.post<AiProviderTestResponse>(\n `${this.baseUrl}/providers/test`,\n request,\n { headers: this.buildHeaders() },\n );\n }\n\n getAiStatus(): Observable<AiProviderStatusResponse> {\n return this.http.get<AiProviderStatusResponse>(\n `${this.baseUrl}/status`,\n { headers: this.buildHeaders() },\n );\n }\n\n getAiContext(componentId: string, componentType: string): Observable<AiContextDTO> {\n const params = new HttpParams({ fromObject: { componentType } });\n return this.http.get<AiContextDTO>(\n `${this.contextUrl}/${componentId}`,\n { headers: this.buildHeaders(), params },\n );\n }\n\n loadGlobalAiConfig(): Observable<GlobalAiConfig | null> {\n const snapshot = this.globalConfig.get<GlobalAiConfig>('ai');\n if (snapshot !== undefined) {\n return of(snapshot ?? null);\n }\n return this.globalConfig.configChanges$.pipe(\n filter((cfg): cfg is GlobalConfig => !!cfg),\n map((cfg) => cfg.ai ?? null),\n take(1),\n );\n }\n\n saveGlobalAiConfig(aiConfig: GlobalAiConfig): Observable<void> {\n return from(this.globalConfig.saveGlobalConfig({ ai: aiConfig }));\n }\n\n getHeaderContext(): AiHeaderContext {\n const { merged, missing } = this.resolveHeaderMap();\n return {\n tenantId: merged['X-Tenant-ID'] || 'server',\n env: merged['X-Env'] || 'server',\n userId: merged['X-User-ID'] || 'server',\n missing,\n };\n }\n\n private buildHeaders(extra?: Record<string, string | undefined>): HttpHeaders {\n const { merged } = this.resolveHeaderMap(extra);\n return new HttpHeaders(merged);\n }\n\n private normalizeContractVersion(version?: string): string {\n const normalized = typeof version === 'string' ? version.trim() : '';\n return normalized || AI_INTENT_CONTRACT_VERSION;\n }\n\n private normalizeContractSchemaHash(schemaHash?: string): string {\n const normalized = typeof schemaHash === 'string' ? schemaHash.trim().toLowerCase() : '';\n if (/^[a-f0-9]{64}$/.test(normalized)) {\n return normalized;\n }\n return AI_INTENT_CONTRACT_SCHEMA_HASH;\n }\n\n private resolveHeaderMap(\n extra?: Record<string, string | undefined>,\n ): { merged: Record<string, string>; missing: string[] } {\n const allowLocalIdentityFallback = !!this.storageOpts?.allowLocalIdentityFallback;\n const defaults: Record<string, string> = this.storageOpts?.defaultHeaders\n ?? (allowLocalIdentityFallback ? resolveDefaultHeaders() : {});\n const base: Record<string, string | undefined> = this.storageOpts?.headersFactory?.() ?? {};\n const merged: Record<string, string> = { ...defaults };\n\n for (const [key, value] of Object.entries(base)) {\n if (typeof value === 'string' && value.trim()) {\n merged[key] = value;\n }\n }\n\n if (extra) {\n for (const [key, value] of Object.entries(extra)) {\n if (typeof value === 'string' && value.trim()) {\n merged[key] = value;\n }\n }\n }\n\n const missing: string[] = [];\n const requiredKeys = ['X-Tenant-ID', 'X-User-ID', 'X-Env'];\n const hasCustomDefaults = !!this.storageOpts?.defaultHeaders || allowLocalIdentityFallback;\n\n for (const key of requiredKeys) {\n const baseValue = base[key];\n const extraValue = extra?.[key];\n const providedByFactory = typeof baseValue === 'string' && baseValue.trim().length > 0;\n const providedByExtra = typeof extraValue === 'string' && extraValue.trim().length > 0;\n\n if (!providedByFactory && !providedByExtra && !hasCustomDefaults) {\n missing.push(key);\n }\n }\n\n return { merged, missing };\n }\n\n private parsePatchStreamEnvelope(rawData: string): AiPatchStreamEnvelope {\n let parsedValue: unknown;\n try {\n parsedValue = JSON.parse(rawData) as unknown;\n } catch {\n throw new AiPatchStreamConnectionError(\n 'parse',\n 'Failed to parse stream event payload.',\n );\n }\n if (!this.isPatchStreamEnvelope(parsedValue)) {\n throw new AiPatchStreamConnectionError(\n 'schema',\n 'Patch stream event payload does not match the contract envelope.',\n );\n }\n return parsedValue;\n }\n\n private isPatchStreamEnvelope(value: unknown): value is AiPatchStreamEnvelope {\n if (!this.isJsonObject(value)) {\n return false;\n }\n const eventId = value['eventId'];\n const streamId = value['streamId'];\n const threadId = value['threadId'];\n const turnId = value['turnId'];\n const seq = value['seq'];\n const eventSchemaVersion = value['eventSchemaVersion'];\n const timestamp = value['timestamp'];\n const type = value['type'];\n const payload = value['payload'];\n return (eventId === undefined || eventId === null || typeof eventId === 'string')\n && typeof streamId === 'string'\n && typeof threadId === 'string'\n && typeof turnId === 'string'\n && typeof seq === 'number'\n && Number.isFinite(seq)\n && typeof eventSchemaVersion === 'string'\n && eventSchemaVersion === AI_STREAM_EVENT_SCHEMA_VERSION\n && typeof timestamp === 'string'\n && typeof type === 'string'\n && AI_STREAM_EVENT_TYPE_SET.has(type)\n && this.isJsonObject(payload);\n }\n\n private isJsonObject(value: unknown): value is AiJsonObject {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n\n private async probePatchStreamEndpoint(endpoint: string): Promise<number | null> {\n if (typeof fetch === 'undefined') {\n return null;\n }\n try {\n const response = await fetch(endpoint, {\n method: 'GET',\n credentials: 'include',\n cache: 'no-store',\n });\n return response.status;\n } catch {\n return null;\n }\n }\n}\n\ntype ApiConfigStorageOptionsExtended = ApiConfigStorageOptions & {\n defaultHeaders?: Record<string, string>;\n allowLocalIdentityFallback?: boolean;\n};\n","import { Injectable } from '@angular/core';\nimport { SchemaType, Schema } from '@google/generative-ai';\nimport { MinifiedField } from '../models/ai-models';\n\n// Interface compatible with FieldSchema from visual-builder and FieldMetadata from core\nexport interface FieldSchemaLike {\n label: string;\n type: string;\n description?: string;\n required?: boolean;\n uiConfig?: { category?: string };\n allowedValues?: Array<{ value: any; label: string }>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SchemaMinifierService {\n\n /**\n * Converts complete FieldSchemas into a minified version for AI context (Token optimized)\n */\n minify(schemas: Record<string, FieldSchemaLike>): MinifiedField[] {\n return Object.entries(schemas).map(([id, schema]) => ({\n id,\n label: schema.label,\n type: schema.type,\n category: schema.uiConfig?.category,\n ...(schema.allowedValues ? {\n allowedValues: schema.allowedValues.map(v => ({\n value: v.value,\n label: v.label\n }))\n } : {})\n }));\n }\n\n /**\n * Formats minified fields into a string for the AI prompt (Legacy/Text mode)\n */\n toPromptFormat(fields: MinifiedField[]): string {\n return fields.map(f => {\n let line = `• ${f.id} (${f.type}): ${f.label}`;\n\n if (f.allowedValues && f.allowedValues.length > 0) {\n const values = f.allowedValues\n .map(v => `'${v.value}'`)\n .join(', ');\n line += ` [valores permitidos: ${values}]`;\n }\n\n return line;\n }).join('\\n');\n }\n\n /**\n * Transforms Praxis FieldSchemas into Google Gemini JSON Schema format.\n * This enables \"Response Schema\" enforcement in the API.\n */\n toGeminiSchema(fields: Record<string, FieldSchemaLike>): Schema {\n const properties: Record<string, Schema> = {};\n const required: string[] = [];\n\n Object.entries(fields).forEach(([key, field]) => {\n if (field.required) required.push(key);\n \n properties[key] = {\n type: this.mapTypeToGemini(field.type) as any,\n description: field.label + (field.description ? ` - ${field.description}` : ''),\n ...(field.allowedValues ? {\n enum: field.allowedValues.map(v => String(v.value))\n } : {})\n };\n });\n\n return {\n type: SchemaType.OBJECT,\n properties,\n required: required.length > 0 ? required : undefined\n };\n }\n\n private mapTypeToGemini(praxisType: string): SchemaType {\n switch (praxisType.toLowerCase()) {\n case 'number':\n case 'integer':\n case 'currency':\n return SchemaType.NUMBER;\n case 'boolean':\n case 'toggle':\n return SchemaType.BOOLEAN;\n case 'array':\n case 'multiselect':\n return SchemaType.ARRAY;\n case 'object':\n return SchemaType.OBJECT;\n default:\n return SchemaType.STRING;\n }\n }\n}","import { Injectable } from '@angular/core';\nimport { PromptContext } from '../core/models/ai-models';\nimport { SchemaMinifierService, FieldSchemaLike } from '../core/services/schema-minifier.service';\nimport { RulePropertyDefinition, RulePropertySchema } from '@praxisui/core';\n\n@Injectable({ providedIn: 'root' })\nexport class AiContextBuilderService {\n\n constructor(private schemaMinifier: SchemaMinifierService) {}\n\n /**\n * Builds the complete context for the AI prompt\n */\n buildPromptContext(\n fieldSchemas: Record<string, FieldSchemaLike>,\n targetType: 'field' | 'section' | 'action' | 'row' | 'column',\n propertySchema: RulePropertySchema\n ): PromptContext {\n\n const minifiedFields = this.schemaMinifier.minify(fieldSchemas);\n const fieldsText = this.schemaMinifier.toPromptFormat(minifiedFields);\n \n const properties = propertySchema[targetType] || [];\n const propertiesText = this.formatProperties(properties);\n \n const operatorsText = this.formatOperators();\n\n return {\n fieldsText,\n propertiesText,\n operatorsText,\n targetType,\n minifiedFields\n };\n }\n\n buildRulePrompt(userPrompt: string, context: PromptContext): string {\n return `\nVocê é um assistente especializado em criar regras de formulário.\n\nCAMPOS DISPONÍVEIS NO FORMULÁRIO:\n${context.fieldsText}\n\nPROPRIEDADES QUE VOCÊ PODE APLICAR EM \"${context.targetType.toUpperCase()}\":\n${context.propertiesText}\n\nOPERADORES DSL PERMITIDOS:\n${context.operatorsText}\n\nFORMATO DE RESPOSTA (JSON ESTRITO):\n{\n \"ruleName\": \"string - Nome descritivo da regra\",\n \"targetType\": \"${context.targetType}\",\n \"targetIds\": [\"id1\", \"id2\"],\n \"conditionDsl\": \"string - Condição em DSL ou null para sempre aplicar\",\n \"effects\": {\n \"properties\": { \"prop1\": valor1, \"prop2\": valor2 },\n \"propertiesWhenFalse\": { \"prop1\": valorAlternativo }\n }\n}\n\nREGRAS CRÍTICAS:\n1. Use APENAS campos listados acima\n2. Use APENAS propriedades listadas para o targetType especificado\n3. Use APENAS operadores DSL permitidos\n4. Se o usuário pedir \"sempre\", use \"conditionDsl\": null\n5. Para condições negativas (\"esconder se NÃO...\"), inverta a lógica na condição\n6. Retorne APENAS o JSON, sem markdown, comentários ou explicações\n\nEXEMPLOS DE SAÍDA:\n\n1. Usuário: \"Esconder telefone se for menor de idade\"\n Resposta:\n {\n \"ruleName\": \"Ocultar telefone menores\",\n \"targetType\": \"field\",\n \"targetIds\": [\"telefone\"],\n \"conditionDsl\": \"idade lt 18\",\n \"effects\": {\n \"properties\": { \"visible\": false }\n }\n }\n\n2. Usuário: \"Tornar email obrigatório se tipo for Pessoa Física\"\n Resposta:\n {\n \"ruleName\": \"Email obrigatório PF\",\n \"targetType\": \"field\",\n \"targetIds\": [\"email\"],\n \"conditionDsl\": \"tipoPessoa eq 'PF'\",\n \"effects\": {\n \"properties\": { \"required\": true },\n \"propertiesWhenFalse\": { \"required\": false }\n }\n }\n\nPERGUNTA DO USUÁRIO:\n\"${userPrompt}\"\n\nResposta (JSON puro, sem markdown):\n`.trim();\n }\n\n buildSuggestionPrompt(context: PromptContext): string {\n return `\nVocê é um assistente de UX para formulários.\n\nCAMPOS DISPONÍVEIS:\n${context.fieldsText}\n\nALVO ATUAL: ${context.targetType}\n\nTAREFA:\n- Analise os campos e sugira 3 regras de negócio plausíveis em português que façam sentido para \"${context.targetType}\".\n- Seja direto e específico, citando nomes reais dos campos.\n- Misture condições com null/empty/valores de lista quando fizer sentido.\n- Não use markdown nem explicações.\n\nFORMATO DE RESPOSTA:\n[\"Sugestão 1\", \"Sugestão 2\", \"Sugestão 3\"]\n`.trim();\n }\n\n /**\n * Formats available properties by targetType\n */\n private formatProperties(properties: RulePropertyDefinition[]): string {\n return properties\n .map(prop => {\n let line = `• ${prop.name} (${prop.type}): ${prop.label}`;\n\n if (prop.enumValues && prop.enumValues.length > 0) {\n const values = prop.enumValues\n .map(v => `'${v.value}'`)\n .join(', ');\n line += ` [valores: ${values}]`;\n }\n\n if (prop.description) {\n line += ` - ${prop.description}`;\n }\n\n return line;\n })\n .join('\\n');\n }\n\n /**\n * Lists DSL operators with examples\n */\n private formatOperators(): string {\n return `\nCOMPARAÇÃO:\n• eq (igual): campo eq 'valor'\n• neq (diferente): campo neq 'valor'\n• lt (menor): idade lt 18\n• lte (menor ou igual): idade lte 18\n• gt (maior): preco gt 100\n• gte (maior ou igual): preco gte 100\n\nTEXTO:\n• contains (contém): nome contains 'Silva'\n• startsWith (começa com): email startsWith 'admin'\n• endsWith (termina com): arquivo endsWith '.pdf'\n\nCONJUNTO:\n• in (está em): status in ['ativo', 'pendente']\n• notIn (não está em): tipo notIn ['cancelado']\n\nREGEX:\n• matches (corresponde): cpf matches '^\\\\d{11}$'\n• notMatches (não corresponde): senha notMatches 'senha123'\n\nNULIDADE:\n• isEmpty (vazio): campo isEmpty\n• isNotEmpty (não vazio): campo isNotEmpty\n• isNull (nulo): campo isNull\n• isNotNull (não nulo): campo isNotNull\n\nLÓGICOS:\n• and: condicao1 and condicao2\n• or: condicao1 or condicao2\n• not: not(condicao)\n `.trim();\n }\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'praxis-ai-streaming-feedback',\n standalone: true,\n imports: [CommonModule, MatIconModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ai-processing-overlay\">\n <div class=\"ai-pulse-ring\"></div>\n <mat-icon class=\"sparkle-icon\">auto_awesome</mat-icon>\n <div class=\"processing-text\">\n <h3 *ngIf=\"title\">{{ title }}</h3>\n <div class=\"stream-content\">\n <p class=\"fade-text\" [class.thinking]=\"isThinking\">{{ displayText }}<span class=\"cursor\">|</span></p>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .ai-processing-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.92);\n backdrop-filter: blur(6px);\n z-index: 100;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 24px;\n border-radius: 8px;\n padding: 32px;\n text-align: center;\n }\n\n .sparkle-icon {\n font-size: 48px;\n width: 48px;\n height: 48px;\n color: #673ab7;\n animation: ai-pulse 2s infinite;\n z-index: 2;\n }\n\n .ai-pulse-ring {\n position: absolute;\n width: 120px;\n height: 120px;\n border-radius: 50%;\n background: radial-gradient(circle, rgba(103, 58, 183, 0.15) 0%, rgba(103, 58, 183, 0) 70%);\n animation: ai-ripple 2s infinite;\n z-index: 1;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n margin-top: -40px; /* Adjust for icon position */\n }\n\n .processing-text {\n z-index: 2;\n max-width: 400px;\n width: 100%;\n }\n\n .processing-text h3 {\n margin: 0 0 12px 0;\n color: #311b92;\n font-size: 18px;\n font-weight: 500;\n }\n\n .stream-content {\n min-height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .fade-text {\n margin: 0;\n color: #455a64;\n font-size: 14px;\n line-height: 1.5;\n white-space: pre-wrap;\n font-family: monospace; /* Code-like feel for \"thinking\" */\n }\n \n .fade-text.thinking {\n color: #673ab7;\n font-style: italic;\n }\n\n .cursor {\n display: inline-block;\n width: 2px;\n background-color: #673ab7;\n animation: blink 1s step-end infinite;\n margin-left: 2px;\n vertical-align: text-bottom;\n }\n\n @keyframes ai-pulse {\n 0% { transform: scale(1); opacity: 1; text-shadow: 0 0 10px rgba(103, 58, 183, 0.5); }\n 50% { transform: scale(1.1); opacity: 0.8; text-shadow: 0 0 20px rgba(103, 58, 183, 0.8); }\n 100% { transform: scale(1); opacity: 1; text-shadow: 0 0 10px rgba(103, 58, 183, 0.5); }\n }\n\n @keyframes ai-ripple {\n 0% { transform: translate(-50%, -50%) scale(0.8); opacity: 0.6; }\n 100% { transform: translate(-50%, -50%) scale(2.5); opacity: 0; }\n }\n\n @keyframes blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0; }\n }\n `]\n})\nexport class StreamingFeedbackComponent {\n @Input() title = 'Processando...';\n @Input() displayText = '';\n @Input() isThinking = false;\n}\n","import { Injectable } from '@angular/core';\nimport {\n DslParser,\n DslValidator,\n ValidationIssue,\n ValidationSeverity,\n ValidationIssueType,\n FunctionRegistry,\n} from '@praxisui/specification';\nimport { ContextProvider } from '@praxisui/specification';\n\n/**\n * Normalize DSL expression by replacing aliases with standard operators\n */\nexport function normalizeDsl(dsl: string): string {\n if (!dsl) return dsl;\n return dsl\n .replace(/\\beq\\b/gi, '==')\n .replace(/\\bneq\\b/gi, '!=')\n .replace(/\\blt\\b/gi, '<')\n .replace(/\\blte\\b/gi, '<=')\n .replace(/\\bgt\\b/gi, '>')\n .replace(/\\bgte\\b/gi, '>=');\n}\n\n/**\n * Configuration for parsing DSL expressions\n */\nexport interface DslParsingConfig {\n /** Available function registry */\n functionRegistry?: FunctionRegistry<any>;\n /** Context provider for variable resolution */\n contextProvider?: ContextProvider;\n /** Known field names for validation */\n knownFields?: string[];\n /** Enable performance warnings */\n enablePerformanceWarnings?: boolean;\n /** Maximum expression complexity */\n maxComplexity?: number;\n}\n\n/**\n * Result of parsing a DSL expression\n */\nexport interface DslParsingResult<T extends object = any> {\n /** Whether parsing was successful */\n success: boolean;\n /** Parsed specification (if successful) */\n specification?: any; // Would be Specification<T> but avoiding circular import\n /** Validation issues found */\n issues: ValidationIssue[];\n /** Performance metrics */\n metrics?: {\n parseTime: number;\n complexity: number;\n };\n}\n\n/**\n * Dedicated service for DSL parsing and validation\n * Extracted from SpecificationBridgeService to follow SRP\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class DslParsingService {\n constructor() { }\n\n /**\n * Parse a DSL expression into a specification\n */\n parseDsl<T extends object = any>(\n dslExpression: string,\n config?: DslParsingConfig,\n ): DslParsingResult<T> {\n const startTime = performance.now();\n const issues: ValidationIssue[] = [];\n\n // Normalize DSL (handle aliases like eq, lt, etc.)\n const normalizedDsl = DslParsingService.normalizeDsl(dslExpression);\n console.log(`[DslParsingService] Input: \"${dslExpression}\" -> Normalized: \"${normalizedDsl}\"`);\n\n try {\n const validator = new DslValidator({\n knownFields: config?.knownFields,\n functionRegistry: config?.functionRegistry,\n enablePerformanceWarnings: config?.enablePerformanceWarnings,\n maxComplexity: config?.maxComplexity,\n });\n const validationIssues = validator.validate(normalizedDsl);\n if (validationIssues.length > 0) {\n console.log('[DslParsingService] Validation Issues:', validationIssues);\n }\n issues.push(...validationIssues);\n\n const criticalErrors = issues.filter(\n (issue) => issue.severity === ValidationSeverity.ERROR,\n );\n if (criticalErrors.length > 0) {\n return {\n success: false,\n issues,\n metrics: {\n parseTime: performance.now() - startTime,\n complexity: this.calculateComplexity(normalizedDsl),\n },\n };\n }\n\n const parser = new DslParser<any>(config?.functionRegistry);\n const specification = parser.parse(normalizedDsl);\n const endTime = performance.now();\n\n return {\n success: true,\n specification,\n issues,\n metrics: {\n parseTime: endTime - startTime,\n complexity: this.calculateComplexity(normalizedDsl),\n },\n };\n } catch (error) {\n issues.push({\n type: ValidationIssueType.SYNTAX_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Failed to parse DSL: ${error instanceof Error ? error.message : 'Unknown error'\n }`,\n position: { start: 0, end: dslExpression.length, line: 1, column: 1 },\n });\n\n return {\n success: false,\n issues,\n metrics: {\n parseTime: performance.now() - startTime,\n complexity: this.calculateComplexity(dslExpression),\n },\n };\n }\n }\n\n\n\n /**\n * Normalize DSL expression (delegates to utility)\n */\n normalizeDsl(dsl: string): string {\n return normalizeDsl(dsl);\n }\n\n /**\n * Static wrapper for backward compatibility if needed\n */\n static normalizeDsl(dsl: string): string {\n return normalizeDsl(dsl);\n }\n\n /**\n * Validate DSL syntax without parsing\n */\n validateDsl(\n dslExpression: string,\n config?: DslParsingConfig,\n ): ValidationIssue[] {\n try {\n const validator = new DslValidator({\n knownFields: config?.knownFields,\n functionRegistry: config?.functionRegistry,\n enablePerformanceWarnings: config?.enablePerformanceWarnings,\n maxComplexity: config?.maxComplexity,\n });\n return validator.validate(dslExpression);\n } catch (error) {\n return [\n {\n type: ValidationIssueType.SYNTAX_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Validation failed: ${error instanceof Error ? error.message : 'Unknown error'\n }`,\n position: { start: 0, end: dslExpression.length, line: 1, column: 1 },\n },\n ];\n }\n }\n\n /**\n * Get suggestions for DSL completion\n */\n getDslSuggestions(\n partialExpression: string,\n cursorPosition: number,\n config?: DslParsingConfig,\n ): string[] {\n try {\n // This would typically use a language service or parser\n const suggestions: string[] = [];\n\n // Add field suggestions\n if (config?.knownFields) {\n const currentToken = this.getCurrentToken(\n partialExpression,\n cursorPosition,\n );\n const matchingFields = config.knownFields.filter((field) =>\n field.toLowerCase().startsWith(currentToken.toLowerCase()),\n );\n suggestions.push(...matchingFields);\n }\n\n // Add operator suggestions\n const operators = [\n '==',\n '!=',\n '>',\n '<',\n '>=',\n '<=',\n 'contains',\n 'startsWith',\n 'endsWith',\n ];\n suggestions.push(...operators);\n\n // Add function suggestions\n if (config?.functionRegistry) {\n // Would get function names from registry\n suggestions.push('sum()', 'count()', 'avg()', 'max()', 'min()');\n }\n\n return suggestions;\n } catch (error) {\n console.warn('Failed to get DSL suggestions:', error);\n return [];\n }\n }\n\n /**\n * Format DSL expression for readability\n */\n formatDsl(dslExpression: string): string {\n try {\n // Simple formatting rules\n return dslExpression\n .replace(/\\s*&&\\s*/g, ' && ')\n .replace(/\\s*\\|\\|\\s*/g, ' || ')\n .replace(/\\s*==\\s*/g, ' == ')\n .replace(/\\s*!=\\s*/g, ' != ')\n .replace(/\\s*>=\\s*/g, ' >= ')\n .replace(/\\s*<=\\s*/g, ' <= ')\n .replace(/\\s*>\\s*/g, ' > ')\n .replace(/\\s*<\\s*/g, ' < ')\n .replace(/\\(\\s+/g, '(')\n .replace(/\\s+\\)/g, ')')\n .trim();\n } catch (error) {\n console.warn('Failed to format DSL:', error);\n return dslExpression;\n }\n }\n\n /**\n * Check if DSL expression is syntactically valid\n */\n isValidDsl(dslExpression: string, config?: DslParsingConfig): boolean {\n const issues = this.validateDsl(dslExpression, config);\n return !issues.some((issue) => issue.severity === 'error');\n }\n\n private calculateComplexity(dslExpression: string): number {\n // Simple complexity calculation based on operators and nesting\n let complexity = 1;\n\n // Count operators\n complexity += (dslExpression.match(/&&|\\|\\|/g) || []).length * 2;\n complexity += (dslExpression.match(/==|!=|>=|<=|>|</g) || []).length;\n\n // Count parentheses (nesting)\n complexity += (dslExpression.match(/\\(/g) || []).length;\n\n // Count function calls\n complexity += (dslExpression.match(/\\w+\\(/g) || []).length * 3;\n\n return complexity;\n }\n\n private getCurrentToken(expression: string, cursorPosition: number): string {\n // Extract the current word/token at cursor position\n const beforeCursor = expression.substring(0, cursorPosition);\n const afterCursor = expression.substring(cursorPosition);\n\n const beforeMatch = beforeCursor.match(/(\\w+)$/);\n const afterMatch = afterCursor.match(/^(\\w*)/);\n\n const before = beforeMatch ? beforeMatch[1] : '';\n const after = afterMatch ? afterMatch[1] : '';\n\n return before + after;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AiRuleResponse, AiValidationResult, AiValidationError, AiValidationWarning } from '../models/ai-models';\nimport { DslParsingService } from './dsl-parsing.service';\nimport { FieldSchemaLike } from './schema-minifier.service';\nimport { RulePropertySchema, RulePropertyDefinition } from '@praxisui/core';\n\nexport interface ValidationContext {\n fieldSchemas: Record<string, FieldSchemaLike>;\n targetSchemas?: any;\n propertySchema: RulePropertySchema;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AiResponseValidatorService {\n\n constructor(\n private dslParsingService: DslParsingService\n ) {}\n\n /**\n * Validates the complete AI response\n */\n validate(\n response: AiRuleResponse,\n context: ValidationContext\n ): AiValidationResult {\n\n const errors: AiValidationError[] = [];\n const warnings: AiValidationWarning[] = [];\n let correctedResponse: AiRuleResponse = { ...response };\n\n // 1. Validate JSON Structure\n const structureErrors = this.validateStructure(response);\n errors.push(...structureErrors);\n\n if (structureErrors.length > 0) {\n return { valid: false, errors, warnings };\n }\n\n // 2. Validate Target IDs\n const { invalidIds, suggestions } = this.validateTargetIds(\n response.targetIds,\n response.targetType,\n context\n );\n\n if (invalidIds.length > 0) {\n errors.push({\n field: 'targetIds',\n message: `IDs inválidos: ${invalidIds.join(', ')}`,\n severity: 'error',\n code: 'INVALID_TARGET_IDS'\n });\n\n // Auto-correction attempt\n if (suggestions.length === invalidIds.length) {\n warnings.push({\n field: 'targetIds',\n message: `Autocorrigido: ${invalidIds.join(', ')} → ${suggestions.join(', ')}`,\n suggestion: suggestions.join(', ')\n });\n correctedResponse.targetIds = suggestions;\n }\n }\n\n // 3. Validate DSL Condition\n if (response.conditionDsl) {\n // Normalize DSL (e.g. == to eq) before validation if needed, \n // but dslParsingService usually handles standard operators.\n const dslResult = this.dslParsingService.parseDsl(\n response.conditionDsl,\n {\n knownFields: Object.keys(context.fieldSchemas)\n }\n );\n\n if (!dslResult.success) {\n const dslErrors = dslResult.issues.map(issue => ({\n field: 'conditionDsl',\n message: issue.message,\n severity: 'critical' as const,\n code: (issue as any).code || 'DSL_PARSE_ERROR'\n }));\n errors.push(...dslErrors);\n }\n }\n\n // 4. Validate Properties\n const validProps = ((context.propertySchema as any)[response.targetType] || [])\n .map((p: any) => p.name);\n\n const invalidProps = Object.keys(response.effects.properties || {})\n .filter(prop => !validProps.includes(prop));\n\n if (invalidProps.length > 0) {\n errors.push({\n field: 'effects.properties',\n message: `Propriedades inválidas para ${response.targetType}: ${invalidProps.join(', ')}`,\n severity: 'error',\n code: 'INVALID_PROPERTIES'\n });\n }\n\n // 5. Validate Property Types\n const propSchema: RulePropertyDefinition[] = (context.propertySchema as any)[response.targetType] || [];\n\n for (const [propName, propValue] of Object.entries(response.effects.properties || {})) {\n const schema = propSchema.find(p => p.name === propName);\n\n if (schema) {\n const typeValid = this.validatePropertyType(propValue, schema);\n\n if (!typeValid) {\n errors.push({\n field: `effects.properties.${propName}`,\n message: `Tipo inválido: esperado ${schema.type}, recebido ${typeof propValue}`,\n severity: 'error',\n code: 'INVALID_PROPERTY_TYPE'\n });\n }\n }\n }\n\n return {\n valid: errors.filter(e => e.severity !== 'warning').length === 0,\n errors,\n warnings,\n correctedResponse: warnings.length > 0 ? correctedResponse : undefined\n };\n }\n\n private validateStructure(response: any): AiValidationError[] {\n const errors: AiValidationError[] = [];\n\n if (!response.ruleName || typeof response.ruleName !== 'string') {\n errors.push({\n field: 'ruleName',\n message: 'ruleName é obrigatório e deve ser string',\n severity: 'critical',\n code: 'MISSING_RULE_NAME'\n });\n }\n\n if (!response.targetType || !['field', 'section', 'action', 'row', 'column'].includes(response.targetType)) {\n errors.push({\n field: 'targetType',\n message: 'targetType inválido',\n severity: 'critical',\n code: 'INVALID_TARGET_TYPE'\n });\n }\n\n if (!Array.isArray(response.targetIds) || response.targetIds.length === 0) {\n errors.push({\n field: 'targetIds',\n message: 'targetIds deve ser array não-vazio',\n severity: 'critical',\n code: 'MISSING_TARGET_IDS'\n });\n }\n\n if (!response.effects || typeof response.effects !== 'object') {\n errors.push({\n field: 'effects',\n message: 'effects é obrigatório e deve ser objeto',\n severity: 'critical',\n code: 'MISSING_EFFECTS'\n });\n }\n\n return errors;\n }\n\n private validateTargetIds(\n targetIds: string[],\n targetType: string,\n context: ValidationContext\n ): { invalidIds: string[]; suggestions: string[] } {\n\n const invalidIds: string[] = [];\n const suggestions: string[] = [];\n\n for (const id of targetIds) {\n const isValid = this.isValidTargetId(id, targetType, context);\n\n if (!isValid) {\n invalidIds.push(id);\n\n // Find similar ID\n const similar = this.findSimilarTargetId(id, targetType, context);\n if (similar) {\n suggestions.push(similar);\n }\n } else {\n suggestions.push(id); // Keep valid IDs in the suggestion list for reconstruction\n }\n }\n\n return { invalidIds, suggestions: suggestions.length === targetIds.length ? suggestions : [] };\n }\n\n private isValidTargetId(\n id: string,\n targetType: string,\n context: ValidationContext\n ): boolean {\n\n if (targetType === 'field') {\n return id in context.fieldSchemas;\n }\n\n if (targetType === 'section' && context.targetSchemas?.sections) {\n return id in context.targetSchemas.sections;\n }\n if (targetType === 'action' && context.targetSchemas?.actions) {\n return id in context.targetSchemas.actions;\n }\n if (targetType === 'row' && context.targetSchemas?.rows) {\n return id in context.targetSchemas.rows;\n }\n if (targetType === 'column' && context.targetSchemas?.columns) {\n return id in context.targetSchemas.columns;\n }\n\n // If we don't have schema validation for non-fields, we assume valid or check basic format\n // But for safety, return false if schema is missing but type is known\n return false;\n }\n\n private findSimilarTargetId(\n invalidId: string,\n targetType: string,\n context: ValidationContext\n ): string | null {\n\n let candidates: string[] = [];\n\n if (targetType === 'field') {\n candidates = Object.keys(context.fieldSchemas);\n } else if (targetType === 'section' && context.targetSchemas?.sections) {\n candidates = Object.keys(context.targetSchemas.sections);\n } else if (targetType === 'action' && context.targetSchemas?.actions) {\n candidates = Object.keys(context.targetSchemas.actions);\n }\n\n if (candidates.length === 0) return null;\n\n const similarities = candidates.map(candidate => ({\n id: candidate,\n score: this.calculateSimilarity(invalidId, candidate)\n }));\n\n similarities.sort((a, b) => b.score - a.score);\n\n // Threshold 0.6 for suggestion\n return similarities[0].score > 0.6 ? similarities[0].id : null;\n }\n\n private calculateSimilarity(str1: string, str2: string): number {\n const longer = str1.length > str2.length ? str1 : str2;\n const shorter = str1.length > str2.length ? str2 : str1;\n\n if (longer.length === 0) return 1.0;\n\n const editDistance = this.levenshteinDistance(longer, shorter);\n return (longer.length - editDistance) / longer.length;\n }\n\n private levenshteinDistance(str1: string, str2: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= str2.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= str1.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= str2.length; i++) {\n for (let j = 1; j <= str1.length; j++) {\n if (str2.charAt(i - 1) === str1.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j] + 1\n );\n }\n }\n }\n\n return matrix[str2.length][str1.length];\n }\n\n private validatePropertyType(\n value: any,\n schema: RulePropertyDefinition\n ): boolean {\n\n switch (schema.type) {\n case 'boolean':\n return typeof value === 'boolean';\n\n case 'string':\n return typeof value === 'string';\n\n case 'number':\n return typeof value === 'number';\n\n case 'enum':\n return schema.enumValues?.some(e => e.value === value) || false;\n\n case 'object':\n return typeof value === 'object' && value !== null;\n\n default:\n return true;\n }\n }\n}","import { Component, Inject, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { firstValueFrom } from 'rxjs';\n\nimport { PraxisAiService } from '../core/services/praxis-ai.service';\nimport { AiContextBuilderService } from '../context/ai-context-builder.service';\nimport { AiResponseValidatorService, ValidationContext } from '../core/services/ai-response-validator.service';\nimport { AiRuleResponse, AiValidationWarning } from '../core/models/ai-models';\nimport { FieldSchemaLike } from '../core/services/schema-minifier.service';\nimport { RulePropertySchema } from '@praxisui/core';\nimport { StreamingFeedbackComponent } from './streaming-feedback.component';\n\nexport interface AiWizardData {\n fieldSchemas: Record<string, FieldSchemaLike>;\n targetSchemas?: any;\n propertySchema: RulePropertySchema;\n}\n\ntype WizardStep = 'prompt' | 'review';\n\n@Component({\n selector: 'praxis-ai-rule-wizard-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatDialogModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatProgressSpinnerModule,\n MatSnackBarModule,\n MatExpansionModule,\n MatTabsModule,\n MatChipsModule,\n StreamingFeedbackComponent\n ],\n template: `\n <div class=\"ai-wizard-container\">\n <h2 mat-dialog-title class=\"wizard-title\">\n <mat-icon class=\"ai-icon\">auto_awesome</mat-icon>\n <span>Criar Regra com IA</span>\n <span class=\"step-badge\" *ngIf=\"currentStep === 'review'\">Revisão</span>\n </h2>\n\n <mat-dialog-content class=\"wizard-content\">\n \n <!-- STEP 1: PROMPT -->\n <div *ngIf=\"currentStep === 'prompt'\" class=\"step-prompt\">\n <p class=\"intro-text\">\n Descreva a regra que você deseja criar em linguagem natural e a IA irá gerar a configuração para você revisar.\n </p>\n\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"type-select\">\n <mat-label>Tipo de Alvo</mat-label>\n <mat-select [(ngModel)]=\"selectedTargetType\" (selectionChange)=\"onTargetTypeChange()\">\n <mat-option value=\"field\">Campo (Field)</mat-option>\n <mat-option value=\"section\">Seção (Section)</mat-option>\n <mat-option value=\"action\">Ação (Action)</mat-option>\n <mat-option value=\"row\">Linha (Row)</mat-option>\n <mat-option value=\"column\">Coluna (Column)</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <mat-form-field appearance=\"outline\" class=\"prompt-input\">\n <mat-label>Descreva sua regra</mat-label>\n <textarea \n matInput \n [(ngModel)]=\"userPrompt\" \n rows=\"6\" \n placeholder=\"Ex: Esconder o campo telefone se a idade for menor que 18 anos...\"\n [disabled]=\"isGenerating\"\n ></textarea>\n <mat-hint align=\"end\">{{userPrompt.length}} caracteres</mat-hint>\n </mat-form-field>\n\n <div class=\"suggestions-card\" data-testid=\"ai-suggestions\">\n <div class=\"suggestions-header\">\n <div class=\"title\">\n <mat-icon>lightbulb</mat-icon>\n Sugestões da IA\n </div>\n <button mat-icon-button type=\"button\" (click)=\"reloadSuggestions()\" [disabled]=\"loadingSuggestions\">\n <mat-icon>refresh</mat-icon>\n </button>\n </div>\n <div class=\"suggestions-body\" *ngIf=\"!loadingSuggestions && suggestions.length > 0; else suggestionsState\">\n <mat-chip-set aria-label=\"Sugestões de regras\">\n <mat-chip *ngFor=\"let suggestion of suggestions\" (click)=\"applySuggestion(suggestion)\" class=\"suggestion-chip\">\n {{ suggestion }}\n </mat-chip>\n </mat-chip-set>\n </div>\n <ng-template #suggestionsState>\n <div class=\"suggestions-loading\" *ngIf=\"loadingSuggestions\">\n <mat-progress-spinner diameter=\"20\" mode=\"indeterminate\"></mat-progress-spinner>\n <span>Gerando sugestões...</span>\n </div>\n <div class=\"suggestions-empty\" *ngIf=\"!loadingSuggestions && suggestions.length === 0\">\n Nenhuma sugestão disponível no momento.\n </div>\n </ng-template>\n </div>\n\n <mat-expansion-panel class=\"properties-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>info</mat-icon>\n Ver propriedades disponíveis\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"properties-list\">\n <div *ngFor=\"let prop of getAvailableProperties()\" class=\"prop-item\">\n <span class=\"prop-name\">{{prop.name}}</span>\n <span class=\"prop-type\">{{prop.type}}</span>\n <span class=\"prop-desc\" *ngIf=\"prop.label\">- {{prop.label}}</span>\n </div>\n </div>\n </mat-expansion-panel>\n </div>\n\n <!-- STEP 2: REVIEW -->\n <div *ngIf=\"currentStep === 'review' && generatedResponse\" class=\"step-review\">\n <div class=\"review-header\">\n <h3>{{ generatedResponse.ruleName }}</h3>\n <div class=\"target-badges\">\n <span class=\"badge-type\">{{ generatedResponse.targetType }}</span>\n <span *ngFor=\"let id of generatedResponse.targetIds\" class=\"badge-id\">{{ id }}</span>\n </div>\n </div>\n\n <div *ngIf=\"warnings.length > 0\" class=\"warnings-box\">\n <div class=\"warning-title\">\n <mat-icon>auto_fix_high</mat-icon>\n Correções Automáticas\n </div>\n <ul class=\"warning-list\">\n <li *ngFor=\"let w of warnings\">\n {{ w.message }}\n </li>\n </ul>\n </div>\n\n <mat-tab-group class=\"preview-tabs\" animationDuration=\"0ms\">\n <mat-tab label=\"Resumo\">\n <div class=\"summary-view\">\n <div class=\"summary-row\">\n <span class=\"label\">Condição:</span>\n <code class=\"value condition\" *ngIf=\"generatedResponse.conditionDsl\">{{ generatedResponse.conditionDsl }}</code>\n <span class=\"value\" *ngIf=\"!generatedResponse.conditionDsl\"><em>(Sempre aplicada)</em></span>\n </div>\n \n <div class=\"summary-row\">\n <span class=\"label\">Propriedades (True):</span>\n <div class=\"props-grid\">\n <div *ngFor=\"let p of getProps(generatedResponse.effects.properties)\" class=\"prop-pair\">\n <span class=\"p-key\">{{p.key}}:</span>\n <span class=\"p-val\">{{p.value}}</span>\n </div>\n <span *ngIf=\"!hasProps(generatedResponse.effects.properties)\">-</span>\n </div>\n </div>\n\n <div class=\"summary-row\" *ngIf=\"hasProps(generatedResponse.effects.propertiesWhenFalse)\">\n <span class=\"label\">Propriedades (False):</span>\n <div class=\"props-grid\">\n <div *ngFor=\"let p of getProps(generatedResponse.effects.propertiesWhenFalse)\" class=\"prop-pair\">\n <span class=\"p-key\">{{p.key}}:</span>\n <span class=\"p-val\">{{p.value}}</span>\n </div>\n </div>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"JSON\">\n <pre class=\"json-preview\">{{ generatedResponse | json }}</pre>\n </mat-tab>\n </mat-tab-group>\n\n </div>\n\n <!-- COMMON: LOADING & ERROR -->\n <div *ngIf=\"validationError\" class=\"error-box\">\n <mat-icon>error</mat-icon>\n <span>{{validationError}}</span>\n </div>\n\n <praxis-ai-streaming-feedback\n *ngIf=\"isGenerating\"\n [displayText]=\"streamingText || currentLoadingMessage\"\n [isThinking]=\"true\"\n [title]=\"'Criando sua regra...'\"\n ></praxis-ai-streaming-feedback>\n </mat-dialog-content>\n\n <mat-dialog-actions align=\"end\" class=\"sticky-actions\">\n <!-- ACTIONS: PROMPT -->\n <ng-container *ngIf=\"currentStep === 'prompt'\">\n <button mat-button mat-dialog-close [disabled]=\"isGenerating\">Cancelar</button>\n <button \n mat-flat-button \n color=\"primary\" \n (click)=\"generate()\" \n [disabled]=\"!userPrompt.trim() || isGenerating\"\n >\n <mat-icon>auto_awesome</mat-icon>\n Gerar Regra\n </button>\n </ng-container>\n\n <!-- ACTIONS: REVIEW -->\n <ng-container *ngIf=\"currentStep === 'review'\">\n <button mat-button (click)=\"backToPrompt()\">\n <mat-icon>arrow_back</mat-icon>\n Refinar Prompt\n </button>\n <button \n mat-flat-button \n color=\"primary\" \n (click)=\"confirm()\"\n >\n <mat-icon>check</mat-icon>\n Aplicar Regra\n </button>\n </ng-container>\n </mat-dialog-actions>\n </div>\n `,\n styles: [`\n .ai-wizard-container {\n position: relative;\n padding-bottom: 0;\n max-height: 85vh;\n display: flex;\n flex-direction: column;\n }\n \n .wizard-title {\n display: flex;\n align-items: center;\n gap: 12px;\n color: #673ab7; /* Deep Purple */\n margin: 0;\n padding: 20px 24px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n background: var(--md-sys-color-surface);\n z-index: 1;\n }\n\n .step-badge {\n font-size: 12px;\n background: rgba(103, 58, 183, 0.1);\n padding: 2px 8px;\n border-radius: 12px;\n margin-left: auto;\n }\n \n .ai-icon {\n color: #673ab7;\n }\n\n .wizard-content {\n flex: 1;\n overflow-y: auto;\n padding: 0; /* Remove default padding */\n min-height: 300px;\n }\n\n /* Add internal padding to steps instead */\n .step-prompt, .step-review {\n padding: 20px 24px;\n }\n\n .intro-text {\n color: var(--md-sys-color-on-surface-variant);\n margin-bottom: 24px;\n font-size: 14px;\n }\n\n .form-row {\n display: flex;\n gap: 16px;\n margin-bottom: 8px;\n }\n\n .type-select {\n width: 200px;\n }\n\n .prompt-input {\n width: 100%;\n }\n\n .properties-panel {\n margin-top: 16px;\n box-shadow: none;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 8px !important;\n }\n\n .suggestions-card {\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 8px;\n padding: 12px;\n margin: 12px 0 4px;\n background: var(--md-sys-color-surface-container-low);\n }\n .suggestions-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n gap: 8px;\n }\n .suggestions-header .title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n font-size: 14px;\n }\n .suggestions-body {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n .suggestion-chip {\n cursor: pointer;\n max-width: 100%;\n white-space: normal;\n line-height: 1.3;\n }\n .suggestions-loading,\n .suggestions-empty {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--md-sys-color-on-surface-variant);\n font-size: 13px;\n }\n\n .properties-list {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 8px;\n padding: 8px 0;\n }\n\n .prop-item {\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .prop-name {\n font-weight: 600;\n font-family: monospace;\n }\n\n .prop-type {\n color: var(--md-sys-color-primary);\n background: var(--md-sys-color-primary-container);\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 10px;\n }\n \n .prop-desc {\n color: var(--md-sys-color-on-surface-variant);\n font-style: italic;\n }\n\n /* REVIEW STYLES */\n .review-header {\n margin-bottom: 20px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n padding-bottom: 12px;\n }\n .review-header h3 { margin: 0 0 8px 0; font-size: 18px; }\n\n .target-badges { display: flex; gap: 8px; }\n .badge-type { \n background: #e0e0e0; color: #424242; \n padding: 2px 8px; border-radius: 4px; font-size: 11px; text-transform: uppercase; font-weight: bold;\n }\n .badge-id { \n background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); \n padding: 2px 8px; border-radius: 4px; font-size: 12px; font-family: monospace;\n }\n\n .warnings-box {\n background: #fff8e1;\n border: 1px solid #ffecb3;\n border-radius: 8px;\n padding: 12px;\n margin-bottom: 16px;\n }\n .warning-title {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #f57f17;\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 8px;\n }\n .warning-title mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .warning-list { margin: 0; padding-left: 24px; font-size: 13px; color: #5d4037; }\n\n .summary-view {\n padding: 16px;\n background: var(--md-sys-color-surface-container-low);\n border-radius: 8px;\n margin-top: 12px;\n }\n .summary-row { margin-bottom: 12px; }\n .summary-row:last-child { margin-bottom: 0; }\n .label { display: block; font-size: 11px; text-transform: uppercase; color: var(--md-sys-color-on-surface-variant); margin-bottom: 4px; }\n .value { font-size: 14px; }\n .value.condition { font-family: monospace; color: var(--md-sys-color-primary); background: rgba(0,0,0,0.03); padding: 2px 4px; border-radius: 4px; }\n\n .props-grid { display: flex; flex-wrap: wrap; gap: 12px; }\n .prop-pair { \n background: white; border: 1px solid var(--md-sys-color-outline-variant); \n padding: 4px 8px; border-radius: 4px; font-size: 13px; \n }\n .p-key { font-weight: 600; margin-right: 4px; }\n .p-val { color: var(--md-sys-color-primary); }\n\n .json-preview {\n background: #f5f5f5;\n padding: 12px;\n border-radius: 8px;\n font-size: 12px;\n max-height: 300px;\n overflow: auto;\n margin-top: 12px;\n }\n\n /* COMMON */\n .error-box {\n margin-top: 16px;\n padding: 12px;\n background-color: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n border-radius: 8px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n font-size: 13px;\n }\n\n .ai-processing-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.85);\n backdrop-filter: blur(4px);\n z-index: 10;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 24px;\n border-radius: 8px;\n }\n\n .sparkle-icon {\n font-size: 48px;\n width: 48px;\n height: 48px;\n color: #673ab7;\n animation: ai-pulse 2s infinite;\n z-index: 2;\n }\n\n .ai-pulse-ring {\n position: absolute;\n width: 80px;\n height: 80px;\n border-radius: 50%;\n background: radial-gradient(circle, rgba(103, 58, 183, 0.2) 0%, rgba(103, 58, 183, 0) 70%);\n animation: ai-ripple 2s infinite;\n z-index: 1;\n }\n\n .processing-text {\n text-align: center;\n z-index: 2;\n }\n\n .processing-text h3 {\n margin: 0 0 8px 0;\n color: #311b92;\n font-size: 18px;\n font-weight: 500;\n }\n\n .fade-text {\n margin: 0;\n color: #673ab7;\n font-size: 14px;\n font-style: italic;\n min-height: 20px;\n animation: text-fade 0.5s ease-in-out;\n }\n\n @keyframes ai-pulse {\n 0% { transform: scale(1); opacity: 1; text-shadow: 0 0 10px rgba(103, 58, 183, 0.5); }\n 50% { transform: scale(1.1); opacity: 0.8; text-shadow: 0 0 20px rgba(103, 58, 183, 0.8); }\n 100% { transform: scale(1); opacity: 1; text-shadow: 0 0 10px rgba(103, 58, 183, 0.5); }\n }\n\n @keyframes ai-ripple {\n 0% { transform: scale(0.8); opacity: 0.6; }\n 100% { transform: scale(2.5); opacity: 0; }\n }\n\n @keyframes text-fade {\n 0% { opacity: 0; transform: translateY(5px); }\n 100% { opacity: 1; transform: translateY(0); }\n }\n `]\n})\nexport class AiRuleWizardDialogComponent implements OnInit {\n \n selectedTargetType: 'field' | 'section' | 'action' | 'row' | 'column' = 'field';\n userPrompt = '';\n isGenerating = false;\n validationError: string | null = null;\n loadingSuggestions = false;\n suggestions: string[] = [];\n private suggestionsCache = new Map<string, string[]>();\n private suggestionsRequestId = 0;\n \n // Step Management\n currentStep: WizardStep = 'prompt';\n generatedResponse: AiRuleResponse | null = null;\n warnings: AiValidationWarning[] = [];\n\n // Loading UX\n loadingMessages = [\n 'Analisando estrutura do formulário...',\n 'Interpretando sua solicitação...',\n 'Construindo regra lógica...',\n 'Validando compatibilidade...',\n 'Finalizando detalhes...'\n ];\n currentLoadingMessage = this.loadingMessages[0];\n streamingText = '';\n private loadingInterval: any;\n\n constructor(\n public dialogRef: MatDialogRef<AiRuleWizardDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: AiWizardData,\n private aiService: PraxisAiService,\n private validator: AiResponseValidatorService,\n private snackBar: MatSnackBar,\n private contextBuilder: AiContextBuilderService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.loadSuggestions();\n }\n\n onTargetTypeChange(): void {\n this.loadSuggestions();\n }\n\n getAvailableProperties() {\n return this.data.propertySchema[this.selectedTargetType] || [];\n }\n\n async loadSuggestions(forceRefresh = false): Promise<void> {\n const cacheKey = `${this.selectedTargetType}`;\n if (!forceRefresh && this.suggestionsCache.has(cacheKey)) {\n this.suggestions = this.suggestionsCache.get(cacheKey) || [];\n return;\n }\n\n const context = this.contextBuilder.buildPromptContext(\n this.data.fieldSchemas as any,\n this.selectedTargetType,\n this.data.propertySchema\n );\n\n const requestId = ++this.suggestionsRequestId;\n this.loadingSuggestions = true;\n try {\n const prompt = this.contextBuilder.buildSuggestionPrompt(context);\n const suggestions = await firstValueFrom(\n this.aiService.generateJson<string[]>(prompt)\n );\n \n if (this.suggestionsRequestId !== requestId) return;\n this.suggestions = suggestions || [];\n this.suggestionsCache.set(cacheKey, this.suggestions);\n } catch {\n if (this.suggestionsRequestId !== requestId) return;\n this.suggestions = [];\n } finally {\n if (this.suggestionsRequestId === requestId) {\n this.loadingSuggestions = false;\n this.cdr.detectChanges();\n }\n }\n }\n\n reloadSuggestions(): void {\n this.loadSuggestions(true);\n }\n\n applySuggestion(text: string): void {\n this.userPrompt = text;\n this.currentStep = 'prompt';\n }\n\n async generate(): Promise<void> {\n this.startLoadingUX();\n this.validationError = null;\n this.warnings = [];\n this.streamingText = '';\n\n try {\n const context = this.contextBuilder.buildPromptContext(\n this.data.fieldSchemas as any,\n this.selectedTargetType,\n this.data.propertySchema\n );\n const prompt = this.contextBuilder.buildRulePrompt(this.userPrompt, context);\n \n // Use streaming for better UX\n let fullText = '';\n await new Promise<void>((resolve, reject) => {\n this.aiService.generateContentStream(prompt).subscribe({\n next: (chunk) => {\n fullText += chunk;\n // Only show a preview of the stream to avoid UI jumpiness with large JSON\n // or show \"Thinking...\" messages if we had a thinking model.\n // For now, let's show the raw text building up, it looks \"techy\".\n // Truncate if too long to keep overlay clean? \n // Actually, let's just show the last few lines or a generic \"Building...\" \n // if it looks like code.\n // For this demo, let's stream it all.\n this.streamingText = fullText.length > 300 ? fullText.slice(-300) + '...' : fullText;\n this.cdr.detectChanges();\n },\n error: reject,\n complete: resolve\n });\n });\n\n // Parse the full accumulated text\n const cleaned = fullText.replace(/```json\\n?|\\n?```/g, '').trim();\n const response = JSON.parse(cleaned) as AiRuleResponse;\n\n const valContext: ValidationContext = {\n fieldSchemas: this.data.fieldSchemas,\n targetSchemas: this.data.targetSchemas,\n propertySchema: this.data.propertySchema\n };\n\n const validation = this.validator.validate(response, valContext);\n\n if (!validation.valid) {\n this.validationError = `A IA gerou uma regra inválida: ${validation.errors[0].message}`;\n this.stopLoadingUX();\n return;\n }\n\n // Use corrected response if available (autocorrect)\n this.generatedResponse = validation.correctedResponse || response;\n this.warnings = validation.warnings;\n \n // Advance to Review Step instead of closing\n this.currentStep = 'review';\n\n } catch (error: any) {\n console.error('Generation error:', error);\n this.validationError = `Erro ao comunicar com a IA: ${error.message || error}`;\n } finally {\n this.stopLoadingUX();\n }\n }\n\n private startLoadingUX(): void {\n this.isGenerating = true;\n this.currentLoadingMessage = this.loadingMessages[0];\n let i = 0;\n this.loadingInterval = setInterval(() => {\n i = (i + 1) % this.loadingMessages.length;\n this.currentLoadingMessage = this.loadingMessages[i];\n }, 2000);\n }\n\n private stopLoadingUX(): void {\n this.isGenerating = false;\n if (this.loadingInterval) {\n clearInterval(this.loadingInterval);\n }\n }\n\n backToPrompt(): void {\n this.currentStep = 'prompt';\n this.validationError = null;\n }\n\n confirm(): void {\n if (this.generatedResponse) {\n this.dialogRef.close(this.generatedResponse);\n }\n }\n\n // Helpers for Template\n getProps(obj: any): {key: string, value: any}[] {\n if (!obj) return [];\n return Object.entries(obj).map(([key, value]) => ({key, value}));\n }\n\n hasProps(obj: any): boolean {\n return obj && Object.keys(obj).length > 0;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { PraxisAiService } from './praxis-ai.service';\nimport { AiConfigAdapter } from '../adapters/ai-config.adapter';\nimport { Capability } from '../models/ai-models';\n\nexport interface ConfigAgentRequest {\n adapter: AiConfigAdapter;\n userIntent: string;\n}\n\nexport interface ConfigAgentResponse {\n patch: any;\n explanation: string;\n applied: boolean;\n mockMode: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AiConfigAgentService {\n constructor(private ai: PraxisAiService) {}\n\n isMockMode(): boolean {\n return this.ai.isMockMode();\n }\n\n /**\n * Legacy single-shot flow: builds a prompt with full config + capabilities.\n * Two-step flow is preferred (see TableAiAdapter.processUserIntent), but this remains as fallback.\n */\n async generateConfigPatch(request: ConfigAgentRequest): Promise<ConfigAgentResponse> {\n const { adapter, userIntent } = request;\n const capabilities = adapter.getCapabilities();\n const currentConfig = adapter.getCurrentConfig();\n const runtimeState = adapter.getRuntimeState ? adapter.getRuntimeState() : {};\n\n const prompt = this.buildPrompt(adapter.componentName, userIntent, currentConfig, capabilities, runtimeState);\n\n const response = await firstValueFrom(\n this.ai.generateJson<{ patch: any; explanation: string }>(prompt, undefined, undefined)\n );\n\n return {\n patch: (response as any)?.patch,\n explanation: (response as any)?.explanation,\n applied: false,\n mockMode: this.ai.isMockMode(),\n };\n }\n\n private buildPrompt(\n componentName: string,\n intent: string,\n config: any,\n capabilities: Capability[],\n runtime: any\n ): string {\n const capsList = capabilities\n .map((c) => `- ${c.path} (${c.valueKind}): ${c.description}`)\n .join('\\n');\n const configStr = JSON.stringify(config, null, 2);\n const runtimeStr = JSON.stringify(runtime, null, 2);\n\n return `\nYou are an expert configuration assistant for a UI component: ${componentName}.\n\nCONTEXT:\n1. **Capabilities** (What you can modify):\n${capsList}\n\n2. **Current Configuration** (JSON):\n${configStr}\n\n3. **Runtime State** (Read-only info):\n${runtimeStr}\n\nUSER INTENT:\n\"${intent}\"\n\nINSTRUCTIONS:\n- Analyze the user intent and the current configuration.\n- Generate a JSON PATCH that satisfies the intent.\n- The patch must be a partial object that can be deep-merged into the current configuration.\n- ONLY modify properties listed in the Capabilities.\n- If the intent is vague, make a best-effort reasonable guess based on standard UI patterns.\n- Provide a short explanation of what you changed.\n\nOUTPUT FORMAT (JSON):\n{\n \"patch\": { ... partial config object ... },\n \"explanation\": \"Brief summary of changes for the user.\"\n}\n `.trim();\n }\n}\n","import { Capability } from '../models/ai-models';\nimport { AiConfigAdapter, PatchResult, AiSuggestion } from './ai-config.adapter';\n\n/**\n * Base implementation for AI Adapters.\n * Provides common validation logic against the Capabilities Catalog.\n */\nexport abstract class BaseAiAdapter<TConfig = any> implements AiConfigAdapter<TConfig> {\n abstract componentName: string;\n\n abstract getCurrentConfig(): TConfig;\n abstract getCapabilities(): Capability[];\n abstract applyPatch(patch: Partial<TConfig>, intent?: string): Promise<PatchResult>;\n \n abstract createSnapshot(): any;\n abstract restoreSnapshot(snapshot: any): Promise<void>;\n\n // Optional methods that can be overridden\n getTaskPresets?(): Record<string, string[]> {\n return {};\n }\n\n async getSuggestions(_forceReload = false): Promise<AiSuggestion[]> {\n return [];\n }\n\n getSuggestionContext?(): Record<string, any> {\n return {};\n }\n\n getRuntimeState?(): Record<string, any> {\n return {};\n }\n\n /**\n * Helper to validate a patch against the capabilities catalog.\n * Removes keys that are not in the allowed paths.\n */\n protected validatePatchAgainstCapabilities(patch: any): any {\n // TODO: Implement deep validation\n return patch;\n }\n\n /**\n * Helper to check if a patch contains critical changes.\n */\n protected getCriticalWarnings(patch: any): string[] {\n const warnings: string[] = [];\n const capabilities = this.getCapabilities();\n \n // Simple check: flatten patch keys and check against critical paths\n // In a real implementation, we would traverse the patch object\n \n return warnings;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { AiBackendApiService, AiHeaderContext } from './ai-backend-api.service';\n\nexport type AssistantMessageRole = 'user' | 'assistant' | 'system';\n\nexport interface AssistantHistoryMessage {\n id: string;\n role: AssistantMessageRole;\n text: string;\n createdAt: string;\n context?: {\n componentId?: string;\n componentType?: string;\n variantId?: string;\n suggestionId?: string;\n usedRag?: boolean;\n };\n}\n\nexport interface AssistantHistorySession {\n id: string;\n title: string;\n tenantId: string;\n env: string;\n userId: string;\n componentId?: string;\n componentType?: string;\n serverSessionId?: string | null;\n createdAt: string;\n updatedAt: string;\n messages: AssistantHistoryMessage[];\n summary?: string;\n}\n\nexport interface AssistantHistoryIndex {\n version: 1;\n tenantId: string;\n env: string;\n userId: string;\n sessions: Array<{\n id: string;\n title: string;\n updatedAt: string;\n componentId?: string;\n componentType?: string;\n }>;\n}\n\nexport interface AssistantHistoryContext extends AiHeaderContext {\n storageAvailable: boolean;\n}\n\nconst HISTORY_INDEX_PREFIX = 'praxis.ai.history.index';\nconst HISTORY_SESSION_PREFIX = 'praxis.ai.history.session';\nconst DEFAULT_SESSION_TITLE = 'Nova sessão';\nconst MAX_SESSIONS = 50;\nconst TTL_DAYS = 30;\nconst REDACTED_TOKEN = '[REDACTED]';\nconst REDACTED_JWT_TOKEN = '[JWT_REDACTED]';\n\n@Injectable({ providedIn: 'root' })\nexport class AssistantHistoryService {\n private readonly aiApi = inject(AiBackendApiService);\n private readonly storageAvailable = this.checkStorage();\n\n getContext(): AssistantHistoryContext {\n const context = this.aiApi.getHeaderContext();\n return { ...context, storageAvailable: this.storageAvailable };\n }\n\n listSessions(context: AssistantHistoryContext, limit = 10): AssistantHistoryIndex['sessions'] {\n if (!context.storageAvailable) return [];\n const index = this.sanitizeIndexTitles(context, this.ensureIndex(context));\n this.pruneOldSessions(context, index);\n const sorted = [...index.sessions].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n return sorted.slice(0, limit);\n }\n\n getSession(sessionId: string): AssistantHistorySession | null {\n const session = this.readJson<AssistantHistorySession>(this.sessionKey(sessionId));\n if (!session) return null;\n const sanitized = this.sanitizeSession(session);\n if (sanitized !== session) {\n this.writeJson(this.sessionKey(sessionId), sanitized);\n }\n return sanitized;\n }\n\n createSession(\n context: AssistantHistoryContext,\n componentId?: string | null,\n componentType?: string | null,\n title?: string,\n ): AssistantHistorySession | null {\n if (!context.storageAvailable) return null;\n const now = new Date().toISOString();\n const session: AssistantHistorySession = {\n id: this.generateId('session'),\n title: this.normalizeTitle(title),\n tenantId: context.tenantId,\n env: context.env,\n userId: context.userId,\n componentId: componentId || undefined,\n componentType: componentType || undefined,\n serverSessionId: null,\n createdAt: now,\n updatedAt: now,\n messages: [],\n };\n this.saveSession(context, session);\n return session;\n }\n\n addMessage(\n context: AssistantHistoryContext,\n sessionId: string,\n role: AssistantMessageRole,\n text: string,\n meta?: AssistantHistoryMessage['context'],\n ): AssistantHistorySession | null {\n if (!context.storageAvailable) return null;\n const session = this.getSession(sessionId);\n if (!session || !this.matchesContext(session, context)) return null;\n const cleaned = this.sanitizeForStorage(text);\n if (!cleaned) return session;\n const message: AssistantHistoryMessage = {\n id: this.generateId('msg'),\n role,\n text: cleaned,\n createdAt: new Date().toISOString(),\n context: meta,\n };\n session.messages = [...(session.messages || []), message];\n session.updatedAt = new Date().toISOString();\n if (role === 'user' && this.isDefaultTitle(session.title)) {\n session.title = this.normalizeTitle(cleaned);\n }\n if (role === 'assistant') {\n session.summary = this.normalizeSummary(cleaned);\n }\n this.saveSession(context, session);\n return session;\n }\n\n touchSession(context: AssistantHistoryContext, sessionId: string): void {\n if (!context.storageAvailable) return;\n const session = this.getSession(sessionId);\n if (!session || !this.matchesContext(session, context)) return;\n session.updatedAt = new Date().toISOString();\n this.saveSession(context, session);\n }\n\n updateServerSessionId(\n context: AssistantHistoryContext,\n sessionId: string,\n serverSessionId: string | null,\n ): AssistantHistorySession | null {\n if (!context.storageAvailable) return null;\n const session = this.getSession(sessionId);\n if (!session || !this.matchesContext(session, context)) return null;\n session.serverSessionId = serverSessionId;\n session.updatedAt = new Date().toISOString();\n this.saveSession(context, session);\n return session;\n }\n\n deleteSession(context: AssistantHistoryContext, sessionId: string): boolean {\n if (!context.storageAvailable) return false;\n const session = this.getSession(sessionId);\n if (session && !this.matchesContext(session, context)) return false;\n this.removeItem(this.sessionKey(sessionId));\n const index = this.ensureIndex(context);\n const nextSessions = index.sessions.filter((item) => item.id !== sessionId);\n if (nextSessions.length !== index.sessions.length) {\n index.sessions = nextSessions;\n this.writeJson(this.indexKey(context), index);\n }\n return true;\n }\n\n restoreSession(\n context: AssistantHistoryContext,\n session: AssistantHistorySession,\n touchUpdatedAt = true,\n ): AssistantHistorySession | null {\n if (!context.storageAvailable || !session) return null;\n if (!this.matchesContext(session, context)) return null;\n const restored: AssistantHistorySession = {\n ...session,\n updatedAt: touchUpdatedAt ? new Date().toISOString() : session.updatedAt,\n };\n this.saveSession(context, restored);\n return restored;\n }\n\n clearHistory(context: AssistantHistoryContext): void {\n if (!context.storageAvailable) return;\n const index = this.readJson<AssistantHistoryIndex>(this.indexKey(context));\n if (index?.sessions?.length) {\n for (const session of index.sessions) {\n this.removeItem(this.sessionKey(session.id));\n }\n }\n this.removeItem(this.indexKey(context));\n }\n\n private saveSession(context: AssistantHistoryContext, session: AssistantHistorySession): void {\n this.writeJson(this.sessionKey(session.id), session);\n const index = this.ensureIndex(context);\n const entry = {\n id: session.id,\n title: session.title,\n updatedAt: session.updatedAt,\n componentId: session.componentId,\n componentType: session.componentType,\n };\n const filtered = index.sessions.filter((item) => item.id !== session.id);\n index.sessions = [entry, ...filtered].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n if (index.sessions.length > MAX_SESSIONS) {\n index.sessions = index.sessions.slice(0, MAX_SESSIONS);\n }\n this.writeJson(this.indexKey(context), index);\n }\n\n private ensureIndex(context: AssistantHistoryContext): AssistantHistoryIndex {\n const key = this.indexKey(context);\n const existing = this.readJson<AssistantHistoryIndex>(key);\n if (existing && existing.version === 1 && this.matchesContext(existing, context)) {\n return existing;\n }\n const fresh: AssistantHistoryIndex = {\n version: 1,\n tenantId: context.tenantId,\n env: context.env,\n userId: context.userId,\n sessions: [],\n };\n this.writeJson(key, fresh);\n return fresh;\n }\n\n private pruneOldSessions(context: AssistantHistoryContext, index: AssistantHistoryIndex): void {\n if (!index.sessions.length) return;\n const cutoff = Date.now() - TTL_DAYS * 24 * 60 * 60 * 1000;\n const toKeep: typeof index.sessions = [];\n for (const session of index.sessions) {\n const ts = Date.parse(session.updatedAt);\n if (Number.isFinite(ts) && ts < cutoff) {\n this.removeItem(this.sessionKey(session.id));\n } else {\n toKeep.push(session);\n }\n }\n if (toKeep.length !== index.sessions.length) {\n index.sessions = toKeep;\n this.writeJson(this.indexKey(context), index);\n }\n }\n\n private matchesContext(\n value: { tenantId: string; env: string; userId: string },\n context: AssistantHistoryContext,\n ): boolean {\n return value.tenantId === context.tenantId\n && value.env === context.env\n && value.userId === context.userId;\n }\n\n private indexKey(context: AssistantHistoryContext): string {\n return `${HISTORY_INDEX_PREFIX}:${context.tenantId}:${context.env}:${context.userId}`;\n }\n\n private sessionKey(sessionId: string): string {\n return `${HISTORY_SESSION_PREFIX}:${sessionId}`;\n }\n\n private normalizeTitle(value?: string | null): string {\n const cleaned = this.sanitizeForStorage(value);\n if (!cleaned) return DEFAULT_SESSION_TITLE;\n return cleaned.length > 60 ? `${cleaned.slice(0, 57)}...` : cleaned;\n }\n\n private normalizeSummary(value?: string | null): string {\n const cleaned = this.sanitizeForStorage(value);\n if (!cleaned) return '';\n return cleaned.length > 200 ? `${cleaned.slice(0, 197)}...` : cleaned;\n }\n\n private sanitizeForStorage(value?: string | null): string {\n const raw = (value || '').trim();\n if (!raw) return '';\n let sanitized = raw;\n\n // Remove explicit secret assignments and query params before saving local history.\n sanitized = sanitized.replace(\n /((?:api[-_ ]?key|token|secret|senha|password)\\s*[:=]\\s*)(?:\"[^\"]*\"|'[^']*'|[^\\s,;]+)/gi,\n `$1${REDACTED_TOKEN}`,\n );\n sanitized = sanitized.replace(\n /([?&](?:api[-_]?key|token|secret|password|senha)=)[^&\\s]+/gi,\n `$1${REDACTED_TOKEN}`,\n );\n sanitized = sanitized.replace(/\\bBearer\\s+[A-Za-z0-9\\-._~+/]+=*/gi, `Bearer ${REDACTED_TOKEN}`);\n sanitized = sanitized.replace(/\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/g, REDACTED_JWT_TOKEN);\n sanitized = sanitized.replace(/\\bsk-[A-Za-z0-9]{20,}\\b/g, REDACTED_TOKEN);\n sanitized = sanitized.replace(\n /\\b(token|secret|senha|password)\\s+([A-Za-z0-9\\-._~+/=]{16,})\\b/gi,\n `$1 ${REDACTED_TOKEN}`,\n );\n\n return sanitized.replace(/\\s+/g, ' ').trim();\n }\n\n private sanitizeSession(session: AssistantHistorySession): AssistantHistorySession {\n let changed = false;\n const messages = (session.messages || []).map((msg) => {\n const text = this.sanitizeForStorage(msg.text);\n if (text === msg.text) return msg;\n changed = true;\n return { ...msg, text };\n });\n\n const title = this.normalizeTitle(session.title);\n const summary = this.normalizeSummary(session.summary);\n if (title !== session.title || summary !== (session.summary || '')) {\n changed = true;\n }\n if (!changed) return session;\n return {\n ...session,\n title,\n summary: summary || undefined,\n messages,\n };\n }\n\n private sanitizeIndexTitles(\n context: AssistantHistoryContext,\n index: AssistantHistoryIndex,\n ): AssistantHistoryIndex {\n let changed = false;\n const sessions = index.sessions.map((item) => {\n const title = this.normalizeTitle(item.title);\n if (title === item.title) return item;\n changed = true;\n return { ...item, title };\n });\n if (!changed) return index;\n const next: AssistantHistoryIndex = { ...index, sessions };\n this.writeJson(this.indexKey(context), next);\n return next;\n }\n\n private isDefaultTitle(value?: string | null): boolean {\n const normalized = (value || '').trim().toLowerCase();\n return !normalized || normalized === DEFAULT_SESSION_TITLE.toLowerCase();\n }\n\n private readJson<T>(key: string): T | null {\n if (!this.storageAvailable) return null;\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n }\n\n private writeJson(key: string, value: unknown): void {\n if (!this.storageAvailable) return;\n try {\n localStorage.setItem(key, JSON.stringify(value));\n } catch {\n // ignore quota errors\n }\n }\n\n private removeItem(key: string): void {\n if (!this.storageAvailable) return;\n try {\n localStorage.removeItem(key);\n } catch {\n // ignore\n }\n }\n\n private checkStorage(): boolean {\n if (typeof localStorage === 'undefined') return false;\n try {\n const key = '__praxis_ai_history_probe__';\n localStorage.setItem(key, '1');\n localStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n }\n\n private generateId(prefix: string): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `${prefix}-${crypto.randomUUID()}`;\n }\n return `${prefix}-${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n","import {\n Component,\n Input,\n ViewChild,\n ElementRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n OnDestroy,\n Inject,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { FormsModule } from '@angular/forms';\nimport { OverlayModule, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDialog, MatDialogModule, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { Subscription, firstValueFrom } from 'rxjs';\n\nimport { AiConfigAdapter, AiSuggestion } from '../../core/adapters/ai-config.adapter';\nimport {\n AiBackendApiService,\n AiPatchDiff,\n AiContextDTO,\n AiOrchestratorRequest,\n AiOrchestratorResponse,\n AiSuggestionsRequest,\n AiPatchStreamConnection,\n AiPatchStreamConnectionError,\n AiPatchStreamEnvelope,\n} from '../../core/services/ai-backend-api.service';\nimport { AiJsonObject, AiJsonValue } from '../../core/contracts/ai-contract.generated';\nimport {\n AssistantHistoryContext,\n AssistantHistoryMessage,\n AssistantHistoryService,\n AssistantHistorySession,\n} from '../../core/services/assistant-history.service';\nimport { GlobalAiConfig } from '@praxisui/core';\nimport { AssistantState } from './ai-assistant.types';\n\ninterface ClarificationOption {\n label: string;\n value: string;\n example?: string;\n}\n\ntype ClarificationContextHints = AiJsonObject;\n\ninterface ClarificationRichOption extends ClarificationOption {\n contextHints?: ClarificationContextHints;\n}\n\ninterface PatchPathEdit {\n path: string;\n valueText: string;\n error?: string;\n}\n\ntype JsonMap = Record<string, unknown>;\n\ntype SuggestionPolicy = {\n mode: 'force';\n fallback: Array<'availableFeatures' | 'missingCapabilities'>;\n reason?: string;\n};\n\ntype RiskPolicy = 'strict' | 'standard';\ntype ReviewRiskLevel = 'baixo' | 'médio' | 'alto';\ntype StreamTerminalState = 'idle' | 'in_progress' | 'completed' | 'failed' | 'cancelled' | 'expired';\ntype StreamTimelineMode = 'stream' | 'snapshot';\ntype StreamStepState = 'pending' | 'active' | 'done';\n\ninterface AssistantConfirmDialogData {\n title: string;\n message: string;\n confirmLabel: string;\n cancelLabel: string;\n confirmColor?: 'primary' | 'warn';\n}\n\nconst AI_SESSION_STORAGE_PREFIX = 'praxis.ai.session';\n\n@Component({\n selector: 'praxis-ai-assistant-confirm-dialog',\n standalone: true,\n imports: [CommonModule, MatButtonModule, MatDialogModule],\n template: `\n <h2 mat-dialog-title>{{ data.title }}</h2>\n <mat-dialog-content>{{ data.message }}</mat-dialog-content>\n <mat-dialog-actions align=\"end\">\n <button mat-button type=\"button\" [mat-dialog-close]=\"false\">{{ data.cancelLabel }}</button>\n <button\n mat-flat-button\n type=\"button\"\n [color]=\"data.confirmColor || 'primary'\"\n [mat-dialog-close]=\"true\"\n >\n {{ data.confirmLabel }}\n </button>\n </mat-dialog-actions>\n `,\n})\nclass PraxisAiAssistantConfirmDialogComponent {\n constructor(@Inject(MAT_DIALOG_DATA) readonly data: AssistantConfirmDialogData) {}\n}\n\n@Component({\n selector: 'praxis-ai-assistant',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n OverlayModule,\n A11yModule,\n MatDialogModule,\n MatButtonModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n MatChipsModule,\n MatMenuModule,\n ],\n templateUrl: './ai-assistant.component.html',\n styleUrls: ['./ai-assistant.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PraxisAiAssistantComponent implements OnDestroy {\n @Input({ required: true }) adapter!: AiConfigAdapter;\n @Input() riskPolicy: RiskPolicy | null = null;\n @Input() allowManualPatchEdit = false;\n\n @ViewChild(CdkOverlayOrigin) overlayOrigin!: CdkOverlayOrigin;\n @ViewChild('triggerBtn', { read: ElementRef }) triggerButton?: ElementRef<HTMLButtonElement>;\n @ViewChild('inputEl') inputElement!: ElementRef<HTMLInputElement>;\n\n state: AssistantState | 'clarification' = 'idle';\n activeTab: 'task' | 'chat' | 'suggestions' = 'suggestions';\n private readonly tabOrder: Array<'task' | 'chat' | 'suggestions'> = ['task', 'chat', 'suggestions'];\n readonly flowSteps = [\n { step: 1, label: 'Pedido' },\n { step: 2, label: 'Proposta' },\n { step: 3, label: 'Impacto' },\n { step: 4, label: 'Aplicação' },\n ] as const;\n private taskFlowActive = false;\n processingInfoVisible = false;\n isOpen = false;\n loadingSuggestions = false;\n\n userPrompt = '';\n aiExplanation = '';\n pendingPatch: Record<string, unknown> | null = null;\n pendingDiff: AiPatchDiff[] = [];\n patchEditorText = '';\n patchEditorError = '';\n patchEditorExpanded = false;\n patchPathEditorExpanded = false;\n patchPathEdits: PatchPathEdit[] = [];\n patchPathEditorError = '';\n applyWarnings: string[] = [];\n lastApplyAt: string | null = null;\n lastSnapshot: unknown = null;\n errorMsg = '';\n warnings: string[] = [];\n private backendRiskLevel: ReviewRiskLevel | null = null;\n private backendRequiresConfirmation: boolean | null = null;\n private effectiveRiskPolicy: RiskPolicy = 'strict';\n suggestionsWarnings: string[] = [];\n mockMode = false;\n\n clarificationMessage = '';\n clarificationOptions: ClarificationRichOption[] = [];\n clarificationQuestions: string[] = [];\n clarificationAnswers: string[] = [];\n clarificationFreeText = '';\n showManualInput = false;\n private clarificationBasePrompt: string | null = null;\n private skipClarificationAppend = false;\n clarificationResponseType: 'text' | 'choice' | 'confirm' | 'mixed' | 'context' = 'text';\n clarificationSelectionMode: 'single' | 'multiple' = 'single';\n clarificationAllowCustom = true;\n clarificationPresentation: 'buttons' | 'list' | 'chips' = 'list';\n selectedClarificationOptions: ClarificationRichOption[] = [];\n\n richSuggestions: AiSuggestion[] = [];\n private dismissedSuggestionIds = new Set<string>();\n\n private readonly aiApi = inject(AiBackendApiService);\n private readonly historyService = inject(AssistantHistoryService);\n private readonly dialog = inject(MatDialog);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly suggestionsCache = new Map<string, AiSuggestion[]>();\n private readonly templateVariantsCache = new Map<string, Set<string>>();\n private activeVariantId: string | null = null;\n private promptFromSuggestion = false;\n private activeSuggestion: AiSuggestion | null = null;\n private activeContextHints: ClarificationContextHints | null = null;\n private activeResourcePath: string | null = null;\n private activeServerSessionId: string | null = null;\n private activeStreamId: string | null = null;\n private activeStreamAccessToken: string | null = null;\n private activeStreamConnection: AiPatchStreamConnection | null = null;\n private streamSeenEventIds = new Set<string>();\n private streamLastSeqByStream = new Map<string, number>();\n private streamLastEventIdByStream = new Map<string, string>();\n private streamLastSeq = 0;\n private streamLastEventId: string | null = null;\n private streamTerminalState: StreamTerminalState = 'idle';\n private streamTimelineMode: StreamTimelineMode = 'snapshot';\n private streamFallbackActive = false;\n private streamTimelineStepState: Record<1 | 2 | 3, StreamStepState> = {\n 1: 'pending',\n 2: 'pending',\n 3: 'pending',\n };\n private streamTimelineStepDetail: Partial<Record<1 | 2 | 3, string>> = {};\n private currentComponentId: string | null = null;\n private currentComponentType: string | null = null;\n private forceNewSession = false;\n private readonly sessionStorageAvailable = this.checkSessionStorage();\n\n historyContext: AssistantHistoryContext | null = null;\n historyWarnings: string[] = [];\n historySessions: Array<{\n id: string;\n title: string;\n updatedAt: string;\n componentId?: string;\n componentType?: string;\n }> = [];\n activeHistorySession: AssistantHistorySession | null = null;\n activeHistoryMessages: AssistantHistoryMessage[] = [];\n activeHistoryTotalMessages = 0;\n historyExpanded = true;\n historyUndoDeleteSession: AssistantHistorySession | null = null;\n private historyUndoTimerId: ReturnType<typeof setTimeout> | null = null;\n highlightClarificationDetails = false;\n highlightReviewDetails = false;\n private thoughtDetailsHighlightTimerId: ReturnType<typeof setTimeout> | null = null;\n showFullDiff = false;\n private processingStartedAt: number | null = null;\n private lastProcessingDurationMs: number | null = null;\n private readonly westernTwoDigitFormatter = new Intl.NumberFormat('en-US-u-nu-latn', {\n minimumIntegerDigits: 2,\n useGrouping: false,\n });\n\n private readonly maxHistoryMessages = 6;\n\n ngOnDestroy(): void {\n if (this.state === 'processing') {\n this.requestStreamCancel();\n }\n this.closeActiveStreamConnection();\n this.clearHistoryUndoTimer();\n this.clearThoughtDetailsHighlightTimer();\n }\n\n async open(): Promise<void> {\n this.setState('listening');\n this.isOpen = true;\n this.initHistory();\n this.mockMode = await this.resolveMockMode();\n void this.loadTemplateVariants();\n await this.loadSuggestions();\n setTimeout(() => {\n if (!this.isTaskMode()) {\n this.inputElement?.nativeElement?.focus();\n }\n }, 50);\n }\n\n close(): void {\n const wasOpen = this.isOpen;\n if (this.state === 'processing') {\n this.requestStreamCancel();\n }\n this.closeActiveStreamConnection();\n this.isOpen = false;\n this.setState('idle');\n this.userPrompt = '';\n this.errorMsg = '';\n this.warnings = [];\n this.processingInfoVisible = false;\n this.suggestionsWarnings = [];\n this.pendingPatch = null;\n this.pendingDiff = [];\n this.patchEditorText = '';\n this.patchEditorError = '';\n this.patchEditorExpanded = false;\n this.patchPathEditorExpanded = false;\n this.patchPathEdits = [];\n this.patchPathEditorError = '';\n this.applyWarnings = [];\n this.lastApplyAt = null;\n this.backendRiskLevel = null;\n this.backendRequiresConfirmation = null;\n this.clarificationOptions = [];\n this.clarificationMessage = '';\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n this.clarificationBasePrompt = null;\n this.activeVariantId = null;\n this.activeSuggestion = null;\n this.activeContextHints = null;\n this.activeResourcePath = null;\n this.skipClarificationAppend = false;\n this.clarificationResponseType = 'text';\n this.clarificationSelectionMode = 'single';\n this.clarificationAllowCustom = true;\n this.clarificationPresentation = 'list';\n this.selectedClarificationOptions = [];\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.dismissedSuggestionIds = new Set<string>();\n this.taskFlowActive = false;\n this.activeTab = 'suggestions';\n this.highlightClarificationDetails = false;\n this.highlightReviewDetails = false;\n this.clearThoughtDetailsHighlightTimer();\n this.processingStartedAt = null;\n this.lastProcessingDurationMs = null;\n this.resetStreamTracking();\n this.currentComponentId = null;\n this.currentComponentType = null;\n this.clearPendingHistoryUndo();\n if (this.historyContext && this.activeHistorySession) {\n this.historyService.touchSession(this.historyContext, this.activeHistorySession.id);\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n }\n if (wasOpen) {\n this.restoreFocusToTrigger();\n }\n }\n\n async submitPrompt(overridePrompt?: string): Promise<void> {\n const prompt = overridePrompt || this.userPrompt;\n const hasClarificationQuestions = this.state === 'clarification' && this.clarificationQuestions.length > 0;\n if ((!prompt.trim() && !hasClarificationQuestions) || this.state === 'processing') return;\n\n if (this.state !== 'clarification') {\n const promptResourcePath = this.extractResourcePath(prompt);\n if (promptResourcePath) {\n this.setResourcePathHint(promptResourcePath);\n } else {\n this.clearResourcePathHint();\n }\n }\n\n if (this.state === 'clarification') {\n const base = (this.clarificationBasePrompt || '').trim();\n const answer = prompt.trim();\n const resourcePath = this.extractResourcePath(answer) || this.matchClarificationOptionPath(answer);\n if (resourcePath) {\n this.setResourcePathHint(resourcePath);\n this.userPrompt = base || answer;\n this.skipClarificationAppend = false;\n } else if (this.skipClarificationAppend) {\n this.userPrompt = base || answer;\n this.skipClarificationAppend = false;\n } else if (this.clarificationQuestions.length) {\n const responses = this.buildClarificationAnswers(answer);\n this.userPrompt = base\n ? `${base}\\nRespostas: ${responses}`\n : `Respostas: ${responses}`;\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n } else {\n this.userPrompt = base ? `${base} (${answer})` : answer;\n }\n this.clarificationBasePrompt = null;\n } else if (!this.promptFromSuggestion) {\n this.activeVariantId = null;\n }\n if (this.state !== 'clarification' && overridePrompt !== undefined) {\n this.userPrompt = prompt.trim();\n }\n\n this.setState('processing');\n this.errorMsg = '';\n this.warnings = [];\n this.pendingPatch = null;\n this.pendingDiff = [];\n this.patchEditorText = '';\n this.patchEditorError = '';\n this.patchEditorExpanded = false;\n this.patchPathEditorExpanded = false;\n this.patchPathEdits = [];\n this.patchPathEditorError = '';\n this.applyWarnings = [];\n this.lastApplyAt = null;\n this.backendRiskLevel = null;\n this.backendRequiresConfirmation = null;\n this.streamTerminalState = 'in_progress';\n this.processingInfoVisible = false;\n this.cdr.markForCheck();\n\n let keepContextHints = false;\n\n try {\n const componentId = this.resolveComponentId();\n const componentType = this.resolveComponentType();\n this.currentComponentId = componentId || null;\n this.currentComponentType = componentType || null;\n const configRoot = this.resolveConfigRoot(this.adapter.getCurrentConfig?.());\n const dataProfile = this.adapter.getDataProfile ? this.adapter.getDataProfile() : null;\n const schemaFields = this.adapter.getSchemaFields ? this.adapter.getSchemaFields() : undefined;\n const runtimeState = this.adapter.getRuntimeState ? this.adapter.getRuntimeState() : undefined;\n const suggestion = this.activeSuggestion;\n const mergedContextHints = this.mergeContextHints(suggestion?.contextHints, this.activeContextHints);\n\n if (!componentId || !componentType) {\n this.errorMsg = 'Componente sem identificacao para usar o backend de IA.';\n this.setState('error');\n return;\n }\n\n this.appendHistoryMessage('user', this.userPrompt, {\n componentId,\n componentType,\n variantId: this.activeVariantId || undefined,\n suggestionId: this.activeSuggestion?.id,\n });\n\n const clientTurnId = this.buildClientTurnId();\n const sessionId = this.forceNewSession ? undefined : this.activeServerSessionId || undefined;\n const mode: 'new' | 'continue' | undefined = this.forceNewSession ? 'new' : undefined;\n const uiContextRef = this.buildUiContextRef(componentId, componentType);\n const currentStateDigest = this.buildCurrentStateDigest(runtimeState);\n const inferredAiMode = this.inferAiMode(runtimeState, configRoot);\n const normalizedDataProfile = dataProfile ? this.toAiJsonObject(dataProfile) : undefined;\n const normalizedSchemaFields = schemaFields && schemaFields.length > 0\n ? schemaFields.map((field) => this.toAiJsonObject(field))\n : undefined;\n const normalizedRuntimeState = runtimeState !== undefined ? this.toAiJsonObject(runtimeState) : undefined;\n const normalizedSuggestedPatch = suggestion?.patch ? this.toAiJsonObject(suggestion.patch) : undefined;\n const normalizedContextHints = this.toClarificationContextHints(mergedContextHints);\n const patchRequest: AiOrchestratorRequest = {\n componentId,\n componentType,\n userPrompt: this.userPrompt,\n sessionId,\n mode,\n clientTurnId,\n messages: [{ role: 'user' as const, content: this.userPrompt }],\n uiContextRef,\n currentStateDigest,\n currentState: this.toAiJsonObject(configRoot),\n aiMode: inferredAiMode,\n ...(this.activeResourcePath ? { resourcePath: this.activeResourcePath } : {}),\n ...(normalizedDataProfile ? { dataProfile: normalizedDataProfile } : {}),\n ...(normalizedSchemaFields && normalizedSchemaFields.length > 0 ? { schemaFields: normalizedSchemaFields } : {}),\n ...(normalizedRuntimeState ? { runtimeState: normalizedRuntimeState } : {}),\n ...(normalizedSuggestedPatch ? { suggestedPatch: normalizedSuggestedPatch } : {}),\n ...(normalizedContextHints ? { contextHints: normalizedContextHints } : {}),\n variantId: this.activeVariantId || undefined,\n };\n const result = await this.getPatchViaStreamWithFallback(patchRequest);\n\n if (result?.sessionId) {\n this.activeServerSessionId = result.sessionId;\n this.forceNewSession = false;\n this.persistServerSessionId(result.sessionId);\n if (this.historyContext && this.activeHistorySession) {\n this.historyService.updateServerSessionId(\n this.historyContext,\n this.activeHistorySession.id,\n result.sessionId,\n );\n }\n }\n\n keepContextHints = result?.type === 'clarification';\n const handled = this.handlePatchResponse(result, configRoot, componentId, componentType);\n if (handled) {\n this.appendHistoryAssistantResponse(result, componentId, componentType);\n return;\n }\n\n const isEmptyPatch =\n !this.pendingPatch || (typeof this.pendingPatch === 'object' && Object.keys(this.pendingPatch).length === 0);\n if (isEmptyPatch) {\n this.aiExplanation = this.aiExplanation || 'Nenhuma alteração necessária.';\n this.setState('success');\n setTimeout(() => {\n if (this.state === 'success') this.close();\n }, 1500);\n } else {\n this.setState('review');\n }\n this.appendHistoryAssistantResponse(result, componentId, componentType);\n } catch (err) {\n this.streamTerminalState = 'failed';\n this.errorMsg = this.normalizeError(err);\n this.setState('error');\n this.appendHistoryMessage('assistant', this.errorMsg, {\n componentId: this.resolveComponentId() || undefined,\n componentType: this.resolveComponentType() || undefined,\n });\n } finally {\n this.promptFromSuggestion = false;\n if (!keepContextHints) {\n this.activeSuggestion = null;\n this.activeContextHints = null;\n }\n const stillInProgress = this.streamTerminalState === 'in_progress';\n if (\n this.processingInfoVisible\n && !stillInProgress\n && this.state !== 'success'\n && this.state !== 'review'\n && this.state !== 'error'\n ) {\n this.setState('error');\n this.errorMsg = this.errorMsg || 'Falha desconhecida ao gerar o patch.';\n this.processingInfoVisible = false;\n }\n this.cdr.markForCheck();\n }\n }\n\n isTaskMode(): boolean {\n return this.state === 'processing'\n || this.state === 'clarification'\n || this.state === 'review'\n || this.taskFlowActive\n || this.hasPendingClarification();\n }\n\n hasPendingClarification(): boolean {\n if (this.state !== 'clarification') return false;\n return this.clarificationOptions.length > 0 || this.clarificationQuestions.length > 0;\n }\n\n isActiveTab(tab: 'task' | 'chat' | 'suggestions'): boolean {\n if (this.isTaskMode() && !this.activeTab) return tab === 'task';\n return this.activeTab === tab;\n }\n\n setActiveTab(tab: 'task' | 'chat' | 'suggestions'): void {\n if (tab === 'task' && !this.isTaskMode()) return;\n this.activeTab = tab;\n }\n\n onTabsKeydown(event: KeyboardEvent): void {\n const key = event.key;\n if (key !== 'ArrowRight' && key !== 'ArrowLeft' && key !== 'Home' && key !== 'End') {\n return;\n }\n const enabledTabs = this.tabOrder.filter((tab) => tab !== 'task' || this.isTaskMode());\n if (!enabledTabs.length) return;\n\n event.preventDefault();\n\n if (key === 'Home') {\n const first = enabledTabs[0];\n this.setActiveTab(first);\n this.focusTab(first);\n return;\n }\n if (key === 'End') {\n const last = enabledTabs[enabledTabs.length - 1];\n this.setActiveTab(last);\n this.focusTab(last);\n return;\n }\n\n const currentIndex = Math.max(enabledTabs.indexOf(this.activeTab), 0);\n const direction = key === 'ArrowRight' ? 1 : -1;\n const nextIndex = (currentIndex + direction + enabledTabs.length) % enabledTabs.length;\n const nextTab = enabledTabs[nextIndex];\n this.setActiveTab(nextTab);\n this.focusTab(nextTab);\n }\n\n private focusTab(tab: 'task' | 'chat' | 'suggestions'): void {\n if (typeof document === 'undefined') return;\n const id = tab === 'task'\n ? 'assistant-tab-task'\n : tab === 'chat'\n ? 'assistant-tab-chat'\n : 'assistant-tab-suggestions';\n setTimeout(() => {\n const element = document.getElementById(id);\n if (element instanceof HTMLElement) {\n element.focus();\n }\n }, 0);\n }\n\n getTaskTitle(): string {\n if (this.isDatasetSelection()) return 'Selecionar fonte de dados';\n if (this.state === 'review') return 'Revisar alterações';\n return 'Faltam informações para continuar';\n }\n\n getTaskSubtitle(): string {\n if (this.isDatasetSelection()) {\n return 'Escolha o recurso base para montar a lista e o detalhe desta página.';\n }\n if (this.state === 'review') {\n return 'Confira o resumo e o impacto antes de aplicar as alterações.';\n }\n return this.clarificationMessage || 'Informe os dados solicitados para concluir a proposta.';\n }\n\n getTaskPrimaryLabel(): string {\n if (this.state === 'review') return 'Aplicar alterações';\n if (this.state === 'clarification' && this.clarificationOptions.length === 1) return 'Continuar';\n return this.clarificationSelectionMode === 'multiple' ? 'Confirmar seleção' : 'Selecionar';\n }\n\n getTaskSecondaryLabel(): string {\n if (this.state === 'review') return 'Editar pedido';\n return 'Cancelar';\n }\n\n getTaskCancelLabel(): string {\n if (this.state === 'processing') return 'Interromper';\n return 'Cancelar';\n }\n\n isTaskPrimaryDisabled(): boolean {\n if (this.state === 'processing' || this.state === 'applying') return true;\n if (this.state === 'review') return !this.pendingPatch;\n if (this.state !== 'clarification') return false;\n return !this.hasClarificationSelection()\n && !(this.clarificationAllowCustom && this.clarificationFreeText.trim());\n }\n\n isBusyState(): boolean {\n return this.state === 'processing' || this.state === 'applying';\n }\n\n getSystemStatusLabel(): string {\n if (this.state === 'processing') return 'Analisando solicitação';\n if (this.state === 'clarification') return 'Aguardando informações';\n if (this.state === 'review') return 'Proposta pronta para revisão';\n if (this.state === 'applying') return 'Aplicando alterações';\n if (this.state === 'success') return 'Alterações aplicadas';\n if (this.state === 'error') return 'Falha ao processar solicitação';\n if (this.mockMode) return 'Modo demonstração ativo';\n return 'IA conectada e pronta';\n }\n\n getSystemStatusDetail(): string {\n if (this.state === 'processing') {\n return this.withSnapshotFallbackDetail(\n this.aiExplanation || 'Preparando proposta com validação de impacto...',\n );\n }\n if (this.state === 'clarification') {\n return this.withSnapshotFallbackDetail(\n this.clarificationMessage || 'Informe os dados pendentes para continuar.',\n );\n }\n if (this.state === 'review') {\n return this.withSnapshotFallbackDetail('Revise o resumo e a prévia de mudanças antes de aplicar.');\n }\n if (this.state === 'applying') {\n return this.withSnapshotFallbackDetail('Aplicando alterações no componente atual.');\n }\n if (this.state === 'success') {\n return this.withSnapshotFallbackDetail('Alterações aplicadas. Você pode desfazer se necessário.');\n }\n if (this.state === 'error') {\n return this.withSnapshotFallbackDetail(\n this.errorMsg || 'Não foi possível concluir. Ajuste o pedido e tente novamente.',\n );\n }\n if (this.activeTab === 'suggestions') {\n return 'Selecione uma sugestão ou descreva uma alteração no campo inferior.';\n }\n if (this.activeTab === 'chat') {\n return 'Consulte o histórico ou inicie uma nova conversa.';\n }\n return this.mockMode\n ? 'As respostas são simuladas para validação da interface.'\n : 'Pronto para receber uma solicitação.';\n }\n\n shouldShowSystemStatusDetail(): boolean {\n return this.state === 'processing'\n || this.state === 'clarification'\n || this.state === 'review'\n || this.state === 'applying'\n || this.state === 'error';\n }\n\n getSystemStatusAriaLive(): 'polite' | 'assertive' {\n return this.state === 'error' ? 'assertive' : 'polite';\n }\n\n shouldShowSnapshotFallbackBadge(): boolean {\n if (!this.streamFallbackActive) return false;\n return this.state === 'processing'\n || this.state === 'clarification'\n || this.state === 'review'\n || this.state === 'applying'\n || this.state === 'success'\n || this.state === 'error';\n }\n\n getRiskPolicyLabel(): string {\n return this.getEffectiveRiskPolicy() === 'strict'\n ? 'Política: Estrita'\n : 'Política: Padrão';\n }\n\n getRiskPolicyTooltip(): string {\n return this.getEffectiveRiskPolicy() === 'strict'\n ? 'Política estrita: risco médio/alto sempre exige confirmação antes de aplicar.'\n : 'Política padrão: segue a sinalização de confirmação retornada pelo backend.';\n }\n\n isStrictRiskPolicy(): boolean {\n return this.getEffectiveRiskPolicy() === 'strict';\n }\n\n getFlowStepState(step: number): 'done' | 'active' | 'pending' {\n if (this.shouldUseStreamTimeline() && (step === 1 || step === 2 || step === 3)) {\n return this.streamTimelineStepState[step];\n }\n const currentStep = this.getCurrentFlowStep();\n if (step < currentStep) return 'done';\n if (step === currentStep) return 'active';\n return 'pending';\n }\n\n getFlowStepDetail(step: number): string {\n if (this.shouldUseStreamTimeline() && (step === 1 || step === 2 || step === 3)) {\n const streamDetail = this.streamTimelineStepDetail[step]?.trim();\n if (streamDetail) {\n return streamDetail;\n }\n }\n const state = this.getFlowStepState(step);\n if (step === 1) {\n if (state === 'done') return 'Pedido consolidado';\n return this.state === 'processing' ? 'Analisando solicitação' : 'Aguardando pedido';\n }\n if (step === 2) {\n if (state === 'done') return 'Proposta estruturada';\n if (state === 'active') return 'Selecionar dados faltantes';\n return 'Aguardando dados';\n }\n if (step === 3) {\n if (state === 'done') return 'Impacto validado';\n if (state === 'active') return 'Revisar resumo e diff';\n return 'Prévia pendente';\n }\n if (state === 'done') return this.state === 'success' ? 'Aplicação concluída' : 'Fluxo finalizado';\n if (state === 'active') {\n if (this.state === 'applying') return 'Aplicando alterações';\n if (this.state === 'error') return 'Ajuste necessário';\n if (this.state === 'success') return 'Alterações aplicadas';\n }\n return 'Aguardando confirmação';\n }\n\n shouldShowTaskFlow(): boolean {\n return this.isTaskMode();\n }\n\n shouldShowThoughtCard(): boolean {\n if (!this.isTaskMode()) return false;\n if (this.activeTab === 'chat') return false;\n return this.state === 'processing'\n || this.state === 'clarification'\n || this.state === 'review'\n || this.state === 'applying'\n || this.state === 'success'\n || this.state === 'error';\n }\n\n getThoughtTimingLabel(): string {\n const seconds = this.getThoughtDurationSeconds();\n if (seconds === null) return 'Pensamento concluído';\n const formatted = this.formatDurationClock(seconds);\n if (this.state === 'processing') return `Pensando por ${formatted}`;\n return `Pensou por ${formatted}`;\n }\n\n getThoughtSummary(): string {\n const explanation = (this.aiExplanation || '').trim();\n if (explanation) return explanation;\n if (this.state === 'clarification') {\n return this.clarificationMessage || 'Preciso de mais detalhes para continuar.';\n }\n if (this.state === 'review') {\n return 'Proposta pronta. Revise resumo e impacto antes de aplicar.';\n }\n if (this.state === 'error') {\n return this.errorMsg || 'Falha ao processar solicitação.';\n }\n if (this.state === 'success') {\n return 'Alterações aplicadas com sucesso.';\n }\n return this.getSystemStatusDetail();\n }\n\n getThoughtPlanTitle(): string {\n const raw = (\n this.activeSuggestion?.label\n || this.clarificationBasePrompt\n || this.userPrompt\n || this.getTaskTitle()\n || 'Refinar configuração'\n ).trim();\n if (!raw) return 'Refinar configuração';\n if (raw.length <= 78) return raw;\n return `${raw.slice(0, 75)}...`;\n }\n\n getThoughtChecklist(): string[] {\n if (this.state === 'review') {\n return [\n 'Conferir resumo e escopo',\n 'Validar diff antes/depois',\n 'Aplicar conforme política de risco',\n ];\n }\n return [];\n }\n\n openThoughtDetails(): void {\n if (this.isTaskMode()) {\n this.setActiveTab('task');\n if (this.state === 'review' && this.showFullDiff) {\n this.showFullDiff = false;\n }\n if (this.state === 'review') {\n this.flashThoughtDetails('review');\n this.focusTaskPanelTarget('.review-summary');\n } else if (this.state === 'clarification') {\n this.flashThoughtDetails('clarification');\n this.focusTaskPanelTarget('.clarification-options-block, .clarification-questions, .task-header');\n } else {\n this.focusTaskPanelTarget('.apply-details, .warnings-area, .task-header');\n }\n return;\n }\n this.setActiveTab('suggestions');\n }\n\n openThoughtPreview(): void {\n if (!this.shouldShowThoughtPreviewAction()) {\n return;\n }\n if (!this.isTaskMode()) {\n this.setActiveTab('suggestions');\n return;\n }\n this.setActiveTab('task');\n if (this.state === 'review' && this.pendingDiff.length && !this.showFullDiff) {\n this.showFullDiff = true;\n }\n }\n\n getThoughtDetailsTooltip(): string {\n if (this.shouldUseStreamTimeline() && this.streamTerminalState === 'in_progress') {\n return 'Mostra o progresso real recebido via eventos do stream.';\n }\n if (this.state === 'review') {\n return 'Foca no resumo consolidado e no escopo da proposta.';\n }\n if (this.state === 'clarification') {\n return 'Destaca decisões sugeridas e contexto pendente para avançar.';\n }\n if (this.state === 'error' || this.state === 'success' || this.state === 'applying') {\n return 'Leva para os detalhes de aplicação e avisos da execução.';\n }\n return 'Mostra o contexto da proposta e dados pendentes.';\n }\n\n getThoughtDetailsLabel(): string {\n if (this.shouldUseStreamTimeline() && this.streamTerminalState === 'in_progress') return 'Progresso';\n if (this.state === 'review') return 'Resumo';\n if (this.state === 'clarification') return 'Decisões';\n if (this.state === 'applying') return 'Execução';\n if (this.state === 'success') return 'Aplicação';\n if (this.state === 'error') return 'Diagnóstico';\n return 'Detalhes';\n }\n\n getThoughtPreviewTooltip(): string {\n return 'Abre a prévia técnica com diff antes/depois.';\n }\n\n getThoughtActionHint(): string {\n if (this.shouldUseStreamTimeline() && this.streamTerminalState === 'in_progress') {\n return 'Progresso exibe as etapas reais emitidas pelo backend durante o stream.';\n }\n if (this.state === 'review') {\n return 'Resumo mantém a visão consolidada. Prévia abre o diff completo antes/depois.';\n }\n if (this.state === 'clarification') {\n return 'Decisões destaca opções sugeridas e contexto pendente para escolha.';\n }\n if (this.state === 'error' || this.state === 'success' || this.state === 'applying') {\n const actionLabel = this.getThoughtDetailsLabel();\n return `${actionLabel} leva para os detalhes de aplicação e avisos operacionais.`;\n }\n return 'Use detalhes para revisar o contexto e decidir o próximo passo.';\n }\n\n shouldShowThoughtPreviewAction(): boolean {\n if (this.state !== 'review') return false;\n if (!this.pendingDiff.length) return false;\n if (!this.shouldUseStreamTimeline()) return true;\n return this.streamTerminalState === 'completed';\n }\n\n shouldShowTaskTimeline(): boolean {\n return this.isTaskMode();\n }\n\n getTaskTimelineItems(): Array<{\n step: number;\n title: string;\n detail: string;\n state: 'done' | 'active' | 'pending';\n }> {\n const items = [\n { step: 1, title: 'Pedido', detail: 'Intenção e escopo da solicitação' },\n { step: 2, title: 'Proposta', detail: 'Dados pendentes e decisão guiada' },\n { step: 3, title: 'Impacto', detail: 'Resumo e diff para validação' },\n { step: 4, title: 'Aplicação', detail: 'Patch aplicado com segurança' },\n ];\n return items.map((item) => ({\n ...item,\n state: this.getFlowStepState(item.step),\n }));\n }\n\n private getThoughtDurationSeconds(): number | null {\n if (this.state === 'processing' && this.processingStartedAt !== null) {\n const delta = Date.now() - this.processingStartedAt;\n return Math.max(1, Math.round(delta / 1000));\n }\n if (this.lastProcessingDurationMs !== null) {\n return Math.max(1, Math.round(this.lastProcessingDurationMs / 1000));\n }\n return null;\n }\n\n private formatDurationClock(totalSeconds: number): string {\n const safe = Math.max(0, Math.floor(totalSeconds));\n const hours = Math.floor(safe / 3600);\n const minutes = Math.floor((safe % 3600) / 60);\n const seconds = safe % 60;\n const mm = this.formatWesternTwoDigits(minutes);\n const ss = this.formatWesternTwoDigits(seconds);\n if (hours > 0) {\n const hh = this.formatWesternTwoDigits(hours);\n return `${hh}:${mm}:${ss}`;\n }\n return `${mm}:${ss}`;\n }\n\n private formatWesternTwoDigits(value: number): string {\n const safe = Math.max(0, Math.floor(value));\n return this.westernTwoDigitFormatter.format(safe);\n }\n\n getReviewRiskLevel(): ReviewRiskLevel {\n if (this.backendRiskLevel) return this.backendRiskLevel;\n const changes = this.getReviewChangeCount();\n if (this.warnings.length >= 3) return 'alto';\n if (this.warnings.length > 0 || changes > 6) return 'médio';\n return 'baixo';\n }\n\n getReviewSummary(): string {\n const changes = this.getReviewChangeCount();\n const changeLabel = changes === 1 ? 'mudança' : 'mudanças';\n const undo = this.lastSnapshot ? 'desfazer disponível' : 'desfazer disponível após aplicar';\n return `${changes} ${changeLabel} • ${undo}`;\n }\n\n getDiffToggleLabel(): string {\n if (this.showFullDiff) return 'Ocultar diff completo';\n const count = this.pendingDiff.length || this.getReviewChangeCount();\n const label = count === 1 ? 'mudança' : 'mudanças';\n return `Abrir diff completo (${count} ${label})`;\n }\n\n private getReviewChangeCount(): number {\n if (this.pendingDiff.length) return this.pendingDiff.length;\n return this.estimatePatchChangeCount(this.pendingPatch);\n }\n\n private estimatePatchChangeCount(value: unknown): number {\n if (value == null) return 0;\n if (Array.isArray(value)) return value.length > 0 ? 1 : 0;\n if (typeof value !== 'object') return 1;\n const entries = Object.entries(value as Record<string, unknown>);\n if (!entries.length) return 0;\n return entries.reduce((acc, [, child]) => {\n const childCount = this.estimatePatchChangeCount(child);\n return acc + (childCount > 0 ? childCount : 1);\n }, 0);\n }\n\n private getCurrentFlowStep(): number {\n if (this.shouldUseStreamTimeline()) {\n return this.resolveCurrentFlowStepFromStream();\n }\n if (this.state === 'listening' || this.state === 'processing') return 1;\n if (this.state === 'clarification') return 2;\n if (this.state === 'review') return 3;\n if (this.state === 'applying' || this.state === 'success' || this.state === 'error') return 4;\n return 1;\n }\n\n private resolveCurrentFlowStepFromStream(): number {\n if (this.streamTimelineStepState[3] === 'active' || this.streamTimelineStepState[3] === 'done') return 3;\n if (this.streamTimelineStepState[2] === 'active' || this.streamTimelineStepState[2] === 'done') return 2;\n return 1;\n }\n\n private shouldUseStreamTimeline(): boolean {\n return this.streamTimelineMode === 'stream';\n }\n\n private initializeStreamTimeline(): void {\n this.streamTimelineStepState = {\n 1: 'pending',\n 2: 'pending',\n 3: 'pending',\n };\n this.streamTimelineStepDetail = {};\n }\n\n private markStreamStep(step: 1 | 2 | 3, state: StreamStepState, detail?: string): void {\n this.streamTimelineStepState = {\n ...this.streamTimelineStepState,\n [step]: state,\n };\n if (detail && detail.trim()) {\n this.streamTimelineStepDetail = {\n ...this.streamTimelineStepDetail,\n [step]: detail.trim(),\n };\n }\n if (step === 2 && (state === 'active' || state === 'done') && this.streamTimelineStepState[1] !== 'done') {\n this.streamTimelineStepState = {\n ...this.streamTimelineStepState,\n 1: 'done',\n };\n }\n if (step === 3 && (state === 'active' || state === 'done')) {\n if (this.streamTimelineStepState[1] !== 'done') {\n this.streamTimelineStepState = { ...this.streamTimelineStepState, 1: 'done' };\n }\n if (this.streamTimelineStepState[2] === 'pending') {\n this.streamTimelineStepState = { ...this.streamTimelineStepState, 2: 'done' };\n }\n }\n }\n\n shouldShowTaskSteps(): boolean {\n return this.isDatasetSelection();\n }\n\n getTaskSelectionSummary(): string | null {\n if (!this.selectedClarificationOptions.length) return null;\n if (this.selectedClarificationOptions.length === 1) {\n return this.selectedClarificationOptions[0]?.label || null;\n }\n return `${this.selectedClarificationOptions.length} selecionados`;\n }\n\n getHistorySessionTooltip(session: {\n componentType?: string;\n componentId?: string;\n }): string {\n if (!session) return '';\n const parts: string[] = [];\n if (session.componentType) parts.push(`Tipo: ${session.componentType}`);\n if (session.componentId) parts.push(`Componente: ${session.componentId}`);\n return parts.join(' • ');\n }\n\n getVisibleSuggestions(): AiSuggestion[] {\n if (!this.dismissedSuggestionIds.size) return this.richSuggestions;\n return this.richSuggestions.filter((item) => !this.dismissedSuggestionIds.has(item.id));\n }\n\n hasDismissedSuggestions(): boolean {\n return this.dismissedSuggestionIds.size > 0;\n }\n\n getDismissedSuggestionCount(): number {\n return this.dismissedSuggestionIds.size;\n }\n\n restoreDismissedSuggestions(): void {\n if (!this.dismissedSuggestionIds.size) return;\n this.dismissedSuggestionIds = new Set<string>();\n this.cdr.markForCheck();\n }\n\n isDatasetSelection(): boolean {\n return this.clarificationOptions.some((opt) => this.isEndpointOption(opt));\n }\n\n hasClarificationSelection(): boolean {\n return this.selectedClarificationOptions.length > 0;\n }\n\n confirmTaskAction(): void {\n if (this.state === 'review') {\n this.confirmPatch();\n return;\n }\n if (!this.hasClarificationSelection()) {\n if (this.clarificationAllowCustom && this.clarificationFreeText.trim()) {\n const answer = this.clarificationFreeText.trim();\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.submitPrompt(answer);\n }\n return;\n }\n if (this.clarificationSelectionMode === 'multiple') {\n this.submitClarificationSelection();\n return;\n }\n const selected = this.selectedClarificationOptions[0];\n if (selected) {\n this.handleClarificationOption(selected);\n }\n }\n\n handleTaskSecondary(): void {\n if (this.state === 'processing') {\n this.cancelProcessing('Solicitação interrompida.');\n return;\n }\n this.close();\n }\n\n onClarificationOptionClick(opt: ClarificationRichOption): void {\n if (!this.isTaskMode()) {\n this.handleClarificationOption(opt);\n return;\n }\n if (this.clarificationSelectionMode === 'multiple') {\n this.toggleClarificationSelection(opt);\n } else {\n this.selectedClarificationOptions = [opt];\n }\n this.showManualInput = false;\n this.cdr.markForCheck();\n }\n\n toggleManualInput(): void {\n if (!this.clarificationAllowCustom) return;\n this.showManualInput = !this.showManualInput;\n }\n\n private toggleClarificationSelection(opt: ClarificationRichOption): void {\n const idx = this.selectedClarificationOptions.findIndex((sel) => sel.value === opt.value);\n if (idx >= 0) {\n this.selectedClarificationOptions = this.selectedClarificationOptions.filter((_, i) => i !== idx);\n } else {\n this.selectedClarificationOptions = [...this.selectedClarificationOptions, opt];\n }\n }\n\n private setState(next: AssistantState | 'clarification'): void {\n const prev = this.state;\n if (next === 'processing' && prev !== 'processing') {\n this.processingStartedAt = Date.now();\n this.lastProcessingDurationMs = null;\n }\n if (prev === 'processing' && next !== 'processing' && this.processingStartedAt !== null) {\n const elapsed = Date.now() - this.processingStartedAt;\n this.lastProcessingDurationMs = elapsed > 0 ? elapsed : null;\n this.processingStartedAt = null;\n }\n this.state = next;\n if (next === 'clarification' || next === 'review') {\n this.taskFlowActive = true;\n } else if ((next === 'processing' || next === 'applying') && (prev === 'clarification' || prev === 'review' || this.taskFlowActive)) {\n this.taskFlowActive = true;\n }\n if (next === 'listening' || next === 'idle' || next === 'success') {\n this.taskFlowActive = false;\n }\n if (next === 'idle') {\n this.processingStartedAt = null;\n this.lastProcessingDurationMs = null;\n }\n if (next === 'review') {\n this.showFullDiff = false;\n }\n if (next !== 'clarification' && next !== 'review') {\n this.highlightClarificationDetails = false;\n this.highlightReviewDetails = false;\n this.clearThoughtDetailsHighlightTimer();\n }\n if (this.isTaskMode()) {\n this.activeTab = 'task';\n } else if (this.activeTab === 'task') {\n this.activeTab = 'suggestions';\n }\n }\n\n private flashThoughtDetails(mode: 'clarification' | 'review'): void {\n this.clearThoughtDetailsHighlightTimer();\n this.highlightClarificationDetails = mode === 'clarification';\n this.highlightReviewDetails = mode === 'review';\n this.cdr.markForCheck();\n this.thoughtDetailsHighlightTimerId = setTimeout(() => {\n this.highlightClarificationDetails = false;\n this.highlightReviewDetails = false;\n this.cdr.markForCheck();\n this.thoughtDetailsHighlightTimerId = null;\n }, 1300);\n }\n\n private clearThoughtDetailsHighlightTimer(): void {\n if (!this.thoughtDetailsHighlightTimerId) return;\n clearTimeout(this.thoughtDetailsHighlightTimerId);\n this.thoughtDetailsHighlightTimerId = null;\n }\n\n private focusTaskPanelTarget(selector: string): void {\n if (typeof document === 'undefined') return;\n setTimeout(() => {\n const panel = document.getElementById('assistant-panel-task');\n if (!(panel instanceof HTMLElement)) return;\n const target = panel.querySelector(selector);\n if (!(target instanceof HTMLElement)) return;\n try {\n target.scrollIntoView({ block: 'start', behavior: 'smooth' });\n } catch {\n target.scrollIntoView({ block: 'start' });\n }\n if (!target.hasAttribute('tabindex')) {\n target.setAttribute('tabindex', '-1');\n }\n target.focus({ preventScroll: true });\n }, 0);\n }\n\n toggleFullDiff(): void {\n this.showFullDiff = !this.showFullDiff;\n }\n\n getDiffSummaryLines(): string[] {\n if (!this.pendingDiff?.length) return [];\n return this.pendingDiff.slice(0, 3).map((diff) => this.summarizeDiff(diff));\n }\n\n private summarizeDiff(diff: AiPatchDiff): string {\n const hadBefore = diff.before !== null && diff.before !== undefined;\n const hasAfter = diff.after !== null && diff.after !== undefined;\n const prefix = !hadBefore && hasAfter ? '+' : hadBefore && !hasAfter ? '-' : '~';\n return `${prefix} ${diff.path}`;\n }\n\n shouldShowApplyDetails(): boolean {\n return !!this.pendingPatch || this.pendingDiff.length > 0 || this.applyWarnings.length > 0;\n }\n\n getApplyPaths(): string[] {\n const fromDiff = this.pendingDiff\n .map((item) => (item?.path || '').trim())\n .filter((path) => path.length > 0);\n if (fromDiff.length) return Array.from(new Set(fromDiff));\n if (!this.pendingPatch || typeof this.pendingPatch !== 'object') return [];\n return this.collectPatchPaths(this.pendingPatch);\n }\n\n getEditablePatchPathEdits(): PatchPathEdit[] {\n return this.patchPathEdits;\n }\n\n togglePatchEditor(): void {\n if (!this.allowManualPatchEdit) return;\n if (!this.pendingPatch) return;\n this.patchEditorExpanded = !this.patchEditorExpanded;\n if (this.patchEditorExpanded && !this.patchEditorText.trim()) {\n this.patchEditorText = this.serializePatch(this.pendingPatch);\n this.patchEditorError = '';\n }\n }\n\n resetPatchEditor(): void {\n if (!this.pendingPatch) {\n this.patchEditorText = '';\n this.patchEditorError = '';\n return;\n }\n this.patchEditorText = this.serializePatch(this.pendingPatch);\n this.patchEditorError = '';\n }\n\n togglePatchPathEditor(): void {\n if (!this.allowManualPatchEdit) return;\n if (!this.pendingPatch) return;\n this.patchPathEditorExpanded = !this.patchPathEditorExpanded;\n if (this.patchPathEditorExpanded && !this.patchPathEdits.length) {\n this.syncPatchPathEdits();\n }\n }\n\n resetPatchPathEdits(): void {\n this.patchPathEditorError = '';\n this.syncPatchPathEdits();\n }\n\n applyPathEditsToPatch(): boolean {\n if (!this.allowManualPatchEdit) return false;\n if (!this.pendingPatch) return false;\n if (!this.patchPathEdits.length) {\n this.patchPathEditorError = 'Nenhum path editável disponível para este patch.';\n return false;\n }\n const nextPatch = this.clonePatch(this.pendingPatch);\n const nextEdits = this.patchPathEdits.map((item) => ({ ...item, error: '' }));\n let hasError = false;\n\n for (const edit of nextEdits) {\n if (!edit.path || !edit.path.trim()) continue;\n const parsed = this.parsePathEditValue(edit.valueText);\n if (parsed.ok === false) {\n edit.error = parsed.error;\n hasError = true;\n continue;\n }\n this.setPatchValueAtPath(nextPatch, edit.path, parsed.value);\n }\n\n this.patchPathEdits = nextEdits;\n if (hasError) {\n this.patchPathEditorError = 'Corrija os campos destacados antes de aplicar.';\n return false;\n }\n this.patchPathEditorError = '';\n this.pendingPatch = nextPatch;\n this.pendingDiff = [];\n this.patchEditorText = this.serializePatch(nextPatch);\n this.patchEditorError = '';\n return true;\n }\n\n async reapplyPathEdits(): Promise<void> {\n if (!this.allowManualPatchEdit || this.state === 'applying') return;\n const updated = this.applyPathEditsToPatch();\n if (!updated || !this.pendingPatch) return;\n const confirmed = await this.confirmEditedPatchBeforeApply('path');\n if (!confirmed) return;\n await this.applyPatchPayload(this.pendingPatch, true);\n }\n\n async reapplyEditedPatch(): Promise<void> {\n if (!this.allowManualPatchEdit || this.state === 'applying') return;\n const parsed = this.parsePatchEditorText();\n if (!parsed) return;\n const confirmed = await this.confirmEditedPatchBeforeApply('json');\n if (!confirmed) return;\n await this.applyPatchPayload(parsed, true);\n }\n\n private async confirmEditedPatchBeforeApply(mode: 'path' | 'json'): Promise<boolean> {\n const policy = this.getEffectiveRiskPolicy();\n const risk = this.getReviewRiskLevel();\n const requiresRiskConfirmation = policy === 'strict' || this.requiresApplyConfirmation();\n const editedLabel = mode === 'path'\n ? 'Você alterou valores do patch por path.'\n : 'Você editou o patch JSON manualmente.';\n\n if (requiresRiskConfirmation) {\n return this.openConfirmationDialog({\n title: 'Confirmar reaplicação',\n message: `${editedLabel} ${this.buildRiskConfirmationMessage(risk)}`,\n confirmLabel: 'Reaplicar alterações',\n cancelLabel: 'Revisar novamente',\n confirmColor: policy === 'strict' || risk === 'alto' ? 'warn' : 'primary',\n });\n }\n\n return this.openConfirmationDialog({\n title: 'Reaplicar alterações',\n message: `${editedLabel} Deseja reaplicar agora?`,\n confirmLabel: 'Reaplicar',\n cancelLabel: 'Cancelar',\n confirmColor: 'primary',\n });\n }\n\n getScopeLabel(): string {\n const type = (this.currentComponentType || '').toLowerCase();\n if (type.includes('page')) return 'Somente esta página';\n if (type.includes('table')) return 'Somente esta tabela';\n if (type.includes('form')) return 'Somente este formulário';\n return 'Somente este componente';\n }\n\n getScopeTooltip(): string {\n return 'As mudanças afetam apenas este componente e suas configurações.';\n }\n\n getConfidenceLabel(): string {\n if (this.warnings.length) return 'Revisão recomendada';\n return 'Validação automática concluída';\n }\n\n getConfidenceTooltip(): string {\n if (this.warnings.length) {\n return 'Pode exigir ajustes; revise antes de aplicar.';\n }\n return 'Baseado na configuração atual e no contexto disponível.';\n }\n\n isClarificationSelected(option: ClarificationRichOption): boolean {\n if (!option) return false;\n return this.selectedClarificationOptions?.some(item => item?.value === option.value) ?? false;\n }\n\n getClarificationOptionLayout(option: ClarificationRichOption): 'endpoint' | 'color' | 'description' | 'default' {\n if (this.isEndpointOption(option)) return 'endpoint';\n if (this.isColorOption(option)) return 'color';\n if (this.hasRichDescription(option)) return 'description';\n return 'default';\n }\n\n getClarificationOptionKindLabel(option: ClarificationRichOption): string {\n const layout = this.getClarificationOptionLayout(option);\n if (layout === 'endpoint') return 'API';\n if (layout === 'color') return 'Cor';\n if (layout === 'description') return 'Descrição';\n return 'Opção';\n }\n\n isEndpointOption(option: ClarificationRichOption): boolean {\n const hints = option?.contextHints;\n return !!hints && (\n typeof hints.method === 'string'\n || typeof hints.path === 'string'\n );\n }\n\n isColorOption(option: ClarificationRichOption): boolean {\n const hex = option?.contextHints?.hexColor;\n return typeof hex === 'string' && hex.trim().length > 0;\n }\n\n hasRichDescription(option: ClarificationRichOption): boolean {\n const desc = option?.contextHints?.description;\n return typeof desc === 'string' && desc.trim().length > 0;\n }\n\n getEndpointIcon(option: ClarificationRichOption): string {\n const icon = option?.contextHints?.icon;\n const trimmed = typeof icon === 'string' ? icon.trim() : '';\n return trimmed || 'api';\n }\n\n getEndpointMethod(option: ClarificationRichOption): string | null {\n const method = option?.contextHints?.method;\n const trimmed = typeof method === 'string' ? method.trim() : '';\n return trimmed ? trimmed.toUpperCase() : null;\n }\n\n getEndpointPath(option: ClarificationRichOption): string | null {\n const path = option?.contextHints?.path;\n const trimmed = typeof path === 'string' ? path.trim() : '';\n if (trimmed) return trimmed;\n const label = (option?.label || '').trim();\n return label || null;\n }\n\n shouldShowClarificationTooltip(option: ClarificationRichOption): boolean {\n if (!option) return false;\n if (this.getClarificationOptionLayout(option) === 'description') return false;\n const desc = option?.contextHints?.description;\n if (typeof desc === 'string' && desc.trim()) return true;\n return !!option.example;\n }\n\n getClarificationTooltip(option: ClarificationRichOption): string {\n const desc = option?.contextHints?.description;\n if (typeof desc === 'string' && desc.trim()) return desc.trim();\n return option?.example || '';\n }\n\n getSafeHexColor(option: ClarificationRichOption): string | null {\n const value = option?.contextHints?.hexColor;\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n const normalized = trimmed.startsWith('#') ? trimmed : `#${trimmed}`;\n return /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(normalized)\n ? normalized\n : null;\n }\n\n shouldShowDescriptionTooltip(option: ClarificationRichOption): boolean {\n if (!this.shouldShowDescription(option)) return false;\n const desc = option?.contextHints?.description;\n if (typeof desc !== 'string') return false;\n const trimmed = desc.trim();\n return trimmed.length > 60;\n }\n\n getDescriptionTooltip(option: ClarificationRichOption): string {\n const desc = option?.contextHints?.description;\n if (typeof desc !== 'string') return '';\n return desc.trim();\n }\n\n shouldShowDescription(option: ClarificationRichOption): boolean {\n const desc = option?.contextHints?.description;\n if (typeof desc !== 'string') return false;\n const trimmed = desc.trim();\n if (!trimmed) return false;\n const label = (option?.label || '').trim();\n if (!label) return true;\n return trimmed.toLowerCase() !== label.toLowerCase();\n }\n\n async handleClarificationOption(option: ClarificationRichOption | string): Promise<void> {\n if (this.clarificationSelectionMode === 'multiple' && typeof option !== 'string') {\n this.toggleClarificationSelection(option);\n return;\n }\n if (typeof option !== 'string' && option.contextHints) {\n this.activeContextHints = this.mergeContextHints(this.activeContextHints, option.contextHints);\n const hintedResource = this.asRecord(option.contextHints)?.['resourcePath'];\n if (typeof hintedResource === 'string' && hintedResource.trim()) {\n this.setResourcePathHint(hintedResource);\n }\n this.skipClarificationAppend = true;\n const base = (this.clarificationBasePrompt || '').trim();\n await this.submitPrompt(base || option.value);\n return;\n }\n const selected = typeof option === 'string' ? option : option.value;\n const base = (this.clarificationBasePrompt || '').trim();\n const resourcePath = this.extractResourcePath(selected);\n if (resourcePath) {\n this.setResourcePathHint(resourcePath);\n this.skipClarificationAppend = true;\n await this.submitPrompt(base || selected);\n return;\n }\n const maskHints = this.buildMaskSelectionHints(selected, base);\n if (maskHints) {\n this.activeContextHints = this.mergeContextHints(this.activeContextHints, maskHints);\n this.skipClarificationAppend = true;\n await this.submitPrompt(base || selected);\n return;\n }\n await this.submitPrompt(selected);\n }\n\n async confirmPatch(): Promise<void> {\n if (!this.pendingPatch) return;\n if (this.requiresApplyConfirmation() && !(await this.confirmRiskApply())) return;\n await this.applyPatchPayload(this.pendingPatch, false);\n }\n\n private requiresApplyConfirmation(): boolean {\n const policy = this.getEffectiveRiskPolicy();\n if (policy === 'standard') {\n if (this.backendRequiresConfirmation !== null) return this.backendRequiresConfirmation;\n if (this.backendRiskLevel) return this.backendRiskLevel !== 'baixo';\n return this.getReviewRiskLevel() !== 'baixo';\n }\n if (this.backendRequiresConfirmation === true) return true;\n if (this.backendRequiresConfirmation === false) {\n // Fail-safe corporativo: risco médio/alto sempre exige confirmação explícita.\n if (this.backendRiskLevel && this.backendRiskLevel !== 'baixo') return true;\n return false;\n }\n if (this.backendRiskLevel) return this.backendRiskLevel !== 'baixo';\n return this.getReviewRiskLevel() !== 'baixo';\n }\n\n private async confirmRiskApply(): Promise<boolean> {\n if (typeof window === 'undefined') return true;\n const risk = this.getReviewRiskLevel();\n return this.openConfirmationDialog({\n title: 'Confirmar aplicação',\n message: this.buildRiskConfirmationMessage(risk),\n confirmLabel: 'Aplicar alterações',\n cancelLabel: 'Revisar novamente',\n confirmColor: risk === 'alto' ? 'warn' : 'primary',\n });\n }\n\n private buildRiskConfirmationMessage(risk: ReviewRiskLevel): string {\n if (risk === 'alto') {\n return 'Esta proposta foi classificada como risco alto. Deseja aplicar as alterações agora?';\n }\n if (risk === 'médio') {\n return 'Esta proposta possui risco médio. Deseja aplicar as alterações agora?';\n }\n return 'Deseja aplicar as alterações agora?';\n }\n\n private async openConfirmationDialog(data: AssistantConfirmDialogData): Promise<boolean> {\n const dialogRef = this.dialog.open(PraxisAiAssistantConfirmDialogComponent, {\n data,\n width: '420px',\n disableClose: false,\n autoFocus: false,\n restoreFocus: true,\n });\n try {\n const confirmed = await firstValueFrom(dialogRef.afterClosed());\n return confirmed === true;\n } catch {\n return false;\n }\n }\n\n private normalizeRiskLevel(value: unknown): ReviewRiskLevel | null {\n if (typeof value !== 'string') return null;\n const normalized = value\n .trim()\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '');\n if (normalized === 'baixo' || normalized === 'low') return 'baixo';\n if (normalized === 'medio' || normalized === 'medium') return 'médio';\n if (normalized === 'alto' || normalized === 'high') return 'alto';\n return null;\n }\n\n async undoLastChange(): Promise<void> {\n if (!this.lastSnapshot) return;\n this.setState('processing');\n this.cdr.markForCheck();\n try {\n await this.adapter.restoreSnapshot(this.lastSnapshot);\n this.lastSnapshot = null;\n this.close();\n } catch {\n this.errorMsg = 'Falha ao desfazer.';\n this.setState('error');\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n retry(): void {\n this.setState('listening');\n setTimeout(() => this.inputElement?.nativeElement?.focus(), 50);\n }\n\n private async applyPatchPayload(patch: Record<string, unknown>, edited: boolean): Promise<void> {\n this.setState('applying');\n this.patchEditorError = '';\n this.cdr.markForCheck();\n\n try {\n this.lastSnapshot = this.adapter.createSnapshot();\n const result = await this.adapter.applyPatch(patch, this.userPrompt);\n this.applyWarnings = result.warnings || [];\n this.lastApplyAt = new Date().toISOString();\n\n if (result.success) {\n this.pendingPatch = patch;\n if (edited) {\n this.pendingDiff = [];\n }\n this.patchEditorText = this.serializePatch(patch);\n this.syncPatchPathEdits();\n this.aiExplanation = edited\n ? 'Patch reaplicado com sucesso.'\n : (this.aiExplanation || 'Configuração atualizada.');\n this.setState('success');\n } else {\n this.errorMsg = result.error || 'O componente recusou a alteração.';\n this.setState('error');\n }\n } catch {\n this.errorMsg = 'Erro crítico ao aplicar configuração.';\n this.setState('error');\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n private parsePatchEditorText(): Record<string, unknown> | null {\n const raw = (this.patchEditorText || '').trim();\n if (!raw) {\n this.patchEditorError = 'Patch vazio. Informe um JSON válido para reaplicar.';\n return null;\n }\n try {\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n this.patchEditorError = 'O patch precisa ser um objeto JSON (ex.: {\"columns\": [...]}).';\n return null;\n }\n this.patchEditorError = '';\n return parsed as Record<string, unknown>;\n } catch {\n this.patchEditorError = 'JSON inválido. Revise o patch antes de reaplicar.';\n return null;\n }\n }\n\n private collectPatchPaths(\n value: unknown,\n prefix = '',\n acc: string[] = [],\n limit = 30,\n ): string[] {\n if (acc.length >= limit) return acc;\n if (value == null) {\n if (prefix) acc.push(prefix);\n return acc;\n }\n if (Array.isArray(value)) {\n if (prefix) acc.push(`${prefix}[]`);\n return acc;\n }\n if (typeof value !== 'object') {\n if (prefix) acc.push(prefix);\n return acc;\n }\n const entries = Object.entries(value as Record<string, unknown>);\n if (!entries.length) {\n if (prefix) acc.push(prefix);\n return acc;\n }\n for (const [key, child] of entries) {\n if (acc.length >= limit) break;\n const nextPrefix = prefix ? `${prefix}.${key}` : key;\n this.collectPatchPaths(child, nextPrefix, acc, limit);\n }\n if (!prefix && acc.length > limit) {\n return acc.slice(0, limit);\n }\n return Array.from(new Set(acc));\n }\n\n private serializePatch(value: unknown): string {\n try {\n return JSON.stringify(value ?? {}, null, 2);\n } catch {\n return '{}';\n }\n }\n\n private syncPatchPathEdits(): void {\n if (!this.pendingPatch) {\n this.patchPathEdits = [];\n return;\n }\n const paths = this.collectEditablePatchPaths(this.pendingPatch)\n .filter((path) => path.trim().length > 0)\n .slice(0, 20);\n this.patchPathEdits = paths.map((path) => ({\n path,\n valueText: this.serializePathValue(this.getPatchValueAtPath(this.pendingPatch, path)),\n error: '',\n }));\n }\n\n private serializePathValue(value: unknown): string {\n if (value === undefined) return '';\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return '';\n }\n }\n\n private collectEditablePatchPaths(\n value: unknown,\n prefix = '',\n acc: string[] = [],\n limit = 40,\n ): string[] {\n if (acc.length >= limit) return acc;\n\n if (value === null || value === undefined) {\n if (prefix) acc.push(prefix);\n return acc;\n }\n\n if (Array.isArray(value)) {\n if (!value.length) {\n if (prefix) acc.push(prefix);\n return acc;\n }\n for (let i = 0; i < value.length; i += 1) {\n if (acc.length >= limit) break;\n const nextPrefix = prefix ? `${prefix}[${i}]` : `[${i}]`;\n this.collectEditablePatchPaths(value[i], nextPrefix, acc, limit);\n }\n return acc;\n }\n\n if (typeof value !== 'object') {\n if (prefix) acc.push(prefix);\n return acc;\n }\n\n const entries = Object.entries(value as Record<string, unknown>);\n if (!entries.length) {\n if (prefix) acc.push(prefix);\n return acc;\n }\n\n for (const [key, child] of entries) {\n if (acc.length >= limit) break;\n const nextPrefix = prefix ? `${prefix}.${key}` : key;\n this.collectEditablePatchPaths(child, nextPrefix, acc, limit);\n }\n return acc;\n }\n\n private parsePathEditValue(\n valueText: string,\n ): { ok: true; value: unknown } | { ok: false; error: string } {\n const raw = (valueText || '').trim();\n if (!raw) {\n return { ok: false, error: 'Informe um valor JSON válido.' };\n }\n try {\n return { ok: true, value: JSON.parse(raw) };\n } catch {\n // Fallback pragmático: texto simples sem aspas vira string.\n return { ok: true, value: raw };\n }\n }\n\n private getPatchValueAtPath(source: unknown, path: string): unknown {\n const tokens = this.tokenizePatchPath(path);\n let cursor: unknown = source;\n for (const token of tokens) {\n if (cursor == null) return undefined;\n if (Array.isArray(cursor)) {\n if (typeof token !== 'number') return undefined;\n cursor = cursor[token];\n continue;\n }\n const record = this.asRecord(cursor);\n if (!record || typeof token !== 'string') return undefined;\n cursor = record[token];\n }\n return cursor;\n }\n\n private setPatchValueAtPath(target: Record<string, unknown>, path: string, value: unknown): void {\n const tokens = this.tokenizePatchPath(path);\n if (!tokens.length) return;\n let cursor: unknown = target;\n for (let i = 0; i < tokens.length - 1; i += 1) {\n const token = tokens[i];\n const nextToken = tokens[i + 1];\n const nextIsIndex = typeof nextToken === 'number';\n if (Array.isArray(cursor)) {\n if (typeof token !== 'number') return;\n if (cursor[token] == null || typeof cursor[token] !== 'object') {\n cursor[token] = nextIsIndex ? [] : {};\n }\n cursor = cursor[token];\n continue;\n }\n const record = this.asRecord(cursor);\n if (!record || typeof token !== 'string') return;\n if (record[token] == null || typeof record[token] !== 'object') {\n record[token] = nextIsIndex ? [] : {};\n }\n cursor = record[token];\n }\n const lastToken = tokens[tokens.length - 1];\n if (Array.isArray(cursor)) {\n if (typeof lastToken !== 'number') return;\n cursor[lastToken] = value;\n return;\n }\n const record = this.asRecord(cursor);\n if (!record || typeof lastToken !== 'string') return;\n record[lastToken] = value;\n }\n\n private tokenizePatchPath(path: string): Array<string | number> {\n return path\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .map((part) => (/^\\d+$/.test(part) ? Number(part) : part));\n }\n\n private clonePatch<T>(value: T): T {\n try {\n if (typeof structuredClone === 'function') {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n } catch {\n return value;\n }\n }\n\n prepareSuggestionPrompt(sug: AiSuggestion, event?: Event): void {\n event?.preventDefault();\n event?.stopPropagation();\n this.promptFromSuggestion = true;\n this.activeVariantId = this.resolveVariantIdForSuggestion(sug);\n this.activeSuggestion = sug;\n this.userPrompt = sug.intent;\n this.activeTab = 'suggestions';\n setTimeout(() => this.inputElement?.nativeElement?.focus(), 50);\n this.cdr.markForCheck();\n }\n\n dismissSuggestion(sug: AiSuggestion, event?: Event): void {\n event?.preventDefault();\n event?.stopPropagation();\n if (!sug?.id) return;\n const next = new Set(this.dismissedSuggestionIds);\n next.add(sug.id);\n this.dismissedSuggestionIds = next;\n this.cdr.markForCheck();\n }\n\n onSuggestionCardKeydown(event: KeyboardEvent, sug: AiSuggestion): void {\n if (event.target !== event.currentTarget) return;\n if (event.key === 'Enter') {\n this.selectSuggestion(sug);\n return;\n }\n if (event.key === ' ') {\n event.preventDefault();\n this.selectSuggestion(sug);\n }\n }\n\n selectSuggestion(sug: AiSuggestion): void {\n this.promptFromSuggestion = true;\n this.activeVariantId = this.resolveVariantIdForSuggestion(sug);\n this.activeSuggestion = sug;\n this.userPrompt = sug.intent;\n if (this.needsBadgeValueClarification(sug)) {\n const configRoot = this.resolveConfigRoot(this.adapter.getCurrentConfig?.());\n const options = this.buildValueColorClarificationPayloads(configRoot, sug.intent);\n if (options.length) {\n this.enterClarificationWithOptions('Escolha valores e cores para os badges.', options, sug.intent);\n return;\n }\n }\n this.submitPrompt();\n }\n\n // Helpers\n\n async refreshSuggestions(): Promise<void> {\n await this.loadSuggestions(true);\n }\n\n async submitClarificationSelection(): Promise<void> {\n if (this.clarificationSelectionMode !== 'multiple') return;\n if (!this.selectedClarificationOptions.length) return;\n const base = (this.clarificationBasePrompt || '').trim();\n const combined = this.selectedClarificationOptions.map((opt) => opt.value).join(', ');\n const mergedHints = this.selectedClarificationOptions\n .map((opt) => opt.contextHints)\n .filter((hint): hint is ClarificationContextHints => !!hint)\n .reduce<ClarificationContextHints | null>((acc, hint) => this.mergeContextHints(acc, hint), null);\n if (mergedHints) {\n this.activeContextHints = mergedHints;\n this.skipClarificationAppend = true;\n await this.submitPrompt(base || combined);\n return;\n }\n await this.submitPrompt(combined);\n }\n\n startNewSession(resetUi = true): void {\n if (!this.historyContext) return;\n this.clearPendingHistoryUndo();\n const session = this.historyService.createSession(\n this.historyContext,\n this.resolveComponentId(),\n this.resolveComponentType(),\n );\n if (!session) return;\n this.activeHistorySession = session;\n this.activeHistoryMessages = [];\n this.activeHistoryTotalMessages = 0;\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n this.activeServerSessionId = null;\n this.forceNewSession = true;\n this.persistServerSessionId(null);\n this.historyService.updateServerSessionId(this.historyContext, session.id, null);\n if (resetUi) {\n this.resetAssistantStateForSession();\n }\n this.cdr.markForCheck();\n }\n\n async clearHistory(): Promise<void> {\n if (!this.historyContext) return;\n if (!(await this.confirmHistoryClear())) return;\n this.historyService.clearHistory(this.historyContext);\n this.historySessions = [];\n this.activeHistorySession = null;\n this.activeHistoryMessages = [];\n this.activeHistoryTotalMessages = 0;\n this.clearPendingHistoryUndo();\n this.resetAssistantStateForSession();\n }\n\n async removeHistorySession(sessionId: string, event?: Event): Promise<void> {\n event?.preventDefault();\n event?.stopPropagation();\n if (!this.historyContext || !sessionId) return;\n const session = this.historyService.getSession(sessionId);\n if (!session || !this.matchesHistoryContext(session)) return;\n const confirmed = await this.openConfirmationDialog({\n title: 'Excluir sessão',\n message: `Deseja excluir a sessão \"${session.title}\" do histórico local?`,\n confirmLabel: 'Excluir sessão',\n cancelLabel: 'Cancelar',\n confirmColor: 'warn',\n });\n if (!confirmed) return;\n this.historyService.deleteSession(this.historyContext, sessionId);\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n if (this.activeHistorySession?.id === sessionId) {\n this.activeHistorySession = null;\n this.activeHistoryMessages = [];\n this.activeHistoryTotalMessages = 0;\n this.activeServerSessionId = null;\n this.forceNewSession = true;\n this.persistServerSessionId(null);\n this.historySessions[0]?.id && this.selectHistorySession(this.historySessions[0].id);\n }\n this.setHistoryUndo(session);\n this.cdr.markForCheck();\n }\n\n onHistorySessionCardKeydown(event: KeyboardEvent, sessionId: string): void {\n if (event.target !== event.currentTarget) return;\n if (event.key === 'Enter') {\n this.selectHistorySession(sessionId);\n return;\n }\n if (event.key === ' ') {\n event.preventDefault();\n this.selectHistorySession(sessionId);\n }\n }\n\n reuseHistorySessionPrompt(sessionId: string, event?: Event): void {\n event?.preventDefault();\n event?.stopPropagation();\n const session = this.historyService.getSession(sessionId);\n if (!session || !this.matchesHistoryContext(session)) return;\n const lastUserPrompt = [...(session.messages || [])]\n .reverse()\n .find((msg) => msg.role === 'user' && !!msg.text?.trim())?.text;\n if (!lastUserPrompt) return;\n this.userPrompt = lastUserPrompt;\n this.activeTab = 'chat';\n setTimeout(() => this.inputElement?.nativeElement?.focus(), 50);\n this.cdr.markForCheck();\n }\n\n undoRemoveHistorySession(): void {\n if (!this.historyContext || !this.historyUndoDeleteSession) return;\n const previousActiveId = this.activeHistorySession?.id || null;\n const restored = this.historyService.restoreSession(this.historyContext, this.historyUndoDeleteSession);\n this.clearPendingHistoryUndo();\n if (!restored) {\n this.cdr.markForCheck();\n return;\n }\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n if (!previousActiveId || previousActiveId === restored.id) {\n this.selectHistorySession(restored.id);\n return;\n }\n this.selectHistorySession(previousActiveId);\n }\n\n selectHistorySession(sessionId: string): void {\n if (!this.historyContext) return;\n const session = this.historyService.getSession(sessionId);\n if (!session || !this.matchesHistoryContext(session)) return;\n this.activeHistorySession = session;\n const messages = session.messages || [];\n this.activeHistoryMessages = this.sliceHistoryMessages(messages);\n this.activeHistoryTotalMessages = messages.length;\n this.activeServerSessionId = session.serverSessionId || null;\n this.forceNewSession = !this.activeServerSessionId;\n this.persistServerSessionId(this.activeServerSessionId);\n this.cdr.markForCheck();\n }\n\n private async loadSuggestions(force = false): Promise<void> {\n if (this.loadingSuggestions && !force) return;\n this.loadingSuggestions = true;\n this.richSuggestions = [];\n this.suggestionsWarnings = [];\n this.cdr.markForCheck();\n const componentId = this.resolveComponentId();\n const componentType = this.resolveComponentType();\n this.currentComponentId = componentId || this.currentComponentId;\n this.currentComponentType = componentType || this.currentComponentType;\n const configRoot = this.resolveConfigRoot(this.adapter.getCurrentConfig?.());\n const dataProfile = this.adapter.getDataProfile ? this.adapter.getDataProfile() : null;\n const schemaFields = this.adapter.getSchemaFields ? this.adapter.getSchemaFields() : undefined;\n const capabilities = this.adapter.getCapabilities?.() || [];\n const runtimeState = this.adapter.getRuntimeState ? this.adapter.getRuntimeState() : undefined;\n const suggestionContext = this.adapter.getSuggestionContext?.();\n\n if (!componentId || !componentType) {\n this.suggestionsWarnings = ['Sugestoes indisponiveis sem componente registrado.'];\n this.dismissedSuggestionIds = new Set<string>();\n this.loadingSuggestions = false;\n this.cdr.markForCheck();\n return;\n }\n\n let cacheKey: string | null = null;\n try {\n cacheKey = this.buildSuggestionsCacheKey(\n componentId,\n componentType,\n configRoot,\n dataProfile,\n schemaFields,\n capabilities,\n runtimeState,\n suggestionContext,\n this.resolveLocale(),\n );\n } catch {\n cacheKey = null;\n }\n\n if (cacheKey && !force && this.suggestionsCache.has(cacheKey)) {\n this.richSuggestions = this.suggestionsCache.get(cacheKey) || [];\n this.suggestionsWarnings = [];\n this.pruneDismissedSuggestions();\n this.loadingSuggestions = false;\n this.cdr.markForCheck();\n return;\n }\n\n try {\n const response = await firstValueFrom(this.aiApi.getSuggestions(\n this.buildSuggestionsRequest(\n componentId,\n componentType,\n configRoot,\n capabilities,\n dataProfile,\n schemaFields,\n runtimeState,\n suggestionContext,\n force,\n ),\n ));\n const initialSuggestions = response?.suggestions || [];\n if (initialSuggestions.length === 0) {\n const retry = await firstValueFrom(this.aiApi.getSuggestions(\n this.buildSuggestionsRequest(\n componentId,\n componentType,\n configRoot,\n capabilities,\n dataProfile,\n schemaFields,\n runtimeState,\n suggestionContext,\n true,\n {\n mode: 'force',\n fallback: ['availableFeatures', 'missingCapabilities'],\n reason: 'empty-suggestions',\n },\n ),\n ));\n this.richSuggestions = retry?.suggestions || [];\n this.suggestionsWarnings = retry?.warnings || response?.warnings || [];\n } else {\n this.richSuggestions = initialSuggestions;\n this.suggestionsWarnings = response?.warnings || [];\n }\n if (cacheKey && this.richSuggestions.length > 0) {\n this.suggestionsCache.set(cacheKey, this.richSuggestions);\n }\n if (this.richSuggestions.length === 0 && this.suggestionsWarnings.length === 0) {\n this.suggestionsWarnings = ['Sem sugestões retornadas pelo backend.'];\n }\n } catch (err) {\n this.richSuggestions = [];\n this.suggestionsWarnings = ['Falha ao carregar sugestoes do backend.'];\n } finally {\n this.pruneDismissedSuggestions();\n this.loadingSuggestions = false;\n this.cdr.markForCheck();\n }\n }\n\n private async getPatchViaStreamWithFallback(request: AiOrchestratorRequest): Promise<AiOrchestratorResponse> {\n this.resetStreamTracking();\n try {\n const startResponse = await firstValueFrom(this.aiApi.startPatchStream(request));\n this.streamTimelineMode = 'stream';\n this.initializeStreamTimeline();\n return await this.consumePatchStream(\n startResponse.streamId,\n startResponse.expiresAt,\n startResponse.streamAccessToken ?? undefined,\n );\n } catch (error) {\n this.closeActiveStreamConnection();\n this.streamTerminalState = 'idle';\n this.processingInfoVisible = false;\n if (!this.shouldFallbackToPatch(error)) {\n throw error;\n }\n this.streamTimelineMode = 'snapshot';\n this.streamFallbackActive = true;\n this.aiExplanation = 'Conexão de stream indisponível. Usando resposta snapshot.';\n return await firstValueFrom(this.aiApi.getPatch(request));\n }\n }\n\n private async consumePatchStream(\n streamId: string,\n expiresAt?: string,\n accessToken?: string,\n ): Promise<AiOrchestratorResponse> {\n this.activeStreamId = streamId;\n this.activeStreamAccessToken = accessToken?.trim() || null;\n this.activeStreamConnection = this.aiApi.connectPatchStream(\n streamId,\n this.resolveLastEventIdForStream(streamId) || undefined,\n this.activeStreamAccessToken || undefined,\n );\n this.streamTerminalState = 'in_progress';\n this.streamTimelineMode = 'stream';\n\n const absoluteTimeoutMs = this.resolveStreamTimeoutMs(expiresAt);\n const idleTimeoutMs = this.resolveStreamIdleTimeoutMs();\n\n return await new Promise<AiOrchestratorResponse>((resolve, reject) => {\n let settled = false;\n let subscription: Subscription | null = null;\n let idleTimerId: ReturnType<typeof setTimeout> | null = null;\n const connection = this.activeStreamConnection;\n if (!connection) {\n reject(new Error('Stream connection unavailable.'));\n return;\n }\n\n const clearIdleTimer = () => {\n if (idleTimerId) {\n clearTimeout(idleTimerId);\n idleTimerId = null;\n }\n };\n\n const resetIdleTimer = () => {\n clearIdleTimer();\n idleTimerId = setTimeout(() => {\n if (settled) return;\n settled = true;\n this.streamTerminalState = 'failed';\n this.processingInfoVisible = false;\n subscription?.unsubscribe();\n this.closeActiveStreamConnection();\n reject(new AiPatchStreamConnectionError(\n 'transport',\n 'Patch stream inactive timeout.',\n ));\n }, idleTimeoutMs);\n };\n\n const absoluteTimerId = setTimeout(() => {\n if (settled) return;\n settled = true;\n this.streamTerminalState = 'expired';\n this.processingInfoVisible = false;\n clearIdleTimer();\n subscription?.unsubscribe();\n this.closeActiveStreamConnection();\n reject(new Error('Patch stream expired.'));\n }, absoluteTimeoutMs);\n\n resetIdleTimer();\n\n subscription = connection.events$.subscribe({\n next: (event) => {\n if (settled) return;\n try {\n resetIdleTimer();\n const terminal = this.applyStreamEvent(event);\n if (!terminal) {\n return;\n }\n settled = true;\n clearTimeout(absoluteTimerId);\n clearIdleTimer();\n subscription?.unsubscribe();\n this.closeActiveStreamConnection();\n resolve(terminal);\n } catch (error) {\n settled = true;\n clearTimeout(absoluteTimerId);\n clearIdleTimer();\n subscription?.unsubscribe();\n this.closeActiveStreamConnection();\n reject(error);\n }\n },\n error: (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(absoluteTimerId);\n clearIdleTimer();\n subscription?.unsubscribe();\n this.closeActiveStreamConnection();\n reject(error);\n },\n });\n });\n }\n\n private applyStreamEvent(event: AiPatchStreamEnvelope | null | undefined): AiOrchestratorResponse | null {\n if (!this.acceptStreamEvent(event)) return null;\n const schemaVersion = typeof event.eventSchemaVersion === 'string'\n ? event.eventSchemaVersion.trim()\n : '';\n if (schemaVersion !== 'v1') {\n throw new AiPatchStreamConnectionError(\n 'schema',\n `Unsupported stream schema version: ${schemaVersion || 'unknown'}.`,\n );\n }\n\n const payload = this.asRecord(event.payload);\n const message = this.extractStreamMessage(payload);\n\n if (event.type === 'status') {\n const state = typeof payload?.['state'] === 'string' ? payload?.['state'].trim().toLowerCase() : '';\n if (state === 'expired') {\n this.streamTerminalState = 'expired';\n this.markStreamStep(2, 'done', 'Stream expirado antes da finalização.');\n return {\n type: 'error',\n message: message || 'Stream expirado.',\n };\n }\n if (state === 'started') {\n this.markStreamStep(1, 'done', message || 'Pedido validado.');\n this.markStreamStep(2, 'active', 'Preparando proposta.');\n } else if (state === 'in_progress') {\n this.markStreamStep(2, 'active', message || 'Turno em processamento.');\n }\n this.streamTerminalState = 'in_progress';\n if (message) {\n this.aiExplanation = message;\n }\n this.processingInfoVisible = true;\n this.setState('processing');\n return null;\n }\n\n if (event.type === 'thought.step') {\n const step = Number(payload?.['step']);\n const stepStateRaw = typeof payload?.['state'] === 'string' ? payload['state'].trim().toLowerCase() : '';\n const stepState: StreamStepState =\n stepStateRaw === 'done'\n ? 'done'\n : stepStateRaw === 'pending'\n ? 'pending'\n : 'active';\n if (step === 1 || step === 2 || step === 3) {\n const detail = this.firstNonBlank(\n typeof payload?.['detail'] === 'string' ? payload['detail'] : null,\n typeof payload?.['title'] === 'string' ? payload['title'] : null,\n message,\n );\n this.markStreamStep(step, stepState, detail || undefined);\n }\n if (message) {\n this.aiExplanation = message;\n }\n if (this.streamTerminalState !== 'completed' && this.streamTerminalState !== 'cancelled' && this.streamTerminalState !== 'failed') {\n this.streamTerminalState = 'in_progress';\n this.processingInfoVisible = true;\n this.setState('processing');\n }\n return null;\n }\n\n if (event.type === 'heartbeat') {\n this.streamTerminalState = 'in_progress';\n this.processingInfoVisible = true;\n return null;\n }\n\n if (event.type === 'result') {\n this.streamTerminalState = 'completed';\n this.processingInfoVisible = false;\n const response = this.asRecord(payload?.['response']);\n if (!response) {\n return {\n type: 'error',\n message: 'Resposta de stream inválida.',\n };\n }\n return response as unknown as AiOrchestratorResponse;\n }\n\n if (event.type === 'cancelled') {\n this.streamTerminalState = 'cancelled';\n this.processingInfoVisible = false;\n this.markStreamStep(2, 'done', message || 'Solicitação cancelada.');\n return {\n type: 'error',\n code: 'CANCELLED',\n message: message || 'Solicitação cancelada.',\n };\n }\n\n if (event.type === 'error') {\n this.streamTerminalState = 'failed';\n this.processingInfoVisible = false;\n this.markStreamStep(2, 'done', message || 'Falha no processamento do stream.');\n return {\n type: 'error',\n message: message || 'Falha no processamento do stream.',\n };\n }\n\n return null;\n }\n\n private resolveStreamTimeoutMs(expiresAt?: string): number {\n const fallback = 90_000;\n if (!expiresAt) return fallback;\n const targetTs = Date.parse(expiresAt);\n if (!Number.isFinite(targetTs)) return fallback;\n const remaining = targetTs - Date.now();\n return remaining > 3_000 ? remaining : 3_000;\n }\n\n private resolveStreamIdleTimeoutMs(): number {\n return 30_000;\n }\n\n private acceptStreamEvent(event: AiPatchStreamEnvelope | null | undefined): event is AiPatchStreamEnvelope {\n if (!event || !event.type) {\n return false;\n }\n const streamId = (event.streamId || '').trim();\n if (!streamId) {\n return false;\n }\n if (this.activeStreamId && streamId !== this.activeStreamId) {\n return false;\n }\n\n const eventId = typeof event.eventId === 'string' ? event.eventId.trim() : '';\n if (eventId) {\n const eventKey = `${streamId}:${eventId}`;\n if (this.streamSeenEventIds.has(eventKey)) {\n return false;\n }\n this.streamSeenEventIds.add(eventKey);\n this.streamLastEventIdByStream.set(streamId, eventId);\n this.streamLastEventId = eventId;\n }\n\n if (Number.isFinite(event.seq) && event.seq > 0) {\n const lastSeq = this.streamLastSeqByStream.get(streamId) || 0;\n if (event.seq <= lastSeq) {\n return false;\n }\n this.streamLastSeqByStream.set(streamId, event.seq);\n if (this.activeStreamId === streamId) {\n this.streamLastSeq = Math.max(this.streamLastSeq, event.seq);\n }\n }\n return true;\n }\n\n private resolveLastEventIdForStream(streamId: string): string | null {\n const normalized = (streamId || '').trim();\n if (!normalized) return this.streamLastEventId;\n return this.streamLastEventIdByStream.get(normalized) || this.streamLastEventId;\n }\n\n private extractStreamMessage(payload: Record<string, unknown> | null): string {\n if (!payload) return '';\n const direct = payload['message'];\n if (typeof direct === 'string' && direct.trim()) {\n return direct.trim();\n }\n const nested = this.asRecord(payload['error']);\n const nestedMsg = nested?.['message'];\n if (typeof nestedMsg === 'string' && nestedMsg.trim()) {\n return nestedMsg.trim();\n }\n return '';\n }\n\n private requestStreamCancel(): void {\n if (!this.activeStreamId) {\n return;\n }\n const streamId = this.activeStreamId;\n const accessToken = this.activeStreamAccessToken || undefined;\n void firstValueFrom(this.aiApi.cancelPatchStream(streamId, accessToken)).catch(() => undefined);\n }\n\n private closeActiveStreamConnection(): void {\n if (this.activeStreamConnection) {\n this.activeStreamConnection.close();\n this.activeStreamConnection = null;\n }\n this.activeStreamId = null;\n this.activeStreamAccessToken = null;\n }\n\n private resetStreamTracking(): void {\n this.closeActiveStreamConnection();\n this.streamSeenEventIds = new Set<string>();\n this.streamLastSeqByStream = new Map<string, number>();\n this.streamLastEventIdByStream = new Map<string, string>();\n this.streamLastSeq = 0;\n this.streamLastEventId = null;\n this.streamTerminalState = 'idle';\n this.streamTimelineMode = 'snapshot';\n this.streamFallbackActive = false;\n this.initializeStreamTimeline();\n }\n\n private shouldFallbackToPatch(error: unknown): boolean {\n if (error instanceof AiPatchStreamConnectionError) {\n if (error.kind === 'unsupported') {\n return true;\n }\n if (error.kind === 'schema') {\n return true;\n }\n if (error.kind === 'http_status') {\n return [0, 404, 405, 406, 415, 500, 501, 502, 503, 504].includes(error.status || 0);\n }\n if (error.kind === 'transport') {\n return true;\n }\n if (error.kind === 'parse') {\n return false;\n }\n }\n if (error instanceof HttpErrorResponse) {\n return [0, 404, 405, 406, 415, 500, 501, 502, 503, 504].includes(error.status);\n }\n if (error instanceof Error) {\n const normalized = (error.message || '').toLowerCase();\n if (normalized.includes('forbidden')\n || normalized.includes('unauthorized')\n || normalized.includes('invalid')\n || normalized.includes('expired')\n || normalized.includes('cancel')\n || normalized.includes('conflict')) {\n return false;\n }\n if (normalized.includes('stream disabled')\n || normalized.includes('not supported')) {\n return true;\n }\n }\n return false;\n }\n\n private handlePatchResponse(\n result: AiOrchestratorResponse | null | undefined,\n configRoot: JsonMap,\n componentId: string,\n componentType: string,\n ): boolean {\n if (!result) {\n this.streamTerminalState = 'failed';\n this.errorMsg = 'Resposta vazia da IA.';\n this.setState('error');\n return true;\n }\n\n if (result.code === 'UNKNOWN_COMPONENT') {\n this.streamTerminalState = 'failed';\n this.errorMsg = result.message || 'Componente desconhecido.';\n this.setState('error');\n return true;\n }\n\n this.warnings = result.warnings || [];\n this.backendRiskLevel = this.normalizeRiskLevel(result.riskLevel);\n this.backendRequiresConfirmation = typeof result.requiresConfirmation === 'boolean'\n ? result.requiresConfirmation\n : null;\n\n if (result.type === 'clarification') {\n const questions = result.questions?.filter((q) => !!q && q.trim().length > 0) || [];\n if (questions.length && (!result.options || result.options.length === 0)\n && (!result.optionPayloads || result.optionPayloads.length === 0)) {\n this.enterClarificationWithQuestions(\n result.message,\n questions,\n configRoot,\n componentId,\n componentType,\n );\n this.applyClarificationUi(result);\n return true;\n }\n const enriched = this.enrichClarification(result, configRoot, componentId, componentType);\n this.enterClarification(\n enriched.message,\n enriched.options,\n configRoot,\n componentId,\n componentType,\n undefined,\n enriched.optionPayloads,\n );\n this.applyClarificationUi(enriched);\n return true;\n }\n\n if (result.type === 'info') {\n const message = result.message || result.explanation || 'Informacao gerada.';\n if (this.isProcessingMessage(message)) {\n this.streamTerminalState = 'in_progress';\n this.aiExplanation = message;\n this.setState('processing');\n this.processingInfoVisible = true;\n return true;\n }\n this.streamTerminalState = 'completed';\n this.aiExplanation = message;\n this.setState('success');\n this.processingInfoVisible = false;\n return true;\n }\n\n if (result.type === 'error') {\n if (result.code === 'CANCELLED') {\n this.streamTerminalState = 'cancelled';\n this.errorMsg = '';\n this.aiExplanation = result.message || 'Solicitação cancelada.';\n this.processingInfoVisible = false;\n this.setState('listening');\n return true;\n }\n this.streamTerminalState = 'failed';\n this.errorMsg = result.message || 'Falha ao gerar configuracao.';\n this.setState('error');\n return true;\n }\n\n if (result.patch) {\n this.streamTerminalState = 'completed';\n this.pendingPatch = result.patch;\n this.pendingDiff = Array.isArray(result.diff) ? result.diff : [];\n this.patchEditorText = this.serializePatch(result.patch);\n this.patchEditorError = '';\n this.patchEditorExpanded = false;\n this.patchPathEditorExpanded = false;\n this.patchPathEditorError = '';\n this.applyWarnings = [];\n this.syncPatchPathEdits();\n this.aiExplanation = result.explanation || '';\n return false;\n }\n\n if (result.message) {\n this.streamTerminalState = 'failed';\n this.errorMsg = result.message;\n this.setState('error');\n return true;\n }\n\n return false;\n }\n\n private initHistory(): void {\n this.historyContext = this.historyService.getContext();\n this.historyWarnings = this.buildHistoryWarnings(this.historyContext);\n this.restoreServerSessionId();\n if (!this.historyContext.storageAvailable) {\n this.historySessions = [];\n this.activeHistorySession = null;\n this.activeHistoryMessages = [];\n this.activeHistoryTotalMessages = 0;\n return;\n }\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n if (this.activeHistorySession && this.matchesHistoryContext(this.activeHistorySession)) {\n const messages = this.activeHistorySession.messages || [];\n this.activeHistoryMessages = this.sliceHistoryMessages(messages);\n this.activeHistoryTotalMessages = messages.length;\n return;\n }\n const mostRecent = this.historySessions[0]?.id;\n if (mostRecent) {\n this.selectHistorySession(mostRecent);\n }\n }\n\n private buildHistoryWarnings(context: AssistantHistoryContext): string[] {\n const warnings: string[] = [];\n if (!context.storageAvailable) {\n warnings.push('Histórico local indisponível neste navegador.');\n return warnings;\n }\n const missing = new Set(context.missing || []);\n if (missing.has('X-User-ID')) {\n warnings.push('X-User-ID não informado. Identidade será resolvida no servidor.');\n }\n if (missing.has('X-Tenant-ID')) {\n warnings.push('X-Tenant-ID não informado. Identidade será resolvida no servidor.');\n }\n if (missing.has('X-Env')) {\n warnings.push('X-Env não informado. Ambiente será resolvido no servidor.');\n }\n return warnings;\n }\n\n private matchesHistoryContext(session: AssistantHistorySession): boolean {\n if (!this.historyContext) return false;\n return session.tenantId === this.historyContext.tenantId\n && session.env === this.historyContext.env\n && session.userId === this.historyContext.userId;\n }\n\n private buildClientTurnId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `turn-${Math.random().toString(36).slice(2, 10)}`;\n }\n\n private buildUiContextRef(componentId: string, componentType: string): {\n componentId: string;\n componentType: string;\n routeKey?: string;\n schemaHash?: string;\n variantId?: string;\n } {\n const routeKey = this.resolveRouteKey();\n const schemaHash = this.resolveSchemaHash();\n return {\n componentId,\n componentType,\n ...(routeKey ? { routeKey } : {}),\n ...(schemaHash ? { schemaHash } : {}),\n ...(this.activeVariantId ? { variantId: this.activeVariantId } : {}),\n };\n }\n\n private buildCurrentStateDigest(runtimeState: unknown): {\n columns?: string[];\n sort?: string;\n rowCount?: number;\n } | undefined {\n const state = this.asRecord(runtimeState);\n if (!state) return undefined;\n const rawColumns = Array.isArray(state['columns']) ? state['columns'] : undefined;\n const columns = rawColumns\n ? rawColumns\n .map((item) => (item == null ? '' : String(item).trim()))\n .filter((item) => item.length > 0)\n : undefined;\n const sortValue = state['sort'];\n const sort = typeof sortValue === 'string' ? sortValue : undefined;\n const rowCountValue = state['rowCount'];\n const rowCount = typeof rowCountValue === 'number' && Number.isFinite(rowCountValue)\n ? rowCountValue\n : undefined;\n if (!columns && !sort && rowCount === undefined) return undefined;\n return {\n ...(columns ? { columns } : {}),\n ...(sort ? { sort } : {}),\n ...(rowCount !== undefined ? { rowCount } : {}),\n };\n }\n\n private inferAiMode(\n runtimeState: JsonMap | undefined,\n configRoot: JsonMap,\n ): string | undefined {\n const widgetsCount = Number(runtimeState?.['widgetsCount'] ?? 0);\n const connectionsCount = Number(runtimeState?.['connectionsCount'] ?? 0);\n const configEmpty = !configRoot || Object.keys(configRoot).length === 0;\n const hasStructure = widgetsCount > 0 || connectionsCount > 0;\n if (!hasStructure && configEmpty) return 'create';\n if (hasStructure) return 'edit';\n return undefined;\n }\n\n private resolveRouteKey(): string | undefined {\n try {\n if (typeof window === 'undefined') return undefined;\n const path = window.location?.pathname || '';\n return path || undefined;\n } catch {\n return undefined;\n }\n }\n\n private resolveSchemaHash(): string | undefined {\n try {\n type AdapterWithSchemaHash = { getSchemaHash?: () => unknown };\n const hash = (this.adapter as unknown as AdapterWithSchemaHash)?.getSchemaHash?.();\n return typeof hash === 'string' && hash.trim() ? hash.trim() : undefined;\n } catch {\n return undefined;\n }\n }\n\n private checkSessionStorage(): boolean {\n if (typeof localStorage === 'undefined') return false;\n try {\n const key = `${AI_SESSION_STORAGE_PREFIX}.probe`;\n localStorage.setItem(key, '1');\n localStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n }\n\n private resolveSessionStorageKey(): string | null {\n const componentId = this.resolveComponentId();\n const componentType = this.resolveComponentType();\n if (!componentId || !componentType) return null;\n const context = this.historyContext || this.aiApi.getHeaderContext();\n return `${AI_SESSION_STORAGE_PREFIX}:${context.tenantId}:${context.env}:${context.userId}:${componentType}:${componentId}`;\n }\n\n private restoreServerSessionId(): void {\n if (!this.sessionStorageAvailable) return;\n const key = this.resolveSessionStorageKey();\n if (!key) return;\n try {\n const stored = localStorage.getItem(key);\n this.activeServerSessionId = stored && stored.trim() ? stored.trim() : null;\n } catch {\n this.activeServerSessionId = null;\n }\n }\n\n private persistServerSessionId(sessionId: string | null): void {\n if (!this.sessionStorageAvailable) return;\n const key = this.resolveSessionStorageKey();\n if (!key) return;\n try {\n if (sessionId && sessionId.trim()) {\n localStorage.setItem(key, sessionId.trim());\n } else {\n localStorage.removeItem(key);\n }\n } catch {\n // ignore storage errors\n }\n }\n\n private appendHistoryMessage(\n role: AssistantHistoryMessage['role'],\n text: string,\n context?: AssistantHistoryMessage['context'],\n ): void {\n if (!this.historyContext) return;\n if (!this.activeHistorySession) {\n this.startNewSession(false);\n }\n if (!this.activeHistorySession) return;\n const updated = this.historyService.addMessage(this.historyContext, this.activeHistorySession.id, role, text, context);\n if (updated) {\n this.activeHistorySession = updated;\n const messages = updated.messages || [];\n this.activeHistoryMessages = this.sliceHistoryMessages(messages);\n this.activeHistoryTotalMessages = messages.length;\n this.historySessions = this.historyService.listSessions(this.historyContext, 10);\n }\n }\n\n private appendHistoryAssistantResponse(\n result: AiOrchestratorResponse | null | undefined,\n componentId: string,\n componentType: string,\n ): void {\n const text = this.resolveAssistantSummary(result);\n if (!text) return;\n this.appendHistoryMessage('assistant', text, {\n componentId,\n componentType,\n usedRag: this.resolveUsedRag(result),\n });\n }\n\n private resolveAssistantSummary(result: AiOrchestratorResponse | null | undefined): string {\n if (!result) return '';\n const text = (result.explanation || result.message || '').trim();\n if (text) return text;\n if (result.type === 'clarification') {\n return 'Faltam informações para concluir a proposta.';\n }\n if (result.type === 'error') {\n return 'Falha ao gerar configuração.';\n }\n if (result.patch) {\n return this.aiExplanation || 'Proposta pronta para revisão.';\n }\n return '';\n }\n\n private isProcessingMessage(message: string): boolean {\n const normalized = (message || '').toLowerCase();\n return normalized.includes('processamento') || normalized.includes('in progress') || normalized.includes('in_progress');\n }\n\n async retryProcessing(): Promise<void> {\n if (this.state !== 'processing') return;\n this.cancelProcessing();\n await this.submitPrompt();\n }\n\n private cancelProcessing(message?: string): void {\n if (this.state === 'processing') {\n this.requestStreamCancel();\n }\n this.closeActiveStreamConnection();\n this.streamTerminalState = 'cancelled';\n this.processingInfoVisible = false;\n this.errorMsg = '';\n if (message) {\n this.aiExplanation = message;\n }\n this.setState('listening');\n this.cdr.markForCheck();\n }\n\n private withSnapshotFallbackDetail(detail: string): string {\n if (!this.streamFallbackActive) return detail;\n const fallback = 'Stream indisponível nesta solicitação. Operando em modo snapshot.';\n const clean = (detail || '').trim();\n return clean ? `${fallback} ${clean}` : fallback;\n }\n\n private resolveUsedRag(result: AiOrchestratorResponse | null | undefined): boolean {\n return Array.isArray(result?.contextRequest) && result.contextRequest.length > 0;\n }\n\n private sliceHistoryMessages(messages: AssistantHistoryMessage[]): AssistantHistoryMessage[] {\n if (!messages.length) return [];\n return messages.slice(-this.maxHistoryMessages);\n }\n\n private applyClarificationUi(result?: AiOrchestratorResponse | null): void {\n const ui = result?.clarification;\n const hasOptions = this.clarificationOptions.length > 0;\n const responseType = ui?.responseType || (hasOptions ? 'choice' : 'text');\n const selectionMode = ui?.selectionMode || 'single';\n const allowCustom = ui?.allowCustom ?? (responseType === 'mixed' || responseType === 'text');\n\n this.clarificationResponseType = responseType;\n this.clarificationSelectionMode = selectionMode;\n this.clarificationAllowCustom = allowCustom;\n this.clarificationPresentation = ui?.presentation || this.resolveClarificationPresentation(responseType, selectionMode, hasOptions);\n const hasEndpoint = this.clarificationOptions.some((opt) => this.isEndpointOption(opt));\n if (hasEndpoint) {\n this.clarificationPresentation = 'list';\n }\n\n if (responseType === 'confirm' && !hasOptions) {\n this.clarificationOptions = [\n { label: 'Sim', value: 'Sim' },\n { label: 'Não', value: 'Não' },\n ];\n }\n if (responseType === 'context') {\n this.clarificationOptions = [];\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n this.clarificationAllowCustom = false;\n }\n }\n\n private resolveClarificationPresentation(\n responseType: 'text' | 'choice' | 'confirm' | 'mixed' | 'context',\n selectionMode: 'single' | 'multiple',\n hasOptions: boolean,\n ): 'buttons' | 'list' | 'chips' {\n if (!hasOptions) return 'chips';\n if (responseType === 'confirm') return 'buttons';\n if (selectionMode === 'multiple') return 'buttons';\n return 'chips';\n }\n\n private resetAssistantStateForSession(): void {\n if (!this.isOpen) return;\n this.setState('listening');\n this.userPrompt = '';\n this.aiExplanation = '';\n this.pendingPatch = null;\n this.pendingDiff = [];\n this.patchEditorText = '';\n this.patchEditorError = '';\n this.patchEditorExpanded = false;\n this.patchPathEditorExpanded = false;\n this.patchPathEdits = [];\n this.patchPathEditorError = '';\n this.applyWarnings = [];\n this.lastApplyAt = null;\n this.backendRiskLevel = null;\n this.backendRequiresConfirmation = null;\n this.errorMsg = '';\n this.warnings = [];\n this.suggestionsWarnings = [];\n this.clarificationOptions = [];\n this.clarificationMessage = '';\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n this.clarificationBasePrompt = null;\n this.activeVariantId = null;\n this.activeSuggestion = null;\n this.activeContextHints = null;\n this.activeResourcePath = null;\n this.skipClarificationAppend = false;\n this.clarificationResponseType = 'text';\n this.clarificationSelectionMode = 'single';\n this.clarificationAllowCustom = true;\n this.clarificationPresentation = 'list';\n this.selectedClarificationOptions = [];\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.dismissedSuggestionIds = new Set<string>();\n this.processingStartedAt = null;\n this.lastProcessingDurationMs = null;\n setTimeout(() => this.inputElement?.nativeElement?.focus(), 50);\n }\n\n private setHistoryUndo(session: AssistantHistorySession): void {\n this.historyUndoDeleteSession = session;\n this.clearHistoryUndoTimer();\n this.historyUndoTimerId = setTimeout(() => {\n this.historyUndoDeleteSession = null;\n this.historyUndoTimerId = null;\n this.cdr.markForCheck();\n }, 8000);\n }\n\n private clearPendingHistoryUndo(): void {\n this.historyUndoDeleteSession = null;\n this.clearHistoryUndoTimer();\n }\n\n private clearHistoryUndoTimer(): void {\n if (!this.historyUndoTimerId) return;\n clearTimeout(this.historyUndoTimerId);\n this.historyUndoTimerId = null;\n }\n\n private pruneDismissedSuggestions(): void {\n if (!this.dismissedSuggestionIds.size) return;\n if (!this.richSuggestions.length) {\n this.dismissedSuggestionIds = new Set<string>();\n return;\n }\n const allowedIds = new Set(this.richSuggestions.map((item) => item.id));\n const next = new Set(\n Array.from(this.dismissedSuggestionIds).filter((id) => allowedIds.has(id)),\n );\n if (next.size !== this.dismissedSuggestionIds.size) {\n this.dismissedSuggestionIds = next;\n }\n }\n\n private async confirmHistoryClear(): Promise<boolean> {\n if (typeof window === 'undefined') return true;\n return this.openConfirmationDialog({\n title: 'Limpar histórico local',\n message: 'Deseja remover todas as sessões salvas localmente para este usuário?',\n confirmLabel: 'Limpar histórico',\n cancelLabel: 'Cancelar',\n confirmColor: 'warn',\n });\n }\n\n private enterClarification(\n message: string | null | undefined,\n options: string[] | null | undefined,\n configRoot: JsonMap,\n componentId: string | null,\n componentType: string | null,\n basePrompt?: string,\n optionPayloads?: Array<{ value?: string | null; label?: string | null; example?: string | null; contextHints?: AiJsonObject | null }> | null,\n ): void {\n this.setState('clarification');\n this.clarificationMessage = message || 'Preciso de mais detalhes para continuar.';\n const base = (basePrompt ?? this.userPrompt).trim();\n this.clarificationBasePrompt = base || null;\n this.userPrompt = '';\n this.activeContextHints = null;\n this.activeResourcePath = null;\n this.clarificationOptions = this.resolveClarificationOptions(\n options,\n optionPayloads,\n configRoot,\n componentId || '',\n componentType || '',\n );\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n this.selectedClarificationOptions = [];\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.applyClarificationUi();\n if (this.clarificationSelectionMode === 'single' && this.clarificationOptions.length === 1) {\n this.selectedClarificationOptions = [this.clarificationOptions[0]];\n }\n this.cdr.markForCheck();\n }\n\n private enterClarificationWithOptions(\n message: string,\n options: ClarificationRichOption[],\n basePrompt?: string,\n ): void {\n this.setState('clarification');\n this.clarificationMessage = message || 'Preciso de mais detalhes para continuar.';\n const base = (basePrompt ?? this.userPrompt).trim();\n this.clarificationBasePrompt = base || null;\n this.userPrompt = '';\n this.activeContextHints = null;\n this.activeResourcePath = null;\n this.clarificationOptions = options;\n this.clarificationQuestions = [];\n this.clarificationAnswers = [];\n this.selectedClarificationOptions = [];\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.applyClarificationUi();\n if (this.clarificationSelectionMode === 'single' && this.clarificationOptions.length === 1) {\n this.selectedClarificationOptions = [this.clarificationOptions[0]];\n }\n this.cdr.markForCheck();\n }\n\n private enterClarificationWithQuestions(\n message: string | null | undefined,\n questions: string[],\n configRoot: JsonMap,\n componentId: string | null,\n componentType: string | null,\n ): void {\n this.setState('clarification');\n this.clarificationMessage = message || 'Preciso de mais detalhes para continuar.';\n const base = (this.userPrompt || '').trim();\n this.clarificationBasePrompt = base || null;\n this.userPrompt = '';\n this.activeContextHints = null;\n this.activeResourcePath = null;\n this.clarificationOptions = [];\n this.clarificationQuestions = questions;\n this.clarificationAnswers = new Array(questions.length).fill('');\n this.selectedClarificationOptions = [];\n this.clarificationFreeText = '';\n this.showManualInput = false;\n this.applyClarificationUi();\n this.cdr.markForCheck();\n }\n\n private resolveClarificationOptions(\n options: string[] | null | undefined,\n optionPayloads: Array<{ value?: string | null; label?: string | null; example?: string | null; contextHints?: AiJsonObject | null }> | null | undefined,\n configRoot: JsonMap,\n componentId: string,\n componentType: string,\n ): ClarificationRichOption[] {\n const payloads = (optionPayloads || [])\n .map((opt) => ({\n label: (opt.label || opt.value || '').trim(),\n value: (opt.value || opt.label || '').trim(),\n example: opt.example || undefined,\n contextHints: this.toClarificationContextHints(opt.contextHints),\n }))\n .filter((opt) => opt.label.length > 0 && opt.value.length > 0);\n\n if (payloads.length) return payloads;\n\n const normalized = (options || [])\n .map((opt) => (opt != null ? String(opt).trim() : ''))\n .filter((opt) => opt.length > 0)\n .map((opt) => ({\n label: opt,\n value: this.extractOptionValue(opt),\n }));\n\n if (normalized.length) return normalized;\n\n if (this.isTable(componentId, componentType)) {\n return this.extractColumnNames(configRoot).map((name) => ({ label: name, value: name }));\n }\n if (this.isForm(componentId, componentType)) {\n return this.extractFieldNames(configRoot).map((name) => ({ label: name, value: name }));\n }\n return [];\n }\n\n private enrichClarification(\n result: AiOrchestratorResponse,\n configRoot: JsonMap,\n componentId: string,\n componentType: string,\n ): AiOrchestratorResponse {\n const hasOptions = (result.options && result.options.length > 0) || (result.optionPayloads && result.optionPayloads.length > 0);\n if (hasOptions || !this.isTable(componentId, componentType)) {\n return result;\n }\n if (this.needsValueColorClarification(result.message)) {\n const optionPayloads = this.buildValueColorClarificationPayloads(configRoot, this.userPrompt);\n if (!optionPayloads.length) return result;\n return { ...result, optionPayloads };\n }\n if (!this.needsRuleClarification(result.message)) {\n return result;\n }\n const optionPayloads = this.buildRuleClarificationPayloads(configRoot, this.userPrompt);\n if (!optionPayloads.length) return result;\n return { ...result, optionPayloads };\n }\n\n private buildClarificationAnswers(fallbackAnswer: string): string {\n const pairs = this.clarificationQuestions\n .map((question, index) => {\n const answer = (this.clarificationAnswers[index] || '').trim();\n if (!answer) return null;\n return `${question}: ${answer}`;\n })\n .filter((entry): entry is string => !!entry);\n\n if (pairs.length) {\n return pairs.join('; ');\n }\n if (fallbackAnswer) {\n return fallbackAnswer;\n }\n return 'sem resposta';\n }\n\n private needsRuleClarification(message?: string | null): boolean {\n if (!message) return false;\n return /\\brules\\b/i.test(message) || /\\bregras\\b/i.test(message);\n }\n\n private needsValueColorClarification(message?: string | null): boolean {\n if (!message) return false;\n return /\\bvalues[_\\s-]?and[_\\s-]?colors\\b/i.test(message)\n || /\\bvalues[_\\s-]?colors\\b/i.test(message)\n || /\\bvalores[_\\s-]?e[_\\s-]?cores\\b/i.test(message)\n || /\\bbadge\\.values\\b/i.test(message);\n }\n\n private needsBadgeValueClarification(suggestion: AiSuggestion): boolean {\n const missing = this.normalizeMissingContext(suggestion.missingContext);\n if (!missing.length) return false;\n const requiresValuesAndColors = missing.includes('values_and_colors');\n const requiresValuesOnly = missing.includes('badge.values');\n if (!requiresValuesAndColors && !requiresValuesOnly) return false;\n const badgeHints = this.resolveBadgeContextHints(\n this.toClarificationContextHints(suggestion.contextHints) ?? null,\n );\n if (requiresValuesAndColors) {\n return !this.hasBadgeField(badgeHints) || !this.hasBadgeValues(badgeHints) || !this.hasBadgeColors(badgeHints);\n }\n return !this.hasBadgeField(badgeHints) || !this.hasBadgeValues(badgeHints);\n }\n\n private normalizeMissingContext(missingContext?: string[]): string[] {\n return (missingContext || [])\n .map((value) => (value != null ? String(value).trim().toLowerCase() : ''))\n .filter((value) => value.length > 0);\n }\n\n private resolveBadgeContextHints(\n contextHints: AiJsonObject | null | undefined,\n ): AiJsonObject | null {\n if (!contextHints || typeof contextHints !== 'object') return null;\n const badge = this.asRecord(contextHints['badge']);\n if (badge) return this.toAiJsonObject(badge);\n const candidate = contextHints;\n const hasBadgeKeys = ['field', 'values', 'valueColorMap', 'palette', 'inferredType', 'explicitType']\n .some((key) => Object.prototype.hasOwnProperty.call(candidate, key));\n return hasBadgeKeys ? candidate : null;\n }\n\n private hasBadgeValues(badgeHints: AiJsonObject | null): boolean {\n if (!badgeHints) return false;\n const values = badgeHints['values'];\n if (Array.isArray(values) && values.length > 0) return true;\n const valueColorMap = this.asRecord(badgeHints['valueColorMap']);\n return !!valueColorMap && Object.keys(valueColorMap).length > 0;\n }\n\n private hasBadgeColors(badgeHints: AiJsonObject | null): boolean {\n if (!badgeHints) return false;\n const valueColorMap = this.asRecord(badgeHints['valueColorMap']);\n if (valueColorMap && Object.keys(valueColorMap).length > 0) return true;\n const palette = badgeHints['palette'];\n return Array.isArray(palette) && palette.length > 0;\n }\n\n private hasBadgeField(badgeHints: AiJsonObject | null): boolean {\n if (!badgeHints) return false;\n const field = badgeHints['field'];\n return typeof field === 'string' && field.trim().length > 0;\n }\n\n private mergeContextHints(\n base?: unknown | null,\n override?: unknown | null,\n ): ClarificationContextHints | null {\n const baseHints = this.toAiJsonObject(base);\n const overrideHints = this.toAiJsonObject(override);\n if (!Object.keys(baseHints).length && !Object.keys(overrideHints).length) return null;\n const merged: AiJsonObject = { ...baseHints, ...overrideHints };\n const baseBadge = this.asRecord(baseHints['badge']);\n const overrideBadge = this.asRecord(overrideHints['badge']);\n if (baseBadge || overrideBadge) {\n merged['badge'] = this.toAiJsonObject({ ...(baseBadge || {}), ...(overrideBadge || {}) });\n }\n const baseComputed = this.asRecord(baseHints['computed']);\n const overrideComputed = this.asRecord(overrideHints['computed']);\n if (baseComputed || overrideComputed) {\n merged['computed'] = this.toAiJsonObject({ ...(baseComputed || {}), ...(overrideComputed || {}) });\n }\n return this.toClarificationContextHints(merged) ?? null;\n }\n\n private setResourcePathHint(resourcePath: string): void {\n const raw = (resourcePath || '').trim();\n const normalized = this.normalizeResourcePath(raw);\n if (!normalized) return;\n this.activeResourcePath = normalized;\n this.activeContextHints = this.mergeContextHints(this.activeContextHints, {\n resourcePath: normalized,\n resourcePathRaw: raw,\n });\n }\n\n private clearResourcePathHint(): void {\n this.activeResourcePath = null;\n if (!this.activeContextHints) return;\n const { resourcePath, resourcePathRaw, ...rest } = this.activeContextHints;\n const remaining = this.toClarificationContextHints(rest);\n this.activeContextHints = remaining ?? null;\n }\n\n private matchClarificationOptionPath(answer: string): string | null {\n if (!answer || !this.clarificationOptions.length) return null;\n const normalized = answer.trim().toLowerCase();\n if (!normalized) return null;\n const match = this.clarificationOptions.find((opt) =>\n String(opt?.label || '').trim().toLowerCase() === normalized,\n );\n if (!match) return null;\n if (this.extractResourcePath(match.value)) return match.value;\n return null;\n }\n\n private normalizeResourcePath(value: string): string | null {\n let raw = (value || '').trim();\n if (!raw) return null;\n if (raw.includes('://')) {\n try {\n const url = new URL(raw);\n raw = url.pathname || '';\n } catch {\n return null;\n }\n }\n raw = raw.replace(/[)\\].,;:!?]+$/g, '');\n raw = raw.replace(/^\\/+/, '').trim();\n return raw ? `/${raw}` : null;\n }\n\n private extractResourcePath(text: string): string | null {\n if (!text) return null;\n const direct = text.match(/(\\/api\\/[A-Za-z0-9._~\\-\\/]+)/);\n if (direct?.[1]) return direct[1].replace(/[)\\].,;:!?]+$/g, '');\n const loose = text.match(/\\bapi\\/[A-Za-z0-9._~\\-\\/]+/);\n if (loose?.[0]) return `/${loose[0].replace(/[)\\].,;:!?]+$/g, '')}`;\n return null;\n }\n\n private asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n }\n\n private toAiJsonObject(value: unknown, seen = new WeakSet<object>()): AiJsonObject {\n const record = this.asRecord(value);\n if (!record) return {};\n if (seen.has(record)) return {};\n seen.add(record);\n const normalized: AiJsonObject = {};\n for (const [key, entry] of Object.entries(record)) {\n if (entry === undefined) continue;\n normalized[key] = this.toAiJsonValue(entry, seen);\n }\n return normalized;\n }\n\n private toAiJsonValue(value: unknown, seen: WeakSet<object>): AiJsonValue {\n if (value == null) return null;\n if (typeof value === 'string' || typeof value === 'boolean') return value;\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'bigint') return String(value);\n if (Array.isArray(value)) return value.map((entry) => this.toAiJsonValue(entry, seen));\n const record = this.asRecord(value);\n if (record) return this.toAiJsonObject(record, seen);\n return String(value);\n }\n\n private toClarificationContextHints(value: unknown): ClarificationContextHints | undefined {\n const normalized = this.toAiJsonObject(value);\n if (!Object.keys(normalized).length) return undefined;\n return normalized as ClarificationContextHints;\n }\n\n private firstNonBlank(...values: Array<string | null | undefined>): string {\n for (const value of values) {\n if (typeof value !== 'string') continue;\n const normalized = value.trim();\n if (normalized) return normalized;\n }\n return '';\n }\n\n private buildRuleClarificationPayloads(\n configRoot: JsonMap,\n prompt: string,\n ): ClarificationRichOption[] {\n if (!this.adapter?.getDataProfile) return [];\n const columns = this.extractColumnNames(configRoot);\n const targetField = this.findColumnInPrompt(prompt, columns);\n if (!targetField) return [];\n const profile = this.adapter.getDataProfile();\n const stats = profile?.columns?.[targetField] as\n | { topValues?: unknown[]; cardinality?: number }\n | undefined;\n const rawValues = Array.isArray(stats?.topValues) ? stats.topValues : [];\n const normalized = rawValues\n .map((v) => (v != null ? String(v).trim() : ''))\n .filter((v) => v.length > 0);\n const unique = Array.from(new Set(normalized));\n if (!unique.length) return [];\n const maxValues = 4;\n const values = unique.slice(0, maxValues);\n const suffix = typeof stats?.cardinality === 'number' && stats.cardinality > values.length ? ', ...' : '';\n const list = `${values.join(', ')}${suffix}`;\n return [\n {\n label: `Usar valores detectados (${list})`,\n value: `Valores da coluna ${targetField}: ${list}. Crie regras de badge com cores distintas para cada valor.`,\n example: values.length ? `${targetField} == '${values[0]}' -> badge azul` : undefined,\n },\n ];\n }\n\n private buildValueColorClarificationPayloads(\n configRoot: JsonMap,\n prompt: string,\n ): ClarificationRichOption[] {\n const columns = this.extractColumnNames(configRoot);\n const targetField = this.findColumnInPrompt(prompt, columns);\n if (!targetField) return [];\n const context = this.resolveBadgeValuesContext(targetField);\n if (!context || !context.values.length) return [];\n const palette = ['primary', 'accent', 'warn', 'success', 'info'];\n const maxValues = 5;\n const values = context.values.slice(0, maxValues);\n const valueColorMap = this.buildValueColorMap(values, palette);\n const pairs = values.map((value) => `${value}=${valueColorMap[value]}`);\n const suffix = typeof context.cardinality === 'number' && context.cardinality > values.length ? ', ...' : '';\n const list = `${pairs.join(', ')}${suffix}`;\n const badgeHints: AiJsonObject = {\n field: targetField,\n values,\n valueColorMap,\n palette,\n };\n if (context.inferredType) {\n badgeHints['inferredType'] = context.inferredType;\n }\n if (context.explicitType) {\n badgeHints['explicitType'] = context.explicitType;\n }\n return [\n {\n label: `Usar valores detectados (${list})`,\n value: `Valores da coluna ${targetField}: ${list}. Use essas cores nos badges.`,\n example: values.length ? `${targetField} == '${values[0]}' -> badge ${palette[0]}` : undefined,\n contextHints: this.toClarificationContextHints({ badge: badgeHints }),\n },\n ];\n }\n\n private resolveBadgeValuesContext(\n targetField: string,\n ): { values: string[]; inferredType?: string; explicitType?: string; cardinality?: number } | null {\n let values: string[] = [];\n let inferredType: string | undefined;\n let explicitType: string | undefined;\n let cardinality: number | undefined;\n\n if (this.adapter?.getDataProfile) {\n const profile = this.adapter.getDataProfile();\n const stats = profile?.columns?.[targetField] as\n | { topValues?: unknown[]; cardinality?: number; inferredType?: string }\n | undefined;\n values = this.normalizeStringList(Array.isArray(stats?.topValues) ? stats.topValues : []);\n if (typeof stats?.inferredType === 'string') {\n inferredType = stats.inferredType;\n }\n if (typeof stats?.cardinality === 'number') {\n cardinality = stats.cardinality;\n }\n }\n\n if (!values.length) {\n const schemaField = this.resolveSchemaField(targetField);\n explicitType = typeof schemaField?.type === 'string' ? schemaField.type : undefined;\n values = this.extractSchemaValues(schemaField);\n if (values.length) {\n cardinality = values.length;\n }\n }\n\n if (!values.length) return null;\n return { values, inferredType, explicitType, cardinality };\n }\n\n private resolveSchemaField(targetField: string): JsonMap | null {\n if (!this.adapter?.getSchemaFields) return null;\n const schemaFields = this.adapter.getSchemaFields() || [];\n return schemaFields.find((field) => String(field?.name) === targetField) || null;\n }\n\n private extractSchemaValues(schemaField: JsonMap | null | undefined): string[] {\n if (!schemaField || typeof schemaField !== 'object') return [];\n const enumValues = this.normalizeStringList(\n Array.isArray(schemaField['enumValues']) ? schemaField['enumValues'] : [],\n );\n if (enumValues.length) return enumValues;\n const options = Array.isArray(schemaField['options']) ? schemaField['options'] : [];\n if (!options.length) return [];\n const optionValueKey = this.normalizeOptionKey(schemaField['optionValueKey']);\n const optionLabelKey = this.normalizeOptionKey(schemaField['optionLabelKey']);\n const values = options\n .map((option) => this.extractOptionValueFromSchema(option, optionValueKey, optionLabelKey))\n .filter((value): value is string => !!value);\n return this.normalizeStringList(values);\n }\n\n private extractOptionValueFromSchema(\n option: unknown,\n optionValueKey: string | null,\n optionLabelKey: string | null,\n ): string | null {\n if (option == null) return null;\n if (typeof option === 'string' || typeof option === 'number' || typeof option === 'boolean') {\n const text = String(option).trim();\n return text.length ? text : null;\n }\n if (typeof option === 'object') {\n const candidate = option as Record<string, unknown>;\n const rawValue = optionValueKey ? candidate[optionValueKey] : candidate['key'];\n const rawLabel = optionLabelKey ? candidate[optionLabelKey] : candidate['value'];\n const fallback = rawValue ?? rawLabel ?? candidate['value'] ?? candidate['key'];\n if (fallback == null) return null;\n const text = String(fallback).trim();\n return text.length ? text : null;\n }\n return null;\n }\n\n private normalizeOptionKey(value: unknown): string | null {\n const text = value != null ? String(value).trim() : '';\n return text.length ? text : null;\n }\n\n private normalizeStringList(values: unknown[]): string[] {\n const unique = new Set<string>();\n const output: string[] = [];\n for (const value of values) {\n const text = value != null ? String(value).trim() : '';\n if (!text || unique.has(text)) continue;\n unique.add(text);\n output.push(text);\n }\n return output;\n }\n\n private buildValueColorMap(values: string[], palette: string[]): Record<string, string> {\n const colors = palette.length ? palette : ['primary', 'accent', 'warn', 'success', 'info'];\n return values.reduce<Record<string, string>>((acc, value, index) => {\n acc[value] = colors[index % colors.length];\n return acc;\n }, {});\n }\n\n private findColumnInPrompt(prompt: string, columns: string[]): string | null {\n const text = (prompt || '').toLowerCase();\n if (!text || !columns.length) return null;\n const matches = columns.filter((col) => text.includes(col.toLowerCase()));\n if (matches.length === 1) return matches[0];\n return null;\n }\n\n private extractOptionValue(option: string): string {\n const match = option.match(/\\(([^)]+)\\)/);\n if (match && match[1]) {\n const candidate = match[1].trim();\n if (candidate && /^[A-Za-z0-9|._-]+$/.test(candidate)) {\n return candidate;\n }\n }\n return option;\n }\n\n private buildMaskSelectionHints(optionText: string, basePrompt: string): ClarificationContextHints | null {\n const mask = this.extractMaskFromText(optionText);\n if (!mask) return null;\n const configRoot = this.resolveConfigRoot(this.adapter?.getCurrentConfig?.());\n const columns = this.extractColumnNames(configRoot);\n let targetField = basePrompt ? this.findColumnInPrompt(basePrompt, columns) : null;\n if (!targetField) {\n targetField = this.findColumnInPrompt(optionText, columns);\n }\n if (!targetField && columns.length) {\n const lowered = `${basePrompt} ${optionText}`.toLowerCase();\n if (lowered.includes('cpf') && columns.includes('cpf')) targetField = 'cpf';\n if (lowered.includes('cnpj') && columns.includes('cnpj')) targetField = 'cnpj';\n if (lowered.includes('cep') && columns.includes('cep')) targetField = 'cep';\n }\n const hints: AiJsonObject = {\n optionSelected: {\n selection: { value: mask, mode: 'mask' },\n },\n };\n if (targetField) {\n const optionSelected = this.asRecord(hints['optionSelected']);\n if (optionSelected) {\n optionSelected['targetField'] = targetField;\n }\n }\n return this.toClarificationContextHints(hints) ?? null;\n }\n\n private extractMaskFromText(text: string): string | null {\n const pattern = /(0{3}\\.0{3}\\.0{3}-0{2}|0{2}\\.0{3}\\.0{3}\\/0{4}-0{2}|0{5}-0{3}|\\(0{2}\\)\\s*0{4,5}-0{4}|0{8,14})/;\n const match = text.match(pattern);\n return match ? match[1] : null;\n }\n\n private resolveComponentId(): string | null {\n if (this.adapter.componentId) return this.adapter.componentId;\n const name = (this.adapter.componentName || '').toLowerCase();\n if (name.includes('table')) return 'praxis-table';\n if (name.includes('form')) return 'praxis-dynamic-form';\n return null;\n }\n\n private resolveComponentType(): string | null {\n if (this.adapter.componentType) return this.adapter.componentType;\n const componentId = this.resolveComponentId();\n if (componentId === 'praxis-table') return 'table';\n if (componentId === 'praxis-dynamic-form') return 'form';\n return null;\n }\n\n private buildSuggestionsRequest(\n componentId: string,\n componentType: string,\n configRoot: JsonMap,\n capabilities: unknown[],\n dataProfile: JsonMap | null,\n schemaFields: JsonMap[] | undefined,\n runtimeState: JsonMap | undefined,\n suggestionContext: JsonMap | undefined,\n forceRefresh: boolean,\n policy?: SuggestionPolicy,\n ): AiSuggestionsRequest {\n const resolvedSuggestionContext = suggestionContext ?? this.adapter.getSuggestionContext?.();\n const currentState = this.toAiJsonObject({\n config: configRoot,\n capabilities,\n ...(schemaFields && schemaFields.length > 0 ? { schemaFields } : {}),\n ...(runtimeState !== undefined ? { runtimeState } : {}),\n ...(policy ? { suggestionPolicy: policy } : {}),\n ...(resolvedSuggestionContext ? { suggestionContext: resolvedSuggestionContext } : {}),\n });\n return {\n componentId,\n componentType,\n currentState,\n dataProfile: dataProfile ? this.toAiJsonObject(dataProfile) : null,\n maxSuggestions: 5,\n forceRefresh,\n locale: this.resolveLocale(),\n };\n }\n\n private resolveLocale(): string | undefined {\n if (typeof navigator !== 'undefined' && navigator.language) {\n return navigator.language;\n }\n return undefined;\n }\n\n private resolveConfigRoot(value: unknown): JsonMap {\n const candidate = this.asRecord(value);\n if (!candidate) return {};\n const nestedConfig = this.asRecord(candidate['config']);\n if (nestedConfig) {\n return nestedConfig;\n }\n const inputs = this.asRecord(candidate['inputs']);\n const nestedFromInputs = this.asRecord(inputs?.['config']);\n if (nestedFromInputs) {\n return nestedFromInputs;\n }\n return candidate;\n }\n\n private async resolveMockMode(): Promise<boolean> {\n try {\n const config = (await firstValueFrom(this.aiApi.loadGlobalAiConfig())) as GlobalAiConfigExtended | null;\n this.effectiveRiskPolicy = this.resolveConfiguredRiskPolicy(config);\n if (!this.hasProviderOverride(config)) {\n return await this.resolveMockModeFromStatus();\n }\n const provider = (config?.provider || '').toLowerCase();\n if (provider === 'mock') return true;\n const hasKey = !!config?.apiKey || !!config?.hasApiKey || !!config?.apiKeyLast4;\n return !hasKey;\n } catch {\n this.effectiveRiskPolicy = this.resolveConfiguredRiskPolicy(null);\n return true;\n }\n }\n\n private resolveConfiguredRiskPolicy(config: GlobalAiConfigExtended | null | undefined): RiskPolicy {\n const fromInput = this.normalizeRiskPolicy(this.riskPolicy);\n if (fromInput) return fromInput;\n const fromConfig = this.normalizeRiskPolicy(config?.riskPolicy);\n return fromConfig || 'strict';\n }\n\n private getEffectiveRiskPolicy(): RiskPolicy {\n return this.normalizeRiskPolicy(this.riskPolicy) || this.effectiveRiskPolicy;\n }\n\n private normalizeRiskPolicy(value: unknown): RiskPolicy | null {\n if (typeof value !== 'string') return null;\n const normalized = value.trim().toLowerCase();\n if (normalized === 'strict' || normalized === 'standard') return normalized;\n return null;\n }\n\n private hasProviderOverride(config: GlobalAiConfigExtended | null | undefined): boolean {\n if (!config) return false;\n return !!(\n config.provider ||\n config.apiKey ||\n config.apiKeyLast4 ||\n config.hasApiKey\n );\n }\n\n private async resolveMockModeFromStatus(): Promise<boolean> {\n try {\n const status = await firstValueFrom(this.aiApi.getAiStatus());\n if (!status || status.success === false) return true;\n const provider = (status.provider || '').toLowerCase();\n if (!provider || provider === 'mock') return true;\n return !status.hasApiKey;\n } catch {\n return true;\n }\n }\n\n private async loadTemplateVariants(): Promise<void> {\n const componentId = this.resolveComponentId();\n const componentType = this.resolveComponentType();\n if (!componentId || !componentType) return;\n const cacheKey = `${componentId}:${componentType}`;\n if (this.templateVariantsCache.has(cacheKey)) return;\n\n try {\n const context = await firstValueFrom(this.aiApi.getAiContext(componentId, componentType));\n const variants = this.extractVariantIds(context);\n if (variants.size) {\n this.templateVariantsCache.set(cacheKey, variants);\n }\n } catch {\n // optional optimization; fallback to server-driven variant selection\n }\n }\n\n private extractVariantIds(context: AiContextDTO | null | undefined): Set<string> {\n const ids = new Set<string>();\n const variants = context?.template?.templateMeta?.variants;\n if (!variants || !Array.isArray(variants)) {\n return ids;\n }\n for (const variant of variants) {\n if (typeof variant === 'string') {\n ids.add(variant);\n continue;\n }\n if (variant && typeof variant === 'object' && variant.id) {\n ids.add(String(variant.id));\n }\n }\n return ids;\n }\n\n private resolveVariantIdForSuggestion(sug: AiSuggestion): string | null {\n const componentId = this.resolveComponentId();\n const componentType = this.resolveComponentType();\n if (!componentId || !componentType) return null;\n\n if (sug.variantId) {\n const normalized = String(sug.variantId).trim();\n if (!normalized) return null;\n const allowed = this.getTemplateVariants(componentId, componentType);\n if (allowed && allowed.size > 0 && !allowed.has(normalized)) {\n return null;\n }\n return normalized;\n }\n\n const candidate = this.mapSuggestionToVariantId(sug, componentId);\n if (!candidate) return null;\n\n const allowed = this.getTemplateVariants(componentId, componentType);\n if (allowed && allowed.size > 0 && !allowed.has(candidate)) {\n return null;\n }\n return candidate;\n }\n\n private mapSuggestionToVariantId(sug: AiSuggestion, componentId: string): string | null {\n const id = (sug.id || '').toLowerCase();\n if (!id) return null;\n\n if (componentId === 'praxis-table') {\n if (this.includesAny(id, ['behavior', 'pagination', 'sorting', 'filtering', 'selection'])) {\n return 'behavior';\n }\n if (this.includesAny(id, ['format', 'renderer'])) return 'columns';\n if (id.includes('toolbar')) return 'toolbar';\n if (id.includes('actions')) return 'actions';\n }\n\n if (componentId === 'praxis-dynamic-form') {\n if (this.includesAny(id, ['sections', 'layout'])) return 'layout';\n if (this.includesAny(id, ['labels', 'options'])) return 'fields';\n if (id.includes('actions')) return 'actions';\n }\n\n return null;\n }\n\n private getTemplateVariants(componentId: string, componentType: string): Set<string> | null {\n const cacheKey = `${componentId}:${componentType}`;\n return this.templateVariantsCache.get(cacheKey) || null;\n }\n\n private includesAny(value: string, keys: string[]): boolean {\n for (const key of keys) {\n if (value.includes(key)) return true;\n }\n return false;\n }\n\n private buildSuggestionsCacheKey(\n componentId: string,\n componentType: string,\n configRoot: JsonMap,\n dataProfile: JsonMap | null,\n schemaFields: JsonMap[] | undefined,\n capabilities: unknown[],\n runtimeState: JsonMap | undefined,\n suggestionContext: JsonMap | undefined,\n locale: string | undefined,\n ): string {\n const payload = {\n componentId,\n componentType,\n config: configRoot,\n dataProfile: dataProfile || null,\n schemaFields: schemaFields && schemaFields.length > 0 ? schemaFields : null,\n capabilities,\n runtimeState: runtimeState || null,\n suggestionContext: suggestionContext || null,\n locale: locale || null,\n };\n const serialized = this.stableStringify(payload);\n return `${componentId}:${componentType}:${this.hashString(serialized)}`;\n }\n\n private stableStringify(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map((item) => this.stableStringify(item)).join(',')}]`;\n }\n const objectValue = this.asRecord(value);\n if (objectValue) {\n const keys = Object.keys(objectValue).sort();\n const entries = keys.map((key) => `${JSON.stringify(key)}:${this.stableStringify(objectValue[key])}`);\n return `{${entries.join(',')}}`;\n }\n const serialized = JSON.stringify(value);\n return serialized === undefined ? 'null' : serialized;\n }\n\n private hashString(value: string): string {\n let hash = 5381;\n for (let i = 0; i < value.length; i += 1) {\n hash = (hash * 33) ^ value.charCodeAt(i);\n }\n return (hash >>> 0).toString(36);\n }\n\n private isTable(componentId: string, componentType: string): boolean {\n return componentId === 'praxis-table' || componentType === 'table';\n }\n\n private isForm(componentId: string, componentType: string): boolean {\n return componentId === 'praxis-dynamic-form' || componentType === 'form';\n }\n\n private extractColumnNames(configRoot: JsonMap): string[] {\n const columns = Array.isArray(configRoot?.columns) ? configRoot.columns : [];\n return columns\n .map((col: unknown) => this.asRecord(col)?.['field'])\n .filter((field: unknown) => field != null && String(field).trim().length > 0)\n .map((field: unknown) => String(field));\n }\n\n private extractFieldNames(configRoot: JsonMap): string[] {\n const fields = Array.isArray(configRoot?.fieldMetadata) ? configRoot.fieldMetadata : [];\n return fields\n .map((field: unknown) => this.asRecord(field)?.['name'])\n .filter((name: unknown) => name != null && String(name).trim().length > 0)\n .map((name: unknown) => String(name));\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.close();\n } else if (this.shouldSubmitFromKeydown(event)) {\n event.preventDefault();\n this.submitPrompt();\n }\n }\n\n private shouldSubmitFromKeydown(event: KeyboardEvent): boolean {\n if (event.key !== 'Enter') return false;\n if (event.defaultPrevented || event.isComposing || event.repeat) return false;\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return false;\n if (this.state !== 'listening') return false;\n if (!this.userPrompt.trim()) return false;\n return !!this.inputElement?.nativeElement && event.target === this.inputElement.nativeElement;\n }\n\n private restoreFocusToTrigger(): void {\n if (typeof window === 'undefined') return;\n setTimeout(() => this.triggerButton?.nativeElement?.focus(), 0);\n }\n\n private normalizeError(err: unknown): string {\n const record = this.asRecord(err);\n const nestedError = this.asRecord(record?.['error']);\n const apiMsg = nestedError?.['message'] || record?.['message'];\n if (apiMsg) {\n return String(apiMsg);\n }\n return 'Erro ao comunicar com a IA. Tente novamente.';\n }\n}\n\ntype GlobalAiConfigExtended = GlobalAiConfig & {\n provider?: string;\n riskPolicy?: RiskPolicy;\n hasApiKey?: boolean;\n apiKeyLast4?: string;\n};\n","<!-- Trigger Button -->\n<button \n mat-icon-button \n cdkOverlayOrigin \n #trigger=\"cdkOverlayOrigin\"\n #triggerBtn\n (click)=\"open()\"\n [disabled]=\"isOpen\"\n class=\"ai-trigger-btn\"\n matTooltip=\"Assistente de Configuração\"\n aria-label=\"Abrir Assistente IA\">\n <mat-icon>auto_awesome</mat-icon>\n</button>\n\n<!-- Overlay Template -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"ai-assistant-backdrop\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\">\n\n <div\n class=\"ai-assistant-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Assistente de Configuração\"\n [attr.aria-busy]=\"isBusyState() ? 'true' : null\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (keydown)=\"onKeydown($event)\"\n >\n \n <!-- HEADER -->\n <div class=\"assistant-header\">\n <div class=\"assistant-header__left\">\n <mat-icon class=\"magic-icon\">auto_awesome</mat-icon>\n <div class=\"assistant-title-group\">\n <div class=\"assistant-title\">Assistente de Configuração</div>\n <div class=\"assistant-subtitle\">Copiloto contextual para ajustes guiados</div>\n <div class=\"assistant-header-chips\">\n <span\n class=\"mode-chip\"\n [class.mock]=\"mockMode\"\n [matTooltip]=\"mockMode ? 'Sem chave de API: respostas de demonstração' : 'Conectado ao assistente configurado'\"\n >\n {{ mockMode ? 'Mock' : 'Conectado' }}\n </span>\n <span\n class=\"policy-chip\"\n [class.strict]=\"isStrictRiskPolicy()\"\n [matTooltip]=\"getRiskPolicyTooltip()\"\n >\n {{ getRiskPolicyLabel() }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"assistant-header__right\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"assistant-close-btn\"\n (click)=\"close()\"\n aria-label=\"Fechar assistente\"\n matTooltip=\"Fechar assistente\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n <div\n class=\"assistant-status\"\n [class.processing]=\"isBusyState()\"\n [class.pending]=\"state === 'clarification'\"\n [class.warning]=\"state === 'error'\"\n [class.success]=\"state === 'review' || state === 'success'\"\n [class.compact]=\"!shouldShowSystemStatusDetail()\"\n role=\"status\"\n [attr.aria-live]=\"getSystemStatusAriaLive()\"\n aria-atomic=\"true\"\n >\n <span class=\"assistant-status-dot\" aria-hidden=\"true\"></span>\n <div class=\"assistant-status-content\">\n <div class=\"assistant-status-label\">\n <span class=\"assistant-status-label-prefix\">Status:</span>\n <span>{{ getSystemStatusLabel() }}</span>\n <span *ngIf=\"shouldShowSnapshotFallbackBadge()\" class=\"assistant-status-mode\">Snapshot</span>\n </div>\n <div *ngIf=\"shouldShowSystemStatusDetail()\" class=\"assistant-status-detail\">{{ getSystemStatusDetail() }}</div>\n </div>\n </div>\n <div class=\"assistant-flow\" *ngIf=\"shouldShowTaskFlow()\" role=\"list\" aria-label=\"Fluxo da proposta\">\n <div\n class=\"flow-step\"\n role=\"listitem\"\n *ngFor=\"let step of flowSteps\"\n [class.active]=\"getFlowStepState(step.step) === 'active'\"\n [class.done]=\"getFlowStepState(step.step) === 'done'\"\n >\n <span class=\"flow-step-index\">{{ step.step }}</span>\n <span class=\"flow-step-content\">\n <span class=\"flow-step-label\">{{ step.label }}</span>\n <span class=\"flow-step-detail\">{{ getFlowStepDetail(step.step) }}</span>\n </span>\n </div>\n </div>\n <div class=\"assistant-nav\">\n <div\n class=\"assistant-tabs\"\n role=\"tablist\"\n aria-label=\"Seções do assistente\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n <button\n class=\"assistant-tab\"\n type=\"button\"\n *ngIf=\"isTaskMode()\"\n id=\"assistant-tab-task\"\n role=\"tab\"\n aria-label=\"Proposta atual\"\n [attr.aria-selected]=\"isActiveTab('task')\"\n aria-controls=\"assistant-panel-task\"\n [attr.tabindex]=\"isActiveTab('task') ? 0 : -1\"\n [class.active]=\"isActiveTab('task')\"\n (click)=\"setActiveTab('task')\"\n >\n Proposta\n <span *ngIf=\"hasPendingClarification() && !isActiveTab('task')\" class=\"assistant-tab-badge\">1</span>\n </button>\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-chat\"\n role=\"tab\"\n aria-label=\"Histórico\"\n [attr.aria-selected]=\"isActiveTab('chat')\"\n aria-controls=\"assistant-panel-chat\"\n [attr.tabindex]=\"isActiveTab('chat') ? 0 : -1\"\n [class.active]=\"isActiveTab('chat')\"\n (click)=\"setActiveTab('chat')\"\n >\n Histórico\n </button>\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-suggestions\"\n role=\"tab\"\n aria-label=\"Sugestões de melhoria\"\n [attr.aria-selected]=\"isActiveTab('suggestions')\"\n aria-controls=\"assistant-panel-suggestions\"\n [attr.tabindex]=\"isActiveTab('suggestions') ? 0 : -1\"\n [class.active]=\"isActiveTab('suggestions')\"\n (click)=\"setActiveTab('suggestions')\"\n >\n Sugestões\n </button>\n </div>\n </div>\n\n <!-- BODY: Dynamic Content based on State -->\n <div class=\"assistant-body\">\n <div class=\"assistant-thought assistant-section\" *ngIf=\"shouldShowThoughtCard()\">\n <div class=\"assistant-thought-meta\">\n <mat-icon>psychology</mat-icon>\n <span>{{ getThoughtTimingLabel() }}</span>\n </div>\n <div class=\"assistant-thought-summary\">{{ getThoughtSummary() }}</div>\n <div class=\"assistant-thought-plan\">\n <div class=\"assistant-thought-plan-title\">{{ getThoughtPlanTitle() }}</div>\n <div class=\"assistant-thought-plan-actions\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"thought-action-details\"\n (click)=\"openThoughtDetails()\"\n [attr.aria-label]=\"getThoughtDetailsLabel()\"\n [matTooltip]=\"getThoughtDetailsTooltip()\"\n >\n {{ getThoughtDetailsLabel() }}\n </button>\n <button\n *ngIf=\"shouldShowThoughtPreviewAction()\"\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"thought-action-preview\"\n (click)=\"openThoughtPreview()\"\n [matTooltip]=\"getThoughtPreviewTooltip()\"\n >\n Prévia\n </button>\n </div>\n <div class=\"assistant-thought-plan-hint\">{{ getThoughtActionHint() }}</div>\n <ng-container *ngIf=\"getThoughtChecklist() as thoughtChecklist\">\n <div class=\"assistant-thought-checklist\" *ngIf=\"thoughtChecklist.length\">\n <div *ngFor=\"let item of thoughtChecklist\" class=\"assistant-thought-checklist-item\">\n <mat-icon>radio_button_unchecked</mat-icon>\n <span>{{ item }}</span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <div *ngIf=\"processingInfoVisible\" class=\"processing-banner\">\n <mat-spinner diameter=\"16\"></mat-spinner>\n <span>{{ aiExplanation || 'Analisando solicitação e preparando proposta...' }}</span>\n <button mat-button type=\"button\" class=\"processing-retry\" (click)=\"retryProcessing()\">Tentar novamente</button>\n </div>\n <div\n class=\"assistant-history assistant-section\"\n *ngIf=\"historyContext && isActiveTab('chat')\"\n id=\"assistant-panel-chat\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-chat\"\n >\n <div class=\"section-header\">\n <div class=\"section-heading\">\n <div class=\"section-title\">Histórico</div>\n <div class=\"section-subtitle\">Sessões recentes, pedidos reaproveitáveis e desfazer rápido.</div>\n </div>\n <div class=\"history-actions\" role=\"group\" aria-label=\"Ações do histórico\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"historyExpanded = !historyExpanded\"\n [matTooltip]=\"historyExpanded ? 'Recolher histórico' : 'Expandir histórico'\"\n [attr.aria-label]=\"historyExpanded ? 'Recolher histórico' : 'Expandir histórico'\"\n [disabled]=\"!historyWarnings.length && !historySessions.length && !activeHistoryMessages.length\"\n >\n <mat-icon>{{ historyExpanded ? 'expand_less' : 'expand_more' }}</mat-icon>\n <span>{{ historyExpanded ? 'Recolher' : 'Expandir' }}</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"startNewSession()\"\n matTooltip=\"Nova conversa\"\n aria-label=\"Nova conversa\"\n [disabled]=\"isBusyState()\"\n >\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"clearHistory()\"\n matTooltip=\"Limpar histórico local\"\n aria-label=\"Limpar histórico local\"\n class=\"history-action-btn history-action-btn--danger\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar</span>\n </button>\n </div>\n </div>\n <div *ngIf=\"historyUndoDeleteSession\" class=\"history-undo\">\n <span>Sessão removida.</span>\n <button mat-button type=\"button\" (click)=\"undoRemoveHistorySession()\">\n Desfazer\n </button>\n </div>\n\n <div *ngIf=\"historyExpanded && historyWarnings.length\" class=\"history-warnings\">\n <mat-icon>info</mat-icon>\n <div class=\"history-warnings-list\">\n <div *ngFor=\"let warning of historyWarnings\">{{ warning }}</div>\n <div class=\"history-warnings-hint\">\n Configure headers via API_CONFIG_STORAGE_OPTIONS no host.\n </div>\n </div>\n </div>\n\n <div *ngIf=\"historyExpanded && historySessions.length\" class=\"history-sessions\">\n <div\n class=\"history-session\"\n *ngFor=\"let session of historySessions\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"selectHistorySession(session.id)\"\n (keydown)=\"onHistorySessionCardKeydown($event, session.id)\"\n [class.active]=\"session.id === activeHistorySession?.id\"\n [matTooltip]=\"getHistorySessionTooltip(session)\"\n [matTooltipDisabled]=\"!session.componentType && !session.componentId\"\n >\n <div class=\"history-session-main\">\n <span class=\"history-session-title\">{{ session.title }}</span>\n <div class=\"history-session-main-right\">\n <span class=\"history-session-time\">{{ session.updatedAt | date:'short' }}</span>\n <div class=\"history-session-tools\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool\"\n (click)=\"reuseHistorySessionPrompt(session.id, $event)\"\n matTooltip=\"Reusar último pedido\"\n aria-label=\"Reusar último pedido\"\n >\n <mat-icon>edit_note</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool history-session-tool--danger\"\n (click)=\"removeHistorySession(session.id, $event)\"\n matTooltip=\"Excluir sessão\"\n aria-label=\"Excluir sessão\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <div class=\"history-session-meta\">\n <span *ngIf=\"session.componentType\" class=\"history-chip\">{{ session.componentType }}</span>\n <span *ngIf=\"session.componentId\" class=\"history-chip\">{{ session.componentId }}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"historyExpanded && !historySessions.length\" class=\"history-empty\">\n Nenhuma sessão salva ainda.\n </div>\n\n <div *ngIf=\"historyExpanded && activeHistoryMessages.length\" class=\"history-messages\">\n <div\n *ngIf=\"activeHistoryTotalMessages > activeHistoryMessages.length\"\n class=\"history-messages-hint\"\n >\n Mostrando últimas {{ activeHistoryMessages.length }} de {{ activeHistoryTotalMessages }} mensagens.\n </div>\n <div\n *ngFor=\"let msg of activeHistoryMessages\"\n class=\"history-message\"\n [class.user]=\"msg.role === 'user'\"\n [class.assistant]=\"msg.role === 'assistant'\"\n >\n <div class=\"history-message-header\">\n <span class=\"history-message-role\">{{ msg.role === 'user' ? 'Você' : 'Assistente' }}</span>\n <span class=\"history-message-time\">{{ msg.createdAt | date:'shortTime' }}</span>\n <span\n *ngIf=\"msg.context?.usedRag\"\n class=\"history-rag\"\n matTooltip=\"Resposta baseada em contexto recuperado (RAG)\"\n >RAG</span>\n </div>\n <div class=\"history-message-text\">{{ msg.text }}</div>\n </div>\n </div>\n <div *ngIf=\"historyExpanded && historySessions.length && !activeHistoryMessages.length\" class=\"history-empty history-empty--panel\">\n Selecione uma sessão para visualizar as mensagens.\n </div>\n <div class=\"history-helper\" *ngIf=\"historyExpanded\">\n O histórico é local ao usuário e ao componente atual.\n </div>\n </div>\n\n <div\n class=\"loading-suggestions assistant-section\"\n *ngIf=\"loadingSuggestions && isActiveTab('suggestions')\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <mat-spinner diameter=\"20\"></mat-spinner>\n <span>Carregando sugestões de melhoria...</span>\n </div>\n \n <!-- STATE: LISTENING (Suggestions) -->\n <div\n *ngIf=\"state === 'listening' && isActiveTab('suggestions')\"\n class=\"suggestions-area assistant-section\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <div class=\"section-header\">\n <div class=\"section-title\">Sugestões de melhoria</div>\n <div class=\"suggestions-actions\">\n <button mat-icon-button type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\" matTooltip=\"Atualizar sugestões\">\n <mat-icon>refresh</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"suggestions-hero\" *ngIf=\"!loadingSuggestions\">\n <div class=\"suggestions-hero__label\">Contexto ativo</div>\n <div class=\"suggestions-hero__title\">{{ adapter.componentName || 'Componente atual' }}</div>\n <div class=\"suggestions-hero__detail\">{{ getSystemStatusDetail() }}</div>\n </div>\n <div *ngIf=\"suggestionsWarnings.length\" class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n <div *ngFor=\"let warning of suggestionsWarnings\">{{ warning }}</div>\n </div>\n </div>\n </div>\n <div class=\"suggestions-content\" *ngIf=\"!loadingSuggestions && (richSuggestions.length || hasDismissedSuggestions())\">\n <div class=\"suggestions-filter\" *ngIf=\"hasDismissedSuggestions()\">\n <span>{{ getDismissedSuggestionCount() }} oculta(s)</span>\n <button mat-button type=\"button\" (click)=\"restoreDismissedSuggestions()\">\n Restaurar\n </button>\n </div>\n <div class=\"suggestions-list\" *ngIf=\"getVisibleSuggestions().length; else allSuggestionsHidden\">\n <div\n class=\"suggestion-item\"\n *ngFor=\"let sug of getVisibleSuggestions()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Selecionar sugestão: ' + sug.label\"\n (click)=\"selectSuggestion(sug)\"\n (keydown)=\"onSuggestionCardKeydown($event, sug)\"\n >\n <div class=\"suggestion-copy\">\n <div class=\"suggestion-main\">\n <mat-icon *ngIf=\"sug.icon\" class=\"suggestion-icon\">{{ sug.icon }}</mat-icon>\n <span class=\"suggestion-label\">{{ sug.label }}</span>\n <span *ngIf=\"sug.group\" class=\"suggestion-group\">{{ sug.group }}</span>\n </div>\n <div *ngIf=\"sug.description\" class=\"suggestion-desc\">{{ sug.description }}</div>\n </div>\n <div class=\"suggestion-actions\">\n <span class=\"suggestion-arrow\" aria-hidden=\"true\">\n <mat-icon>chevron_right</mat-icon>\n </span>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn\"\n (click)=\"prepareSuggestionPrompt(sug, $event)\"\n matTooltip=\"Refinar pedido\"\n aria-label=\"Refinar pedido\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn suggestion-action-btn--danger\"\n (click)=\"dismissSuggestion(sug, $event)\"\n matTooltip=\"Ocultar sugestão\"\n aria-label=\"Ocultar sugestão\"\n >\n <mat-icon>visibility_off</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <ng-template #allSuggestionsHidden>\n <div class=\"suggestions-empty suggestions-empty--inline\">\n Todas as sugestões foram ocultadas.\n </div>\n </ng-template>\n </div>\n <div class=\"suggestions-empty\" *ngIf=\"!loadingSuggestions && !richSuggestions.length\">\n Nenhuma sugestão disponível no momento.\n </div>\n <div class=\"suggestions-helper\" *ngIf=\"!loadingSuggestions && !richSuggestions.length\">\n Selecione uma sugestão acima ou descreva uma alteração no campo inferior.\n </div>\n </div>\n\n <!-- STATE: CLARIFICATION (Two-Step Flow) -->\n <div\n *ngIf=\"state === 'clarification' && isActiveTab('task')\"\n class=\"clarification-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n <div class=\"task-header\" *ngIf=\"!shouldShowThoughtCard()\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n <div *ngIf=\"clarificationOptions.length > 1 && getTaskSelectionSummary() as selectionSummary\" class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n <div *ngIf=\"shouldShowTaskSteps()\" class=\"task-steps\">\n <span class=\"task-step active\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step\">3 Revisão</span>\n </div>\n </div>\n <div *ngIf=\"clarificationResponseType === 'context'\" class=\"context-only\">\n <mat-spinner diameter=\"24\"></mat-spinner>\n <div class=\"context-only-hint\">Buscando contexto adicional...</div>\n </div>\n <ng-template #clarificationOptionContent let-opt let-index=\"index\" let-compact=\"compact\">\n <div class=\"clarification-decision-head\" *ngIf=\"!compact\">\n <span class=\"clarification-decision-index\">{{ index + 1 }}</span>\n <span class=\"clarification-decision-type\">{{ getClarificationOptionKindLabel(opt) }}</span>\n <span class=\"spacer\"></span>\n <span class=\"clarification-decision-state\" *ngIf=\"isClarificationSelected(opt)\">Selecionado</span>\n </div>\n <ng-container [ngSwitch]=\"getClarificationOptionLayout(opt)\">\n <div *ngSwitchCase=\"'endpoint'\" class=\"clarification-card\">\n <div class=\"clarification-card-header\">\n <mat-icon class=\"endpoint-icon\">{{ getEndpointIcon(opt) }}</mat-icon>\n <ng-container *ngIf=\"getEndpointMethod(opt) as method\">\n <span class=\"endpoint-method\" [attr.data-method]=\"method\">{{ method }}</span>\n </ng-container>\n <span class=\"endpoint-label\">{{ opt.label }}</span>\n <span class=\"spacer\"></span>\n <mat-icon class=\"select-indicator\">\n {{ isClarificationSelected(opt) ? 'check_circle' : 'radio_button_unchecked' }}\n </mat-icon>\n </div>\n <div class=\"clarification-card-body\">\n <ng-container *ngIf=\"getEndpointPath(opt) as path\">\n <div class=\"endpoint-path\">{{ path }}</div>\n </ng-container>\n <div\n *ngIf=\"opt.contextHints?.description\"\n class=\"endpoint-description\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </div>\n </div>\n </div>\n <div *ngSwitchCase=\"'color'\" class=\"clarification-color\">\n <span\n class=\"color-swatch\"\n [style.background]=\"getSafeHexColor(opt) || 'var(--md-sys-color-surface-container-highest)'\"\n ></span>\n <div class=\"color-meta\">\n <span class=\"color-label\">{{ opt.label }}</span>\n <span *ngIf=\"opt.contextHints?.hexColor\" class=\"color-value\">{{ opt.contextHints?.hexColor }}</span>\n </div>\n </div>\n <div *ngSwitchCase=\"'description'\" class=\"clarification-description\">\n <span class=\"clarification-label\">{{ opt.label }}</span>\n <span\n *ngIf=\"opt.contextHints?.description\"\n class=\"clarification-subtitle\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </span>\n </div>\n <span *ngSwitchDefault class=\"clarification-plain-label\">{{ opt.label }}</span>\n </ng-container>\n </ng-template>\n <div *ngIf=\"warnings.length\" class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n <div *ngFor=\"let warning of warnings\">{{ warning }}</div>\n </div>\n </div>\n </div>\n <div\n *ngIf=\"clarificationQuestions.length\"\n class=\"clarification-questions\"\n [class.attention-highlight]=\"highlightClarificationDetails && !clarificationOptions.length\"\n >\n <div *ngFor=\"let question of clarificationQuestions; let i = index\" class=\"clarification-question\">\n <div class=\"clarification-question-label\">{{ question }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationAnswers[i]\"\n [placeholder]=\"'Resposta ' + (i + 1)\"\n autocomplete=\"off\">\n </div>\n </div>\n <div\n *ngIf=\"clarificationOptions.length\"\n class=\"clarification-options-block\"\n [class.attention-highlight]=\"highlightClarificationDetails\"\n >\n <div class=\"clarification-options-title\">\n {{ clarificationOptions.length === 1 ? 'Decisão sugerida' : 'Decisões sugeridas' }}\n </div>\n <div *ngIf=\"clarificationOptions.length === 1\" class=\"clarification-options-hint\">\n Etapa 2 de 4: confirme a melhor opção para continuar.\n </div>\n <div *ngIf=\"clarificationOptions.length > 1\" class=\"clarification-options-hint\">\n Etapa 2 de 4: selecione a alternativa mais aderente para gerar a proposta.\n </div>\n <div\n *ngIf=\"clarificationResponseType === 'confirm'\"\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n <button\n mat-button\n type=\"button\"\n *ngFor=\"let opt of clarificationOptions; let i = index\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n </div>\n <div\n *ngIf=\"clarificationSelectionMode === 'multiple'\"\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n <button\n mat-button\n type=\"button\"\n *ngFor=\"let opt of clarificationOptions; let i = index\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n class=\"clarification-option\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n </div>\n <div\n *ngIf=\"clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation !== 'chips'\"\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n <button\n mat-button\n type=\"button\"\n *ngFor=\"let opt of clarificationOptions; let i = index\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n </div>\n <div\n *ngIf=\"clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation === 'chips'\"\n class=\"clarification-chips\"\n >\n <ng-container *ngFor=\"let opt of clarificationOptions; let i = index\">\n <button\n *ngIf=\"isEndpointOption(opt); else chipOption\"\n mat-button\n type=\"button\"\n class=\"clarification-option clarification-card-button\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n <ng-template #chipOption>\n <mat-chip\n (click)=\"onClarificationOptionClick(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt)\"\n class=\"clarification-chip\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: true }\"></ng-container>\n </mat-chip>\n </ng-template>\n </ng-container>\n </div>\n </div>\n <div\n *ngIf=\"clarificationAllowCustom && clarificationResponseType !== 'context'\"\n class=\"clarification-manual-toggle\"\n >\n <span class=\"clarification-manual-label\">Não encontrou o recurso?</span>\n <button mat-button type=\"button\" (click)=\"toggleManualInput()\">\n {{ showManualInput ? 'Ocultar resposta manual' : 'Responder manualmente' }}\n </button>\n </div>\n <div\n *ngIf=\"clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context'\"\n class=\"clarification-free\"\n >\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationFreeText\"\n placeholder=\"Digite sua resposta…\"\n autocomplete=\"off\"\n (keydown.enter)=\"confirmTaskAction()\"\n />\n </div>\n <div\n *ngIf=\"clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context'\"\n class=\"clarification-free-hint\"\n >\n Pressione Enter para enviar.\n </div>\n </div>\n\n <!-- STATE: REVIEW (Diff/Explanation) -->\n <div\n *ngIf=\"state === 'review' && isActiveTab('task')\"\n class=\"review-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n <div class=\"task-header\" *ngIf=\"!shouldShowThoughtCard()\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n <div *ngIf=\"clarificationOptions.length > 1 && getTaskSelectionSummary() as selectionSummary\" class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n <div *ngIf=\"shouldShowTaskSteps()\" class=\"task-steps\">\n <span class=\"task-step\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step active\">3 Revisão</span>\n </div>\n </div>\n <div *ngIf=\"warnings.length\" class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n <div *ngFor=\"let warning of warnings\">{{ warning }}</div>\n </div>\n </div>\n </div>\n <div class=\"review-trust\">\n <span class=\"trust-chip\" [matTooltip]=\"getScopeTooltip()\">{{ getScopeLabel() }}</span>\n <span class=\"trust-chip\" [matTooltip]=\"getConfidenceTooltip()\">{{ getConfidenceLabel() }}</span>\n <span class=\"trust-chip risk-chip\" [class.medium]=\"getReviewRiskLevel() === 'médio'\" [class.high]=\"getReviewRiskLevel() === 'alto'\">\n Risco {{ getReviewRiskLevel() }}\n </span>\n </div>\n <div class=\"review-summary\" [class.attention-highlight]=\"highlightReviewDetails\">\n <div class=\"review-summary-title\">Resumo da proposta</div>\n <div class=\"review-summary-line\">{{ getReviewSummary() }}</div>\n </div>\n <div class=\"review-diff\">\n <div class=\"review-diff-title\">Prévia de mudanças</div>\n <ng-container *ngIf=\"pendingDiff.length; else noDiffPreview\">\n <div class=\"review-diff-summary\">\n <div *ngFor=\"let line of getDiffSummaryLines()\" class=\"review-diff-line\">{{ line }}</div>\n <div *ngIf=\"pendingDiff.length > 3\" class=\"review-diff-more\">… +{{ pendingDiff.length - 3 }} mudanças</div>\n </div>\n <button mat-stroked-button type=\"button\" class=\"review-diff-toggle\" (click)=\"toggleFullDiff()\">\n {{ getDiffToggleLabel() }}\n </button>\n </ng-container>\n <ng-template #noDiffPreview>\n <div class=\"review-diff-empty\">\n Não foi possível gerar um diff estruturado. Revise o resumo e aplique com cautela.\n </div>\n </ng-template>\n <div *ngIf=\"showFullDiff && pendingDiff.length\" class=\"review-diff-full\">\n <div *ngFor=\"let diff of pendingDiff\" class=\"review-diff-block\">\n <div class=\"review-diff-path\">{{ diff.path }}</div>\n <div class=\"review-diff-label\">Antes:</div>\n <pre>{{ diff.before | json }}</pre>\n <div class=\"review-diff-label\">Depois:</div>\n <pre>{{ diff.after | json }}</pre>\n </div>\n </div>\n </div>\n <div class=\"ai-explanation\" *ngIf=\"aiExplanation.trim()\">\n {{ aiExplanation }}\n </div>\n </div>\n\n <!-- STATE: ERROR -->\n <div\n *ngIf=\"state === 'error' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))\"\n class=\"error-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"error-msg\">\n <mat-icon color=\"warn\">error_outline</mat-icon>\n <span>{{ errorMsg }}</span>\n </div>\n <div *ngIf=\"warnings.length\" class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n <div *ngFor=\"let warning of warnings\">{{ warning }}</div>\n </div>\n </div>\n </div>\n <div *ngIf=\"shouldShowApplyDetails()\" class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplicação</div>\n <div class=\"apply-details-actions\" *ngIf=\"allowManualPatchEdit\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar patch' }}\n </button>\n </div>\n </div>\n <div class=\"apply-details-meta\" *ngIf=\"lastApplyAt\">\n Última tentativa: {{ lastApplyAt | date:'short' }}\n </div>\n <div class=\"apply-paths\" *ngIf=\"getApplyPaths().length\">\n <span class=\"apply-path-chip\" *ngFor=\"let path of getApplyPaths()\">{{ path }}</span>\n </div>\n <div class=\"apply-warnings\" *ngIf=\"applyWarnings.length\">\n <div class=\"apply-warnings-title\">Avisos da aplicação</div>\n <div class=\"apply-warnings-list\">\n <div *ngFor=\"let warning of applyWarnings\">{{ warning }}</div>\n </div>\n </div>\n <div class=\"patch-path-editor\" *ngIf=\"allowManualPatchEdit && patchPathEditorExpanded\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para forçar texto em true/false/número, use aspas.</div>\n <div class=\"patch-path-editor-empty\" *ngIf=\"!getEditablePatchPathEdits().length\">\n Nenhum path editável disponível para este patch.\n </div>\n <div class=\"patch-path-rows\" *ngIf=\"getEditablePatchPathEdits().length\">\n <div class=\"patch-path-row\" *ngFor=\"let edit of getEditablePatchPathEdits(); let i = index\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n <div *ngIf=\"patchPathEdits[i].error\" class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n </div>\n </div>\n <div *ngIf=\"patchPathEditorError\" class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n <div class=\"patch-editor\" *ngIf=\"allowManualPatchEdit && patchEditorExpanded\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n <div *ngIf=\"patchEditorError\" class=\"patch-editor-error\">{{ patchEditorError }}</div>\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n </div>\n <div class=\"review-actions\">\n <button mat-button (click)=\"close()\">Fechar</button>\n <button mat-stroked-button (click)=\"retry()\">Tentar Novamente</button>\n </div>\n </div>\n\n <!-- STATE: SUCCESS -->\n <div\n *ngIf=\"state === 'success' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))\"\n class=\"success-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"success-msg\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <span>{{ aiExplanation || 'Configuração atualizada.' }}</span>\n </div>\n <div *ngIf=\"warnings.length\" class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n <div *ngFor=\"let warning of warnings\">{{ warning }}</div>\n </div>\n </div>\n </div>\n <div *ngIf=\"shouldShowApplyDetails()\" class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplicação</div>\n <div class=\"apply-details-actions\" *ngIf=\"allowManualPatchEdit\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar e reaplicar' }}\n </button>\n </div>\n </div>\n <div class=\"apply-details-meta\" *ngIf=\"lastApplyAt\">\n Aplicado em {{ lastApplyAt | date:'short' }}\n </div>\n <div class=\"apply-paths\" *ngIf=\"getApplyPaths().length\">\n <span class=\"apply-path-chip\" *ngFor=\"let path of getApplyPaths()\">{{ path }}</span>\n </div>\n <div class=\"apply-warnings\" *ngIf=\"applyWarnings.length\">\n <div class=\"apply-warnings-title\">Avisos da aplicação</div>\n <div class=\"apply-warnings-list\">\n <div *ngFor=\"let warning of applyWarnings\">{{ warning }}</div>\n </div>\n </div>\n <div class=\"patch-path-editor\" *ngIf=\"allowManualPatchEdit && patchPathEditorExpanded\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para forçar texto em true/false/número, use aspas.</div>\n <div class=\"patch-path-editor-empty\" *ngIf=\"!getEditablePatchPathEdits().length\">\n Nenhum path editável disponível para este patch.\n </div>\n <div class=\"patch-path-rows\" *ngIf=\"getEditablePatchPathEdits().length\">\n <div class=\"patch-path-row\" *ngFor=\"let edit of getEditablePatchPathEdits(); let i = index\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n <div *ngIf=\"patchPathEdits[i].error\" class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n </div>\n </div>\n <div *ngIf=\"patchPathEditorError\" class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n <div class=\"patch-editor\" *ngIf=\"allowManualPatchEdit && patchEditorExpanded\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n <div *ngIf=\"patchEditorError\" class=\"patch-editor-error\">{{ patchEditorError }}</div>\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n </div>\n <button mat-button color=\"warn\" (click)=\"undoLastChange()\">\n <mat-icon>undo</mat-icon> Desfazer\n </button>\n </div>\n\n </div>\n\n <div class=\"assistant-footer\">\n <ng-container *ngIf=\"!isTaskMode(); else taskFooter\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"composer-leading composer-leading-btn\"\n [matMenuTriggerFor]=\"assistantQuickMenu\"\n aria-label=\"Abrir ações rápidas\"\n matTooltip=\"Ações rápidas\"\n >\n <mat-icon>add</mat-icon>\n </button>\n <input\n #inputEl\n type=\"text\"\n [(ngModel)]=\"userPrompt\"\n [disabled]=\"state === 'processing' || state === 'applying'\"\n placeholder=\"Descreva a alteração que deseja aplicar…\"\n autocomplete=\"off\"\n />\n <div class=\"send-actions\">\n <button\n mat-icon-button\n class=\"send-btn\"\n *ngIf=\"state === 'listening'\"\n (click)=\"submitPrompt()\"\n [disabled]=\"!userPrompt.trim()\"\n [class.ready]=\"!!userPrompt.trim()\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <mat-spinner diameter=\"20\" *ngIf=\"state === 'processing' || state === 'applying'\"></mat-spinner>\n </div>\n </ng-container>\n <ng-template #taskFooter>\n <div class=\"task-footer\">\n <div class=\"task-footer-left\">\n <button mat-button type=\"button\" (click)=\"handleTaskSecondary()\">{{ getTaskCancelLabel() }}</button>\n <button\n *ngIf=\"state === 'review'\"\n mat-stroked-button\n type=\"button\"\n (click)=\"retry()\"\n >\n {{ getTaskSecondaryLabel() }}\n </button>\n </div>\n <div class=\"task-footer-right\">\n <button\n class=\"task-primary-btn\"\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"confirmTaskAction()\"\n [disabled]=\"isTaskPrimaryDisabled()\"\n >\n {{ getTaskPrimaryLabel() }}\n </button>\n <mat-spinner diameter=\"20\" *ngIf=\"state === 'processing' || state === 'applying'\"></mat-spinner>\n </div>\n </div>\n </ng-template>\n </div>\n\n <mat-menu #assistantQuickMenu=\"matMenu\" panelClass=\"assistant-quick-menu-panel\">\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('chat')\">\n <mat-icon>history</mat-icon>\n <span>Histórico</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('suggestions')\">\n <mat-icon>lightbulb</mat-icon>\n <span>Sugestões</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"startNewSession()\">\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\">\n <mat-icon>refresh</mat-icon>\n <span>Atualizar sugestões</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n (click)=\"restoreDismissedSuggestions()\"\n [disabled]=\"!hasDismissedSuggestions()\"\n >\n <mat-icon>visibility</mat-icon>\n <span>Restaurar sugestões ocultas</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n class=\"assistant-quick-menu-danger\"\n (click)=\"clearHistory()\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar histórico local</span>\n </button>\n </mat-menu>\n </div>\n\n</ng-template>\n","/*\n * Public API Surface of praxis-ai\n */\n\nexport * from './lib/praxis-ai';\nexport * from './lib/core/models/ai-models';\nexport * from './lib/core/services/praxis-ai.service';\nexport * from './lib/core/services/ai-config.service';\nexport * from './lib/core/services/ai-backend-api.service';\nexport * from './lib/context/ai-context-builder.service';\nexport * from './lib/ui/ai-rule-wizard-dialog.component';\nexport * from './lib/ui/streaming-feedback.component';\nexport * from './lib/core/services/ai-response-validator.service';\nexport * from './lib/core/services/dsl-parsing.service';\nexport * from './lib/core/services/schema-minifier.service';\nexport * from './lib/core/services/ai-config-agent.service';\n\n// Adapters\nexport * from './lib/core/adapters/ai-config.adapter';\nexport * from './lib/core/adapters/base-ai.adapter';\n\n// UI\nexport * from './lib/ui/ai-assistant/ai-assistant.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SchemaMinifierService","i1.DslParsingService","i2.PraxisAiService","i3.AiResponseValidatorService","i5.AiContextBuilderService","i6","i1","i8","i9","i1.PraxisAiService","i2","i4","i7","i10","i11"],"mappings":"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"}