@praxisui/core 10.0.0-rc.25 → 10.0.0-rc.27

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.
package/README.md CHANGED
@@ -57,9 +57,10 @@ const preview = await firstValueFrom(bulkClient.readProposalResults(contract, pr
57
57
  await session.confirm(idempotencyKeyForThisIntent);
58
58
  // On an uncertain HTTP failure, retain this session and retry with the same key.
59
59
  // The host schedules further authorized readbacks for an accepted nonterminal execution.
60
- if (!session.isTerminal()) await session.refreshExecution();
60
+ const reads = new AbortController(); // This view owns GET lifetime, not confirmation custody.
61
+ if (!session.isTerminal()) await session.refreshExecution(reads.signal);
61
62
  if (session.isTerminal()) {
62
- const results = await session.readResults();
63
+ const results = await session.readResults(200, undefined, reads.signal);
63
64
  }
64
65
  ```
65
66
 
@@ -69,6 +70,24 @@ the descriptor. The caller controls when to read status again and presents each
69
70
  authorized page of results. This example is a service integration sketch, not a
70
71
  ready visual workflow or a deployment claim.
71
72
 
73
+ `refreshExecution(signal?)` and `readResults(size?, after?, signal?)` retain their
74
+ Promise API and optionally accept a standard `AbortSignal`. An already aborted
75
+ signal dispatches no GET; abort unsubscribes the actual HTTP request, releases the
76
+ read slot, and prevents a late Promise continuation from updating the session.
77
+ Abort listeners are removed on success, failure and cancellation. A cancelled GET
78
+ keeps the original proposal, confirmation key and accepted execution; it does not
79
+ mark that execution terminal or prove rollback. A new authorized read may observe
80
+ the same execution. Overlapping execution refreshes remain rejected, while an
81
+ aborted generation cannot release the slot of its successor.
82
+
83
+ The caller owns GET cancellation and its observation budget; the Core session does
84
+ not invent a global read timeout. Use a fresh read lifetime for a fresh consultation
85
+ and abort reads when the owning view closes. Do not race a Promise with a timer:
86
+ connect the signal to the read itself so the HTTP subscription is torn down.
87
+ `evaluate` and `confirm` do not accept this signal: a dispatched POST and its original
88
+ key stay in intent custody across view teardown. GET failure/cancellation must never
89
+ start a new evaluation or confirmation automatically.
90
+
72
91
  The backend is the authority on proposal expiry. A client clock hint must not
73
92
  block a same-key replay after an uncertain confirmation; the backend may return
74
93
  409 or 410 and the host must explain that state without inventing a new intent.
@@ -87,6 +106,27 @@ surface does not advertise them. Query selection, ASYNC jobs and ATOMIC mode are
87
106
  outside this Angular slice. This is not a claim that the reference host or full
88
107
  backend B7 acceptance is complete.
89
108
 
109
+ ## Published asynchronous execution tracking
110
+
111
+ `PraxisBulkClientService.waitForExecution` is separate from the BASIC client
112
+ above. Use its published execution operation only when that operation actually
113
+ supports the asynchronous profile; an enum member does not enable a backend
114
+ profile. The Observable emits one canonical terminal snapshot, preserving
115
+ `COMPLETED`, `COMPLETED_WITH_ERRORS`, `CANCELLED`, `STOPPED` and
116
+ `RECONCILIATION_REQUIRED`. `CANCEL_REQUESTED` remains pending.
117
+
118
+ Each subscription starts its own strict overall deadline. At most one GET is in
119
+ flight: interval ticks do not abort a useful slow read or queue overlapping reads.
120
+ Pending responses do not renew the deadline, which also bounds a GET that never
121
+ responds. Terminal completion, transport error, deadline and unsubscribe release
122
+ the active read and polling timers; a late response cannot revive an expired
123
+ subscription. Stopping a GET does not reverse server effects or cancel a POST.
124
+
125
+ A read failure means the outcome is unknown. Explicitly resume reads for the same
126
+ execution and preserve the original proposal and confirmation key; do not confirm
127
+ or evaluate again to restore progress. This transport does not provide custody
128
+ across closing/reopening a dialog, reload recovery or operational ASYNC acceptance.
129
+
90
130
  ## Governed color palettes
91
131
 
92
132
  `materializeGovernedPaletteEntries(palette, purposes)` returns `MaterializedGovernedColorToken[]`, pairing each original `entry` with its resolved `color`. It preserves distinct token IDs even when CSS references/colors match, applies purpose filtering, and resolves fallback dependencies against the complete palette. Use this projection for identified swatches; do not zip color arrays to entries or infer identity from color equality. `materializeGovernedPaletteColors` remains the string-only projection of the same resolver.
@@ -831,7 +871,9 @@ Action-bearing components must use the semantic `--praxis-action-control-*` vari
831
871
 
832
872
  ### Catálogo no quick connect e isolamento do editor de página
833
873
 
834
- `ResourceQuickConnectComponent` apresenta recursos publicados em `/schemas/catalog` usando o seletor `pdx-material-select` registrado em `ComponentMetadataRegistry`. O host deve registrar os descritores oficiais de DynamicFields. O controle é inicializado pelo protocolo `setInputMetadata` e ControlValueAccessor; Core não importa a biblioteca de campos. A conexão avançada por rota continua disponível.
874
+ `ResourceQuickConnectComponent` apresenta recursos publicados em `/schemas/catalog` usando o seletor `pdx-material-select` registrado em `ComponentMetadataRegistry`. O host deve registrar os descritores oficiais de DynamicFields. O controle é inicializado pelo protocolo `setInputMetadata` e `ControlValueAccessor`; Core não importa a biblioteca de campos. A conexão avançada por rota continua disponível (com `<datalist>` de sugestões do catálogo e abertura automática da seção avançada quando o seletor dinâmico não está disponível ou quando o recurso atual é uma rota customizada fora do catálogo).
875
+
876
+ O componente expõe `[resourcePath]`, `(resourcePathChange)`, `[endpointKey]`, `[apiUrlEntry]`, `ControlValueAccessor` (`ngModel` / `formControl`) e os hooks `reset()` / `acceptAppliedValue()` de `SettingsValueProvider`. A projeção e reconciliação de opções do catálogo são centralizadas em `ResourceDiscoveryService.getDiscoveredResources()`, `loadDiscoveredResources()`, `projectSchemaCatalogResources()` e `resolveCatalogResourceOptionValue()`, deduplicando chamadas concorrentes a `/schemas/catalog` por URL e reconciliando caminhos relativos com ou sem prefixo `/api`. `ResourceDiscoveryService` reutiliza a instância do injetor ancestral quando um componente standalone cria injetor filho sem override local de `API_URL`.
835
877
 
836
878
  O editor de configurações da página recebe uma cópia da definição autoral. Dados carregados e entradas transitórias dos widgets não devem virar configuração ao alterar o layout.
837
879
 
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-15T15:10:58.041Z",
3
+ "generatedAt": "2026-10-15T22:42:56.841Z",
4
4
  "packageName": "@praxisui/core",
5
- "packageVersion": "10.0.0-rc.25",
5
+ "packageVersion": "10.0.0-rc.27",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 4,