1
>
/*---------------------------------------------------------------------------------------------
agentPluginEnablement.ts
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 { IObservable } from '../../../../../base/common/observable.js';
7
>
import { AgentPluginDiscoveryPriority, IAgentPlugin } from './agentPluginService.js';
8
>
import { IGitHubPluginSource, IGitUrlPluginSource, IMarketplacePlugin, INpmPluginSource, IPipPluginSource, PluginSourceKind } from './pluginMarketplaceService.js';
9
>
import { type IMarketplaceReference } from './marketplaceReference.js';
10
>
import { CollisionEnablementModel, IEnablementModel } from '../enablement.js';
11
>
12
>
export interface IDiscoveredAgentPlugins {
13
>
readonly plugins: readonly IAgentPlugin[];
14
>
readonly priority: AgentPluginDiscoveryPriority;
15
>
readonly order: number;
16
>
}
17
>
18
>
interface IAgentPluginCandidate {
19
>
readonly plugin: IAgentPlugin;
20
>
readonly priority: AgentPluginDiscoveryPriority;
21
>
readonly order: number;
22
>
readonly pluginOrder: number;
23
>
readonly canonicalKey: string;
24
>
}
25
>
26
>
/**
27
>
* Path fragment that identifies a Copilot-CLI-installed plugin. Mirrored by
28
>
* `ConfiguredAgentPluginDiscovery._resolveEnterprisePluginId`.
29
>
*/
30
>
const COPILOT_CLI_INSTALL_PATH_FRAGMENT = '/.copilot/installed-plugins/';
31
>
32
>
export class AgentPluginCollisionEnablementModel extends CollisionEnablementModel {
33
>
constructor(base: IEnablementModel, collisionGroups: IObservable<ReadonlyMap<string, readonly string[]>>) {
34
super(base, collisionGroups);
35
}
37
>
38
>
export function getSortedAgentPlugins(discoveries: readonly IDiscoveredAgentPlugins[]): readonly IAgentPlugin[] {
39
return getUniqueAgentPluginCandidates(discoveries)
40
.map(candidate => candidate.plugin)
41
.sort((a, b) => a.uri.toString().localeCompare(b.uri.toString()));
42
}
44
>
export function getCanonicalAgentPluginCollisionGroups(discoveries: readonly IDiscoveredAgentPlugins[], isBlocked?: (plugin: IAgentPlugin) => boolean): ReadonlyMap<string, readonly string[]> {
45
const candidates = getUniqueAgentPluginCandidates(discoveries);
46
const byCanonicalKey = new Map<string, string[]>();