@statedelta-axiom/runtime 0.1.0

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/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ 'use strict';var compiler=require('@statedelta-axiom/compiler'),sandbox=require('@statedelta-axiom/sandbox'),contracts=require('@statedelta-axiom/contracts');var C=Object.freeze([]);function h(s){if(!s)return {append:()=>{},drain:()=>C,clear:()=>{}};let u=[];return {append(m){u.push(m);},drain(){if(u.length===0)return C;let m=u;return u=[],m},clear(){u=[];}}}function k(s={}){let u=s.id??"main",m=s.capabilities?.deterministic!==false,S=m&&s.buffer?.enabled!==false,d=s.environment?.compilation??compiler.createCompilationService(s.compiler??{}),E=h(S),c="live",f=[],y=[],g=S?{append(e){c!=="recovery"&&E.append(e);},replayCursor(){return c!=="recovery"?null:f.shift()??null},isRecoveryMode(){return c==="recovery"},reportRecoveryError(e){y.push(e);}}:void 0,P={...s.environment,compilation:d,...g!==void 0&&{providerBuffer:g}},I=sandbox.createSandboxManager({environment:P}),A=s.persist?{persist:s.persist}:void 0,r=I.createSandbox({id:u,mode:s.mainMode??"closed",capabilities:s.capabilities,physics:A}),v=false,R,a;function n(e){if(v)throw new Error(`Runtime "${u}" is disposed; "${e}" rejected.`)}function p(e){if(!r.system)throw new Error(`NOT_GOVERNED: "${e}" requires mainMode="governed"; main is closed`)}function D(e){if(e?.provides!==void 0&&c==="live")throw new Error(`${contracts.PROVIDER_ERROR_CODES.LIVE_MODE_PROVIDES_FORBIDDEN}: provides input is only valid in recovery mode`);if(e?.effects){let t=r.app.getTick()+1,o=Date.now();for(let i of e.effects)c==="live"&&E.append({type:"effect",tick:t,id:i.id,data:i.data,ts:o}),r.app.applyEffect(i.id,i.data);}e?.provides&&e.provides.length>0&&f.push(...e.provides);}function B(){if(c==="recovery"){if(y.length>0){let e=y;throw y=[],f=[],new Error(`Recovery failed: ${e.join("; ")}`)}if(f.length>0){let e=f.length;throw f=[],new Error(`${contracts.PROVIDER_ERROR_CODES.REPLAY_OVERFLOW}: ${e} provide entries left in queue after step`)}}}return {id:u,boot(e,t){n("boot");let{artifact:o,sourceKey:i}=d.compile(e);return d.retain(i),a!==void 0&&d.release(a),a=i,R=e,r.boot(o,{...t,bootSourceKey:i})},bootCompiled(e,t){return n("bootCompiled"),s.persist?.definitions===true?{success:false,registered:{states:[],actions:[],rules:[],events:[],views:[],sandboxes:[]},errors:[{resource:"physics",code:"DEFINITIONS_REQUIRE_DSL",message:"bootCompiled rejected: physics.persist.definitions=true requires boot(dsl) \u2014 DSL is the source of truth for Definitions",data:{hint:"use runtime.boot(dsl) instead, or unset physics.persist.definitions for tests / service mode"}}],warnings:[]}:(R=void 0,a!==void 0&&(d.release(a),a=void 0),r.boot(e,t))},bootSource(){return R},dispose(){return v?{ok:false,error:{code:"RUNTIME_DISPOSED"}}:(v=true,E.clear(),f=[],a!==void 0&&(d.release(a),a=void 0),I.dispose(u))},isDisposed(){return v},step(e){n("step"),D(e);let t=r.app.step();return B(),t},async stepAsync(e){n("stepAsync"),D(e);let t=await r.app.stepAsync();return B(),t},getMode(){return c},setMode(e){if(n("setMode"),e!==c){if(e==="recovery"&&!m)throw new Error(`${contracts.PROVIDER_ERROR_CODES.RECOVERY_REQUIRES_DETERMINISM}: recovery mode requires capabilities.deterministic !== false`);f=[],y=[],c=e;}},collectDelta(){return v?[]:E.drain()},getCapabilities(){let e=s.environment?.providers??{},t=!!s.environment?.async,o=[];for(let i of Object.keys(e)){let l=e[i],_=l.mode==="async"&&!t;o.push({id:i,...l.description!==void 0&&{description:l.description},mode:l.mode,persistence:l.persistence,available:!_,..._&&{reason:"Requires async runtime (current runtime is sync)"}});}return {async:t,persistDefinitions:s.persist?.definitions===true,providers:o}},snapshot(){return n("snapshot"),r.app.snapshot()},recover(e){if(n("recover"),e.persistence===void 0)return r.app.restore(e);let t=e.persistence.bootSourceKey,o=d.getSource(t);if(o===void 0)return {ok:false,error:{code:"RECOVER_SOURCE_UNAVAILABLE",message:`Source for bootSourceKey "${t}" not found in CompilationService \u2014 it was evicted or never registered. Share the same service between the snapshotting and recovering Runtimes, or boot(dsl) first to register it.`,data:{bootSourceKey:t}}};if(r.getPhase()==="created"){let{artifact:i}=d.compile(o);d.retain(t),a!==void 0&&d.release(a),a=t,R=o;let l=r.boot(i,{bootSourceKey:t});if(!l.success)return {ok:false,error:{code:"RECOVER_BOOT_FAILED",message:"Recover via service failed during boot of recompiled artifact",data:{errors:l.errors}}}}return r.app.restore(e)},state:{get(e,t){return n("state.get"),r.app.get(e,t)},hasState(e){return n("state.hasState"),r.app.hasState(e)},getStateIds(){return n("state.getStateIds"),r.app.getStateIds()}},getTick(){return n("getTick"),r.app.getTick()},getPhase(){return n("getPhase"),r.getPhase()},isIdle(){return n("isIdle"),r.app.isIdle()},getPhysics(){return n("getPhysics"),r.app.getPhysics()},invoke(e,t){return n("invoke"),p("invoke"),r.system.invoke(e,t)},invokeAsync(e,t){return n("invokeAsync"),p("invokeAsync"),r.system.invokeAsync(e,t)},dispatch(e,t,o){return n("dispatch"),p("dispatch"),r.system.dispatch(e,t,o)},emit(e,t){n("emit"),p("emit"),r.system.emit(e,t);},processEvents(){return n("processEvents"),p("processEvents"),r.system.processEvents()},hasAction(e){return n("hasAction"),p("hasAction"),r.system.hasAction(e)},getActionIds(){return n("getActionIds"),p("getActionIds"),r.system.getActionIds()},hasRule(e){return n("hasRule"),p("hasRule"),r.system.hasRule(e)},getRuleCount(){return n("getRuleCount"),p("getRuleCount"),r.system.getRuleCount()},watch(e){return n("watch"),r.app.watch(e)},on(e,t){return n("on"),r.app.on(e,o=>{c==="recovery"&&e!=="error"||t(o);})}}}exports.createDeltaBuffer=h;exports.createRuntime=k;
@@ -0,0 +1,348 @@
1
+ import { BootDSL, BootResult, BootDefinitions, ProvideBufferEntry, BufferEntry, RuntimeCapabilities } from '@statedelta-axiom/contracts';
2
+ export { BufferEntry, EffectBufferEntry, ProvideBufferEntry } from '@statedelta-axiom/contracts';
3
+ import { Scope, HandlersMap, CompilerMode } from '@statedelta-axiom/compiler';
4
+ import { PersistConfigInput, RealmCtx, StepResult, SystemPhase, RealmPhysics, SystemEvents } from '@statedelta-axiom/realm-system';
5
+ import { SandboxEnvironment, SandboxCapabilities, SandboxMode, SandboxOpResult, SandboxSnapshot, ISandbox, SandboxChange } from '@statedelta-axiom/sandbox';
6
+ import { DirectiveResult } from '@statedelta-actions/sdk/core';
7
+ import { EventProcessingResult } from '@statedelta-actions/sdk/events';
8
+
9
+ /**
10
+ * Tipos públicos do Runtime (ADR-R001 — lib TOP do ecossistema).
11
+ *
12
+ * Runtime é a camada que a Aplicação JS instancia diretamente. Define
13
+ * environment compartilhado, instancia Sandbox main (face JS via
14
+ * `runtime.main`), expõe primitivos de persistência (snapshot/recover,
15
+ * applyEffect/recoverEffect, collectDelta).
16
+ *
17
+ * Esta versão cobre: lifecycle, tick unificado com `step(input)`
18
+ * (ADR-R021), modo live/recovery (ADR-R021), buffer (ADR-R012),
19
+ * snapshot/recover, system events, **compiler integrado** (`boot(dsl)` —
20
+ * ADR-R003/ADR-S4) e **Sandbox main via SandboxManager** (children
21
+ * declaráveis via `BootDSL.sandboxes` / directive `sandbox create`). Watch
22
+ * streaming, plugin validator, modal `open` external, `goto`, UX wrapper
23
+ * ficam pra fases posteriores.
24
+ */
25
+
26
+ type DispatchResult = ReturnType<NonNullable<ISandbox["system"]>["dispatch"]>;
27
+ /**
28
+ * Config do Runtime. Defaults orientados pro modo determinístico
29
+ * (ADR-R011) — Aplicação JS típica é business async com replay.
30
+ */
31
+ interface RuntimeConfig {
32
+ /**
33
+ * Identificador da Sandbox main. Default: `"main"`.
34
+ * Usado em snapshots e cross-realm path syntax (ADR-041).
35
+ */
36
+ readonly id?: string;
37
+ /**
38
+ * Environment compartilhado do ecossistema (ADR-R002 — categoria A,
39
+ * ambient). Propagado por referência pra Sandbox main; quando há
40
+ * children declaradas via DSL, mesmo environment é compartilhado.
41
+ */
42
+ readonly environment?: SandboxEnvironment;
43
+ /**
44
+ * Capabilities da main — cascade restritiva pros children
45
+ * (ADR-067 RS, ADR-030 Sandbox). Default da policy depende do `mode`
46
+ * abaixo.
47
+ */
48
+ readonly capabilities?: SandboxCapabilities;
49
+ /**
50
+ * Mode da Sandbox main:
51
+ * - `"closed"` (default determinístico) — só AppPort, sem
52
+ * imperativas externas
53
+ * - `"governed"` (modo serviço — ADR-R011) — SystemPort exposto;
54
+ * consumer aciona invoke/dispatch/emit direto
55
+ */
56
+ readonly mainMode?: SandboxMode;
57
+ /**
58
+ * Buffer de effects (ADR-R012). Quando enabled, `applyEffect` registra
59
+ * na trilha consumível via `collectDelta()`. Lib superior persiste
60
+ * no formato dela (StateDoc/DeltaDoc/etc).
61
+ *
62
+ * Default: `{ enabled: true }` (modo determinístico). Modo serviço
63
+ * (ADR-R011) tipicamente desliga (`{ enabled: false }`).
64
+ */
65
+ readonly buffer?: {
66
+ readonly enabled?: boolean;
67
+ };
68
+ /**
69
+ * Config do compiler interno (ADR-R003/ADR-S4) — usado quando o Runtime cria
70
+ * o `CompilationService` interno (`environment.compilation` ausente).
71
+ * Quando um `CompilationService` é injetado, esta config é ignorada.
72
+ *
73
+ * `scope` são funções puras extras pra `$fn` (somam-se aos
74
+ * `@statedelta-libs/operators` que já vêm no scope-base); `handlers` são
75
+ * services com contexto pra `$fn "ns:method"`; `mode` é `"jit"` (default)
76
+ * ou `"closures"` (CSP-safe).
77
+ */
78
+ readonly compiler?: {
79
+ readonly scope?: Scope;
80
+ readonly handlers?: HandlersMap;
81
+ readonly mode?: CompilerMode;
82
+ };
83
+ /**
84
+ * **Persistência v2 — `physics.persist` (ADR-030 raiz)** — declara
85
+ * capacidade de persistência do realm da main. Repassado pra Sandbox main
86
+ * via `physics.persist`. Cascade restritivo é aplicado pelas children
87
+ * (ADR-031 raiz).
88
+ *
89
+ * - `definitions: true` → snapshot completo (Store + DSL), `register`
90
+ * dinâmico habilitado. Exige `environment.compilation` (handshake — ADR-037).
91
+ * - `effects: true` → buffer de effects pra replay determinístico.
92
+ *
93
+ * Default: `undefined` (sem persistência declarada — comportamento legado).
94
+ */
95
+ readonly persist?: PersistConfigInput;
96
+ }
97
+
98
+ /**
99
+ * Modo de operação do Runtime.
100
+ *
101
+ * - `"live"` (default) — operação normal. `step({ effects? })` registra
102
+ * inputs no buffer; handlers chamam hooks via env; signals/notify ON.
103
+ * - `"recovery"` — reconstrução determinística a partir de um buffer
104
+ * gravado. `step({ effects?, provides? })` consome a fila injetada;
105
+ * buffer NÃO registra; signals/notify silenciados. Exige
106
+ * `capabilities.deterministic !== false`. Toggle via `setMode()`.
107
+ */
108
+ type RuntimeMode = "live" | "recovery";
109
+ /**
110
+ * Input por tick — payload único do `step(input?)`.
111
+ *
112
+ * - `effects` — lista de inputs `{ id, data }` aplicados antes do tick.
113
+ * Equivalente a múltiplos `applyEffect` + um step.
114
+ * - `provides` — fila FIFO consumida pelo handler `provide` durante o tick.
115
+ * **Só permitido em modo `"recovery"`**. Em live, presença
116
+ * desta key lança `LIVE_MODE_PROVIDES_FORBIDDEN`.
117
+ */
118
+ interface StepInput {
119
+ readonly effects?: ReadonlyArray<{
120
+ readonly id: string;
121
+ readonly data: unknown;
122
+ }>;
123
+ readonly provides?: readonly ProvideBufferEntry[];
124
+ }
125
+ /**
126
+ * Acesso de leitura ao state do realm — namespace agrupado pra todas as
127
+ * queries de state (intra-main + cross-sandbox via path syntax).
128
+ *
129
+ * Cascade restritiva quando `mainMode === "closed"`:
130
+ * - Reads só são permitidos pra states declarados em `exports`. States
131
+ * internos retornam `undefined` (`get`), `false` (`hasState`), ou são
132
+ * omitidos do array (`getStateIds`). ADR-031 — implementado em
133
+ * `@statedelta-axiom/sandbox/src/ports.ts`.
134
+ *
135
+ * Em `governed` (open) → todos os states são visíveis.
136
+ *
137
+ * Cross-sandbox: aceita path syntax `"child-id/state-id"` (ADR-041). A
138
+ * child filtra leitura via seu próprio `exports`.
139
+ */
140
+ interface RuntimeStateAccess {
141
+ /**
142
+ * Lê um state (intra-main) ou state de child (`"child/state"`). Em
143
+ * closed, retorna `undefined` pra states não-exportados.
144
+ *
145
+ * - 1 arg sem `:` → state inteiro
146
+ * - 1 arg com `:` → split em `stateId:field`
147
+ * - 2 args → intra-realm direto, sem split
148
+ */
149
+ get(path: string, field?: string): unknown;
150
+ /**
151
+ * `true` se o state existe E está visível pelo modo atual. Em closed
152
+ * com exports declarado, só retorna `true` pra states exportados.
153
+ */
154
+ hasState(path: string): boolean;
155
+ /**
156
+ * Lista state IDs visíveis pelo modo atual. Em closed com exports,
157
+ * só lista os exportados.
158
+ */
159
+ getStateIds(): string[];
160
+ }
161
+ /**
162
+ * Interface pública do Runtime — única lib que a Aplicação JS instancia
163
+ * diretamente (ADR-R001). Sandbox main é exposta via `main` pra acesso
164
+ * JS direto à face JS (ADR-R005).
165
+ */
166
+ interface IRuntime {
167
+ /** ID do Runtime (declarado no config ou default `"main"`). */
168
+ readonly id: string;
169
+ /**
170
+ * Boot canônico — `BootDSL` (JSON) → `compiler.compileBoot(dsl)` → boot da
171
+ * Sandbox main. Guarda `dsl` como source (`bootSource()`). `compileBoot`
172
+ * lança em DSL malformado (erro de programador); falhas de registro/
173
+ * validação vêm no `BootResult.errors` (são dados — ADR-063 RS).
174
+ */
175
+ boot(dsl: BootDSL, options?: {
176
+ env?: Record<string, unknown>;
177
+ }): BootResult;
178
+ /**
179
+ * Boot escape hatch — `BootDefinitions` JS já compiladas. Delega direto
180
+ * pra Sandbox main. Sem source (`bootSource()` fica `undefined`).
181
+ *
182
+ * Casos típicos: testes unitários, debug, modo serviço sem replay,
183
+ * apps JS-only que opt-out de DSL.
184
+ */
185
+ bootCompiled(definitions: BootDefinitions<RealmCtx>, options?: {
186
+ env?: Record<string, unknown>;
187
+ }): BootResult;
188
+ /**
189
+ * O `BootDSL` passado pro último `boot(dsl)` — ou `undefined` se ainda não
190
+ * bootou, ou se bootou via `bootCompiled` (escape hatch, sem source). Útil
191
+ * pra a lib superior persistir o source e recriar via recompilação.
192
+ */
193
+ bootSource(): BootDSL | undefined;
194
+ /**
195
+ * Encerra o Runtime — dispose da Sandbox main + cleanup de buffer/
196
+ * listeners. Idempotente.
197
+ */
198
+ dispose(): SandboxOpResult;
199
+ /** True após `dispose()`. Reads pós-dispose lançam (semântica Sandbox). */
200
+ isDisposed(): boolean;
201
+ /**
202
+ * Tick síncrono — aplica `input.effects` (se houver), carrega
203
+ * `input.provides` na fila (recovery only), avança o realm um tick.
204
+ *
205
+ * Comportamento por modo:
206
+ * - `"live"` — `provides` no input lança `LIVE_MODE_PROVIDES_FORBIDDEN`.
207
+ * Effects são depositados e registrados no buffer (se enabled).
208
+ * Handlers `provide` resolvem via env hook (registram automaticamente).
209
+ * - `"recovery"` — consome `input.provides` em FIFO. Buffer NÃO registra
210
+ * nada. Signals/notify silenciados. Erros hard em divergência:
211
+ * `REPLAY_UNDERFLOW` (fila vazia mid-step),
212
+ * `REPLAY_OVERFLOW` (fila sobrou ao fim do step),
213
+ * `REPLAY_PROVIDER_MISMATCH`, `REPLAY_PARAMS_MISMATCH`.
214
+ *
215
+ * Lança em ecosystem async (use `stepAsync`).
216
+ */
217
+ step(input?: StepInput): StepResult;
218
+ /** Tick async — mesma semântica de `step`, await-able. */
219
+ stepAsync(input?: StepInput): Promise<StepResult>;
220
+ /** Modo corrente: `"live"` (default) ou `"recovery"`. */
221
+ getMode(): RuntimeMode;
222
+ /**
223
+ * Alterna modo. Transição `"live" → "recovery"` exige
224
+ * `capabilities.deterministic !== false`; senão lança
225
+ * `RECOVERY_REQUIRES_DETERMINISM`. Idempotente — setar o mesmo modo
226
+ * é no-op.
227
+ */
228
+ setMode(mode: RuntimeMode): void;
229
+ /**
230
+ * Drena o buffer pendente — retorna entries (`effect` | `provide`)
231
+ * aplicados desde a última coleta e marca como coletados. Lib superior
232
+ * empilha no formato dela (StateDoc/DeltaDoc/log).
233
+ *
234
+ * Buffer disabled (modo serviço OU `physics.deterministic: false`) →
235
+ * array vazio sempre.
236
+ */
237
+ collectDelta(): readonly BufferEntry[];
238
+ /**
239
+ * Inventário do runtime: flags + providers registrados. Customer chama
240
+ * tipicamente antes do boot pra adaptar a infra (ex: descobrir se um
241
+ * provider `async` está disponível antes de planejar `stepAsync`).
242
+ */
243
+ getCapabilities(): RuntimeCapabilities;
244
+ /** Captura snapshot do state inteiro — delega Sandbox main. */
245
+ snapshot(): SandboxOpResult<SandboxSnapshot>;
246
+ /** Restaura state a partir de snapshot — delega Sandbox main. */
247
+ recover(snap: SandboxSnapshot): SandboxOpResult;
248
+ /**
249
+ * Namespace de leitura do state. Closed filtra por `exports`; governed
250
+ * vê tudo. Path syntax aceita cross-sandbox (`"child/state"`).
251
+ */
252
+ readonly state: RuntimeStateAccess;
253
+ /** Tick atual (cumulativo desde boot; incrementa em cada step executado). */
254
+ getTick(): number;
255
+ /** Fase do system: `"created" | "booted" | "running" | "finished" | ...` */
256
+ getPhase(): SystemPhase;
257
+ /** Engine está parado (sem trabalho pendente)? */
258
+ isIdle(): boolean;
259
+ /** Leis imutáveis do realm (determinismo, persistence, async). */
260
+ getPhysics(): Readonly<RealmPhysics>;
261
+ /**
262
+ * Invoca action por ID (síncrono). Em `mainMode: "closed"` lança
263
+ * `NOT_GOVERNED` — closed protege o interior do realm.
264
+ */
265
+ invoke(id: string, params?: Record<string, unknown>): DirectiveResult;
266
+ /** Versão async de `invoke`. Closed throws `NOT_GOVERNED`. */
267
+ invokeAsync(id: string, params?: Record<string, unknown>): Promise<DirectiveResult>;
268
+ /**
269
+ * Dispatch direto numa op de state. Aceita path syntax (`"child/state"`).
270
+ * Closed throws `NOT_GOVERNED`.
271
+ */
272
+ dispatch(statePath: string, op: string, params?: Record<string, unknown>): DispatchResult;
273
+ /** Emit de evento. Closed throws `NOT_GOVERNED`. */
274
+ emit(event: string, data?: unknown): void;
275
+ /** Processa eventos pendentes manualmente. Closed throws `NOT_GOVERNED`. */
276
+ processEvents(): EventProcessingResult;
277
+ /** Action com este ID existe? Closed throws `NOT_GOVERNED`. */
278
+ hasAction(id: string): boolean;
279
+ /** Lista IDs de actions registradas. Closed throws `NOT_GOVERNED`. */
280
+ getActionIds(): string[];
281
+ /** Rule com este ID existe? Closed throws `NOT_GOVERNED`. */
282
+ hasRule(id: string): boolean;
283
+ /** Contagem total de rules. Closed throws `NOT_GOVERNED`. */
284
+ getRuleCount(): number;
285
+ /**
286
+ * Observa mudanças efetivas do realm por tick — canal de persistência
287
+ * observacional (effects aplicados, lifecycle, error, notify, requests).
288
+ * Lazy subscribe; retorna unsubscribe idempotente.
289
+ */
290
+ watch(listener: (change: SandboxChange) => void): () => void;
291
+ /** Inscreve listener em system events do RS interno. */
292
+ on<K extends keyof SystemEvents & string>(event: K, listener: (data: SystemEvents[K]) => void): () => void;
293
+ }
294
+
295
+ /**
296
+ * Runtime — factory `createRuntime` (ADR-R001).
297
+ *
298
+ * Camada TOP do ecossistema. É o **único** lugar com compiler (ADR-S1/ADR-002/
299
+ * ADR-003 Sandbox): `boot(dsl)` compila a árvore estática inteira top-down →
300
+ * `BootDefinitions` (sandboxes aninhadas e o `boot` embutido em diretivas
301
+ * `sandbox create` inclusos) e boota a main. O **SandboxManager** + as Sandboxes
302
+ * + o RS são interpretadores puros — só recebem JS. Cria a Sandbox **main** via
303
+ * `manager.createSandbox(...)` (a main é gerenciada → pode ter children declaradas
304
+ * via `BootDSL.sandboxes` / directive `sandbox create`).
305
+ * Monta o buffer de inputs externos (ADR-R012 + ADR-039 raiz). Expõe a API pública
306
+ * pra Aplicação JS.
307
+ *
308
+ * Cobre: createRuntime + lifecycle (boot/bootCompiled/dispose), tick unificado
309
+ * (`step(input?)` / `stepAsync(input?)` — ADR-R021), modo live/recovery
310
+ * (ADR-R021), buffer + collectDelta (ADR-R012), snapshot/recover (delega
311
+ * Sandbox main), system events com silêncio em recovery, **`boot(dsl)` via
312
+ * compiler** (ADR-R003/ADR-S4). Watch streaming, plugin validator, modal `open`
313
+ * external, `goto`, UX wrapper ficam pra fases posteriores.
314
+ */
315
+
316
+ /**
317
+ * Cria um Runtime com compiler + SandboxManager + Sandbox main configurados.
318
+ * Defaults orientados pro modo determinístico (ADR-R011) — `mainMode: "closed"`,
319
+ * buffer enabled, mode `"live"`. Modo serviço opt-in via `mainMode: "governed"` +
320
+ * `buffer: { enabled: false }`.
321
+ */
322
+ declare function createRuntime(config?: RuntimeConfig): IRuntime;
323
+
324
+ /**
325
+ * Buffer de inputs externos (ADR-R012 + ADR-039 raiz) — log linear de
326
+ * `effect` (customer push) e `provide` (system synthesize), em ordem
327
+ * temporal global.
328
+ *
329
+ * Lib superior consome via `collectDelta()` e empilha no formato dela
330
+ * (StateDoc/DeltaDoc/log/etc). Buffer é desligável (modo serviço, FPS
331
+ * sem replay) — append vira no-op, drain retorna vazio (zero overhead).
332
+ *
333
+ * Anti-determinismo: buffer só faz sentido com determinismo declarado
334
+ * (`physics.deterministic: true` — ADR-R011). Sem isso, replay é
335
+ * impossível e persistir entries é desperdício.
336
+ */
337
+
338
+ interface DeltaBuffer {
339
+ /** Appenda um entry (effect ou provide). No-op quando desligado. */
340
+ append(entry: BufferEntry): void;
341
+ /** Drena tudo acumulado. No-op quando desligado (retorna vazio). */
342
+ drain(): readonly BufferEntry[];
343
+ /** Limpa sem retornar — usado em dispose. */
344
+ clear(): void;
345
+ }
346
+ declare function createDeltaBuffer(enabled: boolean): DeltaBuffer;
347
+
348
+ export { type DeltaBuffer, type IRuntime, type RuntimeConfig, type RuntimeMode, type StepInput, createDeltaBuffer, createRuntime };
@@ -0,0 +1,348 @@
1
+ import { BootDSL, BootResult, BootDefinitions, ProvideBufferEntry, BufferEntry, RuntimeCapabilities } from '@statedelta-axiom/contracts';
2
+ export { BufferEntry, EffectBufferEntry, ProvideBufferEntry } from '@statedelta-axiom/contracts';
3
+ import { Scope, HandlersMap, CompilerMode } from '@statedelta-axiom/compiler';
4
+ import { PersistConfigInput, RealmCtx, StepResult, SystemPhase, RealmPhysics, SystemEvents } from '@statedelta-axiom/realm-system';
5
+ import { SandboxEnvironment, SandboxCapabilities, SandboxMode, SandboxOpResult, SandboxSnapshot, ISandbox, SandboxChange } from '@statedelta-axiom/sandbox';
6
+ import { DirectiveResult } from '@statedelta-actions/sdk/core';
7
+ import { EventProcessingResult } from '@statedelta-actions/sdk/events';
8
+
9
+ /**
10
+ * Tipos públicos do Runtime (ADR-R001 — lib TOP do ecossistema).
11
+ *
12
+ * Runtime é a camada que a Aplicação JS instancia diretamente. Define
13
+ * environment compartilhado, instancia Sandbox main (face JS via
14
+ * `runtime.main`), expõe primitivos de persistência (snapshot/recover,
15
+ * applyEffect/recoverEffect, collectDelta).
16
+ *
17
+ * Esta versão cobre: lifecycle, tick unificado com `step(input)`
18
+ * (ADR-R021), modo live/recovery (ADR-R021), buffer (ADR-R012),
19
+ * snapshot/recover, system events, **compiler integrado** (`boot(dsl)` —
20
+ * ADR-R003/ADR-S4) e **Sandbox main via SandboxManager** (children
21
+ * declaráveis via `BootDSL.sandboxes` / directive `sandbox create`). Watch
22
+ * streaming, plugin validator, modal `open` external, `goto`, UX wrapper
23
+ * ficam pra fases posteriores.
24
+ */
25
+
26
+ type DispatchResult = ReturnType<NonNullable<ISandbox["system"]>["dispatch"]>;
27
+ /**
28
+ * Config do Runtime. Defaults orientados pro modo determinístico
29
+ * (ADR-R011) — Aplicação JS típica é business async com replay.
30
+ */
31
+ interface RuntimeConfig {
32
+ /**
33
+ * Identificador da Sandbox main. Default: `"main"`.
34
+ * Usado em snapshots e cross-realm path syntax (ADR-041).
35
+ */
36
+ readonly id?: string;
37
+ /**
38
+ * Environment compartilhado do ecossistema (ADR-R002 — categoria A,
39
+ * ambient). Propagado por referência pra Sandbox main; quando há
40
+ * children declaradas via DSL, mesmo environment é compartilhado.
41
+ */
42
+ readonly environment?: SandboxEnvironment;
43
+ /**
44
+ * Capabilities da main — cascade restritiva pros children
45
+ * (ADR-067 RS, ADR-030 Sandbox). Default da policy depende do `mode`
46
+ * abaixo.
47
+ */
48
+ readonly capabilities?: SandboxCapabilities;
49
+ /**
50
+ * Mode da Sandbox main:
51
+ * - `"closed"` (default determinístico) — só AppPort, sem
52
+ * imperativas externas
53
+ * - `"governed"` (modo serviço — ADR-R011) — SystemPort exposto;
54
+ * consumer aciona invoke/dispatch/emit direto
55
+ */
56
+ readonly mainMode?: SandboxMode;
57
+ /**
58
+ * Buffer de effects (ADR-R012). Quando enabled, `applyEffect` registra
59
+ * na trilha consumível via `collectDelta()`. Lib superior persiste
60
+ * no formato dela (StateDoc/DeltaDoc/etc).
61
+ *
62
+ * Default: `{ enabled: true }` (modo determinístico). Modo serviço
63
+ * (ADR-R011) tipicamente desliga (`{ enabled: false }`).
64
+ */
65
+ readonly buffer?: {
66
+ readonly enabled?: boolean;
67
+ };
68
+ /**
69
+ * Config do compiler interno (ADR-R003/ADR-S4) — usado quando o Runtime cria
70
+ * o `CompilationService` interno (`environment.compilation` ausente).
71
+ * Quando um `CompilationService` é injetado, esta config é ignorada.
72
+ *
73
+ * `scope` são funções puras extras pra `$fn` (somam-se aos
74
+ * `@statedelta-libs/operators` que já vêm no scope-base); `handlers` são
75
+ * services com contexto pra `$fn "ns:method"`; `mode` é `"jit"` (default)
76
+ * ou `"closures"` (CSP-safe).
77
+ */
78
+ readonly compiler?: {
79
+ readonly scope?: Scope;
80
+ readonly handlers?: HandlersMap;
81
+ readonly mode?: CompilerMode;
82
+ };
83
+ /**
84
+ * **Persistência v2 — `physics.persist` (ADR-030 raiz)** — declara
85
+ * capacidade de persistência do realm da main. Repassado pra Sandbox main
86
+ * via `physics.persist`. Cascade restritivo é aplicado pelas children
87
+ * (ADR-031 raiz).
88
+ *
89
+ * - `definitions: true` → snapshot completo (Store + DSL), `register`
90
+ * dinâmico habilitado. Exige `environment.compilation` (handshake — ADR-037).
91
+ * - `effects: true` → buffer de effects pra replay determinístico.
92
+ *
93
+ * Default: `undefined` (sem persistência declarada — comportamento legado).
94
+ */
95
+ readonly persist?: PersistConfigInput;
96
+ }
97
+
98
+ /**
99
+ * Modo de operação do Runtime.
100
+ *
101
+ * - `"live"` (default) — operação normal. `step({ effects? })` registra
102
+ * inputs no buffer; handlers chamam hooks via env; signals/notify ON.
103
+ * - `"recovery"` — reconstrução determinística a partir de um buffer
104
+ * gravado. `step({ effects?, provides? })` consome a fila injetada;
105
+ * buffer NÃO registra; signals/notify silenciados. Exige
106
+ * `capabilities.deterministic !== false`. Toggle via `setMode()`.
107
+ */
108
+ type RuntimeMode = "live" | "recovery";
109
+ /**
110
+ * Input por tick — payload único do `step(input?)`.
111
+ *
112
+ * - `effects` — lista de inputs `{ id, data }` aplicados antes do tick.
113
+ * Equivalente a múltiplos `applyEffect` + um step.
114
+ * - `provides` — fila FIFO consumida pelo handler `provide` durante o tick.
115
+ * **Só permitido em modo `"recovery"`**. Em live, presença
116
+ * desta key lança `LIVE_MODE_PROVIDES_FORBIDDEN`.
117
+ */
118
+ interface StepInput {
119
+ readonly effects?: ReadonlyArray<{
120
+ readonly id: string;
121
+ readonly data: unknown;
122
+ }>;
123
+ readonly provides?: readonly ProvideBufferEntry[];
124
+ }
125
+ /**
126
+ * Acesso de leitura ao state do realm — namespace agrupado pra todas as
127
+ * queries de state (intra-main + cross-sandbox via path syntax).
128
+ *
129
+ * Cascade restritiva quando `mainMode === "closed"`:
130
+ * - Reads só são permitidos pra states declarados em `exports`. States
131
+ * internos retornam `undefined` (`get`), `false` (`hasState`), ou são
132
+ * omitidos do array (`getStateIds`). ADR-031 — implementado em
133
+ * `@statedelta-axiom/sandbox/src/ports.ts`.
134
+ *
135
+ * Em `governed` (open) → todos os states são visíveis.
136
+ *
137
+ * Cross-sandbox: aceita path syntax `"child-id/state-id"` (ADR-041). A
138
+ * child filtra leitura via seu próprio `exports`.
139
+ */
140
+ interface RuntimeStateAccess {
141
+ /**
142
+ * Lê um state (intra-main) ou state de child (`"child/state"`). Em
143
+ * closed, retorna `undefined` pra states não-exportados.
144
+ *
145
+ * - 1 arg sem `:` → state inteiro
146
+ * - 1 arg com `:` → split em `stateId:field`
147
+ * - 2 args → intra-realm direto, sem split
148
+ */
149
+ get(path: string, field?: string): unknown;
150
+ /**
151
+ * `true` se o state existe E está visível pelo modo atual. Em closed
152
+ * com exports declarado, só retorna `true` pra states exportados.
153
+ */
154
+ hasState(path: string): boolean;
155
+ /**
156
+ * Lista state IDs visíveis pelo modo atual. Em closed com exports,
157
+ * só lista os exportados.
158
+ */
159
+ getStateIds(): string[];
160
+ }
161
+ /**
162
+ * Interface pública do Runtime — única lib que a Aplicação JS instancia
163
+ * diretamente (ADR-R001). Sandbox main é exposta via `main` pra acesso
164
+ * JS direto à face JS (ADR-R005).
165
+ */
166
+ interface IRuntime {
167
+ /** ID do Runtime (declarado no config ou default `"main"`). */
168
+ readonly id: string;
169
+ /**
170
+ * Boot canônico — `BootDSL` (JSON) → `compiler.compileBoot(dsl)` → boot da
171
+ * Sandbox main. Guarda `dsl` como source (`bootSource()`). `compileBoot`
172
+ * lança em DSL malformado (erro de programador); falhas de registro/
173
+ * validação vêm no `BootResult.errors` (são dados — ADR-063 RS).
174
+ */
175
+ boot(dsl: BootDSL, options?: {
176
+ env?: Record<string, unknown>;
177
+ }): BootResult;
178
+ /**
179
+ * Boot escape hatch — `BootDefinitions` JS já compiladas. Delega direto
180
+ * pra Sandbox main. Sem source (`bootSource()` fica `undefined`).
181
+ *
182
+ * Casos típicos: testes unitários, debug, modo serviço sem replay,
183
+ * apps JS-only que opt-out de DSL.
184
+ */
185
+ bootCompiled(definitions: BootDefinitions<RealmCtx>, options?: {
186
+ env?: Record<string, unknown>;
187
+ }): BootResult;
188
+ /**
189
+ * O `BootDSL` passado pro último `boot(dsl)` — ou `undefined` se ainda não
190
+ * bootou, ou se bootou via `bootCompiled` (escape hatch, sem source). Útil
191
+ * pra a lib superior persistir o source e recriar via recompilação.
192
+ */
193
+ bootSource(): BootDSL | undefined;
194
+ /**
195
+ * Encerra o Runtime — dispose da Sandbox main + cleanup de buffer/
196
+ * listeners. Idempotente.
197
+ */
198
+ dispose(): SandboxOpResult;
199
+ /** True após `dispose()`. Reads pós-dispose lançam (semântica Sandbox). */
200
+ isDisposed(): boolean;
201
+ /**
202
+ * Tick síncrono — aplica `input.effects` (se houver), carrega
203
+ * `input.provides` na fila (recovery only), avança o realm um tick.
204
+ *
205
+ * Comportamento por modo:
206
+ * - `"live"` — `provides` no input lança `LIVE_MODE_PROVIDES_FORBIDDEN`.
207
+ * Effects são depositados e registrados no buffer (se enabled).
208
+ * Handlers `provide` resolvem via env hook (registram automaticamente).
209
+ * - `"recovery"` — consome `input.provides` em FIFO. Buffer NÃO registra
210
+ * nada. Signals/notify silenciados. Erros hard em divergência:
211
+ * `REPLAY_UNDERFLOW` (fila vazia mid-step),
212
+ * `REPLAY_OVERFLOW` (fila sobrou ao fim do step),
213
+ * `REPLAY_PROVIDER_MISMATCH`, `REPLAY_PARAMS_MISMATCH`.
214
+ *
215
+ * Lança em ecosystem async (use `stepAsync`).
216
+ */
217
+ step(input?: StepInput): StepResult;
218
+ /** Tick async — mesma semântica de `step`, await-able. */
219
+ stepAsync(input?: StepInput): Promise<StepResult>;
220
+ /** Modo corrente: `"live"` (default) ou `"recovery"`. */
221
+ getMode(): RuntimeMode;
222
+ /**
223
+ * Alterna modo. Transição `"live" → "recovery"` exige
224
+ * `capabilities.deterministic !== false`; senão lança
225
+ * `RECOVERY_REQUIRES_DETERMINISM`. Idempotente — setar o mesmo modo
226
+ * é no-op.
227
+ */
228
+ setMode(mode: RuntimeMode): void;
229
+ /**
230
+ * Drena o buffer pendente — retorna entries (`effect` | `provide`)
231
+ * aplicados desde a última coleta e marca como coletados. Lib superior
232
+ * empilha no formato dela (StateDoc/DeltaDoc/log).
233
+ *
234
+ * Buffer disabled (modo serviço OU `physics.deterministic: false`) →
235
+ * array vazio sempre.
236
+ */
237
+ collectDelta(): readonly BufferEntry[];
238
+ /**
239
+ * Inventário do runtime: flags + providers registrados. Customer chama
240
+ * tipicamente antes do boot pra adaptar a infra (ex: descobrir se um
241
+ * provider `async` está disponível antes de planejar `stepAsync`).
242
+ */
243
+ getCapabilities(): RuntimeCapabilities;
244
+ /** Captura snapshot do state inteiro — delega Sandbox main. */
245
+ snapshot(): SandboxOpResult<SandboxSnapshot>;
246
+ /** Restaura state a partir de snapshot — delega Sandbox main. */
247
+ recover(snap: SandboxSnapshot): SandboxOpResult;
248
+ /**
249
+ * Namespace de leitura do state. Closed filtra por `exports`; governed
250
+ * vê tudo. Path syntax aceita cross-sandbox (`"child/state"`).
251
+ */
252
+ readonly state: RuntimeStateAccess;
253
+ /** Tick atual (cumulativo desde boot; incrementa em cada step executado). */
254
+ getTick(): number;
255
+ /** Fase do system: `"created" | "booted" | "running" | "finished" | ...` */
256
+ getPhase(): SystemPhase;
257
+ /** Engine está parado (sem trabalho pendente)? */
258
+ isIdle(): boolean;
259
+ /** Leis imutáveis do realm (determinismo, persistence, async). */
260
+ getPhysics(): Readonly<RealmPhysics>;
261
+ /**
262
+ * Invoca action por ID (síncrono). Em `mainMode: "closed"` lança
263
+ * `NOT_GOVERNED` — closed protege o interior do realm.
264
+ */
265
+ invoke(id: string, params?: Record<string, unknown>): DirectiveResult;
266
+ /** Versão async de `invoke`. Closed throws `NOT_GOVERNED`. */
267
+ invokeAsync(id: string, params?: Record<string, unknown>): Promise<DirectiveResult>;
268
+ /**
269
+ * Dispatch direto numa op de state. Aceita path syntax (`"child/state"`).
270
+ * Closed throws `NOT_GOVERNED`.
271
+ */
272
+ dispatch(statePath: string, op: string, params?: Record<string, unknown>): DispatchResult;
273
+ /** Emit de evento. Closed throws `NOT_GOVERNED`. */
274
+ emit(event: string, data?: unknown): void;
275
+ /** Processa eventos pendentes manualmente. Closed throws `NOT_GOVERNED`. */
276
+ processEvents(): EventProcessingResult;
277
+ /** Action com este ID existe? Closed throws `NOT_GOVERNED`. */
278
+ hasAction(id: string): boolean;
279
+ /** Lista IDs de actions registradas. Closed throws `NOT_GOVERNED`. */
280
+ getActionIds(): string[];
281
+ /** Rule com este ID existe? Closed throws `NOT_GOVERNED`. */
282
+ hasRule(id: string): boolean;
283
+ /** Contagem total de rules. Closed throws `NOT_GOVERNED`. */
284
+ getRuleCount(): number;
285
+ /**
286
+ * Observa mudanças efetivas do realm por tick — canal de persistência
287
+ * observacional (effects aplicados, lifecycle, error, notify, requests).
288
+ * Lazy subscribe; retorna unsubscribe idempotente.
289
+ */
290
+ watch(listener: (change: SandboxChange) => void): () => void;
291
+ /** Inscreve listener em system events do RS interno. */
292
+ on<K extends keyof SystemEvents & string>(event: K, listener: (data: SystemEvents[K]) => void): () => void;
293
+ }
294
+
295
+ /**
296
+ * Runtime — factory `createRuntime` (ADR-R001).
297
+ *
298
+ * Camada TOP do ecossistema. É o **único** lugar com compiler (ADR-S1/ADR-002/
299
+ * ADR-003 Sandbox): `boot(dsl)` compila a árvore estática inteira top-down →
300
+ * `BootDefinitions` (sandboxes aninhadas e o `boot` embutido em diretivas
301
+ * `sandbox create` inclusos) e boota a main. O **SandboxManager** + as Sandboxes
302
+ * + o RS são interpretadores puros — só recebem JS. Cria a Sandbox **main** via
303
+ * `manager.createSandbox(...)` (a main é gerenciada → pode ter children declaradas
304
+ * via `BootDSL.sandboxes` / directive `sandbox create`).
305
+ * Monta o buffer de inputs externos (ADR-R012 + ADR-039 raiz). Expõe a API pública
306
+ * pra Aplicação JS.
307
+ *
308
+ * Cobre: createRuntime + lifecycle (boot/bootCompiled/dispose), tick unificado
309
+ * (`step(input?)` / `stepAsync(input?)` — ADR-R021), modo live/recovery
310
+ * (ADR-R021), buffer + collectDelta (ADR-R012), snapshot/recover (delega
311
+ * Sandbox main), system events com silêncio em recovery, **`boot(dsl)` via
312
+ * compiler** (ADR-R003/ADR-S4). Watch streaming, plugin validator, modal `open`
313
+ * external, `goto`, UX wrapper ficam pra fases posteriores.
314
+ */
315
+
316
+ /**
317
+ * Cria um Runtime com compiler + SandboxManager + Sandbox main configurados.
318
+ * Defaults orientados pro modo determinístico (ADR-R011) — `mainMode: "closed"`,
319
+ * buffer enabled, mode `"live"`. Modo serviço opt-in via `mainMode: "governed"` +
320
+ * `buffer: { enabled: false }`.
321
+ */
322
+ declare function createRuntime(config?: RuntimeConfig): IRuntime;
323
+
324
+ /**
325
+ * Buffer de inputs externos (ADR-R012 + ADR-039 raiz) — log linear de
326
+ * `effect` (customer push) e `provide` (system synthesize), em ordem
327
+ * temporal global.
328
+ *
329
+ * Lib superior consome via `collectDelta()` e empilha no formato dela
330
+ * (StateDoc/DeltaDoc/log/etc). Buffer é desligável (modo serviço, FPS
331
+ * sem replay) — append vira no-op, drain retorna vazio (zero overhead).
332
+ *
333
+ * Anti-determinismo: buffer só faz sentido com determinismo declarado
334
+ * (`physics.deterministic: true` — ADR-R011). Sem isso, replay é
335
+ * impossível e persistir entries é desperdício.
336
+ */
337
+
338
+ interface DeltaBuffer {
339
+ /** Appenda um entry (effect ou provide). No-op quando desligado. */
340
+ append(entry: BufferEntry): void;
341
+ /** Drena tudo acumulado. No-op quando desligado (retorna vazio). */
342
+ drain(): readonly BufferEntry[];
343
+ /** Limpa sem retornar — usado em dispose. */
344
+ clear(): void;
345
+ }
346
+ declare function createDeltaBuffer(enabled: boolean): DeltaBuffer;
347
+
348
+ export { type DeltaBuffer, type IRuntime, type RuntimeConfig, type RuntimeMode, type StepInput, createDeltaBuffer, createRuntime };
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ import {createCompilationService}from'@statedelta-axiom/compiler';import {createSandboxManager}from'@statedelta-axiom/sandbox';import {PROVIDER_ERROR_CODES}from'@statedelta-axiom/contracts';var C=Object.freeze([]);function h(s){if(!s)return {append:()=>{},drain:()=>C,clear:()=>{}};let u=[];return {append(m){u.push(m);},drain(){if(u.length===0)return C;let m=u;return u=[],m},clear(){u=[];}}}function k(s={}){let u=s.id??"main",m=s.capabilities?.deterministic!==false,S=m&&s.buffer?.enabled!==false,d=s.environment?.compilation??createCompilationService(s.compiler??{}),E=h(S),c="live",f=[],y=[],g=S?{append(e){c!=="recovery"&&E.append(e);},replayCursor(){return c!=="recovery"?null:f.shift()??null},isRecoveryMode(){return c==="recovery"},reportRecoveryError(e){y.push(e);}}:void 0,P={...s.environment,compilation:d,...g!==void 0&&{providerBuffer:g}},I=createSandboxManager({environment:P}),A=s.persist?{persist:s.persist}:void 0,r=I.createSandbox({id:u,mode:s.mainMode??"closed",capabilities:s.capabilities,physics:A}),v=false,R,a;function n(e){if(v)throw new Error(`Runtime "${u}" is disposed; "${e}" rejected.`)}function p(e){if(!r.system)throw new Error(`NOT_GOVERNED: "${e}" requires mainMode="governed"; main is closed`)}function D(e){if(e?.provides!==void 0&&c==="live")throw new Error(`${PROVIDER_ERROR_CODES.LIVE_MODE_PROVIDES_FORBIDDEN}: provides input is only valid in recovery mode`);if(e?.effects){let t=r.app.getTick()+1,o=Date.now();for(let i of e.effects)c==="live"&&E.append({type:"effect",tick:t,id:i.id,data:i.data,ts:o}),r.app.applyEffect(i.id,i.data);}e?.provides&&e.provides.length>0&&f.push(...e.provides);}function B(){if(c==="recovery"){if(y.length>0){let e=y;throw y=[],f=[],new Error(`Recovery failed: ${e.join("; ")}`)}if(f.length>0){let e=f.length;throw f=[],new Error(`${PROVIDER_ERROR_CODES.REPLAY_OVERFLOW}: ${e} provide entries left in queue after step`)}}}return {id:u,boot(e,t){n("boot");let{artifact:o,sourceKey:i}=d.compile(e);return d.retain(i),a!==void 0&&d.release(a),a=i,R=e,r.boot(o,{...t,bootSourceKey:i})},bootCompiled(e,t){return n("bootCompiled"),s.persist?.definitions===true?{success:false,registered:{states:[],actions:[],rules:[],events:[],views:[],sandboxes:[]},errors:[{resource:"physics",code:"DEFINITIONS_REQUIRE_DSL",message:"bootCompiled rejected: physics.persist.definitions=true requires boot(dsl) \u2014 DSL is the source of truth for Definitions",data:{hint:"use runtime.boot(dsl) instead, or unset physics.persist.definitions for tests / service mode"}}],warnings:[]}:(R=void 0,a!==void 0&&(d.release(a),a=void 0),r.boot(e,t))},bootSource(){return R},dispose(){return v?{ok:false,error:{code:"RUNTIME_DISPOSED"}}:(v=true,E.clear(),f=[],a!==void 0&&(d.release(a),a=void 0),I.dispose(u))},isDisposed(){return v},step(e){n("step"),D(e);let t=r.app.step();return B(),t},async stepAsync(e){n("stepAsync"),D(e);let t=await r.app.stepAsync();return B(),t},getMode(){return c},setMode(e){if(n("setMode"),e!==c){if(e==="recovery"&&!m)throw new Error(`${PROVIDER_ERROR_CODES.RECOVERY_REQUIRES_DETERMINISM}: recovery mode requires capabilities.deterministic !== false`);f=[],y=[],c=e;}},collectDelta(){return v?[]:E.drain()},getCapabilities(){let e=s.environment?.providers??{},t=!!s.environment?.async,o=[];for(let i of Object.keys(e)){let l=e[i],_=l.mode==="async"&&!t;o.push({id:i,...l.description!==void 0&&{description:l.description},mode:l.mode,persistence:l.persistence,available:!_,..._&&{reason:"Requires async runtime (current runtime is sync)"}});}return {async:t,persistDefinitions:s.persist?.definitions===true,providers:o}},snapshot(){return n("snapshot"),r.app.snapshot()},recover(e){if(n("recover"),e.persistence===void 0)return r.app.restore(e);let t=e.persistence.bootSourceKey,o=d.getSource(t);if(o===void 0)return {ok:false,error:{code:"RECOVER_SOURCE_UNAVAILABLE",message:`Source for bootSourceKey "${t}" not found in CompilationService \u2014 it was evicted or never registered. Share the same service between the snapshotting and recovering Runtimes, or boot(dsl) first to register it.`,data:{bootSourceKey:t}}};if(r.getPhase()==="created"){let{artifact:i}=d.compile(o);d.retain(t),a!==void 0&&d.release(a),a=t,R=o;let l=r.boot(i,{bootSourceKey:t});if(!l.success)return {ok:false,error:{code:"RECOVER_BOOT_FAILED",message:"Recover via service failed during boot of recompiled artifact",data:{errors:l.errors}}}}return r.app.restore(e)},state:{get(e,t){return n("state.get"),r.app.get(e,t)},hasState(e){return n("state.hasState"),r.app.hasState(e)},getStateIds(){return n("state.getStateIds"),r.app.getStateIds()}},getTick(){return n("getTick"),r.app.getTick()},getPhase(){return n("getPhase"),r.getPhase()},isIdle(){return n("isIdle"),r.app.isIdle()},getPhysics(){return n("getPhysics"),r.app.getPhysics()},invoke(e,t){return n("invoke"),p("invoke"),r.system.invoke(e,t)},invokeAsync(e,t){return n("invokeAsync"),p("invokeAsync"),r.system.invokeAsync(e,t)},dispatch(e,t,o){return n("dispatch"),p("dispatch"),r.system.dispatch(e,t,o)},emit(e,t){n("emit"),p("emit"),r.system.emit(e,t);},processEvents(){return n("processEvents"),p("processEvents"),r.system.processEvents()},hasAction(e){return n("hasAction"),p("hasAction"),r.system.hasAction(e)},getActionIds(){return n("getActionIds"),p("getActionIds"),r.system.getActionIds()},hasRule(e){return n("hasRule"),p("hasRule"),r.system.hasRule(e)},getRuleCount(){return n("getRuleCount"),p("getRuleCount"),r.system.getRuleCount()},watch(e){return n("watch"),r.app.watch(e)},on(e,t){return n("on"),r.app.on(e,o=>{c==="recovery"&&e!=="error"||t(o);})}}}export{h as createDeltaBuffer,k as createRuntime};
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@statedelta-axiom/runtime",
3
+ "version": "0.1.0",
4
+ "description": "Runtime — lib TOP do ecossistema StateDelta Axiom. Define environment, instancia Sandbox main, expõe primitivos de persistência (applyEffect/collectDelta/snapshot)",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "dependencies": {
20
+ "@statedelta-actions/sdk": "^0.7.0",
21
+ "@statedelta-axiom/compiler": "0.1.0",
22
+ "@statedelta-axiom/contracts": "0.1.0",
23
+ "@statedelta-axiom/realm-system": "0.1.0",
24
+ "@statedelta-axiom/sandbox": "0.1.0"
25
+ },
26
+ "devDependencies": {
27
+ "@statedelta-axiom/builders": "0.1.0"
28
+ },
29
+ "author": "Anderson D. Rosa <andersondrosa@outlook.com>",
30
+ "license": "MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/andersondrosa/statedelta-axiom.git",
34
+ "directory": "packages/runtime"
35
+ },
36
+ "sideEffects": false,
37
+ "engines": {
38
+ "node": ">=18"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "scripts": {
44
+ "build": "tsup",
45
+ "dev": "tsup --watch",
46
+ "test": "vitest run",
47
+ "test:watch": "vitest",
48
+ "typecheck": "tsc --noEmit",
49
+ "clean": "rm -rf dist"
50
+ }
51
+ }