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

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
  }
@@ -18910,6 +19046,8 @@ class PageBuilderAgenticAuthoringTurnFlow {
18910
19046
  return 'add_dashboard_kpis';
18911
19047
  case 'dashboard-quality-bind-kpis':
18912
19048
  return 'bind_dashboard_kpis';
19049
+ case 'dashboard-quality-add-filters':
19050
+ return 'add_dashboard_filters';
18913
19051
  case 'dashboard-quality-add-chart':
18914
19052
  return 'add_dashboard_chart';
18915
19053
  case 'dashboard-quality-add-surfaces':
@@ -18947,6 +19085,9 @@ class PageBuilderAgenticAuthoringTurnFlow {
18947
19085
  case 'adicionar grafico':
18948
19086
  case 'adicionar gráfico':
18949
19087
  return 'add_dashboard_chart';
19088
+ case 'add filters':
19089
+ case 'adicionar filtros':
19090
+ return 'add_dashboard_filters';
18950
19091
  case 'add surfaces':
18951
19092
  case 'adicionar surfaces':
18952
19093
  case 'adicionar superficies':
@@ -19011,8 +19152,13 @@ class PageBuilderAgenticAuthoringTurnFlow {
19011
19152
  }
19012
19153
  const operationKind = intentResolution.operationKind;
19013
19154
  const changeKind = intentResolution.changeKind;
19014
- return (operationKind === 'explore' || operationKind === 'explain')
19015
- && intentResolution.artifactKind === 'api_catalog'
19155
+ if (operationKind !== 'explore' && operationKind !== 'explain') {
19156
+ return false;
19157
+ }
19158
+ if (intentResolution.artifactKind === 'component') {
19159
+ return changeKind === 'answer_component_catalog_question';
19160
+ }
19161
+ return intentResolution.artifactKind === 'api_catalog'
19016
19162
  && (changeKind === 'answer_api_catalog_question'
19017
19163
  || changeKind === 'answer_catalog_question'
19018
19164
  || changeKind === 'api_catalog_followup'
@@ -19591,6 +19737,7 @@ class PageBuilderAgenticAuthoringTurnFlow {
19591
19737
  userPrompt: prompt,
19592
19738
  targetApp: this.context.targetApp,
19593
19739
  targetComponentId: this.context.targetComponentId,
19740
+ currentRoute: this.context.currentRoute?.() ?? null,
19594
19741
  currentPage: this.context.currentPage(),
19595
19742
  selectedWidgetKey: this.resolveSelectedWidgetKey(selectedWidgetKey, authoringContext.contextHints),
19596
19743
  provider: this.context.provider(),
@@ -19922,6 +20069,7 @@ class DynamicPageBuilderComponent {
19922
20069
  agenticAuthoring = inject(PageBuilderAgenticAuthoringService);
19923
20070
  agenticTurnOrchestrator = inject(PraxisAssistantTurnOrchestratorService);
19924
20071
  assistantSessions = inject(PraxisAssistantSessionRegistryService);
20072
+ observabilityDashboard = inject(ObservabilityDashboardService);
19925
20073
  runtimeObservationRegistry = inject(PraxisRuntimeComponentObservationRegistryService, { optional: true });
19926
20074
  agenticAuthoringOptions = inject(PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS, { optional: true });
19927
20075
  runtime;
@@ -19967,6 +20115,7 @@ class DynamicPageBuilderComponent {
19967
20115
  agenticAuthoringOpen = signal(false, ...(ngDevMode ? [{ debugName: "agenticAuthoringOpen" }] : /* istanbul ignore next */ []));
19968
20116
  agenticAuthoringPrompt = signal('', ...(ngDevMode ? [{ debugName: "agenticAuthoringPrompt" }] : /* istanbul ignore next */ []));
19969
20117
  agenticAuthoringBusy = signal(false, ...(ngDevMode ? [{ debugName: "agenticAuthoringBusy" }] : /* istanbul ignore next */ []));
20118
+ agenticAuthoringTerminalState = signal(null, ...(ngDevMode ? [{ debugName: "agenticAuthoringTerminalState" }] : /* istanbul ignore next */ []));
19970
20119
  agenticAuthoringStatus = signal('', ...(ngDevMode ? [{ debugName: "agenticAuthoringStatus" }] : /* istanbul ignore next */ []));
19971
20120
  agenticAuthoringError = signal('', ...(ngDevMode ? [{ debugName: "agenticAuthoringError" }] : /* istanbul ignore next */ []));
19972
20121
  agenticAuthoringPreviewResult = signal(null, ...(ngDevMode ? [{ debugName: "agenticAuthoringPreviewResult" }] : /* istanbul ignore next */ []));
@@ -19995,6 +20144,7 @@ class DynamicPageBuilderComponent {
19995
20144
  projectKnowledgeCockpitValidation = signal(null, ...(ngDevMode ? [{ debugName: "projectKnowledgeCockpitValidation" }] : /* istanbul ignore next */ []));
19996
20145
  projectKnowledgeCockpitTimeline = signal(null, ...(ngDevMode ? [{ debugName: "projectKnowledgeCockpitTimeline" }] : /* istanbul ignore next */ []));
19997
20146
  agenticAuthoringLlmDiagnostics = signal(null, ...(ngDevMode ? [{ debugName: "agenticAuthoringLlmDiagnostics" }] : /* istanbul ignore next */ []));
20147
+ agenticTurnHealth = signal(this.emptyAgenticTurnHealth(), ...(ngDevMode ? [{ debugName: "agenticTurnHealth" }] : /* istanbul ignore next */ []));
19998
20148
  agenticAuthoringLlmDiagnosticsCollapsed = signal(true, ...(ngDevMode ? [{ debugName: "agenticAuthoringLlmDiagnosticsCollapsed" }] : /* istanbul ignore next */ []));
19999
20149
  sharedRuleCockpitCollapsed = signal(false, ...(ngDevMode ? [{ debugName: "sharedRuleCockpitCollapsed" }] : /* istanbul ignore next */ []));
20000
20150
  projectKnowledgeCockpitCollapsed = signal(true, ...(ngDevMode ? [{ debugName: "projectKnowledgeCockpitCollapsed" }] : /* istanbul ignore next */ []));
@@ -20017,9 +20167,13 @@ class DynamicPageBuilderComponent {
20017
20167
  agenticAuthoringTurnTerminalTimeoutMs = AGENTIC_AUTHORING_TURN_TERMINAL_TIMEOUT_MS;
20018
20168
  sharedRuleHandoffRevision = 0;
20019
20169
  agenticAuthoringPanelLayoutTouched = false;
20170
+ observabilityMetricsSubscription;
20020
20171
  constructor(dialog, settingsPanel) {
20021
20172
  this.dialog = dialog;
20022
20173
  this.settingsPanel = settingsPanel;
20174
+ this.observabilityMetricsSubscription = this.observabilityDashboard.metrics$.subscribe((snapshot) => {
20175
+ this.agenticTurnHealth.set(snapshot.agenticTurns);
20176
+ });
20023
20177
  effect(() => {
20024
20178
  const activeSession = this.assistantSessions.activeSession();
20025
20179
  if (activeSession?.id === this.resolveAgenticAuthoringSessionId() && !this.agenticAuthoringOpen()) {
@@ -20067,6 +20221,7 @@ class DynamicPageBuilderComponent {
20067
20221
  ngOnDestroy() {
20068
20222
  this.cancelActiveAgenticTurn();
20069
20223
  this.agenticTurnCancel$.complete();
20224
+ this.observabilityMetricsSubscription.unsubscribe();
20070
20225
  }
20071
20226
  showSettings() {
20072
20227
  return !!this.enableCustomization && !this.previewMode;
@@ -20147,6 +20302,40 @@ class DynamicPageBuilderComponent {
20147
20302
  toggleAgenticAuthoringLlmDiagnostics() {
20148
20303
  this.agenticAuthoringLlmDiagnosticsCollapsed.update((current) => !current);
20149
20304
  }
20305
+ agenticAuthoringDiagnosticsAvailable() {
20306
+ return !!this.agenticAuthoringLlmDiagnosticsText() || this.agenticTurnHealth().started > 0;
20307
+ }
20308
+ agenticTurnHealthBuckets() {
20309
+ const health = this.agenticTurnHealth();
20310
+ return [
20311
+ ...health.byProvider.map((bucket) => ({ dimension: 'provider', bucket })),
20312
+ ...health.byModel.map((bucket) => ({ dimension: 'model', bucket })),
20313
+ ];
20314
+ }
20315
+ formatAgenticMetricPercent(rate) {
20316
+ return `${Math.round(Math.max(0, rate) * 100)}%`;
20317
+ }
20318
+ formatAgenticDuration(durationMs) {
20319
+ const safeDurationMs = Math.max(0, Math.round(durationMs));
20320
+ return safeDurationMs < 1_000
20321
+ ? `${safeDurationMs} ms`
20322
+ : `${(safeDurationMs / 1_000).toFixed(1)} s`;
20323
+ }
20324
+ emptyAgenticTurnHealth() {
20325
+ return {
20326
+ started: 0,
20327
+ completed: 0,
20328
+ succeeded: 0,
20329
+ timedOut: 0,
20330
+ successRate: 0,
20331
+ timeoutRate: 0,
20332
+ averageDurationMs: 0,
20333
+ p50DurationMs: 0,
20334
+ p95DurationMs: 0,
20335
+ byProvider: [],
20336
+ byModel: [],
20337
+ };
20338
+ }
20150
20339
  toggleSharedRuleCockpit() {
20151
20340
  this.sharedRuleCockpitCollapsed.update((current) => !current);
20152
20341
  }
@@ -20737,6 +20926,8 @@ class DynamicPageBuilderComponent {
20737
20926
  return 'review';
20738
20927
  if (this.agenticAuthoringSharedRuleHandoffState())
20739
20928
  return 'clarification';
20929
+ if (this.agenticAuthoringTerminalState() === 'clarification')
20930
+ return 'clarification';
20740
20931
  if (this.agenticAuthoringConversation().length)
20741
20932
  return 'listening';
20742
20933
  return 'idle';
@@ -20756,6 +20947,7 @@ class DynamicPageBuilderComponent {
20756
20947
  this.agenticTurnController = undefined;
20757
20948
  this.sharedRuleHandoffRevision += 1;
20758
20949
  this.agenticAuthoringBusy.set(false);
20950
+ this.agenticAuthoringTerminalState.set(null);
20759
20951
  this.agenticAuthoringPrompt.set('');
20760
20952
  this.agenticAuthoringStatus.set('');
20761
20953
  this.agenticAuthoringError.set('');
@@ -21349,7 +21541,11 @@ class DynamicPageBuilderComponent {
21349
21541
  await this.applyAgenticTurnState(await firstValueFrom(this.ensureAgenticTurnController().cancel()));
21350
21542
  return;
21351
21543
  }
21352
- if (replyKind === 'revise') {
21544
+ const contextHints = reply.contextHints ? { ...reply.contextHints } : undefined;
21545
+ const activeSemanticDecision = reply.semanticDecision
21546
+ ? { ...reply.semanticDecision }
21547
+ : undefined;
21548
+ if (replyKind === 'revise' && !this.isGovernedReviewRepairQuickReply(contextHints)) {
21353
21549
  this.invalidateAgenticTerminalAuthorization();
21354
21550
  this.agenticAuthoringEditingMessageId.set(null);
21355
21551
  this.agenticAuthoringQuickReplies.set([]);
@@ -21357,7 +21553,6 @@ class DynamicPageBuilderComponent {
21357
21553
  return;
21358
21554
  }
21359
21555
  this.agenticAuthoringEditingMessageId.set(null);
21360
- const contextHints = reply.contextHints ? { ...reply.contextHints } : undefined;
21361
21556
  const visiblePrompt = this.agenticQuickReplyVisiblePrompt(reply, contextHints);
21362
21557
  const submittedPrompt = this.agenticQuickReplySubmittedPrompt(reply, contextHints, visiblePrompt, this.ensureAgenticTurnController().snapshot().pendingClarification);
21363
21558
  if (this.promoteSharedRuleHandoffFromQuickReply(reply, contextHints, visiblePrompt)) {
@@ -21385,7 +21580,10 @@ class DynamicPageBuilderComponent {
21385
21580
  id: reply.id,
21386
21581
  value: reply.prompt,
21387
21582
  displayPrompt: visiblePrompt,
21388
- contextHints,
21583
+ contextHints: activeSemanticDecision
21584
+ ? { ...(contextHints ?? {}), semanticDecision: activeSemanticDecision }
21585
+ : contextHints,
21586
+ activeSemanticDecision,
21389
21587
  }), turnRunId);
21390
21588
  this.agenticAuthoringPrompt.set('');
21391
21589
  }
@@ -21403,6 +21601,9 @@ class DynamicPageBuilderComponent {
21403
21601
  }
21404
21602
  }
21405
21603
  }
21604
+ isGovernedReviewRepairQuickReply(contextHints) {
21605
+ return contextHints?.['kind'] === 'governed-review-repair';
21606
+ }
21406
21607
  agenticQuickReplyVisiblePrompt(reply, contextHints) {
21407
21608
  const prompt = (reply.prompt || '').trim();
21408
21609
  if (this.isGovernedConfirmationQuickReply(reply, contextHints)) {
@@ -22573,6 +22774,8 @@ class DynamicPageBuilderComponent {
22573
22774
  const flow = new PageBuilderAgenticAuthoringTurnFlow(this.agenticAuthoring, {
22574
22775
  targetApp: 'praxis-ui-angular',
22575
22776
  targetComponentId: 'praxis-dynamic-page-builder',
22777
+ currentRoute: () => this.pageIdentity?.routePath?.trim() || null,
22778
+ responseLocale: () => this.pageIdentity?.locale?.trim() || null,
22576
22779
  currentPage: () => this.currentPage(),
22577
22780
  selectedWidgetKey: () => this.resolveSelectedWidgetKey(),
22578
22781
  provider: () => this.agenticAuthoringProvider,
@@ -22671,15 +22874,28 @@ class DynamicPageBuilderComponent {
22671
22874
  };
22672
22875
  }
22673
22876
  async applyAgenticTurnState(state) {
22674
- const preview = state.preview ?? null;
22877
+ // A terminal turn state is the canonical end of processing. Clear the local
22878
+ // interaction flag before projecting preview/review so the shell never
22879
+ // renders terminal actions alongside a stale loading indicator.
22880
+ if (this.isAgenticTurnTerminalState(state)) {
22881
+ this.agenticAuthoringBusy.set(false);
22882
+ this.agenticAuthoringTerminalState.set(state.state);
22883
+ }
22884
+ const receivedPreview = state.preview ?? null;
22885
+ const preview = receivedPreview?.valid ? receivedPreview : null;
22886
+ const invalidPreviewError = receivedPreview
22887
+ && !receivedPreview.valid
22888
+ && (state.state === 'error' || state.quickReplies.length === 0)
22889
+ ? this.describeAgenticPreviewFailure(receivedPreview)
22890
+ : '';
22675
22891
  const handoff = this.resolveAgenticSharedRuleHandoff(state);
22676
22892
  const previousHandoff = this.agenticAuthoringSharedRuleHandoffState();
22677
22893
  this.agenticAuthoringConversation.set(state.messages);
22678
22894
  this.agenticAuthoringQuickReplies.set(state.quickReplies);
22679
- this.agenticAuthoringStatus.set(handoff && !preview?.valid
22895
+ this.agenticAuthoringStatus.set(handoff && !receivedPreview?.valid
22680
22896
  ? this.tx('agentic.status.sharedRuleHandoff', 'Continue este pedido na revisão da regra.')
22681
22897
  : state.statusText);
22682
- this.agenticAuthoringError.set(state.errorText);
22898
+ this.agenticAuthoringError.set(state.errorText || invalidPreviewError);
22683
22899
  this.agenticAuthoringPreviewResult.set(preview);
22684
22900
  this.agenticAuthoringSemanticDecision.set(this.resolveAgenticSemanticDecision(state.diagnostics));
22685
22901
  this.agenticAuthoringSemanticResourcePresentationLabel.set(this.resolveAgenticSemanticResourcePresentationLabel(state.diagnostics));
@@ -22891,7 +23107,11 @@ class DynamicPageBuilderComponent {
22891
23107
  return Object.keys(merged).length ? merged : undefined;
22892
23108
  }
22893
23109
  consumeAgenticTurn(states$, turnRunId) {
22894
- return firstValueFrom(states$.pipe(takeUntil(this.agenticTurnCancel$), concatMap((state) => {
23110
+ return firstValueFrom(states$.pipe(takeUntil(this.agenticTurnCancel$), tap((state) => {
23111
+ if (this.isCurrentAgenticTurn(turnRunId) && this.isAgenticTurnTerminalState(state)) {
23112
+ this.agenticAuthoringBusy.set(false);
23113
+ }
23114
+ }), concatMap((state) => {
22895
23115
  if (!this.isCurrentAgenticTurn(turnRunId)) {
22896
23116
  return of(state);
22897
23117
  }
@@ -23513,7 +23733,7 @@ class DynamicPageBuilderComponent {
23513
23733
  />
23514
23734
  }
23515
23735
 
23516
- @if (agenticAuthoringIncludeLlmDiagnostics && agenticAuthoringLlmDiagnosticsText()) {
23736
+ @if (agenticAuthoringIncludeLlmDiagnostics && agenticAuthoringDiagnosticsAvailable()) {
23517
23737
  <section
23518
23738
  class="agentic-diagnostics-panel"
23519
23739
  [class.agentic-diagnostics-panel--collapsed]="agenticAuthoringLlmDiagnosticsCollapsed()"
@@ -23545,7 +23765,61 @@ class DynamicPageBuilderComponent {
23545
23765
  <p class="agentic-diagnostics-panel__description">
23546
23766
  {{ tx('agentic.diagnostics.description', 'Informações usadas para explicar como o assistente chegou à resposta deste pedido.') }}
23547
23767
  </p>
23548
- <pre>{{ agenticAuthoringLlmDiagnosticsText() }}</pre>
23768
+ @if (agenticTurnHealth().started) {
23769
+ <section class="agentic-diagnostics-panel__health" data-testid="page-builder-agentic-turn-health">
23770
+ <h3>{{ tx('agentic.diagnostics.health.title', 'Assistant health') }}</h3>
23771
+ <p>{{ tx('agentic.diagnostics.health.description', 'Recent authoring turn reliability and response time.') }}</p>
23772
+ <dl class="agentic-diagnostics-panel__metrics">
23773
+ <div>
23774
+ <dt>{{ tx('agentic.diagnostics.health.successRate', 'Success') }}</dt>
23775
+ <dd data-testid="page-builder-agentic-health-success">{{ formatAgenticMetricPercent(agenticTurnHealth().successRate) }}</dd>
23776
+ </div>
23777
+ <div>
23778
+ <dt>{{ tx('agentic.diagnostics.health.timeoutRate', 'Timeouts') }}</dt>
23779
+ <dd data-testid="page-builder-agentic-health-timeout">{{ formatAgenticMetricPercent(agenticTurnHealth().timeoutRate) }}</dd>
23780
+ </div>
23781
+ <div>
23782
+ <dt>{{ tx('agentic.diagnostics.health.p50', 'Typical (P50)') }}</dt>
23783
+ <dd data-testid="page-builder-agentic-health-p50">{{ formatAgenticDuration(agenticTurnHealth().p50DurationMs) }}</dd>
23784
+ </div>
23785
+ <div>
23786
+ <dt>{{ tx('agentic.diagnostics.health.p95', 'Slow edge (P95)') }}</dt>
23787
+ <dd data-testid="page-builder-agentic-health-p95">{{ formatAgenticDuration(agenticTurnHealth().p95DurationMs) }}</dd>
23788
+ </div>
23789
+ </dl>
23790
+ @if (agenticTurnHealthBuckets().length) {
23791
+ <table class="agentic-diagnostics-panel__health-table" data-testid="page-builder-agentic-health-breakdown">
23792
+ <caption>{{ tx('agentic.diagnostics.health.breakdown', 'Provider and model breakdown') }}</caption>
23793
+ <thead>
23794
+ <tr>
23795
+ <th scope="col">{{ tx('agentic.diagnostics.health.dimension', 'Dimension') }}</th>
23796
+ <th scope="col">{{ tx('agentic.diagnostics.health.name', 'Name') }}</th>
23797
+ <th scope="col">{{ tx('agentic.diagnostics.health.successRate', 'Success') }}</th>
23798
+ <th scope="col">{{ tx('agentic.diagnostics.health.timeoutRate', 'Timeouts') }}</th>
23799
+ <th scope="col">P95</th>
23800
+ </tr>
23801
+ </thead>
23802
+ <tbody>
23803
+ @for (entry of agenticTurnHealthBuckets(); track entry.dimension + ':' + entry.bucket.key) {
23804
+ <tr>
23805
+ <td>{{ entry.dimension === 'provider' ? tx('agentic.diagnostics.health.provider', 'Provider') : tx('agentic.diagnostics.health.model', 'Model') }}</td>
23806
+ <th scope="row">{{ entry.bucket.key }}</th>
23807
+ <td>{{ formatAgenticMetricPercent(entry.bucket.successRate) }}</td>
23808
+ <td>{{ formatAgenticMetricPercent(entry.bucket.timeoutRate) }}</td>
23809
+ <td>{{ formatAgenticDuration(entry.bucket.p95DurationMs) }}</td>
23810
+ </tr>
23811
+ }
23812
+ </tbody>
23813
+ </table>
23814
+ }
23815
+ </section>
23816
+ }
23817
+ @if (agenticAuthoringLlmDiagnosticsText()) {
23818
+ <details class="agentic-diagnostics-panel__raw">
23819
+ <summary>{{ tx('agentic.diagnostics.raw', 'Turn details') }}</summary>
23820
+ <pre>{{ agenticAuthoringLlmDiagnosticsText() }}</pre>
23821
+ </details>
23822
+ }
23549
23823
  }
23550
23824
  </section>
23551
23825
  }
@@ -23882,7 +24156,7 @@ class DynamicPageBuilderComponent {
23882
24156
  }
23883
24157
  </praxis-floating-toolbar>
23884
24158
  </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"] }] });
24159
+ `, 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
24160
  }
23887
24161
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicPageBuilderComponent, decorators: [{
23888
24162
  type: Component,
@@ -24013,7 +24287,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
24013
24287
  />
24014
24288
  }
24015
24289
 
24016
- @if (agenticAuthoringIncludeLlmDiagnostics && agenticAuthoringLlmDiagnosticsText()) {
24290
+ @if (agenticAuthoringIncludeLlmDiagnostics && agenticAuthoringDiagnosticsAvailable()) {
24017
24291
  <section
24018
24292
  class="agentic-diagnostics-panel"
24019
24293
  [class.agentic-diagnostics-panel--collapsed]="agenticAuthoringLlmDiagnosticsCollapsed()"
@@ -24045,7 +24319,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
24045
24319
  <p class="agentic-diagnostics-panel__description">
24046
24320
  {{ tx('agentic.diagnostics.description', 'Informações usadas para explicar como o assistente chegou à resposta deste pedido.') }}
24047
24321
  </p>
24048
- <pre>{{ agenticAuthoringLlmDiagnosticsText() }}</pre>
24322
+ @if (agenticTurnHealth().started) {
24323
+ <section class="agentic-diagnostics-panel__health" data-testid="page-builder-agentic-turn-health">
24324
+ <h3>{{ tx('agentic.diagnostics.health.title', 'Assistant health') }}</h3>
24325
+ <p>{{ tx('agentic.diagnostics.health.description', 'Recent authoring turn reliability and response time.') }}</p>
24326
+ <dl class="agentic-diagnostics-panel__metrics">
24327
+ <div>
24328
+ <dt>{{ tx('agentic.diagnostics.health.successRate', 'Success') }}</dt>
24329
+ <dd data-testid="page-builder-agentic-health-success">{{ formatAgenticMetricPercent(agenticTurnHealth().successRate) }}</dd>
24330
+ </div>
24331
+ <div>
24332
+ <dt>{{ tx('agentic.diagnostics.health.timeoutRate', 'Timeouts') }}</dt>
24333
+ <dd data-testid="page-builder-agentic-health-timeout">{{ formatAgenticMetricPercent(agenticTurnHealth().timeoutRate) }}</dd>
24334
+ </div>
24335
+ <div>
24336
+ <dt>{{ tx('agentic.diagnostics.health.p50', 'Typical (P50)') }}</dt>
24337
+ <dd data-testid="page-builder-agentic-health-p50">{{ formatAgenticDuration(agenticTurnHealth().p50DurationMs) }}</dd>
24338
+ </div>
24339
+ <div>
24340
+ <dt>{{ tx('agentic.diagnostics.health.p95', 'Slow edge (P95)') }}</dt>
24341
+ <dd data-testid="page-builder-agentic-health-p95">{{ formatAgenticDuration(agenticTurnHealth().p95DurationMs) }}</dd>
24342
+ </div>
24343
+ </dl>
24344
+ @if (agenticTurnHealthBuckets().length) {
24345
+ <table class="agentic-diagnostics-panel__health-table" data-testid="page-builder-agentic-health-breakdown">
24346
+ <caption>{{ tx('agentic.diagnostics.health.breakdown', 'Provider and model breakdown') }}</caption>
24347
+ <thead>
24348
+ <tr>
24349
+ <th scope="col">{{ tx('agentic.diagnostics.health.dimension', 'Dimension') }}</th>
24350
+ <th scope="col">{{ tx('agentic.diagnostics.health.name', 'Name') }}</th>
24351
+ <th scope="col">{{ tx('agentic.diagnostics.health.successRate', 'Success') }}</th>
24352
+ <th scope="col">{{ tx('agentic.diagnostics.health.timeoutRate', 'Timeouts') }}</th>
24353
+ <th scope="col">P95</th>
24354
+ </tr>
24355
+ </thead>
24356
+ <tbody>
24357
+ @for (entry of agenticTurnHealthBuckets(); track entry.dimension + ':' + entry.bucket.key) {
24358
+ <tr>
24359
+ <td>{{ entry.dimension === 'provider' ? tx('agentic.diagnostics.health.provider', 'Provider') : tx('agentic.diagnostics.health.model', 'Model') }}</td>
24360
+ <th scope="row">{{ entry.bucket.key }}</th>
24361
+ <td>{{ formatAgenticMetricPercent(entry.bucket.successRate) }}</td>
24362
+ <td>{{ formatAgenticMetricPercent(entry.bucket.timeoutRate) }}</td>
24363
+ <td>{{ formatAgenticDuration(entry.bucket.p95DurationMs) }}</td>
24364
+ </tr>
24365
+ }
24366
+ </tbody>
24367
+ </table>
24368
+ }
24369
+ </section>
24370
+ }
24371
+ @if (agenticAuthoringLlmDiagnosticsText()) {
24372
+ <details class="agentic-diagnostics-panel__raw">
24373
+ <summary>{{ tx('agentic.diagnostics.raw', 'Turn details') }}</summary>
24374
+ <pre>{{ agenticAuthoringLlmDiagnosticsText() }}</pre>
24375
+ </details>
24376
+ }
24049
24377
  }
24050
24378
  </section>
24051
24379
  }
@@ -24382,7 +24710,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
24382
24710
  }
24383
24711
  </praxis-floating-toolbar>
24384
24712
  </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"] }]
24713
+ `, 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
24714
  }], ctorParameters: () => [{ type: i1.MatDialog }, { type: undefined, decorators: [{
24387
24715
  type: Optional
24388
24716
  }, {