@praxisui/core 9.0.34 → 9.0.36

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.
@@ -23951,7 +23951,7 @@ function normalizeCompositionLink(link) {
23951
23951
  if (condition !== undefined) {
23952
23952
  normalized.condition = condition;
23953
23953
  }
23954
- const policy = normalizePolicy(link.policy);
23954
+ const policy = normalizePolicy(link.policy, link.id);
23955
23955
  if (policy) {
23956
23956
  normalized.policy = policy;
23957
23957
  }
@@ -24135,15 +24135,27 @@ function normalizeCondition(condition) {
24135
24135
  }
24136
24136
  return clone$1(condition);
24137
24137
  }
24138
- function normalizePolicy(policy) {
24138
+ function normalizePolicy(policy, linkId) {
24139
24139
  if (!policy) {
24140
24140
  return undefined;
24141
24141
  }
24142
+ const rawPolicy = policy;
24143
+ const delivery = rawPolicy['delivery'];
24144
+ const errorPolicy = rawPolicy['errorPolicy'];
24145
+ if (delivery !== undefined && delivery !== 'sync') {
24146
+ throw new Error(`Composition link '${linkId}' uses removed delivery '${String(delivery)}'. Use 'sync' or omit delivery.`);
24147
+ }
24148
+ if (errorPolicy !== undefined
24149
+ && errorPolicy !== 'diagnostic'
24150
+ && errorPolicy !== 'drop'
24151
+ && errorPolicy !== 'halt-page') {
24152
+ throw new Error(`Composition link '${linkId}' uses unsupported errorPolicy '${String(errorPolicy)}'.`);
24153
+ }
24142
24154
  const normalized = {
24143
24155
  ...(policy.debounceMs !== undefined ? { debounceMs: policy.debounceMs } : {}),
24144
24156
  ...(policy.distinct !== undefined ? { distinct: policy.distinct } : {}),
24145
24157
  ...(policy.distinctBy ? { distinctBy: policy.distinctBy } : {}),
24146
- ...(policy.delivery ? { delivery: policy.delivery } : {}),
24158
+ ...(policy.delivery === 'sync' ? { delivery: policy.delivery } : {}),
24147
24159
  ...(policy.missingValuePolicy ? { missingValuePolicy: policy.missingValuePolicy } : {}),
24148
24160
  ...(policy.errorPolicy ? { errorPolicy: policy.errorPolicy } : {}),
24149
24161
  };
@@ -34396,6 +34408,17 @@ class CompositionValidatorService {
34396
34408
  this.nestedPortCatalog = nestedPortCatalog;
34397
34409
  this.jsonLogic = jsonLogic;
34398
34410
  }
34411
+ validatePage(page, context = {}) {
34412
+ const links = context.links ?? [];
34413
+ return [
34414
+ ...this.validateRegisteredComponents(page, context.registry),
34415
+ ...this.validateLinks(links, {
34416
+ ...context,
34417
+ page,
34418
+ links,
34419
+ }),
34420
+ ];
34421
+ }
34399
34422
  validateLinks(links, context = {}) {
34400
34423
  const linkDiagnostics = links.flatMap((link) => this.validateLink(link, {
34401
34424
  ...context,
@@ -34409,6 +34432,7 @@ class CompositionValidatorService {
34409
34432
  validateLink(link, context = {}) {
34410
34433
  const diagnostics = [];
34411
34434
  this.validateEndpointDirections(link, diagnostics);
34435
+ this.validateRegisteredTopLevelPorts(link, diagnostics, context);
34412
34436
  this.validateNestedComponentEndpoints(link, diagnostics);
34413
34437
  this.validateNestedPortCatalog(link, diagnostics, context);
34414
34438
  this.validateNestedWidgetEventCoexistence(link, diagnostics, context);
@@ -34420,6 +34444,114 @@ class CompositionValidatorService {
34420
34444
  this.validateSemanticCompatibility(link, diagnostics);
34421
34445
  return diagnostics;
34422
34446
  }
34447
+ validateRegisteredComponents(page, registry) {
34448
+ if (!registry) {
34449
+ return [];
34450
+ }
34451
+ return (page.widgets || []).flatMap((widget) => {
34452
+ const componentId = widget.definition?.id?.trim();
34453
+ if (!componentId) {
34454
+ return [];
34455
+ }
34456
+ const metadata = registry.get(componentId);
34457
+ if (!metadata) {
34458
+ return [this.createPageDiagnostic(`widget:${widget.key}:SEMANTIC_COMPONENT_NOT_REGISTERED`, 'SEMANTIC_COMPONENT_NOT_REGISTERED', 'error', `O componente ${componentId} do widget ${widget.key} nao esta registrado no host-alvo.`, {
34459
+ kind: 'widget',
34460
+ widgetKey: widget.key,
34461
+ widgetType: componentId,
34462
+ path: `widgets.${widget.key}.definition.id`,
34463
+ }, { componentId })];
34464
+ }
34465
+ if (metadata.component == null) {
34466
+ return [this.createPageDiagnostic(`widget:${widget.key}:SEMANTIC_COMPONENT_NOT_MATERIALIZABLE`, 'SEMANTIC_COMPONENT_NOT_MATERIALIZABLE', 'error', `O componente ${componentId} esta no catalogo, mas nao possui tipo Angular materializavel no host-alvo.`, {
34467
+ kind: 'widget',
34468
+ widgetKey: widget.key,
34469
+ widgetType: componentId,
34470
+ path: `widgets.${widget.key}.definition.id`,
34471
+ }, { componentId })];
34472
+ }
34473
+ return [];
34474
+ });
34475
+ }
34476
+ validateRegisteredTopLevelPorts(link, diagnostics, context) {
34477
+ if (!context.page || !context.registry) {
34478
+ return;
34479
+ }
34480
+ const endpoints = [link.from, link.to].filter((endpoint) => endpoint.kind === 'component-port' && !endpoint.ref.nestedPath?.length);
34481
+ const resolvedPorts = new Map();
34482
+ for (const endpoint of endpoints) {
34483
+ const side = endpoint === link.from ? 'from' : 'to';
34484
+ const widget = (context.page.widgets || []).find((candidate) => candidate.key === endpoint.ref.widget);
34485
+ if (!widget) {
34486
+ diagnostics.push(this.createDiagnostic(link, 'SEMANTIC_ENDPOINT_WIDGET_MISSING', 'error', `O widget ${endpoint.ref.widget} referenciado pelo link ${link.id} nao existe.`, this.topLevelEndpointSubject(link, endpoint), { endpoint: side }));
34487
+ continue;
34488
+ }
34489
+ const componentId = widget.definition.id;
34490
+ if (endpoint.ref.componentType && endpoint.ref.componentType !== componentId) {
34491
+ diagnostics.push(this.createDiagnostic(link, 'SEMANTIC_ENDPOINT_COMPONENT_TYPE_MISMATCH', 'error', `O componentType do endpoint ${side} do link ${link.id} nao corresponde ao widget resolvido.`, this.topLevelEndpointSubject(link, endpoint), {
34492
+ endpoint: side,
34493
+ expectedComponentType: endpoint.ref.componentType,
34494
+ actualComponentType: componentId,
34495
+ }));
34496
+ }
34497
+ const metadata = context.registry.get(componentId);
34498
+ if (!metadata) {
34499
+ continue;
34500
+ }
34501
+ const matchingPorts = (metadata.ports || []).filter((port) => port.id === endpoint.ref.port);
34502
+ if (!matchingPorts.length) {
34503
+ diagnostics.push(this.createDiagnostic(link, 'SEMANTIC_PORT_NOT_REGISTERED', 'error', `A porta ${endpoint.ref.port} do componente ${componentId} nao esta registrada no host-alvo.`, this.topLevelEndpointSubject(link, endpoint), {
34504
+ endpoint: side,
34505
+ componentId,
34506
+ availablePorts: (metadata.ports || []).map((port) => port.id),
34507
+ }));
34508
+ continue;
34509
+ }
34510
+ const port = matchingPorts.find((candidate) => candidate.direction === endpoint.ref.direction);
34511
+ if (!port) {
34512
+ diagnostics.push(this.createDiagnostic(link, 'SEMANTIC_PORT_REGISTERED_DIRECTION_MISMATCH', 'error', `A porta ${endpoint.ref.port} do componente ${componentId} existe, mas com direcao diferente.`, this.topLevelEndpointSubject(link, endpoint), {
34513
+ endpoint: side,
34514
+ componentId,
34515
+ expectedDirection: endpoint.ref.direction,
34516
+ availableDirections: matchingPorts.map((candidate) => candidate.direction),
34517
+ }));
34518
+ continue;
34519
+ }
34520
+ resolvedPorts.set(side, port);
34521
+ }
34522
+ const sourcePort = resolvedPorts.get('from');
34523
+ const targetPort = resolvedPorts.get('to');
34524
+ if (sourcePort && targetPort) {
34525
+ this.validateRegisteredPortCompatibility(link, sourcePort, targetPort, diagnostics);
34526
+ }
34527
+ }
34528
+ validateRegisteredPortCompatibility(link, source, target, diagnostics) {
34529
+ const effectiveSourceKind = link.transform?.output?.semanticKind ?? source.semanticKind;
34530
+ const compatibility = target.compatibility;
34531
+ const knownSourceKind = effectiveSourceKind in COMPATIBLE_TARGET_KINDS;
34532
+ const genericallyIncompatible = knownSourceKind
34533
+ && !COMPATIBLE_TARGET_KINDS[effectiveSourceKind]
34534
+ .includes(target.semanticKind);
34535
+ const rejectsKind = compatibility?.rejectsSemanticKinds?.includes(effectiveSourceKind);
34536
+ const rejectsCardinality = !!(source.cardinality
34537
+ && compatibility?.acceptsCardinality?.length
34538
+ && !compatibility.acceptsCardinality.includes(source.cardinality));
34539
+ const doesNotAcceptKind = !!(compatibility?.acceptsSemanticKinds?.length
34540
+ && !compatibility.acceptsSemanticKinds.includes(effectiveSourceKind));
34541
+ if (!genericallyIncompatible && !rejectsKind && !rejectsCardinality && !doesNotAcceptKind) {
34542
+ return;
34543
+ }
34544
+ diagnostics.push(this.createDiagnostic(link, 'SEMANTIC_PORT_CONTRACT_INCOMPATIBLE', 'error', `As portas ${source.id} e ${target.id} do link ${link.id} nao sao semanticamente compativeis.`, {
34545
+ kind: 'link',
34546
+ linkId: link.id,
34547
+ }, {
34548
+ sourceSemanticKind: source.semanticKind,
34549
+ effectiveSourceKind,
34550
+ targetSemanticKind: target.semanticKind,
34551
+ sourceCardinality: source.cardinality,
34552
+ targetCompatibility: compatibility,
34553
+ }));
34554
+ }
34423
34555
  validateEndpointDirections(link, diagnostics) {
34424
34556
  if (link.from.kind === 'component-port' && link.from.ref.direction !== 'output') {
34425
34557
  diagnostics.push(this.createDiagnostic(link, 'SEMANTIC_PORT_DIRECTION_INVALID_SOURCE', 'error', `A origem do link ${link.id} precisa apontar para uma porta de saida.`, {
@@ -34806,6 +34938,30 @@ class CompositionValidatorService {
34806
34938
  createdAt: new Date().toISOString(),
34807
34939
  };
34808
34940
  }
34941
+ createPageDiagnostic(id, code, severity, message, subject, details) {
34942
+ return {
34943
+ id,
34944
+ code,
34945
+ severity,
34946
+ phase: 'semantic-validation',
34947
+ message,
34948
+ summary: message,
34949
+ subject,
34950
+ details,
34951
+ source: 'semantic-validator',
34952
+ blocking: true,
34953
+ createdAt: new Date().toISOString(),
34954
+ };
34955
+ }
34956
+ topLevelEndpointSubject(link, endpoint) {
34957
+ return {
34958
+ kind: 'port',
34959
+ widgetKey: endpoint.ref.widget,
34960
+ widgetType: endpoint.ref.componentType,
34961
+ portId: endpoint.ref.port,
34962
+ linkId: link.id,
34963
+ };
34964
+ }
34809
34965
  formatNestedPath(nestedPath) {
34810
34966
  return JSON.stringify(nestedPath);
34811
34967
  }
@@ -35494,12 +35650,31 @@ class LinkExecutorService {
35494
35650
  this.jsonLogic = jsonLogic;
35495
35651
  }
35496
35652
  executeLink(link, context) {
35497
- const diagnostics = [];
35498
35653
  const snapshot = this.cloneSnapshot(context.snapshot.state);
35654
+ const stateBeforeExecution = this.cloneSnapshot(snapshot);
35655
+ try {
35656
+ return this.executeLinkInternal(link, context, snapshot);
35657
+ }
35658
+ catch (error) {
35659
+ const diagnostic = this.createDiagnostic(link, 'RUNTIME_LINK_EXECUTION_FAILED', 'error', 'A execucao do link falhou antes de concluir a entrega.', {
35660
+ errorName: error instanceof Error ? error.name : 'UnknownError',
35661
+ });
35662
+ return this.applyErrorPolicy(link, {
35663
+ status: 'failed',
35664
+ value: undefined,
35665
+ diagnostics: [diagnostic],
35666
+ snapshot,
35667
+ skippedReason: 'runtime-exception',
35668
+ }, stateBeforeExecution);
35669
+ }
35670
+ }
35671
+ executeLinkInternal(link, context, snapshot) {
35672
+ const stateBeforeExecution = this.cloneSnapshot(snapshot);
35673
+ const diagnostics = [];
35499
35674
  const now = context.now || new Date().toISOString();
35500
35675
  const sourceValue = this.resolveSourceValue(link.from, context, snapshot);
35501
35676
  if (!this.matchesCondition(link, sourceValue, context, snapshot, diagnostics)) {
35502
- return {
35677
+ const result = {
35503
35678
  status: diagnostics.some((item) => item.severity === 'error' || item.severity === 'fatal')
35504
35679
  ? 'failed'
35505
35680
  : 'skipped',
@@ -35508,19 +35683,22 @@ class LinkExecutorService {
35508
35683
  snapshot,
35509
35684
  skippedReason: diagnostics.length ? 'condition-error' : 'condition-not-matched',
35510
35685
  };
35686
+ return diagnostics.length
35687
+ ? this.applyErrorPolicy(link, result, stateBeforeExecution)
35688
+ : result;
35511
35689
  }
35512
35690
  const transformResult = link.transform
35513
35691
  ? this.transforms.executePipeline(link.transform, this.buildTransformContext(context, snapshot, sourceValue))
35514
35692
  : { value: sourceValue, diagnostics: [], failed: false };
35515
35693
  diagnostics.push(...transformResult.diagnostics);
35516
35694
  if (transformResult.failed) {
35517
- return {
35695
+ return this.applyErrorPolicy(link, {
35518
35696
  status: 'failed',
35519
35697
  value: transformResult.value,
35520
35698
  diagnostics,
35521
35699
  snapshot,
35522
35700
  skippedReason: 'transform-failed',
35523
- };
35701
+ }, stateBeforeExecution);
35524
35702
  }
35525
35703
  let value = transformResult.value;
35526
35704
  const missingResolution = this.resolveMissingValuePolicy(link, value);
@@ -35546,7 +35724,7 @@ class LinkExecutorService {
35546
35724
  }
35547
35725
  const delivery = this.deliverValue(link, value, snapshot, diagnostics);
35548
35726
  if (!delivery) {
35549
- return {
35727
+ return this.applyErrorPolicy(link, {
35550
35728
  status: diagnostics.some((item) => item.severity === 'error' || item.severity === 'fatal')
35551
35729
  ? 'failed'
35552
35730
  : 'skipped',
@@ -35554,7 +35732,7 @@ class LinkExecutorService {
35554
35732
  diagnostics,
35555
35733
  snapshot,
35556
35734
  skippedReason: 'delivery-blocked',
35557
- };
35735
+ }, stateBeforeExecution);
35558
35736
  }
35559
35737
  return {
35560
35738
  status: diagnostics.some((item) => item.severity === 'error' || item.severity === 'fatal')
@@ -35566,6 +35744,64 @@ class LinkExecutorService {
35566
35744
  delivery,
35567
35745
  };
35568
35746
  }
35747
+ applyErrorPolicy(link, result, stateBeforeDelivery) {
35748
+ const errorPolicy = link.policy?.errorPolicy ?? 'diagnostic';
35749
+ const causeCodes = result.diagnostics.map((diagnostic) => diagnostic.code);
35750
+ const causeNames = Array.from(new Set(result.diagnostics
35751
+ .map((diagnostic) => diagnostic.details?.['errorName'])
35752
+ .filter((name) => typeof name === 'string' && name.length > 0)));
35753
+ if (result.status !== 'failed') {
35754
+ return result;
35755
+ }
35756
+ if (errorPolicy === 'drop') {
35757
+ return {
35758
+ status: 'skipped',
35759
+ value: result.value,
35760
+ diagnostics: [
35761
+ this.createDiagnostic(link, 'RUNTIME_LINK_ERROR_DROPPED', 'warning', 'A entrega com falha foi descartada pela politica do link.', {
35762
+ errorPolicy,
35763
+ causeCodes,
35764
+ ...(causeNames.length ? { causeNames } : {}),
35765
+ failedPhase: result.skippedReason,
35766
+ }),
35767
+ ],
35768
+ snapshot: this.cloneSnapshot(stateBeforeDelivery),
35769
+ skippedReason: 'error-policy-drop',
35770
+ };
35771
+ }
35772
+ if (errorPolicy === 'halt-page') {
35773
+ const haltDiagnostic = this.createDiagnostic(link, 'RUNTIME_LINK_ERROR_HALTED_PAGE', 'fatal', 'A falha interrompeu a pagina conforme a politica do link.', {
35774
+ errorPolicy,
35775
+ causeCodes,
35776
+ ...(causeNames.length ? { causeNames } : {}),
35777
+ failedPhase: result.skippedReason,
35778
+ });
35779
+ return {
35780
+ ...result,
35781
+ status: 'failed',
35782
+ diagnostics: [...this.annotateDiagnostics(result.diagnostics, errorPolicy), haltDiagnostic],
35783
+ snapshot: this.cloneSnapshot(stateBeforeDelivery),
35784
+ delivery: undefined,
35785
+ skippedReason: 'error-policy-halt-page',
35786
+ };
35787
+ }
35788
+ return {
35789
+ ...result,
35790
+ diagnostics: this.annotateDiagnostics(result.diagnostics, errorPolicy),
35791
+ snapshot: this.cloneSnapshot(stateBeforeDelivery),
35792
+ delivery: undefined,
35793
+ skippedReason: result.skippedReason,
35794
+ };
35795
+ }
35796
+ annotateDiagnostics(diagnostics, errorPolicy) {
35797
+ return diagnostics.map((diagnostic) => ({
35798
+ ...diagnostic,
35799
+ details: {
35800
+ ...(diagnostic.details || {}),
35801
+ errorPolicy,
35802
+ },
35803
+ }));
35804
+ }
35569
35805
  resolveSourceValue(endpoint, context, snapshot) {
35570
35806
  if (endpoint.kind === 'state') {
35571
35807
  return this.readStatePath(snapshot, endpoint.ref.path, endpoint.ref.layer);
@@ -35627,9 +35863,9 @@ class LinkExecutorService {
35627
35863
  details['jsonLogicCode'] = error.code;
35628
35864
  }
35629
35865
  else if (error instanceof Error) {
35630
- details['error'] = error.message;
35866
+ details['errorName'] = error.name;
35631
35867
  }
35632
- diagnostics.push(this.createDiagnostic(link, 'RUNTIME_LINK_CONDITION_INVALID', 'warning', 'A condicao Json Logic do link falhou em runtime e foi tratada como falsa.', details));
35868
+ diagnostics.push(this.createDiagnostic(link, 'RUNTIME_LINK_CONDITION_INVALID', 'error', 'A condicao Json Logic do link falhou em runtime e foi tratada como falsa.', details));
35633
35869
  return false;
35634
35870
  }
35635
35871
  }
@@ -35956,6 +36192,7 @@ class CompositionRuntimeEngine {
35956
36192
  pathAccessor = new ConnectionManagerService();
35957
36193
  nestedWidgetAccessor = new NestedWidgetConfigAccessor();
35958
36194
  definition = null;
36195
+ haltedByLinkId = null;
35959
36196
  now;
35960
36197
  constructor(options = {}) {
35961
36198
  this.now = options.now ?? (() => new Date().toISOString());
@@ -35966,6 +36203,7 @@ class CompositionRuntimeEngine {
35966
36203
  this.compositionValidator = options.compositionValidator ?? new CompositionValidatorService();
35967
36204
  }
35968
36205
  bootstrap(definition) {
36206
+ this.haltedByLinkId = null;
35969
36207
  this.definition = definition;
35970
36208
  const generatedAt = this.now();
35971
36209
  const stateSnapshot = this.materializeDerivedState(definition.state.primaryValues, definition);
@@ -36025,7 +36263,16 @@ class CompositionRuntimeEngine {
36025
36263
  const matchedLinks = this.definition.links.filter((link) => matchesEndpoint(link.from, event.source));
36026
36264
  const matchedLinkIds = matchedLinks.map((link) => link.id);
36027
36265
  let workingState = cloneStateSnapshot(this.store.getSnapshot().state);
36028
- const runtimeDiagnostics = this.createNestedWidgetEventBridgeDiagnostics(event, matchedLinks, occurredAt);
36266
+ const persistentBootstrapDiagnostics = this.store.getSnapshot().diagnostics.filter((diagnostic) => isBlockingDiagnostic(diagnostic)
36267
+ && (diagnostic.phase === 'semantic-validation'
36268
+ || diagnostic.phase === 'runtime-bootstrap'));
36269
+ const runtimeDiagnostics = [
36270
+ ...persistentBootstrapDiagnostics,
36271
+ ...this.createNestedWidgetEventBridgeDiagnostics(event, matchedLinks, occurredAt),
36272
+ ];
36273
+ if (this.haltedByLinkId && matchedLinks.length === 0) {
36274
+ runtimeDiagnostics.push(this.createPageHaltedDiagnostic(undefined, occurredAt));
36275
+ }
36029
36276
  const blockedFeedbackDiagnostics = this.createFeedbackCycleBlockedDiagnostics(matchedLinks, occurredAt);
36030
36277
  runtimeDiagnostics.push(...blockedFeedbackDiagnostics.values());
36031
36278
  const linkResults = new Map();
@@ -36065,6 +36312,40 @@ class CompositionRuntimeEngine {
36065
36312
  ...endpointTraceDetails('target', link.to),
36066
36313
  },
36067
36314
  }));
36315
+ if (this.haltedByLinkId) {
36316
+ const haltedDiagnostic = this.createPageHaltedDiagnostic(link, occurredAt);
36317
+ const result = {
36318
+ status: 'skipped',
36319
+ value: event.payload,
36320
+ diagnostics: [haltedDiagnostic],
36321
+ snapshot: cloneStateSnapshot(workingState),
36322
+ skippedReason: 'page-halted',
36323
+ };
36324
+ runtimeDiagnostics.push(haltedDiagnostic);
36325
+ linkResults.set(link.id, result);
36326
+ trace.push(this.traceService.createEntry(event.eventId, sequence++, {
36327
+ timestamp: occurredAt,
36328
+ phase: 'delivery-skipped',
36329
+ linkId: link.id,
36330
+ subject: {
36331
+ kind: 'link',
36332
+ linkId: link.id,
36333
+ label: link.metadata?.label,
36334
+ },
36335
+ inputSnapshot: stateBefore,
36336
+ outputSnapshot: workingState,
36337
+ details: {
36338
+ status: 'skipped',
36339
+ skippedReason: 'page-halted',
36340
+ haltedByLinkId: this.haltedByLinkId,
36341
+ ...endpointTraceDetails('source', link.from),
36342
+ ...endpointTraceDetails('target', link.to),
36343
+ },
36344
+ diagnostics: [haltedDiagnostic.code],
36345
+ }));
36346
+ sequence = this.appendDiagnosticTraceEntries(trace, emittedDiagnosticIds, event.eventId, sequence, [haltedDiagnostic], link.id);
36347
+ continue;
36348
+ }
36068
36349
  if (blockedFeedbackDiagnostic) {
36069
36350
  trace.push(this.traceService.createEntry(event.eventId, sequence++, {
36070
36351
  timestamp: occurredAt,
@@ -36120,6 +36401,9 @@ class CompositionRuntimeEngine {
36120
36401
  workingState = cloneStateSnapshot(result.snapshot);
36121
36402
  runtimeDiagnostics.push(...result.diagnostics);
36122
36403
  linkResults.set(link.id, result);
36404
+ if (link.policy?.errorPolicy === 'halt-page' && result.status === 'failed') {
36405
+ this.haltedByLinkId = link.id;
36406
+ }
36123
36407
  if (link.transform) {
36124
36408
  trace.push(this.traceService.createEntry(event.eventId, sequence++, {
36125
36409
  timestamp: occurredAt,
@@ -36184,22 +36468,28 @@ class CompositionRuntimeEngine {
36184
36468
  sequence = this.appendDiagnosticTraceEntries(trace, emittedDiagnosticIds, event.eventId, sequence, materializedState.diagnostics.filter((item) => !runtimeDiagnostics.some((runtimeItem) => runtimeItem.id === item.id)));
36185
36469
  const snapshot = this.store.applyCycle({
36186
36470
  generatedAt: occurredAt,
36187
- status: diagnostics.some(isBlockingDiagnostic)
36188
- ? 'degraded'
36189
- : 'ready',
36471
+ status: this.haltedByLinkId
36472
+ ? 'failed'
36473
+ : diagnostics.some(isBlockingDiagnostic)
36474
+ ? 'degraded'
36475
+ : 'ready',
36190
36476
  stateSnapshot: materializedState,
36191
36477
  linkPatches: matchedLinks.map((link) => ({
36192
36478
  linkId: link.id,
36193
36479
  status: blockedFeedbackDiagnostics.has(link.id)
36194
36480
  ? 'skipped'
36195
36481
  : linkResults.get(link.id)?.status,
36196
- lastEventAt: linkResults.has(link.id) || blockedFeedbackDiagnostics.has(link.id)
36197
- ? occurredAt
36198
- : undefined,
36199
36482
  lastDispatchTraceId: linkResults.has(link.id) || blockedFeedbackDiagnostics.has(link.id)
36200
36483
  ? event.eventId
36201
36484
  : undefined,
36202
- lastDeliveredValuePreview: linkResults.get(link.id)?.value,
36485
+ lastEventAt: linkResults.has(link.id) || blockedFeedbackDiagnostics.has(link.id)
36486
+ ? occurredAt
36487
+ : undefined,
36488
+ ...(!discardsDeliveryTelemetry(linkResults.get(link.id))
36489
+ ? {
36490
+ lastDeliveredValuePreview: linkResults.get(link.id)?.value,
36491
+ }
36492
+ : {}),
36203
36493
  diagnostics: blockedFeedbackDiagnostics.has(link.id)
36204
36494
  ? [blockedFeedbackDiagnostics.get(link.id)]
36205
36495
  : linkResults.get(link.id)?.diagnostics,
@@ -36309,6 +36599,9 @@ class CompositionRuntimeEngine {
36309
36599
  workingState = cloneStateSnapshot(result.snapshot);
36310
36600
  linkResults.set(link.id, result);
36311
36601
  diagnostics.push(...result.diagnostics);
36602
+ if (link.policy?.errorPolicy === 'halt-page' && result.status === 'failed') {
36603
+ this.haltedByLinkId = link.id;
36604
+ }
36312
36605
  trace.push(this.traceService.createEntry('bootstrap', sequence++, {
36313
36606
  timestamp: occurredAt,
36314
36607
  phase: 'source-resolved',
@@ -36367,22 +36660,35 @@ class CompositionRuntimeEngine {
36367
36660
  diagnostics: result.diagnostics.map((item) => item.code),
36368
36661
  }));
36369
36662
  sequence = this.appendDiagnosticTraceEntries(trace, emittedDiagnosticIds, 'bootstrap', sequence, result.diagnostics, link.id);
36663
+ if (this.haltedByLinkId) {
36664
+ break;
36665
+ }
36370
36666
  }
36371
36667
  const dedupedDiagnostics = uniqueDiagnosticsById(diagnostics);
36372
36668
  return this.store.applyCycle({
36373
36669
  generatedAt: occurredAt,
36374
- status: dedupedDiagnostics.some(isBlockingDiagnostic) ? 'degraded' : 'ready',
36670
+ status: this.haltedByLinkId
36671
+ ? 'failed'
36672
+ : dedupedDiagnostics.some(isBlockingDiagnostic)
36673
+ ? 'degraded'
36674
+ : 'ready',
36375
36675
  stateSnapshot: {
36376
36676
  ...workingState,
36377
36677
  changedPaths: [],
36378
36678
  diagnostics: cloneDiagnostics(snapshot.state.diagnostics),
36379
36679
  },
36380
- linkPatches: hydrationLinks.map((link) => ({
36680
+ linkPatches: hydrationLinks
36681
+ .filter((link) => linkResults.has(link.id))
36682
+ .map((link) => ({
36381
36683
  linkId: link.id,
36382
36684
  status: linkResults.get(link.id)?.status ?? 'idle',
36383
36685
  lastEventAt: occurredAt,
36384
36686
  lastDispatchTraceId: 'bootstrap',
36385
- lastDeliveredValuePreview: linkResults.get(link.id)?.value,
36687
+ ...(!discardsDeliveryTelemetry(linkResults.get(link.id))
36688
+ ? {
36689
+ lastDeliveredValuePreview: linkResults.get(link.id)?.value,
36690
+ }
36691
+ : {}),
36386
36692
  diagnostics: linkResults.get(link.id)?.diagnostics,
36387
36693
  })),
36388
36694
  diagnostics: dedupedDiagnostics,
@@ -36563,6 +36869,42 @@ class CompositionRuntimeEngine {
36563
36869
  }
36564
36870
  return blocked;
36565
36871
  }
36872
+ createPageHaltedDiagnostic(link, occurredAt) {
36873
+ const linkId = link?.id;
36874
+ return {
36875
+ id: `${linkId || 'runtime'}:RUNTIME_PAGE_HALTED:${this.haltedByLinkId}`,
36876
+ code: 'RUNTIME_PAGE_HALTED',
36877
+ severity: 'fatal',
36878
+ phase: 'runtime-dispatch',
36879
+ message: 'A pagina permanece interrompida por uma falha de composicao. Um novo bootstrap e necessario.',
36880
+ summary: 'Dispatch bloqueado porque a pagina esta interrompida.',
36881
+ subject: link
36882
+ ? {
36883
+ kind: 'link',
36884
+ linkId,
36885
+ label: link.metadata?.label,
36886
+ }
36887
+ : {
36888
+ kind: 'runtime-snapshot',
36889
+ label: 'page-halted',
36890
+ },
36891
+ related: this.haltedByLinkId
36892
+ ? [{ kind: 'link', linkId: this.haltedByLinkId }]
36893
+ : undefined,
36894
+ details: {
36895
+ haltedByLinkId: this.haltedByLinkId,
36896
+ },
36897
+ source: 'runtime-engine',
36898
+ blocking: true,
36899
+ transient: true,
36900
+ createdAt: occurredAt,
36901
+ };
36902
+ }
36903
+ }
36904
+ function discardsDeliveryTelemetry(result) {
36905
+ return result?.skippedReason === 'error-policy-drop'
36906
+ || result?.skippedReason === 'error-policy-halt-page'
36907
+ || result?.skippedReason === 'page-halted';
36566
36908
  }
36567
36909
  function isComponentPortEndpoint(endpoint) {
36568
36910
  return endpoint.kind === 'component-port';
@@ -37373,6 +37715,7 @@ class WidgetPageCompositionFactory {
37373
37715
  const condition = rawLink['condition'];
37374
37716
  const conditions = rawLink['conditions'];
37375
37717
  const meta = rawLink['meta'];
37718
+ const policy = rawLink['policy'];
37376
37719
  if (typeof condition === 'string') {
37377
37720
  throw new Error(`WidgetPageCompositionFactory no longer accepts string condition in composition.links for '${id}'. Use canonical Json Logic in condition.`);
37378
37721
  }
@@ -37390,6 +37733,20 @@ class WidgetPageCompositionFactory {
37390
37733
  if (condition && !this.isJsonLogicLike(condition)) {
37391
37734
  throw new Error(`WidgetPageCompositionFactory requires composition.links[].condition to be a canonical Json Logic expression for '${id}'.`);
37392
37735
  }
37736
+ if (policy && typeof policy === 'object' && !Array.isArray(policy)) {
37737
+ const rawPolicy = policy;
37738
+ const delivery = rawPolicy['delivery'];
37739
+ const errorPolicy = rawPolicy['errorPolicy'];
37740
+ if (delivery !== undefined && delivery !== 'sync') {
37741
+ throw new Error(`WidgetPageCompositionFactory no longer accepts non-executable delivery '${String(delivery)}' for '${id}'. Composition dispatch is synchronously ordered; use delivery 'sync' or omit it.`);
37742
+ }
37743
+ if (errorPolicy !== undefined
37744
+ && errorPolicy !== 'diagnostic'
37745
+ && errorPolicy !== 'drop'
37746
+ && errorPolicy !== 'halt-page') {
37747
+ throw new Error(`WidgetPageCompositionFactory requires a supported errorPolicy for '${id}': diagnostic, drop, or halt-page.`);
37748
+ }
37749
+ }
37393
37750
  }
37394
37751
  }
37395
37752
  isJsonLogicLike(condition) {
@@ -44702,4 +45059,4 @@ function provideHookWhitelist(allowed) {
44702
45059
  * Generated bundle index. Do not edit.
44703
45060
  */
44704
45061
 
44705
- export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, COMPONENT_METADATA_REGISTRY_I18N_CONFIG, COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, ComponentRuntimeProfileService, CompositionRuntimeFacade, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_ACTION_CONTROL_DEFAULTS, PRAXIS_ACTION_CONTROL_VARS, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_COLLECTION_SEARCH_DEFAULTS, PRAXIS_COLLECTION_SEARCH_VARS, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_DRAWER_CONTENT_DATA, SURFACE_DRAWER_REF, SURFACE_NAVIGATION_I18N_CONFIG, SURFACE_NAVIGATION_I18N_NAMESPACE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceNavigationError, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, SurfaceOutletRegistryService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisActionControlCss, buildPraxisCollectionSearchCss, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isDomainRuleSnapshotProblemResponse, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeReactiveDeterminations, normalizeResourceAvailabilityReasonCode, normalizeResourceIdentityContract, normalizeStart, normalizeSurfaceOperationContext, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, projectGroupedCommandPartialRows, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRelatedResourceOutletMetadata, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDateRangeShortcutPreset, resolveDateRangeShortcutPresets, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveGroupedCommandPartialRowSpans, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolvePraxisI18nDocument, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateSurfaceNavigationRejected, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };
45062
+ export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, COMPONENT_METADATA_REGISTRY_I18N_CONFIG, COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, ComponentRuntimeProfileService, CompositionRuntimeFacade, CompositionValidatorService, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_ACTION_CONTROL_DEFAULTS, PRAXIS_ACTION_CONTROL_VARS, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_COLLECTION_SEARCH_DEFAULTS, PRAXIS_COLLECTION_SEARCH_VARS, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_DRAWER_CONTENT_DATA, SURFACE_DRAWER_REF, SURFACE_NAVIGATION_I18N_CONFIG, SURFACE_NAVIGATION_I18N_NAMESPACE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceNavigationError, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, SurfaceOutletRegistryService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisActionControlCss, buildPraxisCollectionSearchCss, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isDomainRuleSnapshotProblemResponse, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeReactiveDeterminations, normalizeResourceAvailabilityReasonCode, normalizeResourceIdentityContract, normalizeStart, normalizeSurfaceOperationContext, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, projectGroupedCommandPartialRows, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRelatedResourceOutletMetadata, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDateRangeShortcutPreset, resolveDateRangeShortcutPresets, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveGroupedCommandPartialRowSpans, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolvePraxisI18nDocument, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateSurfaceNavigationRejected, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };