@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.
- package/dist/auto-skill/generator.d.ts +30 -0
- package/dist/auto-skill/generator.d.ts.map +1 -0
- package/dist/auto-skill/generator.js +262 -0
- package/dist/auto-skill/generator.js.map +1 -0
- package/dist/auto-skill/index.d.ts +11 -0
- package/dist/auto-skill/index.d.ts.map +1 -0
- package/dist/auto-skill/index.js +10 -0
- package/dist/auto-skill/index.js.map +1 -0
- package/dist/auto-skill/installer.d.ts +44 -0
- package/dist/auto-skill/installer.d.ts.map +1 -0
- package/dist/auto-skill/installer.js +201 -0
- package/dist/auto-skill/installer.js.map +1 -0
- package/dist/auto-skill/types.d.ts +179 -0
- package/dist/auto-skill/types.d.ts.map +1 -0
- package/dist/auto-skill/types.js +9 -0
- package/dist/auto-skill/types.js.map +1 -0
- package/dist/cli/commands/config.d.ts +16 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +119 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/exec.d.ts +12 -0
- package/dist/cli/commands/exec.d.ts.map +1 -0
- package/dist/cli/commands/exec.js +41 -0
- package/dist/cli/commands/exec.js.map +1 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +91 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/run.d.ts +9 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +13 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/context/index.d.ts +6 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +12 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/memsearch-client.d.ts +34 -0
- package/dist/context/memsearch-client.d.ts.map +1 -0
- package/dist/context/memsearch-client.js +182 -0
- package/dist/context/memsearch-client.js.map +1 -0
- package/dist/context/mock-client.d.ts +116 -0
- package/dist/context/mock-client.d.ts.map +1 -0
- package/dist/context/mock-client.js +150 -0
- package/dist/context/mock-client.js.map +1 -0
- package/dist/context/openviking-client.d.ts +87 -0
- package/dist/context/openviking-client.d.ts.map +1 -0
- package/dist/context/openviking-client.js +166 -0
- package/dist/context/openviking-client.js.map +1 -0
- package/dist/context/openviking-mcp-client.d.ts +29 -0
- package/dist/context/openviking-mcp-client.d.ts.map +1 -0
- package/dist/context/openviking-mcp-client.js +81 -0
- package/dist/context/openviking-mcp-client.js.map +1 -0
- package/dist/context/simple-memory-client.d.ts +43 -0
- package/dist/context/simple-memory-client.d.ts.map +1 -0
- package/dist/context/simple-memory-client.enhanced.d.ts +39 -0
- package/dist/context/simple-memory-client.enhanced.d.ts.map +1 -0
- package/dist/context/simple-memory-client.enhanced.js +207 -0
- package/dist/context/simple-memory-client.enhanced.js.map +1 -0
- package/dist/context/simple-memory-client.js +270 -0
- package/dist/context/simple-memory-client.js.map +1 -0
- package/dist/evolution/continuous.d.ts +127 -0
- package/dist/evolution/continuous.d.ts.map +1 -0
- package/dist/evolution/continuous.js +238 -0
- package/dist/evolution/continuous.js.map +1 -0
- package/dist/evolution/engine.d.ts +97 -0
- package/dist/evolution/engine.d.ts.map +1 -0
- package/dist/evolution/engine.js +187 -0
- package/dist/evolution/engine.js.map +1 -0
- package/dist/evolution/evolver-adapter.d.ts +104 -0
- package/dist/evolution/evolver-adapter.d.ts.map +1 -0
- package/dist/evolution/evolver-adapter.js +227 -0
- package/dist/evolution/evolver-adapter.js.map +1 -0
- package/dist/evolution/index.d.ts +9 -0
- package/dist/evolution/index.d.ts.map +1 -0
- package/dist/evolution/index.js +8 -0
- package/dist/evolution/index.js.map +1 -0
- package/dist/evolution/memory.d.ts +106 -0
- package/dist/evolution/memory.d.ts.map +1 -0
- package/dist/evolution/memory.js +232 -0
- package/dist/evolution/memory.js.map +1 -0
- package/dist/evolution/mutation.d.ts +66 -0
- package/dist/evolution/mutation.d.ts.map +1 -0
- package/dist/evolution/mutation.js +139 -0
- package/dist/evolution/mutation.js.map +1 -0
- package/dist/evolution/sandbox.d.ts +96 -0
- package/dist/evolution/sandbox.d.ts.map +1 -0
- package/dist/evolution/sandbox.js +194 -0
- package/dist/evolution/sandbox.js.map +1 -0
- package/dist/evolution/types.d.ts +93 -0
- package/dist/evolution/types.d.ts.map +1 -0
- package/dist/evolution/types.js +9 -0
- package/dist/evolution/types.js.map +1 -0
- package/dist/executor/index.d.ts +10 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +10 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/executor/interface.d.ts +9 -0
- package/dist/executor/interface.d.ts.map +1 -0
- package/dist/executor/interface.js +9 -0
- package/dist/executor/interface.js.map +1 -0
- package/dist/executor/local.d.ts +36 -0
- package/dist/executor/local.d.ts.map +1 -0
- package/dist/executor/local.js +95 -0
- package/dist/executor/local.js.map +1 -0
- package/dist/extension-system/capability-router.d.ts +106 -0
- package/dist/extension-system/capability-router.d.ts.map +1 -0
- package/dist/extension-system/capability-router.js +167 -0
- package/dist/extension-system/capability-router.js.map +1 -0
- package/dist/extension-system/index.d.ts +11 -0
- package/dist/extension-system/index.d.ts.map +1 -0
- package/dist/extension-system/index.js +11 -0
- package/dist/extension-system/index.js.map +1 -0
- package/dist/extension-system/loader.d.ts +93 -0
- package/dist/extension-system/loader.d.ts.map +1 -0
- package/dist/extension-system/loader.js +245 -0
- package/dist/extension-system/loader.js.map +1 -0
- package/dist/extension-system/registry.d.ts +112 -0
- package/dist/extension-system/registry.d.ts.map +1 -0
- package/dist/extension-system/registry.js +161 -0
- package/dist/extension-system/registry.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/network/client.d.ts +130 -0
- package/dist/network/client.d.ts.map +1 -0
- package/dist/network/client.js +230 -0
- package/dist/network/client.js.map +1 -0
- package/dist/network/index.d.ts +10 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/index.js +10 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/protocol.d.ts +159 -0
- package/dist/network/protocol.d.ts.map +1 -0
- package/dist/network/protocol.js +118 -0
- package/dist/network/protocol.js.map +1 -0
- package/dist/runtime/agent.d.ts +124 -0
- package/dist/runtime/agent.d.ts.map +1 -0
- package/dist/runtime/agent.js +286 -0
- package/dist/runtime/agent.js.map +1 -0
- package/dist/runtime/agent_fixed.d.ts +39 -0
- package/dist/runtime/agent_fixed.d.ts.map +1 -0
- package/dist/runtime/agent_fixed.js +193 -0
- package/dist/runtime/agent_fixed.js.map +1 -0
- package/dist/runtime/index.d.ts +11 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +11 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/llm-client.d.ts +108 -0
- package/dist/runtime/llm-client.d.ts.map +1 -0
- package/dist/runtime/llm-client.js +125 -0
- package/dist/runtime/llm-client.js.map +1 -0
- package/dist/runtime/task-executor.d.ts +92 -0
- package/dist/runtime/task-executor.d.ts.map +1 -0
- package/dist/runtime/task-executor.js +203 -0
- package/dist/runtime/task-executor.js.map +1 -0
- package/dist/skill-sh/adapter.d.ts +40 -0
- package/dist/skill-sh/adapter.d.ts.map +1 -0
- package/dist/skill-sh/adapter.js +258 -0
- package/dist/skill-sh/adapter.js.map +1 -0
- package/dist/skill-sh/converter.d.ts +37 -0
- package/dist/skill-sh/converter.d.ts.map +1 -0
- package/dist/skill-sh/converter.js +175 -0
- package/dist/skill-sh/converter.js.map +1 -0
- package/dist/skill-sh/discovery.d.ts +29 -0
- package/dist/skill-sh/discovery.d.ts.map +1 -0
- package/dist/skill-sh/discovery.js +189 -0
- package/dist/skill-sh/discovery.js.map +1 -0
- package/dist/skill-sh/index.d.ts +19 -0
- package/dist/skill-sh/index.d.ts.map +1 -0
- package/dist/skill-sh/index.js +20 -0
- package/dist/skill-sh/index.js.map +1 -0
- package/dist/skill-sh/quality.d.ts +51 -0
- package/dist/skill-sh/quality.d.ts.map +1 -0
- package/dist/skill-sh/quality.js +146 -0
- package/dist/skill-sh/quality.js.map +1 -0
- package/dist/skill-sh/registry.d.ts +58 -0
- package/dist/skill-sh/registry.d.ts.map +1 -0
- package/dist/skill-sh/registry.js +118 -0
- package/dist/skill-sh/registry.js.map +1 -0
- package/dist/skill-sh/types.d.ts +228 -0
- package/dist/skill-sh/types.d.ts.map +1 -0
- package/dist/skill-sh/types.js +9 -0
- package/dist/skill-sh/types.js.map +1 -0
- package/dist/types.d.ts +199 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- 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":"AAAA;;;;;;GAMG;AAeH;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,QAA2B;QAA3B,aAAQ,GAAR,QAAQ,CAAmB;IAAG,CAAC;IAE5D;;;;;OAKG;IACH,OAAO,CAAC,cAAsB;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE7B,OAAO;YACL,aAAa,EAAE,UAAU,CAAC,SAAS;YACnC,UAAU,EAAE,UAAU,CAAC,UAAU;SAClC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,wBAAwB;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACtD,aAAa,EAAE,GAAG,CAAC,SAAS;YAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACH,0BAA0B,CAAC,aAAqB;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACjE,CAAC;IAED;;;;;;OAMG;IACH,iBAAiB,CAAC,aAAqB,EAAE,cAAsB;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC/D,OAAO,UAAU,EAAE,SAAS,KAAK,aAAa,CAAC;IACjD,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,OAAe;QAChC,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC5D,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC;oBACX,aAAa,EAAE,UAAU,CAAC,SAAS;oBACnC,UAAU,EAAE,UAAU,CAAC,UAAU;iBAClC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,cAAsB;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC/D,OAAO,UAAU,EAAE,SAAS,CAAC;IAC/B,CAAC;IAED;;;;;;OAMG;IACH,aAAa,CAAC,cAAsB,EAAE,KAAc;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAE9B,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,CAAC,yCAAyC;QAEnE,sDAAsD;QACtD,gDAAgD;QAChD,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAED;;;;;OAKG;IACK,sBAAsB,CAC5B,KAAc,EACd,MAA+B;QAE/B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;QAC7D,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAA0B,CAAC;QAErD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAgC,CAAC;YACzD,IAAI,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,KAAgC,CAAC;gBAClD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;oBAC7B,IAAI,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,EAAE,CAAC;wBACzB,OAAO,KAAK,CAAC;oBACf,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QAIP,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE1D,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,uBAAuB,CAAC,GAAG,CACzB,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,YAAY,CAAC,MAAM,CAC9B,CAAC;QACJ,CAAC;QAED,OAAO;YACL,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe;YAChD,uBAAuB;SACxB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -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"}
|