@jclaw/core 0.1.0

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 (189) hide show
  1. package/dist/auto-skill/generator.d.ts +30 -0
  2. package/dist/auto-skill/generator.d.ts.map +1 -0
  3. package/dist/auto-skill/generator.js +262 -0
  4. package/dist/auto-skill/generator.js.map +1 -0
  5. package/dist/auto-skill/index.d.ts +11 -0
  6. package/dist/auto-skill/index.d.ts.map +1 -0
  7. package/dist/auto-skill/index.js +10 -0
  8. package/dist/auto-skill/index.js.map +1 -0
  9. package/dist/auto-skill/installer.d.ts +44 -0
  10. package/dist/auto-skill/installer.d.ts.map +1 -0
  11. package/dist/auto-skill/installer.js +201 -0
  12. package/dist/auto-skill/installer.js.map +1 -0
  13. package/dist/auto-skill/types.d.ts +179 -0
  14. package/dist/auto-skill/types.d.ts.map +1 -0
  15. package/dist/auto-skill/types.js +9 -0
  16. package/dist/auto-skill/types.js.map +1 -0
  17. package/dist/cli/commands/config.d.ts +16 -0
  18. package/dist/cli/commands/config.d.ts.map +1 -0
  19. package/dist/cli/commands/config.js +119 -0
  20. package/dist/cli/commands/config.js.map +1 -0
  21. package/dist/cli/commands/exec.d.ts +12 -0
  22. package/dist/cli/commands/exec.d.ts.map +1 -0
  23. package/dist/cli/commands/exec.js +41 -0
  24. package/dist/cli/commands/exec.js.map +1 -0
  25. package/dist/cli/index.d.ts +10 -0
  26. package/dist/cli/index.d.ts.map +1 -0
  27. package/dist/cli/index.js +91 -0
  28. package/dist/cli/index.js.map +1 -0
  29. package/dist/cli/run.d.ts +9 -0
  30. package/dist/cli/run.d.ts.map +1 -0
  31. package/dist/cli/run.js +13 -0
  32. package/dist/cli/run.js.map +1 -0
  33. package/dist/context/index.d.ts +6 -0
  34. package/dist/context/index.d.ts.map +1 -0
  35. package/dist/context/index.js +12 -0
  36. package/dist/context/index.js.map +1 -0
  37. package/dist/context/memsearch-client.d.ts +34 -0
  38. package/dist/context/memsearch-client.d.ts.map +1 -0
  39. package/dist/context/memsearch-client.js +182 -0
  40. package/dist/context/memsearch-client.js.map +1 -0
  41. package/dist/context/mock-client.d.ts +116 -0
  42. package/dist/context/mock-client.d.ts.map +1 -0
  43. package/dist/context/mock-client.js +150 -0
  44. package/dist/context/mock-client.js.map +1 -0
  45. package/dist/context/openviking-client.d.ts +87 -0
  46. package/dist/context/openviking-client.d.ts.map +1 -0
  47. package/dist/context/openviking-client.js +166 -0
  48. package/dist/context/openviking-client.js.map +1 -0
  49. package/dist/context/openviking-mcp-client.d.ts +29 -0
  50. package/dist/context/openviking-mcp-client.d.ts.map +1 -0
  51. package/dist/context/openviking-mcp-client.js +81 -0
  52. package/dist/context/openviking-mcp-client.js.map +1 -0
  53. package/dist/context/simple-memory-client.d.ts +43 -0
  54. package/dist/context/simple-memory-client.d.ts.map +1 -0
  55. package/dist/context/simple-memory-client.enhanced.d.ts +39 -0
  56. package/dist/context/simple-memory-client.enhanced.d.ts.map +1 -0
  57. package/dist/context/simple-memory-client.enhanced.js +207 -0
  58. package/dist/context/simple-memory-client.enhanced.js.map +1 -0
  59. package/dist/context/simple-memory-client.js +270 -0
  60. package/dist/context/simple-memory-client.js.map +1 -0
  61. package/dist/evolution/continuous.d.ts +127 -0
  62. package/dist/evolution/continuous.d.ts.map +1 -0
  63. package/dist/evolution/continuous.js +238 -0
  64. package/dist/evolution/continuous.js.map +1 -0
  65. package/dist/evolution/engine.d.ts +97 -0
  66. package/dist/evolution/engine.d.ts.map +1 -0
  67. package/dist/evolution/engine.js +187 -0
  68. package/dist/evolution/engine.js.map +1 -0
  69. package/dist/evolution/evolver-adapter.d.ts +104 -0
  70. package/dist/evolution/evolver-adapter.d.ts.map +1 -0
  71. package/dist/evolution/evolver-adapter.js +227 -0
  72. package/dist/evolution/evolver-adapter.js.map +1 -0
  73. package/dist/evolution/index.d.ts +9 -0
  74. package/dist/evolution/index.d.ts.map +1 -0
  75. package/dist/evolution/index.js +8 -0
  76. package/dist/evolution/index.js.map +1 -0
  77. package/dist/evolution/memory.d.ts +106 -0
  78. package/dist/evolution/memory.d.ts.map +1 -0
  79. package/dist/evolution/memory.js +232 -0
  80. package/dist/evolution/memory.js.map +1 -0
  81. package/dist/evolution/mutation.d.ts +66 -0
  82. package/dist/evolution/mutation.d.ts.map +1 -0
  83. package/dist/evolution/mutation.js +139 -0
  84. package/dist/evolution/mutation.js.map +1 -0
  85. package/dist/evolution/sandbox.d.ts +96 -0
  86. package/dist/evolution/sandbox.d.ts.map +1 -0
  87. package/dist/evolution/sandbox.js +194 -0
  88. package/dist/evolution/sandbox.js.map +1 -0
  89. package/dist/evolution/types.d.ts +93 -0
  90. package/dist/evolution/types.d.ts.map +1 -0
  91. package/dist/evolution/types.js +9 -0
  92. package/dist/evolution/types.js.map +1 -0
  93. package/dist/executor/index.d.ts +10 -0
  94. package/dist/executor/index.d.ts.map +1 -0
  95. package/dist/executor/index.js +10 -0
  96. package/dist/executor/index.js.map +1 -0
  97. package/dist/executor/interface.d.ts +9 -0
  98. package/dist/executor/interface.d.ts.map +1 -0
  99. package/dist/executor/interface.js +9 -0
  100. package/dist/executor/interface.js.map +1 -0
  101. package/dist/executor/local.d.ts +36 -0
  102. package/dist/executor/local.d.ts.map +1 -0
  103. package/dist/executor/local.js +95 -0
  104. package/dist/executor/local.js.map +1 -0
  105. package/dist/extension-system/capability-router.d.ts +106 -0
  106. package/dist/extension-system/capability-router.d.ts.map +1 -0
  107. package/dist/extension-system/capability-router.js +167 -0
  108. package/dist/extension-system/capability-router.js.map +1 -0
  109. package/dist/extension-system/index.d.ts +11 -0
  110. package/dist/extension-system/index.d.ts.map +1 -0
  111. package/dist/extension-system/index.js +11 -0
  112. package/dist/extension-system/index.js.map +1 -0
  113. package/dist/extension-system/loader.d.ts +93 -0
  114. package/dist/extension-system/loader.d.ts.map +1 -0
  115. package/dist/extension-system/loader.js +245 -0
  116. package/dist/extension-system/loader.js.map +1 -0
  117. package/dist/extension-system/registry.d.ts +112 -0
  118. package/dist/extension-system/registry.d.ts.map +1 -0
  119. package/dist/extension-system/registry.js +161 -0
  120. package/dist/extension-system/registry.js.map +1 -0
  121. package/dist/index.d.ts +14 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +20 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/network/client.d.ts +130 -0
  126. package/dist/network/client.d.ts.map +1 -0
  127. package/dist/network/client.js +230 -0
  128. package/dist/network/client.js.map +1 -0
  129. package/dist/network/index.d.ts +10 -0
  130. package/dist/network/index.d.ts.map +1 -0
  131. package/dist/network/index.js +10 -0
  132. package/dist/network/index.js.map +1 -0
  133. package/dist/network/protocol.d.ts +159 -0
  134. package/dist/network/protocol.d.ts.map +1 -0
  135. package/dist/network/protocol.js +118 -0
  136. package/dist/network/protocol.js.map +1 -0
  137. package/dist/runtime/agent.d.ts +124 -0
  138. package/dist/runtime/agent.d.ts.map +1 -0
  139. package/dist/runtime/agent.js +286 -0
  140. package/dist/runtime/agent.js.map +1 -0
  141. package/dist/runtime/agent_fixed.d.ts +39 -0
  142. package/dist/runtime/agent_fixed.d.ts.map +1 -0
  143. package/dist/runtime/agent_fixed.js +193 -0
  144. package/dist/runtime/agent_fixed.js.map +1 -0
  145. package/dist/runtime/index.d.ts +11 -0
  146. package/dist/runtime/index.d.ts.map +1 -0
  147. package/dist/runtime/index.js +11 -0
  148. package/dist/runtime/index.js.map +1 -0
  149. package/dist/runtime/llm-client.d.ts +108 -0
  150. package/dist/runtime/llm-client.d.ts.map +1 -0
  151. package/dist/runtime/llm-client.js +125 -0
  152. package/dist/runtime/llm-client.js.map +1 -0
  153. package/dist/runtime/task-executor.d.ts +92 -0
  154. package/dist/runtime/task-executor.d.ts.map +1 -0
  155. package/dist/runtime/task-executor.js +203 -0
  156. package/dist/runtime/task-executor.js.map +1 -0
  157. package/dist/skill-sh/adapter.d.ts +40 -0
  158. package/dist/skill-sh/adapter.d.ts.map +1 -0
  159. package/dist/skill-sh/adapter.js +258 -0
  160. package/dist/skill-sh/adapter.js.map +1 -0
  161. package/dist/skill-sh/converter.d.ts +37 -0
  162. package/dist/skill-sh/converter.d.ts.map +1 -0
  163. package/dist/skill-sh/converter.js +175 -0
  164. package/dist/skill-sh/converter.js.map +1 -0
  165. package/dist/skill-sh/discovery.d.ts +29 -0
  166. package/dist/skill-sh/discovery.d.ts.map +1 -0
  167. package/dist/skill-sh/discovery.js +189 -0
  168. package/dist/skill-sh/discovery.js.map +1 -0
  169. package/dist/skill-sh/index.d.ts +19 -0
  170. package/dist/skill-sh/index.d.ts.map +1 -0
  171. package/dist/skill-sh/index.js +20 -0
  172. package/dist/skill-sh/index.js.map +1 -0
  173. package/dist/skill-sh/quality.d.ts +51 -0
  174. package/dist/skill-sh/quality.d.ts.map +1 -0
  175. package/dist/skill-sh/quality.js +146 -0
  176. package/dist/skill-sh/quality.js.map +1 -0
  177. package/dist/skill-sh/registry.d.ts +58 -0
  178. package/dist/skill-sh/registry.d.ts.map +1 -0
  179. package/dist/skill-sh/registry.js +118 -0
  180. package/dist/skill-sh/registry.js.map +1 -0
  181. package/dist/skill-sh/types.d.ts +228 -0
  182. package/dist/skill-sh/types.d.ts.map +1 -0
  183. package/dist/skill-sh/types.js +9 -0
  184. package/dist/skill-sh/types.js.map +1 -0
  185. package/dist/types.d.ts +199 -0
  186. package/dist/types.d.ts.map +1 -0
  187. package/dist/types.js +10 -0
  188. package/dist/types.js.map +1 -0
  189. package/package.json +41 -0
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Capability Router
3
+ *
4
+ * Routes capability requests to the appropriate extension.
5
+ *
6
+ * @module @jclaw/core/extension-system/capability-router
7
+ */
8
+ /**
9
+ * Capability Router
10
+ *
11
+ * Provides capability lookup and routing functionality.
12
+ * Acts as a query interface over the extension registry.
13
+ */
14
+ export class CapabilityRouter {
15
+ registry;
16
+ constructor(registry) {
17
+ this.registry = registry;
18
+ }
19
+ /**
20
+ * Resolve a capability by name
21
+ *
22
+ * @param capabilityName - Name of the capability to resolve
23
+ * @returns Capability resolution or null if not found
24
+ */
25
+ resolve(capabilityName) {
26
+ const registered = this.registry.getCapability(capabilityName);
27
+ if (!registered)
28
+ return null;
29
+ return {
30
+ extensionName: registered.extension,
31
+ capability: registered.capability,
32
+ };
33
+ }
34
+ /**
35
+ * Check if a capability is available
36
+ *
37
+ * @param name - Capability name
38
+ * @returns True if capability is registered
39
+ */
40
+ hasCapability(name) {
41
+ return this.registry.hasCapability(name);
42
+ }
43
+ /**
44
+ * Get all available capability names
45
+ *
46
+ * @returns Array of capability names
47
+ */
48
+ getAvailableCapabilities() {
49
+ return this.registry.getCapabilityNames();
50
+ }
51
+ /**
52
+ * Get all capabilities with their providers
53
+ *
54
+ * @returns Array of capability resolutions
55
+ */
56
+ getAllCapabilities() {
57
+ return this.registry.getAllCapabilities().map((reg) => ({
58
+ extensionName: reg.extension,
59
+ capability: reg.capability,
60
+ }));
61
+ }
62
+ /**
63
+ * Get capabilities provided by a specific extension
64
+ *
65
+ * @param extensionName - Name of the extension
66
+ * @returns Array of capabilities or empty array if extension not found
67
+ */
68
+ getCapabilitiesByExtension(extensionName) {
69
+ return this.registry.getCapabilitiesByExtension(extensionName);
70
+ }
71
+ /**
72
+ * Check if an extension provides a specific capability
73
+ *
74
+ * @param extensionName - Name of the extension
75
+ * @param capabilityName - Name of the capability
76
+ * @returns True if the extension provides the capability
77
+ */
78
+ extensionProvides(extensionName, capabilityName) {
79
+ const registered = this.registry.getCapability(capabilityName);
80
+ return registered?.extension === extensionName;
81
+ }
82
+ /**
83
+ * Find capability by partial name match
84
+ *
85
+ * @param partial - Partial capability name to search for
86
+ * @returns Array of matching capabilities
87
+ */
88
+ searchCapabilities(partial) {
89
+ const lowerPartial = partial.toLowerCase();
90
+ const results = [];
91
+ for (const registered of this.registry.getAllCapabilities()) {
92
+ if (registered.capability.name.toLowerCase().includes(lowerPartial)) {
93
+ results.push({
94
+ extensionName: registered.extension,
95
+ capability: registered.capability,
96
+ });
97
+ }
98
+ }
99
+ return results;
100
+ }
101
+ /**
102
+ * Get the extension name that provides a capability
103
+ *
104
+ * @param capabilityName - Name of the capability
105
+ * @returns Extension name or undefined if not found
106
+ */
107
+ getProvider(capabilityName) {
108
+ const registered = this.registry.getCapability(capabilityName);
109
+ return registered?.extension;
110
+ }
111
+ /**
112
+ * Validate capability input against its schema
113
+ *
114
+ * @param capabilityName - Name of the capability
115
+ * @param input - Input to validate
116
+ * @returns True if valid, false if invalid or no schema defined
117
+ */
118
+ validateInput(capabilityName, input) {
119
+ const registered = this.registry.getCapability(capabilityName);
120
+ if (!registered)
121
+ return false;
122
+ const schema = registered.capability.inputSchema;
123
+ if (!schema)
124
+ return true; // No schema means no validation required
125
+ // Basic schema validation - in a real implementation,
126
+ // this would use a proper JSON Schema validator
127
+ return this.performBasicValidation(input, schema);
128
+ }
129
+ /**
130
+ * Basic input validation against schema
131
+ *
132
+ * Note: This is a simplified validation. For production use,
133
+ * integrate a proper JSON Schema validator like ajv.
134
+ */
135
+ performBasicValidation(input, schema) {
136
+ if (!input || typeof input !== 'object') {
137
+ return schema.type === 'null' || schema.type === undefined;
138
+ }
139
+ const schemaType = schema.type;
140
+ if (schemaType === 'object') {
141
+ const required = schema.required;
142
+ if (required && Array.isArray(required)) {
143
+ const inputObj = input;
144
+ for (const field of required) {
145
+ if (!(field in inputObj)) {
146
+ return false;
147
+ }
148
+ }
149
+ }
150
+ }
151
+ return true;
152
+ }
153
+ /**
154
+ * Get capability statistics
155
+ */
156
+ get stats() {
157
+ const capabilitiesByExtension = new Map();
158
+ for (const extension of this.registry.getAll()) {
159
+ capabilitiesByExtension.set(extension.name, extension.capabilities.length);
160
+ }
161
+ return {
162
+ totalCapabilities: this.registry.capabilityCount,
163
+ capabilitiesByExtension,
164
+ };
165
+ }
166
+ }
167
+ //# sourceMappingURL=capability-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-router.js","sourceRoot":"","sources":["../../src/extension-system/capability-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Extension System Module
3
+ *
4
+ * Provides extension registration, loading, and capability routing.
5
+ *
6
+ * @module @jclaw/core/extension-system
7
+ */
8
+ export { ExtensionRegistry, type RegisteredCapability } from './registry.js';
9
+ export { ExtensionLoader, type LoadOptions, type LoadResult, } from './loader.js';
10
+ export { CapabilityRouter, type CapabilityResolution, } from './capability-router.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extension-system/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EACL,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Extension System Module
3
+ *
4
+ * Provides extension registration, loading, and capability routing.
5
+ *
6
+ * @module @jclaw/core/extension-system
7
+ */
8
+ export { ExtensionRegistry } from './registry.js';
9
+ export { ExtensionLoader, } from './loader.js';
10
+ export { CapabilityRouter, } from './capability-router.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extension-system/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAA6B,MAAM,eAAe,CAAC;AAC7E,OAAO,EACL,eAAe,GAGhB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Extension Loader
3
+ *
4
+ * Handles loading, validating, and unloading extensions.
5
+ *
6
+ * @module @jclaw/core/extension-system/loader
7
+ */
8
+ import type { Extension } from '../types.js';
9
+ import { ExtensionRegistry } from './registry.js';
10
+ /**
11
+ * Options for extension loading
12
+ */
13
+ export interface LoadOptions {
14
+ /** Skip dependency resolution */
15
+ skipDependencies?: boolean;
16
+ }
17
+ /**
18
+ * Result of extension loading
19
+ */
20
+ export interface LoadResult {
21
+ /** Whether loading succeeded */
22
+ success: boolean;
23
+ /** Error message if loading failed */
24
+ error?: string;
25
+ }
26
+ /**
27
+ * Extension Loader
28
+ *
29
+ * Responsible for loading and unloading extensions with lifecycle management.
30
+ */
31
+ export declare class ExtensionLoader {
32
+ private readonly registry;
33
+ constructor(registry: ExtensionRegistry);
34
+ /**
35
+ * Load an extension into the registry
36
+ *
37
+ * This method:
38
+ * 1. Validates the extension structure
39
+ * 2. Calls the extension's install lifecycle method
40
+ * 3. Registers the extension with the registry
41
+ *
42
+ * @param extension - The extension to load
43
+ * @param runtime - Optional runtime context to pass to install
44
+ * @param options - Loading options
45
+ * @returns Load result indicating success or failure
46
+ */
47
+ load(extension: Extension, runtime?: unknown, options?: LoadOptions): Promise<LoadResult>;
48
+ /**
49
+ * Unload an extension from the registry
50
+ *
51
+ * This method:
52
+ * 1. Calls the extension's uninstall lifecycle method
53
+ * 2. Removes the extension from the registry
54
+ *
55
+ * @param name - Name of the extension to unload
56
+ * @returns Load result indicating success or failure
57
+ */
58
+ unload(name: string): Promise<LoadResult>;
59
+ /**
60
+ * Load multiple extensions in dependency order
61
+ *
62
+ * @param extensions - Extensions to load
63
+ * @param runtime - Optional runtime context
64
+ * @returns Map of extension names to load results
65
+ */
66
+ loadAll(extensions: Extension[], runtime?: unknown): Promise<Map<string, LoadResult>>;
67
+ /**
68
+ * Unload all registered extensions
69
+ *
70
+ * @returns Map of extension names to unload results
71
+ */
72
+ unloadAll(): Promise<Map<string, LoadResult>>;
73
+ /**
74
+ * Validate an extension object
75
+ *
76
+ * @param extension - Extension to validate
77
+ * @returns Error message or null if valid
78
+ */
79
+ validateExtension(extension: unknown): string | null;
80
+ /**
81
+ * Validate a capability object
82
+ */
83
+ private validateCapability;
84
+ /**
85
+ * Find extensions that depend on a given extension
86
+ */
87
+ private findDependents;
88
+ /**
89
+ * Sort extensions by their dependencies (topological sort)
90
+ */
91
+ private sortByDependencies;
92
+ }
93
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/extension-system/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,iBAAiB;IAExD;;;;;;;;;;;;OAYG;IACG,IAAI,CACR,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,OAAO,EACjB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,UAAU,CAAC;IA8CtB;;;;;;;;;OASG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAoC/C;;;;;;OAMG;IACG,OAAO,CACX,UAAU,EAAE,SAAS,EAAE,EACvB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAYnC;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAcnD;;;;;OAKG;IACH,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IA4CpD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAoC3B"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Extension Loader
3
+ *
4
+ * Handles loading, validating, and unloading extensions.
5
+ *
6
+ * @module @jclaw/core/extension-system/loader
7
+ */
8
+ /**
9
+ * Extension Loader
10
+ *
11
+ * Responsible for loading and unloading extensions with lifecycle management.
12
+ */
13
+ export class ExtensionLoader {
14
+ registry;
15
+ constructor(registry) {
16
+ this.registry = registry;
17
+ }
18
+ /**
19
+ * Load an extension into the registry
20
+ *
21
+ * This method:
22
+ * 1. Validates the extension structure
23
+ * 2. Calls the extension's install lifecycle method
24
+ * 3. Registers the extension with the registry
25
+ *
26
+ * @param extension - The extension to load
27
+ * @param runtime - Optional runtime context to pass to install
28
+ * @param options - Loading options
29
+ * @returns Load result indicating success or failure
30
+ */
31
+ async load(extension, runtime, options) {
32
+ try {
33
+ // Validate extension structure
34
+ const validationError = this.validateExtension(extension);
35
+ if (validationError) {
36
+ return { success: false, error: validationError };
37
+ }
38
+ // Check for existing registration
39
+ if (this.registry.has(extension.name)) {
40
+ return {
41
+ success: false,
42
+ error: `Extension "${extension.name}" is already loaded`,
43
+ };
44
+ }
45
+ // Check dependencies if not skipped
46
+ if (!options?.skipDependencies && extension.dependencies) {
47
+ const missingDeps = extension.dependencies.filter((dep) => !this.registry.has(dep));
48
+ if (missingDeps.length > 0) {
49
+ return {
50
+ success: false,
51
+ error: `Missing required dependencies: ${missingDeps.join(', ')}`,
52
+ };
53
+ }
54
+ }
55
+ // Call install lifecycle method
56
+ if (extension.install) {
57
+ await extension.install(runtime);
58
+ }
59
+ // Register the extension
60
+ this.registry.register(extension);
61
+ return { success: true };
62
+ }
63
+ catch (error) {
64
+ return {
65
+ success: false,
66
+ error: error instanceof Error ? error.message : 'Unknown error',
67
+ };
68
+ }
69
+ }
70
+ /**
71
+ * Unload an extension from the registry
72
+ *
73
+ * This method:
74
+ * 1. Calls the extension's uninstall lifecycle method
75
+ * 2. Removes the extension from the registry
76
+ *
77
+ * @param name - Name of the extension to unload
78
+ * @returns Load result indicating success or failure
79
+ */
80
+ async unload(name) {
81
+ try {
82
+ const extension = this.registry.get(name);
83
+ if (!extension) {
84
+ return {
85
+ success: false,
86
+ error: `Extension "${name}" is not loaded`,
87
+ };
88
+ }
89
+ // Check if other extensions depend on this one
90
+ const dependents = this.findDependents(name);
91
+ if (dependents.length > 0) {
92
+ return {
93
+ success: false,
94
+ error: `Cannot unload: extensions [${dependents.join(', ')}] depend on "${name}"`,
95
+ };
96
+ }
97
+ // Call uninstall lifecycle method
98
+ if (extension.uninstall) {
99
+ await extension.uninstall();
100
+ }
101
+ // Unregister the extension
102
+ this.registry.unregister(name);
103
+ return { success: true };
104
+ }
105
+ catch (error) {
106
+ return {
107
+ success: false,
108
+ error: error instanceof Error ? error.message : 'Unknown error',
109
+ };
110
+ }
111
+ }
112
+ /**
113
+ * Load multiple extensions in dependency order
114
+ *
115
+ * @param extensions - Extensions to load
116
+ * @param runtime - Optional runtime context
117
+ * @returns Map of extension names to load results
118
+ */
119
+ async loadAll(extensions, runtime) {
120
+ const results = new Map();
121
+ const sorted = this.sortByDependencies(extensions);
122
+ for (const extension of sorted) {
123
+ const result = await this.load(extension, runtime);
124
+ results.set(extension.name, result);
125
+ }
126
+ return results;
127
+ }
128
+ /**
129
+ * Unload all registered extensions
130
+ *
131
+ * @returns Map of extension names to unload results
132
+ */
133
+ async unloadAll() {
134
+ const results = new Map();
135
+ // Unload in reverse dependency order
136
+ const names = [...this.registry.getNames()].reverse();
137
+ for (const name of names) {
138
+ const result = await this.unload(name);
139
+ results.set(name, result);
140
+ }
141
+ return results;
142
+ }
143
+ /**
144
+ * Validate an extension object
145
+ *
146
+ * @param extension - Extension to validate
147
+ * @returns Error message or null if valid
148
+ */
149
+ validateExtension(extension) {
150
+ if (!extension || typeof extension !== 'object') {
151
+ return 'Extension must be an object';
152
+ }
153
+ const ext = extension;
154
+ if (!ext.name || typeof ext.name !== 'string') {
155
+ return 'Extension must have a string "name" property';
156
+ }
157
+ if (!ext.version || typeof ext.version !== 'string') {
158
+ return 'Extension must have a string "version" property';
159
+ }
160
+ if (!ext.description || typeof ext.description !== 'string') {
161
+ return 'Extension must have a string "description" property';
162
+ }
163
+ if (!Array.isArray(ext.capabilities)) {
164
+ return 'Extension must have an array "capabilities" property';
165
+ }
166
+ // Validate each capability
167
+ for (let i = 0; i < ext.capabilities.length; i++) {
168
+ const capError = this.validateCapability(ext.capabilities[i], i);
169
+ if (capError)
170
+ return capError;
171
+ }
172
+ // Validate dependencies if present
173
+ if (ext.dependencies !== undefined && !Array.isArray(ext.dependencies)) {
174
+ return 'Extension "dependencies" must be an array of strings';
175
+ }
176
+ if (ext.optionalDependencies !== undefined &&
177
+ !Array.isArray(ext.optionalDependencies)) {
178
+ return 'Extension "optionalDependencies" must be an array of strings';
179
+ }
180
+ return null;
181
+ }
182
+ /**
183
+ * Validate a capability object
184
+ */
185
+ validateCapability(capability, index) {
186
+ if (!capability || typeof capability !== 'object') {
187
+ return `Capability at index ${index} must be an object`;
188
+ }
189
+ const cap = capability;
190
+ if (!cap.name || typeof cap.name !== 'string') {
191
+ return `Capability at index ${index} must have a string "name" property`;
192
+ }
193
+ if (!cap.description || typeof cap.description !== 'string') {
194
+ return `Capability at index ${index} must have a string "description" property`;
195
+ }
196
+ return null;
197
+ }
198
+ /**
199
+ * Find extensions that depend on a given extension
200
+ */
201
+ findDependents(name) {
202
+ const dependents = [];
203
+ for (const ext of this.registry.getAll()) {
204
+ if (ext.dependencies?.includes(name)) {
205
+ dependents.push(ext.name);
206
+ }
207
+ }
208
+ return dependents;
209
+ }
210
+ /**
211
+ * Sort extensions by their dependencies (topological sort)
212
+ */
213
+ sortByDependencies(extensions) {
214
+ const sorted = [];
215
+ const visited = new Set();
216
+ const visiting = new Set();
217
+ const visit = (extension) => {
218
+ if (visited.has(extension.name))
219
+ return true;
220
+ if (visiting.has(extension.name))
221
+ return false; // Circular dependency
222
+ visiting.add(extension.name);
223
+ // Visit dependencies first
224
+ if (extension.dependencies) {
225
+ for (const depName of extension.dependencies) {
226
+ const dep = extensions.find((e) => e.name === depName);
227
+ if (dep && !visit(dep)) {
228
+ return false;
229
+ }
230
+ }
231
+ }
232
+ visiting.delete(extension.name);
233
+ visited.add(extension.name);
234
+ sorted.push(extension);
235
+ return true;
236
+ };
237
+ for (const extension of extensions) {
238
+ if (!visited.has(extension.name)) {
239
+ visit(extension);
240
+ }
241
+ }
242
+ return sorted;
243
+ }
244
+ }
245
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/extension-system/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Extension Registry
3
+ *
4
+ * Manages registration and lookup of extensions and their capabilities.
5
+ *
6
+ * @module @jclaw/core/extension-system/registry
7
+ */
8
+ import type { Extension, Capability } from '../types.js';
9
+ /**
10
+ * Represents a registered capability with its source extension
11
+ */
12
+ export interface RegisteredCapability {
13
+ /** Name of the extension providing this capability */
14
+ extension: string;
15
+ /** The capability definition */
16
+ capability: Capability;
17
+ }
18
+ /**
19
+ * Extension Registry
20
+ *
21
+ * Central registry for managing extensions and their capabilities.
22
+ * Provides O(1) lookup for both extensions and capabilities.
23
+ */
24
+ export declare class ExtensionRegistry {
25
+ private readonly extensions;
26
+ private readonly capabilities;
27
+ /**
28
+ * Register an extension and all its capabilities
29
+ *
30
+ * @param extension - The extension to register
31
+ * @throws Error if extension with same name is already registered
32
+ */
33
+ register(extension: Extension): void;
34
+ /**
35
+ * Unregister an extension and all its capabilities
36
+ *
37
+ * @param name - Name of the extension to unregister
38
+ */
39
+ unregister(name: string): void;
40
+ /**
41
+ * Get an extension by name
42
+ *
43
+ * @param name - Extension name
44
+ * @returns The extension or undefined if not found
45
+ */
46
+ get(name: string): Extension | undefined;
47
+ /**
48
+ * Check if an extension is registered
49
+ *
50
+ * @param name - Extension name
51
+ * @returns True if extension is registered
52
+ */
53
+ has(name: string): boolean;
54
+ /**
55
+ * Get all registered extensions
56
+ *
57
+ * @returns Array of all extensions
58
+ */
59
+ getAll(): Extension[];
60
+ /**
61
+ * Get all extension names
62
+ *
63
+ * @returns Array of extension names
64
+ */
65
+ getNames(): string[];
66
+ /**
67
+ * Get a registered capability by name
68
+ *
69
+ * @param name - Capability name
70
+ * @returns The registered capability or undefined if not found
71
+ */
72
+ getCapability(name: string): RegisteredCapability | undefined;
73
+ /**
74
+ * Check if a capability is registered
75
+ *
76
+ * @param name - Capability name
77
+ * @returns True if capability is registered
78
+ */
79
+ hasCapability(name: string): boolean;
80
+ /**
81
+ * Get all registered capabilities
82
+ *
83
+ * @returns Array of all registered capabilities
84
+ */
85
+ getAllCapabilities(): RegisteredCapability[];
86
+ /**
87
+ * Get all capability names
88
+ *
89
+ * @returns Array of capability names
90
+ */
91
+ getCapabilityNames(): string[];
92
+ /**
93
+ * Get capabilities provided by a specific extension
94
+ *
95
+ * @param extensionName - Name of the extension
96
+ * @returns Array of capabilities or empty array if extension not found
97
+ */
98
+ getCapabilitiesByExtension(extensionName: string): Capability[];
99
+ /**
100
+ * Clear all registered extensions and capabilities
101
+ */
102
+ clear(): void;
103
+ /**
104
+ * Get the number of registered extensions
105
+ */
106
+ get size(): number;
107
+ /**
108
+ * Get the number of registered capabilities
109
+ */
110
+ get capabilityCount(): number;
111
+ }
112
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/extension-system/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,UAAU,EAAE,UAAU,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqC;IAChE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgD;IAE7E;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IA4BpC;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAa9B;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIxC;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;;;OAIG;IACH,MAAM,IAAI,SAAS,EAAE;IAIrB;;;;OAIG;IACH,QAAQ,IAAI,MAAM,EAAE;IAIpB;;;;;OAKG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAI7D;;;;;OAKG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIpC;;;;OAIG;IACH,kBAAkB,IAAI,oBAAoB,EAAE;IAI5C;;;;OAIG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;;;;OAKG;IACH,0BAA0B,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE;IAK/D;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;CACF"}