@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.
Files changed (134) hide show
  1. package/lib/browser/agent-plugin-ui-bridge.d.ts +26 -0
  2. package/lib/browser/agent-plugin-ui-bridge.d.ts.map +1 -0
  3. package/lib/browser/agent-plugin-ui-bridge.js +20 -0
  4. package/lib/browser/agent-plugin-ui-bridge.js.map +1 -0
  5. package/lib/browser/ai-core-command-contribution.d.ts.map +1 -1
  6. package/lib/browser/ai-core-command-contribution.js +4 -1
  7. package/lib/browser/ai-core-command-contribution.js.map +1 -1
  8. package/lib/browser/ai-core-frontend-module.d.ts.map +1 -1
  9. package/lib/browser/ai-core-frontend-module.js +6 -0
  10. package/lib/browser/ai-core-frontend-module.js.map +1 -1
  11. package/lib/browser/ai-settings-service.js +1 -0
  12. package/lib/browser/ai-settings-service.js.map +1 -1
  13. package/lib/browser/frontend-language-model-alias-registry.js +1 -1
  14. package/lib/browser/frontend-language-model-registry.d.ts +2 -0
  15. package/lib/browser/frontend-language-model-registry.d.ts.map +1 -1
  16. package/lib/browser/frontend-language-model-registry.js +22 -1
  17. package/lib/browser/frontend-language-model-registry.js.map +1 -1
  18. package/lib/browser/generic-capabilities-variable-contribution.d.ts.map +1 -1
  19. package/lib/browser/generic-capabilities-variable-contribution.js +4 -1
  20. package/lib/browser/generic-capabilities-variable-contribution.js.map +1 -1
  21. package/lib/browser/hide-ai-preferences-contribution.d.ts +30 -0
  22. package/lib/browser/hide-ai-preferences-contribution.d.ts.map +1 -0
  23. package/lib/browser/hide-ai-preferences-contribution.js +90 -0
  24. package/lib/browser/hide-ai-preferences-contribution.js.map +1 -0
  25. package/lib/browser/hide-ai-preferences-contribution.spec.d.ts +2 -0
  26. package/lib/browser/hide-ai-preferences-contribution.spec.d.ts.map +1 -0
  27. package/lib/browser/hide-ai-preferences-contribution.spec.js +95 -0
  28. package/lib/browser/hide-ai-preferences-contribution.spec.js.map +1 -0
  29. package/lib/browser/index.d.ts +3 -0
  30. package/lib/browser/index.d.ts.map +1 -1
  31. package/lib/browser/index.js +3 -0
  32. package/lib/browser/index.js.map +1 -1
  33. package/lib/browser/prompt-variable-contribution.d.ts +1 -1
  34. package/lib/browser/prompt-variable-contribution.d.ts.map +1 -1
  35. package/lib/browser/prompt-variable-contribution.js +1 -0
  36. package/lib/browser/prompt-variable-contribution.js.map +1 -1
  37. package/lib/browser/skill-prompt-coordinator.d.ts +9 -1
  38. package/lib/browser/skill-prompt-coordinator.d.ts.map +1 -1
  39. package/lib/browser/skill-prompt-coordinator.js +29 -14
  40. package/lib/browser/skill-prompt-coordinator.js.map +1 -1
  41. package/lib/browser/skill-prompt-coordinator.spec.d.ts +2 -0
  42. package/lib/browser/skill-prompt-coordinator.spec.d.ts.map +1 -0
  43. package/lib/browser/skill-prompt-coordinator.spec.js +98 -0
  44. package/lib/browser/skill-prompt-coordinator.spec.js.map +1 -0
  45. package/lib/browser/skill-registry-ui-bridge.d.ts +25 -0
  46. package/lib/browser/skill-registry-ui-bridge.d.ts.map +1 -0
  47. package/lib/browser/skill-registry-ui-bridge.js +20 -0
  48. package/lib/browser/skill-registry-ui-bridge.js.map +1 -0
  49. package/lib/browser/skill-service.d.ts +33 -8
  50. package/lib/browser/skill-service.d.ts.map +1 -1
  51. package/lib/browser/skill-service.js +95 -39
  52. package/lib/browser/skill-service.js.map +1 -1
  53. package/lib/browser/skill-service.spec.js +181 -2
  54. package/lib/browser/skill-service.spec.js.map +1 -1
  55. package/lib/browser/skills-variable-contribution.d.ts +4 -0
  56. package/lib/browser/skills-variable-contribution.d.ts.map +1 -1
  57. package/lib/browser/skills-variable-contribution.js +10 -1
  58. package/lib/browser/skills-variable-contribution.js.map +1 -1
  59. package/lib/browser/skills-variable-contribution.spec.js +6 -0
  60. package/lib/browser/skills-variable-contribution.spec.js.map +1 -1
  61. package/lib/browser/theia-variable-contribution.js +6 -12
  62. package/lib/browser/theia-variable-contribution.js.map +1 -1
  63. package/lib/common/ai-core-preferences.d.ts +17 -0
  64. package/lib/common/ai-core-preferences.d.ts.map +1 -1
  65. package/lib/common/ai-core-preferences.js +9 -1
  66. package/lib/common/ai-core-preferences.js.map +1 -1
  67. package/lib/common/ai-variable-resource.d.ts +2 -1
  68. package/lib/common/ai-variable-resource.d.ts.map +1 -1
  69. package/lib/common/ai-variable-resource.js +6 -1
  70. package/lib/common/ai-variable-resource.js.map +1 -1
  71. package/lib/common/capability-variable-contribution.d.ts +1 -1
  72. package/lib/common/capability-variable-contribution.d.ts.map +1 -1
  73. package/lib/common/capability-variable-contribution.js +1 -0
  74. package/lib/common/capability-variable-contribution.js.map +1 -1
  75. package/lib/common/language-model.d.ts +16 -2
  76. package/lib/common/language-model.d.ts.map +1 -1
  77. package/lib/common/language-model.js +39 -3
  78. package/lib/common/language-model.js.map +1 -1
  79. package/lib/common/language-model.spec.js +75 -0
  80. package/lib/common/language-model.spec.js.map +1 -1
  81. package/lib/common/prompt-service.d.ts.map +1 -1
  82. package/lib/common/prompt-service.js +7 -4
  83. package/lib/common/prompt-service.js.map +1 -1
  84. package/lib/common/prompt-service.spec.js +36 -0
  85. package/lib/common/prompt-service.spec.js.map +1 -1
  86. package/lib/common/skill.d.ts +31 -7
  87. package/lib/common/skill.d.ts.map +1 -1
  88. package/lib/common/skill.js +37 -14
  89. package/lib/common/skill.js.map +1 -1
  90. package/lib/common/skill.spec.js +70 -0
  91. package/lib/common/skill.spec.js.map +1 -1
  92. package/lib/common/today-variable-contribution.d.ts.map +1 -1
  93. package/lib/common/today-variable-contribution.js +1 -1
  94. package/lib/common/today-variable-contribution.js.map +1 -1
  95. package/lib/common/tool-invocation-registry.d.ts +2 -1
  96. package/lib/common/tool-invocation-registry.d.ts.map +1 -1
  97. package/lib/common/tool-invocation-registry.js +6 -1
  98. package/lib/common/tool-invocation-registry.js.map +1 -1
  99. package/lib/node/language-model-frontend-delegate.d.ts +2 -2
  100. package/lib/node/language-model-frontend-delegate.d.ts.map +1 -1
  101. package/lib/node/language-model-frontend-delegate.js +1 -0
  102. package/lib/node/language-model-frontend-delegate.js.map +1 -1
  103. package/package.json +12 -12
  104. package/src/browser/agent-plugin-ui-bridge.ts +43 -0
  105. package/src/browser/ai-core-command-contribution.ts +7 -1
  106. package/src/browser/ai-core-frontend-module.ts +11 -2
  107. package/src/browser/ai-settings-service.ts +2 -2
  108. package/src/browser/frontend-language-model-alias-registry.ts +1 -1
  109. package/src/browser/frontend-language-model-registry.ts +6 -2
  110. package/src/browser/generic-capabilities-variable-contribution.ts +4 -1
  111. package/src/browser/hide-ai-preferences-contribution.spec.ts +117 -0
  112. package/src/browser/hide-ai-preferences-contribution.ts +88 -0
  113. package/src/browser/index.ts +3 -0
  114. package/src/browser/prompt-variable-contribution.ts +3 -3
  115. package/src/browser/skill-prompt-coordinator.spec.ts +114 -0
  116. package/src/browser/skill-prompt-coordinator.ts +29 -17
  117. package/src/browser/skill-registry-ui-bridge.ts +41 -0
  118. package/src/browser/skill-service.spec.ts +229 -4
  119. package/src/browser/skill-service.ts +120 -43
  120. package/src/browser/skills-variable-contribution.spec.ts +6 -0
  121. package/src/browser/skills-variable-contribution.ts +14 -4
  122. package/src/browser/theia-variable-contribution.ts +12 -12
  123. package/src/common/ai-core-preferences.ts +19 -0
  124. package/src/common/ai-variable-resource.ts +6 -3
  125. package/src/common/capability-variable-contribution.ts +3 -3
  126. package/src/common/language-model.spec.ts +83 -0
  127. package/src/common/language-model.ts +35 -5
  128. package/src/common/prompt-service.spec.ts +43 -0
  129. package/src/common/prompt-service.ts +8 -6
  130. package/src/common/skill.spec.ts +99 -0
  131. package/src/common/skill.ts +52 -17
  132. package/src/common/today-variable-contribution.ts +2 -1
  133. package/src/common/tool-invocation-registry.ts +5 -2
  134. 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":"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"}
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
- // Wait for workspace to be ready before initial update
87
- this.workspaceService.ready.then(() => {
88
- this.update().then(() => {
89
- this._ready.resolve();
90
- // Only after initial update, start listening for changes
91
- this.lastSkillDirectoriesValue = JSON.stringify(this.preferences[ai_core_preferences_1.PREFERENCE_NAME_SKILL_DIRECTORIES]);
92
- this.preferences.onPreferenceChanged(event => {
93
- if (event.preferenceName === ai_core_preferences_1.PREFERENCE_NAME_SKILL_DIRECTORIES) {
94
- const currentValue = JSON.stringify(this.preferences[ai_core_preferences_1.PREFERENCE_NAME_SKILL_DIRECTORIES]);
95
- if (currentValue === this.lastSkillDirectoriesValue) {
96
- return;
97
- }
98
- this.lastSkillDirectoriesValue = currentValue;
99
- this.scheduleUpdate();
100
- }
101
- });
102
- this.workspaceService.onWorkspaceChanged(() => {
103
- this.scheduleUpdate();
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
- return this.skills.get(name);
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
- await this.processSkillDirectoryWithParentWatching(directoryPath, newSkills, newDisposables, newWatchedDirectories, newParentWatchers);
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 skillName = parsed.metadata.name;
271
- if (skills.has(skillName)) {
272
- this.logger.warn(`Skill '${skillName}': Duplicate skill found in '${directoryName}', using first discovered instance`);
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(skillName, skill);
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)('SkillService'),
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":"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"}
@@ -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
- frontend_application_config_provider_1.FrontendApplicationConfigProvider.set({});
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