@telorun/kernel 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/base-definition.d.ts +14 -0
  2. package/dist/base-definition.d.ts.map +1 -0
  3. package/dist/base-definition.js +17 -0
  4. package/dist/base-definition.js.map +1 -0
  5. package/dist/capabilities/component.d.ts +3 -0
  6. package/dist/capabilities/component.d.ts.map +1 -0
  7. package/dist/capabilities/component.js +4 -0
  8. package/dist/capabilities/component.js.map +1 -0
  9. package/dist/capabilities/executable.d.ts +3 -0
  10. package/dist/capabilities/executable.d.ts.map +1 -0
  11. package/dist/capabilities/executable.js +5 -0
  12. package/dist/capabilities/executable.js.map +1 -0
  13. package/dist/capabilities/handler.d.ts +3 -0
  14. package/dist/capabilities/handler.d.ts.map +1 -0
  15. package/dist/capabilities/handler.js +4 -0
  16. package/dist/capabilities/handler.js.map +1 -0
  17. package/dist/capabilities/invokable.d.ts +3 -0
  18. package/dist/capabilities/invokable.d.ts.map +1 -0
  19. package/dist/capabilities/invokable.js +5 -0
  20. package/dist/capabilities/invokable.js.map +1 -0
  21. package/dist/capabilities/listener.d.ts +3 -0
  22. package/dist/capabilities/listener.d.ts.map +1 -0
  23. package/dist/capabilities/listener.js +5 -0
  24. package/dist/capabilities/listener.js.map +1 -0
  25. package/dist/capabilities/mount.d.ts +3 -0
  26. package/dist/capabilities/mount.d.ts.map +1 -0
  27. package/dist/capabilities/mount.js +5 -0
  28. package/dist/capabilities/mount.js.map +1 -0
  29. package/dist/capabilities/provider.d.ts +3 -0
  30. package/dist/capabilities/provider.d.ts.map +1 -0
  31. package/dist/capabilities/provider.js +8 -0
  32. package/dist/capabilities/provider.js.map +1 -0
  33. package/dist/capabilities/runnable.d.ts +3 -0
  34. package/dist/capabilities/runnable.d.ts.map +1 -0
  35. package/dist/capabilities/runnable.js +5 -0
  36. package/dist/capabilities/runnable.js.map +1 -0
  37. package/dist/capabilities/service.d.ts +3 -0
  38. package/dist/capabilities/service.d.ts.map +1 -0
  39. package/dist/capabilities/service.js +5 -0
  40. package/dist/capabilities/service.js.map +1 -0
  41. package/dist/capabilities/template.d.ts +3 -0
  42. package/dist/capabilities/template.d.ts.map +1 -0
  43. package/dist/capabilities/template.js +5 -0
  44. package/dist/capabilities/template.js.map +1 -0
  45. package/dist/capabilities/type.d.ts +3 -0
  46. package/dist/capabilities/type.d.ts.map +1 -0
  47. package/dist/capabilities/type.js +5 -0
  48. package/dist/capabilities/type.js.map +1 -0
  49. package/dist/controller-loader.d.ts.map +1 -1
  50. package/dist/controller-loader.js +2 -1
  51. package/dist/controller-loader.js.map +1 -1
  52. package/dist/controller-registry.d.ts +0 -4
  53. package/dist/controller-registry.d.ts.map +1 -1
  54. package/dist/controller-registry.js +11 -22
  55. package/dist/controller-registry.js.map +1 -1
  56. package/dist/controllers/capability/capability-controller.d.ts +0 -5
  57. package/dist/controllers/capability/capability-controller.d.ts.map +1 -1
  58. package/dist/controllers/capability/capability-controller.js +1 -5
  59. package/dist/controllers/capability/capability-controller.js.map +1 -1
  60. package/dist/controllers/module/import-controller.d.ts +0 -3
  61. package/dist/controllers/module/import-controller.d.ts.map +1 -1
  62. package/dist/controllers/module/import-controller.js +21 -27
  63. package/dist/controllers/module/import-controller.js.map +1 -1
  64. package/dist/controllers/module/module-controller.d.ts +0 -59
  65. package/dist/controllers/module/module-controller.d.ts.map +1 -1
  66. package/dist/controllers/module/module-controller.js +0 -45
  67. package/dist/controllers/module/module-controller.js.map +1 -1
  68. package/dist/controllers/resource-definition/resource-definition-controller.d.ts +3 -4
  69. package/dist/controllers/resource-definition/resource-definition-controller.d.ts.map +1 -1
  70. package/dist/controllers/resource-definition/resource-definition-controller.js +6 -8
  71. package/dist/controllers/resource-definition/resource-definition-controller.js.map +1 -1
  72. package/dist/controllers/resource-definition/resource-template-controller.d.ts +12 -0
  73. package/dist/controllers/resource-definition/resource-template-controller.d.ts.map +1 -0
  74. package/dist/controllers/resource-definition/resource-template-controller.js +112 -0
  75. package/dist/controllers/resource-definition/resource-template-controller.js.map +1 -0
  76. package/dist/index.d.ts +1 -1
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +0 -1
  79. package/dist/index.js.map +1 -1
  80. package/dist/kernel.d.ts +21 -24
  81. package/dist/kernel.d.ts.map +1 -1
  82. package/dist/kernel.js +254 -189
  83. package/dist/kernel.js.map +1 -1
  84. package/dist/loader.d.ts +9 -8
  85. package/dist/loader.d.ts.map +1 -1
  86. package/dist/loader.js +50 -132
  87. package/dist/loader.js.map +1 -1
  88. package/dist/manifest-adapters/http-adapter.d.ts.map +1 -1
  89. package/dist/manifest-adapters/http-adapter.js +3 -1
  90. package/dist/manifest-adapters/http-adapter.js.map +1 -1
  91. package/dist/manifest-adapters/local-file-adapter.d.ts +7 -5
  92. package/dist/manifest-adapters/local-file-adapter.d.ts.map +1 -1
  93. package/dist/manifest-adapters/local-file-adapter.js +21 -26
  94. package/dist/manifest-adapters/local-file-adapter.js.map +1 -1
  95. package/dist/manifest-adapters/manifest-adapter.d.ts +2 -0
  96. package/dist/manifest-adapters/manifest-adapter.d.ts.map +1 -1
  97. package/dist/manifest-adapters/registry-adapter.d.ts.map +1 -1
  98. package/dist/manifest-adapters/registry-adapter.js +3 -1
  99. package/dist/manifest-adapters/registry-adapter.js.map +1 -1
  100. package/dist/manifest-schemas.d.ts +61 -25
  101. package/dist/manifest-schemas.d.ts.map +1 -1
  102. package/dist/manifest-schemas.js +56 -16
  103. package/dist/manifest-schemas.js.map +1 -1
  104. package/dist/resource-context.d.ts +2 -5
  105. package/dist/resource-context.d.ts.map +1 -1
  106. package/dist/resource-context.js +31 -21
  107. package/dist/resource-context.js.map +1 -1
  108. package/dist/schema-valiator.d.ts.map +1 -1
  109. package/dist/schema-valiator.js +13 -2
  110. package/dist/schema-valiator.js.map +1 -1
  111. package/package.json +6 -7
  112. package/src/controller-loader.ts +2 -1
  113. package/src/controller-registry.ts +11 -26
  114. package/src/controllers/module/import-controller.ts +30 -30
  115. package/src/controllers/module/module-controller.ts +0 -51
  116. package/src/controllers/resource-definition/resource-definition-controller.ts +14 -15
  117. package/src/controllers/resource-definition/resource-template-controller.ts +138 -0
  118. package/src/index.ts +1 -1
  119. package/src/kernel.ts +313 -224
  120. package/src/loader.ts +54 -165
  121. package/src/manifest-adapters/local-file-adapter.ts +24 -31
  122. package/src/manifest-adapters/manifest-adapter.ts +2 -0
  123. package/src/manifest-schemas.ts +60 -24
  124. package/src/resource-context.ts +31 -30
  125. package/src/schema-valiator.ts +14 -3
  126. package/src/capabilities/component.yaml +0 -4
  127. package/src/capabilities/executable.yaml +0 -8
  128. package/src/capabilities/handler.yaml +0 -4
  129. package/src/capabilities/listener.yaml +0 -4
  130. package/src/capabilities/provider.yaml +0 -4
  131. package/src/capabilities/template.yaml +0 -4
  132. package/src/capabilities/type.yaml +0 -4
  133. package/src/controllers/capability/capability-controller.ts +0 -41
  134. package/src/controllers/module/module.json +0 -48
  135. package/src/controllers/module/module.yaml +0 -32
  136. package/src/manifest-adapters/http-adapter.ts +0 -35
  137. package/src/manifest-adapters/registry-adapter.ts +0 -56
@@ -6,18 +6,18 @@ import type {
6
6
  } from "@telorun/sdk";
7
7
  import { ControllerLoader } from "../../controller-loader.js";
8
8
  import { formatAjvErrors, validateResourceDefinition } from "../../manifest-schemas.js";
9
+ import { createTemplateController } from "./resource-template-controller.js";
9
10
 
10
11
  type ResourceDefinitionResource = RuntimeResource & {
11
- kind: "Definition";
12
+ kind: "Kernel.Definition";
12
13
  metadata: {
13
14
  [key: string]: any;
14
15
  name: string;
15
16
  module?: string;
16
17
  };
17
18
  schema: Record<string, any>;
18
- capabilities: string[];
19
- events?: string[];
20
- controllers: Array<string>;
19
+ capability?: string;
20
+ controllers?: Array<string>;
21
21
  };
22
22
 
23
23
  /**
@@ -33,16 +33,15 @@ class ResourceDefinition implements ResourceInstance {
33
33
  ) {}
34
34
 
35
35
  async init(ctx: ResourceContext) {
36
- for (const cap of this.resource.capabilities) {
37
- if (!ctx.isCapabilityRegistered(cap)) {
38
- throw new Error(
39
- `Capability "${cap}" is not registered. Declare it as a Kernel.Capability resource.`,
40
- );
41
- }
42
- const capSchema = ctx.getCapabilitySchema(cap);
43
- if (capSchema) {
44
- ctx.validateSchema(this.resource, capSchema);
45
- }
36
+ if (!this.resource.controllers?.length) {
37
+ const controllerInstance = createTemplateController(this.resource as any);
38
+ ctx.registerDefinition(this.resource);
39
+ await ctx.registerController(
40
+ this.resource.metadata.module,
41
+ this.resource.metadata.name,
42
+ controllerInstance,
43
+ );
44
+ return;
46
45
  }
47
46
  ctx.emit("ControllerLoading", { controllers: this.resource.controllers });
48
47
  try {
@@ -77,7 +76,7 @@ export async function create(resource: any, ctx: ResourceContext): Promise<Resou
77
76
  }
78
77
 
79
78
  // Return a fully-formed ResourceDefinition instance
80
- const definition = resource as ResourceDefinitionResource;
79
+ const definition = resource as unknown as ResourceDefinitionResource;
81
80
  return new ResourceDefinition(definition, new ControllerLoader());
82
81
  }
83
82
 
@@ -0,0 +1,138 @@
1
+ import type { ControllerInstance, ResourceContext, ResourceInstance } from "@telorun/sdk";
2
+ import { isCompiledValue } from "@telorun/sdk";
3
+
4
+ export function createTemplateController(definition: {
5
+ schema: Record<string, any>;
6
+ resources?: any[];
7
+ invoke?: string | { kind?: string; name: string; inputs?: Record<string, any> };
8
+ run?: string;
9
+ }): ControllerInstance {
10
+ return {
11
+ schema: definition.schema ?? { type: "object", additionalProperties: true },
12
+
13
+ create: async (resource: any, ctx: ResourceContext): Promise<ResourceInstance> => {
14
+ const self = { ...resource, name: resource.metadata.name };
15
+
16
+ // Old string form: invoke is a plain string or a CompiledValue (after precompile).
17
+ // New object form: invoke is a plain object (non-CompiledValue) with at least `name`.
18
+ const objectInvoke =
19
+ definition.invoke !== null &&
20
+ typeof definition.invoke === "object" &&
21
+ !isCompiledValue(definition.invoke)
22
+ ? (definition.invoke as { kind?: string; name: string; inputs?: Record<string, any> })
23
+ : null;
24
+ const invokeNameTemplate = objectInvoke ? objectInvoke.name : (definition.invoke ?? null);
25
+ const invokeTarget = invokeNameTemplate
26
+ ? (ctx.moduleContext.expandWith(invokeNameTemplate, { self }) as string)
27
+ : null;
28
+ const runTarget = definition.run
29
+ ? (ctx.moduleContext.expandWith(definition.run, { self }) as string)
30
+ : null;
31
+
32
+ const persistentManifests: any[] = [];
33
+ let ephemeralTemplate: any = null;
34
+
35
+ for (const template of definition.resources ?? []) {
36
+ const expandedName = ctx.moduleContext.expandWith(template.metadata?.name ?? "", {
37
+ self,
38
+ }) as string;
39
+ const isTarget = expandedName === invokeTarget || expandedName === runTarget;
40
+ if (isTarget) {
41
+ ephemeralTemplate = template;
42
+ } else {
43
+ persistentManifests.push(ctx.moduleContext.expandWith(template, { self }));
44
+ }
45
+ }
46
+
47
+ const childContext = ctx.spawnChildContext();
48
+
49
+ // Registers an ephemeral manifest on ctx.moduleContext so it shares the same
50
+ // resource scope (and can access connections, etc. via getInstance).
51
+ // Tears down and removes the resource after fn() completes.
52
+ const withEphemeral = async (expandedManifest: any, fn: (name: string) => Promise<any>) => {
53
+ const uniqueName = `${expandedManifest.metadata?.name ?? "eph"}__${Math.random().toString(16).slice(2, 8)}`;
54
+ const manifest = {
55
+ ...expandedManifest,
56
+ metadata: {
57
+ ...expandedManifest.metadata,
58
+ name: uniqueName,
59
+ module: resource.metadata.module,
60
+ },
61
+ };
62
+ ctx.moduleContext.registerManifest(manifest);
63
+ await ctx.moduleContext.initializeResources();
64
+ const entry = ctx.moduleContext.resourceInstances.get(uniqueName);
65
+ try {
66
+ return await fn(uniqueName);
67
+ } finally {
68
+ if (entry?.instance?.teardown) await entry.instance.teardown();
69
+ ctx.moduleContext.resourceInstances.delete(uniqueName);
70
+ }
71
+ };
72
+
73
+ return {
74
+ init: async () => {
75
+ for (const m of persistentManifests) childContext.registerManifest(m);
76
+ await childContext.initializeResources();
77
+ },
78
+
79
+ ...(invokeTarget && {
80
+ invoke: async (inputs: any) => {
81
+ if (!ephemeralTemplate) {
82
+ throw new Error(
83
+ `Template '${resource.metadata.name}': no ephemeral resource for invoke target '${invokeTarget}'`,
84
+ );
85
+ }
86
+ const extraContext = { self, inputs };
87
+ const expanded = ctx.moduleContext.expandWith(
88
+ ctx.moduleContext.expandWith(ephemeralTemplate, extraContext),
89
+ extraContext,
90
+ ) as any;
91
+ return withEphemeral(expanded, async (name) => {
92
+ const entry = ctx.moduleContext.resourceInstances.get(name);
93
+ if (!entry?.instance?.invoke) {
94
+ throw new Error(`Ephemeral resource '${name}' is not invocable`);
95
+ }
96
+ // New object form: expand objectInvoke.inputs with invoke context and pass as arg.
97
+ // Old string form: the manifest inputs were computed during template expansion;
98
+ // pass expanded.inputs so Sql.Exec/Query controllers receive { sql, bindings }.
99
+ const invokeInputs = objectInvoke?.inputs != null
100
+ ? ctx.moduleContext.expandWith(
101
+ ctx.moduleContext.expandWith(objectInvoke.inputs, extraContext),
102
+ extraContext,
103
+ )
104
+ : expanded.inputs ?? inputs;
105
+ return entry.instance.invoke(invokeInputs);
106
+ });
107
+ },
108
+ }),
109
+
110
+ ...(runTarget && {
111
+ run: async () => {
112
+ if (!ephemeralTemplate) {
113
+ throw new Error(
114
+ `Template '${resource.metadata.name}': no ephemeral resource for run target '${runTarget}'`,
115
+ );
116
+ }
117
+ const extraContext = { self };
118
+ const expanded = ctx.moduleContext.expandWith(
119
+ ctx.moduleContext.expandWith(ephemeralTemplate, extraContext),
120
+ extraContext,
121
+ );
122
+ return withEphemeral(expanded, async (name) => {
123
+ const entry = ctx.moduleContext.resourceInstances.get(name);
124
+ if (!entry?.instance?.run) {
125
+ throw new Error(`Ephemeral resource '${name}' is not runnable`);
126
+ }
127
+ return entry.instance.run();
128
+ });
129
+ },
130
+ }),
131
+
132
+ teardown: async () => {
133
+ await childContext.teardownResources();
134
+ },
135
+ };
136
+ },
137
+ };
138
+ }
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { ControllerRegistry } from "./controller-registry.js";
2
2
  export { EventStream } from "./event-stream.js";
3
3
  export { Kernel } from "./kernel.js";
4
- export { Loader } from "./loader.js";
5
4
  export { ManifestRegistry as Registry } from "./registry.js";
6
5
  export { ResourceURI } from "./resource-uri.js";
6
+ export type { RuntimeDiagnostic } from "@telorun/sdk";
7
7