@praxisui/page-builder 9.0.62 → 9.0.64

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, providePraxisI18n, BUILTIN_SHELL_PRESETS, PraxisIconButtonComponent, 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, NestedWidgetConfigAccessor, CompositionValidatorService, ComponentMetadataRegistry, ResourceDiscoveryService, ComponentRuntimeProfileService, buildApiUrl, deepMerge, generateId, ObservabilityDashboardService, PraxisRuntimeComponentObservationRegistryService, domainKnowledgeTimelineToRichContentDocument, DomainRuleService, DomainKnowledgeService, SETTINGS_PANEL_BRIDGE, DynamicWidgetPageComponent, DYNAMIC_PAGE_SHELL_EDITOR } from '@praxisui/core';
10
+ import { PraxisIconDirective, providePraxisI18n, BUILTIN_SHELL_PRESETS, PraxisIconButtonComponent, 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, PraxisJsonLogicService, NestedWidgetConfigAccessor, canonicalJsonSha256, CompositionValidatorService, ComponentMetadataRegistry, ResourceDiscoveryService, ComponentRuntimeProfileService, buildApiUrl, deepMerge, generateId, 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';
@@ -361,6 +361,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
361
361
  }] } });
362
362
 
363
363
  const PRAXIS_PAGE_BUILDER_EN_US = {
364
+ 'praxis.pageBuilder.authoringSource.alert.title': 'Semantic lineage requires attention',
365
+ 'praxis.pageBuilder.authoringSource.alert.description': 'The page remains available, but this source will not be reused until new governed authoring restores its provenance.',
366
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-schema-invalid': 'The authoring envelope does not match the schema supported by Page Builder.',
367
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-kind-invalid': 'The persisted source does not declare the UiCompositionPlan kind.',
368
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-plan-invalid': 'The persisted UiCompositionPlan does not match the canonical 1.0 contract.',
369
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-provenance-invalid': 'The source does not contain complete terminal-result provenance.',
370
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-materialization-kind-invalid': 'The source does not describe a WidgetPageDefinition materialization.',
371
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-component-type-mismatch': 'The source belongs to another component type.',
372
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-component-id-mismatch': 'The source belongs to another page instance.',
373
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-hash-mismatch': 'The semantic source hash does not match the received plan.',
374
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-materialization-hash-mismatch': 'The executable page differs from the attested materialization.',
364
375
  'praxis.pageBuilder.editor.title': 'Page settings',
365
376
  'praxis.pageBuilder.editor.subtitle': 'Define layout, themes, grouping and declarative state without leaving the canonical dynamic page flow.',
366
377
  'praxis.pageBuilder.editor.reload': 'Reload',
@@ -1015,6 +1026,17 @@ const PRAXIS_PAGE_BUILDER_EN_US = {
1015
1026
  };
1016
1027
 
1017
1028
  const PRAXIS_PAGE_BUILDER_PT_BR = {
1029
+ 'praxis.pageBuilder.authoringSource.alert.title': 'Linhagem semântica requer atenção',
1030
+ 'praxis.pageBuilder.authoringSource.alert.description': 'A página continua disponível, mas esta fonte não será reutilizada até que uma nova autoria governada restabeleça sua proveniência.',
1031
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-schema-invalid': 'O envelope de autoria não atende ao schema suportado pelo Page Builder.',
1032
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-kind-invalid': 'A fonte persistida não declara o tipo UiCompositionPlan.',
1033
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-plan-invalid': 'O UiCompositionPlan persistido não atende ao contrato canônico 1.0.',
1034
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-provenance-invalid': 'A fonte não contém a proveniência completa do resultado terminal.',
1035
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-materialization-kind-invalid': 'A fonte não descreve uma materialização WidgetPageDefinition.',
1036
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-component-type-mismatch': 'A fonte pertence a outro tipo de componente.',
1037
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-component-id-mismatch': 'A fonte pertence a outra instância de página.',
1038
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-hash-mismatch': 'O hash da fonte semântica não corresponde ao plano recebido.',
1039
+ 'praxis.pageBuilder.authoringSource.diagnostics.authoring-source-materialization-hash-mismatch': 'A página executável divergiu da materialização atestada.',
1018
1040
  'praxis.pageBuilder.editor.title': 'Configurações da página',
1019
1041
  'praxis.pageBuilder.editor.subtitle': 'Defina layout, temas, agrupamentos e estado declarativo sem sair do fluxo canônico da página dinâmica.',
1020
1042
  'praxis.pageBuilder.editor.reload': 'Recarregar',
@@ -13133,7 +13155,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13133
13155
  * Capabilities catalog for the canonical dynamic page builder/runtime.
13134
13156
  */
13135
13157
  const PAGE_BUILDER_AI_CAPABILITIES = {
13136
- version: 'v1.5',
13158
+ version: 'v1.6',
13137
13159
  enums: {},
13138
13160
  targets: [
13139
13161
  'page-builder',
@@ -13205,7 +13227,10 @@ const PAGE_BUILDER_AI_CAPABILITIES = {
13205
13227
  { path: 'uiCompositionPlan.bindings[].to.nestedPath[].componentType', category: 'connections', valueKind: 'string', description: 'Tipo do componente real do widget filho de destino, usado como verificacao auxiliar, nao como identidade primaria.' },
13206
13228
  { path: 'uiCompositionPlan.bindings[].intent', category: 'connections', valueKind: 'string', description: 'Intencao semantica do binding.' },
13207
13229
  { path: 'uiCompositionPlan.bindings[].condition', category: 'connections', valueKind: 'expression', description: 'Guarda opcional em Json Logic.' },
13208
- { path: 'uiCompositionPlan.bindings[].transform', category: 'connections', valueKind: 'object', description: 'Transform declarativo: pick-path, query-context, template ou constant.' },
13230
+ { path: 'uiCompositionPlan.bindings[].transform', category: 'connections', valueKind: 'object', description: 'Transform declarativo: pick-path, query-context, template, constant ou select-case total.' },
13231
+ { path: 'uiCompositionPlan.bindings[].transform.fallbackValue', category: 'connections', valueKind: 'object', description: 'Fallback JSON explicito do pipeline quando a projecao resolve undefined; use null, objeto ou colecao conforme o contrato do destino.' },
13232
+ { path: 'uiCompositionPlan.bindings[].transform.cases', category: 'connections', valueKind: 'array', description: 'Branches do select-case, cada uma com guarda Json Logic canonica em when e valor total em value.' },
13233
+ { path: 'uiCompositionPlan.bindings[].transform.defaultValue', category: 'connections', valueKind: 'object', description: 'Valor total obrigatorio do select-case quando nenhuma branch corresponde; permite empty/reset sem um segundo binding.' },
13209
13234
  { path: 'uiCompositionPlan.bindings[].policy', category: 'connections', valueKind: 'object', description: 'Politica operacional opcional do binding.' },
13210
13235
  { path: 'page', category: 'page', valueKind: 'object', description: 'Definicao da pagina (WidgetPageDefinition).' },
13211
13236
  { path: 'context', category: 'context', valueKind: 'object', description: 'Contexto extra mesclado ao page.context.' },
@@ -13833,6 +13858,7 @@ const PAGE_BUILDER_COMPONENT_CONTEXT_PACK = {
13833
13858
  'Carry page-owned i18n, explicit context, canonical layout and governed widget shell in uiCompositionPlan; when a PraxisTextValue key exists in the fallbackLocale dictionary, omit repeated text and let the compiler materialize the executable fallback.',
13834
13859
  'Use uiCompositionPlan.widgets[].componentId in plans; the compiler maps it to page.widgets[].definition.id.',
13835
13860
  'Use uiCompositionPlan.selectionSyncs for repeated selection projections, contextScopes for repeated explicit widget context, and bindings for remaining wiring; constant values and state.initial become explicit inputs, while state references compile to page.composition.links.',
13861
+ 'Para invalidacao de selecao, use fallbackValue no mesmo transform pick-path. Para materializar conteudo ou empty/reset em um unico binding, use select-case com branches when/value e defaultValue total; nao crie pares condition + :clear.',
13836
13862
  'For nested component ports, use component-port endpoints with nestedPath in uiCompositionPlan.bindings; keep widget as the top-level owner and put the real child port in port/direction.',
13837
13863
  'NestedPath must be relative to the owner widget and must end with a widget segment containing a stable key. Do not use index as the only identity.',
13838
13864
  'Do not author nested links through owner.widgetEvent, deep bindingPath, page.connections, or host-specific wrapper outputs; those are legacy or bridge mechanisms.',
@@ -14195,7 +14221,7 @@ const PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST = {
14195
14221
  componentId: 'praxis-page-builder',
14196
14222
  ownerPackage: '@praxisui/page-builder',
14197
14223
  configSchemaId: 'WidgetPageDefinition',
14198
- manifestVersion: '1.4.0',
14224
+ manifestVersion: '1.5.0',
14199
14225
  runtimeInputs: [
14200
14226
  { name: 'page', type: 'WidgetPageDefinition', description: 'Canonical renderable page document consumed by praxis-dynamic-page.' },
14201
14227
  { name: 'pageIdentity', type: 'PageIdentity | null', description: 'Persistence identity for ui_user_config save/apply flows; not persisted inside page.' },
@@ -14388,7 +14414,7 @@ const PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST = {
14388
14414
  target: { kind: 'agenticPreview', resolver: 'agentic-preview-result', ambiguityPolicy: 'fail', required: true },
14389
14415
  inputSchema: { type: 'object', required: ['uiCompositionPlan'], properties: { uiCompositionPlan: { type: 'object' } } },
14390
14416
  effects: [{ kind: 'compile-domain-patch', handler: 'page-builder-ui-composition-plan-compile', handlerContract: {
14391
- reads: ['UiCompositionPlanAuthoringInput', 'UiCompositionPlan', 'UiCompositionPlanTemplateReference', 'UiCompositionPlanTemplateMaterialization', 'UiCompositionPlan.i18n', 'UiCompositionPlan.context', 'UiCompositionPlan.layout', 'UiCompositionPlan.selectionSyncs', 'UiCompositionPlan.contextScopes', 'resolveUiCompositionPlanTemplate', 'compileUiCompositionPlan', 'PAGE_BUILDER_WIDGET_AI_CATALOGS', 'ComponentDocMeta.configEditor'],
14417
+ reads: ['UiCompositionPlanAuthoringInput', 'UiCompositionPlan', 'UiCompositionPlanTemplateReference', 'UiCompositionPlanTemplateMaterialization', 'UiCompositionPlan.i18n', 'UiCompositionPlan.context', 'UiCompositionPlan.layout', 'UiCompositionPlan.selectionSyncs', 'UiCompositionPlan.contextScopes', 'UiCompositionPlan.bindings[].transform.fallbackValue', 'UiCompositionPlan.bindings[].transform.select-case', 'resolveUiCompositionPlanTemplate', 'compileUiCompositionPlan', 'preflightUiCompositionPlan', 'ComponentMetadataRegistry', 'PAGE_BUILDER_WIDGET_AI_CATALOGS', 'ComponentDocMeta.configEditor'],
14392
14418
  writes: ['compiledFormPatch.patch.page'],
14393
14419
  identityKeys: ['uiCompositionPlan.id', 'widgetKey', 'uiCompositionPlan.bindings[].id', 'uiCompositionPlan.selectionSyncs[].id', 'uiCompositionPlan.contextScopes[].id'],
14394
14420
  failureModes: ['ui-composition-plan-invalid', 'ui-composition-template-reference-invalid', 'ui-composition-template-not-found', 'ui-composition-template-hash-mismatch', 'ui-composition-template-overrides-unsupported', 'widget-catalog-missing', 'compiled-page-invalid', 'child-config-editor-missing'],
@@ -14532,6 +14558,7 @@ const PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST = {
14532
14558
  'UiCompositionPlan.i18n, context and layout compile into the corresponding WidgetPageDefinition fields so a complete page never depends on host-only enrichment. A key-only PraxisTextValue receives text from the fallbackLocale dictionary when available.',
14533
14559
  'UiCompositionPlan.selectionSyncs is an authoring shorthand that compiles into explicit canonical page.composition.links and is never persisted in WidgetPageDefinition.',
14534
14560
  'UiCompositionPlan.contextScopes compiles constants and state.initial into explicit widget inputs, and state context into explicit page.composition.links; runtime inheritance is never ambient.',
14561
+ 'UiCompositionPlan transforms devem ser totais: use fallbackValue para invalidacao de selecao e select-case com defaultValue para materializar conteudo ou empty/reset sem bindings clear paralelos.',
14535
14562
  'UiCompositionPlan global-action sources declare only actionId; dynamicPage.composition.dispatch supplies the runtime payload, and target-only payload fields fail closed on sources.',
14536
14563
  'Widget keys and composition link ids are stable identities; array indexes are never canonical identities.',
14537
14564
  'Persisted wiring uses page.composition.links and must not write legacy connections.',
@@ -15016,6 +15043,32 @@ function clone$1(value) {
15016
15043
  return JSON.parse(JSON.stringify(value));
15017
15044
  }
15018
15045
 
15046
+ const UI_COMPOSITION_INPUT_SOURCES = new Set([
15047
+ 'event',
15048
+ 'payload',
15049
+ 'state',
15050
+ 'context',
15051
+ 'constant',
15052
+ ]);
15053
+ const UI_COMPOSITION_TRANSFORM_SEMANTIC_KINDS = new Set([
15054
+ 'event',
15055
+ 'value',
15056
+ 'selection',
15057
+ 'collection',
15058
+ 'query-context',
15059
+ 'view-context',
15060
+ 'config-fragment',
15061
+ 'status',
15062
+ 'diagnostic',
15063
+ ]);
15064
+ const UI_COMPOSITION_JSON_LOGIC = new PraxisJsonLogicService(null);
15065
+ const UI_COMPOSITION_TRANSFORM_RULE_ROOTS = [
15066
+ 'event',
15067
+ 'payload',
15068
+ 'state',
15069
+ 'context',
15070
+ 'source',
15071
+ ];
15019
15072
  /**
15020
15073
  * Pure, fail-closed normalization for an exact template reference.
15021
15074
  *
@@ -15116,7 +15169,7 @@ function validateTemplateReference(input) {
15116
15169
  if (input.version !== '1.0') {
15117
15170
  diagnostics.push(templateDiagnostic('ui-composition-template-reference-version-invalid', 'version'));
15118
15171
  }
15119
- if (!isRecord$1(input.templateRef)) {
15172
+ if (!isRecord$2(input.templateRef)) {
15120
15173
  diagnostics.push(templateDiagnostic('ui-composition-template-reference-object-required', 'templateRef'));
15121
15174
  return diagnostics;
15122
15175
  }
@@ -15131,7 +15184,7 @@ function validateTemplateReference(input) {
15131
15184
  || Object.keys(input.templateRef).length !== TEMPLATE_REF_FIELDS.size) {
15132
15185
  diagnostics.push(templateDiagnostic('ui-composition-template-reference-fields-invalid', 'templateRef'));
15133
15186
  }
15134
- if (input.overrides !== undefined && (!isRecord$1(input.overrides) || Object.keys(input.overrides).length > 0)) {
15187
+ if (input.overrides !== undefined && (!isRecord$2(input.overrides) || Object.keys(input.overrides).length > 0)) {
15135
15188
  diagnostics.push(templateDiagnostic('ui-composition-template-overrides-unsupported', 'overrides'));
15136
15189
  }
15137
15190
  if (Object.keys(input).some((field) => !TEMPLATE_REFERENCE_FIELDS.has(field))) {
@@ -15150,7 +15203,7 @@ function invalidTemplateResolution(code, message) {
15150
15203
  function templateDiagnostic(code, path) {
15151
15204
  return { code, message: 'The governed template reference is invalid.', path };
15152
15205
  }
15153
- function isRecord$1(value) {
15206
+ function isRecord$2(value) {
15154
15207
  return value != null && typeof value === 'object' && !Array.isArray(value);
15155
15208
  }
15156
15209
  /**
@@ -15189,68 +15242,304 @@ function materializeLocalizedFallbacks(page) {
15189
15242
  function validateUiCompositionPlan(plan) {
15190
15243
  const diagnostics = [];
15191
15244
  const widgetKeys = new Set();
15192
- if (plan.kind !== 'praxis.ui-composition-plan') {
15245
+ if (!isRecord$2(plan)) {
15246
+ return [{
15247
+ code: 'plan-object-required',
15248
+ message: 'UiCompositionPlan must be an object.',
15249
+ path: '$',
15250
+ }];
15251
+ }
15252
+ try {
15253
+ if (plan.kind !== 'praxis.ui-composition-plan') {
15254
+ diagnostics.push({
15255
+ code: 'invalid-kind',
15256
+ message: 'UiCompositionPlan.kind must be "praxis.ui-composition-plan".',
15257
+ path: 'kind',
15258
+ });
15259
+ }
15260
+ if (plan.version !== '1.0') {
15261
+ diagnostics.push({
15262
+ code: 'invalid-version',
15263
+ message: 'UiCompositionPlan.version must be "1.0".',
15264
+ path: 'version',
15265
+ });
15266
+ }
15267
+ if (!Array.isArray(plan.widgets)) {
15268
+ diagnostics.push({
15269
+ code: 'widgets-array-required',
15270
+ message: 'UiCompositionPlan.widgets must be an array.',
15271
+ path: 'widgets',
15272
+ });
15273
+ }
15274
+ const widgets = Array.isArray(plan.widgets) ? plan.widgets : [];
15275
+ for (const [index, widget] of widgets.entries()) {
15276
+ if (!isRecord$2(widget)) {
15277
+ diagnostics.push({
15278
+ code: 'widget-object-required',
15279
+ message: 'Every planned widget must be an object.',
15280
+ path: `widgets.${index}`,
15281
+ });
15282
+ continue;
15283
+ }
15284
+ if (typeof widget.key !== 'string' || !widget.key.trim()) {
15285
+ diagnostics.push({
15286
+ code: 'widget-key-required',
15287
+ message: 'Every planned widget must declare a stable key.',
15288
+ path: `widgets.${index}.key`,
15289
+ });
15290
+ continue;
15291
+ }
15292
+ if (widgetKeys.has(widget.key)) {
15293
+ diagnostics.push({
15294
+ code: 'widget-key-duplicated',
15295
+ message: `Widget key "${widget.key}" is duplicated.`,
15296
+ path: `widgets.${index}.key`,
15297
+ });
15298
+ }
15299
+ widgetKeys.add(widget.key);
15300
+ if (typeof widget.componentId !== 'string' || !widget.componentId.trim()) {
15301
+ diagnostics.push({
15302
+ code: 'component-id-required',
15303
+ message: `Widget "${widget.key}" must declare a componentId.`,
15304
+ path: `widgets.${index}.componentId`,
15305
+ });
15306
+ }
15307
+ }
15308
+ if (plan.bindings !== undefined && !Array.isArray(plan.bindings)) {
15309
+ diagnostics.push({
15310
+ code: 'bindings-array-required',
15311
+ message: 'UiCompositionPlan.bindings must be an array when provided.',
15312
+ path: 'bindings',
15313
+ });
15314
+ }
15315
+ const bindings = Array.isArray(plan.bindings) ? plan.bindings : [];
15316
+ for (const [index, binding] of bindings.entries()) {
15317
+ if (!isRecord$2(binding)) {
15318
+ diagnostics.push({
15319
+ code: 'binding-object-required',
15320
+ message: 'Every planned binding must be an object.',
15321
+ path: `bindings.${index}`,
15322
+ });
15323
+ continue;
15324
+ }
15325
+ validateEndpoint(binding.from, widgetKeys, diagnostics, `bindings.${index}.from`, 'source');
15326
+ validateEndpoint(binding.to, widgetKeys, diagnostics, `bindings.${index}.to`, 'target');
15327
+ validatePlannedTransform(binding.transform, diagnostics, `bindings.${index}.transform`);
15328
+ if (typeof binding.id !== 'string' || !binding.id.trim()) {
15329
+ diagnostics.push({
15330
+ code: 'binding-id-required',
15331
+ message: 'Every planned binding must declare a stable id.',
15332
+ path: `bindings.${index}.id`,
15333
+ });
15334
+ }
15335
+ }
15336
+ if (plan.selectionSyncs !== undefined && !Array.isArray(plan.selectionSyncs)) {
15337
+ diagnostics.push({
15338
+ code: 'selection-syncs-array-required',
15339
+ message: 'UiCompositionPlan.selectionSyncs must be an array when provided.',
15340
+ path: 'selectionSyncs',
15341
+ });
15342
+ }
15343
+ for (const [index, selectionSync] of (Array.isArray(plan.selectionSyncs) ? plan.selectionSyncs : []).entries()) {
15344
+ validateSelectionSync(selectionSync, widgetKeys, diagnostics, `selectionSyncs.${index}`);
15345
+ }
15346
+ if (plan.contextScopes !== undefined && !Array.isArray(plan.contextScopes)) {
15347
+ diagnostics.push({
15348
+ code: 'context-scopes-array-required',
15349
+ message: 'UiCompositionPlan.contextScopes must be an array when provided.',
15350
+ path: 'contextScopes',
15351
+ });
15352
+ }
15353
+ for (const [index, contextScope] of (Array.isArray(plan.contextScopes) ? plan.contextScopes : []).entries()) {
15354
+ validateContextScope(contextScope, plan, widgetKeys, diagnostics, `contextScopes.${index}`);
15355
+ }
15356
+ validateCanvas(plan.canvas, widgetKeys, diagnostics);
15357
+ validateGrouping(plan.grouping, widgetKeys, diagnostics);
15358
+ validateDeviceLayouts(plan.deviceLayouts, widgetKeys, diagnostics);
15359
+ validateSlotAssignments(plan.slotAssignments, widgetKeys, diagnostics);
15360
+ diagnostics.push(...validateUiCompositionPlanLayout(plan));
15361
+ return diagnostics;
15362
+ }
15363
+ catch {
15193
15364
  diagnostics.push({
15194
- code: 'invalid-kind',
15195
- message: 'UiCompositionPlan.kind must be "praxis.ui-composition-plan".',
15196
- path: 'kind',
15365
+ code: 'plan-structure-invalid',
15366
+ message: 'UiCompositionPlan contains an invalid runtime structure.',
15367
+ path: '$',
15197
15368
  });
15369
+ return diagnostics;
15198
15370
  }
15199
- if (plan.version !== '1.0') {
15371
+ }
15372
+ function validatePlannedTransform(transform, diagnostics, path) {
15373
+ if (transform === undefined)
15374
+ return;
15375
+ if (!transform || typeof transform !== 'object') {
15200
15376
  diagnostics.push({
15201
- code: 'invalid-version',
15202
- message: 'UiCompositionPlan.version must be "1.0".',
15203
- path: 'version',
15377
+ code: 'binding-transform-object-required',
15378
+ message: 'Binding transform must be an object.',
15379
+ path,
15204
15380
  });
15381
+ return;
15205
15382
  }
15206
- for (const [index, widget] of (plan.widgets ?? []).entries()) {
15207
- if (!widget.key?.trim()) {
15383
+ const rawTransform = transform;
15384
+ if (typeof rawTransform['id'] !== 'string' || !rawTransform['id'].trim()) {
15385
+ diagnostics.push({
15386
+ code: 'binding-transform-id-required',
15387
+ message: 'Binding transform must declare a stable id.',
15388
+ path: `${path}.id`,
15389
+ });
15390
+ }
15391
+ if (rawTransform['inputSource'] !== undefined
15392
+ && !UI_COMPOSITION_INPUT_SOURCES.has(rawTransform['inputSource'])) {
15393
+ diagnostics.push({
15394
+ code: 'binding-transform-input-source-invalid',
15395
+ message: 'Binding transform inputSource must be a canonical runtime source.',
15396
+ path: `${path}.inputSource`,
15397
+ });
15398
+ }
15399
+ validatePlannedTransformOutput(rawTransform['output'], diagnostics, `${path}.output`);
15400
+ if (transform.kind === 'pick-path') {
15401
+ if (typeof transform.path !== 'string' || !transform.path.trim()) {
15208
15402
  diagnostics.push({
15209
- code: 'widget-key-required',
15210
- message: 'Every planned widget must declare a stable key.',
15211
- path: `widgets.${index}.key`,
15403
+ code: 'binding-transform-pick-path-required',
15404
+ message: 'Pick-path transform must declare a non-empty path.',
15405
+ path: `${path}.path`,
15212
15406
  });
15213
- continue;
15214
15407
  }
15215
- if (widgetKeys.has(widget.key)) {
15408
+ return;
15409
+ }
15410
+ if (transform.kind === 'query-context') {
15411
+ if (typeof transform.field !== 'string' || !transform.field.trim()) {
15216
15412
  diagnostics.push({
15217
- code: 'widget-key-duplicated',
15218
- message: `Widget key "${widget.key}" is duplicated.`,
15219
- path: `widgets.${index}.key`,
15413
+ code: 'binding-transform-query-field-required',
15414
+ message: 'Query-context transform must declare a non-empty field.',
15415
+ path: `${path}.field`,
15220
15416
  });
15221
15417
  }
15222
- widgetKeys.add(widget.key);
15223
- if (!widget.componentId?.trim()) {
15418
+ if (transform.valueVar !== undefined && typeof transform.valueVar !== 'string') {
15224
15419
  diagnostics.push({
15225
- code: 'component-id-required',
15226
- message: `Widget "${widget.key}" must declare a componentId.`,
15227
- path: `widgets.${index}.componentId`,
15420
+ code: 'binding-transform-query-value-var-invalid',
15421
+ message: 'Query-context valueVar must be a string when provided.',
15422
+ path: `${path}.valueVar`,
15228
15423
  });
15229
15424
  }
15425
+ return;
15230
15426
  }
15231
- for (const [index, binding] of (plan.bindings ?? []).entries()) {
15232
- validateEndpoint(binding.from, widgetKeys, diagnostics, `bindings.${index}.from`, 'source');
15233
- validateEndpoint(binding.to, widgetKeys, diagnostics, `bindings.${index}.to`, 'target');
15234
- if (!binding.id?.trim()) {
15427
+ if (transform.kind === 'constant') {
15428
+ if (!Object.prototype.hasOwnProperty.call(rawTransform, 'value')) {
15235
15429
  diagnostics.push({
15236
- code: 'binding-id-required',
15237
- message: 'Every planned binding must declare a stable id.',
15238
- path: `bindings.${index}.id`,
15430
+ code: 'binding-transform-constant-value-required',
15431
+ message: 'Constant transform must declare a value.',
15432
+ path: `${path}.value`,
15239
15433
  });
15240
15434
  }
15435
+ return;
15241
15436
  }
15242
- for (const [index, selectionSync] of (plan.selectionSyncs ?? []).entries()) {
15243
- validateSelectionSync(selectionSync, widgetKeys, diagnostics, `selectionSyncs.${index}`);
15437
+ if (transform.kind === 'template') {
15438
+ if (!Object.prototype.hasOwnProperty.call(rawTransform, 'template')) {
15439
+ diagnostics.push({
15440
+ code: 'binding-transform-template-required',
15441
+ message: 'Template transform must declare a template value.',
15442
+ path: `${path}.template`,
15443
+ });
15444
+ }
15445
+ return;
15244
15446
  }
15245
- for (const [index, contextScope] of (plan.contextScopes ?? []).entries()) {
15246
- validateContextScope(contextScope, plan, widgetKeys, diagnostics, `contextScopes.${index}`);
15447
+ if (transform.kind === 'select-case') {
15448
+ if (!Array.isArray(transform.cases) || !transform.cases.length) {
15449
+ diagnostics.push({
15450
+ code: 'binding-transform-select-case-branch-required',
15451
+ message: 'Select-case transform must declare at least one branch.',
15452
+ path: `${path}.cases`,
15453
+ });
15454
+ }
15455
+ const cases = Array.isArray(transform.cases) ? transform.cases : [];
15456
+ for (const [caseIndex, item] of cases.entries()) {
15457
+ if (!item || typeof item !== 'object' || !Object.prototype.hasOwnProperty.call(item, 'when')) {
15458
+ diagnostics.push({
15459
+ code: 'binding-transform-select-case-condition-required',
15460
+ message: 'Every select-case branch must declare a Json Logic condition.',
15461
+ path: `${path}.cases.${caseIndex}.when`,
15462
+ });
15463
+ }
15464
+ else {
15465
+ const conditionResult = UI_COMPOSITION_JSON_LOGIC.validateResult(item.when, {
15466
+ availableRoots: UI_COMPOSITION_TRANSFORM_RULE_ROOTS,
15467
+ defaultRoot: 'source',
15468
+ allowImplicitRoot: true,
15469
+ requireExpressionObject: true,
15470
+ });
15471
+ for (const issue of conditionResult.issues) {
15472
+ diagnostics.push({
15473
+ code: 'binding-transform-select-case-condition-invalid',
15474
+ message: `Select-case condition is invalid: ${issue.message}`,
15475
+ path: `${path}.cases.${caseIndex}.when${issue.path === '$' ? '' : issue.path.slice(1)}`,
15476
+ });
15477
+ }
15478
+ }
15479
+ if (!item || typeof item !== 'object' || !Object.prototype.hasOwnProperty.call(item, 'value')) {
15480
+ diagnostics.push({
15481
+ code: 'binding-transform-select-case-value-required',
15482
+ message: 'Every select-case branch must declare a value.',
15483
+ path: `${path}.cases.${caseIndex}.value`,
15484
+ });
15485
+ }
15486
+ }
15487
+ if (!Object.prototype.hasOwnProperty.call(transform, 'defaultValue')) {
15488
+ diagnostics.push({
15489
+ code: 'binding-transform-select-case-default-required',
15490
+ message: 'Select-case transform must declare a total defaultValue.',
15491
+ path: `${path}.defaultValue`,
15492
+ });
15493
+ }
15494
+ else if (transform.output?.stableShape !== false) {
15495
+ const defaultMode = inferTransformMode(transform.defaultValue);
15496
+ for (const [caseIndex, item] of cases.entries()) {
15497
+ if (item
15498
+ && typeof item === 'object'
15499
+ && Object.prototype.hasOwnProperty.call(item, 'value')
15500
+ && inferTransformMode(item.value) !== defaultMode) {
15501
+ diagnostics.push({
15502
+ code: 'binding-transform-select-case-shape-inconsistent',
15503
+ message: 'Select-case branches must preserve the defaultValue shape unless output.stableShape is false.',
15504
+ path: `${path}.cases.${caseIndex}.value`,
15505
+ });
15506
+ }
15507
+ }
15508
+ }
15509
+ return;
15510
+ }
15511
+ diagnostics.push({
15512
+ code: 'binding-transform-kind-unsupported',
15513
+ message: 'Binding transform kind is not supported by UiCompositionPlan.',
15514
+ path: `${path}.kind`,
15515
+ });
15516
+ }
15517
+ function validatePlannedTransformOutput(output, diagnostics, path) {
15518
+ if (output === undefined)
15519
+ return;
15520
+ if (!output || typeof output !== 'object' || Array.isArray(output)) {
15521
+ diagnostics.push({
15522
+ code: 'binding-transform-output-object-required',
15523
+ message: 'Transform output must be an object when provided.',
15524
+ path,
15525
+ });
15526
+ return;
15527
+ }
15528
+ const candidate = output;
15529
+ if (!UI_COMPOSITION_TRANSFORM_SEMANTIC_KINDS.has(candidate['semanticKind'])) {
15530
+ diagnostics.push({
15531
+ code: 'binding-transform-output-semantic-kind-invalid',
15532
+ message: 'Transform output must declare a canonical semanticKind.',
15533
+ path: `${path}.semanticKind`,
15534
+ });
15535
+ }
15536
+ if (candidate['stableShape'] !== undefined && typeof candidate['stableShape'] !== 'boolean') {
15537
+ diagnostics.push({
15538
+ code: 'binding-transform-output-stable-shape-invalid',
15539
+ message: 'Transform output stableShape must be boolean when provided.',
15540
+ path: `${path}.stableShape`,
15541
+ });
15247
15542
  }
15248
- validateCanvas(plan.canvas, widgetKeys, diagnostics);
15249
- validateGrouping(plan.grouping, widgetKeys, diagnostics);
15250
- validateDeviceLayouts(plan.deviceLayouts, widgetKeys, diagnostics);
15251
- validateSlotAssignments(plan.slotAssignments, widgetKeys, diagnostics);
15252
- diagnostics.push(...validateUiCompositionPlanLayout(plan));
15253
- return diagnostics;
15254
15543
  }
15255
15544
  function validateSelectionSync(selectionSync, widgetKeys, diagnostics, path) {
15256
15545
  if (!selectionSync || typeof selectionSync !== 'object') {
@@ -15261,7 +15550,7 @@ function validateSelectionSync(selectionSync, widgetKeys, diagnostics, path) {
15261
15550
  });
15262
15551
  return;
15263
15552
  }
15264
- if (!selectionSync.id?.trim()) {
15553
+ if (typeof selectionSync.id !== 'string' || !selectionSync.id.trim()) {
15265
15554
  diagnostics.push({
15266
15555
  code: 'selection-sync-id-required',
15267
15556
  message: 'Every selection sync must declare a stable id.',
@@ -15275,14 +15564,14 @@ function validateSelectionSync(selectionSync, widgetKeys, diagnostics, path) {
15275
15564
  path: `${path}.intent`,
15276
15565
  });
15277
15566
  }
15278
- if (!selectionSync.sources?.length) {
15567
+ if (!Array.isArray(selectionSync.sources) || !selectionSync.sources.length) {
15279
15568
  diagnostics.push({
15280
15569
  code: 'selection-sync-source-required',
15281
15570
  message: 'Selection sync must declare at least one component output source.',
15282
15571
  path: `${path}.sources`,
15283
15572
  });
15284
15573
  }
15285
- for (const [sourceIndex, source] of (selectionSync.sources ?? []).entries()) {
15574
+ for (const [sourceIndex, source] of (Array.isArray(selectionSync.sources) ? selectionSync.sources : []).entries()) {
15286
15575
  validateEndpoint(source, widgetKeys, diagnostics, `${path}.sources.${sourceIndex}`, 'source');
15287
15576
  if (source?.kind !== 'component-port') {
15288
15577
  diagnostics.push({
@@ -15309,7 +15598,7 @@ function validateSelectionSync(selectionSync, widgetKeys, diagnostics, path) {
15309
15598
  else {
15310
15599
  validateEndpoint(selectionSync.target, widgetKeys, diagnostics, `${path}.target`, 'target');
15311
15600
  }
15312
- const mappings = Object.entries(selectionSync.mapping ?? {});
15601
+ const mappings = isRecord$2(selectionSync.mapping) ? Object.entries(selectionSync.mapping) : [];
15313
15602
  if (!mappings.length) {
15314
15603
  diagnostics.push({
15315
15604
  code: 'selection-sync-mapping-required',
@@ -15325,8 +15614,12 @@ function validateSelectionSync(selectionSync, widgetKeys, diagnostics, path) {
15325
15614
  path: `${path}.mapping`,
15326
15615
  });
15327
15616
  }
15328
- const sourcePath = typeof mapping === 'string' ? mapping : mapping?.path;
15329
- if (!sourcePath?.trim()) {
15617
+ const sourcePath = typeof mapping === 'string'
15618
+ ? mapping
15619
+ : isRecord$2(mapping) && typeof mapping['path'] === 'string'
15620
+ ? mapping['path']
15621
+ : '';
15622
+ if (!sourcePath.trim()) {
15330
15623
  diagnostics.push({
15331
15624
  code: 'selection-sync-source-path-required',
15332
15625
  message: `Selection sync mapping "${targetKey}" must declare a source path.`,
@@ -15340,14 +15633,14 @@ function validateContextScope(contextScope, plan, widgetKeys, diagnostics, path)
15340
15633
  diagnostics.push({ code: 'context-scope-required', message: 'Context scope must be an object.', path });
15341
15634
  return;
15342
15635
  }
15343
- if (!contextScope.id?.trim()) {
15636
+ if (typeof contextScope.id !== 'string' || !contextScope.id.trim()) {
15344
15637
  diagnostics.push({
15345
15638
  code: 'context-scope-id-required',
15346
15639
  message: 'Every context scope must declare a stable id.',
15347
15640
  path: `${path}.id`,
15348
15641
  });
15349
15642
  }
15350
- const contextEntries = Object.entries(contextScope.context ?? {});
15643
+ const contextEntries = isRecord$2(contextScope.context) ? Object.entries(contextScope.context) : [];
15351
15644
  if (!contextEntries.length) {
15352
15645
  diagnostics.push({
15353
15646
  code: 'context-scope-context-required',
@@ -15363,8 +15656,8 @@ function validateContextScope(contextScope, plan, widgetKeys, diagnostics, path)
15363
15656
  path: `${path}.context`,
15364
15657
  });
15365
15658
  }
15366
- if (contextValue?.kind === 'state') {
15367
- if (!contextValue.path?.trim()) {
15659
+ if (isRecord$2(contextValue) && contextValue['kind'] === 'state') {
15660
+ if (typeof contextValue['path'] !== 'string' || !contextValue['path'].trim()) {
15368
15661
  diagnostics.push({
15369
15662
  code: 'context-scope-state-path-required',
15370
15663
  message: `Context value "${contextKey}" must declare a state path.`,
@@ -15372,7 +15665,7 @@ function validateContextScope(contextScope, plan, widgetKeys, diagnostics, path)
15372
15665
  });
15373
15666
  }
15374
15667
  }
15375
- else if (contextValue?.kind === 'constant') {
15668
+ else if (isRecord$2(contextValue) && contextValue['kind'] === 'constant') {
15376
15669
  if (!Object.prototype.hasOwnProperty.call(contextValue, 'value')) {
15377
15670
  diagnostics.push({
15378
15671
  code: 'context-scope-constant-value-required',
@@ -15389,7 +15682,7 @@ function validateContextScope(contextScope, plan, widgetKeys, diagnostics, path)
15389
15682
  });
15390
15683
  }
15391
15684
  }
15392
- if (!contextScope.targets?.length) {
15685
+ if (!Array.isArray(contextScope.targets) || !contextScope.targets.length) {
15393
15686
  diagnostics.push({
15394
15687
  code: 'context-scope-target-required',
15395
15688
  message: 'Context scope must declare at least one component target.',
@@ -15397,9 +15690,19 @@ function validateContextScope(contextScope, plan, widgetKeys, diagnostics, path)
15397
15690
  });
15398
15691
  }
15399
15692
  const accessor = new NestedWidgetConfigAccessor();
15400
- const owners = new Map((plan.widgets ?? []).map((widget) => [widget.key, toWidgetInstance(widget, [])]));
15401
- for (const [targetIndex, target] of (contextScope.targets ?? []).entries()) {
15693
+ const owners = new Map((Array.isArray(plan.widgets) ? plan.widgets : [])
15694
+ .filter((widget) => isRecord$2(widget) && typeof widget['key'] === 'string' && typeof widget['componentId'] === 'string')
15695
+ .map((widget) => [widget.key, toWidgetInstance(widget, [])]));
15696
+ for (const [targetIndex, target] of (Array.isArray(contextScope.targets) ? contextScope.targets : []).entries()) {
15402
15697
  const targetPath = `${path}.targets.${targetIndex}`;
15698
+ if (!isRecord$2(target)) {
15699
+ diagnostics.push({
15700
+ code: 'context-scope-target-object-required',
15701
+ message: 'Context scope targets must be objects.',
15702
+ path: targetPath,
15703
+ });
15704
+ continue;
15705
+ }
15403
15706
  if (!widgetKeys.has(target.widget)) {
15404
15707
  diagnostics.push({
15405
15708
  code: 'context-scope-target-widget-not-found',
@@ -15417,7 +15720,7 @@ function validateContextScope(contextScope, plan, widgetKeys, diagnostics, path)
15417
15720
  path: `${targetPath}.nestedPath`,
15418
15721
  });
15419
15722
  }
15420
- for (const inheritedKey of target.inherit ?? []) {
15723
+ for (const inheritedKey of (Array.isArray(target.inherit) ? target.inherit : [])) {
15421
15724
  if (!Object.prototype.hasOwnProperty.call(contextScope.context ?? {}, inheritedKey)) {
15422
15725
  diagnostics.push({
15423
15726
  code: 'context-scope-inherited-key-not-found',
@@ -15483,8 +15786,10 @@ function validateDeviceLayouts(deviceLayouts, widgetKeys, diagnostics) {
15483
15786
  });
15484
15787
  }
15485
15788
  }
15486
- for (const [groupIndex, override] of (variant?.groupingOverrides ?? []).entries()) {
15487
- for (const widgetKey of override.widgetKeys ?? []) {
15789
+ for (const [groupIndex, override] of (Array.isArray(variant?.groupingOverrides) ? variant.groupingOverrides : []).entries()) {
15790
+ if (!isRecord$2(override))
15791
+ continue;
15792
+ for (const widgetKey of (Array.isArray(override.widgetKeys) ? override.widgetKeys : [])) {
15488
15793
  if (!widgetKeys.has(widgetKey)) {
15489
15794
  diagnostics.push({
15490
15795
  code: 'device-layout-grouping-widget-not-found',
@@ -15493,8 +15798,10 @@ function validateDeviceLayouts(deviceLayouts, widgetKeys, diagnostics) {
15493
15798
  });
15494
15799
  }
15495
15800
  }
15496
- for (const [tabIndex, tab] of (override.tabs ?? []).entries()) {
15497
- for (const widgetKey of tab.widgetKeys ?? []) {
15801
+ for (const [tabIndex, tab] of (Array.isArray(override.tabs) ? override.tabs : []).entries()) {
15802
+ if (!isRecord$2(tab))
15803
+ continue;
15804
+ for (const widgetKey of (Array.isArray(tab.widgetKeys) ? tab.widgetKeys : [])) {
15498
15805
  if (!widgetKeys.has(widgetKey)) {
15499
15806
  diagnostics.push({
15500
15807
  code: 'device-layout-grouping-widget-not-found',
@@ -15512,7 +15819,7 @@ function validateGrouping(grouping, widgetKeys, diagnostics) {
15512
15819
  return;
15513
15820
  const groupIds = new Set();
15514
15821
  grouping.forEach((group, index) => {
15515
- if (!group?.id?.trim()) {
15822
+ if (!isRecord$2(group) || typeof group['id'] !== 'string' || !group['id'].trim()) {
15516
15823
  diagnostics.push({
15517
15824
  code: 'group-id-required',
15518
15825
  message: 'Every planned group must declare a stable id.',
@@ -15529,8 +15836,8 @@ function validateGrouping(grouping, widgetKeys, diagnostics) {
15529
15836
  }
15530
15837
  groupIds.add(group.id);
15531
15838
  const references = group.kind === 'tabs'
15532
- ? group.tabs.flatMap((tab) => tab.widgetKeys ?? [])
15533
- : group.widgetKeys ?? [];
15839
+ ? (Array.isArray(group.tabs) ? group.tabs : []).flatMap((tab) => isRecord$2(tab) && Array.isArray(tab['widgetKeys']) ? tab['widgetKeys'] : [])
15840
+ : (Array.isArray(group.widgetKeys) ? group.widgetKeys : []);
15534
15841
  references.forEach((widgetKey) => {
15535
15842
  if (!widgetKeys.has(widgetKey)) {
15536
15843
  diagnostics.push({
@@ -15559,7 +15866,7 @@ function validateEndpoint(endpoint, widgetKeys, diagnostics, path, role) {
15559
15866
  path: `${path}.widget`,
15560
15867
  });
15561
15868
  }
15562
- if (!endpoint.port?.trim()) {
15869
+ if (typeof endpoint.port !== 'string' || !endpoint.port.trim()) {
15563
15870
  diagnostics.push({
15564
15871
  code: 'endpoint-port-required',
15565
15872
  message: 'Component endpoint must declare a port.',
@@ -15570,7 +15877,7 @@ function validateEndpoint(endpoint, widgetKeys, diagnostics, path, role) {
15570
15877
  return;
15571
15878
  }
15572
15879
  if (endpoint.kind === 'state') {
15573
- if (!endpoint.path?.trim()) {
15880
+ if (typeof endpoint.path !== 'string' || !endpoint.path.trim()) {
15574
15881
  diagnostics.push({
15575
15882
  code: 'endpoint-state-path-required',
15576
15883
  message: 'State endpoint must declare a path.',
@@ -15580,7 +15887,7 @@ function validateEndpoint(endpoint, widgetKeys, diagnostics, path, role) {
15580
15887
  return;
15581
15888
  }
15582
15889
  if (endpoint.kind === 'global-action') {
15583
- if (!endpoint.actionId?.trim()) {
15890
+ if (typeof endpoint.actionId !== 'string' || !endpoint.actionId.trim()) {
15584
15891
  diagnostics.push({
15585
15892
  code: 'endpoint-global-action-id-required',
15586
15893
  message: 'Global-action endpoint must declare an actionId.',
@@ -15613,10 +15920,23 @@ function validateEndpoint(endpoint, widgetKeys, diagnostics, path, role) {
15613
15920
  });
15614
15921
  }
15615
15922
  function validateNestedPath(nestedPath, diagnostics, path) {
15616
- if (!nestedPath?.length)
15923
+ if (nestedPath === undefined)
15924
+ return;
15925
+ if (!Array.isArray(nestedPath)) {
15926
+ diagnostics.push({
15927
+ code: 'endpoint-nested-path-array-required',
15928
+ message: 'Nested component endpoint path must be an array.',
15929
+ path,
15930
+ });
15931
+ return;
15932
+ }
15933
+ if (!nestedPath.length)
15617
15934
  return;
15618
15935
  const terminal = nestedPath[nestedPath.length - 1];
15619
- if (terminal?.kind !== 'widget' || !terminal.key?.trim()) {
15936
+ if (!isRecord$2(terminal)
15937
+ || terminal['kind'] !== 'widget'
15938
+ || typeof terminal['key'] !== 'string'
15939
+ || !terminal['key'].trim()) {
15620
15940
  diagnostics.push({
15621
15941
  code: 'endpoint-nested-terminal-widget-key-required',
15622
15942
  message: 'Nested component endpoint must end with a widget segment with a stable key.',
@@ -15808,6 +16128,10 @@ function toCompositionEndpoint(endpoint) {
15808
16128
  };
15809
16129
  }
15810
16130
  function toCompositionTransform(transform) {
16131
+ const fallback = 'fallbackValue' in transform
16132
+ && Object.prototype.hasOwnProperty.call(transform, 'fallbackValue')
16133
+ ? { fallbackValue: clone(transform.fallbackValue) }
16134
+ : {};
15811
16135
  if (transform.kind === 'query-context') {
15812
16136
  const valuePath = transform.valueVar?.trim() || 'payload';
15813
16137
  return {
@@ -15837,6 +16161,7 @@ function toCompositionTransform(transform) {
15837
16161
  semanticKind: 'query-context',
15838
16162
  stableShape: true,
15839
16163
  },
16164
+ ...fallback,
15840
16165
  };
15841
16166
  }
15842
16167
  if (transform.kind === 'template') {
@@ -15869,6 +16194,31 @@ function toCompositionTransform(transform) {
15869
16194
  },
15870
16195
  ],
15871
16196
  ...(output ? { output } : {}),
16197
+ ...fallback,
16198
+ };
16199
+ }
16200
+ if (transform.kind === 'select-case') {
16201
+ const output = transform.output
16202
+ ? clone(transform.output)
16203
+ : inferTransformOutput(transform.defaultValue);
16204
+ return {
16205
+ version: '2.0',
16206
+ phase: 'state-materialization',
16207
+ mode: inferTransformMode(transform.defaultValue),
16208
+ sourceBindings: [{ source: transform.inputSource ?? 'payload' }],
16209
+ steps: [
16210
+ {
16211
+ id: transform.id,
16212
+ kind: 'select-case',
16213
+ phase: 'state-materialization',
16214
+ config: {
16215
+ cases: clone(transform.cases),
16216
+ defaultValue: clone(transform.defaultValue),
16217
+ },
16218
+ },
16219
+ ],
16220
+ output,
16221
+ ...fallback,
15872
16222
  };
15873
16223
  }
15874
16224
  if (transform.kind === 'constant') {
@@ -15886,6 +16236,7 @@ function toCompositionTransform(transform) {
15886
16236
  },
15887
16237
  },
15888
16238
  ],
16239
+ ...fallback,
15889
16240
  };
15890
16241
  }
15891
16242
  return {
@@ -15903,6 +16254,25 @@ function toCompositionTransform(transform) {
15903
16254
  },
15904
16255
  },
15905
16256
  ],
16257
+ ...fallback,
16258
+ };
16259
+ }
16260
+ function inferTransformMode(value) {
16261
+ if (Array.isArray(value))
16262
+ return 'collection';
16263
+ if (value !== null && typeof value === 'object')
16264
+ return 'object-fragment';
16265
+ return 'single-value';
16266
+ }
16267
+ function inferTransformOutput(value) {
16268
+ const mode = inferTransformMode(value);
16269
+ return {
16270
+ semanticKind: mode === 'collection'
16271
+ ? 'collection'
16272
+ : mode === 'object-fragment'
16273
+ ? 'config-fragment'
16274
+ : 'value',
16275
+ stableShape: true,
15906
16276
  };
15907
16277
  }
15908
16278
  function clone(value) {
@@ -15916,6 +16286,97 @@ function clone(value) {
15916
16286
  }
15917
16287
  }
15918
16288
 
16289
+ /**
16290
+ * Verifies that a persisted semantic source still describes the executable
16291
+ * page opened by the builder. An invalid envelope is never returned as usable
16292
+ * authoring context.
16293
+ */
16294
+ function verifyUiCompositionAuthoringSource(candidate, page, context = {}) {
16295
+ if (candidate == null) {
16296
+ return {
16297
+ valid: false,
16298
+ source: null,
16299
+ diagnostics: [{
16300
+ code: 'authoring-source-absent',
16301
+ message: 'A página não possui fonte semântica persistida.',
16302
+ blocking: false,
16303
+ }],
16304
+ };
16305
+ }
16306
+ if (!isRecord$1(candidate)) {
16307
+ return invalid('authoring-source-schema-invalid', 'O envelope de authoring não é um objeto JSON.');
16308
+ }
16309
+ const diagnostics = [];
16310
+ const source = candidate['source'];
16311
+ const materialization = candidate['materialization'];
16312
+ const provenance = candidate['provenance'];
16313
+ if (candidate['schemaVersion'] !== 'praxis.ui-authoring-source/v1') {
16314
+ diagnostics.push(blocking('authoring-source-schema-invalid', 'A versão do envelope de authoring não é suportada pelo Page Builder.'));
16315
+ }
16316
+ if (candidate['kind'] !== 'ui-composition-plan') {
16317
+ diagnostics.push(blocking('authoring-source-kind-invalid', 'A fonte persistida não declara o tipo ui-composition-plan.'));
16318
+ }
16319
+ if (!isRecord$1(source)
16320
+ || source['kind'] !== 'praxis.ui-composition-plan'
16321
+ || source['version'] !== '1.0'
16322
+ || !Array.isArray(source['widgets'])) {
16323
+ diagnostics.push(blocking('authoring-source-plan-invalid', 'O UiCompositionPlan persistido não atende ao contrato canônico 1.0.'));
16324
+ }
16325
+ if (!isRecord$1(materialization)) {
16326
+ diagnostics.push(blocking('authoring-source-schema-invalid', 'O envelope não contém a identidade da materialização.'));
16327
+ }
16328
+ else {
16329
+ if (materialization['kind'] !== 'widget-page-definition') {
16330
+ diagnostics.push(blocking('authoring-source-materialization-kind-invalid', 'A fonte não descreve uma materialização WidgetPageDefinition.'));
16331
+ }
16332
+ const expectedType = context.componentType?.trim() || 'praxis-dynamic-page';
16333
+ const expectedId = context.componentId?.trim();
16334
+ if (materialization['componentType'] !== expectedType) {
16335
+ diagnostics.push(blocking('authoring-source-component-type-mismatch', 'A fonte pertence a outro tipo de componente.'));
16336
+ }
16337
+ if (expectedId && materialization['componentId'] !== expectedId) {
16338
+ diagnostics.push(blocking('authoring-source-component-id-mismatch', 'A fonte pertence a outra instância de página.'));
16339
+ }
16340
+ }
16341
+ if (!isRecord$1(provenance)
16342
+ || !hasText(provenance['streamId'])
16343
+ || !hasText(provenance['threadId'])
16344
+ || !hasText(provenance['turnId'])
16345
+ || !hasText(provenance['resultEventId'])) {
16346
+ diagnostics.push(blocking('authoring-source-provenance-invalid', 'A fonte não contém a proveniência completa do resultado terminal.'));
16347
+ }
16348
+ if (isRecord$1(source)
16349
+ && normalizeHash(candidate['sourceSha256']) !== canonicalJsonSha256(source)) {
16350
+ diagnostics.push(blocking('authoring-source-hash-mismatch', 'O hash da fonte semântica não corresponde ao plano recebido.'));
16351
+ }
16352
+ if (isRecord$1(materialization)
16353
+ && normalizeHash(materialization['sha256']) !== canonicalJsonSha256(page)) {
16354
+ diagnostics.push(blocking('authoring-source-materialization-hash-mismatch', 'A página executável divergiu da materialização atestada.'));
16355
+ }
16356
+ return diagnostics.some((diagnostic) => diagnostic.blocking)
16357
+ ? { valid: false, source: null, diagnostics }
16358
+ : {
16359
+ valid: true,
16360
+ source: candidate,
16361
+ diagnostics,
16362
+ };
16363
+ }
16364
+ function invalid(code, message) {
16365
+ return { valid: false, source: null, diagnostics: [blocking(code, message)] };
16366
+ }
16367
+ function blocking(code, message) {
16368
+ return { code, message, blocking: true };
16369
+ }
16370
+ function normalizeHash(value) {
16371
+ return typeof value === 'string' ? value.trim().toLowerCase() : '';
16372
+ }
16373
+ function isRecord$1(value) {
16374
+ return !!value && typeof value === 'object' && !Array.isArray(value);
16375
+ }
16376
+ function hasText(value) {
16377
+ return typeof value === 'string' && value.trim().length > 0;
16378
+ }
16379
+
15919
16380
  /**
15920
16381
  * Fail-closed pre-apply attestation against the registry that will materialize the page.
15921
16382
  * It does not render widgets, execute links, call HTTP endpoints or persist configuration.
@@ -16363,7 +16824,6 @@ function normalizePageBuilderRuntimeWidget(widget) {
16363
16824
  delete inputs['schemaUrl'];
16364
16825
  }
16365
16826
  if (definition.id === 'praxis-table') {
16366
- delete inputs['title'];
16367
16827
  delete inputs['schemaUrl'];
16368
16828
  delete inputs['submitUrl'];
16369
16829
  delete inputs['submitMethod'];
@@ -21626,6 +22086,7 @@ class PageBuilderAgenticAuthoringTurnFlow {
21626
22086
  };
21627
22087
  }
21628
22088
  buildIntentResolutionRequest(prompt, selectedWidgetKey, componentCapabilities, authoringContext) {
22089
+ const intentContextHints = this.withoutAuthoringPersistenceContext(this.toJsonObject(authoringContext.contextHints));
21629
22090
  return {
21630
22091
  userPrompt: prompt,
21631
22092
  targetApp: this.context.targetApp,
@@ -21638,6 +22099,7 @@ class PageBuilderAgenticAuthoringTurnFlow {
21638
22099
  apiKey: this.context.apiKey(),
21639
22100
  componentCapabilities,
21640
22101
  ...authoringContext,
22102
+ contextHints: intentContextHints ?? undefined,
21641
22103
  };
21642
22104
  }
21643
22105
  resolveSelectedWidgetKey(selectedWidgetKey, contextHints) {
@@ -21658,9 +22120,23 @@ class PageBuilderAgenticAuthoringTurnFlow {
21658
22120
  const clientActions = (this.context.clientActions?.() ?? [])
21659
22121
  .slice(0, 20)
21660
22122
  .map((action) => ({ ...action }));
21661
- const contextualBase = clientActions.length
22123
+ let contextualBase = clientActions.length
21662
22124
  ? { ...scopedBase, clientActions }
21663
22125
  : scopedBase;
22126
+ const authoringSource = this.context.currentUiCompositionAuthoringSource?.() ?? null;
22127
+ if (authoringSource) {
22128
+ contextualBase = {
22129
+ ...contextualBase,
22130
+ uiCompositionAuthoringSource: this.cloneJsonObject(this.toJsonObject(authoringSource)),
22131
+ };
22132
+ }
22133
+ const applyTarget = this.context.applyTarget?.() ?? null;
22134
+ if (applyTarget) {
22135
+ contextualBase = {
22136
+ ...contextualBase,
22137
+ agenticApplyTarget: this.cloneJsonObject(this.toJsonObject(applyTarget)),
22138
+ };
22139
+ }
21664
22140
  const includeLlmDiagnostics = this.context.includeLlmDiagnostics?.() === true;
21665
22141
  if (!includeLlmDiagnostics) {
21666
22142
  return contextualBase;
@@ -21806,6 +22282,14 @@ class PageBuilderAgenticAuthoringTurnFlow {
21806
22282
  delete sanitized['agenticApplyTarget'];
21807
22283
  return sanitized;
21808
22284
  }
22285
+ withoutAuthoringPersistenceContext(contextHints) {
22286
+ if (!contextHints)
22287
+ return null;
22288
+ const sanitized = { ...contextHints };
22289
+ delete sanitized['agenticApplyTarget'];
22290
+ delete sanitized['uiCompositionAuthoringSource'];
22291
+ return Object.keys(sanitized).length > 0 ? sanitized : null;
22292
+ }
21809
22293
  matchesCurrentApplyTarget(target) {
21810
22294
  if (this.context.matchesApplyTarget) {
21811
22295
  return this.context.matchesApplyTarget(target);
@@ -22126,6 +22610,8 @@ class DynamicPageBuilderComponent {
22126
22610
  agenticAuthoringEnableStreaming = false;
22127
22611
  agenticAuthoringVoiceInputMode = 'disabled';
22128
22612
  agenticAuthoringContextHints;
22613
+ /** Canonical persisted payload, revision and semantic source used to reopen authoring. */
22614
+ authoringDocument;
22129
22615
  showPageLifecycleActions = false;
22130
22616
  canDeleteSavedPage = false;
22131
22617
  pageLifecycleBusy = false;
@@ -22160,6 +22646,12 @@ class DynamicPageBuilderComponent {
22160
22646
  agenticAuthoringApplyTarget = signal(null, ...(ngDevMode ? [{ debugName: "agenticAuthoringApplyTarget" }] : /* istanbul ignore next */ []));
22161
22647
  agenticAuthoringCanApply = signal(false, ...(ngDevMode ? [{ debugName: "agenticAuthoringCanApply" }] : /* istanbul ignore next */ []));
22162
22648
  agenticAuthoringLastEtag = signal(null, ...(ngDevMode ? [{ debugName: "agenticAuthoringLastEtag" }] : /* istanbul ignore next */ []));
22649
+ persistedUiCompositionAuthoringSource = signal(null, ...(ngDevMode ? [{ debugName: "persistedUiCompositionAuthoringSource" }] : /* istanbul ignore next */ []));
22650
+ uiCompositionAuthoringSourceVerification = computed(() => verifyUiCompositionAuthoringSource(this.persistedUiCompositionAuthoringSource(), this.currentPage(), {
22651
+ componentId: this.resolveAgenticComponentId(),
22652
+ componentType: 'praxis-dynamic-page',
22653
+ }), ...(ngDevMode ? [{ debugName: "uiCompositionAuthoringSourceVerification" }] : /* istanbul ignore next */ []));
22654
+ uiCompositionAuthoringBlockingDiagnostics = computed(() => this.uiCompositionAuthoringSourceVerification().diagnostics.filter((diagnostic) => diagnostic.blocking), ...(ngDevMode ? [{ debugName: "uiCompositionAuthoringBlockingDiagnostics" }] : /* istanbul ignore next */ []));
22163
22655
  agenticAuthoringConversation = signal([], ...(ngDevMode ? [{ debugName: "agenticAuthoringConversation" }] : /* istanbul ignore next */ []));
22164
22656
  agenticAuthoringQuickReplies = signal([], ...(ngDevMode ? [{ debugName: "agenticAuthoringQuickReplies" }] : /* istanbul ignore next */ []));
22165
22657
  agenticAuthoringAttachments = signal([], ...(ngDevMode ? [{ debugName: "agenticAuthoringAttachments" }] : /* istanbul ignore next */ []));
@@ -22193,6 +22685,7 @@ class DynamicPageBuilderComponent {
22193
22685
  }), ...(ngDevMode ? [{ debugName: "agenticAuthoringPanelLayout" }] : /* istanbul ignore next */ []));
22194
22686
  previewMode = signal(false, ...(ngDevMode ? [{ debugName: "previewMode" }] : /* istanbul ignore next */ []));
22195
22687
  runtimePageCache;
22688
+ lastRuntimePageChangeFingerprint = null;
22196
22689
  agenticComponentCapabilities;
22197
22690
  agenticComponentCapabilitiesPromise;
22198
22691
  agenticTurnController;
@@ -22221,8 +22714,24 @@ class DynamicPageBuilderComponent {
22221
22714
  }, { injector: this.injector });
22222
22715
  }
22223
22716
  ngOnChanges(changes) {
22224
- if (changes['page']) {
22225
- this.currentPage.set(this.parsePage(this.page) || { widgets: [] });
22717
+ const authoringDocumentChange = changes['authoringDocument'];
22718
+ if (authoringDocumentChange && this.authoringDocument) {
22719
+ const parsed = this.parsePage(this.authoringDocument.payload) || { widgets: [] };
22720
+ this.currentPage.set(parsed);
22721
+ this.lastRuntimePageChangeFingerprint = JSON.stringify(parsed);
22722
+ this.persistedUiCompositionAuthoringSource.set(this.authoringDocument.authoringSource
22723
+ ? this.cloneValue(this.authoringDocument.authoringSource)
22724
+ : null);
22725
+ this.agenticAuthoringLastEtag.set(this.authoringDocument.etag?.trim() || null);
22726
+ }
22727
+ else if (authoringDocumentChange && !this.authoringDocument) {
22728
+ this.persistedUiCompositionAuthoringSource.set(null);
22729
+ this.agenticAuthoringLastEtag.set(null);
22730
+ }
22731
+ else if (changes['page'] && !this.authoringDocument) {
22732
+ const parsed = this.parsePage(this.page) || { widgets: [] };
22733
+ this.currentPage.set(parsed);
22734
+ this.lastRuntimePageChangeFingerprint = JSON.stringify(parsed);
22226
22735
  }
22227
22736
  if (changes['authoringCapabilities']) {
22228
22737
  if (!this.isAuthoringCapabilityEnabled('connections')) {
@@ -22240,10 +22749,14 @@ class DynamicPageBuilderComponent {
22240
22749
  const componentInstanceChange = changes['componentInstanceId'];
22241
22750
  const agenticComponentIdChange = changes['agenticAuthoringComponentId'];
22242
22751
  const agenticScopeChange = changes['agenticAuthoringScope'];
22752
+ const authoringDocumentOwnerChanged = authoringDocumentChange
22753
+ && !authoringDocumentChange.isFirstChange()
22754
+ && `${authoringDocumentChange.previousValue?.componentId ?? ''}`.trim()
22755
+ !== `${authoringDocumentChange.currentValue?.componentId ?? ''}`.trim();
22243
22756
  const authoringOwnerChanged = (pageIdentityChange
22244
22757
  && !pageIdentityChange.isFirstChange()
22245
22758
  && this.pageIdentityFingerprint(pageIdentityChange.previousValue)
22246
- !== this.pageIdentityFingerprint(pageIdentityChange.currentValue)) || (componentInstanceChange
22759
+ !== this.pageIdentityFingerprint(pageIdentityChange.currentValue)) || authoringDocumentOwnerChanged || (componentInstanceChange
22247
22760
  && !componentInstanceChange.isFirstChange()
22248
22761
  && `${componentInstanceChange.previousValue ?? ''}`.trim()
22249
22762
  !== `${componentInstanceChange.currentValue ?? ''}`.trim()) || (agenticComponentIdChange
@@ -22347,16 +22860,17 @@ class DynamicPageBuilderComponent {
22347
22860
  }
22348
22861
  onRuntimePageChange(next) {
22349
22862
  const canonical = this.toCanonicalPageFromRuntime(next);
22350
- if (JSON.stringify(canonical) === JSON.stringify(this.currentPage())) {
22863
+ const fingerprint = JSON.stringify(canonical);
22864
+ if (fingerprint === this.lastRuntimePageChangeFingerprint) {
22351
22865
  return;
22352
22866
  }
22353
- this.currentPage.set(canonical);
22354
- this.clearSelectedWidgetIfMissing(canonical);
22867
+ this.lastRuntimePageChangeFingerprint = fingerprint;
22355
22868
  this.pageChange.emit(canonical);
22356
22869
  }
22357
22870
  onRuntimePageAuthoringChange(next) {
22358
22871
  const canonical = this.toCanonicalPageFromRuntime(next);
22359
22872
  this.currentPage.set(canonical);
22873
+ this.lastRuntimePageChangeFingerprint = JSON.stringify(canonical);
22360
22874
  this.clearSelectedWidgetIfMissing(canonical);
22361
22875
  this.pageAuthoringChange.emit(this.clonePage(canonical));
22362
22876
  }
@@ -24085,6 +24599,9 @@ class DynamicPageBuilderComponent {
24085
24599
  || !this.canUseAgenticAuthoring())
24086
24600
  return;
24087
24601
  this.agenticAuthoringLastEtag.set(result.etag ?? null);
24602
+ this.persistedUiCompositionAuthoringSource.set(result.authoringSource
24603
+ ? this.cloneValue(result.authoringSource)
24604
+ : null);
24088
24605
  this.agenticAuthoringApplied.emit(result);
24089
24606
  this.clearAgenticAuthoringPreviewState();
24090
24607
  this.agenticAuthoringMaterializationPending.set(false);
@@ -24958,6 +25475,7 @@ class DynamicPageBuilderComponent {
24958
25475
  currentRoute: () => this.pageIdentity?.routePath?.trim() || null,
24959
25476
  responseLocale: () => this.pageIdentity?.locale?.trim() || null,
24960
25477
  currentPage: () => this.currentPage(),
25478
+ currentUiCompositionAuthoringSource: () => this.uiCompositionAuthoringSourceVerification().source,
24961
25479
  selectedWidgetKey: () => this.resolveSelectedWidgetKey(),
24962
25480
  provider: () => this.agenticAuthoringProvider,
24963
25481
  model: () => this.agenticAuthoringModel,
@@ -25574,7 +26092,10 @@ class DynamicPageBuilderComponent {
25574
26092
  return normalized.trim();
25575
26093
  }
25576
26094
  currentAgenticAuthoringEtag() {
25577
- return this.agenticAuthoringLastEtag() || this.agenticAuthoringEtag || null;
26095
+ return this.agenticAuthoringLastEtag()
26096
+ || this.authoringDocument?.etag?.trim()
26097
+ || this.agenticAuthoringEtag
26098
+ || null;
25578
26099
  }
25579
26100
  cloneAgenticContextHints(contextHints) {
25580
26101
  if (!contextHints || typeof contextHints !== 'object' || Array.isArray(contextHints)) {
@@ -25746,6 +26267,9 @@ class DynamicPageBuilderComponent {
25746
26267
  const explicit = this.agenticAuthoringComponentId?.trim();
25747
26268
  if (explicit)
25748
26269
  return explicit;
26270
+ const persisted = this.authoringDocument?.componentId?.trim();
26271
+ if (persisted)
26272
+ return persisted;
25749
26273
  const routePath = this.pageIdentity?.routePath?.trim();
25750
26274
  if (routePath)
25751
26275
  return `page:${routePath}`;
@@ -25906,11 +26430,14 @@ class DynamicPageBuilderComponent {
25906
26430
  }
25907
26431
  return JSON.parse(JSON.stringify(value));
25908
26432
  }
26433
+ authoringSourceDiagnosticText(diagnostic) {
26434
+ return this.tx(`authoringSource.diagnostics.${diagnostic.code}`, diagnostic.message);
26435
+ }
25909
26436
  tx(key, fallback) {
25910
26437
  return resolvePraxisPageBuilderText(this.i18n, key, fallback);
25911
26438
  }
25912
26439
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicPageBuilderComponent, deps: [{ token: i1.MatDialog }, { token: SETTINGS_PANEL_BRIDGE, optional: true }], target: i0.ɵɵFactoryTarget.Component });
25913
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicPageBuilderComponent, isStandalone: true, selector: "praxis-dynamic-page-builder", inputs: { page: "page", context: "context", strictValidation: "strictValidation", autoPersist: "autoPersist", enableCustomization: "enableCustomization", authoringCapabilities: "authoringCapabilities", showSettingsButton: "showSettingsButton", pageIdentity: "pageIdentity", componentInstanceId: "componentInstanceId", pageEditorComponent: "pageEditorComponent", componentPaletteAllowedWidgetIds: "componentPaletteAllowedWidgetIds", componentPaletteAllowedWidgetTags: "componentPaletteAllowedWidgetTags", componentPaletteAllowedPresetIds: "componentPaletteAllowedPresetIds", enableAgenticAuthoring: "enableAgenticAuthoring", agenticAuthoringProvider: "agenticAuthoringProvider", agenticAuthoringModel: "agenticAuthoringModel", agenticAuthoringApiKey: "agenticAuthoringApiKey", agenticAuthoringComponentId: "agenticAuthoringComponentId", agenticAuthoringScope: "agenticAuthoringScope", agenticAuthoringEtag: "agenticAuthoringEtag", agenticAuthoringIncludeLlmDiagnostics: "agenticAuthoringIncludeLlmDiagnostics", agenticAuthoringEnableStreaming: "agenticAuthoringEnableStreaming", agenticAuthoringVoiceInputMode: "agenticAuthoringVoiceInputMode", agenticAuthoringContextHints: "agenticAuthoringContextHints", showPageLifecycleActions: "showPageLifecycleActions", canDeleteSavedPage: "canDeleteSavedPage", pageLifecycleBusy: "pageLifecycleBusy", pageLifecycleResetRevision: "pageLifecycleResetRevision" }, outputs: { pageChange: "pageChange", pageAuthoringChange: "pageAuthoringChange", widgetEvent: "widgetEvent", pageSaveRequested: "pageSaveRequested", agenticAuthoringApplied: "agenticAuthoringApplied", agenticAuthoringSharedRuleHandoff: "agenticAuthoringSharedRuleHandoff", pageRestart: "pageRestart", savedPageDeleteRequested: "savedPageDeleteRequested" }, providers: [
26440
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicPageBuilderComponent, isStandalone: true, selector: "praxis-dynamic-page-builder", inputs: { page: "page", context: "context", strictValidation: "strictValidation", autoPersist: "autoPersist", enableCustomization: "enableCustomization", authoringCapabilities: "authoringCapabilities", showSettingsButton: "showSettingsButton", pageIdentity: "pageIdentity", componentInstanceId: "componentInstanceId", pageEditorComponent: "pageEditorComponent", componentPaletteAllowedWidgetIds: "componentPaletteAllowedWidgetIds", componentPaletteAllowedWidgetTags: "componentPaletteAllowedWidgetTags", componentPaletteAllowedPresetIds: "componentPaletteAllowedPresetIds", enableAgenticAuthoring: "enableAgenticAuthoring", agenticAuthoringProvider: "agenticAuthoringProvider", agenticAuthoringModel: "agenticAuthoringModel", agenticAuthoringApiKey: "agenticAuthoringApiKey", agenticAuthoringComponentId: "agenticAuthoringComponentId", agenticAuthoringScope: "agenticAuthoringScope", agenticAuthoringEtag: "agenticAuthoringEtag", agenticAuthoringIncludeLlmDiagnostics: "agenticAuthoringIncludeLlmDiagnostics", agenticAuthoringEnableStreaming: "agenticAuthoringEnableStreaming", agenticAuthoringVoiceInputMode: "agenticAuthoringVoiceInputMode", agenticAuthoringContextHints: "agenticAuthoringContextHints", authoringDocument: "authoringDocument", showPageLifecycleActions: "showPageLifecycleActions", canDeleteSavedPage: "canDeleteSavedPage", pageLifecycleBusy: "pageLifecycleBusy", pageLifecycleResetRevision: "pageLifecycleResetRevision" }, outputs: { pageChange: "pageChange", pageAuthoringChange: "pageAuthoringChange", widgetEvent: "widgetEvent", pageSaveRequested: "pageSaveRequested", agenticAuthoringApplied: "agenticAuthoringApplied", agenticAuthoringSharedRuleHandoff: "agenticAuthoringSharedRuleHandoff", pageRestart: "pageRestart", savedPageDeleteRequested: "savedPageDeleteRequested" }, providers: [
25914
26441
  providePraxisPageBuilderI18n(),
25915
26442
  { provide: DYNAMIC_PAGE_SHELL_EDITOR, useValue: WidgetShellEditorComponent },
25916
26443
  ], viewQueries: [{ propertyName: "runtime", first: true, predicate: ["runtime"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
@@ -25919,6 +26446,26 @@ class DynamicPageBuilderComponent {
25919
26446
  [class.builder-shell--agentic-review-rail]="agenticAuthoringReviewRailActive()"
25920
26447
  [class.builder-shell--bottom-toolbar]="enableCustomization && !connectionsViewerOpen()"
25921
26448
  >
26449
+ @if (uiCompositionAuthoringBlockingDiagnostics().length) {
26450
+ <section
26451
+ class="builder-authoring-lineage-alert"
26452
+ data-testid="page-builder-authoring-lineage-alert"
26453
+ role="alert"
26454
+ aria-live="assertive"
26455
+ aria-atomic="true"
26456
+ >
26457
+ <span class="material-symbols-outlined" aria-hidden="true">verified_user</span>
26458
+ <div>
26459
+ <strong>{{ tx('authoringSource.alert.title', 'Linhagem semântica requer atenção') }}</strong>
26460
+ <p>{{ tx('authoringSource.alert.description', 'A página continua disponível, mas esta fonte não será reutilizada até que uma nova autoria governada restabeleça sua proveniência.') }}</p>
26461
+ <ul>
26462
+ @for (diagnostic of uiCompositionAuthoringBlockingDiagnostics(); track diagnostic.code) {
26463
+ <li>{{ authoringSourceDiagnosticText(diagnostic) }}</li>
26464
+ }
26465
+ </ul>
26466
+ </div>
26467
+ </section>
26468
+ }
25922
26469
  @if (showSettings() && !connectionsViewerOpen() && premiumReadinessIssues().length) {
25923
26470
  <section
25924
26471
  class="builder-premium-readiness"
@@ -26462,7 +27009,7 @@ class DynamicPageBuilderComponent {
26462
27009
  }
26463
27010
  </praxis-floating-toolbar>
26464
27011
  </div>
26465
- `, 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%;box-sizing:border-box}.builder-shell--bottom-toolbar{padding-block-end:calc(80px + env(safe-area-inset-bottom,0px))}.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", "authoringCapabilities", "showPageSettingsButton", "shellEditorComponent", "pageEditorComponent", "autoPersist", "pageIdentity", "componentInstanceId", "showWidgetAssistantButton"], outputs: ["pageChange", "pageAuthoringChange", "widgetEvent", "widgetSelectionChange", "widgetAssistantRequested", "widgetDiagnosticsChange"] }, { kind: "component", type: FloatingToolbarComponent, selector: "praxis-floating-toolbar", inputs: ["visible", "canUndo", "canRedo", "showSave", "showPreview", "showAdd", "showSettings", "editingEnabled", "previewActive", "connectionMode", "modeLabel", "addLabel", "saveLabel", "undoLabel", "redoLabel", "settingsLabel", "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"] }] });
27012
+ `, 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%;box-sizing:border-box}.builder-shell--bottom-toolbar{padding-block-end:calc(80px + env(safe-area-inset-bottom,0px))}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-authoring-lineage-alert{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;margin:0 0 14px;padding:12px 14px;border:1px solid var(--md-sys-color-error, #b3261e);border-radius:10px;background:var(--md-sys-color-error-container, #f9dedc);color:var(--md-sys-color-on-error-container, #410e0b)}.builder-authoring-lineage-alert strong{display:block}.builder-authoring-lineage-alert p{margin:4px 0 0}.builder-authoring-lineage-alert ul{margin:8px 0 0;padding-inline-start:20px}@media(forced-colors:active){.builder-authoring-lineage-alert{border:2px solid CanvasText;background:Canvas;color:CanvasText}}.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", "authoringCapabilities", "showPageSettingsButton", "shellEditorComponent", "pageEditorComponent", "autoPersist", "pageIdentity", "componentInstanceId", "showWidgetAssistantButton"], outputs: ["pageChange", "pageAuthoringChange", "widgetEvent", "widgetSelectionChange", "widgetAssistantRequested", "widgetDiagnosticsChange"] }, { kind: "component", type: FloatingToolbarComponent, selector: "praxis-floating-toolbar", inputs: ["visible", "canUndo", "canRedo", "showSave", "showPreview", "showAdd", "showSettings", "editingEnabled", "previewActive", "connectionMode", "modeLabel", "addLabel", "saveLabel", "undoLabel", "redoLabel", "settingsLabel", "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"] }] });
26466
27013
  }
26467
27014
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicPageBuilderComponent, decorators: [{
26468
27015
  type: Component,
@@ -26484,6 +27031,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
26484
27031
  [class.builder-shell--agentic-review-rail]="agenticAuthoringReviewRailActive()"
26485
27032
  [class.builder-shell--bottom-toolbar]="enableCustomization && !connectionsViewerOpen()"
26486
27033
  >
27034
+ @if (uiCompositionAuthoringBlockingDiagnostics().length) {
27035
+ <section
27036
+ class="builder-authoring-lineage-alert"
27037
+ data-testid="page-builder-authoring-lineage-alert"
27038
+ role="alert"
27039
+ aria-live="assertive"
27040
+ aria-atomic="true"
27041
+ >
27042
+ <span class="material-symbols-outlined" aria-hidden="true">verified_user</span>
27043
+ <div>
27044
+ <strong>{{ tx('authoringSource.alert.title', 'Linhagem semântica requer atenção') }}</strong>
27045
+ <p>{{ tx('authoringSource.alert.description', 'A página continua disponível, mas esta fonte não será reutilizada até que uma nova autoria governada restabeleça sua proveniência.') }}</p>
27046
+ <ul>
27047
+ @for (diagnostic of uiCompositionAuthoringBlockingDiagnostics(); track diagnostic.code) {
27048
+ <li>{{ authoringSourceDiagnosticText(diagnostic) }}</li>
27049
+ }
27050
+ </ul>
27051
+ </div>
27052
+ </section>
27053
+ }
26487
27054
  @if (showSettings() && !connectionsViewerOpen() && premiumReadinessIssues().length) {
26488
27055
  <section
26489
27056
  class="builder-premium-readiness"
@@ -27027,7 +27594,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
27027
27594
  }
27028
27595
  </praxis-floating-toolbar>
27029
27596
  </div>
27030
- `, 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%;box-sizing:border-box}.builder-shell--bottom-toolbar{padding-block-end:calc(80px + env(safe-area-inset-bottom,0px))}.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"] }]
27597
+ `, 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%;box-sizing:border-box}.builder-shell--bottom-toolbar{padding-block-end:calc(80px + env(safe-area-inset-bottom,0px))}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-authoring-lineage-alert{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;margin:0 0 14px;padding:12px 14px;border:1px solid var(--md-sys-color-error, #b3261e);border-radius:10px;background:var(--md-sys-color-error-container, #f9dedc);color:var(--md-sys-color-on-error-container, #410e0b)}.builder-authoring-lineage-alert strong{display:block}.builder-authoring-lineage-alert p{margin:4px 0 0}.builder-authoring-lineage-alert ul{margin:8px 0 0;padding-inline-start:20px}@media(forced-colors:active){.builder-authoring-lineage-alert{border:2px solid CanvasText;background:Canvas;color:CanvasText}}.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"] }]
27031
27598
  }], ctorParameters: () => [{ type: i1.MatDialog }, { type: undefined, decorators: [{
27032
27599
  type: Optional
27033
27600
  }, {
@@ -27084,6 +27651,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
27084
27651
  type: Input
27085
27652
  }], agenticAuthoringContextHints: [{
27086
27653
  type: Input
27654
+ }], authoringDocument: [{
27655
+ type: Input
27087
27656
  }], showPageLifecycleActions: [{
27088
27657
  type: Input
27089
27658
  }], canDeleteSavedPage: [{
@@ -27181,4 +27750,4 @@ function providePraxisPageBuilderMetadata() {
27181
27750
  * Generated bundle index. Do not edit.
27182
27751
  */
27183
27752
 
27184
- export { ComponentPaletteDialogComponent, ConfirmDialogComponent, ConnectionEditorComponent, DynamicPageBuilderComponent, DynamicPageConfigEditorComponent, FloatingToolbarComponent, PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS, PAGE_BUILDER_AI_CAPABILITIES, PAGE_BUILDER_COMPONENT_CONTEXT_PACK, PAGE_BUILDER_WIDGET_AI_CATALOGS, PLACEHOLDER, PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST, PRAXIS_PAGE_BUILDER_COMPONENT_METADATA, PageBuilderAgenticAuthoringService, PageConfigEditorComponent, TileToolbarComponent, UiCompositionResourcePreflightService, WidgetShellEditorComponent, clearWidgetAiCatalogs, compileUiCompositionPlan, getPageAiCatalog, getWidgetAiCapabilities, preflightUiCompositionPlan, preflightUiCompositionPlanResources, providePageBuilderWidgetAiCatalogs, providePraxisPageBuilderMetadata, registerWidgetAiCatalog, registerWidgetAiCatalogs, resolveUiCompositionPlanTemplate, validateUiCompositionPlan };
27753
+ export { ComponentPaletteDialogComponent, ConfirmDialogComponent, ConnectionEditorComponent, DynamicPageBuilderComponent, DynamicPageConfigEditorComponent, FloatingToolbarComponent, PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS, PAGE_BUILDER_AI_CAPABILITIES, PAGE_BUILDER_COMPONENT_CONTEXT_PACK, PAGE_BUILDER_WIDGET_AI_CATALOGS, PLACEHOLDER, PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST, PRAXIS_PAGE_BUILDER_COMPONENT_METADATA, PageBuilderAgenticAuthoringService, PageConfigEditorComponent, TileToolbarComponent, UiCompositionResourcePreflightService, WidgetShellEditorComponent, clearWidgetAiCatalogs, compileUiCompositionPlan, getPageAiCatalog, getWidgetAiCapabilities, preflightUiCompositionPlan, preflightUiCompositionPlanResources, providePageBuilderWidgetAiCatalogs, providePraxisPageBuilderMetadata, registerWidgetAiCatalog, registerWidgetAiCatalogs, resolveUiCompositionPlanTemplate, validateUiCompositionPlan, verifyUiCompositionAuthoringSource };