2
>
* Copyright (c) Microsoft Corporation. All rights reserved.
3
>
* Licensed under the MIT License. See License.txt in the project root for license information.
4
>
*--------------------------------------------------------------------------------------------*/
5
>
6
>
import { CancellationToken } from '../../../base/common/cancellation.js';
7
>
import { Disposable } from '../../../base/common/lifecycle.js';
8
>
import { URI } from '../../../base/common/uri.js';
9
>
import { SYNCED_CUSTOMIZATION_SCHEME } from '../common/agentHostFileSystemService.js';
10
>
import type { IAgent } from '../common/agentService.js';
11
>
import { CompletionItem, CompletionItemKind, CompletionsParams } from '../common/state/protocol/commands.js';
12
>
import { MessageAttachmentKind } from '../common/state/protocol/state.js';
13
>
import { toSkillCompletionAttachmentMeta } from '../common/meta/agentCompletionAttachmentMeta.js';
14
>
import { CustomizationType, DirectoryCustomization, PluginCustomization, SkillCustomization } from '../common/state/sessionState.js';
15
>
import { CompletionTriggerCharacter, IAgentHostCompletionItemProvider } from './agentHostCompletions.js';
16
>
import { extractWhitespaceDelimitedSlashToken, matchesSlashCompletion } from './agentHostSlashCompletion.js';
17
>
18
>
19
>
/**
20
>
* Generic completion provider that contributes slash completions for skills
21
>
* exposed through an agent's global and session-effective customizations.
22
>
*/
23
>
export class AgentHostSkillCompletionProvider extends Disposable implements IAgentHostCompletionItemProvider {
24
>
25
>
readonly kinds: ReadonlySet<CompletionItemKind> = new Set([CompletionItemKind.UserMessage]);
26
>
readonly triggerCharacters = [CompletionTriggerCharacter.Slash] as const;
27
>
28
>
constructor(
29
private readonly _getAgent: (session: URI | string) => IAgent | undefined,
30
) {
31
super();
32
}
34
>
async provideCompletionItems(params: CompletionsParams, token: CancellationToken): Promise<readonly CompletionItem[]> {
35
const leading = extractWhitespaceDelimitedSlashToken(params.text, params.offset);
36
if (!leading) {