Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/mcp/common/mcpGalleryManifestServiceIpc.ts
5284 views
1
/*---------------------------------------------------------------------------------------------
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 { Barrier } from '../../../base/common/async.js';
7
import { Emitter, Event } from '../../../base/common/event.js';
8
import { Disposable } from '../../../base/common/lifecycle.js';
9
import { IChannelServer } from '../../../base/parts/ipc/common/ipc.js';
10
import { IMcpGalleryManifest, IMcpGalleryManifestService, McpGalleryManifestStatus } from './mcpGalleryManifest.js';
11
12
export class McpGalleryManifestIPCService extends Disposable implements IMcpGalleryManifestService {
13
14
declare readonly _serviceBrand: undefined;
15
16
private _onDidChangeMcpGalleryManifest = this._register(new Emitter<IMcpGalleryManifest | null>());
17
readonly onDidChangeMcpGalleryManifest = this._onDidChangeMcpGalleryManifest.event;
18
19
private _onDidChangeMcpGalleryManifestStatus = this._register(new Emitter<McpGalleryManifestStatus>());
20
readonly onDidChangeMcpGalleryManifestStatus = this._onDidChangeMcpGalleryManifestStatus.event;
21
22
private _mcpGalleryManifest: IMcpGalleryManifest | null | undefined;
23
private readonly barrier = new Barrier();
24
25
get mcpGalleryManifestStatus(): McpGalleryManifestStatus {
26
return this._mcpGalleryManifest ? McpGalleryManifestStatus.Available : McpGalleryManifestStatus.Unavailable;
27
}
28
29
constructor(server: IChannelServer<unknown>) {
30
super();
31
server.registerChannel('mcpGalleryManifest', {
32
listen: () => Event.None,
33
call: async <T>(context: unknown, command: string, args?: unknown): Promise<T> => {
34
switch (command) {
35
case 'setMcpGalleryManifest': {
36
const manifest = Array.isArray(args) ? args[0] as IMcpGalleryManifest | null : null;
37
return Promise.resolve(this.setMcpGalleryManifest(manifest)) as T;
38
}
39
}
40
throw new Error('Invalid call');
41
}
42
});
43
}
44
45
async getMcpGalleryManifest(): Promise<IMcpGalleryManifest | null> {
46
await this.barrier.wait();
47
return this._mcpGalleryManifest ?? null;
48
}
49
50
private setMcpGalleryManifest(manifest: IMcpGalleryManifest | null): void {
51
this._mcpGalleryManifest = manifest;
52
this._onDidChangeMcpGalleryManifest.fire(manifest);
53
this._onDidChangeMcpGalleryManifestStatus.fire(this.mcpGalleryManifestStatus);
54
this.barrier.open();
55
}
56
57
}
58
59