@theia/ai-core 1.75.0-next.8 → 1.75.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/lib/browser/agent-plugin-ui-bridge.d.ts +26 -0
- package/lib/browser/agent-plugin-ui-bridge.d.ts.map +1 -0
- package/lib/browser/agent-plugin-ui-bridge.js +20 -0
- package/lib/browser/agent-plugin-ui-bridge.js.map +1 -0
- package/lib/browser/ai-core-command-contribution.d.ts.map +1 -1
- package/lib/browser/ai-core-command-contribution.js +4 -1
- package/lib/browser/ai-core-command-contribution.js.map +1 -1
- package/lib/browser/ai-core-frontend-module.d.ts.map +1 -1
- package/lib/browser/ai-core-frontend-module.js +6 -0
- package/lib/browser/ai-core-frontend-module.js.map +1 -1
- package/lib/browser/ai-settings-service.js +1 -0
- package/lib/browser/ai-settings-service.js.map +1 -1
- package/lib/browser/frontend-language-model-alias-registry.js +1 -1
- package/lib/browser/frontend-language-model-registry.d.ts +2 -0
- package/lib/browser/frontend-language-model-registry.d.ts.map +1 -1
- package/lib/browser/frontend-language-model-registry.js +22 -1
- package/lib/browser/frontend-language-model-registry.js.map +1 -1
- package/lib/browser/generic-capabilities-variable-contribution.d.ts.map +1 -1
- package/lib/browser/generic-capabilities-variable-contribution.js +4 -1
- package/lib/browser/generic-capabilities-variable-contribution.js.map +1 -1
- package/lib/browser/hide-ai-preferences-contribution.d.ts +30 -0
- package/lib/browser/hide-ai-preferences-contribution.d.ts.map +1 -0
- package/lib/browser/hide-ai-preferences-contribution.js +90 -0
- package/lib/browser/hide-ai-preferences-contribution.js.map +1 -0
- package/lib/browser/hide-ai-preferences-contribution.spec.d.ts +2 -0
- package/lib/browser/hide-ai-preferences-contribution.spec.d.ts.map +1 -0
- package/lib/browser/hide-ai-preferences-contribution.spec.js +95 -0
- package/lib/browser/hide-ai-preferences-contribution.spec.js.map +1 -0
- package/lib/browser/index.d.ts +3 -0
- package/lib/browser/index.d.ts.map +1 -1
- package/lib/browser/index.js +3 -0
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/prompt-variable-contribution.d.ts +1 -1
- package/lib/browser/prompt-variable-contribution.d.ts.map +1 -1
- package/lib/browser/prompt-variable-contribution.js +1 -0
- package/lib/browser/prompt-variable-contribution.js.map +1 -1
- package/lib/browser/skill-prompt-coordinator.d.ts +9 -1
- package/lib/browser/skill-prompt-coordinator.d.ts.map +1 -1
- package/lib/browser/skill-prompt-coordinator.js +29 -14
- package/lib/browser/skill-prompt-coordinator.js.map +1 -1
- package/lib/browser/skill-prompt-coordinator.spec.d.ts +2 -0
- package/lib/browser/skill-prompt-coordinator.spec.d.ts.map +1 -0
- package/lib/browser/skill-prompt-coordinator.spec.js +98 -0
- package/lib/browser/skill-prompt-coordinator.spec.js.map +1 -0
- package/lib/browser/skill-registry-ui-bridge.d.ts +25 -0
- package/lib/browser/skill-registry-ui-bridge.d.ts.map +1 -0
- package/lib/browser/skill-registry-ui-bridge.js +20 -0
- package/lib/browser/skill-registry-ui-bridge.js.map +1 -0
- package/lib/browser/skill-service.d.ts +33 -8
- package/lib/browser/skill-service.d.ts.map +1 -1
- package/lib/browser/skill-service.js +95 -39
- package/lib/browser/skill-service.js.map +1 -1
- package/lib/browser/skill-service.spec.js +181 -2
- package/lib/browser/skill-service.spec.js.map +1 -1
- package/lib/browser/skills-variable-contribution.d.ts +4 -0
- package/lib/browser/skills-variable-contribution.d.ts.map +1 -1
- package/lib/browser/skills-variable-contribution.js +10 -1
- package/lib/browser/skills-variable-contribution.js.map +1 -1
- package/lib/browser/skills-variable-contribution.spec.js +6 -0
- package/lib/browser/skills-variable-contribution.spec.js.map +1 -1
- package/lib/browser/theia-variable-contribution.js +6 -12
- package/lib/browser/theia-variable-contribution.js.map +1 -1
- package/lib/common/ai-core-preferences.d.ts +17 -0
- package/lib/common/ai-core-preferences.d.ts.map +1 -1
- package/lib/common/ai-core-preferences.js +9 -1
- package/lib/common/ai-core-preferences.js.map +1 -1
- package/lib/common/ai-variable-resource.d.ts +2 -1
- package/lib/common/ai-variable-resource.d.ts.map +1 -1
- package/lib/common/ai-variable-resource.js +6 -1
- package/lib/common/ai-variable-resource.js.map +1 -1
- package/lib/common/capability-variable-contribution.d.ts +1 -1
- package/lib/common/capability-variable-contribution.d.ts.map +1 -1
- package/lib/common/capability-variable-contribution.js +1 -0
- package/lib/common/capability-variable-contribution.js.map +1 -1
- package/lib/common/language-model.d.ts +16 -2
- package/lib/common/language-model.d.ts.map +1 -1
- package/lib/common/language-model.js +39 -3
- package/lib/common/language-model.js.map +1 -1
- package/lib/common/language-model.spec.js +75 -0
- package/lib/common/language-model.spec.js.map +1 -1
- package/lib/common/prompt-service.d.ts.map +1 -1
- package/lib/common/prompt-service.js +7 -4
- package/lib/common/prompt-service.js.map +1 -1
- package/lib/common/prompt-service.spec.js +36 -0
- package/lib/common/prompt-service.spec.js.map +1 -1
- package/lib/common/skill.d.ts +31 -7
- package/lib/common/skill.d.ts.map +1 -1
- package/lib/common/skill.js +37 -14
- package/lib/common/skill.js.map +1 -1
- package/lib/common/skill.spec.js +70 -0
- package/lib/common/skill.spec.js.map +1 -1
- package/lib/common/today-variable-contribution.d.ts.map +1 -1
- package/lib/common/today-variable-contribution.js +1 -1
- package/lib/common/today-variable-contribution.js.map +1 -1
- package/lib/common/tool-invocation-registry.d.ts +2 -1
- package/lib/common/tool-invocation-registry.d.ts.map +1 -1
- package/lib/common/tool-invocation-registry.js +6 -1
- package/lib/common/tool-invocation-registry.js.map +1 -1
- package/lib/node/language-model-frontend-delegate.d.ts +2 -2
- package/lib/node/language-model-frontend-delegate.d.ts.map +1 -1
- package/lib/node/language-model-frontend-delegate.js +1 -0
- package/lib/node/language-model-frontend-delegate.js.map +1 -1
- package/package.json +12 -12
- package/src/browser/agent-plugin-ui-bridge.ts +43 -0
- package/src/browser/ai-core-command-contribution.ts +7 -1
- package/src/browser/ai-core-frontend-module.ts +11 -2
- package/src/browser/ai-settings-service.ts +2 -2
- package/src/browser/frontend-language-model-alias-registry.ts +1 -1
- package/src/browser/frontend-language-model-registry.ts +6 -2
- package/src/browser/generic-capabilities-variable-contribution.ts +4 -1
- package/src/browser/hide-ai-preferences-contribution.spec.ts +117 -0
- package/src/browser/hide-ai-preferences-contribution.ts +88 -0
- package/src/browser/index.ts +3 -0
- package/src/browser/prompt-variable-contribution.ts +3 -3
- package/src/browser/skill-prompt-coordinator.spec.ts +114 -0
- package/src/browser/skill-prompt-coordinator.ts +29 -17
- package/src/browser/skill-registry-ui-bridge.ts +41 -0
- package/src/browser/skill-service.spec.ts +229 -4
- package/src/browser/skill-service.ts +120 -43
- package/src/browser/skills-variable-contribution.spec.ts +6 -0
- package/src/browser/skills-variable-contribution.ts +14 -4
- package/src/browser/theia-variable-contribution.ts +12 -12
- package/src/common/ai-core-preferences.ts +19 -0
- package/src/common/ai-variable-resource.ts +6 -3
- package/src/common/capability-variable-contribution.ts +3 -3
- package/src/common/language-model.spec.ts +83 -0
- package/src/common/language-model.ts +35 -5
- package/src/common/prompt-service.spec.ts +43 -0
- package/src/common/prompt-service.ts +8 -6
- package/src/common/skill.spec.ts +99 -0
- package/src/common/skill.ts +52 -17
- package/src/common/today-variable-contribution.ts +2 -1
- package/src/common/tool-invocation-registry.ts +5 -2
- package/src/node/language-model-frontend-delegate.ts +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-service.d.ts","sourceRoot":"","sources":["../../src/browser/skill-service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-service.d.ts","sourceRoot":"","sources":["../../src/browser/skill-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
16
|
// *****************************************************************************
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.DefaultSkillService = exports.SkillService = void 0;
|
|
18
|
+
exports.DefaultSkillService = exports.SkillService = exports.SkillDirectoryContribution = void 0;
|
|
19
19
|
const tslib_1 = require("tslib");
|
|
20
20
|
const inversify_1 = require("@theia/core/shared/inversify");
|
|
21
21
|
const promise_util_1 = require("@theia/core/lib/common/promise-util");
|
|
@@ -28,11 +28,16 @@ const ai_core_preferences_1 = require("../common/ai-core-preferences");
|
|
|
28
28
|
const skill_1 = require("../common/skill");
|
|
29
29
|
/** Debounce delay for coalescing rapid file system events */
|
|
30
30
|
const UPDATE_DEBOUNCE_MS = 50;
|
|
31
|
+
exports.SkillDirectoryContribution = Symbol('SkillDirectoryContribution');
|
|
31
32
|
exports.SkillService = Symbol('SkillService');
|
|
32
33
|
let DefaultSkillService = class DefaultSkillService {
|
|
33
34
|
constructor() {
|
|
35
|
+
/** Keyed by {@link Skill.qualifiedName}. */
|
|
34
36
|
this.skills = new Map();
|
|
37
|
+
/** Watchers of the current scan; disposed and rebuilt on every rescan. */
|
|
35
38
|
this.toDispose = new core_1.DisposableCollection();
|
|
39
|
+
/** Kept apart from {@link toDispose}, which does not survive a rescan. */
|
|
40
|
+
this.toDisposeOnServiceDispose = new core_1.DisposableCollection();
|
|
36
41
|
this.watchedDirectories = new Set();
|
|
37
42
|
this.parentWatchers = new Map();
|
|
38
43
|
this.onSkillsChangedEmitter = new core_1.Emitter();
|
|
@@ -47,6 +52,11 @@ let DefaultSkillService = class DefaultSkillService {
|
|
|
47
52
|
return this._ready.promise;
|
|
48
53
|
}
|
|
49
54
|
init() {
|
|
55
|
+
for (const contribution of this.skillDirectoryContributions.getContributions()) {
|
|
56
|
+
if (contribution.onDidChange) {
|
|
57
|
+
this.toDisposeOnServiceDispose.push(contribution.onDidChange(() => this.scheduleUpdate()));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
50
60
|
this.fileService.onDidFilesChange(async (event) => {
|
|
51
61
|
for (const change of event.changes) {
|
|
52
62
|
if (change.type === 1 /* FileChangeType.ADDED */) {
|
|
@@ -83,33 +93,57 @@ let DefaultSkillService = class DefaultSkillService {
|
|
|
83
93
|
this.scheduleUpdate();
|
|
84
94
|
}
|
|
85
95
|
});
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
this.
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
96
|
+
this.initializeSkills();
|
|
97
|
+
}
|
|
98
|
+
/** Runs the initial scan once the skill directory sources are known. {@link ready} always resolves, even if the scan failed. */
|
|
99
|
+
async initializeSkills() {
|
|
100
|
+
try {
|
|
101
|
+
// The workspace contributes the workspace skill directories, the preferences the configured ones.
|
|
102
|
+
await Promise.all([this.workspaceService.ready, this.preferences.ready]);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
this.logger.error('Failed to resolve skill directory sources, scanning the already known directories', error);
|
|
106
|
+
}
|
|
107
|
+
// Listen for changes before the initial scan, otherwise a change landing while it runs is recorded as
|
|
108
|
+
// already applied by the snapshot below and dropped. update()'s in-progress guard coalesces the overlap.
|
|
109
|
+
this.lastSkillDirectoriesValue = JSON.stringify(this.preferences[ai_core_preferences_1.PREFERENCE_NAME_SKILL_DIRECTORIES]);
|
|
110
|
+
this.preferences.onPreferenceChanged(event => {
|
|
111
|
+
if (event.preferenceName === ai_core_preferences_1.PREFERENCE_NAME_SKILL_DIRECTORIES) {
|
|
112
|
+
const currentValue = JSON.stringify(this.preferences[ai_core_preferences_1.PREFERENCE_NAME_SKILL_DIRECTORIES]);
|
|
113
|
+
if (currentValue === this.lastSkillDirectoriesValue) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.lastSkillDirectoriesValue = currentValue;
|
|
117
|
+
this.scheduleUpdate();
|
|
118
|
+
}
|
|
106
119
|
});
|
|
120
|
+
this.workspaceService.onWorkspaceChanged(() => {
|
|
121
|
+
this.scheduleUpdate();
|
|
122
|
+
});
|
|
123
|
+
try {
|
|
124
|
+
await this.update();
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
this.logger.error('Initial skill scan failed', error);
|
|
128
|
+
}
|
|
129
|
+
this._ready.resolve();
|
|
107
130
|
}
|
|
108
131
|
getSkills() {
|
|
109
132
|
return Array.from(this.skills.values());
|
|
110
133
|
}
|
|
111
134
|
getSkill(name) {
|
|
112
|
-
|
|
135
|
+
const qualifiedMatch = this.skills.get(name);
|
|
136
|
+
if (qualifiedMatch) {
|
|
137
|
+
return qualifiedMatch;
|
|
138
|
+
}
|
|
139
|
+
// Ambiguous plain names resolve to nothing: guessing would silently load a skill the caller
|
|
140
|
+
// did not ask for.
|
|
141
|
+
const plainMatches = this.getSkills().filter(skill => skill.name === name);
|
|
142
|
+
return plainMatches.length === 1 ? plainMatches[0] : undefined;
|
|
143
|
+
}
|
|
144
|
+
dispose() {
|
|
145
|
+
this.toDisposeOnServiceDispose.dispose();
|
|
146
|
+
this.toDispose.dispose();
|
|
113
147
|
}
|
|
114
148
|
scheduleUpdate() {
|
|
115
149
|
if (this.updateDebounceTimeout) {
|
|
@@ -156,15 +190,18 @@ let DefaultSkillService = class DefaultSkillService {
|
|
|
156
190
|
const configuredDirectories = (this.preferences[ai_core_preferences_1.PREFERENCE_NAME_SKILL_DIRECTORIES] ?? [])
|
|
157
191
|
.map(dir => path_1.Path.untildify(dir, homePath));
|
|
158
192
|
const defaultSkillsDirs = await this.getDefaultSkillsDirectoryPaths();
|
|
193
|
+
const pluginSkillsDirs = await this.getContributedSkillDirectories();
|
|
159
194
|
const newWatchedDirectories = new Set();
|
|
160
195
|
const newParentWatchers = new Map();
|
|
161
|
-
const allDirectories = (0, skill_1.combineSkillDirectories)(workspaceSkillsDirs, configuredDirectories, defaultSkillsDirs);
|
|
162
|
-
for (const { path: directoryPath, tier } of allDirectories) {
|
|
196
|
+
const allDirectories = (0, skill_1.combineSkillDirectories)(workspaceSkillsDirs, configuredDirectories, defaultSkillsDirs, pluginSkillsDirs);
|
|
197
|
+
for (const { path: directoryPath, tier, qualifier } of allDirectories) {
|
|
163
198
|
if (tier === 'configured') {
|
|
164
|
-
await this.processConfiguredSkillDirectory(directoryPath, newSkills, newDisposables, newWatchedDirectories);
|
|
199
|
+
await this.processConfiguredSkillDirectory(directoryPath, newSkills, newDisposables, newWatchedDirectories, qualifier);
|
|
165
200
|
}
|
|
166
201
|
else {
|
|
167
|
-
|
|
202
|
+
// `plugin` roots take this path too: a plugin with no `skills` directory is a
|
|
203
|
+
// plugin without skills, worth watching for rather than warning about.
|
|
204
|
+
await this.processSkillDirectoryWithParentWatching(directoryPath, newSkills, newDisposables, newWatchedDirectories, newParentWatchers, qualifier);
|
|
168
205
|
}
|
|
169
206
|
}
|
|
170
207
|
if (newSkills.size > 0 && newSkills.size !== this.skills.size) {
|
|
@@ -176,6 +213,19 @@ let DefaultSkillService = class DefaultSkillService {
|
|
|
176
213
|
this.parentWatchers = newParentWatchers;
|
|
177
214
|
this.onSkillsChangedEmitter.fire();
|
|
178
215
|
}
|
|
216
|
+
/** A failing contribution is skipped: one broken root must not cost every other skill. */
|
|
217
|
+
async getContributedSkillDirectories() {
|
|
218
|
+
const entries = [];
|
|
219
|
+
for (const contribution of this.skillDirectoryContributions.getContributions()) {
|
|
220
|
+
try {
|
|
221
|
+
entries.push(...await contribution.getSkillDirectories());
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
this.logger.error(`Failed to collect contributed skill directories: ${error}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return entries;
|
|
228
|
+
}
|
|
179
229
|
getWorkspaceSkillsDirectoryPaths() {
|
|
180
230
|
return this.workspaceService.tryGetRoots().flatMap(root => [
|
|
181
231
|
root.resource.resolve('.prompts/skills').path.fsPath(),
|
|
@@ -192,12 +242,12 @@ let DefaultSkillService = class DefaultSkillService {
|
|
|
192
242
|
homeDir.resolve('.agents/skills').path.fsPath()
|
|
193
243
|
];
|
|
194
244
|
}
|
|
195
|
-
async processSkillDirectoryWithParentWatching(directoryPath, skills, disposables, watchedDirectories, parentWatchers) {
|
|
245
|
+
async processSkillDirectoryWithParentWatching(directoryPath, skills, disposables, watchedDirectories, parentWatchers, qualifier) {
|
|
196
246
|
const dirURI = core_1.URI.fromFilePath(directoryPath);
|
|
197
247
|
try {
|
|
198
248
|
const dirExists = await this.fileService.exists(dirURI);
|
|
199
249
|
if (dirExists) {
|
|
200
|
-
await this.processExistingSkillDirectory(dirURI, skills, disposables, watchedDirectories);
|
|
250
|
+
await this.processExistingSkillDirectory(dirURI, skills, disposables, watchedDirectories, qualifier);
|
|
201
251
|
}
|
|
202
252
|
else {
|
|
203
253
|
const parentPath = dirURI.parent.path.fsPath();
|
|
@@ -218,7 +268,7 @@ let DefaultSkillService = class DefaultSkillService {
|
|
|
218
268
|
this.logger.error(`Error processing directory '${directoryPath}': ${error}`);
|
|
219
269
|
}
|
|
220
270
|
}
|
|
221
|
-
async processConfiguredSkillDirectory(directoryPath, skills, disposables, watchedDirectories) {
|
|
271
|
+
async processConfiguredSkillDirectory(directoryPath, skills, disposables, watchedDirectories, qualifier) {
|
|
222
272
|
const dirURI = core_1.URI.fromFilePath(directoryPath);
|
|
223
273
|
try {
|
|
224
274
|
const dirExists = await this.fileService.exists(dirURI);
|
|
@@ -226,13 +276,13 @@ let DefaultSkillService = class DefaultSkillService {
|
|
|
226
276
|
this.logger.warn(`Configured skill directory '${directoryPath}' does not exist`);
|
|
227
277
|
return;
|
|
228
278
|
}
|
|
229
|
-
await this.processExistingSkillDirectory(dirURI, skills, disposables, watchedDirectories);
|
|
279
|
+
await this.processExistingSkillDirectory(dirURI, skills, disposables, watchedDirectories, qualifier);
|
|
230
280
|
}
|
|
231
281
|
catch (error) {
|
|
232
282
|
this.logger.error(`Error processing configured directory '${directoryPath}': ${error}`);
|
|
233
283
|
}
|
|
234
284
|
}
|
|
235
|
-
async processExistingSkillDirectory(dirURI, skills, disposables, watchedDirectories) {
|
|
285
|
+
async processExistingSkillDirectory(dirURI, skills, disposables, watchedDirectories, qualifier) {
|
|
236
286
|
const stat = await this.fileService.resolve(dirURI);
|
|
237
287
|
if (!stat.children) {
|
|
238
288
|
return;
|
|
@@ -240,12 +290,12 @@ let DefaultSkillService = class DefaultSkillService {
|
|
|
240
290
|
for (const child of stat.children) {
|
|
241
291
|
if (child.isDirectory) {
|
|
242
292
|
const directoryName = child.name;
|
|
243
|
-
await this.loadSkillFromDirectory(child.resource, directoryName, skills);
|
|
293
|
+
await this.loadSkillFromDirectory(child.resource, directoryName, skills, qualifier);
|
|
244
294
|
}
|
|
245
295
|
}
|
|
246
296
|
this.setupDirectoryWatcher(dirURI, disposables, watchedDirectories);
|
|
247
297
|
}
|
|
248
|
-
async loadSkillFromDirectory(directoryUri, directoryName, skills) {
|
|
298
|
+
async loadSkillFromDirectory(directoryUri, directoryName, skills, qualifier) {
|
|
249
299
|
const skillFileUri = directoryUri.resolve(skill_1.SKILL_FILE_NAME);
|
|
250
300
|
const fileExists = await this.fileService.exists(skillFileUri);
|
|
251
301
|
if (!fileExists) {
|
|
@@ -267,16 +317,17 @@ let DefaultSkillService = class DefaultSkillService {
|
|
|
267
317
|
this.logger.warn(`Skill in '${directoryName}': ${validationErrors.join('; ')}`);
|
|
268
318
|
return;
|
|
269
319
|
}
|
|
270
|
-
const
|
|
271
|
-
if (skills.has(
|
|
272
|
-
this.logger.warn(`Skill '${
|
|
320
|
+
const qualifiedName = skill_1.Skill.qualifyName(parsed.metadata.name, qualifier);
|
|
321
|
+
if (skills.has(qualifiedName)) {
|
|
322
|
+
this.logger.warn(`Skill '${qualifiedName}': Duplicate skill found in '${directoryName}', using first discovered instance`);
|
|
273
323
|
return;
|
|
274
324
|
}
|
|
275
325
|
const skill = {
|
|
276
326
|
...parsed.metadata,
|
|
277
|
-
location: skillFileUri.path.fsPath()
|
|
327
|
+
location: skillFileUri.path.fsPath(),
|
|
328
|
+
qualifiedName
|
|
278
329
|
};
|
|
279
|
-
skills.set(
|
|
330
|
+
skills.set(qualifiedName, skill);
|
|
280
331
|
}
|
|
281
332
|
catch (error) {
|
|
282
333
|
this.logger.error(`Failed to load skill from '${directoryName}': ${error}`);
|
|
@@ -298,7 +349,7 @@ tslib_1.__decorate([
|
|
|
298
349
|
], DefaultSkillService.prototype, "fileService", void 0);
|
|
299
350
|
tslib_1.__decorate([
|
|
300
351
|
(0, inversify_1.inject)(core_1.ILogger),
|
|
301
|
-
(0, inversify_1.named)('
|
|
352
|
+
(0, inversify_1.named)('ai-core:DefaultSkillService'),
|
|
302
353
|
tslib_1.__metadata("design:type", Object)
|
|
303
354
|
], DefaultSkillService.prototype, "logger", void 0);
|
|
304
355
|
tslib_1.__decorate([
|
|
@@ -309,6 +360,11 @@ tslib_1.__decorate([
|
|
|
309
360
|
(0, inversify_1.inject)(browser_1.WorkspaceService),
|
|
310
361
|
tslib_1.__metadata("design:type", browser_1.WorkspaceService)
|
|
311
362
|
], DefaultSkillService.prototype, "workspaceService", void 0);
|
|
363
|
+
tslib_1.__decorate([
|
|
364
|
+
(0, inversify_1.inject)(core_1.ContributionProvider),
|
|
365
|
+
(0, inversify_1.named)(exports.SkillDirectoryContribution),
|
|
366
|
+
tslib_1.__metadata("design:type", Object)
|
|
367
|
+
], DefaultSkillService.prototype, "skillDirectoryContributions", void 0);
|
|
312
368
|
tslib_1.__decorate([
|
|
313
369
|
(0, inversify_1.postConstruct)(),
|
|
314
370
|
tslib_1.__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-service.js","sourceRoot":"","sources":["../../src/browser/skill-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skill-service.js","sourceRoot":"","sources":["../../src/browser/skill-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAAwF;AACxF,sEAA+D;AAC/D,sCAAiI;AACjI,sDAAmD;AACnD,wEAA0E;AAC1E,6EAAyE;AAEzE,0DAAgE;AAChE,uEAAqG;AACrG,2CAQyB;AAEzB,6DAA6D;AAC7D,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAEjB,QAAA,0BAA0B,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AAYlE,QAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAoB5C,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAAzB;QAoBH,4CAA4C;QAClC,WAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;QAC5C,0EAA0E;QAChE,cAAS,GAAG,IAAI,2BAAoB,EAAE,CAAC;QACjD,0EAA0E;QACvD,8BAAyB,GAAG,IAAI,2BAAoB,EAAE,CAAC;QAChE,uBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;QACvC,mBAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;QAElC,2BAAsB,GAAG,IAAI,cAAO,EAAQ,CAAC;QACvD,oBAAe,GAAgB,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;QAK1E,gHAAgH;QACtG,qBAAgB,GAAG,KAAK,CAAC;QACnC,mIAAmI;QACzH,sBAAiB,GAAG,KAAK,CAAC;QAE1B,WAAM,GAAG,IAAI,uBAAQ,EAAQ,CAAC;IAqW5C,CAAC;IApWG,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC/B,CAAC;IAGS,IAAI;QACV,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,2BAA2B,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC7E,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;gBAC3B,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAC/F,CAAC;QACL,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAuB,EAAE,EAAE;YAChE,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,IAAI,iCAAyB,EAAE,CAAC;oBACvC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBAC7C,KAAK,MAAM,CAAC,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;wBAC/C,MAAM,iBAAiB,GAAG,UAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;wBAClE,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;4BAClC,IAAI,CAAC,cAAc,EAAE,CAAC;4BACtB,OAAO;wBACX,CAAC;oBACL,CAAC;gBACL,CAAC;gBACD,uEAAuE;gBACvE,IAAI,MAAM,CAAC,IAAI,mCAA2B,EAAE,CAAC;oBACzC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBAC7C,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;wBACzC,IAAI,CAAC,cAAc,EAAE,CAAC;wBACtB,OAAO;oBACX,CAAC;gBACL,CAAC;YACL,CAAC;YAED,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBACjD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC7C,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACrE,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAC/B,CAAC;gBACF,IAAI,CAAC,cAAc,EAAE,CAAC;oBAClB,OAAO,KAAK,CAAC;gBACjB,CAAC;gBACD,+DAA+D;gBAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,uBAAe,CAAC;gBAClE,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,iCAAyB,IAAI,MAAM,CAAC,IAAI,mCAA2B,CAAC;gBACzG,OAAO,WAAW,IAAI,iBAAiB,CAAC;YAC5C,CAAC,CAAC,CAAC;YACH,IAAI,gBAAgB,EAAE,CAAC;gBACnB,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAED,gIAAgI;IACtH,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC;YACD,kGAAkG;YAClG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mFAAmF,EAAE,KAAK,CAAC,CAAC;QAClH,CAAC;QAED,sGAAsG;QACtG,yGAAyG;QACzG,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,uDAAiC,CAAC,CAAC,CAAC;QAErG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE;YACzC,IAAI,KAAK,CAAC,cAAc,KAAK,uDAAiC,EAAE,CAAC;gBAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,uDAAiC,CAAC,CAAC,CAAC;gBACzF,IAAI,YAAY,KAAK,IAAI,CAAC,yBAAyB,EAAE,CAAC;oBAClD,OAAO;gBACX,CAAC;gBACD,IAAI,CAAC,yBAAyB,GAAG,YAAY,CAAC;gBAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAC1C,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,SAAS;QACL,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,QAAQ,CAAC,IAAY;QACjB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,cAAc,EAAE,CAAC;YACjB,OAAO,cAAc,CAAC;QAC1B,CAAC;QACD,4FAA4F;QAC5F,mBAAmB;QACnB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC3E,OAAO,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,CAAC;IAED,OAAO;QACH,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAES,cAAc;QACpB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC,GAAG,EAAE;YACzC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;YACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC3B,CAAC;IAES,KAAK,CAAC,MAAM;QAClB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACzC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAC3C,CAAC;QACD,0FAA0F;QAC1F,sFAAsF;QACtF,yFAAyF;QACzF,uFAAuF;QACvF,qFAAqF;QACrF,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;gBAC/B,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1B,CAAC;QACL,CAAC;IACL,CAAC;IAES,KAAK,CAAC,QAAQ;QACpB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,cAAc,GAAG,IAAI,2BAAoB,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiB,CAAC;QAE3C,MAAM,mBAAmB,GAAG,IAAI,CAAC,gCAAgC,EAAE,CAAC;QAEpE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,UAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAEnD,MAAM,qBAAqB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,uDAAiC,CAAC,IAAI,EAAE,CAAC;aACpF,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,WAAI,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/C,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACtE,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;QAErE,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAU,CAAC;QAChD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEpD,MAAM,cAAc,GAAG,IAAA,+BAAuB,EAAC,mBAAmB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;QAChI,KAAK,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,cAAc,EAAE,CAAC;YACpE,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,+BAA+B,CAAC,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAC;YAC3H,CAAC;iBAAM,CAAC;gBACJ,8EAA8E;gBAC9E,uEAAuE;gBACvE,MAAM,IAAI,CAAC,uCAAuC,CAC9C,aAAa,EACb,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,SAAS,CACZ,CAAC;YACN,CAAC;QACL,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,SAAS,CAAC,IAAI,SAAS,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,kBAAkB,GAAG,qBAAqB,CAAC;QAChD,IAAI,CAAC,cAAc,GAAG,iBAAiB,CAAC;QAExC,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,0FAA0F;IAChF,KAAK,CAAC,8BAA8B;QAC1C,MAAM,OAAO,GAA0B,EAAE,CAAC;QAC1C,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,2BAA2B,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC7E,IAAI,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,CAAC,mBAAmB,EAAE,CAAC,CAAC;YAC9D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oDAAoD,KAAK,EAAE,CAAC,CAAC;YACnF,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAES,gCAAgC;QACtC,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE;YACtD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE;SACxD,CAAC,CAAC;IACP,CAAC;IAES,KAAK,CAAC,8BAA8B;QAC1C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC;QACrE,MAAM,SAAS,GAAG,IAAI,UAAG,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,UAAG,CAAC,UAAU,CAAC,CAAC;QACpC,OAAO;YACH,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE;YACzC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE;SAClD,CAAC;IACN,CAAC;IAES,KAAK,CAAC,uCAAuC,CACnD,aAAqB,EACrB,MAA0B,EAC1B,WAAiC,EACjC,kBAA+B,EAC/B,cAAmC,EACnC,SAAkB;QAElB,MAAM,MAAM,GAAG,UAAG,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAE/C,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAExD,IAAI,SAAS,EAAE,CAAC;gBACZ,MAAM,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;YACzG,CAAC;iBAAM,CAAC;gBACJ,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,UAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;gBAC/C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAE9D,IAAI,YAAY,EAAE,CAAC;oBACf,MAAM,eAAe,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;oBAC7C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;oBACxF,cAAc,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;oBACnD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,UAAU,8BAA8B,CAAC,CAAC;gBAC9F,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,aAAa,oCAAoC,CAAC,CAAC;gBAC3G,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,aAAa,MAAM,KAAK,EAAE,CAAC,CAAC;QACjF,CAAC;IACL,CAAC;IAES,KAAK,CAAC,+BAA+B,CAC3C,aAAqB,EACrB,MAA0B,EAC1B,WAAiC,EACjC,kBAA+B,EAC/B,SAAkB;QAElB,MAAM,MAAM,GAAG,UAAG,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAE/C,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAExD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,aAAa,kBAAkB,CAAC,CAAC;gBACjF,OAAO;YACX,CAAC;YAED,MAAM,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;QACzG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,aAAa,MAAM,KAAK,EAAE,CAAC,CAAC;QAC5F,CAAC;IACL,CAAC;IAES,KAAK,CAAC,6BAA6B,CACzC,MAAW,EACX,MAA0B,EAC1B,WAAiC,EACjC,kBAA+B,EAC/B,SAAkB;QAElB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACpB,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC;gBACjC,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YACxF,CAAC;QACL,CAAC;QAED,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;IACxE,CAAC;IAES,KAAK,CAAC,sBAAsB,CAAC,YAAiB,EAAE,aAAqB,EAAE,MAA0B,EAAE,SAAkB;QAC3H,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,uBAAe,CAAC,CAAC;QAE3D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,IAAA,sBAAc,EAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAEjD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,aAAa,gDAAgD,CAAC,CAAC;gBAC7F,OAAO;YACX,CAAC;YAED,IAAI,CAAC,wBAAgB,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,aAAa,4EAA4E,CAAC,CAAC;gBACzH,OAAO;YACX,CAAC;YAED,MAAM,gBAAgB,GAAG,IAAA,gCAAwB,EAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAClF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,aAAa,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChF,OAAO;YACX,CAAC;YAED,MAAM,aAAa,GAAG,aAAK,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAEzE,IAAI,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,aAAa,gCAAgC,aAAa,oCAAoC,CAAC,CAAC;gBAC3H,OAAO;YACX,CAAC;YAED,MAAM,KAAK,GAAU;gBACjB,GAAG,MAAM,CAAC,QAAQ;gBAClB,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE;gBACpC,aAAa;aAChB,CAAC;YAEF,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,aAAa,MAAM,KAAK,EAAE,CAAC,CAAC;QAChF,CAAC;IACL,CAAC;IAES,qBAAqB,CAAC,MAAW,EAAE,WAAiC,EAAE,kBAA+B;QAC3G,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACpF,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9C,CAAC;CACJ,CAAA;AA7YY,kDAAmB;AAET;IADlB,IAAA,kBAAM,EAAC,uCAAiB,CAAC;;wDACwB;AAG/B;IADlB,IAAA,kBAAM,EAAC,0BAAW,CAAC;sCACY,0BAAW;wDAAC;AAGzB;IADlB,IAAA,kBAAM,EAAC,cAAO,CAAC;IAAE,IAAA,iBAAK,EAAC,6BAA6B,CAAC;;mDACnB;AAGhB;IADlB,IAAA,kBAAM,EAAC,kCAAkB,CAAC;;+DAC+B;AAGvC;IADlB,IAAA,kBAAM,EAAC,0BAAgB,CAAC;sCACY,0BAAgB;6DAAC;AAInC;IAFlB,IAAA,kBAAM,EAAC,2BAAoB,CAAC;IAC5B,IAAA,iBAAK,EAAC,kCAA0B,CAAC;;wEAC+D;AA4BvF;IADT,IAAA,yBAAa,GAAE;;;;+CAiDf;8BA9FQ,mBAAmB;IAD/B,IAAA,sBAAU,GAAE;GACA,mBAAmB,CA6Y/B"}
|
|
@@ -18,12 +18,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
18
18
|
const jsdom_1 = require("@theia/core/lib/browser/test/jsdom");
|
|
19
19
|
const disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
20
20
|
const frontend_application_config_provider_1 = require("@theia/core/lib/browser/frontend-application-config-provider");
|
|
21
|
-
|
|
21
|
+
// Guarded: another spec in the same mocha process may already have set it, and `set` throws on a
|
|
22
|
+
// second call.
|
|
23
|
+
try {
|
|
24
|
+
frontend_application_config_provider_1.FrontendApplicationConfigProvider.get();
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
frontend_application_config_provider_1.FrontendApplicationConfigProvider.set({});
|
|
28
|
+
}
|
|
22
29
|
const chai_1 = require("chai");
|
|
23
30
|
const sinon = require("sinon");
|
|
24
31
|
const skill_1 = require("../common/skill");
|
|
25
32
|
const path_1 = require("@theia/core/lib/common/path");
|
|
26
33
|
const core_1 = require("@theia/core");
|
|
34
|
+
const promise_util_1 = require("@theia/core/lib/common/promise-util");
|
|
27
35
|
const skill_service_1 = require("./skill-service");
|
|
28
36
|
disableJSDOM();
|
|
29
37
|
describe('SkillService', () => {
|
|
@@ -234,8 +242,11 @@ description: Skill with no content
|
|
|
234
242
|
let fileChangesEmitter;
|
|
235
243
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
236
244
|
let preferenceChangedEmitter;
|
|
237
|
-
function createService() {
|
|
245
|
+
function createService(contributions = []) {
|
|
238
246
|
const service = new skill_service_1.DefaultSkillService();
|
|
247
|
+
service.skillDirectoryContributions = {
|
|
248
|
+
getContributions: () => contributions
|
|
249
|
+
};
|
|
239
250
|
service.preferences = preferencesMock;
|
|
240
251
|
service.fileService = fileServiceMock;
|
|
241
252
|
const loggerMock = sinon.createStubInstance(core_1.Logger);
|
|
@@ -271,6 +282,7 @@ description: Skill with no content
|
|
|
271
282
|
};
|
|
272
283
|
preferencesMock = {
|
|
273
284
|
'ai-features.skills.skillDirectories': [],
|
|
285
|
+
ready: Promise.resolve(),
|
|
274
286
|
onPreferenceChanged: preferenceChangedEmitter.event
|
|
275
287
|
};
|
|
276
288
|
});
|
|
@@ -357,6 +369,33 @@ description: Skill with no content
|
|
|
357
369
|
// Verify warning is logged for non-existent configured directory
|
|
358
370
|
(0, chai_1.expect)(loggerWarnSpy.calledWith(sinon.match(/Configured skill directory.*does not exist/))).to.be.true;
|
|
359
371
|
});
|
|
372
|
+
it('should scan configured directories that only become known once the preferences are ready', async () => {
|
|
373
|
+
// The preference proxy serves defaults until its `ready` promise resolves, so a scan started before
|
|
374
|
+
// that point misses the configured directories.
|
|
375
|
+
const preferencesReady = new promise_util_1.Deferred();
|
|
376
|
+
preferencesMock.ready = preferencesReady.promise;
|
|
377
|
+
// Default skills directory exists and is empty, so the configured directory is the only source of warnings.
|
|
378
|
+
fileServiceMock.exists
|
|
379
|
+
.withArgs(sinon.match((uri) => uri.path.toString() === '/home/testuser/.theia-ide/skills'))
|
|
380
|
+
.resolves(true);
|
|
381
|
+
fileServiceMock.resolve
|
|
382
|
+
.withArgs(sinon.match((uri) => uri.path.toString() === '/home/testuser/.theia-ide/skills'))
|
|
383
|
+
.resolves({ children: [] });
|
|
384
|
+
fileServiceMock.exists
|
|
385
|
+
.withArgs(sinon.match((uri) => uri.path.toString() === '/custom/configured/skills'))
|
|
386
|
+
.resolves(false);
|
|
387
|
+
const service = createService();
|
|
388
|
+
service.init();
|
|
389
|
+
await workspaceServiceMock.ready;
|
|
390
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
391
|
+
// Nothing may be scanned yet, the preference value is still the default one.
|
|
392
|
+
(0, chai_1.expect)(fileServiceMock.exists.called).to.be.false;
|
|
393
|
+
preferencesMock['ai-features.skills.skillDirectories'] = ['/custom/configured/skills'];
|
|
394
|
+
preferencesReady.resolve();
|
|
395
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
396
|
+
// The scan picked up the configured directory instead of the default preference value.
|
|
397
|
+
(0, chai_1.expect)(loggerWarnSpy.calledWith(sinon.match(/Configured skill directory '\/custom\/configured\/skills' does not exist/))).to.be.true;
|
|
398
|
+
});
|
|
360
399
|
it('should load skills when directory is created after initialization', async () => {
|
|
361
400
|
const service = createService();
|
|
362
401
|
// Initially, skills directory does not exist but parent does
|
|
@@ -484,6 +523,146 @@ Test skill content`
|
|
|
484
523
|
// The second occurrence is reported (not silently swallowed) via a warning.
|
|
485
524
|
(0, chai_1.expect)(loggerWarnSpy.calledWith(sinon.match(/Duplicate skill found.*dup-skill/))).to.be.true;
|
|
486
525
|
});
|
|
526
|
+
describe('contributed skill directories', () => {
|
|
527
|
+
const bigQueryQualifier = 'bigquery-data-analytics';
|
|
528
|
+
const athenaQualifier = 'athena-analytics';
|
|
529
|
+
/** A contribution returning a fixed set of roots. */
|
|
530
|
+
function contributing(...entries) {
|
|
531
|
+
return { getSkillDirectories: () => entries };
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Stubs `directory` as an existing skills root holding one skill directory per given name,
|
|
535
|
+
* each with a valid `SKILL.md` whose description names the root it came from.
|
|
536
|
+
*/
|
|
537
|
+
function stubSkillsRoot(directory, ...skillNames) {
|
|
538
|
+
fileServiceMock.exists
|
|
539
|
+
.withArgs(sinon.match((uri) => uri.path.toString() === directory))
|
|
540
|
+
.resolves(true);
|
|
541
|
+
fileServiceMock.resolve
|
|
542
|
+
.withArgs(sinon.match((uri) => uri.path.toString() === directory))
|
|
543
|
+
.resolves({
|
|
544
|
+
children: skillNames.map(name => ({
|
|
545
|
+
isDirectory: true,
|
|
546
|
+
name,
|
|
547
|
+
resource: core_1.URI.fromFilePath(`${directory}/${name}`)
|
|
548
|
+
}))
|
|
549
|
+
});
|
|
550
|
+
for (const name of skillNames) {
|
|
551
|
+
const skillFile = `${directory}/${name}/SKILL.md`;
|
|
552
|
+
fileServiceMock.exists
|
|
553
|
+
.withArgs(sinon.match((uri) => uri.path.toString() === skillFile))
|
|
554
|
+
.resolves(true);
|
|
555
|
+
fileServiceMock.read
|
|
556
|
+
.withArgs(sinon.match((uri) => uri.path.toString() === skillFile))
|
|
557
|
+
.resolves({ value: `---\nname: ${name}\ndescription: from ${directory}\n---\nBody of ${name}` });
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
async function initialize(service) {
|
|
561
|
+
service.init();
|
|
562
|
+
await workspaceServiceMock.ready;
|
|
563
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
564
|
+
}
|
|
565
|
+
it('qualifies the names of skills found under an owned contributed root', async () => {
|
|
566
|
+
const pluginSkills = '/home/testuser/.agents/plugins/bigquery/skills';
|
|
567
|
+
stubSkillsRoot(pluginSkills, 'query-builder');
|
|
568
|
+
const service = createService([contributing({ path: pluginSkills, tier: 'plugin', qualifier: bigQueryQualifier })]);
|
|
569
|
+
await initialize(service);
|
|
570
|
+
const skills = service.getSkills();
|
|
571
|
+
(0, chai_1.expect)(skills).to.have.length(1);
|
|
572
|
+
(0, chai_1.expect)(skills[0].name).to.equal('query-builder');
|
|
573
|
+
(0, chai_1.expect)(skills[0].qualifiedName).to.equal('bigquery-data-analytics:query-builder');
|
|
574
|
+
(0, chai_1.expect)(skill_1.Skill.qualifierOf(skills[0])).to.equal('bigquery-data-analytics');
|
|
575
|
+
});
|
|
576
|
+
it('leaves the qualified name of a skill from a built-in root equal to its plain name', async () => {
|
|
577
|
+
stubSkillsRoot('/home/testuser/.theia-ide/skills', 'code-review');
|
|
578
|
+
const service = createService();
|
|
579
|
+
await initialize(service);
|
|
580
|
+
const skills = service.getSkills();
|
|
581
|
+
(0, chai_1.expect)(skills).to.have.length(1);
|
|
582
|
+
(0, chai_1.expect)(skills[0].qualifiedName).to.equal('code-review');
|
|
583
|
+
(0, chai_1.expect)(skill_1.Skill.qualifierOf(skills[0])).to.be.undefined;
|
|
584
|
+
});
|
|
585
|
+
it('resolves an owned skill by its qualified name and by its plain name', async () => {
|
|
586
|
+
const pluginSkills = '/home/testuser/.agents/plugins/bigquery/skills';
|
|
587
|
+
stubSkillsRoot(pluginSkills, 'query-builder');
|
|
588
|
+
const service = createService([contributing({ path: pluginSkills, tier: 'plugin', qualifier: bigQueryQualifier })]);
|
|
589
|
+
await initialize(service);
|
|
590
|
+
(0, chai_1.expect)(service.getSkill('bigquery-data-analytics:query-builder')?.name).to.equal('query-builder');
|
|
591
|
+
// The plain name keeps working, so every reference written before the skill was owned
|
|
592
|
+
// still resolves.
|
|
593
|
+
(0, chai_1.expect)(service.getSkill('query-builder')?.qualifiedName).to.equal('bigquery-data-analytics:query-builder');
|
|
594
|
+
});
|
|
595
|
+
it('loads a skill of the same name from two different plugins and keeps both addressable', async () => {
|
|
596
|
+
const bigQuerySkills = '/home/testuser/.agents/plugins/bigquery/skills';
|
|
597
|
+
const athenaSkills = '/home/testuser/.agents/plugins/athena/skills';
|
|
598
|
+
stubSkillsRoot(bigQuerySkills, 'query-builder');
|
|
599
|
+
stubSkillsRoot(athenaSkills, 'query-builder');
|
|
600
|
+
const service = createService([contributing({ path: bigQuerySkills, tier: 'plugin', qualifier: bigQueryQualifier }, { path: athenaSkills, tier: 'plugin', qualifier: athenaQualifier })]);
|
|
601
|
+
await initialize(service);
|
|
602
|
+
(0, chai_1.expect)(service.getSkills()).to.have.length(2);
|
|
603
|
+
(0, chai_1.expect)(service.getSkill('bigquery-data-analytics:query-builder')?.description).to.equal(`from ${bigQuerySkills}`);
|
|
604
|
+
(0, chai_1.expect)(service.getSkill('athena-analytics:query-builder')?.description).to.equal(`from ${athenaSkills}`);
|
|
605
|
+
// Neither is dropped as a duplicate, because they no longer share a name.
|
|
606
|
+
(0, chai_1.expect)(loggerWarnSpy.calledWith(sinon.match(/Duplicate skill found/))).to.be.false;
|
|
607
|
+
});
|
|
608
|
+
it('resolves an ambiguous plain name to undefined rather than guessing one of the candidates', async () => {
|
|
609
|
+
const bigQuerySkills = '/home/testuser/.agents/plugins/bigquery/skills';
|
|
610
|
+
const athenaSkills = '/home/testuser/.agents/plugins/athena/skills';
|
|
611
|
+
stubSkillsRoot(bigQuerySkills, 'query-builder');
|
|
612
|
+
stubSkillsRoot(athenaSkills, 'query-builder');
|
|
613
|
+
const service = createService([contributing({ path: bigQuerySkills, tier: 'plugin', qualifier: bigQueryQualifier }, { path: athenaSkills, tier: 'plugin', qualifier: athenaQualifier })]);
|
|
614
|
+
await initialize(service);
|
|
615
|
+
(0, chai_1.expect)(service.getSkill('query-builder')).to.be.undefined;
|
|
616
|
+
});
|
|
617
|
+
it('keeps loading the remaining roots when one contribution fails', async () => {
|
|
618
|
+
const pluginSkills = '/home/testuser/.agents/plugins/bigquery/skills';
|
|
619
|
+
stubSkillsRoot(pluginSkills, 'query-builder');
|
|
620
|
+
stubSkillsRoot('/home/testuser/.theia-ide/skills', 'code-review');
|
|
621
|
+
const failing = {
|
|
622
|
+
getSkillDirectories: () => { throw new Error('cannot enumerate plugins'); }
|
|
623
|
+
};
|
|
624
|
+
const service = createService([
|
|
625
|
+
failing,
|
|
626
|
+
contributing({ path: pluginSkills, tier: 'plugin', qualifier: bigQueryQualifier })
|
|
627
|
+
]);
|
|
628
|
+
await initialize(service);
|
|
629
|
+
(0, chai_1.expect)(service.getSkills().map(skill => skill.qualifiedName).sort())
|
|
630
|
+
.to.deep.equal(['bigquery-data-analytics:query-builder', 'code-review']);
|
|
631
|
+
});
|
|
632
|
+
it('watches the parent of a contributed root that does not exist yet instead of warning about it', async () => {
|
|
633
|
+
const pluginRoot = '/home/testuser/.agents/plugins/bigquery';
|
|
634
|
+
fileServiceMock.exists
|
|
635
|
+
.withArgs(sinon.match((uri) => uri.path.toString() === `${pluginRoot}/skills`))
|
|
636
|
+
.resolves(false);
|
|
637
|
+
fileServiceMock.exists
|
|
638
|
+
.withArgs(sinon.match((uri) => uri.path.toString() === pluginRoot))
|
|
639
|
+
.resolves(true);
|
|
640
|
+
const service = createService([contributing({ path: `${pluginRoot}/skills`, tier: 'plugin', qualifier: bigQueryQualifier })]);
|
|
641
|
+
await initialize(service);
|
|
642
|
+
(0, chai_1.expect)(fileServiceMock.watch.calledWith(sinon.match((uri) => uri.path.toString() === pluginRoot), sinon.match({ recursive: false, excludes: [] }))).to.be.true;
|
|
643
|
+
// A plugin without skills is not a misconfiguration, so it must not warn like a
|
|
644
|
+
// non-existent configured directory does.
|
|
645
|
+
(0, chai_1.expect)(loggerWarnSpy.calledWith(sinon.match(/does not exist/))).to.be.false;
|
|
646
|
+
});
|
|
647
|
+
it('rescans when a contribution reports that its set of roots changed', async () => {
|
|
648
|
+
const pluginSkills = '/home/testuser/.agents/plugins/bigquery/skills';
|
|
649
|
+
const onDidChangeEmitter = new core_1.Emitter();
|
|
650
|
+
let entries = [];
|
|
651
|
+
const contribution = {
|
|
652
|
+
getSkillDirectories: () => entries,
|
|
653
|
+
onDidChange: onDidChangeEmitter.event
|
|
654
|
+
};
|
|
655
|
+
const service = createService([contribution]);
|
|
656
|
+
await initialize(service);
|
|
657
|
+
(0, chai_1.expect)(service.getSkills()).to.have.length(0);
|
|
658
|
+
stubSkillsRoot(pluginSkills, 'query-builder');
|
|
659
|
+
entries = [{ path: pluginSkills, tier: 'plugin', qualifier: bigQueryQualifier }];
|
|
660
|
+
onDidChangeEmitter.fire();
|
|
661
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
662
|
+
(0, chai_1.expect)(service.getSkills().map(skill => skill.qualifiedName)).to.deep.equal(['bigquery-data-analytics:query-builder']);
|
|
663
|
+
onDidChangeEmitter.dispose();
|
|
664
|
+
});
|
|
665
|
+
});
|
|
487
666
|
});
|
|
488
667
|
});
|
|
489
668
|
//# sourceMappingURL=skill-service.spec.js.map
|