@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.
Files changed (122) hide show
  1. package/LICENSE +17 -0
  2. package/dist/boot-context-registry.d.ts +47 -0
  3. package/dist/boot-context-registry.d.ts.map +1 -0
  4. package/dist/boot-context-registry.js +131 -0
  5. package/dist/boot-context-registry.js.map +1 -0
  6. package/dist/capabilities/capabilities/component.yaml +3 -0
  7. package/dist/capabilities/capabilities/executable.yaml +7 -0
  8. package/dist/capabilities/capabilities/handler.yaml +3 -0
  9. package/dist/capabilities/capabilities/listener.yaml +3 -0
  10. package/dist/capabilities/capabilities/provider.yaml +3 -0
  11. package/dist/capabilities/capabilities/template.yaml +3 -0
  12. package/dist/capabilities/capabilities/type.yaml +3 -0
  13. package/dist/capabilities/component.yaml +3 -0
  14. package/dist/capabilities/executable.yaml +7 -0
  15. package/dist/capabilities/handler.yaml +3 -0
  16. package/dist/capabilities/listener.yaml +3 -0
  17. package/dist/capabilities/provider.yaml +3 -0
  18. package/dist/capabilities/template.yaml +3 -0
  19. package/dist/capabilities/type.yaml +3 -0
  20. package/dist/cli.d.ts +3 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +109 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/controller-loader.d.ts +24 -0
  25. package/dist/controller-loader.d.ts.map +1 -0
  26. package/dist/controller-loader.js +265 -0
  27. package/dist/controller-loader.js.map +1 -0
  28. package/dist/controller-registry.d.ts +56 -0
  29. package/dist/controller-registry.d.ts.map +1 -0
  30. package/dist/controller-registry.js +169 -0
  31. package/dist/controller-registry.js.map +1 -0
  32. package/dist/controllers/capability/capability-controller.d.ts +37 -0
  33. package/dist/controllers/capability/capability-controller.d.ts.map +1 -0
  34. package/dist/controllers/capability/capability-controller.js +30 -0
  35. package/dist/controllers/capability/capability-controller.js.map +1 -0
  36. package/dist/controllers/module/module-controller.d.ts +16 -0
  37. package/dist/controllers/module/module-controller.d.ts.map +1 -0
  38. package/dist/controllers/module/module-controller.js +95 -0
  39. package/dist/controllers/module/module-controller.js.map +1 -0
  40. package/dist/controllers/module/module.json +48 -0
  41. package/dist/controllers/resource-definition/resource-definition-controller.d.ts +33 -0
  42. package/dist/controllers/resource-definition/resource-definition-controller.d.ts.map +1 -0
  43. package/dist/controllers/resource-definition/resource-definition-controller.js +44 -0
  44. package/dist/controllers/resource-definition/resource-definition-controller.js.map +1 -0
  45. package/dist/event-stream.d.ts +45 -0
  46. package/dist/event-stream.d.ts.map +1 -0
  47. package/dist/event-stream.js +98 -0
  48. package/dist/event-stream.js.map +1 -0
  49. package/dist/events.d.ts +13 -0
  50. package/dist/events.d.ts.map +1 -0
  51. package/dist/events.js +89 -0
  52. package/dist/events.js.map +1 -0
  53. package/dist/expressions.d.ts +20 -0
  54. package/dist/expressions.d.ts.map +1 -0
  55. package/dist/expressions.js +253 -0
  56. package/dist/expressions.js.map +1 -0
  57. package/dist/index.d.ts +10 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +9 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/kernel.d.ts +113 -0
  62. package/dist/kernel.d.ts.map +1 -0
  63. package/dist/kernel.js +558 -0
  64. package/dist/kernel.js.map +1 -0
  65. package/dist/loader.d.ts +17 -0
  66. package/dist/loader.d.ts.map +1 -0
  67. package/dist/loader.js +189 -0
  68. package/dist/loader.js.map +1 -0
  69. package/dist/manifest-adapters/http-adapter.d.ts +8 -0
  70. package/dist/manifest-adapters/http-adapter.d.ts.map +1 -0
  71. package/dist/manifest-adapters/http-adapter.js +29 -0
  72. package/dist/manifest-adapters/http-adapter.js.map +1 -0
  73. package/dist/manifest-adapters/local-file-adapter.d.ts +11 -0
  74. package/dist/manifest-adapters/local-file-adapter.d.ts.map +1 -0
  75. package/dist/manifest-adapters/local-file-adapter.js +51 -0
  76. package/dist/manifest-adapters/local-file-adapter.js.map +1 -0
  77. package/dist/manifest-adapters/manifest-adapter.d.ts +33 -0
  78. package/dist/manifest-adapters/manifest-adapter.d.ts.map +1 -0
  79. package/dist/manifest-adapters/manifest-adapter.js +2 -0
  80. package/dist/manifest-adapters/manifest-adapter.js.map +1 -0
  81. package/dist/manifest-adapters/registry-adapter.d.ts +9 -0
  82. package/dist/manifest-adapters/registry-adapter.d.ts.map +1 -0
  83. package/dist/manifest-adapters/registry-adapter.js +46 -0
  84. package/dist/manifest-adapters/registry-adapter.js.map +1 -0
  85. package/dist/manifest-schemas.d.ts +66 -0
  86. package/dist/manifest-schemas.d.ts.map +1 -0
  87. package/dist/manifest-schemas.js +55 -0
  88. package/dist/manifest-schemas.js.map +1 -0
  89. package/dist/registry.d.ts +41 -0
  90. package/dist/registry.d.ts.map +1 -0
  91. package/dist/registry.js +122 -0
  92. package/dist/registry.js.map +1 -0
  93. package/dist/resource-context.d.ts +48 -0
  94. package/dist/resource-context.d.ts.map +1 -0
  95. package/dist/resource-context.js +146 -0
  96. package/dist/resource-context.js.map +1 -0
  97. package/dist/resource-uri.d.ts +80 -0
  98. package/dist/resource-uri.d.ts.map +1 -0
  99. package/dist/resource-uri.js +160 -0
  100. package/dist/resource-uri.js.map +1 -0
  101. package/dist/schema-valiator.d.ts +9 -0
  102. package/dist/schema-valiator.d.ts.map +1 -0
  103. package/dist/schema-valiator.js +43 -0
  104. package/dist/schema-valiator.js.map +1 -0
  105. package/dist/snapshot-serializer.d.ts +63 -0
  106. package/dist/snapshot-serializer.d.ts.map +1 -0
  107. package/dist/snapshot-serializer.js +164 -0
  108. package/dist/snapshot-serializer.js.map +1 -0
  109. package/dist/src/controllers/module/module.yaml +32 -0
  110. package/dist/template-definition.d.ts +38 -0
  111. package/dist/template-definition.d.ts.map +1 -0
  112. package/dist/template-definition.js +26 -0
  113. package/dist/template-definition.js.map +1 -0
  114. package/dist/template-expander.d.ts +19 -0
  115. package/dist/template-expander.d.ts.map +1 -0
  116. package/dist/template-expander.js +425 -0
  117. package/dist/template-expander.js.map +1 -0
  118. package/dist/types.d.ts +62 -0
  119. package/dist/types.d.ts.map +1 -0
  120. package/dist/types.js +8 -0
  121. package/dist/types.js.map +1 -0
  122. package/package.json +42 -0
@@ -0,0 +1,122 @@
1
+ import { ResourceURI } from "./resource-uri.js";
2
+ import { RuntimeError } from "./types.js";
3
+ /**
4
+ * Registry: Indexes resources by composite key of Kind and Name
5
+ * Maintains URI-based lookup for tracking resource origins and lineage
6
+ */
7
+ export class ManifestRegistry {
8
+ constructor() {
9
+ this.resources = new Map();
10
+ this.kindInheritance = new Map(); // derivedKind -> parentKind
11
+ this.uriIndex = new Map(); // URI -> Resource
12
+ this.sourceIndex = new Map(); // source path -> Resources
13
+ this.depthIndex = new Map(); // generation depth -> Resources
14
+ }
15
+ register(resource) {
16
+ const { kind, metadata } = resource;
17
+ const { name } = metadata;
18
+ console.log("Registering resource:", kind, name);
19
+ if (!this.resources.has(kind)) {
20
+ this.resources.set(kind, new Map());
21
+ }
22
+ const kindMap = this.resources.get(kind);
23
+ if (kindMap.has(name)) {
24
+ throw new RuntimeError("ERR_DUPLICATE_RESOURCE", `Duplicate resource: ${kind}.${name}`);
25
+ }
26
+ kindMap.set(name, resource);
27
+ // Index by URI if available
28
+ if (metadata.uri) {
29
+ this.uriIndex.set(metadata.uri, resource);
30
+ // Index by source file/path
31
+ try {
32
+ const uri = ResourceURI.parse(metadata.uri);
33
+ if (uri.isFileSource()) {
34
+ const sourcePath = uri.path;
35
+ if (!this.sourceIndex.has(sourcePath)) {
36
+ this.sourceIndex.set(sourcePath, []);
37
+ }
38
+ this.sourceIndex.get(sourcePath).push(resource);
39
+ }
40
+ }
41
+ catch {
42
+ // URI parsing failed, skip indexing
43
+ }
44
+ }
45
+ // Index by generation depth
46
+ const depth = metadata.generationDepth ?? 0;
47
+ if (!this.depthIndex.has(depth)) {
48
+ this.depthIndex.set(depth, []);
49
+ }
50
+ this.depthIndex.get(depth).push(resource);
51
+ // Check if this is a Runtime.KindDefinition that creates a new kind
52
+ // if (kind === 'Runtime.KindDefinition') {
53
+ // const newKind = name;
54
+ // const parentKind = resource?.extends;
55
+ // if (parentKind) {
56
+ // this.kindInheritance.set(newKind, parentKind);
57
+ // }
58
+ // }
59
+ }
60
+ getParentKind(kind) {
61
+ return this.kindInheritance.get(kind);
62
+ }
63
+ resolveKindChain(kind) {
64
+ const chain = [kind];
65
+ let current = kind;
66
+ while (this.kindInheritance.has(current)) {
67
+ current = this.kindInheritance.get(current);
68
+ chain.push(current);
69
+ }
70
+ return chain;
71
+ }
72
+ get(kind, name) {
73
+ return this.resources.get(kind)?.get(name);
74
+ }
75
+ getByKind(kind) {
76
+ const kindMap = this.resources.get(kind);
77
+ return kindMap ? Array.from(kindMap.values()) : [];
78
+ }
79
+ /**
80
+ * Get resource by its URI
81
+ */
82
+ getByUri(uri) {
83
+ return this.uriIndex.get(uri);
84
+ }
85
+ /**
86
+ * Get all resources from a specific source file
87
+ */
88
+ getBySourceFile(sourceFilePath) {
89
+ return this.sourceIndex.get(sourceFilePath) ?? [];
90
+ }
91
+ /**
92
+ * Get all resources at a specific generation depth
93
+ * 0 = directly from files, 1+ = template-generated
94
+ */
95
+ getByGenerationDepth(depth) {
96
+ return this.depthIndex.get(depth) ?? [];
97
+ }
98
+ /**
99
+ * Get all template-generated resources (depth > 0)
100
+ */
101
+ getTemplateGenerated() {
102
+ const results = [];
103
+ for (const [depth, resources] of this.depthIndex) {
104
+ if (depth > 0) {
105
+ results.push(...resources);
106
+ }
107
+ }
108
+ return results;
109
+ }
110
+ /**
111
+ * Get all directly-loaded resources (depth = 0)
112
+ */
113
+ getDirectlyLoaded() {
114
+ return this.depthIndex.get(0) ?? [];
115
+ }
116
+ getAll() {
117
+ return Array.from(this.resources.values())
118
+ .map((kindMap) => Array.from(kindMap.values()))
119
+ .flat();
120
+ }
121
+ }
122
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAoB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAA7B;QACU,cAAS,GAA+C,IAAI,GAAG,EAAE,CAAC;QAClE,oBAAe,GAAwB,IAAI,GAAG,EAAE,CAAC,CAAC,4BAA4B;QAC9E,aAAQ,GAAkC,IAAI,GAAG,EAAE,CAAC,CAAC,kBAAkB;QACvE,gBAAW,GAAoC,IAAI,GAAG,EAAE,CAAC,CAAC,2BAA2B;QACrF,eAAU,GAAoC,IAAI,GAAG,EAAE,CAAC,CAAC,gCAAgC;IA4HnG,CAAC;IA1HC,QAAQ,CAAC,QAAyB;QAChC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;QACpC,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QAE1C,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,YAAY,CAAC,wBAAwB,EAAE,uBAAuB,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAE5B,4BAA4B;QAC5B,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAE1C,4BAA4B;YAC5B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC5C,IAAI,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;oBACvB,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC;oBAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;oBACvC,CAAC;oBACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE3C,oEAAoE;QACpE,2CAA2C;QAC3C,0BAA0B;QAC1B,0CAA0C;QAC1C,sBAAsB;QACtB,qDAAqD;QACrD,MAAM;QACN,IAAI;IACN,CAAC;IAED,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,gBAAgB,CAAC,IAAY;QAC3B,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,IAAY;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAW;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,cAAsB;QACpC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,oBAAoB,CAAC,KAAa;QAChC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACjD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;aACvC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;aAC9C,IAAI,EAAE,CAAC;IACZ,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import { ResourceContext, RuntimeResource } from "@telorun/sdk";
2
+ import { Kernel } from "./kernel.js";
3
+ import { SchemaValidator } from "./schema-valiator.js";
4
+ export declare class ResourceContextImpl implements ResourceContext {
5
+ readonly kernel: Kernel;
6
+ private readonly metadata;
7
+ private readonly validator;
8
+ private readonly resourceKey?;
9
+ constructor(kernel: Kernel, metadata: Record<string, any>, validator?: SchemaValidator, resourceKey?: string | undefined);
10
+ createSchemaValidator(schema: any): import("@telorun/sdk").DataValidator;
11
+ registerSchema(name: string, schema: object): void;
12
+ lookupSchema(name: string): object | undefined;
13
+ validateSchema(value: any, schema: any): void;
14
+ invoke(kind: string, name: string, ...args: any[]): Promise<any>;
15
+ registerManifest(resource: any): void;
16
+ /**
17
+ * Resolves a resource into a normalized {kind, name} reference.
18
+ * If the resource contains a definition (kind + properties), registers it as a manifest.
19
+ * Returns the normalized reference in all cases.
20
+ *
21
+ * @param resource Resource definition or reference object with 'kind' property
22
+ * @param resourceName Optional name to assign if not present in resource
23
+ * @returns Normalized {kind, name} reference
24
+ * @throws RuntimeError if 'kind' is missing
25
+ */
26
+ resolveChildren(resource: any, resourceName?: string): {
27
+ kind: string;
28
+ name: string;
29
+ };
30
+ teardownResource(kind: string, name: string): Promise<void>;
31
+ getResources(kind: string): RuntimeResource[];
32
+ getResourcesByName(kind: string, name: string): RuntimeResource | null;
33
+ registerController(moduleName: string, kindName: string, controllerInstance: any): Promise<void>;
34
+ registerDefinition(def: any): void;
35
+ registerCapability(name: string, schema?: Record<string, any>): void;
36
+ isCapabilityRegistered(name: string): boolean;
37
+ getCapabilitySchema(name: string): Record<string, any> | null | undefined;
38
+ on(event: string, handler: (payload?: any) => void | Promise<void>): void;
39
+ once(event: string, handler: (payload?: any) => void | Promise<void>): void;
40
+ off(event: string, handler: (payload?: any) => void | Promise<void>): void;
41
+ emit(event: string, payload?: any): Promise<void>;
42
+ acquireHold(reason?: string): () => void;
43
+ requestExit(code: number): void;
44
+ evaluateCel(expression: string, context: Record<string, any>): unknown;
45
+ expandValue(value: any, context: Record<string, any>): any;
46
+ emitEvent(event: string, payload?: any): Promise<void>;
47
+ }
48
+ //# sourceMappingURL=resource-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-context.d.ts","sourceRoot":"","sources":["../src/resource-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,146 @@
1
+ import { NoopValidator } from "@telorun/sdk";
2
+ import AjvModule from "ajv";
3
+ import { expandValue } from "./expressions.js";
4
+ import { formatAjvErrors } from "./manifest-schemas.js";
5
+ import { SchemaValidator } from "./schema-valiator.js";
6
+ import { RuntimeError } from "./types.js";
7
+ const Ajv = AjvModule.default ?? AjvModule;
8
+ export class ResourceContextImpl {
9
+ constructor(kernel, metadata, validator = new SchemaValidator(), resourceKey) {
10
+ this.kernel = kernel;
11
+ this.metadata = metadata;
12
+ this.validator = validator;
13
+ this.resourceKey = resourceKey;
14
+ }
15
+ createSchemaValidator(schema) {
16
+ if (!schema) {
17
+ return new NoopValidator();
18
+ }
19
+ return this.validator.compile(schema);
20
+ }
21
+ registerSchema(name, schema) {
22
+ this.validator.addSchema(name, schema);
23
+ }
24
+ lookupSchema(name) {
25
+ return this.validator.getSchema(name);
26
+ }
27
+ validateSchema(value, schema) {
28
+ const ajv = new Ajv();
29
+ const validate = ajv.compile("type" in schema && typeof schema.type === "string"
30
+ ? schema
31
+ : {
32
+ type: "object",
33
+ properties: schema,
34
+ required: Object.keys(schema),
35
+ additionalProperties: false,
36
+ });
37
+ const isValid = validate(value);
38
+ if (!isValid) {
39
+ throw new RuntimeError("ERR_INVALID_VALUE", `[${this.metadata.name}] Invalid value passed: ${JSON.stringify(value)}. Error: ${formatAjvErrors(validate.errors)}`);
40
+ }
41
+ }
42
+ invoke(kind, name, ...args) {
43
+ const parts = kind.split(".");
44
+ if (parts.length > 2) {
45
+ return this.kernel.invoke(parts[0], parts.slice(1).join("."), name, ...args);
46
+ }
47
+ return this.kernel.invoke(this.metadata.module, kind, name, ...args);
48
+ }
49
+ registerManifest(resource) {
50
+ if (this.resourceKey) {
51
+ this.kernel.registerChildManifest(this.resourceKey, resource);
52
+ }
53
+ else {
54
+ this.kernel.registerManifest(resource);
55
+ }
56
+ }
57
+ /**
58
+ * Resolves a resource into a normalized {kind, name} reference.
59
+ * If the resource contains a definition (kind + properties), registers it as a manifest.
60
+ * Returns the normalized reference in all cases.
61
+ *
62
+ * @param resource Resource definition or reference object with 'kind' property
63
+ * @param resourceName Optional name to assign if not present in resource
64
+ * @returns Normalized {kind, name} reference
65
+ * @throws RuntimeError if 'kind' is missing
66
+ */
67
+ resolveChildren(resource, resourceName) {
68
+ if (!resource || typeof resource !== "object") {
69
+ throw new RuntimeError("ERR_INVALID_VALUE", `[${this.metadata.name}] Resource must be an object. Got: ${typeof resource}`);
70
+ }
71
+ if (!resource.kind) {
72
+ throw new RuntimeError("ERR_INVALID_VALUE", `[${this.metadata.name}] Resource must have 'kind' property. Got: ${JSON.stringify(resource)}`);
73
+ }
74
+ const kind = resource.kind;
75
+ const name = resource.name ?? resourceName ?? "Unnamed";
76
+ // If resource has properties beyond kind/name, it's a definition - register it
77
+ const definitionKeys = Object.keys(resource).filter((k) => k !== "kind" && k !== "name" && k !== "metadata");
78
+ if (definitionKeys.length > 0) {
79
+ this.registerManifest({
80
+ ...resource,
81
+ metadata: {
82
+ name,
83
+ module: this.metadata.module,
84
+ ...resource.metadata,
85
+ },
86
+ });
87
+ }
88
+ return { kind, name };
89
+ }
90
+ teardownResource(kind, name) {
91
+ const parts = kind.split(".");
92
+ if (parts.length > 2) {
93
+ return this.kernel.teardownResource(parts[0], parts.slice(1).join("."), name);
94
+ }
95
+ return this.kernel.teardownResource(this.metadata.module, kind, name);
96
+ }
97
+ getResources(kind) {
98
+ return this.kernel.getResourcesByKind(kind);
99
+ }
100
+ getResourcesByName(kind, name) {
101
+ return this.kernel.getResourceByName(this.metadata.module, kind, name);
102
+ }
103
+ async registerController(moduleName, kindName, controllerInstance) {
104
+ await this.kernel.registerController(moduleName, kindName, controllerInstance);
105
+ }
106
+ registerDefinition(def) {
107
+ this.kernel.registerResourceDefinition(def);
108
+ }
109
+ registerCapability(name, schema) {
110
+ this.kernel.registerCapability(name, schema);
111
+ }
112
+ isCapabilityRegistered(name) {
113
+ return this.kernel.isCapabilityRegistered(name);
114
+ }
115
+ getCapabilitySchema(name) {
116
+ return this.kernel.getCapabilitySchema(name);
117
+ }
118
+ on(event, handler) {
119
+ this.kernel.on(event, handler);
120
+ }
121
+ once(event, handler) {
122
+ throw new Error("Method once not implemented.");
123
+ }
124
+ off(event, handler) {
125
+ throw new Error("Method off not implemented.");
126
+ }
127
+ async emit(event, payload) {
128
+ await this.kernel.emitRuntimeEvent(event, payload);
129
+ }
130
+ acquireHold(reason) {
131
+ return this.kernel.acquireHold(reason);
132
+ }
133
+ requestExit(code) {
134
+ this.kernel.requestExit(code);
135
+ }
136
+ evaluateCel(expression, context) {
137
+ throw new Error("Method evaluateCel not implemented.");
138
+ }
139
+ expandValue(value, context) {
140
+ return expandValue(value, context);
141
+ }
142
+ async emitEvent(event, payload) {
143
+ await this.kernel.emitRuntimeEvent(event, payload);
144
+ }
145
+ }
146
+ //# sourceMappingURL=resource-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-context.js","sourceRoot":"","sources":["../src/resource-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * ResourceURI: Parses and builds standard URIs for resources
3
+ *
4
+ * Format: scheme://host/path#kind.name[/kind.child/kind.child/...]
5
+ * Examples:
6
+ * file:///path/to/file.yaml#Http.Server.Example
7
+ * http://localhost/template/ApiServer#Http.Server/api-us-east
8
+ * https://example.com/resources.yaml#Data.Type.User
9
+ */
10
+ export declare class ResourceURI {
11
+ readonly scheme: string;
12
+ readonly host: string;
13
+ readonly path: string;
14
+ readonly fragment: string;
15
+ private constructor();
16
+ /**
17
+ * Parse a URI string into components
18
+ * Format: scheme://host/path#fragment
19
+ */
20
+ static parse(uri: string): ResourceURI;
21
+ /**
22
+ * Build a file:// URI from an absolute file path and kind.name
23
+ */
24
+ static fromFile(absolutePath: string, kind: string, name: string): ResourceURI;
25
+ /**
26
+ * Build a template URI from template definition name and kind.name
27
+ * Used for resources generated by template expansion
28
+ */
29
+ static fromTemplate(templateDefinitionName: string, kind: string, resourceId: string): ResourceURI;
30
+ /**
31
+ * Create a child URI by appending kind.name to the fragment path
32
+ * Used when a template generates child resources
33
+ */
34
+ withChild(kind: string, name: string): ResourceURI;
35
+ /**
36
+ * Get the full URI as a string
37
+ */
38
+ toString(): string;
39
+ /**
40
+ * Get just the resource identifier part (kind.name)
41
+ */
42
+ getResourceId(): string;
43
+ /**
44
+ * Get the kind and name from the last fragment component
45
+ */
46
+ getResourceKindName(): {
47
+ kind: string;
48
+ name: string;
49
+ };
50
+ /**
51
+ * Get the full fragment path as array of kind.name pairs
52
+ */
53
+ getFragmentPath(): string[];
54
+ /**
55
+ * Check if this URI is from a file source
56
+ */
57
+ isFileSource(): boolean;
58
+ /**
59
+ * Check if this URI is from a template source
60
+ */
61
+ isTemplateSource(): boolean;
62
+ /**
63
+ * Check if this URI represents a generated/nested resource (has multiple fragment components)
64
+ */
65
+ isNested(): boolean;
66
+ /**
67
+ * Get the depth of nesting (number of / in fragment)
68
+ */
69
+ getDepth(): number;
70
+ /**
71
+ * Get the parent URI by removing the last fragment component
72
+ * Returns undefined if already at root level
73
+ */
74
+ getParent(): ResourceURI | undefined;
75
+ /**
76
+ * Get template name if this is a template-generated resource
77
+ */
78
+ getTemplateName(): string | undefined;
79
+ }
80
+ //# sourceMappingURL=resource-uri.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-uri.d.ts","sourceRoot":"","sources":["../src/resource-uri.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,OAAO;IAYP;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IA4CtC;;OAEG;IACH,MAAM,CAAC,QAAQ,CACb,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,WAAW;IAMd;;;OAGG;IACH,MAAM,CAAC,YAAY,CACjB,sBAAsB,EAAE,MAAM,EAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,WAAW;IAMd;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW;IAKlD;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,aAAa,IAAI,MAAM;IAKvB;;OAEG;IACH,mBAAmB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAYrD;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAI3B;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;;OAGG;IACH,SAAS,IAAI,WAAW,GAAG,SAAS;IASpC;;OAEG;IACH,eAAe,IAAI,MAAM,GAAG,SAAS;CAOtC"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * ResourceURI: Parses and builds standard URIs for resources
3
+ *
4
+ * Format: scheme://host/path#kind.name[/kind.child/kind.child/...]
5
+ * Examples:
6
+ * file:///path/to/file.yaml#Http.Server.Example
7
+ * http://localhost/template/ApiServer#Http.Server/api-us-east
8
+ * https://example.com/resources.yaml#Data.Type.User
9
+ */
10
+ export class ResourceURI {
11
+ constructor(scheme, host, path, fragment) {
12
+ this.scheme = scheme;
13
+ this.host = host;
14
+ this.path = path;
15
+ this.fragment = fragment;
16
+ }
17
+ /**
18
+ * Parse a URI string into components
19
+ * Format: scheme://host/path#fragment
20
+ */
21
+ static parse(uri) {
22
+ const schemeMatch = uri.match(/^([a-z][a-z0-9+.-]*):\/\//);
23
+ if (!schemeMatch) {
24
+ throw new Error(`Invalid URI format: ${uri}. Expected "scheme://host/path#fragment"`);
25
+ }
26
+ const scheme = schemeMatch[1];
27
+ const rest = uri.slice(schemeMatch[0].length);
28
+ // Split host/path from fragment
29
+ const hashIndex = rest.indexOf('#');
30
+ if (hashIndex === -1) {
31
+ throw new Error(`Invalid URI format: ${uri}. Missing fragment after "#"`);
32
+ }
33
+ const hostPath = rest.slice(0, hashIndex);
34
+ const fragment = rest.slice(hashIndex + 1);
35
+ if (!fragment) {
36
+ throw new Error(`Invalid URI format: ${uri}. Fragment cannot be empty`);
37
+ }
38
+ // Split host from path
39
+ const pathIndex = hostPath.indexOf('/');
40
+ let host;
41
+ let path;
42
+ if (pathIndex === -1) {
43
+ host = hostPath;
44
+ path = '';
45
+ }
46
+ else {
47
+ host = hostPath.slice(0, pathIndex);
48
+ path = hostPath.slice(pathIndex);
49
+ }
50
+ if (!host) {
51
+ throw new Error(`Invalid URI format: ${uri}. Host cannot be empty`);
52
+ }
53
+ return new ResourceURI(scheme, host, path, fragment);
54
+ }
55
+ /**
56
+ * Build a file:// URI from an absolute file path and kind.name
57
+ */
58
+ static fromFile(absolutePath, kind, name) {
59
+ const normalizedPath = absolutePath.replace(/\\/g, '/');
60
+ const fragment = `${kind}.${name}`;
61
+ return new ResourceURI('file', 'localhost', normalizedPath, fragment);
62
+ }
63
+ /**
64
+ * Build a template URI from template definition name and kind.name
65
+ * Used for resources generated by template expansion
66
+ */
67
+ static fromTemplate(templateDefinitionName, kind, resourceId) {
68
+ const path = `/template/${templateDefinitionName}`;
69
+ const fragment = `${kind}.${resourceId}`;
70
+ return new ResourceURI('http', 'localhost', path, fragment);
71
+ }
72
+ /**
73
+ * Create a child URI by appending kind.name to the fragment path
74
+ * Used when a template generates child resources
75
+ */
76
+ withChild(kind, name) {
77
+ const newFragment = `${this.fragment}/${kind}.${name}`;
78
+ return new ResourceURI(this.scheme, this.host, this.path, newFragment);
79
+ }
80
+ /**
81
+ * Get the full URI as a string
82
+ */
83
+ toString() {
84
+ return `${this.scheme}://${this.host}${this.path}#${this.fragment}`;
85
+ }
86
+ /**
87
+ * Get just the resource identifier part (kind.name)
88
+ */
89
+ getResourceId() {
90
+ const parts = this.fragment.split('/');
91
+ return parts[parts.length - 1];
92
+ }
93
+ /**
94
+ * Get the kind and name from the last fragment component
95
+ */
96
+ getResourceKindName() {
97
+ const resourceId = this.getResourceId();
98
+ const lastDot = resourceId.lastIndexOf('.');
99
+ if (lastDot === -1) {
100
+ throw new Error(`Invalid resource identifier in URI: ${this.toString()}`);
101
+ }
102
+ return {
103
+ kind: resourceId.slice(0, lastDot),
104
+ name: resourceId.slice(lastDot + 1),
105
+ };
106
+ }
107
+ /**
108
+ * Get the full fragment path as array of kind.name pairs
109
+ */
110
+ getFragmentPath() {
111
+ return this.fragment.split('/');
112
+ }
113
+ /**
114
+ * Check if this URI is from a file source
115
+ */
116
+ isFileSource() {
117
+ return this.scheme === 'file';
118
+ }
119
+ /**
120
+ * Check if this URI is from a template source
121
+ */
122
+ isTemplateSource() {
123
+ return this.scheme === 'http' && this.path.startsWith('/template/');
124
+ }
125
+ /**
126
+ * Check if this URI represents a generated/nested resource (has multiple fragment components)
127
+ */
128
+ isNested() {
129
+ return this.fragment.includes('/');
130
+ }
131
+ /**
132
+ * Get the depth of nesting (number of / in fragment)
133
+ */
134
+ getDepth() {
135
+ return this.fragment.split('/').length - 1;
136
+ }
137
+ /**
138
+ * Get the parent URI by removing the last fragment component
139
+ * Returns undefined if already at root level
140
+ */
141
+ getParent() {
142
+ const parts = this.fragment.split('/');
143
+ if (parts.length === 1) {
144
+ return undefined;
145
+ }
146
+ const parentFragment = parts.slice(0, -1).join('/');
147
+ return new ResourceURI(this.scheme, this.host, this.path, parentFragment);
148
+ }
149
+ /**
150
+ * Get template name if this is a template-generated resource
151
+ */
152
+ getTemplateName() {
153
+ if (!this.isTemplateSource()) {
154
+ return undefined;
155
+ }
156
+ const match = this.path.match(/^\/template\/(.+)$/);
157
+ return match ? match[1] : undefined;
158
+ }
159
+ }
160
+ //# sourceMappingURL=resource-uri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-uri.js","sourceRoot":"","sources":["../src/resource-uri.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { DataValidator } from "@telorun/sdk";
2
+ export declare class SchemaValidator {
3
+ private ajv;
4
+ constructor();
5
+ addSchema(name: string, schema: object): void;
6
+ getSchema(name: string): object | undefined;
7
+ compile(schema: any): DataValidator;
8
+ }
9
+ //# 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":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAM7C,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAA2B;;IAUtC,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;CA2BpC"}
@@ -0,0 +1,43 @@
1
+ import AjvModule from "ajv";
2
+ import { formatAjvErrors } from "./manifest-schemas.js";
3
+ import { RuntimeError } from "./types.js";
4
+ const Ajv = AjvModule.default ?? AjvModule;
5
+ export class SchemaValidator {
6
+ constructor() {
7
+ this.ajv = new Ajv({
8
+ strict: false,
9
+ removeAdditional: false,
10
+ useDefaults: true,
11
+ });
12
+ }
13
+ addSchema(name, schema) {
14
+ if (!this.ajv.getSchema(name)) {
15
+ this.ajv.addSchema(schema, name);
16
+ }
17
+ }
18
+ getSchema(name) {
19
+ return this.ajv.getSchema(name);
20
+ }
21
+ compile(schema) {
22
+ const validate = this.ajv.compile("type" in schema && typeof schema.type === "string"
23
+ ? schema
24
+ : {
25
+ type: "object",
26
+ properties: schema,
27
+ required: Object.keys(schema),
28
+ additionalProperties: false,
29
+ });
30
+ return {
31
+ validate: (data) => {
32
+ const isValid = validate(data);
33
+ if (!isValid) {
34
+ throw new RuntimeError("ERR_RESOURCE_NOT_FOUND", `Invalid value passed: ${JSON.stringify(data)}. Error: ${formatAjvErrors(validate.errors)}`);
35
+ }
36
+ },
37
+ isValid: (data) => {
38
+ return validate(data);
39
+ },
40
+ };
41
+ }
42
+ }
43
+ //# sourceMappingURL=schema-valiator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-valiator.js","sourceRoot":"","sources":["../src/schema-valiator.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,KAAK,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,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;IACL,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,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAC/B,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,CACN,CAAC;QAEF,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"}