@telorun/kernel 0.2.5 → 0.2.6
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/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/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/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/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/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/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/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/controller-loader.d.ts.map +1 -1
- package/dist/controller-loader.js +2 -1
- package/dist/controller-loader.js.map +1 -1
- package/dist/controller-registry.d.ts +0 -4
- package/dist/controller-registry.d.ts.map +1 -1
- package/dist/controller-registry.js +11 -22
- package/dist/controller-registry.js.map +1 -1
- package/dist/controllers/capability/capability-controller.d.ts +0 -5
- package/dist/controllers/capability/capability-controller.d.ts.map +1 -1
- package/dist/controllers/capability/capability-controller.js +1 -5
- package/dist/controllers/capability/capability-controller.js.map +1 -1
- package/dist/controllers/module/import-controller.d.ts +0 -3
- package/dist/controllers/module/import-controller.d.ts.map +1 -1
- package/dist/controllers/module/import-controller.js +21 -27
- package/dist/controllers/module/import-controller.js.map +1 -1
- package/dist/controllers/module/module-controller.d.ts +0 -59
- package/dist/controllers/module/module-controller.d.ts.map +1 -1
- package/dist/controllers/module/module-controller.js +0 -45
- package/dist/controllers/module/module-controller.js.map +1 -1
- package/dist/controllers/resource-definition/resource-definition-controller.d.ts +3 -4
- package/dist/controllers/resource-definition/resource-definition-controller.d.ts.map +1 -1
- package/dist/controllers/resource-definition/resource-definition-controller.js +6 -8
- package/dist/controllers/resource-definition/resource-definition-controller.js.map +1 -1
- package/dist/controllers/resource-definition/resource-template-controller.d.ts +12 -0
- package/dist/controllers/resource-definition/resource-template-controller.d.ts.map +1 -0
- package/dist/controllers/resource-definition/resource-template-controller.js +112 -0
- package/dist/controllers/resource-definition/resource-template-controller.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/kernel.d.ts +21 -24
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +254 -189
- package/dist/kernel.js.map +1 -1
- package/dist/loader.d.ts +9 -8
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +50 -132
- package/dist/loader.js.map +1 -1
- package/dist/manifest-adapters/http-adapter.d.ts.map +1 -1
- package/dist/manifest-adapters/http-adapter.js +3 -1
- package/dist/manifest-adapters/http-adapter.js.map +1 -1
- package/dist/manifest-adapters/local-file-adapter.d.ts +7 -5
- package/dist/manifest-adapters/local-file-adapter.d.ts.map +1 -1
- package/dist/manifest-adapters/local-file-adapter.js +21 -26
- package/dist/manifest-adapters/local-file-adapter.js.map +1 -1
- package/dist/manifest-adapters/manifest-adapter.d.ts +2 -0
- package/dist/manifest-adapters/manifest-adapter.d.ts.map +1 -1
- package/dist/manifest-adapters/registry-adapter.d.ts.map +1 -1
- package/dist/manifest-adapters/registry-adapter.js +3 -1
- package/dist/manifest-adapters/registry-adapter.js.map +1 -1
- package/dist/manifest-schemas.d.ts +61 -25
- package/dist/manifest-schemas.d.ts.map +1 -1
- package/dist/manifest-schemas.js +56 -16
- package/dist/manifest-schemas.js.map +1 -1
- package/dist/resource-context.d.ts +2 -5
- package/dist/resource-context.d.ts.map +1 -1
- package/dist/resource-context.js +31 -21
- package/dist/resource-context.js.map +1 -1
- package/dist/schema-valiator.d.ts.map +1 -1
- package/dist/schema-valiator.js +13 -2
- package/dist/schema-valiator.js.map +1 -1
- package/package.json +6 -7
- package/src/controller-loader.ts +2 -1
- package/src/controller-registry.ts +11 -26
- package/src/controllers/module/import-controller.ts +30 -30
- package/src/controllers/module/module-controller.ts +0 -51
- package/src/controllers/resource-definition/resource-definition-controller.ts +14 -15
- package/src/controllers/resource-definition/resource-template-controller.ts +138 -0
- package/src/index.ts +1 -1
- package/src/kernel.ts +313 -224
- package/src/loader.ts +54 -165
- package/src/manifest-adapters/local-file-adapter.ts +24 -31
- package/src/manifest-adapters/manifest-adapter.ts +2 -0
- package/src/manifest-schemas.ts +60 -24
- package/src/resource-context.ts +31 -30
- package/src/schema-valiator.ts +14 -3
- package/src/capabilities/component.yaml +0 -4
- package/src/capabilities/executable.yaml +0 -8
- package/src/capabilities/handler.yaml +0 -4
- package/src/capabilities/listener.yaml +0 -4
- package/src/capabilities/provider.yaml +0 -4
- package/src/capabilities/template.yaml +0 -4
- package/src/capabilities/type.yaml +0 -4
- package/src/controllers/capability/capability-controller.ts +0 -41
- package/src/controllers/module/module.json +0 -48
- package/src/controllers/module/module.yaml +0 -32
- package/src/manifest-adapters/http-adapter.ts +0 -35
- package/src/manifest-adapters/registry-adapter.ts +0 -56
package/dist/manifest-schemas.js
CHANGED
|
@@ -6,30 +6,70 @@ export const RuntimeResourceSchema = Type.Object({
|
|
|
6
6
|
kind: Type.String(),
|
|
7
7
|
metadata: Type.Object({ name: Type.String() }, { additionalProperties: true }),
|
|
8
8
|
}, { additionalProperties: true });
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
9
|
+
const metadataSchema = {
|
|
10
|
+
type: "object",
|
|
11
|
+
required: ["name"],
|
|
12
|
+
properties: {
|
|
13
|
+
name: { type: "string" },
|
|
14
|
+
module: { type: "string" },
|
|
15
|
+
},
|
|
16
|
+
additionalProperties: true,
|
|
17
|
+
};
|
|
18
|
+
const baseDefinition = {
|
|
19
|
+
type: "object",
|
|
20
|
+
required: ["kind", "metadata"],
|
|
21
|
+
properties: {
|
|
22
|
+
kind: { const: "Kernel.Definition" },
|
|
23
|
+
metadata: metadataSchema,
|
|
24
|
+
capability: { type: "string" },
|
|
25
|
+
schema: { type: "object", additionalProperties: true },
|
|
26
|
+
controllers: { type: "array", items: { type: "string" } },
|
|
27
|
+
},
|
|
28
|
+
unevaluatedProperties: false,
|
|
29
|
+
};
|
|
30
|
+
const KNOWN_CAPABILITIES = [
|
|
31
|
+
"Kernel.Service",
|
|
32
|
+
"Kernel.Runnable",
|
|
33
|
+
"Kernel.Invocable",
|
|
34
|
+
"Kernel.Provider",
|
|
35
|
+
"Kernel.Type",
|
|
36
|
+
"Kernel.Mount",
|
|
37
|
+
];
|
|
38
|
+
export const ResourceDefinitionSchema = {
|
|
39
|
+
...baseDefinition,
|
|
40
|
+
oneOf: [
|
|
41
|
+
{ required: ["capability"], properties: { capability: { const: "Kernel.Service" } } },
|
|
42
|
+
{ required: ["capability"], properties: { capability: { const: "Kernel.Runnable" } } },
|
|
43
|
+
{ required: ["capability"], properties: { capability: { const: "Kernel.Invocable" } } },
|
|
44
|
+
{ required: ["capability"], properties: { capability: { const: "Kernel.Provider" } } },
|
|
45
|
+
{ required: ["capability"], properties: { capability: { const: "Kernel.Type" } } },
|
|
46
|
+
{
|
|
47
|
+
required: ["capability"],
|
|
48
|
+
properties: {
|
|
49
|
+
capability: { const: "Kernel.Mount" },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
// Unknown/absent capability: open schema for third-party extensibility
|
|
53
|
+
{
|
|
54
|
+
not: {
|
|
55
|
+
required: ["capability"],
|
|
56
|
+
properties: { capability: { enum: KNOWN_CAPABILITIES } },
|
|
57
|
+
},
|
|
58
|
+
unevaluatedProperties: true,
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
20
62
|
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
21
63
|
addFormats.default(ajv);
|
|
22
64
|
export const validateRuntimeResource = ajv.compile(RuntimeResourceSchema);
|
|
23
65
|
export const validateResourceDefinition = ajv.compile(ResourceDefinitionSchema);
|
|
24
66
|
export function formatAjvErrors(errors) {
|
|
25
|
-
if (!errors || errors.length === 0)
|
|
67
|
+
if (!errors || errors.length === 0)
|
|
26
68
|
return "Unknown schema error";
|
|
27
|
-
}
|
|
28
69
|
return errors
|
|
29
70
|
.map((err) => {
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
return `${path} ${message}`;
|
|
71
|
+
const p = err.instancePath || "/";
|
|
72
|
+
return `${p} ${err.message ?? "is invalid"}`;
|
|
33
73
|
})
|
|
34
74
|
.join("; ");
|
|
35
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-schemas.js","sourceRoot":"","sources":["../src/manifest-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"manifest-schemas.js","sourceRoot":"","sources":["../src/manifest-schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ export declare class ResourceContextImpl implements ResourceContext {
|
|
|
14
14
|
registerSchema(name: string, schema: object): void;
|
|
15
15
|
lookupSchema(name: string): object | undefined;
|
|
16
16
|
validateSchema(value: any, schema: any): void;
|
|
17
|
-
invoke(kind: string, name: string,
|
|
17
|
+
invoke<TInputs>(kind: string, name: string, inputs: TInputs): Promise<any>;
|
|
18
18
|
run(name: string): Promise<void>;
|
|
19
19
|
registerManifest(resource: any): void;
|
|
20
20
|
/**
|
|
@@ -36,16 +36,12 @@ export declare class ResourceContextImpl implements ResourceContext {
|
|
|
36
36
|
getResourcesByName(_kind: string, name: string): RuntimeResource | null;
|
|
37
37
|
registerController(moduleName: string, kindName: string, controllerInstance: any): Promise<void>;
|
|
38
38
|
registerDefinition(def: any): void;
|
|
39
|
-
registerCapability(name: string, schema?: Record<string, any>): void;
|
|
40
|
-
isCapabilityRegistered(name: string): boolean;
|
|
41
|
-
getCapabilitySchema(name: string): Record<string, any> | null | undefined;
|
|
42
39
|
on(event: string, handler: (payload?: any) => void | Promise<void>): void;
|
|
43
40
|
once(event: string, handler: (payload?: any) => void | Promise<void>): void;
|
|
44
41
|
off(event: string, handler: (payload?: any) => void | Promise<void>): void;
|
|
45
42
|
emit(event: string, payload?: any): Promise<void>;
|
|
46
43
|
acquireHold(reason?: string): () => void;
|
|
47
44
|
requestExit(code: number): void;
|
|
48
|
-
evaluateCel(expression: string, context: Record<string, any>): unknown;
|
|
49
45
|
expandValue(value: any, context: Record<string, any>): unknown;
|
|
50
46
|
emitEvent(event: string, payload?: any): Promise<void>;
|
|
51
47
|
registerModuleImport(alias: string, targetModule: string, kinds: string[]): void;
|
|
@@ -57,6 +53,7 @@ export declare class ResourceContextImpl implements ResourceContext {
|
|
|
57
53
|
* call initializeChildContext() to initialize them in isolation.
|
|
58
54
|
*/
|
|
59
55
|
spawnChildContext(): EvaluationContext;
|
|
56
|
+
transientChild(context: Record<string, any>): EvaluationContext;
|
|
60
57
|
/**
|
|
61
58
|
* Create a temporary child context, queue manifests on it, run a function,
|
|
62
59
|
* then tear down the child context and its resources.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-context.d.ts","sourceRoot":"","sources":["../src/resource-context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,aAAa,EAEb,eAAe,EAEf,eAAe,
|
|
1
|
+
{"version":3,"file":"resource-context.d.ts","sourceRoot":"","sources":["../src/resource-context.ts"],"names":[],"mappings":"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"}
|
package/dist/resource-context.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EvaluationContext, NoopValidator, RuntimeError, } from "@telorun/sdk";
|
|
1
|
+
import { EvaluationContext, NoopValidator, RuntimeError, isCompiledValue, } from "@telorun/sdk";
|
|
2
2
|
import AjvModule from "ajv";
|
|
3
3
|
import addFormats from "ajv-formats";
|
|
4
4
|
import { formatAjvErrors } from "./manifest-schemas.js";
|
|
@@ -27,8 +27,13 @@ export class ResourceContextImpl {
|
|
|
27
27
|
return this.validator.getSchema(name);
|
|
28
28
|
}
|
|
29
29
|
validateSchema(value, schema) {
|
|
30
|
-
const ajv = new Ajv(
|
|
30
|
+
const ajv = new Ajv({
|
|
31
|
+
removeAdditional: true,
|
|
32
|
+
});
|
|
31
33
|
addFormats.default(ajv);
|
|
34
|
+
for (const kw of ["x-telo-ref", "x-telo-scope", "x-telo-context", "x-telo-schema-from"]) {
|
|
35
|
+
ajv.addKeyword(kw);
|
|
36
|
+
}
|
|
32
37
|
const validate = ajv.compile("type" in schema && typeof schema.type === "string"
|
|
33
38
|
? schema
|
|
34
39
|
: {
|
|
@@ -37,13 +42,13 @@ export class ResourceContextImpl {
|
|
|
37
42
|
required: Object.keys(schema),
|
|
38
43
|
additionalProperties: false,
|
|
39
44
|
});
|
|
40
|
-
const isValid = validate(value);
|
|
45
|
+
const isValid = validate(stripCompiledValues(value));
|
|
41
46
|
if (!isValid) {
|
|
42
|
-
throw new RuntimeError("ERR_INVALID_VALUE", `[${this.metadata.name}] Invalid value
|
|
47
|
+
throw new RuntimeError("ERR_INVALID_VALUE", `[${this.metadata.name}] Invalid value. Error: ${formatAjvErrors(validate.errors)}`);
|
|
43
48
|
}
|
|
44
49
|
}
|
|
45
|
-
invoke(kind, name,
|
|
46
|
-
return this.moduleContext.invoke(kind, name,
|
|
50
|
+
invoke(kind, name, inputs) {
|
|
51
|
+
return this.moduleContext.invoke(kind, name, inputs);
|
|
47
52
|
}
|
|
48
53
|
async run(name) {
|
|
49
54
|
await this.moduleContext.run(name);
|
|
@@ -75,7 +80,7 @@ export class ResourceContextImpl {
|
|
|
75
80
|
`Unnamed${Math.random().toString(16).slice(2, 8)}`;
|
|
76
81
|
// If resource has properties beyond kind/name, it's a definition - register it
|
|
77
82
|
const definitionKeys = Object.keys(resource).filter((k) => k !== "kind" && k !== "name" && k !== "metadata");
|
|
78
|
-
if (definitionKeys.length > 0) {
|
|
83
|
+
if (definitionKeys.length > 0 && !this.moduleContext.hasManifest(name)) {
|
|
79
84
|
this.registerManifest({
|
|
80
85
|
...resource,
|
|
81
86
|
metadata: {
|
|
@@ -109,15 +114,6 @@ export class ResourceContextImpl {
|
|
|
109
114
|
registerDefinition(def) {
|
|
110
115
|
this.kernel.registerResourceDefinition(def);
|
|
111
116
|
}
|
|
112
|
-
registerCapability(name, schema) {
|
|
113
|
-
this.kernel.registerCapability(name, schema);
|
|
114
|
-
}
|
|
115
|
-
isCapabilityRegistered(name) {
|
|
116
|
-
return this.kernel.isCapabilityRegistered(name);
|
|
117
|
-
}
|
|
118
|
-
getCapabilitySchema(name) {
|
|
119
|
-
return this.kernel.getCapabilitySchema(name);
|
|
120
|
-
}
|
|
121
117
|
on(event, handler) {
|
|
122
118
|
this.kernel.on(event, handler);
|
|
123
119
|
}
|
|
@@ -136,11 +132,8 @@ export class ResourceContextImpl {
|
|
|
136
132
|
requestExit(code) {
|
|
137
133
|
this.kernel.requestExit(code);
|
|
138
134
|
}
|
|
139
|
-
evaluateCel(expression, context) {
|
|
140
|
-
return new EvaluationContext(this.moduleContext.source, context, undefined, new Set(), this.emit).evaluate(expression);
|
|
141
|
-
}
|
|
142
135
|
expandValue(value, context) {
|
|
143
|
-
return this.moduleContext.
|
|
136
|
+
return this.moduleContext.expandWith(value, context);
|
|
144
137
|
}
|
|
145
138
|
async emitEvent(event, payload) {
|
|
146
139
|
await this.kernel.emitRuntimeEvent(event, payload);
|
|
@@ -164,6 +157,9 @@ export class ResourceContextImpl {
|
|
|
164
157
|
const child = new EvaluationContext(this.moduleContext.source, this.moduleContext.context, this.moduleContext.createInstance, this.moduleContext.secretValues, this.moduleContext.emit);
|
|
165
158
|
return this.moduleContext.spawnChild(child);
|
|
166
159
|
}
|
|
160
|
+
transientChild(context) {
|
|
161
|
+
return this.moduleContext.transientChild(context);
|
|
162
|
+
}
|
|
167
163
|
/**
|
|
168
164
|
* Create a temporary child context, queue manifests on it, run a function,
|
|
169
165
|
* then tear down the child context and its resources.
|
|
@@ -184,9 +180,23 @@ export class ResourceContextImpl {
|
|
|
184
180
|
return await Promise.resolve(fn());
|
|
185
181
|
}
|
|
186
182
|
finally {
|
|
187
|
-
await
|
|
183
|
+
await child.teardownResources();
|
|
188
184
|
}
|
|
189
185
|
})();
|
|
190
186
|
}
|
|
191
187
|
}
|
|
188
|
+
function stripCompiledValues(v) {
|
|
189
|
+
if (isCompiledValue(v))
|
|
190
|
+
return "";
|
|
191
|
+
if (Array.isArray(v))
|
|
192
|
+
return v.map(stripCompiledValues);
|
|
193
|
+
if (v !== null && typeof v === "object") {
|
|
194
|
+
const out = {};
|
|
195
|
+
for (const [k, val] of Object.entries(v)) {
|
|
196
|
+
out[k] = stripCompiledValues(val);
|
|
197
|
+
}
|
|
198
|
+
return out;
|
|
199
|
+
}
|
|
200
|
+
return v;
|
|
201
|
+
}
|
|
192
202
|
//# sourceMappingURL=resource-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-context.js","sourceRoot":"","sources":["../src/resource-context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAEjB,aAAa,EAEb,YAAY,
|
|
1
|
+
{"version":3,"file":"resource-context.js","sourceRoot":"","sources":["../src/resource-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-valiator.d.ts","sourceRoot":"","sources":["../src/schema-valiator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAgB,MAAM,cAAc,CAAC;AAO3D,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAA2B;;IAWtC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAM7C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3C,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa;
|
|
1
|
+
{"version":3,"file":"schema-valiator.d.ts","sourceRoot":"","sources":["../src/schema-valiator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAgB,MAAM,cAAc,CAAC;AAO3D,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAA2B;;IAWtC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAM7C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3C,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa;CAsCpC"}
|
package/dist/schema-valiator.js
CHANGED
|
@@ -21,14 +21,25 @@ export class SchemaValidator {
|
|
|
21
21
|
return this.ajv.getSchema(name);
|
|
22
22
|
}
|
|
23
23
|
compile(schema) {
|
|
24
|
-
const
|
|
24
|
+
const normalized = "type" in schema && typeof schema.type === "string"
|
|
25
25
|
? schema
|
|
26
26
|
: {
|
|
27
27
|
type: "object",
|
|
28
28
|
properties: schema,
|
|
29
29
|
required: Object.keys(schema),
|
|
30
30
|
additionalProperties: false,
|
|
31
|
-
}
|
|
31
|
+
};
|
|
32
|
+
const injected = normalized.additionalProperties === false
|
|
33
|
+
? {
|
|
34
|
+
...normalized,
|
|
35
|
+
properties: {
|
|
36
|
+
kind: { type: "string" },
|
|
37
|
+
metadata: { type: "object" },
|
|
38
|
+
...normalized.properties,
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
: normalized;
|
|
42
|
+
const validate = this.ajv.compile(injected);
|
|
32
43
|
return {
|
|
33
44
|
validate: (data) => {
|
|
34
45
|
const isValid = validate(data);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-valiator.js","sourceRoot":"","sources":["../src/schema-valiator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,SAAS,MAAM,KAAK,CAAC;AAC5B,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC;AAE3C,MAAM,OAAO,eAAe;IAG1B;QACE,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC;YACjB,MAAM,EAAE,KAAK;YACb,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,MAAc;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAuB,CAAC;IACxD,CAAC;IAED,OAAO,CAAC,MAAW;QACjB,MAAM,
|
|
1
|
+
{"version":3,"file":"schema-valiator.js","sourceRoot":"","sources":["../src/schema-valiator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,SAAS,MAAM,KAAK,CAAC;AAC5B,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC;AAE3C,MAAM,OAAO,eAAe;IAG1B;QACE,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC;YACjB,MAAM,EAAE,KAAK;YACb,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,MAAc;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAuB,CAAC;IACxD,CAAC;IAED,OAAO,CAAC,MAAW;QACjB,MAAM,UAAU,GACd,MAAM,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YACjD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC7B,oBAAoB,EAAE,KAAK;aAC5B,CAAC;QACR,MAAM,QAAQ,GACZ,UAAU,CAAC,oBAAoB,KAAK,KAAK;YACvC,CAAC,CAAC;gBACE,GAAG,UAAU;gBACb,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC5B,GAAG,UAAU,CAAC,UAAU;iBACzB;aACF;YACH,CAAC,CAAC,UAAU,CAAC;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE5C,OAAO;YACL,QAAQ,EAAE,CAAC,IAAS,EAAE,EAAE;gBACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,YAAY,CACpB,wBAAwB,EACxB,yBAAyB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAC5F,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,EAAE,CAAC,IAAS,EAAE,EAAE;gBACrB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telorun/kernel",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"description": "Telo Runtime - A lightweight, polyglot execution host.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -27,19 +27,18 @@
|
|
|
27
27
|
"@sinclair/typebox": "^0.34.48",
|
|
28
28
|
"ajv": "^8.17.1",
|
|
29
29
|
"ajv-formats": "^3.0.1",
|
|
30
|
-
"cel-js": "^
|
|
31
|
-
"js-yaml": "^4.1.0",
|
|
30
|
+
"@marcbachmann/cel-js": "^7.5.3",
|
|
32
31
|
"packageurl-js": "^2.0.1",
|
|
33
|
-
"@telorun/
|
|
34
|
-
"@telorun/
|
|
32
|
+
"@telorun/analyzer": "0.1.1",
|
|
33
|
+
"@telorun/sdk": "0.2.6",
|
|
34
|
+
"@telorun/yaml-cel-templating": "1.0.3"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@types/js-yaml": "^4.0.5",
|
|
38
37
|
"@types/node": "^20.0.0",
|
|
39
38
|
"typescript": "^5.0.0"
|
|
40
39
|
},
|
|
41
40
|
"scripts": {
|
|
42
|
-
"build": "tsc
|
|
41
|
+
"build": "tsc",
|
|
43
42
|
"dev": "tsc --watch"
|
|
44
43
|
}
|
|
45
44
|
}
|
package/src/controller-loader.ts
CHANGED
|
@@ -39,7 +39,8 @@ export class ControllerLoader {
|
|
|
39
39
|
const isLocalManifest =
|
|
40
40
|
baseUri && !baseUri.startsWith("http://") && !baseUri.startsWith("https://");
|
|
41
41
|
if (localPath && isLocalManifest) {
|
|
42
|
-
const
|
|
42
|
+
const baseUriPath = baseUri.startsWith("file://") ? baseUri.slice("file://".length) : baseUri;
|
|
43
|
+
const manifestDir = path.dirname(baseUriPath);
|
|
43
44
|
const resolvedLocalPath = path.resolve(manifestDir, localPath);
|
|
44
45
|
if (await this.pathExists(resolvedLocalPath)) {
|
|
45
46
|
packageRoot = resolvedLocalPath;
|
|
@@ -9,20 +9,6 @@ export class ControllerRegistry {
|
|
|
9
9
|
private controllersByKind: Map<string, ControllerInstance> = new Map();
|
|
10
10
|
private definitionsByKind: Map<string, ResourceDefinition> = new Map();
|
|
11
11
|
private controllerLoaders: Map<string, () => Promise<ControllerInstance>> = new Map();
|
|
12
|
-
private capabilitySchemas: Map<string, Record<string, any> | null> = new Map();
|
|
13
|
-
|
|
14
|
-
registerCapability(name: string, schema?: Record<string, any>): void {
|
|
15
|
-
this.capabilitySchemas.set(name, schema ?? null);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
isCapabilityRegistered(name: string): boolean {
|
|
19
|
-
return this.capabilitySchemas.has(name);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
getCapabilitySchema(name: string): Record<string, any> | null | undefined {
|
|
23
|
-
return this.capabilitySchemas.get(name);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
12
|
/**
|
|
27
13
|
* Register a controller definition
|
|
28
14
|
*/
|
|
@@ -64,8 +50,10 @@ export class ControllerRegistry {
|
|
|
64
50
|
// this.controllersByKind.set(kind, controller);
|
|
65
51
|
// return controller;
|
|
66
52
|
// }
|
|
67
|
-
|
|
68
|
-
|
|
53
|
+
return {
|
|
54
|
+
schema: { type: "object", additionalProperties: false },
|
|
55
|
+
};
|
|
56
|
+
// throw new Error(`No controller registered for kind: ${kind}`);
|
|
69
57
|
}
|
|
70
58
|
|
|
71
59
|
/**
|
|
@@ -124,16 +112,13 @@ export class ControllerRegistry {
|
|
|
124
112
|
}
|
|
125
113
|
// Ensure controller has schema from definition
|
|
126
114
|
const definition = this.definitionsByKind.get(kind);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
} else {
|
|
135
|
-
this.controllersByKind.set(kind, controller);
|
|
136
|
-
}
|
|
115
|
+
const wrappedController: ControllerInstance = {
|
|
116
|
+
...controller,
|
|
117
|
+
schema: controller.schema ?? definition?.schema,
|
|
118
|
+
inputSchema: controller.inputSchema,
|
|
119
|
+
outputSchema: controller.outputSchema,
|
|
120
|
+
};
|
|
121
|
+
this.controllersByKind.set(kind, wrappedController);
|
|
137
122
|
}
|
|
138
123
|
|
|
139
124
|
/**
|
|
@@ -1,20 +1,37 @@
|
|
|
1
|
+
import { DiagnosticSeverity, Loader, StaticAnalyzer } from "@telorun/analyzer";
|
|
1
2
|
import type { ResourceContext, ResourceInstance } from "@telorun/sdk";
|
|
2
|
-
import { EvaluationContext } from "@telorun/sdk";
|
|
3
|
-
import {
|
|
3
|
+
import { EvaluationContext, RuntimeError } from "@telorun/sdk";
|
|
4
|
+
import { LocalFileAdapter } from "../../manifest-adapters/local-file-adapter.js";
|
|
4
5
|
|
|
5
6
|
export async function create(resource: any, ctx: ResourceContext): Promise<ResourceInstance> {
|
|
6
7
|
const alias = resource.metadata.name as string;
|
|
7
|
-
const
|
|
8
|
-
const loader = new Loader();
|
|
8
|
+
const loader = new Loader([new LocalFileAdapter()]);
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
const moduleSource: string = resource.module ?? resource.source;
|
|
11
|
+
|
|
12
|
+
// Validate the imported module and all its transitive imports before loading for runtime.
|
|
13
|
+
// loadManifests() follows Kernel.Import chains so definitions from sub-imports are present,
|
|
14
|
+
// preventing false UNDEFINED_KIND errors for kinds that come from the module's own imports.
|
|
15
|
+
const resolvedUrl = new URL(moduleSource, ctx.moduleContext.source).toString();
|
|
16
|
+
const analysisManifests = await loader.loadManifests(resolvedUrl);
|
|
17
|
+
const diagnostics = new StaticAnalyzer().analyze(analysisManifests);
|
|
18
|
+
const errors = diagnostics.filter((d) => d.severity === DiagnosticSeverity.Error);
|
|
19
|
+
if (errors.length > 0) {
|
|
20
|
+
throw new RuntimeError(
|
|
21
|
+
"ERR_MANIFEST_VALIDATION_FAILED",
|
|
22
|
+
errors.map((d) => d.message).join("\n"),
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Load target module manifests for runtime. Inject variables/secrets as compile context so
|
|
27
|
+
// that ${{ variables.x }} / ${{ secrets.y }} templates in the child module resolve correctly.
|
|
12
28
|
// No env — child modules are isolated from host environment.
|
|
13
|
-
const manifests = await loader.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
29
|
+
const manifests = await loader.loadModule(
|
|
30
|
+
new URL(moduleSource, ctx.moduleContext.source).toString(),
|
|
31
|
+
{
|
|
32
|
+
compile: true,
|
|
33
|
+
},
|
|
34
|
+
);
|
|
18
35
|
// Find the kind: Module manifest to learn the target module name and contract.
|
|
19
36
|
const moduleManifest = manifests.find((m: any) => m.kind === "Kernel.Module");
|
|
20
37
|
if (!moduleManifest) {
|
|
@@ -22,22 +39,6 @@ export async function create(resource: any, ctx: ResourceContext): Promise<Resou
|
|
|
22
39
|
}
|
|
23
40
|
const targetModule: string = moduleManifest.metadata.name;
|
|
24
41
|
|
|
25
|
-
// Validate that every non-module manifest's metadata.module (when explicitly set)
|
|
26
|
-
// matches the target module name. A mismatch means the author put the wrong module
|
|
27
|
-
// name in a resource's metadata, which would silently give it an empty context and
|
|
28
|
-
// produce a confusing CEL "Identifier not found" error at runtime.
|
|
29
|
-
for (const manifest of manifests) {
|
|
30
|
-
if (manifest.kind === "Kernel.Module") continue;
|
|
31
|
-
const declaredModule: string | undefined = manifest.metadata?.module;
|
|
32
|
-
if (declaredModule && declaredModule !== targetModule) {
|
|
33
|
-
throw new Error(
|
|
34
|
-
`Resource '${manifest.metadata?.name ?? "(unnamed)"}' (kind: ${manifest.kind}) inside module '${targetModule}' ` +
|
|
35
|
-
`has metadata.module: '${declaredModule}', but the module is named '${targetModule}'. ` +
|
|
36
|
-
`Update metadata.module to '${targetModule}'.`,
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
42
|
// Validate required inputs before injecting.
|
|
42
43
|
validateRequiredInputs(moduleManifest.variables ?? {}, resource.variables ?? {}, "variables");
|
|
43
44
|
validateRequiredInputs(moduleManifest.secrets ?? {}, resource.secrets ?? {}, "secrets");
|
|
@@ -82,8 +83,8 @@ export async function create(resource: any, ctx: ResourceContext): Promise<Resou
|
|
|
82
83
|
// in the declaring module's evaluation context — no separate imports namespace needed.
|
|
83
84
|
return {
|
|
84
85
|
snapshot: () => ({
|
|
85
|
-
variables: (resource.variables
|
|
86
|
-
secrets: (resource.secrets
|
|
86
|
+
variables: ctx.expandValue(resource.variables, {}) ?? {},
|
|
87
|
+
secrets: ctx.expandValue(resource.secrets, {}) ?? {},
|
|
87
88
|
}),
|
|
88
89
|
run: async () => {
|
|
89
90
|
// Proxy run to target module
|
|
@@ -128,7 +129,6 @@ export const schema = {
|
|
|
128
129
|
type: "object",
|
|
129
130
|
properties: {
|
|
130
131
|
name: { type: "string" },
|
|
131
|
-
source: { type: "string" },
|
|
132
132
|
module: { type: "string" },
|
|
133
133
|
},
|
|
134
134
|
required: ["name"],
|
|
@@ -1,27 +1,6 @@
|
|
|
1
1
|
import type { ResourceContext, ResourceInstance } from "@telorun/sdk";
|
|
2
|
-
import { Loader } from "../../loader.js";
|
|
3
2
|
|
|
4
3
|
export async function create(resource: any, ctx: ResourceContext): Promise<ResourceInstance> {
|
|
5
|
-
const moduleName = resource.metadata.name as string;
|
|
6
|
-
const loader = new Loader();
|
|
7
|
-
|
|
8
|
-
for (const includePath of (resource.include as string[]) ?? []) {
|
|
9
|
-
const manifests = await loader.loadManifest(
|
|
10
|
-
includePath,
|
|
11
|
-
resource.metadata.source as string,
|
|
12
|
-
{},
|
|
13
|
-
);
|
|
14
|
-
for (const manifest of manifests) {
|
|
15
|
-
if (manifest.kind === "Kernel.Module") {
|
|
16
|
-
throw new Error(`Included file "${includePath}" must not declare kind: Module`);
|
|
17
|
-
}
|
|
18
|
-
if (!manifest.metadata.module) {
|
|
19
|
-
manifest.metadata.module = moduleName;
|
|
20
|
-
}
|
|
21
|
-
ctx.registerManifest(manifest);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
4
|
return {
|
|
26
5
|
run: async () => {
|
|
27
6
|
for (const target of (resource.targets as string[]) ?? []) {
|
|
@@ -35,33 +14,3 @@ export async function create(resource: any, ctx: ResourceContext): Promise<Resou
|
|
|
35
14
|
};
|
|
36
15
|
}
|
|
37
16
|
|
|
38
|
-
export const schema = {
|
|
39
|
-
type: "object",
|
|
40
|
-
properties: {
|
|
41
|
-
kind: { type: "string" },
|
|
42
|
-
metadata: {
|
|
43
|
-
type: "object",
|
|
44
|
-
properties: {
|
|
45
|
-
name: { type: "string" },
|
|
46
|
-
version: { type: "string" },
|
|
47
|
-
source: { type: "string" },
|
|
48
|
-
module: { type: "string" },
|
|
49
|
-
},
|
|
50
|
-
required: ["name"],
|
|
51
|
-
additionalProperties: true,
|
|
52
|
-
},
|
|
53
|
-
include: { type: "array", items: { type: "string" } },
|
|
54
|
-
variables: { type: "object" },
|
|
55
|
-
secrets: { type: "object" },
|
|
56
|
-
targets: { type: "array", items: { type: "string" } },
|
|
57
|
-
exports: {
|
|
58
|
-
type: "object",
|
|
59
|
-
properties: {
|
|
60
|
-
kinds: { type: "array", items: { type: "string" } },
|
|
61
|
-
},
|
|
62
|
-
additionalProperties: true,
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
required: ["metadata"],
|
|
66
|
-
additionalProperties: false,
|
|
67
|
-
};
|