@intentic/engine 1.18.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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +28 -0
  3. package/dist/apply.d.ts +4 -0
  4. package/dist/apply.d.ts.map +1 -0
  5. package/dist/apply.js +68 -0
  6. package/dist/apply.js.map +1 -0
  7. package/dist/index.d.ts +15 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +9 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/orphans.d.ts +5 -0
  12. package/dist/orphans.d.ts.map +1 -0
  13. package/dist/orphans.js +17 -0
  14. package/dist/orphans.js.map +1 -0
  15. package/dist/outputs-check.d.ts +3 -0
  16. package/dist/outputs-check.d.ts.map +1 -0
  17. package/dist/outputs-check.js +11 -0
  18. package/dist/outputs-check.js.map +1 -0
  19. package/dist/plan.d.ts +4 -0
  20. package/dist/plan.d.ts.map +1 -0
  21. package/dist/plan.js +60 -0
  22. package/dist/plan.js.map +1 -0
  23. package/dist/provider.d.ts +27 -0
  24. package/dist/provider.d.ts.map +1 -0
  25. package/dist/provider.js +2 -0
  26. package/dist/provider.js.map +1 -0
  27. package/dist/providers/fake.d.ts +14 -0
  28. package/dist/providers/fake.d.ts.map +1 -0
  29. package/dist/providers/fake.js +31 -0
  30. package/dist/providers/fake.js.map +1 -0
  31. package/dist/prune.d.ts +4 -0
  32. package/dist/prune.d.ts.map +1 -0
  33. package/dist/prune.js +69 -0
  34. package/dist/prune.js.map +1 -0
  35. package/dist/readiness.d.ts +8 -0
  36. package/dist/readiness.d.ts.map +1 -0
  37. package/dist/readiness.js +32 -0
  38. package/dist/readiness.js.map +1 -0
  39. package/dist/reconcile-loop.d.ts +11 -0
  40. package/dist/reconcile-loop.d.ts.map +1 -0
  41. package/dist/reconcile-loop.js +19 -0
  42. package/dist/reconcile-loop.js.map +1 -0
  43. package/dist/reconcile.d.ts +6 -0
  44. package/dist/reconcile.d.ts.map +1 -0
  45. package/dist/reconcile.js +15 -0
  46. package/dist/reconcile.js.map +1 -0
  47. package/dist/resolve-inputs.d.ts +6 -0
  48. package/dist/resolve-inputs.d.ts.map +1 -0
  49. package/dist/resolve-inputs.js +33 -0
  50. package/dist/resolve-inputs.js.map +1 -0
  51. package/dist/store.d.ts +10 -0
  52. package/dist/store.d.ts.map +1 -0
  53. package/dist/store.js +20 -0
  54. package/dist/store.js.map +1 -0
  55. package/dist/types.d.ts +67 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +2 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +50 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Artur Kurowski
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # @intentic/engine
2
+
3
+ The stateless **reconcile engine**. It walks a `DesiredStateGraph` in dependency order and converges it through the **Provider SPI** — never constructing providers itself, only consuming a `ResourceType → Provider` map. Depends on [`@intentic/graph`](../graph) + [`@intentic/resources`](../resources); the real providers live in [`@intentic/providers`](../providers).
4
+
5
+ ## Responsibilities
6
+
7
+ - `apply` — converge once: per node, `read` → `diff` → `create`/`update`/`noop`, gating on readiness.
8
+ - `plan` — dry run: classify every node without mutating infra.
9
+ - `reconcile` — loop apply→read until a plan reads all-noop ("state reads true"), returning a `ConvergeResult`.
10
+ - Define the **Provider SPI** the rest of the system implements: `Provider`, `Providers`, `Observed`, `DiffResult`, `ProviderContext`.
11
+ - Emit structured `EngineEvent`s (for the CLI's ndjson/json output) and handle readiness, orphans, and pruning.
12
+
13
+ ## Key files
14
+
15
+ - [src/apply.ts](src/apply.ts) / [src/plan.ts](src/plan.ts) / [src/reconcile-loop.ts](src/reconcile-loop.ts) — the converge/dry-run/loop logic.
16
+ - [src/provider.ts](src/provider.ts) / [src/types.ts](src/types.ts) — the SPI and engine types (`Provider`, `DiffResult`, `EngineConfig`, `Step`, `Orphan`).
17
+ - [src/readiness.ts](src/readiness.ts) — `httpProbe` / `waitReady` (readiness gates).
18
+ - [src/resolve-inputs.ts](src/resolve-inputs.ts) — resolve refs/secrets into concrete provider inputs.
19
+ - [src/orphans.ts](src/orphans.ts) / [src/prune.ts](src/prune.ts) — drift cleanup; [src/providers/](src/providers) — `createFakeProviders` (in-memory SPI for tests).
20
+
21
+ ## How it fits
22
+
23
+ The execution core. `state-resolver` produces the graph; `providers` supplies the concrete SPI map; the `cli` wires them together and runs `reconcile`. The engine stays infra-agnostic — all I/O is behind the SPI.
24
+
25
+ ## Conventions & gotchas
26
+
27
+ - The engine never imports `providers` — it takes a `Providers` map as input, so it can run against fakes.
28
+ - `diff` must be **pure** (read does the I/O); apply is the only mutating step. `EngineEvent` is part of the public contract for embedders. See [ARCHITECTURE.md](../../ARCHITECTURE.md).
@@ -0,0 +1,4 @@
1
+ import type { DesiredStateGraph } from "@intentic/graph";
2
+ import type { ApplyOutcome, EngineConfig } from "./types.js";
3
+ export declare const apply: (graph: DesiredStateGraph, config: EngineConfig) => Promise<ApplyOutcome>;
4
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AASzD,OAAO,KAAK,EAAU,YAAY,EAAE,YAAY,EAAQ,MAAM,YAAY,CAAC;AAK3E,eAAO,MAAM,KAAK,GAAU,OAAO,iBAAiB,EAAE,QAAQ,YAAY,KAAG,OAAO,CAAC,YAAY,CAkEhG,CAAC"}
package/dist/apply.js ADDED
@@ -0,0 +1,68 @@
1
+ import { linearize, refKey } from "@intentic/graph";
2
+ import { collectOrphans } from "./orphans.js";
3
+ import { validateOutputs } from "./outputs-check.js";
4
+ import { httpProbe, waitReady } from "./readiness.js";
5
+ import { makeContext, requireProvider } from "./reconcile.js";
6
+ import { resolveInputs } from "./resolve-inputs.js";
7
+ import { createStore } from "./store.js";
8
+ export const apply = async (graph, config) => {
9
+ const env = config.env ?? process.env;
10
+ const log = config.log ?? console.log;
11
+ const emit = config.onEvent ?? (() => { });
12
+ const probe = config.probe ?? httpProbe;
13
+ const store = createStore();
14
+ const steps = [];
15
+ const outputs = {};
16
+ for (const id of linearize(graph)) {
17
+ const node = graph.resources[id];
18
+ if (node === undefined) {
19
+ continue;
20
+ }
21
+ const type = node.type;
22
+ emit({ kind: "node", phase: "apply", state: "start", id, type });
23
+ const provider = requireProvider(config.providers, type, id);
24
+ const ctx = makeContext(id, store, env, log);
25
+ const inputs = resolveInputs(node.inputs, store, env, { lenient: false });
26
+ const observed = await provider.read(inputs, ctx);
27
+ let action;
28
+ let reason;
29
+ let produced;
30
+ if (observed === undefined) {
31
+ action = "create";
32
+ produced = await provider.apply(inputs, undefined, ctx);
33
+ }
34
+ else {
35
+ const result = provider.diff(inputs, observed);
36
+ if (result.action === "update") {
37
+ action = "update";
38
+ reason = result.reason;
39
+ produced = await provider.apply(inputs, observed, ctx);
40
+ }
41
+ else {
42
+ action = "noop";
43
+ produced = { ...observed.outputs };
44
+ }
45
+ }
46
+ validateOutputs(type, produced, id);
47
+ store.set(id, id);
48
+ for (const [name, value] of Object.entries(produced)) {
49
+ store.set(refKey(id, name), value);
50
+ }
51
+ outputs[id] = produced;
52
+ steps.push(reason !== undefined ? { id, type, action, reason } : { id, type, action });
53
+ emit({ kind: "node", phase: "apply", state: "done", id, type, action, ...(reason !== undefined ? { reason } : {}) });
54
+ if (action !== "noop" && node.readyWhen !== undefined) {
55
+ const url = typeof node.readyWhen.url === "string" ? node.readyWhen.url : store.get(node.readyWhen.url.$ref, { lenient: false });
56
+ const options = {
57
+ ...(node.readyWhen.status !== undefined ? { status: node.readyWhen.status } : {}),
58
+ ...(node.readyWhen.timeout !== undefined ? { timeout: node.readyWhen.timeout } : {}),
59
+ };
60
+ emit({ kind: "readiness", state: "waiting", id, url });
61
+ await waitReady(url, options, probe);
62
+ emit({ kind: "readiness", state: "ready", id, url });
63
+ }
64
+ }
65
+ const orphans = await collectOrphans(graph, config.providers, makeContext("", store, env, log), emit);
66
+ return { steps, outputs, orphans };
67
+ };
68
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export { apply } from "./apply.js";
2
+ export { plan } from "./plan.js";
3
+ export type { DiffResult, Observed, Provider, ProviderContext, Providers } from "./provider.js";
4
+ export type { FakeWorld } from "./providers/fake.js";
5
+ export { createFakeProviders } from "./providers/fake.js";
6
+ export { prune } from "./prune.js";
7
+ export type { ReadinessProbe } from "./readiness.js";
8
+ export { httpProbe, parseDuration, waitReady } from "./readiness.js";
9
+ export type { ConvergeResult } from "./reconcile-loop.js";
10
+ export { reconcile } from "./reconcile-loop.js";
11
+ export { resolveInputs } from "./resolve-inputs.js";
12
+ export type { OutputStore } from "./store.js";
13
+ export { createStore } from "./store.js";
14
+ export type { Action, ApplyOutcome, EngineConfig, EngineEvent, Orphan, PlanOutcome, PrunedResource, PruneOutcome, ResolvedInputs, Step, } from "./types.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChG,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACrE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EACR,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,MAAM,EACN,WAAW,EACX,cAAc,EACd,YAAY,EACZ,cAAc,EACd,IAAI,GACP,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { apply } from "./apply.js";
2
+ export { plan } from "./plan.js";
3
+ export { createFakeProviders } from "./providers/fake.js";
4
+ export { prune } from "./prune.js";
5
+ export { httpProbe, parseDuration, waitReady } from "./readiness.js";
6
+ export { reconcile } from "./reconcile-loop.js";
7
+ export { resolveInputs } from "./resolve-inputs.js";
8
+ export { createStore } from "./store.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DesiredStateGraph } from "@intentic/graph";
2
+ import type { ProviderContext, Providers } from "./provider.js";
3
+ import type { EngineEvent, Orphan } from "./types.js";
4
+ export declare const collectOrphans: (graph: DesiredStateGraph, providers: Providers, ctx: ProviderContext, emit: (event: EngineEvent) => void) => Promise<Orphan[]>;
5
+ //# sourceMappingURL=orphans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphans.d.ts","sourceRoot":"","sources":["../src/orphans.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAItD,eAAO,MAAM,cAAc,GACvB,OAAO,iBAAiB,EACxB,WAAW,SAAS,EACpB,KAAK,eAAe,EACpB,MAAM,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,KACnC,OAAO,CAAC,MAAM,EAAE,CAelB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export const collectOrphans = async (graph, providers, ctx, emit) => {
2
+ const known = new Set(Object.keys(graph.resources));
3
+ const orphans = [];
4
+ for (const [type, provider] of Object.entries(providers)) {
5
+ if (provider?.list === undefined) {
6
+ continue;
7
+ }
8
+ for (const id of await provider.list(ctx)) {
9
+ if (!known.has(id)) {
10
+ emit({ kind: "orphan", id, type: type });
11
+ orphans.push({ id, type: type });
12
+ }
13
+ }
14
+ }
15
+ return orphans;
16
+ };
17
+ //# sourceMappingURL=orphans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphans.js","sourceRoot":"","sources":["../src/orphans.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAC/B,KAAwB,EACxB,SAAoB,EACpB,GAAoB,EACpB,IAAkC,EACjB,EAAE;IACnB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,IAAI,QAAQ,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,SAAS;QACb,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAoB,EAAE,CAAC,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAoB,EAAE,CAAC,CAAC;YACrD,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ResourceType } from "@intentic/resources";
2
+ export declare const validateOutputs: (type: ResourceType, produced: Readonly<Record<string, unknown>>, id: string) => void;
3
+ //# sourceMappingURL=outputs-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outputs-check.d.ts","sourceRoot":"","sources":["../src/outputs-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOxD,eAAO,MAAM,eAAe,GAAI,MAAM,YAAY,EAAE,UAAU,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAG,IAQ7G,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { OUTPUTS } from "@intentic/resources";
2
+ export const validateOutputs = (type, produced, id) => {
3
+ const allowed = OUTPUTS[type];
4
+ for (const name of Object.keys(produced)) {
5
+ const ok = allowed.some((pattern) => (pattern.endsWith(":") ? name.startsWith(pattern) : name === pattern));
6
+ if (!ok) {
7
+ throw new Error(`provider for "${id}" (type "${type}") produced unknown output "${name}"; allowed: [${allowed.join(", ")}]`);
8
+ }
9
+ }
10
+ };
11
+ //# sourceMappingURL=outputs-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outputs-check.js","sourceRoot":"","sources":["../src/outputs-check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAM9C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAkB,EAAE,QAA2C,EAAE,EAAU,EAAQ,EAAE;IACjH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC;QAC5G,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,iBAAiB,EAAE,YAAY,IAAI,+BAA+B,IAAI,gBAAgB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjI,CAAC;IACL,CAAC;AACL,CAAC,CAAC"}
package/dist/plan.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { DesiredStateGraph } from "@intentic/graph";
2
+ import type { EngineConfig, PlanOutcome } from "./types.js";
3
+ export declare const plan: (graph: DesiredStateGraph, config: EngineConfig) => Promise<PlanOutcome>;
4
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAQzD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAQ,MAAM,YAAY,CAAC;AAMlE,eAAO,MAAM,IAAI,GAAU,OAAO,iBAAiB,EAAE,QAAQ,YAAY,KAAG,OAAO,CAAC,WAAW,CA6D9F,CAAC"}
package/dist/plan.js ADDED
@@ -0,0 +1,60 @@
1
+ import { linearize, refKey } from "@intentic/graph";
2
+ import { OUTPUTS } from "@intentic/resources";
3
+ import { collectOrphans } from "./orphans.js";
4
+ import { makeContext, requireProvider } from "./reconcile.js";
5
+ import { resolveInputs } from "./resolve-inputs.js";
6
+ import { createStore, PENDING } from "./store.js";
7
+ export const plan = async (graph, config) => {
8
+ const env = config.env ?? process.env;
9
+ const log = config.log ?? console.log;
10
+ const emit = config.onEvent ?? (() => { });
11
+ const store = createStore();
12
+ const steps = [];
13
+ for (const id of linearize(graph)) {
14
+ const node = graph.resources[id];
15
+ if (node === undefined) {
16
+ continue;
17
+ }
18
+ const type = node.type;
19
+ const provider = requireProvider(config.providers, type, id);
20
+ const ctx = makeContext(id, store, env, log);
21
+ const inputs = resolveInputs(node.inputs, store, env, { lenient: true });
22
+ const observed = await provider.read(inputs, ctx);
23
+ store.set(id, id);
24
+ if (observed === undefined) {
25
+ steps.push({ id, type, action: "create" });
26
+ emit({ kind: "node", phase: "plan", state: "done", id, type, action: "create" });
27
+ for (const name of OUTPUTS[type]) {
28
+ if (name.endsWith(":")) {
29
+ const prefix = `${id}.${name}`;
30
+ for (const node of Object.values(graph.resources)) {
31
+ JSON.stringify(node.inputs, (_k, v) => {
32
+ if (typeof v === "object" && v !== null && "$ref" in v && typeof v.$ref === "string" && v.$ref.startsWith(prefix)) {
33
+ store.set(v.$ref, PENDING);
34
+ }
35
+ return v;
36
+ });
37
+ }
38
+ }
39
+ else {
40
+ store.set(refKey(id, name), PENDING);
41
+ }
42
+ }
43
+ continue;
44
+ }
45
+ const result = provider.diff(inputs, observed);
46
+ steps.push(result.action === "update" ? { id, type, action: "update", reason: result.reason } : { id, type, action: "noop" });
47
+ emit(result.action === "update"
48
+ ? { kind: "node", phase: "plan", state: "done", id, type, action: "update", reason: result.reason }
49
+ : { kind: "node", phase: "plan", state: "done", id, type, action: "noop" });
50
+ for (const [name, value] of Object.entries(observed.outputs)) {
51
+ const allowed = OUTPUTS[type].some((pattern) => (pattern.endsWith(":") ? name.startsWith(pattern) : name === pattern));
52
+ if (allowed) {
53
+ store.set(refKey(id, name), value);
54
+ }
55
+ }
56
+ }
57
+ const orphans = await collectOrphans(graph, config.providers, makeContext("", store, env, log), emit);
58
+ return { steps, orphans };
59
+ };
60
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ResourceType } from "@intentic/resources";
2
+ import type { ResolvedInputs } from "./types.js";
3
+ export interface Observed {
4
+ readonly outputs: Readonly<Record<string, unknown>>;
5
+ readonly detail?: Readonly<Record<string, unknown>>;
6
+ }
7
+ export type DiffResult = {
8
+ readonly action: "noop";
9
+ } | {
10
+ readonly action: "update";
11
+ readonly reason: string;
12
+ };
13
+ export interface ProviderContext {
14
+ readonly env: Readonly<Record<string, string | undefined>>;
15
+ readonly log: (message: string) => void;
16
+ readonly id: string;
17
+ readonly output: (id: string, name: string) => unknown;
18
+ }
19
+ export interface Provider {
20
+ readonly read: (inputs: ResolvedInputs, ctx: ProviderContext) => Promise<Observed | undefined>;
21
+ readonly diff: (inputs: ResolvedInputs, observed: Observed) => DiffResult;
22
+ readonly apply: (inputs: ResolvedInputs, observed: Observed | undefined, ctx: ProviderContext) => Promise<Record<string, unknown>>;
23
+ readonly list?: (ctx: ProviderContext) => Promise<readonly string[]>;
24
+ readonly delete?: (inputs: ResolvedInputs, ctx: ProviderContext) => Promise<void>;
25
+ }
26
+ export type Providers = Partial<Record<ResourceType, Provider>>;
27
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAIpD,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAGD,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9G,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAIpB,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC1D;AAID,MAAM,WAAW,QAAQ;IAKrB,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAE/F,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,KAAK,UAAU,CAAC;IAE1E,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAIrE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAGD,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { ResourceType } from "@intentic/resources";
2
+ import type { Providers } from "../provider.js";
3
+ import type { ResolvedInputs } from "../types.js";
4
+ interface WorldEntry {
5
+ readonly type: ResourceType;
6
+ readonly inputs: ResolvedInputs;
7
+ }
8
+ export type FakeWorld = Map<string, WorldEntry>;
9
+ export declare const createFakeProviders: (world?: FakeWorld) => {
10
+ readonly providers: Providers;
11
+ readonly world: FakeWorld;
12
+ };
13
+ export {};
14
+ //# sourceMappingURL=fake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake.d.ts","sourceRoot":"","sources":["../../src/providers/fake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAsB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,UAAU,UAAU;IAChB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACnC;AAID,MAAM,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AA+BhD,eAAO,MAAM,mBAAmB,GAAI,QAAO,SAAqB,KAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAM5H,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { OUTPUTS } from "@intentic/resources";
2
+ const RESOURCE_TYPES = Object.keys(OUTPUTS);
3
+ const fakeOutputs = (id, type) => {
4
+ const outputs = {};
5
+ for (const name of OUTPUTS[type]) {
6
+ outputs[name] = name.toLowerCase().includes("url") ? `https://${id}.fake.test/${name}` : `${id}::${name}`;
7
+ }
8
+ return outputs;
9
+ };
10
+ const fakeProvider = (type, world) => ({
11
+ read: async (_inputs, ctx) => {
12
+ if (!world.has(ctx.id)) {
13
+ return undefined;
14
+ }
15
+ return { outputs: fakeOutputs(ctx.id, type) };
16
+ },
17
+ diff: () => ({ action: "noop" }),
18
+ apply: async (inputs, _observed, ctx) => {
19
+ world.set(ctx.id, { type, inputs });
20
+ return fakeOutputs(ctx.id, type);
21
+ },
22
+ list: async () => [...world].filter(([, entry]) => entry.type === type).map(([id]) => id),
23
+ });
24
+ export const createFakeProviders = (world = new Map()) => {
25
+ const providers = {};
26
+ for (const type of RESOURCE_TYPES) {
27
+ providers[type] = fakeProvider(type, world);
28
+ }
29
+ return { providers, world };
30
+ };
31
+ //# sourceMappingURL=fake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake.js","sourceRoot":"","sources":["../../src/providers/fake.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAe9C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAmB,CAAC;AAI9D,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,IAAkB,EAA2B,EAAE;IAC5E,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC;IAC9G,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAkB,EAAE,KAAgB,EAAY,EAAE,CAAC,CAAC;IACtE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAqB,CAAC;IACrE,CAAC;IACD,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE;QACpC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,OAAO,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CAC5F,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAmB,IAAI,GAAG,EAAE,EAAgE,EAAE;IAC9H,MAAM,SAAS,GAAc,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAChC,SAAS,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAChC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { DesiredStateGraph } from "@intentic/graph";
2
+ import type { EngineConfig, PruneOutcome } from "./types.js";
3
+ export declare const prune: (previous: DesiredStateGraph, current: DesiredStateGraph, config: EngineConfig) => Promise<PruneOutcome>;
4
+ //# sourceMappingURL=prune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../src/prune.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAOzD,OAAO,KAAK,EAAE,YAAY,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAuC7E,eAAO,MAAM,KAAK,GAAU,UAAU,iBAAiB,EAAE,SAAS,iBAAiB,EAAE,QAAQ,YAAY,KAAG,OAAO,CAAC,YAAY,CAqC/H,CAAC"}
package/dist/prune.js ADDED
@@ -0,0 +1,69 @@
1
+ import { linearize, refKey } from "@intentic/graph";
2
+ import { OUTPUTS } from "@intentic/resources";
3
+ import { makeContext, requireProvider } from "./reconcile.js";
4
+ import { resolveInputs } from "./resolve-inputs.js";
5
+ import { createStore, PENDING } from "./store.js";
6
+ const seedCurrentOutputs = async (graph, config, store) => {
7
+ const env = config.env ?? process.env;
8
+ const log = config.log ?? console.log;
9
+ for (const id of linearize(graph)) {
10
+ const node = graph.resources[id];
11
+ if (node === undefined) {
12
+ continue;
13
+ }
14
+ const type = node.type;
15
+ const provider = requireProvider(config.providers, type, id);
16
+ const ctx = makeContext(id, store, env, log);
17
+ const inputs = resolveInputs(node.inputs, store, env, { lenient: true });
18
+ const observed = await provider.read(inputs, ctx);
19
+ store.set(id, id);
20
+ if (observed === undefined) {
21
+ for (const name of OUTPUTS[type]) {
22
+ store.set(refKey(id, name), PENDING);
23
+ }
24
+ continue;
25
+ }
26
+ for (const [name, value] of Object.entries(observed.outputs)) {
27
+ if (OUTPUTS[type].includes(name)) {
28
+ store.set(refKey(id, name), value);
29
+ }
30
+ }
31
+ }
32
+ };
33
+ export const prune = async (previous, current, config) => {
34
+ const env = config.env ?? process.env;
35
+ const log = config.log ?? console.log;
36
+ const emit = config.onEvent ?? (() => { });
37
+ const kept = new Set(Object.keys(current.resources));
38
+ const removed = new Set(Object.keys(previous.resources).filter((id) => !kept.has(id)));
39
+ if (removed.size === 0) {
40
+ return { deleted: [], skipped: [] };
41
+ }
42
+ const store = createStore();
43
+ await seedCurrentOutputs(current, config, store);
44
+ const deleted = [];
45
+ const skipped = [];
46
+ for (const id of [...linearize(previous)].reverse()) {
47
+ if (!removed.has(id)) {
48
+ continue;
49
+ }
50
+ const node = previous.resources[id];
51
+ if (node === undefined) {
52
+ continue;
53
+ }
54
+ const type = node.type;
55
+ const provider = requireProvider(config.providers, type, id);
56
+ if (provider.delete === undefined) {
57
+ emit({ kind: "prune", state: "skipped", id, type });
58
+ skipped.push({ id, type });
59
+ continue;
60
+ }
61
+ const ctx = makeContext(id, store, env, log);
62
+ const inputs = resolveInputs(node.inputs, store, env, { lenient: true });
63
+ await provider.delete(inputs, ctx);
64
+ emit({ kind: "prune", state: "deleted", id, type });
65
+ deleted.push({ id, type });
66
+ }
67
+ return { deleted, skipped };
68
+ };
69
+ //# sourceMappingURL=prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../src/prune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type ReadinessProbe = (url: string, expectedStatus: number) => Promise<boolean>;
2
+ export declare const parseDuration: (text: string) => number;
3
+ export declare const httpProbe: ReadinessProbe;
4
+ export declare const waitReady: (url: string, options: {
5
+ readonly status?: number;
6
+ readonly timeout?: string;
7
+ }, probe: ReadinessProbe, intervalMs?: number) => Promise<void>;
8
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAGvF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAM5C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,cASvB,CAAC;AAMF,eAAO,MAAM,SAAS,GAClB,KAAK,MAAM,EACX,SAAS;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAChE,OAAO,cAAc,EACrB,mBAAiB,KAClB,OAAO,CAAC,IAAI,CAad,CAAC"}
@@ -0,0 +1,32 @@
1
+ export const parseDuration = (text) => {
2
+ const match = /^(\d+)s$/.exec(text);
3
+ if (match === null) {
4
+ throw new Error(`unsupported duration "${text}" (expected "<seconds>s")`);
5
+ }
6
+ return Number(match[1]) * 1000;
7
+ };
8
+ export const httpProbe = async (url, expectedStatus) => {
9
+ try {
10
+ const response = await fetch(url, { method: "GET" });
11
+ return response.status === expectedStatus || response.status < 400;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ };
17
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
18
+ export const waitReady = async (url, options, probe, intervalMs = 1000) => {
19
+ const expected = options.status ?? 200;
20
+ const limit = options.timeout !== undefined ? parseDuration(options.timeout) : 60000;
21
+ const deadline = Date.now() + limit;
22
+ for (;;) {
23
+ if (await probe(url, expected)) {
24
+ return;
25
+ }
26
+ if (Date.now() >= deadline) {
27
+ throw new Error(`readiness check timed out after ${limit}ms for ${url}`);
28
+ }
29
+ await sleep(intervalMs);
30
+ }
31
+ };
32
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE;IAClD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,2BAA2B,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAmB,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE;IAGnE,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,OAAO,QAAQ,CAAC,MAAM,KAAK,cAAc,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAI/F,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC1B,GAAW,EACX,OAAgE,EAChE,KAAqB,EACrB,UAAU,GAAG,IAAI,EACJ,EAAE;IACf,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IACpC,SAAS,CAAC;QACN,IAAI,MAAM,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,UAAU,GAAG,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { DesiredStateGraph } from "@intentic/graph";
2
+ import type { ApplyOutcome, EngineConfig } from "./types.js";
3
+ export interface ConvergeResult {
4
+ readonly converged: boolean;
5
+ readonly iterations: number;
6
+ readonly outcome: ApplyOutcome;
7
+ }
8
+ export declare const reconcile: (graph: DesiredStateGraph, config: EngineConfig, options: {
9
+ maxIterations: number;
10
+ }) => Promise<ConvergeResult>;
11
+ //# sourceMappingURL=reconcile-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile-loop.d.ts","sourceRoot":"","sources":["../src/reconcile-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;CAClC;AASD,eAAO,MAAM,SAAS,GAAU,OAAO,iBAAiB,EAAE,QAAQ,YAAY,EAAE,SAAS;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,cAAc,CAe1I,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { apply } from "./apply.js";
2
+ import { plan } from "./plan.js";
3
+ export const reconcile = async (graph, config, options) => {
4
+ if (options.maxIterations < 1) {
5
+ throw new Error("reconcile requires maxIterations >= 1");
6
+ }
7
+ const emit = config.onEvent ?? (() => { });
8
+ for (let iteration = 1; iteration <= options.maxIterations; iteration++) {
9
+ const outcome = await apply(graph, config);
10
+ const check = await plan(graph, config);
11
+ const converged = check.steps.every((step) => step.action === "noop");
12
+ emit({ kind: "iteration", n: iteration, converged });
13
+ if (converged) {
14
+ return { converged: true, iterations: iteration, outcome };
15
+ }
16
+ }
17
+ throw new Error(`reconcile did not converge within ${options.maxIterations} iterations`);
18
+ };
19
+ //# sourceMappingURL=reconcile-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile-loop.js","sourceRoot":"","sources":["../src/reconcile-loop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAgBjC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,KAAwB,EAAE,MAAoB,EAAE,OAAkC,EAA2B,EAAE;IAC3I,IAAI,OAAO,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC1C,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,IAAI,OAAO,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC;QACtE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACtE,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACrD,IAAI,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAC/D,CAAC;IACL,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,CAAC,aAAa,aAAa,CAAC,CAAC;AAC7F,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ResourceType } from "@intentic/resources";
2
+ import type { Provider, ProviderContext, Providers } from "./provider.js";
3
+ import type { OutputStore } from "./store.js";
4
+ export declare const requireProvider: (providers: Providers, type: ResourceType, id: string) => Provider;
5
+ export declare const makeContext: (id: string, store: OutputStore, env: Readonly<Record<string, string | undefined>>, log: (message: string) => void) => ProviderContext;
6
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,eAAO,MAAM,eAAe,GAAI,WAAW,SAAS,EAAE,MAAM,YAAY,EAAE,IAAI,MAAM,KAAG,QAMtF,CAAC;AAEF,eAAO,MAAM,WAAW,GACpB,IAAI,MAAM,EACV,OAAO,WAAW,EAClB,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACjD,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,KAC/B,eAKD,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { refKey } from "@intentic/graph";
2
+ export const requireProvider = (providers, type, id) => {
3
+ const provider = providers[type];
4
+ if (provider === undefined) {
5
+ throw new Error(`no provider registered for type "${type}" (resource "${id}")`);
6
+ }
7
+ return provider;
8
+ };
9
+ export const makeContext = (id, store, env, log) => ({
10
+ env,
11
+ log,
12
+ id,
13
+ output: (depId, name) => store.get(refKey(depId, name), { lenient: false }),
14
+ });
15
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAKzC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,SAAoB,EAAE,IAAkB,EAAE,EAAU,EAAY,EAAE;IAC9F,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CACvB,EAAU,EACV,KAAkB,EAClB,GAAiD,EACjD,GAA8B,EACf,EAAE,CAAC,CAAC;IACnB,GAAG;IACH,GAAG;IACH,EAAE;IACF,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;CAC9E,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SerializedValue } from "@intentic/graph";
2
+ import type { OutputStore } from "./store.js";
3
+ export declare const resolveInputs: (inputs: Readonly<Record<string, SerializedValue>>, store: OutputStore, env: Readonly<Record<string, string | undefined>>, options: {
4
+ readonly lenient: boolean;
5
+ }) => Record<string, unknown>;
6
+ //# sourceMappingURL=resolve-inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-inputs.d.ts","sourceRoot":"","sources":["../src/resolve-inputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C,eAAO,MAAM,aAAa,GACtB,QAAQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,EACjD,OAAO,WAAW,EAClB,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACjD,SAAS;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,KACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CA+BxB,CAAC"}
@@ -0,0 +1,33 @@
1
+ const isSecretNode = (value) => "$secret" in value;
2
+ const isRefNode = (value) => "$ref" in value;
3
+ export const resolveInputs = (inputs, store, env, options) => {
4
+ const walk = (value) => {
5
+ if (Array.isArray(value)) {
6
+ return value.map(walk);
7
+ }
8
+ if (typeof value === "object" && value !== null) {
9
+ if (isSecretNode(value)) {
10
+ const secret = env[value.$secret.key];
11
+ if (secret === undefined) {
12
+ throw new Error(`missing secret env var "${value.$secret.key}"`);
13
+ }
14
+ return secret;
15
+ }
16
+ if (isRefNode(value)) {
17
+ return store.get(value.$ref, { lenient: options.lenient });
18
+ }
19
+ const result = {};
20
+ for (const [key, entry] of Object.entries(value)) {
21
+ result[key] = walk(entry);
22
+ }
23
+ return result;
24
+ }
25
+ return value;
26
+ };
27
+ const resolved = {};
28
+ for (const [key, value] of Object.entries(inputs)) {
29
+ resolved[key] = walk(value);
30
+ }
31
+ return resolved;
32
+ };
33
+ //# sourceMappingURL=resolve-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-inputs.js","sourceRoot":"","sources":["../src/resolve-inputs.ts"],"names":[],"mappings":"AAKA,MAAM,YAAY,GAAG,CAAC,KAAa,EAA0F,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC;AACnJ,MAAM,SAAS,GAAG,CAAC,KAAa,EAAsC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC;AAEzF,MAAM,CAAC,MAAM,aAAa,GAAG,CACzB,MAAiD,EACjD,KAAkB,EAClB,GAAiD,EACjD,OAAsC,EACf,EAAE;IACzB,MAAM,IAAI,GAAG,CAAC,KAAsB,EAAW,EAAE;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9C,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACtC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;gBACrE,CAAC;gBACD,OAAO,MAAM,CAAC;YAClB,CAAC;YACD,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAEnB,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const PENDING: unique symbol;
2
+ export interface OutputStore {
3
+ readonly set: (key: string, value: unknown) => void;
4
+ readonly has: (key: string) => boolean;
5
+ readonly get: (key: string, options: {
6
+ readonly lenient: boolean;
7
+ }) => unknown;
8
+ }
9
+ export declare const createStore: () => OutputStore;
10
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,eAA2B,CAAC;AAKhD,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC;CAClF;AAED,eAAO,MAAM,WAAW,QAAO,WAiB9B,CAAC"}
package/dist/store.js ADDED
@@ -0,0 +1,20 @@
1
+ export const PENDING = Symbol("pending-output");
2
+ export const createStore = () => {
3
+ const values = new Map();
4
+ return {
5
+ set: (key, value) => {
6
+ values.set(key, value);
7
+ },
8
+ has: (key) => values.has(key),
9
+ get: (key, options) => {
10
+ if (!values.has(key)) {
11
+ if (options.lenient) {
12
+ return PENDING;
13
+ }
14
+ throw new Error(`cannot resolve {$ref:"${key}"}: not produced this run`);
15
+ }
16
+ return values.get(key);
17
+ },
18
+ };
19
+ };
20
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAWhD,MAAM,CAAC,MAAM,WAAW,GAAG,GAAgB,EAAE;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC1C,OAAO;QACH,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAChB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7B,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBAClB,OAAO,OAAO,CAAC;gBACnB,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,2BAA2B,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;KACJ,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,67 @@
1
+ import type { ResourceType } from "@intentic/resources";
2
+ import type { Providers } from "./provider.js";
3
+ import type { ReadinessProbe } from "./readiness.js";
4
+ export type ResolvedInputs = Readonly<Record<string, unknown>>;
5
+ export type Action = "create" | "update" | "noop";
6
+ export interface Step {
7
+ readonly id: string;
8
+ readonly type: ResourceType;
9
+ readonly action: Action;
10
+ readonly reason?: string;
11
+ }
12
+ export interface Orphan {
13
+ readonly id: string;
14
+ readonly type: ResourceType;
15
+ }
16
+ export interface PlanOutcome {
17
+ readonly steps: readonly Step[];
18
+ readonly orphans: readonly Orphan[];
19
+ }
20
+ export interface ApplyOutcome {
21
+ readonly steps: readonly Step[];
22
+ readonly outputs: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
23
+ readonly orphans: readonly Orphan[];
24
+ }
25
+ export interface PrunedResource {
26
+ readonly id: string;
27
+ readonly type: ResourceType;
28
+ }
29
+ export interface PruneOutcome {
30
+ readonly deleted: readonly PrunedResource[];
31
+ readonly skipped: readonly PrunedResource[];
32
+ }
33
+ export type EngineEvent = {
34
+ readonly kind: "node";
35
+ readonly phase: "apply" | "plan";
36
+ readonly state: "start" | "done";
37
+ readonly id: string;
38
+ readonly type: ResourceType;
39
+ readonly action?: Action;
40
+ readonly reason?: string;
41
+ } | {
42
+ readonly kind: "readiness";
43
+ readonly state: "waiting" | "ready";
44
+ readonly id: string;
45
+ readonly url: string;
46
+ } | {
47
+ readonly kind: "iteration";
48
+ readonly n: number;
49
+ readonly converged: boolean;
50
+ } | {
51
+ readonly kind: "prune";
52
+ readonly state: "deleted" | "skipped";
53
+ readonly id: string;
54
+ readonly type: ResourceType;
55
+ } | {
56
+ readonly kind: "orphan";
57
+ readonly id: string;
58
+ readonly type: ResourceType;
59
+ };
60
+ export interface EngineConfig {
61
+ readonly providers: Providers;
62
+ readonly env?: Readonly<Record<string, string | undefined>>;
63
+ readonly probe?: ReadinessProbe;
64
+ readonly log?: (message: string) => void;
65
+ readonly onEvent?: (event: EngineEvent) => void;
66
+ }
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@intentic/engine",
3
+ "version": "1.18.0",
4
+ "description": "",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/radarsu/intentic.git",
10
+ "directory": "_libs/engine"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "public",
17
+ "registry": "https://registry.npmjs.org/"
18
+ },
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": {
23
+ "@intentic/src": "./src/index.ts",
24
+ "default": "./dist/index.js"
25
+ },
26
+ "require": {
27
+ "@intentic/src": "./src/index.ts",
28
+ "default": "./dist/index.js"
29
+ }
30
+ }
31
+ },
32
+ "dependencies": {
33
+ "tslib": "2.8.1",
34
+ "@intentic/graph": "1.18.0",
35
+ "@intentic/resources": "1.18.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "24.13.2",
39
+ "typescript": "5.9.3",
40
+ "vitest": "4.1.9",
41
+ "@intentic/sdk": "1.18.0",
42
+ "@intentic/tsconfig": "0.0.0"
43
+ },
44
+ "scripts": {
45
+ "build": "tsc",
46
+ "watch": "tsc --build --watch",
47
+ "test": "vitest run",
48
+ "test:watch": "vitest"
49
+ }
50
+ }