@praxisui/page-builder 9.0.0-beta.77 → 9.0.0-beta.79

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.
@@ -7,7 +7,7 @@ import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
7
7
  import * as i2$1 from '@angular/material/icon';
8
8
  import { MatIconModule } from '@angular/material/icon';
9
9
  import * as i2$2 from '@praxisui/core';
10
- import { PraxisIconDirective, BUILTIN_SHELL_PRESETS, providePraxisI18n, PraxisI18nService, GLOBAL_ACTION_CATALOG, getGlobalActionCatalog, PRAXIS_GLOBAL_ACTION_CATALOG, SurfaceOpenActionEditorComponent, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, SETTINGS_PANEL_DATA as SETTINGS_PANEL_DATA$1, deepMerge, generateId, ComponentMetadataRegistry, PraxisRuntimeComponentObservationRegistryService, domainKnowledgeTimelineToRichContentDocument, DomainRuleService, DomainKnowledgeService, SETTINGS_PANEL_BRIDGE, DynamicWidgetPageComponent, DYNAMIC_PAGE_SHELL_EDITOR } from '@praxisui/core';
10
+ import { PraxisIconDirective, BUILTIN_SHELL_PRESETS, providePraxisI18n, PraxisI18nService, GLOBAL_ACTION_CATALOG, getGlobalActionCatalog, PRAXIS_GLOBAL_ACTION_CATALOG, SurfaceOpenActionEditorComponent, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, SETTINGS_PANEL_DATA as SETTINGS_PANEL_DATA$1, deepMerge, generateId, ComponentMetadataRegistry, ObservabilityDashboardService, PraxisRuntimeComponentObservationRegistryService, domainKnowledgeTimelineToRichContentDocument, DomainRuleService, DomainKnowledgeService, SETTINGS_PANEL_BRIDGE, DynamicWidgetPageComponent, DYNAMIC_PAGE_SHELL_EDITOR } from '@praxisui/core';
11
11
  import * as i3 from '@angular/material/tooltip';
12
12
  import { MatTooltipModule } from '@angular/material/tooltip';
13
13
  import * as i3$1 from '@angular/material/form-field';
@@ -24,7 +24,7 @@ import * as i6 from '@angular/material/divider';
24
24
  import { MatDividerModule } from '@angular/material/divider';
25
25
  import * as i6$1 from '@angular/material/select';
26
26
  import { MatSelectModule } from '@angular/material/select';
27
- import { BehaviorSubject, merge, timeout, map, catchError, throwError, from, firstValueFrom, share, concatMap, of, timer, takeUntil, Subject, filter, take } from 'rxjs';
27
+ import { BehaviorSubject, merge, timeout, map, catchError, throwError, from, firstValueFrom, share, concatMap, of, timer, takeUntil, Subject, tap, filter, take } from 'rxjs';
28
28
  import { SETTINGS_PANEL_DATA } from '@praxisui/settings-panel';
29
29
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
30
30
  import * as i7 from '@angular/material/tabs';
@@ -2828,6 +2828,18 @@ const PRAXIS_PAGE_BUILDER_EN_US = {
2828
2828
  'praxis.pageBuilder.agentic.diagnostics.title': 'LLM diagnostics',
2829
2829
  'praxis.pageBuilder.agentic.diagnostics.badge': 'Debug',
2830
2830
  'praxis.pageBuilder.agentic.diagnostics.description': 'Prompt, context bundle, and tool catalog returned by the backend for this turn.',
2831
+ 'praxis.pageBuilder.agentic.diagnostics.health.title': 'Assistant health',
2832
+ 'praxis.pageBuilder.agentic.diagnostics.health.description': 'Recent authoring turn reliability and response time.',
2833
+ 'praxis.pageBuilder.agentic.diagnostics.health.successRate': 'Success',
2834
+ 'praxis.pageBuilder.agentic.diagnostics.health.timeoutRate': 'Timeouts',
2835
+ 'praxis.pageBuilder.agentic.diagnostics.health.p50': 'Typical (P50)',
2836
+ 'praxis.pageBuilder.agentic.diagnostics.health.p95': 'Slow edge (P95)',
2837
+ 'praxis.pageBuilder.agentic.diagnostics.health.breakdown': 'Provider and model breakdown',
2838
+ 'praxis.pageBuilder.agentic.diagnostics.health.dimension': 'Dimension',
2839
+ 'praxis.pageBuilder.agentic.diagnostics.health.name': 'Name',
2840
+ 'praxis.pageBuilder.agentic.diagnostics.health.provider': 'Provider',
2841
+ 'praxis.pageBuilder.agentic.diagnostics.health.model': 'Model',
2842
+ 'praxis.pageBuilder.agentic.diagnostics.raw': 'Turn details',
2831
2843
  'praxis.pageBuilder.agentic.dragHandleAria': 'Move AI assistant',
2832
2844
  'praxis.pageBuilder.agentic.resizeHandleAria': 'Resize AI assistant',
2833
2845
  'praxis.pageBuilder.agentic.resizeHandleTooltip': 'Resize',
@@ -2892,8 +2904,26 @@ const PRAXIS_PAGE_BUILDER_EN_US = {
2892
2904
  'praxis.pageBuilder.agentic.governedContinuation.sharedRule.open_timeline.label': 'View history',
2893
2905
  'praxis.pageBuilder.agentic.governedContinuation.sharedRule.open_timeline.description': 'Open the safe history for this decision.',
2894
2906
  'praxis.pageBuilder.agentic.projectKnowledgeCockpit.timeline': 'Safe timeline',
2895
- 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.timelineEmpty': 'No safe timeline events published for this change-set yet.',
2896
- 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.rejected': 'Project Knowledge change-set rejected. No governed knowledge projection was applied.',
2907
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.title': 'Project knowledge review',
2908
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.subtitle': 'Continue cited knowledge as a governed change.',
2909
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.description': 'Review the evidence before incorporating it into governed knowledge. This area displays safe summaries only and does not apply knowledge locally.',
2910
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.expand': 'Expand',
2911
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.collapse': 'Collapse',
2912
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.running': 'Running governed step',
2913
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.audit': 'Audit',
2914
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.cited': 'cited',
2915
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.changeSet': 'Proposal',
2916
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.validation': 'Validation',
2917
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.status': 'Status',
2918
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.safeOperations': 'Safe changes',
2919
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.noCandidate': 'I could not find cited evidence that can start this review.',
2920
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.created': 'Knowledge proposal created. The next governed step is validation.',
2921
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.validationPassed': 'Validation completed. The proposal is ready for explicit approval.',
2922
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.validationBlocked': 'Validation blocked the proposal. Review the safe findings before approval.',
2923
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.approved': 'Proposal approved. Apply it only after completing the governed review.',
2924
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.applied': 'Knowledge applied. The safe read model was refreshed by the governed flow.',
2925
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.timelineEmpty': 'No safe events have been published for this proposal yet.',
2926
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.rejected': 'Proposal rejected. No governed knowledge change was applied.',
2897
2927
  'praxis.pageBuilder.agentic.errors.applyLocal': 'Preview could not be applied.',
2898
2928
  'praxis.pageBuilder.agentic.errors.componentId': 'Configure a component id before saving.',
2899
2929
  'praxis.pageBuilder.agentic.errors.invalidPreview': 'Generated preview is invalid.',
@@ -3418,6 +3448,18 @@ const PRAXIS_PAGE_BUILDER_PT_BR = {
3418
3448
  'praxis.pageBuilder.agentic.diagnostics.title': 'Diagnóstico do LLM',
3419
3449
  'praxis.pageBuilder.agentic.diagnostics.badge': 'Debug',
3420
3450
  'praxis.pageBuilder.agentic.diagnostics.description': 'Prompt, pacote de contexto e catálogo de ferramentas retornados pelo backend para este turno.',
3451
+ 'praxis.pageBuilder.agentic.diagnostics.health.title': 'Saúde do assistente',
3452
+ 'praxis.pageBuilder.agentic.diagnostics.health.description': 'Confiabilidade e tempo de resposta dos turnos recentes de autoria.',
3453
+ 'praxis.pageBuilder.agentic.diagnostics.health.successRate': 'Sucesso',
3454
+ 'praxis.pageBuilder.agentic.diagnostics.health.timeoutRate': 'Timeouts',
3455
+ 'praxis.pageBuilder.agentic.diagnostics.health.p50': 'Tempo típico (P50)',
3456
+ 'praxis.pageBuilder.agentic.diagnostics.health.p95': 'Cauda lenta (P95)',
3457
+ 'praxis.pageBuilder.agentic.diagnostics.health.breakdown': 'Detalhamento por provedor e modelo',
3458
+ 'praxis.pageBuilder.agentic.diagnostics.health.dimension': 'Dimensão',
3459
+ 'praxis.pageBuilder.agentic.diagnostics.health.name': 'Nome',
3460
+ 'praxis.pageBuilder.agentic.diagnostics.health.provider': 'Provedor',
3461
+ 'praxis.pageBuilder.agentic.diagnostics.health.model': 'Modelo',
3462
+ 'praxis.pageBuilder.agentic.diagnostics.raw': 'Detalhes do turno',
3421
3463
  'praxis.pageBuilder.agentic.dragHandleAria': 'Mover assistente de IA',
3422
3464
  'praxis.pageBuilder.agentic.resizeHandleAria': 'Redimensionar assistente de IA',
3423
3465
  'praxis.pageBuilder.agentic.resizeHandleTooltip': 'Redimensionar',
@@ -3481,9 +3523,27 @@ const PRAXIS_PAGE_BUILDER_PT_BR = {
3481
3523
  'praxis.pageBuilder.agentic.governedContinuation.sharedRule.validate_enforcement.description': 'Verificar se as alterações publicadas já podem ser usadas.',
3482
3524
  'praxis.pageBuilder.agentic.governedContinuation.sharedRule.open_timeline.label': 'Ver histórico',
3483
3525
  'praxis.pageBuilder.agentic.governedContinuation.sharedRule.open_timeline.description': 'Abrir o histórico seguro desta decisão.',
3484
- 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.timeline': 'Timeline segura',
3485
- 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.timelineEmpty': 'Ainda não eventos seguros de timeline publicados para este change-set.',
3486
- 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.rejected': 'Change-set de Project Knowledge rejeitado. Nenhuma projeção de conhecimento governado foi aplicada.',
3526
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.timeline': 'Histórico seguro',
3527
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.title': 'Revisão do conhecimento do projeto',
3528
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.subtitle': 'Continue o conhecimento citado como uma alteração governada.',
3529
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.description': 'Revise as evidências antes de incorporá-las ao conhecimento governado. Esta área apresenta apenas resumos seguros e não aplica conhecimento localmente.',
3530
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.expand': 'Expandir',
3531
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.collapse': 'Recolher',
3532
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.running': 'Executando etapa governada',
3533
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.audit': 'Auditoria',
3534
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.cited': 'citadas',
3535
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.changeSet': 'Proposta',
3536
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.validation': 'Validação',
3537
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.status': 'Status',
3538
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.safeOperations': 'Alterações seguras',
3539
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.noCandidate': 'Não encontrei uma evidência citada que possa iniciar esta revisão.',
3540
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.created': 'Proposta de conhecimento criada. O próximo passo governado é a validação.',
3541
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.validationPassed': 'Validação concluída. A proposta está pronta para aprovação explícita.',
3542
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.validationBlocked': 'A validação bloqueou a proposta. Revise os pontos seguros antes da aprovação.',
3543
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.approved': 'Proposta aprovada. Aplique somente depois de concluir a revisão governada.',
3544
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.applied': 'Conhecimento aplicado. A leitura segura foi atualizada pelo fluxo governado.',
3545
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.timelineEmpty': 'Ainda não há eventos seguros publicados para esta proposta.',
3546
+ 'praxis.pageBuilder.agentic.projectKnowledgeCockpit.rejected': 'Proposta rejeitada. Nenhuma alteração no conhecimento governado foi aplicada.',
3487
3547
  'praxis.pageBuilder.agentic.errors.applyLocal': 'A pré-visualização não pôde ser aplicada.',
3488
3548
  'praxis.pageBuilder.agentic.errors.componentId': 'Configure um id de componente antes de salvar.',
3489
3549
  'praxis.pageBuilder.agentic.errors.invalidPreview': 'A pré-visualização gerada é inválida.',
@@ -15284,15 +15344,19 @@ class PageBuilderAgenticAuthoringTurnFlow {
15284
15344
  ...previewAuthoringContext,
15285
15345
  }));
15286
15346
  if (!preview.valid) {
15287
- const message = this.context.describePreviewFailure(preview);
15347
+ const message = intentResolution.assistantMessage?.trim()
15348
+ || this.context.describePreviewFailure(preview);
15349
+ const quickReplies = this.resolveShellQuickReplies(intentResolution);
15288
15350
  return {
15289
- state: 'error',
15290
- phase: 'preview',
15351
+ state: quickReplies.length > 0 ? 'clarification' : 'success',
15352
+ phase: quickReplies.length > 0 ? 'clarify' : 'summarize',
15291
15353
  assistantMessage: message,
15354
+ assistantContent: this.toJsonObject(intentResolution.assistantContent) ?? null,
15355
+ quickReplies,
15292
15356
  canApply: false,
15293
15357
  statusText: '',
15294
- errorText: message,
15295
- preview: null,
15358
+ errorText: '',
15359
+ preview,
15296
15360
  diagnostics: this.buildTurnDiagnostics(intentResolution, preview),
15297
15361
  };
15298
15362
  }
@@ -15343,7 +15407,11 @@ class PageBuilderAgenticAuthoringTurnFlow {
15343
15407
  }
15344
15408
  submitWithTurnStream(request, prompt) {
15345
15409
  const preparedRequest$ = from(this.buildTurnStreamRequest(request, prompt)).pipe(share());
15346
- const stream$ = preparedRequest$.pipe(concatMap(({ streamRequest }) => this.service.streamTurn(streamRequest).pipe(map((event) => ({ event, contextHints: streamRequest.contextHints })))), concatMap(({ event, contextHints }) => from(this.toTurnResultFromStreamEvent(event, request, prompt, contextHints))), share());
15410
+ const stream$ = preparedRequest$.pipe(concatMap(({ streamRequest }) => this.service.streamTurn(streamRequest).pipe(map((event) => ({ event, contextHints: streamRequest.contextHints })))), concatMap(({ event, contextHints }) => from(this.toTurnResultFromStreamEvent(event, request, prompt, contextHints)).pipe(map((result) => ({
15411
+ ...result,
15412
+ sessionId: event.threadId,
15413
+ clientTurnId: request.clientTurnId ?? event.turnId,
15414
+ })))), share());
15347
15415
  return merge(of(this.toTurnStreamPreparationStatusResult()), preparedRequest$.pipe(map(({ diagnostics }) => this.toTurnStreamPreparedStatusResult(diagnostics))), timer(TURN_STREAM_PREPARATION_WAITING_MS).pipe(map(() => this.toTurnStreamPreparationWaitingResult()), takeUntil(stream$)), stream$).pipe(catchError((error) => {
15348
15416
  if (this.shouldFailClosedFromTurnStreamError(request, prompt, error)) {
15349
15417
  return of(this.toGovernedRouteFailClosedResult(request, prompt, error));
@@ -15502,6 +15570,7 @@ class PageBuilderAgenticAuthoringTurnFlow {
15502
15570
  if (![
15503
15571
  'add_dashboard_kpis',
15504
15572
  'bind_dashboard_kpis',
15573
+ 'add_dashboard_filters',
15505
15574
  'add_dashboard_chart',
15506
15575
  'add_dashboard_surfaces',
15507
15576
  'connect_dashboard_widgets',
@@ -15516,6 +15585,10 @@ class PageBuilderAgenticAuthoringTurnFlow {
15516
15585
  if (changeKind === 'add_dashboard_kpis' || changeKind === 'bind_dashboard_kpis') {
15517
15586
  this.repairDashboardKpis(page, contextHints, repairLog);
15518
15587
  }
15588
+ if (changeKind === 'add_dashboard_filters') {
15589
+ this.repairDashboardFilters(page, contextHints, repairLog);
15590
+ this.repairDashboardConnections(page, repairLog);
15591
+ }
15519
15592
  if (changeKind === 'add_dashboard_chart') {
15520
15593
  this.repairDashboardChart(page, contextHints, repairLog);
15521
15594
  this.repairDashboardConnections(page, repairLog);
@@ -15645,6 +15718,60 @@ class PageBuilderAgenticAuthoringTurnFlow {
15645
15718
  repairLog.push('dashboard-kpis-bound');
15646
15719
  }
15647
15720
  }
15721
+ repairDashboardFilters(page, contextHints, repairLog) {
15722
+ if (this.dashboardPageWidgets(page).some((widget) => this.dashboardWidgetComponentId(widget) === 'praxis-filter')) {
15723
+ return;
15724
+ }
15725
+ const confirmedFields = this.dashboardConfirmedFilterFields(page);
15726
+ if (!confirmedFields.length) {
15727
+ return;
15728
+ }
15729
+ const resourcePath = this.dashboardRepairResourcePath(contextHints);
15730
+ const filterKey = this.uniqueDashboardWidgetKey(page, 'dashboard-filters');
15731
+ const selectedFieldIds = confirmedFields.slice(0, 4);
15732
+ this.insertDashboardWidget(page, {
15733
+ key: filterKey,
15734
+ shell: {
15735
+ kind: 'dashboard-card',
15736
+ title: 'Filtros',
15737
+ subtitle: 'Refine os dados usando campos confirmados da fonte',
15738
+ },
15739
+ definition: {
15740
+ id: 'praxis-filter',
15741
+ bindingOrder: ['resourcePath', 'selectedFieldIds', 'alwaysVisibleFields'],
15742
+ inputs: {
15743
+ resourcePath,
15744
+ selectedFieldIds,
15745
+ alwaysVisibleFields: selectedFieldIds.slice(0, 2),
15746
+ showFilterSettings: true,
15747
+ enableCustomization: true,
15748
+ },
15749
+ },
15750
+ }, 0, true);
15751
+ repairLog.push('dashboard-filters-added-from-confirmed-fields');
15752
+ }
15753
+ dashboardConfirmedFilterFields(page) {
15754
+ const fields = [];
15755
+ const add = (value) => {
15756
+ const field = typeof value === 'string' ? value.trim() : '';
15757
+ if (field && !fields.includes(field)) {
15758
+ fields.push(field);
15759
+ }
15760
+ };
15761
+ for (const widget of this.dashboardPageWidgets(page)) {
15762
+ const inputs = this.dashboardWidgetInputs(widget);
15763
+ this.arrayFromUnknown(inputs['selectedFieldIds']).forEach(add);
15764
+ for (const metadata of this.arrayFromUnknown(inputs['fieldMetadata'])) {
15765
+ const item = this.toJsonObject(metadata);
15766
+ add(this.readString(item, 'name') || this.readString(item, 'field') || this.readString(item, 'id'));
15767
+ }
15768
+ for (const column of this.arrayFromUnknown(inputs['columns'])) {
15769
+ const item = this.toJsonObject(column);
15770
+ add(this.readString(item, 'field') || this.readString(item, 'name') || this.readString(item, 'id'));
15771
+ }
15772
+ }
15773
+ return fields;
15774
+ }
15648
15775
  repairRichContentKpiDocument(document) {
15649
15776
  let repaired = false;
15650
15777
  for (const node of this.arrayFromUnknown(document['nodes'])) {
@@ -16714,17 +16841,19 @@ class PageBuilderAgenticAuthoringTurnFlow {
16714
16841
  const runtimeObservationResult = await this.collectRuntimeComponentObservations(request);
16715
16842
  const runtimeObservationsElapsedMs = Math.max(0, Date.now() - runtimeObservationsStartedAt);
16716
16843
  const applyTarget = this.context.applyTarget?.() ?? null;
16717
- const streamContextHints = applyTarget
16844
+ const responseLocale = this.context.responseLocale?.()?.trim() || null;
16845
+ const streamContextHints = applyTarget || responseLocale
16718
16846
  ? {
16719
16847
  ...(authoringContext.contextHints ?? {}),
16720
- agenticApplyTarget: applyTarget,
16848
+ ...(responseLocale ? { responseLocale } : {}),
16849
+ ...(applyTarget ? { agenticApplyTarget: applyTarget } : {}),
16721
16850
  }
16722
16851
  : authoringContext.contextHints ?? undefined;
16723
16852
  const streamRequest = {
16724
16853
  userPrompt: prompt,
16725
16854
  targetApp: this.context.targetApp,
16726
16855
  targetComponentId: this.context.targetComponentId,
16727
- currentRoute: null,
16856
+ currentRoute: this.context.currentRoute?.() ?? null,
16728
16857
  currentPage: this.context.currentPage(),
16729
16858
  selectedWidgetKey: this.resolveSelectedWidgetKey(selectedWidgetKey, authoringContext.contextHints),
16730
16859
  provider: this.context.provider(),
@@ -16732,6 +16861,9 @@ class PageBuilderAgenticAuthoringTurnFlow {
16732
16861
  apiKey: this.context.apiKey(),
16733
16862
  ...authoringContext,
16734
16863
  contextHints: streamContextHints,
16864
+ ...(request.activeSemanticDecision
16865
+ ? { activeSemanticDecision: this.toJsonObject(request.activeSemanticDecision) }
16866
+ : {}),
16735
16867
  ...(this.runtimeRelatedSurfaceDisambiguationContext
16736
16868
  ? {
16737
16869
  diagnostics: {
@@ -17060,15 +17192,19 @@ class PageBuilderAgenticAuthoringTurnFlow {
17060
17192
  ...authoringContext,
17061
17193
  }));
17062
17194
  if (!preview.valid) {
17063
- const message = this.context.describePreviewFailure(preview);
17195
+ const message = intentResolution.assistantMessage?.trim()
17196
+ || this.context.describePreviewFailure(preview);
17197
+ const quickReplies = this.resolveShellQuickReplies(intentResolution);
17064
17198
  return {
17065
- state: 'error',
17066
- phase: 'preview',
17199
+ state: quickReplies.length > 0 ? 'clarification' : 'success',
17200
+ phase: quickReplies.length > 0 ? 'clarify' : 'summarize',
17067
17201
  assistantMessage: message,
17202
+ assistantContent: this.toJsonObject(intentResolution.assistantContent) ?? null,
17203
+ quickReplies,
17068
17204
  canApply: false,
17069
17205
  statusText: '',
17070
- errorText: message,
17071
- preview: null,
17206
+ errorText: '',
17207
+ preview,
17072
17208
  diagnostics: this.buildTurnDiagnostics(intentResolution, preview),
17073
17209
  };
17074
17210
  }
@@ -17125,7 +17261,7 @@ class PageBuilderAgenticAuthoringTurnFlow {
17125
17261
  if (intentResolution.artifactKind !== 'dashboard') {
17126
17262
  return false;
17127
17263
  }
17128
- if (preview.uiCompositionPlan) {
17264
+ if (this.hasCanonicalUiCompositionPlan(preview.uiCompositionPlan)) {
17129
17265
  return false;
17130
17266
  }
17131
17267
  return true;
@@ -17219,11 +17355,17 @@ class PageBuilderAgenticAuthoringTurnFlow {
17219
17355
  if (!preview) {
17220
17356
  return false;
17221
17357
  }
17222
- if (preview.uiCompositionPlan) {
17358
+ if (this.hasCanonicalUiCompositionPlan(preview.uiCompositionPlan)) {
17223
17359
  return true;
17224
17360
  }
17225
17361
  return this.hasCompiledPagePatch(preview);
17226
17362
  }
17363
+ hasCanonicalUiCompositionPlan(value) {
17364
+ const plan = this.toJsonObject(value);
17365
+ return plan?.['kind'] === 'praxis.ui-composition-plan'
17366
+ && plan['version'] === '1.0'
17367
+ && Array.isArray(plan['widgets']);
17368
+ }
17227
17369
  hasCompiledPagePatch(preview) {
17228
17370
  const patch = this.toJsonObject(preview?.compiledFormPatch)?.['patch'];
17229
17371
  const page = this.toJsonObject(patch)?.['page'];
@@ -18910,6 +19052,8 @@ class PageBuilderAgenticAuthoringTurnFlow {
18910
19052
  return 'add_dashboard_kpis';
18911
19053
  case 'dashboard-quality-bind-kpis':
18912
19054
  return 'bind_dashboard_kpis';
19055
+ case 'dashboard-quality-add-filters':
19056
+ return 'add_dashboard_filters';
18913
19057
  case 'dashboard-quality-add-chart':
18914
19058
  return 'add_dashboard_chart';
18915
19059
  case 'dashboard-quality-add-surfaces':
@@ -18947,6 +19091,9 @@ class PageBuilderAgenticAuthoringTurnFlow {
18947
19091
  case 'adicionar grafico':
18948
19092
  case 'adicionar gráfico':
18949
19093
  return 'add_dashboard_chart';
19094
+ case 'add filters':
19095
+ case 'adicionar filtros':
19096
+ return 'add_dashboard_filters';
18950
19097
  case 'add surfaces':
18951
19098
  case 'adicionar surfaces':
18952
19099
  case 'adicionar superficies':
@@ -19011,8 +19158,13 @@ class PageBuilderAgenticAuthoringTurnFlow {
19011
19158
  }
19012
19159
  const operationKind = intentResolution.operationKind;
19013
19160
  const changeKind = intentResolution.changeKind;
19014
- return (operationKind === 'explore' || operationKind === 'explain')
19015
- && intentResolution.artifactKind === 'api_catalog'
19161
+ if (operationKind !== 'explore' && operationKind !== 'explain') {
19162
+ return false;
19163
+ }
19164
+ if (intentResolution.artifactKind === 'component') {
19165
+ return changeKind === 'answer_component_catalog_question';
19166
+ }
19167
+ return intentResolution.artifactKind === 'api_catalog'
19016
19168
  && (changeKind === 'answer_api_catalog_question'
19017
19169
  || changeKind === 'answer_catalog_question'
19018
19170
  || changeKind === 'api_catalog_followup'
@@ -19591,6 +19743,7 @@ class PageBuilderAgenticAuthoringTurnFlow {
19591
19743
  userPrompt: prompt,
19592
19744
  targetApp: this.context.targetApp,
19593
19745
  targetComponentId: this.context.targetComponentId,
19746
+ currentRoute: this.context.currentRoute?.() ?? null,
19594
19747
  currentPage: this.context.currentPage(),
19595
19748
  selectedWidgetKey: this.resolveSelectedWidgetKey(selectedWidgetKey, authoringContext.contextHints),
19596
19749
  provider: this.context.provider(),
@@ -19922,6 +20075,7 @@ class DynamicPageBuilderComponent {
19922
20075
  agenticAuthoring = inject(PageBuilderAgenticAuthoringService);
19923
20076
  agenticTurnOrchestrator = inject(PraxisAssistantTurnOrchestratorService);
19924
20077
  assistantSessions = inject(PraxisAssistantSessionRegistryService);
20078
+ observabilityDashboard = inject(ObservabilityDashboardService);
19925
20079
  runtimeObservationRegistry = inject(PraxisRuntimeComponentObservationRegistryService, { optional: true });
19926
20080
  agenticAuthoringOptions = inject(PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS, { optional: true });
19927
20081
  runtime;
@@ -19967,6 +20121,7 @@ class DynamicPageBuilderComponent {
19967
20121
  agenticAuthoringOpen = signal(false, ...(ngDevMode ? [{ debugName: "agenticAuthoringOpen" }] : /* istanbul ignore next */ []));
19968
20122
  agenticAuthoringPrompt = signal('', ...(ngDevMode ? [{ debugName: "agenticAuthoringPrompt" }] : /* istanbul ignore next */ []));
19969
20123
  agenticAuthoringBusy = signal(false, ...(ngDevMode ? [{ debugName: "agenticAuthoringBusy" }] : /* istanbul ignore next */ []));
20124
+ agenticAuthoringTerminalState = signal(null, ...(ngDevMode ? [{ debugName: "agenticAuthoringTerminalState" }] : /* istanbul ignore next */ []));
19970
20125
  agenticAuthoringStatus = signal('', ...(ngDevMode ? [{ debugName: "agenticAuthoringStatus" }] : /* istanbul ignore next */ []));
19971
20126
  agenticAuthoringError = signal('', ...(ngDevMode ? [{ debugName: "agenticAuthoringError" }] : /* istanbul ignore next */ []));
19972
20127
  agenticAuthoringPreviewResult = signal(null, ...(ngDevMode ? [{ debugName: "agenticAuthoringPreviewResult" }] : /* istanbul ignore next */ []));
@@ -19995,6 +20150,7 @@ class DynamicPageBuilderComponent {
19995
20150
  projectKnowledgeCockpitValidation = signal(null, ...(ngDevMode ? [{ debugName: "projectKnowledgeCockpitValidation" }] : /* istanbul ignore next */ []));
19996
20151
  projectKnowledgeCockpitTimeline = signal(null, ...(ngDevMode ? [{ debugName: "projectKnowledgeCockpitTimeline" }] : /* istanbul ignore next */ []));
19997
20152
  agenticAuthoringLlmDiagnostics = signal(null, ...(ngDevMode ? [{ debugName: "agenticAuthoringLlmDiagnostics" }] : /* istanbul ignore next */ []));
20153
+ agenticTurnHealth = signal(this.emptyAgenticTurnHealth(), ...(ngDevMode ? [{ debugName: "agenticTurnHealth" }] : /* istanbul ignore next */ []));
19998
20154
  agenticAuthoringLlmDiagnosticsCollapsed = signal(true, ...(ngDevMode ? [{ debugName: "agenticAuthoringLlmDiagnosticsCollapsed" }] : /* istanbul ignore next */ []));
19999
20155
  sharedRuleCockpitCollapsed = signal(false, ...(ngDevMode ? [{ debugName: "sharedRuleCockpitCollapsed" }] : /* istanbul ignore next */ []));
20000
20156
  projectKnowledgeCockpitCollapsed = signal(true, ...(ngDevMode ? [{ debugName: "projectKnowledgeCockpitCollapsed" }] : /* istanbul ignore next */ []));
@@ -20017,9 +20173,13 @@ class DynamicPageBuilderComponent {
20017
20173
  agenticAuthoringTurnTerminalTimeoutMs = AGENTIC_AUTHORING_TURN_TERMINAL_TIMEOUT_MS;
20018
20174
  sharedRuleHandoffRevision = 0;
20019
20175
  agenticAuthoringPanelLayoutTouched = false;
20176
+ observabilityMetricsSubscription;
20020
20177
  constructor(dialog, settingsPanel) {
20021
20178
  this.dialog = dialog;
20022
20179
  this.settingsPanel = settingsPanel;
20180
+ this.observabilityMetricsSubscription = this.observabilityDashboard.metrics$.subscribe((snapshot) => {
20181
+ this.agenticTurnHealth.set(snapshot.agenticTurns);
20182
+ });
20023
20183
  effect(() => {
20024
20184
  const activeSession = this.assistantSessions.activeSession();
20025
20185
  if (activeSession?.id === this.resolveAgenticAuthoringSessionId() && !this.agenticAuthoringOpen()) {
@@ -20067,6 +20227,7 @@ class DynamicPageBuilderComponent {
20067
20227
  ngOnDestroy() {
20068
20228
  this.cancelActiveAgenticTurn();
20069
20229
  this.agenticTurnCancel$.complete();
20230
+ this.observabilityMetricsSubscription.unsubscribe();
20070
20231
  }
20071
20232
  showSettings() {
20072
20233
  return !!this.enableCustomization && !this.previewMode;
@@ -20147,6 +20308,40 @@ class DynamicPageBuilderComponent {
20147
20308
  toggleAgenticAuthoringLlmDiagnostics() {
20148
20309
  this.agenticAuthoringLlmDiagnosticsCollapsed.update((current) => !current);
20149
20310
  }
20311
+ agenticAuthoringDiagnosticsAvailable() {
20312
+ return !!this.agenticAuthoringLlmDiagnosticsText() || this.agenticTurnHealth().started > 0;
20313
+ }
20314
+ agenticTurnHealthBuckets() {
20315
+ const health = this.agenticTurnHealth();
20316
+ return [
20317
+ ...health.byProvider.map((bucket) => ({ dimension: 'provider', bucket })),
20318
+ ...health.byModel.map((bucket) => ({ dimension: 'model', bucket })),
20319
+ ];
20320
+ }
20321
+ formatAgenticMetricPercent(rate) {
20322
+ return `${Math.round(Math.max(0, rate) * 100)}%`;
20323
+ }
20324
+ formatAgenticDuration(durationMs) {
20325
+ const safeDurationMs = Math.max(0, Math.round(durationMs));
20326
+ return safeDurationMs < 1_000
20327
+ ? `${safeDurationMs} ms`
20328
+ : `${(safeDurationMs / 1_000).toFixed(1)} s`;
20329
+ }
20330
+ emptyAgenticTurnHealth() {
20331
+ return {
20332
+ started: 0,
20333
+ completed: 0,
20334
+ succeeded: 0,
20335
+ timedOut: 0,
20336
+ successRate: 0,
20337
+ timeoutRate: 0,
20338
+ averageDurationMs: 0,
20339
+ p50DurationMs: 0,
20340
+ p95DurationMs: 0,
20341
+ byProvider: [],
20342
+ byModel: [],
20343
+ };
20344
+ }
20150
20345
  toggleSharedRuleCockpit() {
20151
20346
  this.sharedRuleCockpitCollapsed.update((current) => !current);
20152
20347
  }
@@ -20737,6 +20932,8 @@ class DynamicPageBuilderComponent {
20737
20932
  return 'review';
20738
20933
  if (this.agenticAuthoringSharedRuleHandoffState())
20739
20934
  return 'clarification';
20935
+ if (this.agenticAuthoringTerminalState() === 'clarification')
20936
+ return 'clarification';
20740
20937
  if (this.agenticAuthoringConversation().length)
20741
20938
  return 'listening';
20742
20939
  return 'idle';
@@ -20756,6 +20953,7 @@ class DynamicPageBuilderComponent {
20756
20953
  this.agenticTurnController = undefined;
20757
20954
  this.sharedRuleHandoffRevision += 1;
20758
20955
  this.agenticAuthoringBusy.set(false);
20956
+ this.agenticAuthoringTerminalState.set(null);
20759
20957
  this.agenticAuthoringPrompt.set('');
20760
20958
  this.agenticAuthoringStatus.set('');
20761
20959
  this.agenticAuthoringError.set('');
@@ -21349,7 +21547,11 @@ class DynamicPageBuilderComponent {
21349
21547
  await this.applyAgenticTurnState(await firstValueFrom(this.ensureAgenticTurnController().cancel()));
21350
21548
  return;
21351
21549
  }
21352
- if (replyKind === 'revise') {
21550
+ const contextHints = reply.contextHints ? { ...reply.contextHints } : undefined;
21551
+ const activeSemanticDecision = reply.semanticDecision
21552
+ ? { ...reply.semanticDecision }
21553
+ : undefined;
21554
+ if (replyKind === 'revise' && !this.isGovernedReviewRepairQuickReply(contextHints)) {
21353
21555
  this.invalidateAgenticTerminalAuthorization();
21354
21556
  this.agenticAuthoringEditingMessageId.set(null);
21355
21557
  this.agenticAuthoringQuickReplies.set([]);
@@ -21357,7 +21559,6 @@ class DynamicPageBuilderComponent {
21357
21559
  return;
21358
21560
  }
21359
21561
  this.agenticAuthoringEditingMessageId.set(null);
21360
- const contextHints = reply.contextHints ? { ...reply.contextHints } : undefined;
21361
21562
  const visiblePrompt = this.agenticQuickReplyVisiblePrompt(reply, contextHints);
21362
21563
  const submittedPrompt = this.agenticQuickReplySubmittedPrompt(reply, contextHints, visiblePrompt, this.ensureAgenticTurnController().snapshot().pendingClarification);
21363
21564
  if (this.promoteSharedRuleHandoffFromQuickReply(reply, contextHints, visiblePrompt)) {
@@ -21385,7 +21586,10 @@ class DynamicPageBuilderComponent {
21385
21586
  id: reply.id,
21386
21587
  value: reply.prompt,
21387
21588
  displayPrompt: visiblePrompt,
21388
- contextHints,
21589
+ contextHints: activeSemanticDecision
21590
+ ? { ...(contextHints ?? {}), semanticDecision: activeSemanticDecision }
21591
+ : contextHints,
21592
+ activeSemanticDecision,
21389
21593
  }), turnRunId);
21390
21594
  this.agenticAuthoringPrompt.set('');
21391
21595
  }
@@ -21403,6 +21607,9 @@ class DynamicPageBuilderComponent {
21403
21607
  }
21404
21608
  }
21405
21609
  }
21610
+ isGovernedReviewRepairQuickReply(contextHints) {
21611
+ return contextHints?.['kind'] === 'governed-review-repair';
21612
+ }
21406
21613
  agenticQuickReplyVisiblePrompt(reply, contextHints) {
21407
21614
  const prompt = (reply.prompt || '').trim();
21408
21615
  if (this.isGovernedConfirmationQuickReply(reply, contextHints)) {
@@ -22573,6 +22780,8 @@ class DynamicPageBuilderComponent {
22573
22780
  const flow = new PageBuilderAgenticAuthoringTurnFlow(this.agenticAuthoring, {
22574
22781
  targetApp: 'praxis-ui-angular',
22575
22782
  targetComponentId: 'praxis-dynamic-page-builder',
22783
+ currentRoute: () => this.pageIdentity?.routePath?.trim() || null,
22784
+ responseLocale: () => this.pageIdentity?.locale?.trim() || null,
22576
22785
  currentPage: () => this.currentPage(),
22577
22786
  selectedWidgetKey: () => this.resolveSelectedWidgetKey(),
22578
22787
  provider: () => this.agenticAuthoringProvider,
@@ -22671,15 +22880,28 @@ class DynamicPageBuilderComponent {
22671
22880
  };
22672
22881
  }
22673
22882
  async applyAgenticTurnState(state) {
22674
- const preview = state.preview ?? null;
22883
+ // A terminal turn state is the canonical end of processing. Clear the local
22884
+ // interaction flag before projecting preview/review so the shell never
22885
+ // renders terminal actions alongside a stale loading indicator.
22886
+ if (this.isAgenticTurnTerminalState(state)) {
22887
+ this.agenticAuthoringBusy.set(false);
22888
+ this.agenticAuthoringTerminalState.set(state.state);
22889
+ }
22890
+ const receivedPreview = state.preview ?? null;
22891
+ const preview = receivedPreview?.valid ? receivedPreview : null;
22892
+ const invalidPreviewError = receivedPreview
22893
+ && !receivedPreview.valid
22894
+ && (state.state === 'error' || state.quickReplies.length === 0)
22895
+ ? this.describeAgenticPreviewFailure(receivedPreview)
22896
+ : '';
22675
22897
  const handoff = this.resolveAgenticSharedRuleHandoff(state);
22676
22898
  const previousHandoff = this.agenticAuthoringSharedRuleHandoffState();
22677
22899
  this.agenticAuthoringConversation.set(state.messages);
22678
22900
  this.agenticAuthoringQuickReplies.set(state.quickReplies);
22679
- this.agenticAuthoringStatus.set(handoff && !preview?.valid
22901
+ this.agenticAuthoringStatus.set(handoff && !receivedPreview?.valid
22680
22902
  ? this.tx('agentic.status.sharedRuleHandoff', 'Continue este pedido na revisão da regra.')
22681
22903
  : state.statusText);
22682
- this.agenticAuthoringError.set(state.errorText);
22904
+ this.agenticAuthoringError.set(state.errorText || invalidPreviewError);
22683
22905
  this.agenticAuthoringPreviewResult.set(preview);
22684
22906
  this.agenticAuthoringSemanticDecision.set(this.resolveAgenticSemanticDecision(state.diagnostics));
22685
22907
  this.agenticAuthoringSemanticResourcePresentationLabel.set(this.resolveAgenticSemanticResourcePresentationLabel(state.diagnostics));
@@ -22891,7 +23113,11 @@ class DynamicPageBuilderComponent {
22891
23113
  return Object.keys(merged).length ? merged : undefined;
22892
23114
  }
22893
23115
  consumeAgenticTurn(states$, turnRunId) {
22894
- return firstValueFrom(states$.pipe(takeUntil(this.agenticTurnCancel$), concatMap((state) => {
23116
+ return firstValueFrom(states$.pipe(takeUntil(this.agenticTurnCancel$), tap((state) => {
23117
+ if (this.isCurrentAgenticTurn(turnRunId) && this.isAgenticTurnTerminalState(state)) {
23118
+ this.agenticAuthoringBusy.set(false);
23119
+ }
23120
+ }), concatMap((state) => {
22895
23121
  if (!this.isCurrentAgenticTurn(turnRunId)) {
22896
23122
  return of(state);
22897
23123
  }
@@ -23513,7 +23739,7 @@ class DynamicPageBuilderComponent {
23513
23739
  />
23514
23740
  }
23515
23741
 
23516
- @if (agenticAuthoringIncludeLlmDiagnostics && agenticAuthoringLlmDiagnosticsText()) {
23742
+ @if (agenticAuthoringIncludeLlmDiagnostics && agenticAuthoringDiagnosticsAvailable()) {
23517
23743
  <section
23518
23744
  class="agentic-diagnostics-panel"
23519
23745
  [class.agentic-diagnostics-panel--collapsed]="agenticAuthoringLlmDiagnosticsCollapsed()"
@@ -23545,7 +23771,61 @@ class DynamicPageBuilderComponent {
23545
23771
  <p class="agentic-diagnostics-panel__description">
23546
23772
  {{ tx('agentic.diagnostics.description', 'Informações usadas para explicar como o assistente chegou à resposta deste pedido.') }}
23547
23773
  </p>
23548
- <pre>{{ agenticAuthoringLlmDiagnosticsText() }}</pre>
23774
+ @if (agenticTurnHealth().started) {
23775
+ <section class="agentic-diagnostics-panel__health" data-testid="page-builder-agentic-turn-health">
23776
+ <h3>{{ tx('agentic.diagnostics.health.title', 'Assistant health') }}</h3>
23777
+ <p>{{ tx('agentic.diagnostics.health.description', 'Recent authoring turn reliability and response time.') }}</p>
23778
+ <dl class="agentic-diagnostics-panel__metrics">
23779
+ <div>
23780
+ <dt>{{ tx('agentic.diagnostics.health.successRate', 'Success') }}</dt>
23781
+ <dd data-testid="page-builder-agentic-health-success">{{ formatAgenticMetricPercent(agenticTurnHealth().successRate) }}</dd>
23782
+ </div>
23783
+ <div>
23784
+ <dt>{{ tx('agentic.diagnostics.health.timeoutRate', 'Timeouts') }}</dt>
23785
+ <dd data-testid="page-builder-agentic-health-timeout">{{ formatAgenticMetricPercent(agenticTurnHealth().timeoutRate) }}</dd>
23786
+ </div>
23787
+ <div>
23788
+ <dt>{{ tx('agentic.diagnostics.health.p50', 'Typical (P50)') }}</dt>
23789
+ <dd data-testid="page-builder-agentic-health-p50">{{ formatAgenticDuration(agenticTurnHealth().p50DurationMs) }}</dd>
23790
+ </div>
23791
+ <div>
23792
+ <dt>{{ tx('agentic.diagnostics.health.p95', 'Slow edge (P95)') }}</dt>
23793
+ <dd data-testid="page-builder-agentic-health-p95">{{ formatAgenticDuration(agenticTurnHealth().p95DurationMs) }}</dd>
23794
+ </div>
23795
+ </dl>
23796
+ @if (agenticTurnHealthBuckets().length) {
23797
+ <table class="agentic-diagnostics-panel__health-table" data-testid="page-builder-agentic-health-breakdown">
23798
+ <caption>{{ tx('agentic.diagnostics.health.breakdown', 'Provider and model breakdown') }}</caption>
23799
+ <thead>
23800
+ <tr>
23801
+ <th scope="col">{{ tx('agentic.diagnostics.health.dimension', 'Dimension') }}</th>
23802
+ <th scope="col">{{ tx('agentic.diagnostics.health.name', 'Name') }}</th>
23803
+ <th scope="col">{{ tx('agentic.diagnostics.health.successRate', 'Success') }}</th>
23804
+ <th scope="col">{{ tx('agentic.diagnostics.health.timeoutRate', 'Timeouts') }}</th>
23805
+ <th scope="col">P95</th>
23806
+ </tr>
23807
+ </thead>
23808
+ <tbody>
23809
+ @for (entry of agenticTurnHealthBuckets(); track entry.dimension + ':' + entry.bucket.key) {
23810
+ <tr>
23811
+ <td>{{ entry.dimension === 'provider' ? tx('agentic.diagnostics.health.provider', 'Provider') : tx('agentic.diagnostics.health.model', 'Model') }}</td>
23812
+ <th scope="row">{{ entry.bucket.key }}</th>
23813
+ <td>{{ formatAgenticMetricPercent(entry.bucket.successRate) }}</td>
23814
+ <td>{{ formatAgenticMetricPercent(entry.bucket.timeoutRate) }}</td>
23815
+ <td>{{ formatAgenticDuration(entry.bucket.p95DurationMs) }}</td>
23816
+ </tr>
23817
+ }
23818
+ </tbody>
23819
+ </table>
23820
+ }
23821
+ </section>
23822
+ }
23823
+ @if (agenticAuthoringLlmDiagnosticsText()) {
23824
+ <details class="agentic-diagnostics-panel__raw">
23825
+ <summary>{{ tx('agentic.diagnostics.raw', 'Turn details') }}</summary>
23826
+ <pre>{{ agenticAuthoringLlmDiagnosticsText() }}</pre>
23827
+ </details>
23828
+ }
23549
23829
  }
23550
23830
  </section>
23551
23831
  }
@@ -23882,7 +24162,7 @@ class DynamicPageBuilderComponent {
23882
24162
  }
23883
24163
  </praxis-floating-toolbar>
23884
24164
  </div>
23885
- `, isInline: true, styles: [":host{display:block;position:relative;min-height:var(--pdx-page-builder-min-height, 420px)}.builder-shell{display:block;position:relative;min-height:inherit;height:100%}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-premium-readiness{display:grid;grid-template-columns:minmax(220px,.72fr) minmax(0,1.28fr);gap:12px;width:100%;margin:0 0 14px;padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 72%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 10%,transparent),transparent 36%),color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 96%,transparent);color:var(--md-sys-color-on-surface, #1d1b20);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface, #1d1b20) 5%,transparent)}.builder-premium-readiness__header{display:flex;align-items:flex-start;gap:10px;min-width:0}.builder-premium-readiness__header strong{display:block;font-size:13px;line-height:1.25}.builder-premium-readiness__header p,.builder-premium-readiness__item p{margin:2px 0 0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;line-height:1.35}.builder-premium-readiness__icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1}.builder-premium-readiness__list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin:0;padding:0;list-style:none}.builder-premium-readiness__item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, #f7f2fa) 84%,transparent)}.builder-premium-readiness__item strong{display:block;font-size:12px;line-height:1.25}.builder-premium-readiness__action{appearance:none;display:inline-flex;align-items:center;justify-content:center;min-height:26px;margin-top:7px;padding:4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 34%,transparent);border-radius:7px;background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 9%,var(--md-sys-color-surface, #fff));color:var(--md-sys-color-primary, #6750a4);cursor:pointer;font:inherit;font-size:11px;font-weight:700;line-height:1.2;text-align:left}.builder-premium-readiness__severity{width:8px;height:8px;margin-top:4px;border-radius:999px;background:var(--md-sys-color-primary, #6750a4)}.builder-premium-readiness__item[data-severity=warning] .builder-premium-readiness__severity{background:var(--praxis-warning, #b26a00)}.builder-premium-readiness__item[data-severity=error] .builder-premium-readiness__severity{background:var(--md-sys-color-error, #b3261e)}@media(max-width:760px){.builder-premium-readiness{grid-template-columns:1fr}}.agentic-diagnostics-panel{position:absolute;z-index:21;right:16px;width:min(520px,calc(100% - 32px));max-height:min(440px,calc(100% - 32px));overflow:auto;padding:12px;border:1px solid rgba(107,114,128,.28);border-radius:8px;background:#fffffff5;color:#111827;box-shadow:0 14px 36px #0000003d}.agentic-diagnostics-panel--collapsed{width:min(280px,calc(100% - 32px));max-height:58px;overflow:hidden;padding:10px 12px;pointer-events:auto}.agentic-diagnostics-panel__header{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px;font-weight:700}.agentic-diagnostics-panel__header-actions{display:flex;align-items:center;gap:8px}.agentic-diagnostics-panel__badge{padding:2px 6px;border:1px solid rgba(107,114,128,.28);border-radius:8px;font-size:11px;font-weight:600;color:#4b5563}.agentic-diagnostics-panel__toggle,.shared-rule-cockpit__toggle{appearance:none;border:1px solid rgba(30,64,175,.18);border-radius:999px;background:#ffffffd6;color:#1e3a8a;cursor:pointer;font-size:11px;font-weight:700;line-height:1;padding:6px 9px;white-space:nowrap}.agentic-diagnostics-panel__description{margin:8px 0 10px;color:#4b5563;font-size:12px;line-height:1.4}.agentic-diagnostics-panel pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45;color:#1f2937}praxis-ai-assistant-shell{position:fixed;inset:0;z-index:140;pointer-events:none}@media(min-width:1100px){.builder-shell--agentic-review-rail{box-sizing:border-box;padding-right:464px}}.builder-shell__agentic-toggle{position:relative}.builder-shell__agentic-toggle--open,.builder-shell__agentic-toggle--minimized{outline:2px solid rgba(96,165,250,.52);outline-offset:2px}.builder-shell__agentic-toggle--minimized:after{content:\"\";position:absolute;top:6px;right:6px;width:8px;height:8px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#34d399}.builder-shell__connections-toggle--open{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 52%,transparent);outline-offset:2px}.builder-shell__connections-toggle{position:relative}.builder-shell__connections-toggle--recommended:not(.builder-shell__connections-toggle--open){outline:2px solid rgba(34,211,238,.48);outline-offset:2px}.builder-shell__connections-toggle-badge{position:absolute;top:5px;right:5px;width:9px;height:9px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#22d3ee;box-shadow:0 0 0 3px #22d3ee2e}.shared-rule-cockpit{position:absolute;z-index:120;left:16px;bottom:88px;width:min(720px,calc(100% - 32px));max-height:min(560px,calc(100vh - 140px));padding:14px;border:1px solid rgba(30,64,175,.22);border-radius:12px;background:linear-gradient(135deg,#eff6fffa,#fffbebf5);color:#172554;box-shadow:0 18px 46px #0f172a38;overflow:auto;overscroll-behavior:contain}.shared-rule-cockpit--collapsed{width:min(360px,calc(100% - 32px));max-height:72px;overflow:hidden;padding:10px 12px}.shared-rule-cockpit__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.shared-rule-cockpit__header-actions{display:flex;align-items:center;gap:8px}.shared-rule-cockpit__header div{display:grid;gap:2px}.shared-rule-cockpit__header strong{font-size:14px;line-height:1.2}.shared-rule-cockpit__header span{color:#475569;font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__badge{flex:0 0 auto;max-width:220px;padding:3px 8px;border:1px solid rgba(30,64,175,.2);border-radius:999px;background:#ffffffbd;color:#1e3a8a;font-size:11px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shared-rule-cockpit__description,.shared-rule-cockpit__status,.shared-rule-cockpit__error{margin:10px 0 0;color:#334155;font-size:12px;line-height:1.45}.shared-rule-cockpit__error{color:#991b1b;font-weight:600}.shared-rule-cockpit__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.shared-rule-cockpit__facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:12px 0 0}.shared-rule-cockpit__facts div{min-width:0;padding:8px;border-radius:10px;background:#ffffffb8}.shared-rule-cockpit__facts dt{color:#64748b;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.shared-rule-cockpit__facts dd{margin:4px 0 0;color:#0f172a;font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__enforcement-matrix{display:grid;gap:10px;margin-top:12px;padding:10px;border:1px solid rgba(30,64,175,.14);border-radius:12px;background:#ffffff94}.shared-rule-cockpit__matrix-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.shared-rule-cockpit__matrix-header div{display:grid;gap:2px}.shared-rule-cockpit__matrix-header strong{color:#0f172a;font-size:12px}.shared-rule-cockpit__matrix-header span,.shared-rule-cockpit__matrix-source{color:#475569;font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-badge{flex:0 0 auto;padding:3px 8px;border-radius:999px;background:#16a34a1f;color:#166534;font-weight:800;white-space:nowrap}.shared-rule-cockpit__projection-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.shared-rule-cockpit__projection{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid rgba(15,23,42,.08);border-radius:11px;background:#f8fafcd1}.shared-rule-cockpit__projection[data-status=ready]{border-color:#16a34a33;background:#f0fdf4d1}.shared-rule-cockpit__projection span{color:#1d4ed8;font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;overflow-wrap:anywhere}.shared-rule-cockpit__projection strong{color:#0f172a;font-size:12px}.shared-rule-cockpit__projection small,.shared-rule-cockpit__projection em{color:#475569;font-size:11px;font-style:normal;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-source{margin:0}.shared-rule-cockpit__timeline{display:grid;gap:8px;max-height:190px;margin:12px 0 0;padding:0;overflow:auto;list-style:none}.shared-rule-cockpit__timeline-item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;padding:10px;border:1px solid rgba(30,64,175,.12);border-radius:12px;background:#ffffffc2}.shared-rule-cockpit__timeline-icon{display:grid;width:24px;height:24px;place-items:center;border-radius:999px;background:#1e40af1a;color:#1e3a8a;font-family:Material Icons;font-size:16px;line-height:1}.shared-rule-cockpit__timeline-item strong{color:#0f172a;font-size:12px;line-height:1.35}.shared-rule-cockpit__timeline-item p,.shared-rule-cockpit__timeline-item small,.shared-rule-cockpit__timeline-item time,.shared-rule-cockpit__timeline-empty{display:block;margin:3px 0 0;color:#475569;font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__timeline-badge{display:inline-flex;margin-left:6px;padding:2px 6px;border-radius:999px;background:#0ea5e91f;color:#075985;font-size:10px;font-weight:700}.shared-rule-cockpit__timeline-empty{padding:10px;border-radius:12px;background:#ffffffa3}@media(max-width:720px){.shared-rule-cockpit{bottom:72px;max-height:calc(100vh - 112px)}.shared-rule-cockpit__facts,.shared-rule-cockpit__projection-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: DynamicWidgetPageComponent, selector: "praxis-dynamic-page", inputs: ["page", "context", "strictValidation", "enableCustomization", "showPageSettingsButton", "shellEditorComponent", "pageEditorComponent", "autoPersist", "pageIdentity", "componentInstanceId", "showWidgetAssistantButton"], outputs: ["pageChange", "widgetEvent", "widgetSelectionChange", "widgetAssistantRequested", "widgetDiagnosticsChange"] }, { kind: "component", type: FloatingToolbarComponent, selector: "praxis-floating-toolbar", inputs: ["visible", "canUndo", "canRedo", "showSave", "showPreview", "editingEnabled", "previewActive", "connectionMode", "modeLabel", "previewLabel", "exitPreviewLabel"], outputs: ["add", "undo", "redo", "settings", "preview", "save"] }, { kind: "component", type: ConnectionEditorComponent, selector: "praxis-connection-editor", inputs: ["open", "page"], outputs: ["pageChange", "focusWidget", "openPageSettings", "close"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }] });
24165
+ `, isInline: true, styles: [":host{display:block;position:relative;min-height:var(--pdx-page-builder-min-height, 420px)}.builder-shell{display:block;position:relative;min-height:inherit;height:100%}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-premium-readiness{display:grid;grid-template-columns:minmax(220px,.72fr) minmax(0,1.28fr);gap:12px;width:100%;margin:0 0 14px;padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 72%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 10%,transparent),transparent 36%),color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 96%,transparent);color:var(--md-sys-color-on-surface, #1d1b20);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface, #1d1b20) 5%,transparent)}.builder-premium-readiness__header{display:flex;align-items:flex-start;gap:10px;min-width:0}.builder-premium-readiness__header strong{display:block;font-size:13px;line-height:1.25}.builder-premium-readiness__header p,.builder-premium-readiness__item p{margin:2px 0 0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;line-height:1.35}.builder-premium-readiness__icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1}.builder-premium-readiness__list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin:0;padding:0;list-style:none}.builder-premium-readiness__item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, #f7f2fa) 84%,transparent)}.builder-premium-readiness__item strong{display:block;font-size:12px;line-height:1.25}.builder-premium-readiness__action{appearance:none;display:inline-flex;align-items:center;justify-content:center;min-height:26px;margin-top:7px;padding:4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 34%,transparent);border-radius:7px;background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 9%,var(--md-sys-color-surface, #fff));color:var(--md-sys-color-primary, #6750a4);cursor:pointer;font:inherit;font-size:11px;font-weight:700;line-height:1.2;text-align:left}.builder-premium-readiness__severity{width:8px;height:8px;margin-top:4px;border-radius:999px;background:var(--md-sys-color-primary, #6750a4)}.builder-premium-readiness__item[data-severity=warning] .builder-premium-readiness__severity{background:var(--praxis-warning, #b26a00)}.builder-premium-readiness__item[data-severity=error] .builder-premium-readiness__severity{background:var(--md-sys-color-error, #b3261e)}@media(max-width:760px){.builder-premium-readiness{grid-template-columns:1fr}}.agentic-diagnostics-panel{position:absolute;z-index:21;right:16px;width:min(520px,calc(100% - 32px));max-height:min(440px,calc(100% - 32px));overflow:auto;padding:12px;border:1px solid rgba(107,114,128,.28);border-radius:8px;background:#fffffff5;color:#111827;box-shadow:0 14px 36px #0000003d}.agentic-diagnostics-panel--collapsed{width:min(280px,calc(100% - 32px));max-height:58px;overflow:hidden;padding:10px 12px;pointer-events:auto}.agentic-diagnostics-panel__header{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px;font-weight:700}.agentic-diagnostics-panel__header-actions{display:flex;align-items:center;gap:8px}.agentic-diagnostics-panel__badge{padding:2px 6px;border:1px solid rgba(107,114,128,.28);border-radius:8px;font-size:11px;font-weight:600;color:#4b5563}.agentic-diagnostics-panel__toggle,.shared-rule-cockpit__toggle{appearance:none;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 84%,transparent);color:var(--md-sys-color-primary);cursor:pointer;font-size:11px;font-weight:700;line-height:1;padding:6px 9px;white-space:nowrap}.agentic-diagnostics-panel__description{margin:8px 0 10px;color:#4b5563;font-size:12px;line-height:1.4}.agentic-diagnostics-panel pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45;color:#1f2937}.agentic-diagnostics-panel__health{display:grid;gap:8px;margin-bottom:12px}.agentic-diagnostics-panel__health h3,.agentic-diagnostics-panel__health p{margin:0}.agentic-diagnostics-panel__health h3{font-size:13px}.agentic-diagnostics-panel__health p{color:#4b5563;font-size:11px}.agentic-diagnostics-panel__metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:0}.agentic-diagnostics-panel__metrics div{padding:8px;border-radius:8px;background:#f3f4f6}.agentic-diagnostics-panel__metrics dt{color:#4b5563;font-size:10px}.agentic-diagnostics-panel__metrics dd{margin:3px 0 0;font-size:14px;font-weight:700}.agentic-diagnostics-panel__health-table{width:100%;border-collapse:collapse;font-size:10px}.agentic-diagnostics-panel__health-table caption{margin-bottom:4px;text-align:left;font-weight:700}.agentic-diagnostics-panel__health-table th,.agentic-diagnostics-panel__health-table td{padding:5px 4px;border-bottom:1px solid #e5e7eb;text-align:left}.agentic-diagnostics-panel__raw summary{margin-bottom:8px;cursor:pointer;font-size:11px;font-weight:700}@media(max-width:520px){.agentic-diagnostics-panel__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}praxis-ai-assistant-shell{position:fixed;inset:0;z-index:140;pointer-events:none}@media(min-width:1100px){.builder-shell--agentic-review-rail{box-sizing:border-box;padding-right:464px}}.builder-shell__agentic-toggle{position:relative}.builder-shell__agentic-toggle--open,.builder-shell__agentic-toggle--minimized{outline:2px solid rgba(96,165,250,.52);outline-offset:2px}.builder-shell__agentic-toggle--minimized:after{content:\"\";position:absolute;top:6px;right:6px;width:8px;height:8px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#34d399}.builder-shell__connections-toggle--open{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 52%,transparent);outline-offset:2px}.builder-shell__connections-toggle{position:relative}.builder-shell__connections-toggle--recommended:not(.builder-shell__connections-toggle--open){outline:2px solid rgba(34,211,238,.48);outline-offset:2px}.builder-shell__connections-toggle-badge{position:absolute;top:5px;right:5px;width:9px;height:9px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#22d3ee;box-shadow:0 0 0 3px #22d3ee2e}.shared-rule-cockpit{position:absolute;z-index:120;left:16px;bottom:88px;width:min(720px,calc(100% - 32px));max-height:min(560px,calc(100vh - 140px));padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,var(--md-sys-color-surface-container-high) 76%),color-mix(in srgb,var(--md-sys-color-tertiary-container) 18%,var(--md-sys-color-surface-container) 82%));color:var(--md-sys-color-on-surface);box-shadow:0 18px 46px color-mix(in srgb,var(--md-sys-color-shadow, #000) 24%,transparent);overflow:auto;overscroll-behavior:contain}.shared-rule-cockpit--collapsed{width:min(360px,calc(100% - 32px));max-height:72px;overflow:hidden;padding:10px 12px}.shared-rule-cockpit__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.shared-rule-cockpit__header-actions{display:flex;align-items:center;gap:8px}.shared-rule-cockpit__header div{display:grid;gap:2px}.shared-rule-cockpit__header strong{font-size:14px;line-height:1.2}.shared-rule-cockpit__header span{color:var(--md-sys-color-on-surface-variant);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__badge{flex:0 0 auto;max-width:220px;padding:3px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 74%,transparent);color:var(--md-sys-color-primary);font-size:11px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shared-rule-cockpit__description,.shared-rule-cockpit__status,.shared-rule-cockpit__error{margin:10px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.shared-rule-cockpit__error{color:var(--md-sys-color-error);font-weight:600}.shared-rule-cockpit__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.shared-rule-cockpit__facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:12px 0 0}.shared-rule-cockpit__facts div{min-width:0;padding:8px;border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 72%,transparent)}.shared-rule-cockpit__facts dt{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.shared-rule-cockpit__facts dd{margin:4px 0 0;color:var(--md-sys-color-on-surface);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__enforcement-matrix{display:grid;gap:10px;margin-top:12px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 58%,transparent)}.shared-rule-cockpit__matrix-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.shared-rule-cockpit__matrix-header div{display:grid;gap:2px}.shared-rule-cockpit__matrix-header strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__matrix-header span,.shared-rule-cockpit__matrix-source{color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-badge{flex:0 0 auto;padding:3px 8px;border-radius:999px;background:#16a34a1f;color:#166534;font-weight:800;white-space:nowrap}.shared-rule-cockpit__projection-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.shared-rule-cockpit__projection{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 52%,transparent);border-radius:11px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent)}.shared-rule-cockpit__projection[data-status=ready]{border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 24%,transparent);background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 32%,var(--md-sys-color-surface-container-low) 68%)}.shared-rule-cockpit__projection span{color:var(--md-sys-color-primary);font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;overflow-wrap:anywhere}.shared-rule-cockpit__projection strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__projection small,.shared-rule-cockpit__projection em{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-style:normal;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-source{margin:0}.shared-rule-cockpit__timeline{display:grid;gap:8px;max-height:190px;margin:12px 0 0;padding:0;overflow:auto;list-style:none}.shared-rule-cockpit__timeline-item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 76%,transparent)}.shared-rule-cockpit__timeline-icon{display:grid;width:24px;height:24px;place-items:center;border-radius:999px;background:#1e40af1a;color:var(--md-sys-color-primary);font-family:Material Icons;font-size:16px;line-height:1}.shared-rule-cockpit__timeline-item strong{color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.35}.shared-rule-cockpit__timeline-item p,.shared-rule-cockpit__timeline-item small,.shared-rule-cockpit__timeline-item time,.shared-rule-cockpit__timeline-empty{display:block;margin:3px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__timeline-badge{display:inline-flex;margin-left:6px;padding:2px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-secondary-container) 42%,transparent);color:var(--md-sys-color-on-secondary-container);font-size:10px;font-weight:700}.shared-rule-cockpit__timeline-empty{padding:10px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 64%,transparent)}@media(max-width:720px){.shared-rule-cockpit{bottom:72px;max-height:calc(100vh - 112px)}.shared-rule-cockpit__facts,.shared-rule-cockpit__projection-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: DynamicWidgetPageComponent, selector: "praxis-dynamic-page", inputs: ["page", "context", "strictValidation", "enableCustomization", "showPageSettingsButton", "shellEditorComponent", "pageEditorComponent", "autoPersist", "pageIdentity", "componentInstanceId", "showWidgetAssistantButton"], outputs: ["pageChange", "widgetEvent", "widgetSelectionChange", "widgetAssistantRequested", "widgetDiagnosticsChange"] }, { kind: "component", type: FloatingToolbarComponent, selector: "praxis-floating-toolbar", inputs: ["visible", "canUndo", "canRedo", "showSave", "showPreview", "editingEnabled", "previewActive", "connectionMode", "modeLabel", "previewLabel", "exitPreviewLabel"], outputs: ["add", "undo", "redo", "settings", "preview", "save"] }, { kind: "component", type: ConnectionEditorComponent, selector: "praxis-connection-editor", inputs: ["open", "page"], outputs: ["pageChange", "focusWidget", "openPageSettings", "close"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }] });
23886
24166
  }
23887
24167
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicPageBuilderComponent, decorators: [{
23888
24168
  type: Component,
@@ -24013,7 +24293,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
24013
24293
  />
24014
24294
  }
24015
24295
 
24016
- @if (agenticAuthoringIncludeLlmDiagnostics && agenticAuthoringLlmDiagnosticsText()) {
24296
+ @if (agenticAuthoringIncludeLlmDiagnostics && agenticAuthoringDiagnosticsAvailable()) {
24017
24297
  <section
24018
24298
  class="agentic-diagnostics-panel"
24019
24299
  [class.agentic-diagnostics-panel--collapsed]="agenticAuthoringLlmDiagnosticsCollapsed()"
@@ -24045,7 +24325,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
24045
24325
  <p class="agentic-diagnostics-panel__description">
24046
24326
  {{ tx('agentic.diagnostics.description', 'Informações usadas para explicar como o assistente chegou à resposta deste pedido.') }}
24047
24327
  </p>
24048
- <pre>{{ agenticAuthoringLlmDiagnosticsText() }}</pre>
24328
+ @if (agenticTurnHealth().started) {
24329
+ <section class="agentic-diagnostics-panel__health" data-testid="page-builder-agentic-turn-health">
24330
+ <h3>{{ tx('agentic.diagnostics.health.title', 'Assistant health') }}</h3>
24331
+ <p>{{ tx('agentic.diagnostics.health.description', 'Recent authoring turn reliability and response time.') }}</p>
24332
+ <dl class="agentic-diagnostics-panel__metrics">
24333
+ <div>
24334
+ <dt>{{ tx('agentic.diagnostics.health.successRate', 'Success') }}</dt>
24335
+ <dd data-testid="page-builder-agentic-health-success">{{ formatAgenticMetricPercent(agenticTurnHealth().successRate) }}</dd>
24336
+ </div>
24337
+ <div>
24338
+ <dt>{{ tx('agentic.diagnostics.health.timeoutRate', 'Timeouts') }}</dt>
24339
+ <dd data-testid="page-builder-agentic-health-timeout">{{ formatAgenticMetricPercent(agenticTurnHealth().timeoutRate) }}</dd>
24340
+ </div>
24341
+ <div>
24342
+ <dt>{{ tx('agentic.diagnostics.health.p50', 'Typical (P50)') }}</dt>
24343
+ <dd data-testid="page-builder-agentic-health-p50">{{ formatAgenticDuration(agenticTurnHealth().p50DurationMs) }}</dd>
24344
+ </div>
24345
+ <div>
24346
+ <dt>{{ tx('agentic.diagnostics.health.p95', 'Slow edge (P95)') }}</dt>
24347
+ <dd data-testid="page-builder-agentic-health-p95">{{ formatAgenticDuration(agenticTurnHealth().p95DurationMs) }}</dd>
24348
+ </div>
24349
+ </dl>
24350
+ @if (agenticTurnHealthBuckets().length) {
24351
+ <table class="agentic-diagnostics-panel__health-table" data-testid="page-builder-agentic-health-breakdown">
24352
+ <caption>{{ tx('agentic.diagnostics.health.breakdown', 'Provider and model breakdown') }}</caption>
24353
+ <thead>
24354
+ <tr>
24355
+ <th scope="col">{{ tx('agentic.diagnostics.health.dimension', 'Dimension') }}</th>
24356
+ <th scope="col">{{ tx('agentic.diagnostics.health.name', 'Name') }}</th>
24357
+ <th scope="col">{{ tx('agentic.diagnostics.health.successRate', 'Success') }}</th>
24358
+ <th scope="col">{{ tx('agentic.diagnostics.health.timeoutRate', 'Timeouts') }}</th>
24359
+ <th scope="col">P95</th>
24360
+ </tr>
24361
+ </thead>
24362
+ <tbody>
24363
+ @for (entry of agenticTurnHealthBuckets(); track entry.dimension + ':' + entry.bucket.key) {
24364
+ <tr>
24365
+ <td>{{ entry.dimension === 'provider' ? tx('agentic.diagnostics.health.provider', 'Provider') : tx('agentic.diagnostics.health.model', 'Model') }}</td>
24366
+ <th scope="row">{{ entry.bucket.key }}</th>
24367
+ <td>{{ formatAgenticMetricPercent(entry.bucket.successRate) }}</td>
24368
+ <td>{{ formatAgenticMetricPercent(entry.bucket.timeoutRate) }}</td>
24369
+ <td>{{ formatAgenticDuration(entry.bucket.p95DurationMs) }}</td>
24370
+ </tr>
24371
+ }
24372
+ </tbody>
24373
+ </table>
24374
+ }
24375
+ </section>
24376
+ }
24377
+ @if (agenticAuthoringLlmDiagnosticsText()) {
24378
+ <details class="agentic-diagnostics-panel__raw">
24379
+ <summary>{{ tx('agentic.diagnostics.raw', 'Turn details') }}</summary>
24380
+ <pre>{{ agenticAuthoringLlmDiagnosticsText() }}</pre>
24381
+ </details>
24382
+ }
24049
24383
  }
24050
24384
  </section>
24051
24385
  }
@@ -24382,7 +24716,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
24382
24716
  }
24383
24717
  </praxis-floating-toolbar>
24384
24718
  </div>
24385
- `, styles: [":host{display:block;position:relative;min-height:var(--pdx-page-builder-min-height, 420px)}.builder-shell{display:block;position:relative;min-height:inherit;height:100%}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-premium-readiness{display:grid;grid-template-columns:minmax(220px,.72fr) minmax(0,1.28fr);gap:12px;width:100%;margin:0 0 14px;padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 72%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 10%,transparent),transparent 36%),color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 96%,transparent);color:var(--md-sys-color-on-surface, #1d1b20);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface, #1d1b20) 5%,transparent)}.builder-premium-readiness__header{display:flex;align-items:flex-start;gap:10px;min-width:0}.builder-premium-readiness__header strong{display:block;font-size:13px;line-height:1.25}.builder-premium-readiness__header p,.builder-premium-readiness__item p{margin:2px 0 0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;line-height:1.35}.builder-premium-readiness__icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1}.builder-premium-readiness__list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin:0;padding:0;list-style:none}.builder-premium-readiness__item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, #f7f2fa) 84%,transparent)}.builder-premium-readiness__item strong{display:block;font-size:12px;line-height:1.25}.builder-premium-readiness__action{appearance:none;display:inline-flex;align-items:center;justify-content:center;min-height:26px;margin-top:7px;padding:4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 34%,transparent);border-radius:7px;background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 9%,var(--md-sys-color-surface, #fff));color:var(--md-sys-color-primary, #6750a4);cursor:pointer;font:inherit;font-size:11px;font-weight:700;line-height:1.2;text-align:left}.builder-premium-readiness__severity{width:8px;height:8px;margin-top:4px;border-radius:999px;background:var(--md-sys-color-primary, #6750a4)}.builder-premium-readiness__item[data-severity=warning] .builder-premium-readiness__severity{background:var(--praxis-warning, #b26a00)}.builder-premium-readiness__item[data-severity=error] .builder-premium-readiness__severity{background:var(--md-sys-color-error, #b3261e)}@media(max-width:760px){.builder-premium-readiness{grid-template-columns:1fr}}.agentic-diagnostics-panel{position:absolute;z-index:21;right:16px;width:min(520px,calc(100% - 32px));max-height:min(440px,calc(100% - 32px));overflow:auto;padding:12px;border:1px solid rgba(107,114,128,.28);border-radius:8px;background:#fffffff5;color:#111827;box-shadow:0 14px 36px #0000003d}.agentic-diagnostics-panel--collapsed{width:min(280px,calc(100% - 32px));max-height:58px;overflow:hidden;padding:10px 12px;pointer-events:auto}.agentic-diagnostics-panel__header{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px;font-weight:700}.agentic-diagnostics-panel__header-actions{display:flex;align-items:center;gap:8px}.agentic-diagnostics-panel__badge{padding:2px 6px;border:1px solid rgba(107,114,128,.28);border-radius:8px;font-size:11px;font-weight:600;color:#4b5563}.agentic-diagnostics-panel__toggle,.shared-rule-cockpit__toggle{appearance:none;border:1px solid rgba(30,64,175,.18);border-radius:999px;background:#ffffffd6;color:#1e3a8a;cursor:pointer;font-size:11px;font-weight:700;line-height:1;padding:6px 9px;white-space:nowrap}.agentic-diagnostics-panel__description{margin:8px 0 10px;color:#4b5563;font-size:12px;line-height:1.4}.agentic-diagnostics-panel pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45;color:#1f2937}praxis-ai-assistant-shell{position:fixed;inset:0;z-index:140;pointer-events:none}@media(min-width:1100px){.builder-shell--agentic-review-rail{box-sizing:border-box;padding-right:464px}}.builder-shell__agentic-toggle{position:relative}.builder-shell__agentic-toggle--open,.builder-shell__agentic-toggle--minimized{outline:2px solid rgba(96,165,250,.52);outline-offset:2px}.builder-shell__agentic-toggle--minimized:after{content:\"\";position:absolute;top:6px;right:6px;width:8px;height:8px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#34d399}.builder-shell__connections-toggle--open{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 52%,transparent);outline-offset:2px}.builder-shell__connections-toggle{position:relative}.builder-shell__connections-toggle--recommended:not(.builder-shell__connections-toggle--open){outline:2px solid rgba(34,211,238,.48);outline-offset:2px}.builder-shell__connections-toggle-badge{position:absolute;top:5px;right:5px;width:9px;height:9px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#22d3ee;box-shadow:0 0 0 3px #22d3ee2e}.shared-rule-cockpit{position:absolute;z-index:120;left:16px;bottom:88px;width:min(720px,calc(100% - 32px));max-height:min(560px,calc(100vh - 140px));padding:14px;border:1px solid rgba(30,64,175,.22);border-radius:12px;background:linear-gradient(135deg,#eff6fffa,#fffbebf5);color:#172554;box-shadow:0 18px 46px #0f172a38;overflow:auto;overscroll-behavior:contain}.shared-rule-cockpit--collapsed{width:min(360px,calc(100% - 32px));max-height:72px;overflow:hidden;padding:10px 12px}.shared-rule-cockpit__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.shared-rule-cockpit__header-actions{display:flex;align-items:center;gap:8px}.shared-rule-cockpit__header div{display:grid;gap:2px}.shared-rule-cockpit__header strong{font-size:14px;line-height:1.2}.shared-rule-cockpit__header span{color:#475569;font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__badge{flex:0 0 auto;max-width:220px;padding:3px 8px;border:1px solid rgba(30,64,175,.2);border-radius:999px;background:#ffffffbd;color:#1e3a8a;font-size:11px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shared-rule-cockpit__description,.shared-rule-cockpit__status,.shared-rule-cockpit__error{margin:10px 0 0;color:#334155;font-size:12px;line-height:1.45}.shared-rule-cockpit__error{color:#991b1b;font-weight:600}.shared-rule-cockpit__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.shared-rule-cockpit__facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:12px 0 0}.shared-rule-cockpit__facts div{min-width:0;padding:8px;border-radius:10px;background:#ffffffb8}.shared-rule-cockpit__facts dt{color:#64748b;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.shared-rule-cockpit__facts dd{margin:4px 0 0;color:#0f172a;font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__enforcement-matrix{display:grid;gap:10px;margin-top:12px;padding:10px;border:1px solid rgba(30,64,175,.14);border-radius:12px;background:#ffffff94}.shared-rule-cockpit__matrix-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.shared-rule-cockpit__matrix-header div{display:grid;gap:2px}.shared-rule-cockpit__matrix-header strong{color:#0f172a;font-size:12px}.shared-rule-cockpit__matrix-header span,.shared-rule-cockpit__matrix-source{color:#475569;font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-badge{flex:0 0 auto;padding:3px 8px;border-radius:999px;background:#16a34a1f;color:#166534;font-weight:800;white-space:nowrap}.shared-rule-cockpit__projection-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.shared-rule-cockpit__projection{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid rgba(15,23,42,.08);border-radius:11px;background:#f8fafcd1}.shared-rule-cockpit__projection[data-status=ready]{border-color:#16a34a33;background:#f0fdf4d1}.shared-rule-cockpit__projection span{color:#1d4ed8;font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;overflow-wrap:anywhere}.shared-rule-cockpit__projection strong{color:#0f172a;font-size:12px}.shared-rule-cockpit__projection small,.shared-rule-cockpit__projection em{color:#475569;font-size:11px;font-style:normal;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-source{margin:0}.shared-rule-cockpit__timeline{display:grid;gap:8px;max-height:190px;margin:12px 0 0;padding:0;overflow:auto;list-style:none}.shared-rule-cockpit__timeline-item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;padding:10px;border:1px solid rgba(30,64,175,.12);border-radius:12px;background:#ffffffc2}.shared-rule-cockpit__timeline-icon{display:grid;width:24px;height:24px;place-items:center;border-radius:999px;background:#1e40af1a;color:#1e3a8a;font-family:Material Icons;font-size:16px;line-height:1}.shared-rule-cockpit__timeline-item strong{color:#0f172a;font-size:12px;line-height:1.35}.shared-rule-cockpit__timeline-item p,.shared-rule-cockpit__timeline-item small,.shared-rule-cockpit__timeline-item time,.shared-rule-cockpit__timeline-empty{display:block;margin:3px 0 0;color:#475569;font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__timeline-badge{display:inline-flex;margin-left:6px;padding:2px 6px;border-radius:999px;background:#0ea5e91f;color:#075985;font-size:10px;font-weight:700}.shared-rule-cockpit__timeline-empty{padding:10px;border-radius:12px;background:#ffffffa3}@media(max-width:720px){.shared-rule-cockpit{bottom:72px;max-height:calc(100vh - 112px)}.shared-rule-cockpit__facts,.shared-rule-cockpit__projection-grid{grid-template-columns:1fr}}\n"] }]
24719
+ `, styles: [":host{display:block;position:relative;min-height:var(--pdx-page-builder-min-height, 420px)}.builder-shell{display:block;position:relative;min-height:inherit;height:100%}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-premium-readiness{display:grid;grid-template-columns:minmax(220px,.72fr) minmax(0,1.28fr);gap:12px;width:100%;margin:0 0 14px;padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 72%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 10%,transparent),transparent 36%),color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 96%,transparent);color:var(--md-sys-color-on-surface, #1d1b20);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface, #1d1b20) 5%,transparent)}.builder-premium-readiness__header{display:flex;align-items:flex-start;gap:10px;min-width:0}.builder-premium-readiness__header strong{display:block;font-size:13px;line-height:1.25}.builder-premium-readiness__header p,.builder-premium-readiness__item p{margin:2px 0 0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;line-height:1.35}.builder-premium-readiness__icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1}.builder-premium-readiness__list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin:0;padding:0;list-style:none}.builder-premium-readiness__item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, #f7f2fa) 84%,transparent)}.builder-premium-readiness__item strong{display:block;font-size:12px;line-height:1.25}.builder-premium-readiness__action{appearance:none;display:inline-flex;align-items:center;justify-content:center;min-height:26px;margin-top:7px;padding:4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 34%,transparent);border-radius:7px;background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 9%,var(--md-sys-color-surface, #fff));color:var(--md-sys-color-primary, #6750a4);cursor:pointer;font:inherit;font-size:11px;font-weight:700;line-height:1.2;text-align:left}.builder-premium-readiness__severity{width:8px;height:8px;margin-top:4px;border-radius:999px;background:var(--md-sys-color-primary, #6750a4)}.builder-premium-readiness__item[data-severity=warning] .builder-premium-readiness__severity{background:var(--praxis-warning, #b26a00)}.builder-premium-readiness__item[data-severity=error] .builder-premium-readiness__severity{background:var(--md-sys-color-error, #b3261e)}@media(max-width:760px){.builder-premium-readiness{grid-template-columns:1fr}}.agentic-diagnostics-panel{position:absolute;z-index:21;right:16px;width:min(520px,calc(100% - 32px));max-height:min(440px,calc(100% - 32px));overflow:auto;padding:12px;border:1px solid rgba(107,114,128,.28);border-radius:8px;background:#fffffff5;color:#111827;box-shadow:0 14px 36px #0000003d}.agentic-diagnostics-panel--collapsed{width:min(280px,calc(100% - 32px));max-height:58px;overflow:hidden;padding:10px 12px;pointer-events:auto}.agentic-diagnostics-panel__header{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px;font-weight:700}.agentic-diagnostics-panel__header-actions{display:flex;align-items:center;gap:8px}.agentic-diagnostics-panel__badge{padding:2px 6px;border:1px solid rgba(107,114,128,.28);border-radius:8px;font-size:11px;font-weight:600;color:#4b5563}.agentic-diagnostics-panel__toggle,.shared-rule-cockpit__toggle{appearance:none;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 84%,transparent);color:var(--md-sys-color-primary);cursor:pointer;font-size:11px;font-weight:700;line-height:1;padding:6px 9px;white-space:nowrap}.agentic-diagnostics-panel__description{margin:8px 0 10px;color:#4b5563;font-size:12px;line-height:1.4}.agentic-diagnostics-panel pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45;color:#1f2937}.agentic-diagnostics-panel__health{display:grid;gap:8px;margin-bottom:12px}.agentic-diagnostics-panel__health h3,.agentic-diagnostics-panel__health p{margin:0}.agentic-diagnostics-panel__health h3{font-size:13px}.agentic-diagnostics-panel__health p{color:#4b5563;font-size:11px}.agentic-diagnostics-panel__metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:0}.agentic-diagnostics-panel__metrics div{padding:8px;border-radius:8px;background:#f3f4f6}.agentic-diagnostics-panel__metrics dt{color:#4b5563;font-size:10px}.agentic-diagnostics-panel__metrics dd{margin:3px 0 0;font-size:14px;font-weight:700}.agentic-diagnostics-panel__health-table{width:100%;border-collapse:collapse;font-size:10px}.agentic-diagnostics-panel__health-table caption{margin-bottom:4px;text-align:left;font-weight:700}.agentic-diagnostics-panel__health-table th,.agentic-diagnostics-panel__health-table td{padding:5px 4px;border-bottom:1px solid #e5e7eb;text-align:left}.agentic-diagnostics-panel__raw summary{margin-bottom:8px;cursor:pointer;font-size:11px;font-weight:700}@media(max-width:520px){.agentic-diagnostics-panel__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}praxis-ai-assistant-shell{position:fixed;inset:0;z-index:140;pointer-events:none}@media(min-width:1100px){.builder-shell--agentic-review-rail{box-sizing:border-box;padding-right:464px}}.builder-shell__agentic-toggle{position:relative}.builder-shell__agentic-toggle--open,.builder-shell__agentic-toggle--minimized{outline:2px solid rgba(96,165,250,.52);outline-offset:2px}.builder-shell__agentic-toggle--minimized:after{content:\"\";position:absolute;top:6px;right:6px;width:8px;height:8px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#34d399}.builder-shell__connections-toggle--open{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 52%,transparent);outline-offset:2px}.builder-shell__connections-toggle{position:relative}.builder-shell__connections-toggle--recommended:not(.builder-shell__connections-toggle--open){outline:2px solid rgba(34,211,238,.48);outline-offset:2px}.builder-shell__connections-toggle-badge{position:absolute;top:5px;right:5px;width:9px;height:9px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#22d3ee;box-shadow:0 0 0 3px #22d3ee2e}.shared-rule-cockpit{position:absolute;z-index:120;left:16px;bottom:88px;width:min(720px,calc(100% - 32px));max-height:min(560px,calc(100vh - 140px));padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,var(--md-sys-color-surface-container-high) 76%),color-mix(in srgb,var(--md-sys-color-tertiary-container) 18%,var(--md-sys-color-surface-container) 82%));color:var(--md-sys-color-on-surface);box-shadow:0 18px 46px color-mix(in srgb,var(--md-sys-color-shadow, #000) 24%,transparent);overflow:auto;overscroll-behavior:contain}.shared-rule-cockpit--collapsed{width:min(360px,calc(100% - 32px));max-height:72px;overflow:hidden;padding:10px 12px}.shared-rule-cockpit__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.shared-rule-cockpit__header-actions{display:flex;align-items:center;gap:8px}.shared-rule-cockpit__header div{display:grid;gap:2px}.shared-rule-cockpit__header strong{font-size:14px;line-height:1.2}.shared-rule-cockpit__header span{color:var(--md-sys-color-on-surface-variant);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__badge{flex:0 0 auto;max-width:220px;padding:3px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 74%,transparent);color:var(--md-sys-color-primary);font-size:11px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shared-rule-cockpit__description,.shared-rule-cockpit__status,.shared-rule-cockpit__error{margin:10px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.shared-rule-cockpit__error{color:var(--md-sys-color-error);font-weight:600}.shared-rule-cockpit__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.shared-rule-cockpit__facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:12px 0 0}.shared-rule-cockpit__facts div{min-width:0;padding:8px;border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 72%,transparent)}.shared-rule-cockpit__facts dt{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.shared-rule-cockpit__facts dd{margin:4px 0 0;color:var(--md-sys-color-on-surface);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__enforcement-matrix{display:grid;gap:10px;margin-top:12px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 58%,transparent)}.shared-rule-cockpit__matrix-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.shared-rule-cockpit__matrix-header div{display:grid;gap:2px}.shared-rule-cockpit__matrix-header strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__matrix-header span,.shared-rule-cockpit__matrix-source{color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-badge{flex:0 0 auto;padding:3px 8px;border-radius:999px;background:#16a34a1f;color:#166534;font-weight:800;white-space:nowrap}.shared-rule-cockpit__projection-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.shared-rule-cockpit__projection{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 52%,transparent);border-radius:11px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent)}.shared-rule-cockpit__projection[data-status=ready]{border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 24%,transparent);background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 32%,var(--md-sys-color-surface-container-low) 68%)}.shared-rule-cockpit__projection span{color:var(--md-sys-color-primary);font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;overflow-wrap:anywhere}.shared-rule-cockpit__projection strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__projection small,.shared-rule-cockpit__projection em{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-style:normal;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-source{margin:0}.shared-rule-cockpit__timeline{display:grid;gap:8px;max-height:190px;margin:12px 0 0;padding:0;overflow:auto;list-style:none}.shared-rule-cockpit__timeline-item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 76%,transparent)}.shared-rule-cockpit__timeline-icon{display:grid;width:24px;height:24px;place-items:center;border-radius:999px;background:#1e40af1a;color:var(--md-sys-color-primary);font-family:Material Icons;font-size:16px;line-height:1}.shared-rule-cockpit__timeline-item strong{color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.35}.shared-rule-cockpit__timeline-item p,.shared-rule-cockpit__timeline-item small,.shared-rule-cockpit__timeline-item time,.shared-rule-cockpit__timeline-empty{display:block;margin:3px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__timeline-badge{display:inline-flex;margin-left:6px;padding:2px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-secondary-container) 42%,transparent);color:var(--md-sys-color-on-secondary-container);font-size:10px;font-weight:700}.shared-rule-cockpit__timeline-empty{padding:10px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 64%,transparent)}@media(max-width:720px){.shared-rule-cockpit{bottom:72px;max-height:calc(100vh - 112px)}.shared-rule-cockpit__facts,.shared-rule-cockpit__projection-grid{grid-template-columns:1fr}}\n"] }]
24386
24720
  }], ctorParameters: () => [{ type: i1.MatDialog }, { type: undefined, decorators: [{
24387
24721
  type: Optional
24388
24722
  }, {