@telorun/kernel 0.14.0 → 0.15.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/base-definition.d.ts +14 -0
- package/dist/base-definition.d.ts.map +1 -0
- package/dist/base-definition.js +17 -0
- package/dist/base-definition.js.map +1 -0
- package/dist/capabilities/capabilities/component.yaml +4 -0
- package/dist/capabilities/capabilities/executable.yaml +8 -0
- package/dist/capabilities/capabilities/handler.yaml +4 -0
- package/dist/capabilities/capabilities/listener.yaml +4 -0
- package/dist/capabilities/capabilities/provider.yaml +4 -0
- package/dist/capabilities/capabilities/template.yaml +4 -0
- package/dist/capabilities/capabilities/type.yaml +4 -0
- package/dist/capabilities/component.d.ts +3 -0
- package/dist/capabilities/component.d.ts.map +1 -0
- package/dist/capabilities/component.js +4 -0
- package/dist/capabilities/component.js.map +1 -0
- package/dist/capabilities/component.yaml +3 -0
- package/dist/capabilities/executable.d.ts +3 -0
- package/dist/capabilities/executable.d.ts.map +1 -0
- package/dist/capabilities/executable.js +5 -0
- package/dist/capabilities/executable.js.map +1 -0
- package/dist/capabilities/executable.yaml +7 -0
- package/dist/capabilities/handler.d.ts +3 -0
- package/dist/capabilities/handler.d.ts.map +1 -0
- package/dist/capabilities/handler.js +4 -0
- package/dist/capabilities/handler.js.map +1 -0
- package/dist/capabilities/handler.yaml +3 -0
- package/dist/capabilities/invokable.d.ts +3 -0
- package/dist/capabilities/invokable.d.ts.map +1 -0
- package/dist/capabilities/invokable.js +5 -0
- package/dist/capabilities/invokable.js.map +1 -0
- package/dist/capabilities/listener.d.ts +3 -0
- package/dist/capabilities/listener.d.ts.map +1 -0
- package/dist/capabilities/listener.js +5 -0
- package/dist/capabilities/listener.js.map +1 -0
- package/dist/capabilities/listener.yaml +3 -0
- package/dist/capabilities/mount.d.ts +3 -0
- package/dist/capabilities/mount.d.ts.map +1 -0
- package/dist/capabilities/mount.js +5 -0
- package/dist/capabilities/mount.js.map +1 -0
- package/dist/capabilities/provider.d.ts +3 -0
- package/dist/capabilities/provider.d.ts.map +1 -0
- package/dist/capabilities/provider.js +8 -0
- package/dist/capabilities/provider.js.map +1 -0
- package/dist/capabilities/provider.yaml +3 -0
- package/dist/capabilities/runnable.d.ts +3 -0
- package/dist/capabilities/runnable.d.ts.map +1 -0
- package/dist/capabilities/runnable.js +5 -0
- package/dist/capabilities/runnable.js.map +1 -0
- package/dist/capabilities/service.d.ts +3 -0
- package/dist/capabilities/service.d.ts.map +1 -0
- package/dist/capabilities/service.js +5 -0
- package/dist/capabilities/service.js.map +1 -0
- package/dist/capabilities/template.d.ts +3 -0
- package/dist/capabilities/template.d.ts.map +1 -0
- package/dist/capabilities/template.js +5 -0
- package/dist/capabilities/template.js.map +1 -0
- package/dist/capabilities/template.yaml +3 -0
- package/dist/capabilities/type.d.ts +3 -0
- package/dist/capabilities/type.d.ts.map +1 -0
- package/dist/capabilities/type.js +5 -0
- package/dist/capabilities/type.js.map +1 -0
- package/dist/capabilities/type.yaml +3 -0
- package/dist/controllers/capability/capability-controller.d.ts +32 -0
- package/dist/controllers/capability/capability-controller.d.ts.map +1 -0
- package/dist/controllers/capability/capability-controller.js +26 -0
- package/dist/controllers/capability/capability-controller.js.map +1 -0
- package/dist/controllers/module/module.json +48 -0
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +19 -14
- package/dist/kernel.js.map +1 -1
- package/dist/loader.d.ts +18 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +127 -0
- package/dist/loader.js.map +1 -0
- package/dist/manifest-adapters/http-adapter.d.ts +8 -0
- package/dist/manifest-adapters/http-adapter.d.ts.map +1 -0
- package/dist/manifest-adapters/http-adapter.js +31 -0
- package/dist/manifest-adapters/http-adapter.js.map +1 -0
- package/dist/manifest-adapters/local-file-adapter.d.ts +15 -0
- package/dist/manifest-adapters/local-file-adapter.d.ts.map +1 -0
- package/dist/manifest-adapters/local-file-adapter.js +95 -0
- package/dist/manifest-adapters/local-file-adapter.js.map +1 -0
- package/dist/manifest-adapters/manifest-adapter.d.ts +35 -0
- package/dist/manifest-adapters/manifest-adapter.d.ts.map +1 -0
- package/dist/manifest-adapters/manifest-adapter.js +2 -0
- package/dist/manifest-adapters/manifest-adapter.js.map +1 -0
- package/dist/manifest-adapters/registry-adapter.d.ts +9 -0
- package/dist/manifest-adapters/registry-adapter.d.ts.map +1 -0
- package/dist/manifest-adapters/registry-adapter.js +48 -0
- package/dist/manifest-adapters/registry-adapter.js.map +1 -0
- package/dist/module-context-registry.d.ts +48 -0
- package/dist/module-context-registry.d.ts.map +1 -0
- package/dist/module-context-registry.js +91 -0
- package/dist/module-context-registry.js.map +1 -0
- package/dist/module-context.d.ts +3 -3
- package/dist/module-context.d.ts.map +1 -1
- package/dist/module-context.js +35 -2
- package/dist/module-context.js.map +1 -1
- package/dist/schema-valiator.d.ts +15 -0
- package/dist/schema-valiator.d.ts.map +1 -0
- package/dist/schema-valiator.js +127 -0
- package/dist/schema-valiator.js.map +1 -0
- package/dist/snapshot-serializer.d.ts +62 -0
- package/dist/snapshot-serializer.d.ts.map +1 -0
- package/dist/snapshot-serializer.js +164 -0
- package/dist/snapshot-serializer.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +4 -4
- package/src/kernel.ts +24 -16
- package/src/module-context.ts +41 -4
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { EmitEvent, InstanceFactory, ModuleContext } from "@telorun/sdk";
|
|
2
|
+
/**
|
|
3
|
+
* Per-module ModuleContext registry, keyed by module name.
|
|
4
|
+
*
|
|
5
|
+
* Stores persistent (stateful) ModuleContext instances that accumulate
|
|
6
|
+
* variables, secrets, and resources throughout the initialization phase.
|
|
7
|
+
* Each instance is created once and mutated in place — no ephemeral snapshots.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ModuleContextRegistry {
|
|
10
|
+
private readonly createInstance;
|
|
11
|
+
private readonly emitEvent;
|
|
12
|
+
private readonly store;
|
|
13
|
+
private readonly declaredModules;
|
|
14
|
+
constructor(createInstance: InstanceFactory | undefined, emitEvent: EmitEvent);
|
|
15
|
+
/**
|
|
16
|
+
* Mark a module name as declared and ensure its persistent context exists.
|
|
17
|
+
* Called by the kernel whenever a kind: Kernel.Module manifest is registered
|
|
18
|
+
* so that getContext() can distinguish "not yet populated" from "unknown".
|
|
19
|
+
*/
|
|
20
|
+
declareModule(moduleName: string): void;
|
|
21
|
+
private getOrCreate;
|
|
22
|
+
/**
|
|
23
|
+
* Set variables and secrets on the module's persistent context.
|
|
24
|
+
* Called by the kernel after a Kernel.Module resource is created.
|
|
25
|
+
*/
|
|
26
|
+
setVariablesAndSecrets(moduleName: string, variables: Record<string, unknown>, secrets: Record<string, unknown>): void;
|
|
27
|
+
/**
|
|
28
|
+
* Register or update a single resource's exported properties in the
|
|
29
|
+
* module's `resources` namespace.
|
|
30
|
+
*/
|
|
31
|
+
setResource(moduleName: string, resourceName: string, props: Record<string, unknown>): void;
|
|
32
|
+
/**
|
|
33
|
+
* Return the persistent ModuleContext for the given module name.
|
|
34
|
+
*
|
|
35
|
+
* If the module has been declared but not yet populated, returns the empty
|
|
36
|
+
* context so the multi-pass init loop can retry once the import controller
|
|
37
|
+
* has injected variables and secrets.
|
|
38
|
+
*
|
|
39
|
+
* If the module name is completely unknown throws immediately so the error
|
|
40
|
+
* surfaces as an init failure rather than a cryptic CEL runtime message.
|
|
41
|
+
*/
|
|
42
|
+
getContext(moduleName: string): ModuleContext;
|
|
43
|
+
hasModule(moduleName: string): boolean;
|
|
44
|
+
isDeclared(moduleName: string): boolean;
|
|
45
|
+
/** Iterate all registered module contexts (used for kernel-wide queries). */
|
|
46
|
+
allContexts(): IterableIterator<ModuleContext>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=module-context-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-context-registry.d.ts","sourceRoot":"","sources":["../src/module-context-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEzE;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAK9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAL5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAC1D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;gBAGlC,cAAc,EAAE,eAAe,YAAmB,EAClD,SAAS,EAAE,SAAS;IAGvC;;;;OAIG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAWvC,OAAO,CAAC,WAAW;IAUnB;;;OAGG;IACH,sBAAsB,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI;IAMP;;;OAGG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3F;;;;;;;;;OASG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa;IAsB7C,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAItC,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIvC,6EAA6E;IAC7E,WAAW,IAAI,gBAAgB,CAAC,aAAa,CAAC;CAG/C"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { ModuleContext } from "@telorun/sdk";
|
|
2
|
+
/**
|
|
3
|
+
* Per-module ModuleContext registry, keyed by module name.
|
|
4
|
+
*
|
|
5
|
+
* Stores persistent (stateful) ModuleContext instances that accumulate
|
|
6
|
+
* variables, secrets, and resources throughout the initialization phase.
|
|
7
|
+
* Each instance is created once and mutated in place — no ephemeral snapshots.
|
|
8
|
+
*/
|
|
9
|
+
export class ModuleContextRegistry {
|
|
10
|
+
constructor(createInstance = async () => null, emitEvent) {
|
|
11
|
+
this.createInstance = createInstance;
|
|
12
|
+
this.emitEvent = emitEvent;
|
|
13
|
+
this.store = new Map();
|
|
14
|
+
this.declaredModules = new Set();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Mark a module name as declared and ensure its persistent context exists.
|
|
18
|
+
* Called by the kernel whenever a kind: Kernel.Module manifest is registered
|
|
19
|
+
* so that getContext() can distinguish "not yet populated" from "unknown".
|
|
20
|
+
*/
|
|
21
|
+
declareModule(moduleName) {
|
|
22
|
+
// this.declaredModules.add(moduleName);
|
|
23
|
+
// // Idempotent: if the module context was already created (e.g. by a previous pass
|
|
24
|
+
// // of the multi-pass init loop that was retried), keep the existing context.
|
|
25
|
+
// if (this.store.has(moduleName)) return;
|
|
26
|
+
// const ctx = new ModuleContext({}, {}, {}, [], this.createInstance, this.emitEvent);
|
|
27
|
+
// // Every module automatically gets access to Kernel.* built-in kinds.
|
|
28
|
+
// ctx.registerImport("Kernel", "Kernel", []);
|
|
29
|
+
// this.store.set(moduleName, ctx);
|
|
30
|
+
}
|
|
31
|
+
getOrCreate(moduleName) {
|
|
32
|
+
if (!this.store.has(moduleName)) {
|
|
33
|
+
this.store.set(moduleName, new ModuleContext("", {}, {}, {}, [], this.createInstance, this.emitEvent));
|
|
34
|
+
}
|
|
35
|
+
return this.store.get(moduleName);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Set variables and secrets on the module's persistent context.
|
|
39
|
+
* Called by the kernel after a Kernel.Module resource is created.
|
|
40
|
+
*/
|
|
41
|
+
setVariablesAndSecrets(moduleName, variables, secrets) {
|
|
42
|
+
const ctx = this.getOrCreate(moduleName);
|
|
43
|
+
ctx.setVariables(variables);
|
|
44
|
+
ctx.setSecrets(secrets);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Register or update a single resource's exported properties in the
|
|
48
|
+
* module's `resources` namespace.
|
|
49
|
+
*/
|
|
50
|
+
setResource(moduleName, resourceName, props) {
|
|
51
|
+
this.getOrCreate(moduleName).setResource(resourceName, props);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Return the persistent ModuleContext for the given module name.
|
|
55
|
+
*
|
|
56
|
+
* If the module has been declared but not yet populated, returns the empty
|
|
57
|
+
* context so the multi-pass init loop can retry once the import controller
|
|
58
|
+
* has injected variables and secrets.
|
|
59
|
+
*
|
|
60
|
+
* If the module name is completely unknown throws immediately so the error
|
|
61
|
+
* surfaces as an init failure rather than a cryptic CEL runtime message.
|
|
62
|
+
*/
|
|
63
|
+
getContext(moduleName) {
|
|
64
|
+
// throw new Error("asd");
|
|
65
|
+
const ctx = this.store.get(moduleName);
|
|
66
|
+
if (!ctx) {
|
|
67
|
+
if (!this.declaredModules.has(moduleName)) {
|
|
68
|
+
const known = [...this.declaredModules].join(", ") || "(none)";
|
|
69
|
+
throw new Error(`Module '${moduleName}' not found. ` +
|
|
70
|
+
`Check that metadata.module matches a declared module name. ` +
|
|
71
|
+
`Known modules: ${known}.`);
|
|
72
|
+
}
|
|
73
|
+
// Declared but context not yet populated — return the empty context that
|
|
74
|
+
// declareModule() already created.
|
|
75
|
+
return (this.store.get(moduleName) ??
|
|
76
|
+
new ModuleContext("", {}, {}, {}, [], this.createInstance, this.emitEvent));
|
|
77
|
+
}
|
|
78
|
+
return ctx;
|
|
79
|
+
}
|
|
80
|
+
hasModule(moduleName) {
|
|
81
|
+
return this.store.has(moduleName);
|
|
82
|
+
}
|
|
83
|
+
isDeclared(moduleName) {
|
|
84
|
+
return this.declaredModules.has(moduleName);
|
|
85
|
+
}
|
|
86
|
+
/** Iterate all registered module contexts (used for kernel-wide queries). */
|
|
87
|
+
allContexts() {
|
|
88
|
+
return this.store.values();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=module-context-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-context-registry.js","sourceRoot":"","sources":["../src/module-context-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/module-context.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ControllerPolicy, Invocable, ModuleContext as IModuleContext } from "@telorun/sdk";
|
|
1
|
+
import type { BootTarget, ControllerPolicy, Invocable, ModuleContext as IModuleContext } from "@telorun/sdk";
|
|
2
2
|
import type { EmitEvent, InstanceFactory } from "@telorun/sdk";
|
|
3
3
|
import { EvaluationContext } from "./evaluation-context.js";
|
|
4
4
|
/**
|
|
@@ -35,14 +35,14 @@ export declare class ModuleContext extends EvaluationContext implements IModuleC
|
|
|
35
35
|
* loader treats it as `auto`.
|
|
36
36
|
*/
|
|
37
37
|
private _controllerPolicy;
|
|
38
|
-
constructor(source: string, variables: Record<string, unknown> | undefined, secrets: Record<string, unknown> | undefined, resources: Record<string, unknown> | undefined, targets:
|
|
38
|
+
constructor(source: string, variables: Record<string, unknown> | undefined, secrets: Record<string, unknown> | undefined, resources: Record<string, unknown> | undefined, targets: BootTarget[] | undefined, createInstance: InstanceFactory | undefined, emit: EmitEvent, _hostEnv?: Record<string, string | undefined> | undefined);
|
|
39
39
|
get variables(): Record<string, unknown>;
|
|
40
40
|
get secrets(): Record<string, unknown>;
|
|
41
41
|
get resources(): Record<string, unknown>;
|
|
42
42
|
get ports(): Record<string, unknown>;
|
|
43
43
|
setVariables(vars: Record<string, unknown>): void;
|
|
44
44
|
setPorts(ports: Record<string, unknown>): void;
|
|
45
|
-
setTargets(vars:
|
|
45
|
+
setTargets(vars: BootTarget[]): void;
|
|
46
46
|
setSecrets(secrets: Record<string, unknown>): void;
|
|
47
47
|
setResource(name: string, props: Record<string, unknown>): void;
|
|
48
48
|
setControllerPolicy(policy: ControllerPolicy | undefined): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-context.d.ts","sourceRoot":"","sources":["../src/module-context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module-context.d.ts","sourceRoot":"","sources":["../src/module-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,SAAS,EAGT,aAAa,IAAI,cAAc,EAChC,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAqC5D;;;;;;;;;;;GAWG;AACH,qBAAa,aAAc,SAAQ,iBAAkB,YAAW,cAAc;IA6B1E,OAAO,CAAC,OAAO;IAGf,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IA/B5B,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,UAAU,CAA0B;IAC5C;;kDAE8C;IAC9C,OAAO,CAAC,MAAM,CAA+B;IAE7C,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAE3D,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAEhE;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB,CAA+B;gBAGtD,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAK,EACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAK,EACrC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAK,EAC/B,OAAO,EAAE,UAAU,EAAE,YAAK,EAClC,cAAc,EAAE,eAAe,YAAmB,EAClD,IAAI,EAAE,SAAS,EACE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,YAAA;IAShE,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEvC;IAED,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAErC;IAED,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEvC;IAED,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEnC;IAED,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAKjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK9C,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI;IAIpC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAKlD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK/D,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,GAAG,IAAI;IAI/D,mBAAmB,IAAI,gBAAgB,GAAG,SAAS;cAIhC,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3F;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAO1E,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIjC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAUlC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG,EACtD,IAAI,EAAE,MAAM,GACX,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;IAS7B;;;;;;;;OAQG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IA6BjC,OAAO,CAAC,eAAe;IAWR,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAUnF,GAAG,CAAC,IAAI,EAAE,MAAM;IAchB,UAAU;CAsCjB"}
|
package/dist/module-context.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { executeInvokeStep } from "@telorun/sdk";
|
|
1
2
|
import { EvaluationContext } from "./evaluation-context.js";
|
|
2
3
|
/** Wraps process.env so that missing keys return null instead of throwing in CEL.
|
|
3
4
|
* cel-js uses Object.hasOwn(obj, key) before accessing obj[key], so we must
|
|
@@ -198,8 +199,40 @@ export class ModuleContext extends EvaluationContext {
|
|
|
198
199
|
}
|
|
199
200
|
}
|
|
200
201
|
async runTargets() {
|
|
201
|
-
|
|
202
|
-
|
|
202
|
+
const steps = {};
|
|
203
|
+
const stepCtx = {
|
|
204
|
+
expandValue: (value, context) => this.expandWith(value, context),
|
|
205
|
+
invoke: (kind, name, inputs) => this.invoke(kind, name, inputs),
|
|
206
|
+
invokeResolved: (kind, name, instance, inputs) => this.invokeResolved(kind, name, instance, inputs),
|
|
207
|
+
};
|
|
208
|
+
for (let i = 0; i < this.targets.length; i++) {
|
|
209
|
+
const target = this.targets[i];
|
|
210
|
+
if (typeof target === "string") {
|
|
211
|
+
await this.run(target);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if ("invoke" in target && target.invoke !== undefined) {
|
|
215
|
+
const step = {
|
|
216
|
+
name: target.name ?? `Target${i}`,
|
|
217
|
+
when: target.when,
|
|
218
|
+
invoke: target.invoke,
|
|
219
|
+
inputs: target.inputs,
|
|
220
|
+
};
|
|
221
|
+
await executeInvokeStep(step, stepCtx, { steps });
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if ("ref" in target && target.ref != null) {
|
|
225
|
+
const refName = typeof target.ref === "string" ? target.ref : target.ref.name;
|
|
226
|
+
if (target.when === undefined || this.expandWith(target.when, { steps })) {
|
|
227
|
+
await this.run(refName);
|
|
228
|
+
}
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
if ("name" in target && typeof target.name === "string") {
|
|
232
|
+
await this.run(target.name);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
throw new Error(`Unrecognized target shape at index ${i}: ${JSON.stringify(target)}`);
|
|
203
236
|
}
|
|
204
237
|
}
|
|
205
238
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-context.js","sourceRoot":"","sources":["../src/module-context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module-context.js","sourceRoot":"","sources":["../src/module-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DataValidator, TypeRule } from "@telorun/sdk";
|
|
2
|
+
export declare class SchemaValidator {
|
|
3
|
+
private ajv;
|
|
4
|
+
private typeRules;
|
|
5
|
+
private rawSchemas;
|
|
6
|
+
private compiledValidators;
|
|
7
|
+
constructor();
|
|
8
|
+
addSchema(name: string, schema: object): void;
|
|
9
|
+
getSchema(name: string): object | undefined;
|
|
10
|
+
addTypeRules(name: string, rules: TypeRule[]): void;
|
|
11
|
+
getTypeRules(name: string): TypeRule[] | undefined;
|
|
12
|
+
compile(schema: any): DataValidator;
|
|
13
|
+
composeWithRules(base: DataValidator, typeName: string, rules: TypeRule[]): DataValidator;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=schema-valiator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-valiator.d.ts","sourceRoot":"","sources":["../src/schema-valiator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAgB,QAAQ,EAAE,MAAM,cAAc,CAAC;AAOrE,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAA2B;IACtC,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,kBAAkB,CAAwC;;IAwBlE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAO7C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3C,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;IAInD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,SAAS;IAIlD,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa;IAuDnC,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,aAAa;CAmC1F"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { evaluate } from "@marcbachmann/cel-js";
|
|
2
|
+
import { RuntimeError } from "@telorun/sdk";
|
|
3
|
+
import AjvModule from "ajv";
|
|
4
|
+
import addFormats from "ajv-formats";
|
|
5
|
+
import { formatAjvErrors } from "./manifest-schemas.js";
|
|
6
|
+
const Ajv = AjvModule.default ?? AjvModule;
|
|
7
|
+
export class SchemaValidator {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.typeRules = new Map();
|
|
10
|
+
this.rawSchemas = new Map();
|
|
11
|
+
this.compiledValidators = new WeakMap();
|
|
12
|
+
this.ajv = new Ajv({
|
|
13
|
+
strict: false,
|
|
14
|
+
removeAdditional: false,
|
|
15
|
+
useDefaults: true,
|
|
16
|
+
});
|
|
17
|
+
addFormats.default(this.ajv);
|
|
18
|
+
for (const kw of [
|
|
19
|
+
"x-telo-ref",
|
|
20
|
+
"x-telo-eval",
|
|
21
|
+
"x-telo-scope",
|
|
22
|
+
"x-telo-context",
|
|
23
|
+
"x-telo-context-from",
|
|
24
|
+
"x-telo-context-ref-from",
|
|
25
|
+
"x-telo-schema-from",
|
|
26
|
+
"x-telo-topology-role",
|
|
27
|
+
"x-telo-step-context",
|
|
28
|
+
]) {
|
|
29
|
+
this.ajv.addKeyword(kw);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
addSchema(name, schema) {
|
|
33
|
+
if (!this.ajv.getSchema(name)) {
|
|
34
|
+
this.ajv.addSchema(schema, name);
|
|
35
|
+
}
|
|
36
|
+
this.rawSchemas.set(name, schema);
|
|
37
|
+
}
|
|
38
|
+
getSchema(name) {
|
|
39
|
+
return this.rawSchemas.get(name);
|
|
40
|
+
}
|
|
41
|
+
addTypeRules(name, rules) {
|
|
42
|
+
this.typeRules.set(name, rules);
|
|
43
|
+
}
|
|
44
|
+
getTypeRules(name) {
|
|
45
|
+
return this.typeRules.get(name);
|
|
46
|
+
}
|
|
47
|
+
compile(schema) {
|
|
48
|
+
if (schema && typeof schema === "object") {
|
|
49
|
+
const cached = this.compiledValidators.get(schema);
|
|
50
|
+
if (cached)
|
|
51
|
+
return cached;
|
|
52
|
+
}
|
|
53
|
+
const isFullSchema = ("type" in schema && typeof schema.type === "string") ||
|
|
54
|
+
"allOf" in schema ||
|
|
55
|
+
"anyOf" in schema ||
|
|
56
|
+
"oneOf" in schema ||
|
|
57
|
+
"$ref" in schema;
|
|
58
|
+
const normalized = isFullSchema
|
|
59
|
+
? schema
|
|
60
|
+
: {
|
|
61
|
+
type: "object",
|
|
62
|
+
properties: schema,
|
|
63
|
+
required: Object.keys(schema),
|
|
64
|
+
additionalProperties: false,
|
|
65
|
+
};
|
|
66
|
+
const injected = normalized.additionalProperties === false
|
|
67
|
+
? {
|
|
68
|
+
...normalized,
|
|
69
|
+
properties: {
|
|
70
|
+
kind: { type: "string" },
|
|
71
|
+
metadata: { type: "object" },
|
|
72
|
+
...normalized.properties,
|
|
73
|
+
},
|
|
74
|
+
}
|
|
75
|
+
: normalized;
|
|
76
|
+
const validate = this.ajv.compile(injected);
|
|
77
|
+
const validator = {
|
|
78
|
+
validate: (data) => {
|
|
79
|
+
const isValid = validate(data);
|
|
80
|
+
if (!isValid) {
|
|
81
|
+
throw new RuntimeError("ERR_RESOURCE_SCHEMA_VALIDATION_FAILED", `Invalid value passed: ${JSON.stringify(data)}. Error: ${formatAjvErrors(validate.errors)}`);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
isValid: (data) => {
|
|
85
|
+
return validate(data);
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
if (schema && typeof schema === "object") {
|
|
89
|
+
this.compiledValidators.set(schema, validator);
|
|
90
|
+
}
|
|
91
|
+
return validator;
|
|
92
|
+
}
|
|
93
|
+
composeWithRules(base, typeName, rules) {
|
|
94
|
+
return {
|
|
95
|
+
validate: (data) => {
|
|
96
|
+
base.validate(data);
|
|
97
|
+
for (const rule of rules) {
|
|
98
|
+
let result;
|
|
99
|
+
try {
|
|
100
|
+
result = evaluate(rule.condition, { this: data });
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
throw new RuntimeError("ERR_TYPE_VALIDATION_FAILED", `Type "${typeName}" rule evaluation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
104
|
+
}
|
|
105
|
+
if (result !== true) {
|
|
106
|
+
throw new RuntimeError(rule.code ?? "ERR_TYPE_VALIDATION_FAILED", rule.message ?? `Type "${typeName}" validation failed: rule "${rule.code}" not satisfied`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
isValid: (data) => {
|
|
111
|
+
if (!base.isValid(data))
|
|
112
|
+
return false;
|
|
113
|
+
for (const rule of rules) {
|
|
114
|
+
try {
|
|
115
|
+
if (evaluate(rule.condition, { this: data }) !== true)
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=schema-valiator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-valiator.js","sourceRoot":"","sources":["../src/schema-valiator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ResourceInstance, RuntimeResource } from "@telorun/sdk";
|
|
2
|
+
export interface SnapshotData {
|
|
3
|
+
timestamp: string;
|
|
4
|
+
resources: Array<{
|
|
5
|
+
kind: string;
|
|
6
|
+
name: string;
|
|
7
|
+
metadata: Record<string, any>;
|
|
8
|
+
data: Record<string, any>;
|
|
9
|
+
snapshot?: Record<string, any>;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Serializes runtime state into YAML snapshots
|
|
14
|
+
* Captures resource definitions, instances, and custom state
|
|
15
|
+
* Recursively includes nested resources based on generationDepth
|
|
16
|
+
*/
|
|
17
|
+
export declare class SnapshotSerializer {
|
|
18
|
+
/**
|
|
19
|
+
* Take a snapshot of runtime state
|
|
20
|
+
* @param resources Map of resources organized by kind
|
|
21
|
+
* @param resourceInstances Map of resource instances to include custom snapshots
|
|
22
|
+
* @param filePath Optional file path to write snapshot to
|
|
23
|
+
* @returns Snapshot data object
|
|
24
|
+
*/
|
|
25
|
+
takeSnapshot(resources: Map<string, Map<string, RuntimeResource>>, resourceInstances?: Map<string, {
|
|
26
|
+
resource: RuntimeResource;
|
|
27
|
+
instance: ResourceInstance;
|
|
28
|
+
}>, filePath?: string): Promise<SnapshotData>;
|
|
29
|
+
/**
|
|
30
|
+
* Serialize a single resource
|
|
31
|
+
*/
|
|
32
|
+
private serializeResource;
|
|
33
|
+
/**
|
|
34
|
+
* Get snapshot from resource instance if it implements snapshot() method
|
|
35
|
+
*/
|
|
36
|
+
private getInstanceSnapshot;
|
|
37
|
+
/**
|
|
38
|
+
* Serialize metadata, filtering out circular references and functions
|
|
39
|
+
*/
|
|
40
|
+
private serializeMetadata;
|
|
41
|
+
/**
|
|
42
|
+
* Serialize resource data, filtering out circular references and functions
|
|
43
|
+
*/
|
|
44
|
+
private serializeData;
|
|
45
|
+
/**
|
|
46
|
+
* Group resources by generation depth for hierarchical ordering
|
|
47
|
+
*/
|
|
48
|
+
private groupByGenerationDepth;
|
|
49
|
+
/**
|
|
50
|
+
* Write snapshot to YAML file
|
|
51
|
+
*/
|
|
52
|
+
private writeSnapshotToFile;
|
|
53
|
+
/**
|
|
54
|
+
* Generate resource key for instance lookup
|
|
55
|
+
*/
|
|
56
|
+
private getResourceKey;
|
|
57
|
+
/**
|
|
58
|
+
* Load snapshot from YAML file
|
|
59
|
+
*/
|
|
60
|
+
loadSnapshotFromFile(filePath: string): Promise<SnapshotData>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=snapshot-serializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-serializer.d.ts","sourceRoot":"","sources":["../src/snapshot-serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAKjE,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,CAAC,CAAC;CACJ;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B;;;;;;OAMG;IACG,YAAY,CAChB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,EACpD,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,eAAe,CAAC;QAAC,QAAQ,EAAE,gBAAgB,CAAA;KAAE,CAAC,EAC1F,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC;IA4BxB;;OAEG;YACW,iBAAiB;IAoC/B;;OAEG;YACW,mBAAmB;IAmBjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoB9B;;OAEG;YACW,mBAAmB;IAgBjC;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAIpE"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import * as fs from "fs/promises";
|
|
2
|
+
import * as YAML from "js-yaml";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
/**
|
|
5
|
+
* Serializes runtime state into YAML snapshots
|
|
6
|
+
* Captures resource definitions, instances, and custom state
|
|
7
|
+
* Recursively includes nested resources based on generationDepth
|
|
8
|
+
*/
|
|
9
|
+
export class SnapshotSerializer {
|
|
10
|
+
/**
|
|
11
|
+
* Take a snapshot of runtime state
|
|
12
|
+
* @param resources Map of resources organized by kind
|
|
13
|
+
* @param resourceInstances Map of resource instances to include custom snapshots
|
|
14
|
+
* @param filePath Optional file path to write snapshot to
|
|
15
|
+
* @returns Snapshot data object
|
|
16
|
+
*/
|
|
17
|
+
async takeSnapshot(resources, resourceInstances, filePath) {
|
|
18
|
+
const snapshot = {
|
|
19
|
+
timestamp: new Date().toISOString(),
|
|
20
|
+
resources: [],
|
|
21
|
+
};
|
|
22
|
+
// Get all resources organized by generation depth (0 = first level)
|
|
23
|
+
// Start with depth 0 (directly loaded resources) and recursively include nested ones
|
|
24
|
+
const resourcesByDepth = this.groupByGenerationDepth(resources);
|
|
25
|
+
// Process resources starting from depth 0
|
|
26
|
+
for (const depth of Array.from(resourcesByDepth.keys()).sort((a, b) => a - b)) {
|
|
27
|
+
const resourcesAtDepth = resourcesByDepth.get(depth) || [];
|
|
28
|
+
for (const resource of resourcesAtDepth) {
|
|
29
|
+
const resourceEntry = await this.serializeResource(resource, resourceInstances);
|
|
30
|
+
snapshot.resources.push(resourceEntry);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Write to file if path provided
|
|
34
|
+
if (filePath) {
|
|
35
|
+
await this.writeSnapshotToFile(snapshot, filePath);
|
|
36
|
+
}
|
|
37
|
+
return snapshot;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Serialize a single resource
|
|
41
|
+
*/
|
|
42
|
+
async serializeResource(resource, resourceInstances) {
|
|
43
|
+
const { kind, metadata, ...data } = resource;
|
|
44
|
+
const { name } = metadata;
|
|
45
|
+
const resourceEntry = {
|
|
46
|
+
kind,
|
|
47
|
+
name,
|
|
48
|
+
metadata: this.serializeMetadata(metadata),
|
|
49
|
+
data: this.serializeData(data),
|
|
50
|
+
};
|
|
51
|
+
// Include custom snapshot if resource instance has snapshot() method
|
|
52
|
+
if (resourceInstances) {
|
|
53
|
+
const key = this.getResourceKey(kind, name);
|
|
54
|
+
const instanceData = resourceInstances.get(key);
|
|
55
|
+
if (instanceData && instanceData.instance) {
|
|
56
|
+
const snapshotData = await this.getInstanceSnapshot(instanceData.instance);
|
|
57
|
+
if (snapshotData) {
|
|
58
|
+
resourceEntry.snapshot = snapshotData;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return resourceEntry;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get snapshot from resource instance if it implements snapshot() method
|
|
66
|
+
*/
|
|
67
|
+
async getInstanceSnapshot(instance) {
|
|
68
|
+
const instanceAny = instance;
|
|
69
|
+
// Check if snapshot method exists
|
|
70
|
+
if (typeof instanceAny.snapshot === "function") {
|
|
71
|
+
try {
|
|
72
|
+
const result = await Promise.resolve(instanceAny.snapshot(instance));
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error("Error calling snapshot() on resource instance:", error);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Serialize metadata, filtering out circular references and functions
|
|
84
|
+
*/
|
|
85
|
+
serializeMetadata(metadata) {
|
|
86
|
+
const serialized = {};
|
|
87
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
88
|
+
if (typeof value === "function") {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
serialized[key] = JSON.parse(JSON.stringify(value));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Skip non-serializable values
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return serialized;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Serialize resource data, filtering out circular references and functions
|
|
102
|
+
*/
|
|
103
|
+
serializeData(data) {
|
|
104
|
+
const serialized = {};
|
|
105
|
+
for (const [key, value] of Object.entries(data)) {
|
|
106
|
+
if (typeof value === "function") {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
serialized[key] = JSON.parse(JSON.stringify(value));
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Skip non-serializable values
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return serialized;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Group resources by generation depth for hierarchical ordering
|
|
120
|
+
*/
|
|
121
|
+
groupByGenerationDepth(resources) {
|
|
122
|
+
const grouped = new Map();
|
|
123
|
+
for (const kindMap of resources.values()) {
|
|
124
|
+
for (const resource of kindMap.values()) {
|
|
125
|
+
const depth = resource.metadata.generationDepth ?? 0;
|
|
126
|
+
if (!grouped.has(depth)) {
|
|
127
|
+
grouped.set(depth, []);
|
|
128
|
+
}
|
|
129
|
+
grouped.get(depth).push(resource);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return grouped;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Write snapshot to YAML file
|
|
136
|
+
*/
|
|
137
|
+
async writeSnapshotToFile(snapshot, filePath) {
|
|
138
|
+
// Ensure directory exists
|
|
139
|
+
const dir = path.dirname(filePath);
|
|
140
|
+
if (dir !== "." && dir !== "") {
|
|
141
|
+
await fs.mkdir(dir, { recursive: true });
|
|
142
|
+
}
|
|
143
|
+
// Convert to YAML
|
|
144
|
+
const yaml = YAML.dump(snapshot, {
|
|
145
|
+
indent: 2,
|
|
146
|
+
lineWidth: 0,
|
|
147
|
+
});
|
|
148
|
+
await fs.writeFile(filePath, yaml, "utf-8");
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Generate resource key for instance lookup
|
|
152
|
+
*/
|
|
153
|
+
getResourceKey(kind, name) {
|
|
154
|
+
return `${kind}:${name}`;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Load snapshot from YAML file
|
|
158
|
+
*/
|
|
159
|
+
async loadSnapshotFromFile(filePath) {
|
|
160
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
161
|
+
return YAML.load(content);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=snapshot-serializer.js.map
|