@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,265 @@
1
+ import { execFile } from "child_process";
2
+ import { createHash } from "crypto";
3
+ import * as fs from "fs/promises";
4
+ import * as os from "os";
5
+ import { PackageURL } from "packageurl-js";
6
+ import * as path from "path";
7
+ import { promisify } from "util";
8
+ import { RuntimeError } from "./types.js";
9
+ const homedir = os.homedir();
10
+ const cacheRoot = path.join(homedir, ".cache", "telo");
11
+ const npmCacheRoot = path.join(cacheRoot, "npm");
12
+ const isBun = typeof globalThis.Bun !== "undefined";
13
+ export class ControllerLoader {
14
+ /**
15
+ * Load controller instance from URI in format:
16
+ *
17
+ * <runtime>:<registry>:<path>@<version-spec>
18
+ */
19
+ async load(purlCandidates, baseUri) {
20
+ if (!purlCandidates || purlCandidates.length === 0) {
21
+ throw new RuntimeError("ERR_CONTROLLER_NOT_FOUND", "Missing controller PURL candidates");
22
+ }
23
+ const purl = purlCandidates.find((p) => p.startsWith("pkg:npm"));
24
+ if (!purl) {
25
+ throw new RuntimeError("ERR_CONTROLLER_NOT_FOUND", "Controller PURL candidates not applicable");
26
+ }
27
+ const [type, namespace, name, versionSpec, qualifiers, entry] = PackageURL.parseString(purl);
28
+ const localPath = qualifiers?.get("local_path");
29
+ const cacheKey = createHash("sha256").update(purlCandidates[0]).digest("hex").slice(0, 12);
30
+ const installDir = path.join(npmCacheRoot, cacheKey);
31
+ let packageRoot;
32
+ const isLocalManifest = baseUri && !baseUri.startsWith("http://") && !baseUri.startsWith("https://");
33
+ if (localPath && isLocalManifest) {
34
+ const manifestDir = path.dirname(baseUri);
35
+ const resolvedLocalPath = path.resolve(manifestDir, localPath);
36
+ if (await this.pathExists(resolvedLocalPath)) {
37
+ packageRoot = resolvedLocalPath;
38
+ }
39
+ else {
40
+ const nodeModulesPath = await this.findInNodeModules(`${namespace}/${name}`);
41
+ if (nodeModulesPath) {
42
+ packageRoot = nodeModulesPath;
43
+ }
44
+ else {
45
+ await this.ensureNpmPackageInstalled(installDir, `${namespace}/${name}@${versionSpec}`);
46
+ packageRoot = this.getInstalledPackageRoot(installDir, `${namespace}/${name}`);
47
+ }
48
+ }
49
+ }
50
+ else {
51
+ const nodeModulesPath = await this.findInNodeModules(`${namespace}/${name}`);
52
+ if (nodeModulesPath) {
53
+ packageRoot = nodeModulesPath;
54
+ }
55
+ else {
56
+ await this.ensureNpmPackageInstalled(installDir, `${namespace}/${name}@${versionSpec}`);
57
+ packageRoot = this.getInstalledPackageRoot(installDir, `${namespace}/${name}`);
58
+ }
59
+ }
60
+ const entryFile = await this.resolvePackageEntry(packageRoot, entry ? `./${entry}` : ".");
61
+ const instance = await import(entryFile);
62
+ if (!instance || (!instance.create && !instance.register)) {
63
+ throw new Error(`Invalid controller loaded from "${purlCandidates[0]}": missing create or register function`);
64
+ }
65
+ return instance;
66
+ }
67
+ async ensureNpmPackageInstalled(installDir, packageSpec) {
68
+ const packageName = this.getPackageName(packageSpec.startsWith(".") || path.isAbsolute(packageSpec)
69
+ ? await this.getLocalPackageName(packageSpec)
70
+ : packageSpec);
71
+ const packageRoot = this.getInstalledPackageRoot(installDir, packageName);
72
+ const packageJsonPath = path.join(packageRoot, "package.json");
73
+ if (await this.pathExists(packageJsonPath)) {
74
+ return;
75
+ }
76
+ await fs.mkdir(installDir, { recursive: true });
77
+ const rootPackageJson = path.join(installDir, "package.json");
78
+ if (!(await this.pathExists(rootPackageJson))) {
79
+ await fs.writeFile(rootPackageJson, JSON.stringify({ name: "telo-cache", private: true }, null, 2));
80
+ }
81
+ const execFileAsync = promisify(execFile);
82
+ const args = [
83
+ "install",
84
+ "--no-audit",
85
+ "--no-fund",
86
+ "--silent",
87
+ "--prefix",
88
+ installDir,
89
+ packageSpec,
90
+ ];
91
+ await execFileAsync("npm", args);
92
+ }
93
+ getPackageName(packageSpec) {
94
+ if (packageSpec.startsWith("@")) {
95
+ const lastAt = packageSpec.lastIndexOf("@");
96
+ return lastAt > 0 ? packageSpec.slice(0, lastAt) : packageSpec;
97
+ }
98
+ const [name] = packageSpec.split("@");
99
+ return name;
100
+ }
101
+ getInstalledPackageRoot(installDir, packageName) {
102
+ const nameParts = packageName.split("/");
103
+ return path.join(installDir, "node_modules", ...nameParts);
104
+ }
105
+ async getLocalPackageName(packagePath) {
106
+ const packageJsonPath = path.join(packagePath, "package.json");
107
+ if (!(await this.pathExists(packageJsonPath))) {
108
+ throw new Error(`Local package missing package.json: ${packagePath}`);
109
+ }
110
+ const content = await fs.readFile(packageJsonPath, "utf8");
111
+ const parsed = JSON.parse(content);
112
+ if (!parsed?.name) {
113
+ throw new Error(`Local package missing name in package.json: ${packagePath}`);
114
+ }
115
+ return parsed.name;
116
+ }
117
+ async resolvePackageEntry(packageRoot, entry, packageName) {
118
+ const packageJsonPath = path.join(packageRoot, "package.json");
119
+ let resolvedPackageName = packageName;
120
+ let packageJson = null;
121
+ if (!resolvedPackageName && (await this.pathExists(packageJsonPath))) {
122
+ const content = await fs.readFile(packageJsonPath, "utf8");
123
+ try {
124
+ packageJson = JSON.parse(content);
125
+ resolvedPackageName = packageJson?.name;
126
+ }
127
+ catch {
128
+ resolvedPackageName = packageName;
129
+ }
130
+ }
131
+ else if (await this.pathExists(packageJsonPath)) {
132
+ try {
133
+ packageJson = JSON.parse(await fs.readFile(packageJsonPath, "utf8"));
134
+ }
135
+ catch {
136
+ packageJson = null;
137
+ }
138
+ }
139
+ const entryValue = entry.trim();
140
+ const exportTarget = this.resolvePackageExportTarget(packageJson?.exports, entryValue);
141
+ if (exportTarget) {
142
+ const resolved = path.resolve(packageRoot, exportTarget);
143
+ if (await this.pathExists(resolved)) {
144
+ return this.resolveForRuntime(resolved, packageRoot);
145
+ }
146
+ if (!path.extname(resolved)) {
147
+ const withJs = `${resolved}.js`;
148
+ if (await this.pathExists(withJs)) {
149
+ return withJs;
150
+ }
151
+ }
152
+ }
153
+ if ((entryValue === "." || entryValue === "./") && packageJson) {
154
+ const mainFields = ["module", "main"];
155
+ for (const field of mainFields) {
156
+ const target = packageJson[field];
157
+ if (typeof target === "string") {
158
+ const resolved = path.resolve(packageRoot, target);
159
+ if (await this.pathExists(resolved)) {
160
+ return this.resolveForRuntime(resolved, packageRoot);
161
+ }
162
+ if (!path.extname(resolved)) {
163
+ const withJs = `${resolved}.js`;
164
+ if (await this.pathExists(withJs)) {
165
+ return withJs;
166
+ }
167
+ }
168
+ }
169
+ }
170
+ }
171
+ const directPath = path.resolve(packageRoot, entryValue);
172
+ if (await this.pathExists(directPath)) {
173
+ return this.resolveForRuntime(directPath, packageRoot);
174
+ }
175
+ if (!path.extname(directPath)) {
176
+ const withJs = `${directPath}.js`;
177
+ if (await this.pathExists(withJs)) {
178
+ return withJs;
179
+ }
180
+ }
181
+ throw new Error(`Controller entry "${entryValue}" could not be resolved in ${packageRoot}`);
182
+ }
183
+ resolvePackageExportTarget(exportsField, entry) {
184
+ if (!exportsField) {
185
+ return null;
186
+ }
187
+ const key = entry === "." || entry === "./" ? "." : entry;
188
+ const target = exportsField[key];
189
+ return this.resolveExportTargetValue(target);
190
+ }
191
+ resolveExportTargetValue(target) {
192
+ if (!target) {
193
+ return null;
194
+ }
195
+ if (typeof target === "string") {
196
+ return target;
197
+ }
198
+ if (Array.isArray(target)) {
199
+ for (const item of target) {
200
+ const resolved = this.resolveExportTargetValue(item);
201
+ if (resolved) {
202
+ return resolved;
203
+ }
204
+ }
205
+ return null;
206
+ }
207
+ if (typeof target === "object") {
208
+ const preferredKeys = isBun ? ["bun", "import", "default", "require"] : ["import", "default", "require"];
209
+ for (const key of preferredKeys) {
210
+ if (target[key]) {
211
+ const resolved = this.resolveExportTargetValue(target[key]);
212
+ if (resolved) {
213
+ return resolved;
214
+ }
215
+ }
216
+ }
217
+ }
218
+ return null;
219
+ }
220
+ /**
221
+ * For Node.js, resolve .ts paths to their compiled .js equivalents in dist/.
222
+ * Bun can load .ts directly, so it returns the path unchanged.
223
+ */
224
+ async resolveForRuntime(resolvedPath, packageRoot) {
225
+ if (isBun || !resolvedPath.endsWith(".ts")) {
226
+ return resolvedPath;
227
+ }
228
+ // Try dist/ equivalent: src/foo.ts -> dist/foo.js
229
+ const relative = path.relative(packageRoot, resolvedPath);
230
+ const distEquivalent = path.resolve(packageRoot, relative.replace(/^src\//, "dist/").replace(/\.ts$/, ".js"));
231
+ if (await this.pathExists(distEquivalent)) {
232
+ return distEquivalent;
233
+ }
234
+ // Fallback: same location but .js
235
+ const jsPath = resolvedPath.replace(/\.ts$/, ".js");
236
+ if (await this.pathExists(jsPath)) {
237
+ return jsPath;
238
+ }
239
+ return resolvedPath;
240
+ }
241
+ async findInNodeModules(packageName) {
242
+ const nameParts = packageName.split("/");
243
+ const candidates = [
244
+ path.join(process.cwd(), "node_modules", ...nameParts),
245
+ path.join(process.cwd(), "node_modules", ".pnpm", "node_modules", ...nameParts),
246
+ ];
247
+ for (const candidate of candidates) {
248
+ const packageJsonPath = path.join(candidate, "package.json");
249
+ if (await this.pathExists(packageJsonPath)) {
250
+ return candidate;
251
+ }
252
+ }
253
+ return null;
254
+ }
255
+ async pathExists(filePath) {
256
+ try {
257
+ await fs.access(filePath);
258
+ return true;
259
+ }
260
+ catch {
261
+ return false;
262
+ }
263
+ }
264
+ }
265
+ //# sourceMappingURL=controller-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller-loader.js","sourceRoot":"","sources":["../src/controller-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { RuntimeResource } from "@telorun/sdk";
2
+ import { ControllerInstance, ResourceDefinition } from "./types.js";
3
+ /**
4
+ * ControllerRegistry: Manages controller loading and dispatch
5
+ * Maps fully-qualified resource kinds to their controller implementations
6
+ */
7
+ export declare class ControllerRegistry {
8
+ private controllersByKind;
9
+ private definitionsByKind;
10
+ private controllerLoaders;
11
+ private capabilitySchemas;
12
+ registerCapability(name: string, schema?: Record<string, any>): void;
13
+ isCapabilityRegistered(name: string): boolean;
14
+ getCapabilitySchema(name: string): Record<string, any> | null | undefined;
15
+ /**
16
+ * Register a controller definition
17
+ */
18
+ registerDefinition(definition: ResourceDefinition): void;
19
+ /**
20
+ * Get a controller instance for a kind
21
+ * Lazy-loads controller code on first access
22
+ * Throws if controller not found
23
+ */
24
+ getController(kind: string): ControllerInstance;
25
+ /**
26
+ * Safe get - returns undefined if controller not found
27
+ */
28
+ getControllerOrUndefined(kind: string): ControllerInstance | undefined;
29
+ /**
30
+ * Check if a controller exists for this kind (definition or directly registered)
31
+ */
32
+ hasController(kind: string): boolean;
33
+ /**
34
+ * Get definition for a kind
35
+ */
36
+ getDefinition(kind: string): ResourceDefinition | undefined;
37
+ /**
38
+ * Get all registered kinds
39
+ */
40
+ getKinds(): string[];
41
+ getControllerKinds(): string[];
42
+ /**
43
+ * Create a resource instance using its controller
44
+ */
45
+ create(kind: string, resource: RuntimeResource, ctx: any): Promise<any | null>;
46
+ /**
47
+ * Register a controller for a kind
48
+ */
49
+ registerController(kind: string, controller: ControllerInstance): void;
50
+ /**
51
+ * Private: Register controller loader
52
+ */
53
+ private registerControllerLoader;
54
+ private isModuleClass;
55
+ }
56
+ //# sourceMappingURL=controller-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller-registry.d.ts","sourceRoot":"","sources":["../src/controller-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,iBAAiB,CAA6D;IACtF,OAAO,CAAC,iBAAiB,CAAsD;IAE/E,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAIpE,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7C,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS;IAIzE;;OAEG;IACH,kBAAkB,CAChB,UAAU,EAAE,kBAAkB,GAG7B,IAAI;IAgBP;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB;IAiB/C;;OAEG;IACH,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAQtE;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI3D;;OAEG;IACH,QAAQ,IAAI,MAAM,EAAE;IAIpB,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAQpF;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAkBtE;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA2DhC,OAAO,CAAC,aAAa;CAKtB"}
@@ -0,0 +1,169 @@
1
+ import * as path from "path";
2
+ /**
3
+ * ControllerRegistry: Manages controller loading and dispatch
4
+ * Maps fully-qualified resource kinds to their controller implementations
5
+ */
6
+ export class ControllerRegistry {
7
+ constructor() {
8
+ this.controllersByKind = new Map();
9
+ this.definitionsByKind = new Map();
10
+ this.controllerLoaders = new Map();
11
+ this.capabilitySchemas = new Map();
12
+ }
13
+ registerCapability(name, schema) {
14
+ this.capabilitySchemas.set(name, schema ?? null);
15
+ }
16
+ isCapabilityRegistered(name) {
17
+ return this.capabilitySchemas.has(name);
18
+ }
19
+ getCapabilitySchema(name) {
20
+ return this.capabilitySchemas.get(name);
21
+ }
22
+ /**
23
+ * Register a controller definition
24
+ */
25
+ registerDefinition(definition) {
26
+ // Construct fully qualified kind: Namespace.Name
27
+ // Only add namespace if name is not already qualified (doesn't contain a dot)
28
+ const namespace = definition.metadata.module;
29
+ const baseDir = null;
30
+ const name = definition.metadata.name;
31
+ const kind = namespace && !name.includes(".") ? `${namespace}.${name}` : name;
32
+ this.definitionsByKind.set(kind, definition);
33
+ // If definition has controllers, register loader for them
34
+ if (definition.controllers && definition.controllers.length > 0 && baseDir) {
35
+ this.registerControllerLoader(kind, definition, baseDir);
36
+ }
37
+ }
38
+ /**
39
+ * Get a controller instance for a kind
40
+ * Lazy-loads controller code on first access
41
+ * Throws if controller not found
42
+ */
43
+ getController(kind) {
44
+ // Return cached instance if available
45
+ if (this.controllersByKind.has(kind)) {
46
+ return this.controllersByKind.get(kind);
47
+ }
48
+ // Load controller if loader is registered
49
+ // const loader = this.controllerLoaders.get(kind);
50
+ // if (loader) {
51
+ // const controller = await loader();
52
+ // this.controllersByKind.set(kind, controller);
53
+ // return controller;
54
+ // }
55
+ throw new Error(`No controller registered for kind: ${kind}`);
56
+ }
57
+ /**
58
+ * Safe get - returns undefined if controller not found
59
+ */
60
+ getControllerOrUndefined(kind) {
61
+ // Return cached instance if available
62
+ if (this.controllersByKind.has(kind)) {
63
+ return this.controllersByKind.get(kind);
64
+ }
65
+ return undefined;
66
+ }
67
+ /**
68
+ * Check if a controller exists for this kind (definition or directly registered)
69
+ */
70
+ hasController(kind) {
71
+ return this.controllersByKind.has(kind) || this.definitionsByKind.has(kind);
72
+ }
73
+ /**
74
+ * Get definition for a kind
75
+ */
76
+ getDefinition(kind) {
77
+ return this.definitionsByKind.get(kind);
78
+ }
79
+ /**
80
+ * Get all registered kinds
81
+ */
82
+ getKinds() {
83
+ return Array.from(this.definitionsByKind.keys());
84
+ }
85
+ getControllerKinds() {
86
+ return Array.from(this.controllersByKind.keys());
87
+ }
88
+ /**
89
+ * Create a resource instance using its controller
90
+ */
91
+ async create(kind, resource, ctx) {
92
+ const controller = this.getController(kind);
93
+ if (!controller || !controller.create) {
94
+ return null;
95
+ }
96
+ return controller.create(resource, ctx);
97
+ }
98
+ /**
99
+ * Register a controller for a kind
100
+ */
101
+ registerController(kind, controller) {
102
+ if (!this.definitionsByKind.has(kind)) {
103
+ throw new Error(`Cannot register controller for kind ${kind} without definition`);
104
+ }
105
+ // Ensure controller has schema from definition
106
+ const definition = this.definitionsByKind.get(kind);
107
+ if (definition?.schema && !controller.schema) {
108
+ // Wrap controller to add schema without mutating the original
109
+ const wrappedController = {
110
+ ...controller,
111
+ schema: definition.schema,
112
+ };
113
+ this.controllersByKind.set(kind, wrappedController);
114
+ }
115
+ else {
116
+ this.controllersByKind.set(kind, controller);
117
+ }
118
+ }
119
+ /**
120
+ * Private: Register controller loader
121
+ */
122
+ registerControllerLoader(kind, definition, moduleDir) {
123
+ const controllerDef = definition.controllers?.[0]; // Use first matching controller for now
124
+ if (!controllerDef)
125
+ return;
126
+ this.controllerLoaders.set(kind, async () => {
127
+ const modulePath = path.resolve(moduleDir, controllerDef.entry);
128
+ const moduleRuntime = await import(modulePath);
129
+ const exported = moduleRuntime.default || moduleRuntime.Module || moduleRuntime;
130
+ const registerFn = typeof moduleRuntime.register === "function"
131
+ ? moduleRuntime.register
132
+ : typeof exported === "function" && !this.isModuleClass(exported)
133
+ ? exported
134
+ : null;
135
+ const createFn = typeof moduleRuntime.create === "function"
136
+ ? moduleRuntime.create
137
+ : typeof exported?.create === "function"
138
+ ? exported.create
139
+ : null;
140
+ const executeFn = typeof moduleRuntime.execute === "function"
141
+ ? moduleRuntime.execute
142
+ : typeof exported?.execute === "function"
143
+ ? exported.execute
144
+ : null;
145
+ const compileFn = typeof moduleRuntime.compile === "function"
146
+ ? moduleRuntime.compile
147
+ : typeof exported?.compile === "function"
148
+ ? exported.compile
149
+ : null;
150
+ if (!registerFn && !executeFn && !createFn && !compileFn) {
151
+ throw new Error(`Controller for "${kind}" exports no usable handlers`);
152
+ }
153
+ if (!definition.schema) {
154
+ throw new Error(`Definition for "${kind}" does not have schema`);
155
+ }
156
+ return {
157
+ register: registerFn ?? undefined,
158
+ create: createFn ?? undefined,
159
+ execute: executeFn ?? undefined,
160
+ compile: compileFn ?? undefined,
161
+ schema: definition.schema,
162
+ };
163
+ });
164
+ }
165
+ isModuleClass(obj) {
166
+ return (typeof obj === "function" && (obj.name === "Controller" || obj.toString().includes("class")));
167
+ }
168
+ }
169
+ //# sourceMappingURL=controller-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller-registry.js","sourceRoot":"","sources":["../src/controller-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { ResourceContext, ResourceInstance } from "@telorun/sdk";
2
+ type CapabilityResource = {
3
+ kind: string;
4
+ metadata: {
5
+ name: string;
6
+ [key: string]: any;
7
+ };
8
+ schema?: Record<string, any>;
9
+ };
10
+ declare class Capability implements ResourceInstance {
11
+ private readonly resource;
12
+ constructor(resource: CapabilityResource);
13
+ init(ctx: ResourceContext): Promise<void>;
14
+ }
15
+ export declare function create(resource: any, _ctx: ResourceContext): Promise<Capability>;
16
+ export declare const schema: {
17
+ type: string;
18
+ properties: {
19
+ metadata: {
20
+ type: string;
21
+ properties: {
22
+ name: {
23
+ type: string;
24
+ };
25
+ };
26
+ required: string[];
27
+ };
28
+ schema: {
29
+ type: string;
30
+ additionalProperties: boolean;
31
+ };
32
+ };
33
+ required: string[];
34
+ additionalProperties: boolean;
35
+ };
36
+ export {};
37
+ //# sourceMappingURL=capability-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-controller.d.ts","sourceRoot":"","sources":["../../../src/controllers/capability/capability-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEtE,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B,CAAC;AAEF,cAAM,UAAW,YAAW,gBAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,kBAAkB;IAEnD,IAAI,CAAC,GAAG,EAAE,eAAe;CAGhC;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAEtF;AAED,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;CAiBlB,CAAC"}
@@ -0,0 +1,30 @@
1
+ class Capability {
2
+ constructor(resource) {
3
+ this.resource = resource;
4
+ }
5
+ async init(ctx) {
6
+ ctx.registerCapability(this.resource.metadata.name, this.resource.schema);
7
+ }
8
+ }
9
+ export async function create(resource, _ctx) {
10
+ return new Capability(resource);
11
+ }
12
+ export const schema = {
13
+ type: "object",
14
+ properties: {
15
+ metadata: {
16
+ type: "object",
17
+ properties: {
18
+ name: { type: "string" },
19
+ },
20
+ required: ["name"],
21
+ },
22
+ schema: {
23
+ type: "object",
24
+ additionalProperties: true,
25
+ },
26
+ },
27
+ required: ["metadata"],
28
+ additionalProperties: true,
29
+ };
30
+ //# sourceMappingURL=capability-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-controller.js","sourceRoot":"","sources":["../../../src/controllers/capability/capability-controller.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU;IACd,YAA6B,QAA4B;QAA5B,aAAQ,GAAR,QAAQ,CAAoB;IAAG,CAAC;IAE7D,KAAK,CAAC,IAAI,CAAC,GAAoB;QAC7B,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5E,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,QAAa,EAAE,IAAqB;IAC/D,OAAO,IAAI,UAAU,CAAC,QAA8B,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACzB;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,IAAI;SAC3B;KACF;IACD,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,oBAAoB,EAAE,IAAI;CAC3B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ResourceContext, ResourceInstance, RuntimeResource } from "@telorun/sdk";
2
+ type ModuleResource = RuntimeResource & {
3
+ source?: string;
4
+ imports?: string[];
5
+ definitions?: string[];
6
+ resources?: (string | {
7
+ path: string;
8
+ })[];
9
+ };
10
+ export declare function create(resource: ModuleResource, ctx: ResourceContext): Promise<ResourceInstance>;
11
+ export declare const schema: {
12
+ type: string;
13
+ additionalProperties: boolean;
14
+ };
15
+ export {};
16
+ //# sourceMappingURL=module-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-controller.d.ts","sourceRoot":"","sources":["../../../src/controllers/module/module-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,EAChB,MAAM,cAAc,CAAC;AAItB,KAAK,cAAc,GAAG,eAAe,GAAG;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,CAAC,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;CAC3C,CAAC;AAqBF,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,gBAAgB,CAAC,CA6C3B;AAgCD,eAAO,MAAM,MAAM;;;CAGlB,CAAC"}