@telorun/kernel 0.2.4
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/LICENSE +17 -0
- package/dist/boot-context-registry.d.ts +47 -0
- package/dist/boot-context-registry.d.ts.map +1 -0
- package/dist/boot-context-registry.js +131 -0
- package/dist/boot-context-registry.js.map +1 -0
- package/dist/capabilities/capabilities/component.yaml +3 -0
- package/dist/capabilities/capabilities/executable.yaml +7 -0
- package/dist/capabilities/capabilities/handler.yaml +3 -0
- package/dist/capabilities/capabilities/listener.yaml +3 -0
- package/dist/capabilities/capabilities/provider.yaml +3 -0
- package/dist/capabilities/capabilities/template.yaml +3 -0
- package/dist/capabilities/capabilities/type.yaml +3 -0
- package/dist/capabilities/component.yaml +3 -0
- package/dist/capabilities/executable.yaml +7 -0
- package/dist/capabilities/handler.yaml +3 -0
- package/dist/capabilities/listener.yaml +3 -0
- package/dist/capabilities/provider.yaml +3 -0
- package/dist/capabilities/template.yaml +3 -0
- package/dist/capabilities/type.yaml +3 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +109 -0
- package/dist/cli.js.map +1 -0
- package/dist/controller-loader.d.ts +24 -0
- package/dist/controller-loader.d.ts.map +1 -0
- package/dist/controller-loader.js +265 -0
- package/dist/controller-loader.js.map +1 -0
- package/dist/controller-registry.d.ts +56 -0
- package/dist/controller-registry.d.ts.map +1 -0
- package/dist/controller-registry.js +169 -0
- package/dist/controller-registry.js.map +1 -0
- package/dist/controllers/capability/capability-controller.d.ts +37 -0
- package/dist/controllers/capability/capability-controller.d.ts.map +1 -0
- package/dist/controllers/capability/capability-controller.js +30 -0
- package/dist/controllers/capability/capability-controller.js.map +1 -0
- package/dist/controllers/module/module-controller.d.ts +16 -0
- package/dist/controllers/module/module-controller.d.ts.map +1 -0
- package/dist/controllers/module/module-controller.js +95 -0
- package/dist/controllers/module/module-controller.js.map +1 -0
- package/dist/controllers/module/module.json +48 -0
- package/dist/controllers/resource-definition/resource-definition-controller.d.ts +33 -0
- package/dist/controllers/resource-definition/resource-definition-controller.d.ts.map +1 -0
- package/dist/controllers/resource-definition/resource-definition-controller.js +44 -0
- package/dist/controllers/resource-definition/resource-definition-controller.js.map +1 -0
- package/dist/event-stream.d.ts +45 -0
- package/dist/event-stream.d.ts.map +1 -0
- package/dist/event-stream.js +98 -0
- package/dist/event-stream.js.map +1 -0
- package/dist/events.d.ts +13 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +89 -0
- package/dist/events.js.map +1 -0
- package/dist/expressions.d.ts +20 -0
- package/dist/expressions.d.ts.map +1 -0
- package/dist/expressions.js +253 -0
- package/dist/expressions.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +113 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +558 -0
- package/dist/kernel.js.map +1 -0
- package/dist/loader.d.ts +17 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +189 -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 +29 -0
- package/dist/manifest-adapters/http-adapter.js.map +1 -0
- package/dist/manifest-adapters/local-file-adapter.d.ts +11 -0
- package/dist/manifest-adapters/local-file-adapter.d.ts.map +1 -0
- package/dist/manifest-adapters/local-file-adapter.js +51 -0
- package/dist/manifest-adapters/local-file-adapter.js.map +1 -0
- package/dist/manifest-adapters/manifest-adapter.d.ts +33 -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 +46 -0
- package/dist/manifest-adapters/registry-adapter.js.map +1 -0
- package/dist/manifest-schemas.d.ts +66 -0
- package/dist/manifest-schemas.d.ts.map +1 -0
- package/dist/manifest-schemas.js +55 -0
- package/dist/manifest-schemas.js.map +1 -0
- package/dist/registry.d.ts +41 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +122 -0
- package/dist/registry.js.map +1 -0
- package/dist/resource-context.d.ts +48 -0
- package/dist/resource-context.d.ts.map +1 -0
- package/dist/resource-context.js +146 -0
- package/dist/resource-context.js.map +1 -0
- package/dist/resource-uri.d.ts +80 -0
- package/dist/resource-uri.d.ts.map +1 -0
- package/dist/resource-uri.js +160 -0
- package/dist/resource-uri.js.map +1 -0
- package/dist/schema-valiator.d.ts +9 -0
- package/dist/schema-valiator.d.ts.map +1 -0
- package/dist/schema-valiator.js +43 -0
- package/dist/schema-valiator.js.map +1 -0
- package/dist/snapshot-serializer.d.ts +63 -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/src/controllers/module/module.yaml +32 -0
- package/dist/template-definition.d.ts +38 -0
- package/dist/template-definition.d.ts.map +1 -0
- package/dist/template-definition.js +26 -0
- package/dist/template-definition.js.map +1 -0
- package/dist/template-expander.d.ts +19 -0
- package/dist/template-expander.d.ts.map +1 -0
- package/dist/template-expander.js +425 -0
- package/dist/template-expander.js.map +1 -0
- package/dist/types.d.ts +62 -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 +42 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { Loader } from "../../loader.js";
|
|
3
|
+
/**
|
|
4
|
+
* Check if a path is a URL (http:// or https://)
|
|
5
|
+
*/
|
|
6
|
+
function isUrl(pathOrUrl) {
|
|
7
|
+
return pathOrUrl.startsWith("http://") || pathOrUrl.startsWith("https://");
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Resolve a path relative to a base, handling both local paths and URLs
|
|
11
|
+
*/
|
|
12
|
+
function resolvePath(loader, base, relative) {
|
|
13
|
+
// If the relative path is actually a URL, return it as-is
|
|
14
|
+
if (isUrl(relative)) {
|
|
15
|
+
return relative;
|
|
16
|
+
}
|
|
17
|
+
// Otherwise, resolve it relative to the base
|
|
18
|
+
return loader.resolvePath(base, relative);
|
|
19
|
+
}
|
|
20
|
+
export async function create(resource, ctx) {
|
|
21
|
+
// Get the module base path from the resource's URI or source
|
|
22
|
+
const moduleBasePath = resource.metadata.source
|
|
23
|
+
? path.dirname(resource.metadata.source)
|
|
24
|
+
: getModuleBasePath(resource.metadata.uri);
|
|
25
|
+
const loader = new Loader();
|
|
26
|
+
try {
|
|
27
|
+
// Load and register resource definitions from imports
|
|
28
|
+
if (resource.imports && Array.isArray(resource.imports)) {
|
|
29
|
+
for (const importPath of resource.imports) {
|
|
30
|
+
const resolvedPath = resolvePath(loader, moduleBasePath, importPath);
|
|
31
|
+
const defResources = await loader.loadDirectory(resolvedPath);
|
|
32
|
+
for (const defResource of defResources) {
|
|
33
|
+
ctx.registerManifest(defResource);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Load and register resources from definitions and resources paths
|
|
38
|
+
if (resource.definitions && Array.isArray(resource.definitions)) {
|
|
39
|
+
for (const defPath of resource.definitions) {
|
|
40
|
+
const resolvedPath = resolvePath(loader, moduleBasePath, defPath);
|
|
41
|
+
const defResources = await loader.loadManifest(resolvedPath);
|
|
42
|
+
for (const defResource of defResources) {
|
|
43
|
+
ctx.registerManifest(defResource);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (resource.resources && Array.isArray(resource.resources)) {
|
|
48
|
+
for (const defPath of resource.resources) {
|
|
49
|
+
const rawPath = typeof defPath === "string" ? defPath : defPath.path;
|
|
50
|
+
const resolvedPath = resolvePath(loader, moduleBasePath, rawPath);
|
|
51
|
+
const defResources = await loader.loadManifest(resolvedPath);
|
|
52
|
+
for (const defResource of defResources) {
|
|
53
|
+
ctx.registerManifest(defResource);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new Error(`Failed to process Module "${resource.metadata.name}": ${error instanceof Error ? error.message : String(error)}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function getModuleBasePath(uri) {
|
|
64
|
+
if (!uri) {
|
|
65
|
+
return process.cwd();
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
// URI format: file://localhost/path/to/file.yaml#kind.name
|
|
69
|
+
// Extract the file path part (before the #)
|
|
70
|
+
const hashIndex = uri.indexOf("#");
|
|
71
|
+
const filePath = hashIndex > 0 ? uri.substring(0, hashIndex) : uri;
|
|
72
|
+
// Parse as URL to handle file:// scheme
|
|
73
|
+
if (filePath.startsWith("file://")) {
|
|
74
|
+
// Remove 'file://localhost' and get the path
|
|
75
|
+
let pathPart = filePath.substring("file://".length);
|
|
76
|
+
if (pathPart.startsWith("localhost/")) {
|
|
77
|
+
pathPart = pathPart.substring("localhost".length);
|
|
78
|
+
}
|
|
79
|
+
else if (pathPart.startsWith("localhost\\")) {
|
|
80
|
+
pathPart = pathPart.substring("localhost".length);
|
|
81
|
+
}
|
|
82
|
+
return path.dirname(pathPart);
|
|
83
|
+
}
|
|
84
|
+
// Fallback: treat as regular path
|
|
85
|
+
return path.dirname(filePath);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return process.cwd();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export const schema = {
|
|
92
|
+
type: "object",
|
|
93
|
+
additionalProperties: true,
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=module-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-controller.js","sourceRoot":"","sources":["../../../src/controllers/module/module-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"properties": {
|
|
4
|
+
"metadata": {
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"name": {
|
|
8
|
+
"type": "string"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"required": ["name"]
|
|
12
|
+
},
|
|
13
|
+
"imports": {
|
|
14
|
+
"type": "array",
|
|
15
|
+
"items": {
|
|
16
|
+
"type": "string"
|
|
17
|
+
},
|
|
18
|
+
"description": "Paths to other modules to import"
|
|
19
|
+
},
|
|
20
|
+
"definitions": {
|
|
21
|
+
"type": "array",
|
|
22
|
+
"items": {
|
|
23
|
+
"type": "string"
|
|
24
|
+
},
|
|
25
|
+
"description": "Paths to ResourceDefinition files"
|
|
26
|
+
},
|
|
27
|
+
"resources": {
|
|
28
|
+
"type": "array",
|
|
29
|
+
"items": {
|
|
30
|
+
"oneOf": [
|
|
31
|
+
{
|
|
32
|
+
"type": "string"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"type": "object",
|
|
36
|
+
"properties": {
|
|
37
|
+
"path": {
|
|
38
|
+
"type": "string"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
"description": "Paths to resource instance files to load"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"required": ["metadata"]
|
|
48
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ControllerContext, ResourceContext, ResourceInstance, RuntimeResource } from "@telorun/sdk";
|
|
2
|
+
import { ControllerLoader } from "../../controller-loader.js";
|
|
3
|
+
type ResourceDefinitionResource = RuntimeResource & {
|
|
4
|
+
kind: "Definition";
|
|
5
|
+
metadata: {
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
name: string;
|
|
8
|
+
module?: string;
|
|
9
|
+
};
|
|
10
|
+
schema: Record<string, any>;
|
|
11
|
+
capabilities: string[];
|
|
12
|
+
events?: string[];
|
|
13
|
+
controllers: Array<string>;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* ResourceDefinition resource - acts as metadata holder for resource type definitions
|
|
17
|
+
* Validates incoming definitions against schema and maintains definition metadata
|
|
18
|
+
*/
|
|
19
|
+
declare class ResourceDefinition implements ResourceInstance {
|
|
20
|
+
readonly resource: ResourceDefinitionResource;
|
|
21
|
+
private controllerLoader;
|
|
22
|
+
readonly kind: "ResourceDefinition";
|
|
23
|
+
constructor(resource: ResourceDefinitionResource, controllerLoader: ControllerLoader);
|
|
24
|
+
init(ctx: ResourceContext): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export declare function register(ctx: ControllerContext): void;
|
|
27
|
+
export declare function create(resource: any, ctx: ResourceContext): Promise<ResourceDefinition>;
|
|
28
|
+
export declare const schema: {
|
|
29
|
+
type: string;
|
|
30
|
+
additionalProperties: boolean;
|
|
31
|
+
};
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=resource-definition-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-definition-controller.d.ts","sourceRoot":"","sources":["../../../src/controllers/resource-definition/resource-definition-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,eAAe,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,KAAK,0BAA0B,GAAG,eAAe,GAAG;IAClD,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE;QACR,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,cAAM,kBAAmB,YAAW,gBAAgB;IAIhD,QAAQ,CAAC,QAAQ,EAAE,0BAA0B;IAC7C,OAAO,CAAC,gBAAgB;IAJ1B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAwB;gBAGhD,QAAQ,EAAE,0BAA0B,EACrC,gBAAgB,EAAE,gBAAgB;IAGtC,IAAI,CAAC,GAAG,EAAE,eAAe;CAwBhC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAErD;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAW7F;AAED,eAAO,MAAM,MAAM;;;CAGlB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ControllerLoader } from "../../controller-loader.js";
|
|
2
|
+
import { formatAjvErrors, validateResourceDefinition } from "../../manifest-schemas.js";
|
|
3
|
+
/**
|
|
4
|
+
* ResourceDefinition resource - acts as metadata holder for resource type definitions
|
|
5
|
+
* Validates incoming definitions against schema and maintains definition metadata
|
|
6
|
+
*/
|
|
7
|
+
class ResourceDefinition {
|
|
8
|
+
constructor(resource, controllerLoader) {
|
|
9
|
+
this.resource = resource;
|
|
10
|
+
this.controllerLoader = controllerLoader;
|
|
11
|
+
this.kind = "ResourceDefinition";
|
|
12
|
+
}
|
|
13
|
+
async init(ctx) {
|
|
14
|
+
for (const cap of this.resource.capabilities) {
|
|
15
|
+
if (!ctx.isCapabilityRegistered(cap)) {
|
|
16
|
+
throw new Error(`Capability "${cap}" is not registered. Declare it as a Runtime.Capability resource.`);
|
|
17
|
+
}
|
|
18
|
+
const capSchema = ctx.getCapabilitySchema(cap);
|
|
19
|
+
if (capSchema) {
|
|
20
|
+
ctx.validateSchema(this.resource, capSchema);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const controllerInstance = await this.controllerLoader.load(this.resource.controllers, this.resource.metadata.source);
|
|
24
|
+
ctx.registerDefinition(this.resource);
|
|
25
|
+
await ctx.registerController(this.resource.metadata.module, this.resource.metadata.name, controllerInstance);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function register(ctx) {
|
|
29
|
+
// ResourceDefinition is a passive resource - no registration needed
|
|
30
|
+
}
|
|
31
|
+
export async function create(resource, ctx) {
|
|
32
|
+
// Validate incoming resource definition against schema
|
|
33
|
+
if (!validateResourceDefinition(resource)) {
|
|
34
|
+
throw new Error(`Invalid ResourceDefinition "${resource.metadata.name}": ${formatAjvErrors(validateResourceDefinition.errors)}`);
|
|
35
|
+
}
|
|
36
|
+
// Return a fully-formed ResourceDefinition instance
|
|
37
|
+
const definition = resource;
|
|
38
|
+
return new ResourceDefinition(definition, new ControllerLoader());
|
|
39
|
+
}
|
|
40
|
+
export const schema = {
|
|
41
|
+
type: "object",
|
|
42
|
+
additionalProperties: true,
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=resource-definition-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-definition-controller.js","sourceRoot":"","sources":["../../../src/controllers/resource-definition/resource-definition-controller.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAexF;;;GAGG;AACH,MAAM,kBAAkB;IAGtB,YACW,QAAoC,EACrC,gBAAkC;QADjC,aAAQ,GAAR,QAAQ,CAA4B;QACrC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAJnC,SAAI,GAAyB,oBAAoB,CAAC;IAKxD,CAAC;IAEJ,KAAK,CAAC,IAAI,CAAC,GAAoB;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CACb,eAAe,GAAG,mEAAmE,CACtF,CAAC;YACJ,CAAC;YACD,MAAM,SAAS,GAAG,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,SAAS,EAAE,CAAC;gBACd,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CACzD,IAAI,CAAC,QAAQ,CAAC,WAAW,EACzB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAC9B,CAAC;QACF,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,GAAG,CAAC,kBAAkB,CAC1B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAC7B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAC3B,kBAAkB,CACnB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,QAAQ,CAAC,GAAsB;IAC7C,oEAAoE;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,QAAa,EAAE,GAAoB;IAC9D,uDAAuD;IACvD,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,eAAe,CAAC,0BAA0B,CAAC,MAAM,CAAC,EAAE,CAChH,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,MAAM,UAAU,GAAG,QAAsC,CAAC;IAC1D,OAAO,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,gBAAgB,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,QAAQ;IACd,oBAAoB,EAAE,IAAI;CAC3B,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming event log for debugging and testing
|
|
3
|
+
* Records all events in JSONL format (one JSON object per line)
|
|
4
|
+
* Useful for observing runtime execution, testing, and debugging
|
|
5
|
+
*/
|
|
6
|
+
export declare class EventStream {
|
|
7
|
+
private filePath;
|
|
8
|
+
private isEnabled;
|
|
9
|
+
constructor(filePath?: string);
|
|
10
|
+
/**
|
|
11
|
+
* Enable event streaming to a file
|
|
12
|
+
*/
|
|
13
|
+
enable(filePath: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Log an event to the stream
|
|
16
|
+
*/
|
|
17
|
+
log(event: string, payload?: any, metadata?: {
|
|
18
|
+
namespace?: string;
|
|
19
|
+
resource?: string;
|
|
20
|
+
kind?: string;
|
|
21
|
+
name?: string;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Read all events from the stream as an array
|
|
25
|
+
* Useful for testing
|
|
26
|
+
*/
|
|
27
|
+
readAll(): Promise<Array<Record<string, any>>>;
|
|
28
|
+
/**
|
|
29
|
+
* Filter events by type
|
|
30
|
+
*/
|
|
31
|
+
getEventsByType(eventType: string): Promise<Array<Record<string, any>>>;
|
|
32
|
+
/**
|
|
33
|
+
* Get the file path for the event stream
|
|
34
|
+
*/
|
|
35
|
+
getFilePath(): string;
|
|
36
|
+
/**
|
|
37
|
+
* Check if event streaming is enabled
|
|
38
|
+
*/
|
|
39
|
+
isEnabledStream(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Disable event streaming
|
|
42
|
+
*/
|
|
43
|
+
disable(): void;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=event-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-stream.d.ts","sourceRoot":"","sources":["../src/event-stream.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAkB;gBAEvB,QAAQ,CAAC,EAAE,MAAM;IAK7B;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7C;;OAEG;IACG,GAAG,CACP,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,GAAG,EACb,QAAQ,CAAC,EAAE;QACT,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GACA,OAAO,CAAC,IAAI,CAAC;IAoBhB;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAoBpD;;OAEG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAKtC;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Streaming event log for debugging and testing
|
|
5
|
+
* Records all events in JSONL format (one JSON object per line)
|
|
6
|
+
* Useful for observing runtime execution, testing, and debugging
|
|
7
|
+
*/
|
|
8
|
+
export class EventStream {
|
|
9
|
+
constructor(filePath) {
|
|
10
|
+
this.isEnabled = false;
|
|
11
|
+
this.filePath = filePath || '';
|
|
12
|
+
this.isEnabled = !!filePath;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Enable event streaming to a file
|
|
16
|
+
*/
|
|
17
|
+
async enable(filePath) {
|
|
18
|
+
this.filePath = filePath;
|
|
19
|
+
this.isEnabled = true;
|
|
20
|
+
// Ensure directory exists
|
|
21
|
+
const dir = path.dirname(filePath);
|
|
22
|
+
if (dir !== '.' && dir !== '') {
|
|
23
|
+
await fs.mkdir(dir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
// Initialize file (truncate if exists)
|
|
26
|
+
await fs.writeFile(filePath, '', 'utf-8');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Log an event to the stream
|
|
30
|
+
*/
|
|
31
|
+
async log(event, payload, metadata) {
|
|
32
|
+
if (!this.isEnabled) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const logEntry = {
|
|
36
|
+
timestamp: new Date().toISOString(),
|
|
37
|
+
event,
|
|
38
|
+
payload,
|
|
39
|
+
...metadata,
|
|
40
|
+
};
|
|
41
|
+
try {
|
|
42
|
+
const line = JSON.stringify(logEntry) + '\n';
|
|
43
|
+
await fs.appendFile(this.filePath, line, 'utf-8');
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error('Failed to write event to stream:', error);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Read all events from the stream as an array
|
|
51
|
+
* Useful for testing
|
|
52
|
+
*/
|
|
53
|
+
async readAll() {
|
|
54
|
+
if (!this.isEnabled || !this.filePath) {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const content = await fs.readFile(this.filePath, 'utf-8');
|
|
59
|
+
if (!content.trim()) {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
return content
|
|
63
|
+
.trim()
|
|
64
|
+
.split('\n')
|
|
65
|
+
.map((line) => JSON.parse(line));
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error('Failed to read event stream:', error);
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Filter events by type
|
|
74
|
+
*/
|
|
75
|
+
async getEventsByType(eventType) {
|
|
76
|
+
const all = await this.readAll();
|
|
77
|
+
return all.filter((e) => e.event === eventType);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get the file path for the event stream
|
|
81
|
+
*/
|
|
82
|
+
getFilePath() {
|
|
83
|
+
return this.filePath;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if event streaming is enabled
|
|
87
|
+
*/
|
|
88
|
+
isEnabledStream() {
|
|
89
|
+
return this.isEnabled;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Disable event streaming
|
|
93
|
+
*/
|
|
94
|
+
disable() {
|
|
95
|
+
this.isEnabled = false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=event-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-stream.js","sourceRoot":"","sources":["../src/event-stream.ts"],"names":[],"mappings":"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"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type EventHandler = (payload?: any) => void | Promise<void>;
|
|
2
|
+
export declare class EventBus {
|
|
3
|
+
private handlers;
|
|
4
|
+
private validateEventName;
|
|
5
|
+
private matchesPattern;
|
|
6
|
+
on(event: string, handler: EventHandler): void;
|
|
7
|
+
once(event: string, handler: EventHandler): void;
|
|
8
|
+
off(event: string, handler: EventHandler): void;
|
|
9
|
+
emit(event: string, payload?: any, metadata?: any): Promise<void>;
|
|
10
|
+
hasHandlers(event: string): boolean;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAEA,KAAK,YAAY,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5D,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAA6C;IAE7D,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,cAAc;IA2BtB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAO9C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAShD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAYzC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvE,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAQpC"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export class EventBus {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.handlers = new Map();
|
|
4
|
+
}
|
|
5
|
+
validateEventName(event) {
|
|
6
|
+
if (event === "" ||
|
|
7
|
+
!/^(\*|[A-Za-z_][A-Za-z0-9_]*)(\.(\*|[A-Za-z_][A-Za-z0-9_]*))*$/.test(event)) {
|
|
8
|
+
throw new Error(`Invalid event name "${event}". Expected format "Text.Text" with no spaces.`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
matchesPattern(pattern, event) {
|
|
12
|
+
if (pattern === "*") {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
if (pattern === event) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
if (!pattern.includes("*")) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const patternParts = pattern.split(".");
|
|
22
|
+
const eventParts = event.split(".");
|
|
23
|
+
if (patternParts.length !== eventParts.length) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
for (let i = 0; i < patternParts.length; i += 1) {
|
|
27
|
+
const part = patternParts[i];
|
|
28
|
+
if (part === "*") {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (part !== eventParts[i]) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
on(event, handler) {
|
|
38
|
+
this.validateEventName(event);
|
|
39
|
+
const set = this.handlers.get(event) || new Set();
|
|
40
|
+
set.add(handler);
|
|
41
|
+
this.handlers.set(event, set);
|
|
42
|
+
}
|
|
43
|
+
once(event, handler) {
|
|
44
|
+
this.validateEventName(event);
|
|
45
|
+
const wrapper = async (payload) => {
|
|
46
|
+
this.off(event, wrapper);
|
|
47
|
+
await handler(payload);
|
|
48
|
+
};
|
|
49
|
+
this.on(event, wrapper);
|
|
50
|
+
}
|
|
51
|
+
off(event, handler) {
|
|
52
|
+
this.validateEventName(event);
|
|
53
|
+
const set = this.handlers.get(event);
|
|
54
|
+
if (!set) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
set.delete(handler);
|
|
58
|
+
if (set.size === 0) {
|
|
59
|
+
this.handlers.delete(event);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async emit(event, payload, metadata) {
|
|
63
|
+
const handlers = [];
|
|
64
|
+
for (const [pattern, set] of this.handlers.entries()) {
|
|
65
|
+
if (!this.matchesPattern(pattern, event)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
for (const handler of set) {
|
|
69
|
+
handlers.push(handler);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (handlers.length === 0) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const evt = { name: event, payload, metadata };
|
|
76
|
+
for (const handler of handlers) {
|
|
77
|
+
await handler(evt);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
hasHandlers(event) {
|
|
81
|
+
for (const [pattern, set] of this.handlers.entries()) {
|
|
82
|
+
if (set.size > 0 && this.matchesPattern(pattern, event)) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { RuntimeResource } from "@telorun/sdk";
|
|
2
|
+
import type { ResourceManifest } from "./types.js";
|
|
3
|
+
export declare function evaluateCel(expression: string, context: Record<string, any>): unknown;
|
|
4
|
+
export declare function expandValue(value: any, context: Record<string, any>): any;
|
|
5
|
+
export declare function resolveExpressionsInRegistry(registry: Map<string, Map<string, RuntimeResource>>, runtimeConfig: ResourceManifest | null): void;
|
|
6
|
+
/**
|
|
7
|
+
* Resolve all non-deferred CEL expressions in a resource manifest using the
|
|
8
|
+
* provided boot context. Expressions referencing `request.*` or `result.*` are
|
|
9
|
+
* left untouched — they will be resolved at request time by the runtime.
|
|
10
|
+
*
|
|
11
|
+
* Missing identifiers that are not deferred prefixes will throw, which is
|
|
12
|
+
* intentional: if a consumer's manifest references a boot-context identifier
|
|
13
|
+
* that is absent from the context, it is a configuration error.
|
|
14
|
+
*
|
|
15
|
+
* @param manifest - The raw (pre-creation) ResourceManifest
|
|
16
|
+
* @param context - CEL evaluation context built by BootContextRegistry.buildContext()
|
|
17
|
+
* @returns A new manifest object with all resolvable `${{ }}` templates replaced
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveManifestWithContext(manifest: ResourceManifest, context: Record<string, any>): ResourceManifest;
|
|
20
|
+
//# sourceMappingURL=expressions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../src/expressions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOnD,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAErF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAezE;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,EACnD,aAAa,EAAE,gBAAgB,GAAG,IAAI,GACrC,IAAI,CAuBN;AAsND;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,gBAAgB,CAOlB"}
|