@telorun/kernel 0.2.4 → 0.2.5
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/boot-context-registry.d.ts.map +1 -1
- package/dist/boot-context-registry.js +6 -6
- package/dist/boot-context-registry.js.map +1 -1
- package/dist/capabilities/capabilities/component.yaml +2 -1
- package/dist/capabilities/capabilities/executable.yaml +2 -1
- package/dist/capabilities/capabilities/handler.yaml +2 -1
- package/dist/capabilities/capabilities/listener.yaml +2 -1
- package/dist/capabilities/capabilities/provider.yaml +2 -1
- package/dist/capabilities/capabilities/template.yaml +2 -1
- package/dist/capabilities/capabilities/type.yaml +2 -1
- package/dist/capabilities/component.yaml +1 -1
- package/dist/capabilities/executable.yaml +1 -1
- package/dist/capabilities/handler.yaml +1 -1
- package/dist/capabilities/listener.yaml +1 -1
- package/dist/capabilities/provider.yaml +1 -1
- package/dist/capabilities/template.yaml +1 -1
- package/dist/capabilities/type.yaml +1 -1
- package/dist/controller-loader.d.ts +1 -1
- package/dist/controller-loader.d.ts.map +1 -1
- package/dist/controller-loader.js +4 -2
- package/dist/controller-loader.js.map +1 -1
- package/dist/controller-registry.d.ts +1 -2
- package/dist/controller-registry.d.ts.map +1 -1
- package/dist/controller-registry.js.map +1 -1
- package/dist/controllers/module/import-controller.d.ts +38 -0
- package/dist/controllers/module/import-controller.d.ts.map +1 -0
- package/dist/controllers/module/import-controller.js +119 -0
- package/dist/controllers/module/import-controller.js.map +1 -0
- package/dist/controllers/module/module-controller.d.ts +57 -11
- package/dist/controllers/module/module-controller.d.ts.map +1 -1
- package/dist/controllers/module/module-controller.js +46 -82
- package/dist/controllers/module/module-controller.js.map +1 -1
- package/dist/controllers/resource-definition/resource-definition-controller.d.ts.map +1 -1
- package/dist/controllers/resource-definition/resource-definition-controller.js +12 -4
- package/dist/controllers/resource-definition/resource-definition-controller.js.map +1 -1
- package/dist/evaluation-context.d.ts +91 -0
- package/dist/evaluation-context.d.ts.map +1 -0
- package/dist/evaluation-context.js +220 -0
- package/dist/evaluation-context.js.map +1 -0
- package/dist/execution-context.d.ts +13 -0
- package/dist/execution-context.d.ts.map +1 -0
- package/dist/execution-context.js +14 -0
- package/dist/execution-context.js.map +1 -0
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/kernel.d.ts +23 -31
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +212 -333
- package/dist/kernel.js.map +1 -1
- package/dist/loader.d.ts +2 -2
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +29 -9
- package/dist/loader.js.map +1 -1
- package/dist/manifest-adapters/local-file-adapter.d.ts.map +1 -1
- package/dist/manifest-adapters/local-file-adapter.js +21 -12
- package/dist/manifest-adapters/local-file-adapter.js.map +1 -1
- package/dist/manifest-schemas.d.ts +1 -25
- package/dist/manifest-schemas.d.ts.map +1 -1
- package/dist/manifest-schemas.js +3 -22
- package/dist/manifest-schemas.js.map +1 -1
- 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 +31 -0
- package/dist/module-context.d.ts.map +1 -0
- package/dist/module-context.js +67 -0
- package/dist/module-context.js.map +1 -0
- package/dist/registry.d.ts +1 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +3 -3
- package/dist/registry.js.map +1 -1
- package/dist/resource-context.d.ts +25 -5
- package/dist/resource-context.d.ts.map +1 -1
- package/dist/resource-context.js +74 -28
- package/dist/resource-context.js.map +1 -1
- package/dist/schema-valiator.d.ts.map +1 -1
- package/dist/schema-valiator.js +3 -1
- package/dist/schema-valiator.js.map +1 -1
- package/dist/snapshot-serializer.d.ts +1 -2
- package/dist/snapshot-serializer.d.ts.map +1 -1
- package/dist/snapshot-serializer.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +9 -6
- package/src/boot-context-registry.ts +169 -0
- package/src/capabilities/component.yaml +4 -0
- package/src/capabilities/executable.yaml +8 -0
- package/src/capabilities/handler.yaml +4 -0
- package/src/capabilities/listener.yaml +4 -0
- package/src/capabilities/provider.yaml +4 -0
- package/src/capabilities/template.yaml +4 -0
- package/src/capabilities/type.yaml +4 -0
- package/src/controller-loader.ts +298 -0
- package/src/controller-registry.ts +206 -0
- package/src/controllers/capability/capability-controller.ts +41 -0
- package/src/controllers/module/import-controller.ts +143 -0
- package/src/controllers/module/module-controller.ts +67 -0
- package/src/controllers/module/module.json +48 -0
- package/src/controllers/resource-definition/resource-definition-controller.ts +87 -0
- package/src/controllers/resource-definition/resource-definition.json +18 -0
- package/src/event-stream.ts +121 -0
- package/src/events.ts +99 -0
- package/src/index.ts +7 -0
- package/src/kernel.ts +558 -0
- package/src/loader.ts +245 -0
- package/src/manifest-adapters/http-adapter.ts +35 -0
- package/src/manifest-adapters/local-file-adapter.ts +69 -0
- package/src/manifest-adapters/manifest-adapter.ts +33 -0
- package/src/manifest-adapters/registry-adapter.ts +56 -0
- package/src/manifest-schemas.ts +49 -0
- package/src/registry.ts +137 -0
- package/src/resource-context.ts +266 -0
- package/src/resource-uri.ts +200 -0
- package/src/schema-valiator.ts +57 -0
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -109
- package/dist/cli.js.map +0 -1
- package/dist/expressions.d.ts +0 -20
- package/dist/expressions.d.ts.map +0 -1
- package/dist/expressions.js +0 -253
- package/dist/expressions.js.map +0 -1
- package/dist/template-definition.d.ts +0 -38
- package/dist/template-definition.d.ts.map +0 -1
- package/dist/template-definition.js +0 -26
- package/dist/template-definition.js.map +0 -1
- package/dist/template-expander.d.ts +0 -19
- package/dist/template-expander.d.ts.map +0 -1
- package/dist/template-expander.js +0 -425
- package/dist/template-expander.js.map +0 -1
- /package/{dist/src → src}/controllers/module/module.yaml +0 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Streaming event log for debugging and testing
|
|
6
|
+
* Records all events in JSONL format (one JSON object per line)
|
|
7
|
+
* Useful for observing runtime execution, testing, and debugging
|
|
8
|
+
*/
|
|
9
|
+
export class EventStream {
|
|
10
|
+
private filePath: string;
|
|
11
|
+
private isEnabled: boolean = false;
|
|
12
|
+
|
|
13
|
+
constructor(filePath?: string) {
|
|
14
|
+
this.filePath = filePath || '';
|
|
15
|
+
this.isEnabled = !!filePath;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Enable event streaming to a file
|
|
20
|
+
*/
|
|
21
|
+
async enable(filePath: string): Promise<void> {
|
|
22
|
+
this.filePath = filePath;
|
|
23
|
+
this.isEnabled = true;
|
|
24
|
+
|
|
25
|
+
// Ensure directory exists
|
|
26
|
+
const dir = path.dirname(filePath);
|
|
27
|
+
if (dir !== '.' && dir !== '') {
|
|
28
|
+
await fs.mkdir(dir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Initialize file (truncate if exists)
|
|
32
|
+
await fs.writeFile(filePath, '', 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Log an event to the stream
|
|
37
|
+
*/
|
|
38
|
+
async log(
|
|
39
|
+
event: string,
|
|
40
|
+
payload?: any,
|
|
41
|
+
metadata?: {
|
|
42
|
+
namespace?: string;
|
|
43
|
+
resource?: string;
|
|
44
|
+
kind?: string;
|
|
45
|
+
name?: string;
|
|
46
|
+
},
|
|
47
|
+
): Promise<void> {
|
|
48
|
+
if (!this.isEnabled) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const logEntry = {
|
|
53
|
+
timestamp: new Date().toISOString(),
|
|
54
|
+
event,
|
|
55
|
+
payload,
|
|
56
|
+
...metadata,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
const line = JSON.stringify(logEntry) + '\n';
|
|
61
|
+
await fs.appendFile(this.filePath, line, 'utf-8');
|
|
62
|
+
} catch (error) {
|
|
63
|
+
console.error('Failed to write event to stream:', error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Read all events from the stream as an array
|
|
69
|
+
* Useful for testing
|
|
70
|
+
*/
|
|
71
|
+
async readAll(): Promise<Array<Record<string, any>>> {
|
|
72
|
+
if (!this.isEnabled || !this.filePath) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
const content = await fs.readFile(this.filePath, 'utf-8');
|
|
78
|
+
if (!content.trim()) {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
return content
|
|
82
|
+
.trim()
|
|
83
|
+
.split('\n')
|
|
84
|
+
.map((line) => JSON.parse(line));
|
|
85
|
+
} catch (error) {
|
|
86
|
+
console.error('Failed to read event stream:', error);
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Filter events by type
|
|
93
|
+
*/
|
|
94
|
+
async getEventsByType(
|
|
95
|
+
eventType: string,
|
|
96
|
+
): Promise<Array<Record<string, any>>> {
|
|
97
|
+
const all = await this.readAll();
|
|
98
|
+
return all.filter((e) => e.event === eventType);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Get the file path for the event stream
|
|
103
|
+
*/
|
|
104
|
+
getFilePath(): string {
|
|
105
|
+
return this.filePath;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Check if event streaming is enabled
|
|
110
|
+
*/
|
|
111
|
+
isEnabledStream(): boolean {
|
|
112
|
+
return this.isEnabled;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Disable event streaming
|
|
117
|
+
*/
|
|
118
|
+
disable(): void {
|
|
119
|
+
this.isEnabled = false;
|
|
120
|
+
}
|
|
121
|
+
}
|
package/src/events.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { RuntimeEvent } from "@telorun/sdk";
|
|
2
|
+
|
|
3
|
+
type EventHandler = (payload?: any) => void | Promise<void>;
|
|
4
|
+
|
|
5
|
+
export class EventBus {
|
|
6
|
+
private handlers: Map<string, Set<EventHandler>> = new Map();
|
|
7
|
+
|
|
8
|
+
private validateEventName(event: string): void {
|
|
9
|
+
if (
|
|
10
|
+
event === "" ||
|
|
11
|
+
!/^(\*|[A-Za-z_][A-Za-z0-9_]*)(\.(\*|[A-Za-z_][A-Za-z0-9_]*))*$/.test(event)
|
|
12
|
+
) {
|
|
13
|
+
throw new Error(`Invalid event name "${event}". Expected format "Text.Text" with no spaces.`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
private matchesPattern(pattern: string, event: string): boolean {
|
|
18
|
+
if (pattern === "*") {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
if (pattern === event) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
if (!pattern.includes("*")) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const patternParts = pattern.split(".");
|
|
28
|
+
const eventParts = event.split(".");
|
|
29
|
+
if (patternParts.length !== eventParts.length) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
for (let i = 0; i < patternParts.length; i += 1) {
|
|
33
|
+
const part = patternParts[i];
|
|
34
|
+
if (part === "*") {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (part !== eventParts[i]) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
on(event: string, handler: EventHandler): void {
|
|
45
|
+
this.validateEventName(event);
|
|
46
|
+
const set = this.handlers.get(event) || new Set();
|
|
47
|
+
set.add(handler);
|
|
48
|
+
this.handlers.set(event, set);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
once(event: string, handler: EventHandler): void {
|
|
52
|
+
this.validateEventName(event);
|
|
53
|
+
const wrapper: EventHandler = async (payload?: any) => {
|
|
54
|
+
this.off(event, wrapper);
|
|
55
|
+
await handler(payload);
|
|
56
|
+
};
|
|
57
|
+
this.on(event, wrapper);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
off(event: string, handler: EventHandler): void {
|
|
61
|
+
this.validateEventName(event);
|
|
62
|
+
const set = this.handlers.get(event);
|
|
63
|
+
if (!set) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
set.delete(handler);
|
|
67
|
+
if (set.size === 0) {
|
|
68
|
+
this.handlers.delete(event);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async emit(event: string, payload?: any, metadata?: any): Promise<void> {
|
|
73
|
+
const handlers: EventHandler[] = [];
|
|
74
|
+
for (const [pattern, set] of this.handlers.entries()) {
|
|
75
|
+
if (!this.matchesPattern(pattern, event)) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
for (const handler of set) {
|
|
79
|
+
handlers.push(handler);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (handlers.length === 0) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const evt: RuntimeEvent = { name: event, payload, metadata };
|
|
86
|
+
for (const handler of handlers) {
|
|
87
|
+
await handler(evt);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
hasHandlers(event: string): boolean {
|
|
92
|
+
for (const [pattern, set] of this.handlers.entries()) {
|
|
93
|
+
if (set.size > 0 && this.matchesPattern(pattern, event)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { ControllerRegistry } from "./controller-registry.js";
|
|
2
|
+
export { EventStream } from "./event-stream.js";
|
|
3
|
+
export { Kernel } from "./kernel.js";
|
|
4
|
+
export { Loader } from "./loader.js";
|
|
5
|
+
export { ManifestRegistry as Registry } from "./registry.js";
|
|
6
|
+
export { ResourceURI } from "./resource-uri.js";
|
|
7
|
+
|