@cleanslate/sdk 1.0.8 → 1.0.10
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/README.md +71 -2
- package/VENDOR.md +7 -8
- package/dist/agent/cleanSlateToolResultPromptSerializer.d.ts.map +1 -1
- package/dist/agent/cleanSlateToolResultPromptSerializer.js +31 -0
- package/dist/agent/cleanSlateToolResultPromptSerializer.js.map +1 -1
- package/dist/externalAgents/externalAgentTypes.d.ts +168 -0
- package/dist/externalAgents/externalAgentTypes.d.ts.map +1 -0
- package/dist/externalAgents/externalAgentTypes.js +6 -0
- package/dist/externalAgents/externalAgentTypes.js.map +1 -0
- package/dist/externalAgents/handoff.d.ts +8 -0
- package/dist/externalAgents/handoff.d.ts.map +1 -0
- package/dist/externalAgents/handoff.js +20 -0
- package/dist/externalAgents/handoff.js.map +1 -0
- package/dist/externalAgents/index.d.ts +3 -0
- package/dist/externalAgents/index.d.ts.map +1 -0
- package/dist/externalAgents/index.js +7 -0
- package/dist/externalAgents/index.js.map +1 -0
- package/dist/node/cleanSlateManagedAuth.d.ts +19 -0
- package/dist/node/cleanSlateManagedAuth.d.ts.map +1 -0
- package/dist/node/cleanSlateManagedAuth.js +123 -0
- package/dist/node/cleanSlateManagedAuth.js.map +1 -0
- package/dist/node/cleanSlateNodeAgentRuntime.d.ts +2 -1
- package/dist/node/cleanSlateNodeAgentRuntime.d.ts.map +1 -1
- package/dist/node/cleanSlateNodeAgentRuntime.js +3 -0
- package/dist/node/cleanSlateNodeAgentRuntime.js.map +1 -1
- package/dist/node/externalAgents/externalAgentEvents.d.ts +2 -0
- package/dist/node/externalAgents/externalAgentEvents.d.ts.map +1 -0
- package/dist/node/externalAgents/externalAgentEvents.js +6 -0
- package/dist/node/externalAgents/externalAgentEvents.js.map +1 -0
- package/dist/node/externalAgents/externalAgentRegistry.d.ts +36 -0
- package/dist/node/externalAgents/externalAgentRegistry.d.ts.map +1 -0
- package/dist/node/externalAgents/externalAgentRegistry.js +181 -0
- package/dist/node/externalAgents/externalAgentRegistry.js.map +1 -0
- package/dist/node/externalAgents/externalAgentService.d.ts +37 -0
- package/dist/node/externalAgents/externalAgentService.d.ts.map +1 -0
- package/dist/node/externalAgents/externalAgentService.js +252 -0
- package/dist/node/externalAgents/externalAgentService.js.map +1 -0
- package/dist/node/externalAgents/externalAgentSession.d.ts +49 -0
- package/dist/node/externalAgents/externalAgentSession.d.ts.map +1 -0
- package/dist/node/externalAgents/externalAgentSession.js +54 -0
- package/dist/node/externalAgents/externalAgentSession.js.map +1 -0
- package/dist/node/externalAgents/externalAgentUsage.d.ts +5 -0
- package/dist/node/externalAgents/externalAgentUsage.d.ts.map +1 -0
- package/dist/node/externalAgents/externalAgentUsage.js +98 -0
- package/dist/node/externalAgents/externalAgentUsage.js.map +1 -0
- package/dist/node/externalAgents/externalAgentVersion.d.ts +2 -0
- package/dist/node/externalAgents/externalAgentVersion.d.ts.map +1 -0
- package/dist/node/externalAgents/externalAgentVersion.js +11 -0
- package/dist/node/externalAgents/externalAgentVersion.js.map +1 -0
- package/dist/node/externalAgents/externalFileSnapshots.d.ts +20 -0
- package/dist/node/externalAgents/externalFileSnapshots.d.ts.map +1 -0
- package/dist/node/externalAgents/externalFileSnapshots.js +105 -0
- package/dist/node/externalAgents/externalFileSnapshots.js.map +1 -0
- package/dist/node/externalAgents/hostToolsBridge.d.ts +9 -0
- package/dist/node/externalAgents/hostToolsBridge.d.ts.map +1 -0
- package/dist/node/externalAgents/hostToolsBridge.js +94 -0
- package/dist/node/externalAgents/hostToolsBridge.js.map +1 -0
- package/dist/node/externalAgents/hostToolsProxy.d.ts +2 -0
- package/dist/node/externalAgents/hostToolsProxy.d.ts.map +1 -0
- package/dist/node/externalAgents/hostToolsProxy.js +25 -0
- package/dist/node/externalAgents/hostToolsProxy.js.map +1 -0
- package/dist/node/externalAgents/index.d.ts +4 -0
- package/dist/node/externalAgents/index.d.ts.map +1 -0
- package/dist/node/externalAgents/index.js +8 -0
- package/dist/node/externalAgents/index.js.map +1 -0
- package/dist/node/externalAgents/transports/acp/acpClient.d.ts +49 -0
- package/dist/node/externalAgents/transports/acp/acpClient.d.ts.map +1 -0
- package/dist/node/externalAgents/transports/acp/acpClient.js +152 -0
- package/dist/node/externalAgents/transports/acp/acpClient.js.map +1 -0
- package/dist/node/externalAgents/transports/acp/acpConnection.d.ts +31 -0
- package/dist/node/externalAgents/transports/acp/acpConnection.d.ts.map +1 -0
- package/dist/node/externalAgents/transports/acp/acpConnection.js +125 -0
- package/dist/node/externalAgents/transports/acp/acpConnection.js.map +1 -0
- package/dist/node/externalAgents/transports/acp/acpEventMapper.d.ts +4 -0
- package/dist/node/externalAgents/transports/acp/acpEventMapper.d.ts.map +1 -0
- package/dist/node/externalAgents/transports/acp/acpEventMapper.js +109 -0
- package/dist/node/externalAgents/transports/acp/acpEventMapper.js.map +1 -0
- package/dist/node/externalAgents/transports/acp/acpModePresentation.d.ts +4 -0
- package/dist/node/externalAgents/transports/acp/acpModePresentation.d.ts.map +1 -0
- package/dist/node/externalAgents/transports/acp/acpModePresentation.js +15 -0
- package/dist/node/externalAgents/transports/acp/acpModePresentation.js.map +1 -0
- package/dist/node/externalAgents/transports/acp/acpProcess.d.ts +15 -0
- package/dist/node/externalAgents/transports/acp/acpProcess.d.ts.map +1 -0
- package/dist/node/externalAgents/transports/acp/acpProcess.js +60 -0
- package/dist/node/externalAgents/transports/acp/acpProcess.js.map +1 -0
- package/dist/node/index.d.ts +2 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +1 -0
- package/dist/node/index.js.map +1 -1
- package/dist/protocol/cleanSlateAI.d.ts +7 -6
- package/dist/protocol/cleanSlateAI.d.ts.map +1 -1
- package/dist/protocol/cleanSlateAI.js.map +1 -1
- package/dist/protocol/cleanSlateService.d.ts.map +1 -1
- package/dist/protocol/cleanSlateService.js +3 -5
- package/dist/protocol/cleanSlateService.js.map +1 -1
- package/dist/services/cleanSlateDiffService.d.ts +6 -0
- package/dist/services/cleanSlateDiffService.d.ts.map +1 -1
- package/dist/services/cleanSlateDiffService.js +34 -0
- package/dist/services/cleanSlateDiffService.js.map +1 -1
- package/package.json +10 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) CleanSlate. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { readdir, readFile, realpath, lstat } from 'node:fs/promises';
|
|
6
|
+
import { join, resolve, relative, isAbsolute, sep } from 'node:path';
|
|
7
|
+
/** Turn-local file evidence. Never changes the workspace or the user's Git index. */
|
|
8
|
+
export class ExternalFileSnapshots {
|
|
9
|
+
constructor(root, requestedRoot) {
|
|
10
|
+
this.root = root;
|
|
11
|
+
this.requestedRoot = requestedRoot;
|
|
12
|
+
this.files = new Map();
|
|
13
|
+
this.directories = new Set();
|
|
14
|
+
this.excludedDirectories = new Set();
|
|
15
|
+
this.bytes = 0;
|
|
16
|
+
}
|
|
17
|
+
static async capture(cwd) {
|
|
18
|
+
const snapshot = new ExternalFileSnapshots(await realpath(cwd), resolve(cwd));
|
|
19
|
+
await snapshot.scan(snapshot.root);
|
|
20
|
+
return snapshot;
|
|
21
|
+
}
|
|
22
|
+
async text(path) {
|
|
23
|
+
const stat = await lstat(path);
|
|
24
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 2 * 1024 * 1024) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const content = await readFile(path);
|
|
28
|
+
if (content.includes(0)) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
return new TextDecoder('utf-8', { fatal: true }).decode(content);
|
|
32
|
+
}
|
|
33
|
+
async scan(directory) {
|
|
34
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
35
|
+
this.directories.add(directory);
|
|
36
|
+
for (const entry of entries) {
|
|
37
|
+
const path = join(directory, entry.name);
|
|
38
|
+
if (entry.isDirectory()) {
|
|
39
|
+
if (['.git', 'node_modules', '.build', 'dist', 'out', '.next', '.venv', 'venv'].includes(entry.name)) {
|
|
40
|
+
this.excludedDirectories.add(path);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
await this.scan(path).catch(() => { this.excludedDirectories.add(path); });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else if (entry.isFile()) {
|
|
47
|
+
this.files.set(path, undefined);
|
|
48
|
+
if (this.bytes < 64 * 1024 * 1024) {
|
|
49
|
+
const content = await this.text(path).catch(() => undefined);
|
|
50
|
+
if (content !== undefined) {
|
|
51
|
+
this.files.set(path, content);
|
|
52
|
+
this.bytes += Buffer.byteLength(content);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.files.set(path, undefined);
|
|
58
|
+
this.excludedDirectories.add(path);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async changes(event) {
|
|
63
|
+
const changes = [];
|
|
64
|
+
for (const location of new Set(event.locations ?? [])) {
|
|
65
|
+
const requested = resolve(this.requestedRoot, location);
|
|
66
|
+
const requestedRelative = relative(this.requestedRoot, requested);
|
|
67
|
+
const canonicalRelative = relative(this.root, requested);
|
|
68
|
+
const alreadyCanonical = canonicalRelative !== '..' && !canonicalRelative.startsWith(`..${sep}`) && !isAbsolute(canonicalRelative);
|
|
69
|
+
const path = alreadyCanonical ? requested : resolve(this.root, requestedRelative);
|
|
70
|
+
const local = relative(this.root, path);
|
|
71
|
+
if (!local || local === '..' || local.startsWith(`..${sep}`) || isAbsolute(local)) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const actual = await realpath(path).catch(() => undefined);
|
|
75
|
+
if (actual !== path) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const before = this.files.get(path);
|
|
79
|
+
if (this.files.has(path) && before === undefined) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// Absence is evidence only in a directory inspected before execution.
|
|
83
|
+
let parent = resolve(path, '..');
|
|
84
|
+
let excluded = false;
|
|
85
|
+
while (!this.directories.has(parent)) {
|
|
86
|
+
if (this.excludedDirectories.has(parent) || parent === this.root) {
|
|
87
|
+
excluded = true;
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
parent = resolve(parent, '..');
|
|
91
|
+
}
|
|
92
|
+
if (excluded) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const after = await this.text(path).catch(() => undefined);
|
|
96
|
+
if (after === undefined || after === before) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
changes.push({ path, beforeContent: before ?? '', afterContent: after, created: !this.files.has(path) });
|
|
100
|
+
this.files.set(path, after);
|
|
101
|
+
}
|
|
102
|
+
return changes.length ? changes : undefined;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=externalFileSnapshots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"externalFileSnapshots.js","sourceRoot":"","sources":["../../../src/node/externalAgents/externalFileSnapshots.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type CallToolResult, type Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { IExternalAgentHostTools } from './externalAgentSession.js';
|
|
3
|
+
export interface IExternalAgentHostTool {
|
|
4
|
+
readonly definition: Tool;
|
|
5
|
+
call(args: Record<string, unknown>): Promise<CallToolResult>;
|
|
6
|
+
}
|
|
7
|
+
/** A private endpoint shared only with one agent process through its MCP environment. */
|
|
8
|
+
export declare function createHostToolsBridge(tools: readonly IExternalAgentHostTool[], release: () => Promise<void>): Promise<IExternalAgentHostTools>;
|
|
9
|
+
//# sourceMappingURL=hostToolsBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostToolsBridge.d.ts","sourceRoot":"","sources":["../../../src/node/externalAgents/hostToolsBridge.ts"],"names":[],"mappings":"AAUA,OAAO,EAAiD,KAAK,cAAc,EAAE,KAAK,IAAI,EAAE,MAAM,oCAAoC,CAAC;AACnI,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAGzE,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC7D;AAED,yFAAyF;AACzF,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA2DpJ"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) CleanSlate. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { createServer } from 'node:http';
|
|
6
|
+
import { randomBytes } from 'node:crypto';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
9
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
10
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
11
|
+
import { CLEANSLATE_SDK_VERSION } from './externalAgentVersion.js';
|
|
12
|
+
/** A private endpoint shared only with one agent process through its MCP environment. */
|
|
13
|
+
export async function createHostToolsBridge(tools, release) {
|
|
14
|
+
const token = randomBytes(32).toString('hex');
|
|
15
|
+
let disposed = false;
|
|
16
|
+
let operations = Promise.resolve();
|
|
17
|
+
const server = createServer(async (request, response) => {
|
|
18
|
+
if (disposed || request.url !== '/mcp' || request.headers.origin || request.headers.authorization !== `Bearer ${token}`) {
|
|
19
|
+
response.writeHead(403).end();
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (request.method !== 'POST') {
|
|
23
|
+
response.writeHead(405).end();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const protocol = new Server({ name: 'CleanSlate IDE', version: CLEANSLATE_SDK_VERSION }, {
|
|
27
|
+
capabilities: { tools: {} },
|
|
28
|
+
instructions: 'These tools belong to the current CleanSlate chat and workspace. Use the advertised tools for IDE operations. Browser tools control the visible browser in this chat; use them by default instead of a separate agent browser unless the user explicitly chooses another destination. Capabilities not present in this catalog are unavailable through this connection.'
|
|
29
|
+
});
|
|
30
|
+
protocol.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: tools.map(tool => tool.definition) }));
|
|
31
|
+
protocol.setRequestHandler(CallToolRequestSchema, async ({ params }) => {
|
|
32
|
+
const tool = tools.find(candidate => candidate.definition.name === params.name);
|
|
33
|
+
if (!tool) {
|
|
34
|
+
throw new Error('Unknown IDE tool.');
|
|
35
|
+
}
|
|
36
|
+
const operation = operations.then(async () => {
|
|
37
|
+
if (disposed) {
|
|
38
|
+
throw new Error('This agent session has closed.');
|
|
39
|
+
}
|
|
40
|
+
return tool.call(params.arguments ?? {});
|
|
41
|
+
});
|
|
42
|
+
operations = operation.catch(() => undefined);
|
|
43
|
+
return operation;
|
|
44
|
+
});
|
|
45
|
+
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true });
|
|
46
|
+
response.on('close', () => { void protocol.close(); });
|
|
47
|
+
try {
|
|
48
|
+
let size = 0;
|
|
49
|
+
const chunks = [];
|
|
50
|
+
for await (const chunk of request) {
|
|
51
|
+
size += chunk.length;
|
|
52
|
+
if (size > 65536) {
|
|
53
|
+
response.writeHead(413).end();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
chunks.push(Buffer.from(chunk));
|
|
57
|
+
}
|
|
58
|
+
const body = JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
59
|
+
await protocol.connect(transport);
|
|
60
|
+
await transport.handleRequest(request, response, body);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
if (!response.headersSent) {
|
|
64
|
+
response.writeHead(400).end();
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
response.end();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
server.requestTimeout = 15000;
|
|
72
|
+
await new Promise((resolve, reject) => { server.once('error', reject); server.listen(0, '127.0.0.1', resolve); });
|
|
73
|
+
const address = server.address();
|
|
74
|
+
if (!address || typeof address === 'string') {
|
|
75
|
+
server.close();
|
|
76
|
+
throw new Error('Could not create the IDE tool connection.');
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
servers: [{ name: 'cleanslate-ide', command: process.execPath,
|
|
80
|
+
args: [fileURLToPath(new URL('./hostToolsProxy.js', import.meta.url))],
|
|
81
|
+
env: [{ name: 'ELECTRON_RUN_AS_NODE', value: '1' }, { name: 'CLEANSLATE_HOST_TOOL_URL', value: `http://127.0.0.1:${address.port}/mcp` }, { name: 'CLEANSLATE_HOST_TOOL_TOKEN', value: token }] }],
|
|
82
|
+
async dispose() {
|
|
83
|
+
if (disposed) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
disposed = true;
|
|
87
|
+
server.closeAllConnections();
|
|
88
|
+
await new Promise(resolve => server.close(() => resolve()));
|
|
89
|
+
await operations;
|
|
90
|
+
await release();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=hostToolsBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostToolsBridge.js","sourceRoot":"","sources":["../../../src/node/externalAgents/hostToolsBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostToolsProxy.d.ts","sourceRoot":"","sources":["../../../src/node/externalAgents/hostToolsProxy.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) CleanSlate. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
6
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
7
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
8
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
9
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
10
|
+
import { CLEANSLATE_SDK_VERSION } from './externalAgentVersion.js';
|
|
11
|
+
const endpoint = new URL(process.env['CLEANSLATE_HOST_TOOL_URL'] ?? '');
|
|
12
|
+
const token = process.env['CLEANSLATE_HOST_TOOL_TOKEN'];
|
|
13
|
+
if (endpoint.protocol !== 'http:' || endpoint.hostname !== '127.0.0.1' || !token) {
|
|
14
|
+
throw new Error('Missing IDE tool connection.');
|
|
15
|
+
}
|
|
16
|
+
const client = new Client({ name: 'CleanSlate agent bridge', version: CLEANSLATE_SDK_VERSION });
|
|
17
|
+
await client.connect(new StreamableHTTPClientTransport(endpoint, { requestInit: { headers: { Authorization: `Bearer ${token}` } } }));
|
|
18
|
+
const server = new Server({ name: 'CleanSlate IDE', version: CLEANSLATE_SDK_VERSION }, { capabilities: { tools: {} }, instructions: client.getInstructions() });
|
|
19
|
+
server.setRequestHandler(ListToolsRequestSchema, () => client.listTools());
|
|
20
|
+
// The IDE owns the request deadline (including time spent answering a question).
|
|
21
|
+
// Do not let the proxy's shorter default timeout abandon a still-visible request.
|
|
22
|
+
server.setRequestHandler(CallToolRequestSchema, ({ params }, extra) => client.callTool(params, undefined, { timeout: 125000, signal: extra.signal }));
|
|
23
|
+
process.stdin.once('end', () => { void client.close(); });
|
|
24
|
+
await server.connect(new StdioServerTransport());
|
|
25
|
+
//# sourceMappingURL=hostToolsProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostToolsProxy.js","sourceRoot":"","sources":["../../../src/node/externalAgents/hostToolsProxy.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,EAAE,CAAC,CAAC;AACxE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AACxD,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAAC,CAAC;AACtI,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;AAChG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,6BAA6B,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACtI,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;AAChK,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;AAC3E,iFAAiF;AACjF,kFAAkF;AAClF,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACtJ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/node/externalAgents/index.ts"],"names":[],"mappings":"AAKA,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,KAAK,iCAAiC,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) CleanSlate. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
export * from '../../externalAgents/index.js';
|
|
6
|
+
export { ExternalAgentService } from './externalAgentService.js';
|
|
7
|
+
export { ExternalAgentRegistry } from './externalAgentRegistry.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/node/externalAgents/index.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAA0C,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { RequestPermissionRequest, RequestPermissionResponse } from '@agentclientprotocol/sdk';
|
|
2
|
+
import { IExternalAgentEvent } from '../../../../externalAgents/externalAgentTypes.js';
|
|
3
|
+
import { IExternalAgentLaunchConfiguration } from '../../externalAgentRegistry.js';
|
|
4
|
+
export interface IAcpClientHandlers {
|
|
5
|
+
readonly onEvent: (event: IExternalAgentEvent) => void;
|
|
6
|
+
readonly requestPermission: (request: RequestPermissionRequest) => Promise<RequestPermissionResponse>;
|
|
7
|
+
}
|
|
8
|
+
export declare class AcpClient {
|
|
9
|
+
private readonly cleanSlateSessionId;
|
|
10
|
+
private readonly connection;
|
|
11
|
+
private readonly handlers;
|
|
12
|
+
private readonly cwd;
|
|
13
|
+
private readonly completedEdits;
|
|
14
|
+
private cancelRequested;
|
|
15
|
+
private snapshot;
|
|
16
|
+
private eventQueue;
|
|
17
|
+
private enqueueEvent;
|
|
18
|
+
private constructor();
|
|
19
|
+
static create(cleanSlateSessionId: string, cwd: string, launch: IExternalAgentLaunchConfiguration & {
|
|
20
|
+
executable: string;
|
|
21
|
+
}, handlers: IAcpClientHandlers): Promise<AcpClient>;
|
|
22
|
+
externalSessionId: string | undefined;
|
|
23
|
+
get models(): {
|
|
24
|
+
readonly configId: string;
|
|
25
|
+
readonly current: string;
|
|
26
|
+
readonly options: readonly {
|
|
27
|
+
readonly value: string;
|
|
28
|
+
readonly name: string;
|
|
29
|
+
}[];
|
|
30
|
+
} | undefined;
|
|
31
|
+
get controls(): readonly {
|
|
32
|
+
readonly configId: string;
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly category?: string;
|
|
35
|
+
readonly current: string;
|
|
36
|
+
readonly options: readonly {
|
|
37
|
+
readonly value: string;
|
|
38
|
+
readonly name: string;
|
|
39
|
+
readonly description?: string;
|
|
40
|
+
readonly kind?: import("../../../../externalAgents/externalAgentTypes.js").ExternalApprovalPresentation;
|
|
41
|
+
}[];
|
|
42
|
+
}[];
|
|
43
|
+
selectModel(configId: string, value: string): Promise<void>;
|
|
44
|
+
start(cwd: string, existingSessionId?: string, servers?: import('@agentclientprotocol/sdk').McpServer[]): Promise<string>;
|
|
45
|
+
prompt(text: string, images?: readonly string[]): Promise<void>;
|
|
46
|
+
cancel(): Promise<void>;
|
|
47
|
+
dispose(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=acpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acpClient.d.ts","sourceRoot":"","sources":["../../../../../src/node/externalAgents/transports/acp/acpClient.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AAMnF,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACtG;AAED,qBAAa,SAAS;IAuBpB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAzBrB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqE;IACpG,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,UAAU,CAAoC;IAEtD,OAAO,CAAC,YAAY;IAgBpB,OAAO;WAOM,MAAM,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,iCAAiC,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;IAiDnL,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,IAAI,MAAM;;;;;;;kBAA2C;IACrD,IAAI,QAAQ;;;;;;;;gCAjE+B,CAAC;yBAAuB,CAAC;;QAiEjB;IAC7C,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,OAAO,0BAA0B,EAAE,SAAS,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAe7H,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB/D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGxB"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) CleanSlate. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { AcpConnection } from './acpConnection.js';
|
|
6
|
+
import { mapAcpEvent } from './acpEventMapper.js';
|
|
7
|
+
import { AcpProcess } from './acpProcess.js';
|
|
8
|
+
import { ExternalFileSnapshots } from '../../externalFileSnapshots.js';
|
|
9
|
+
export class AcpClient {
|
|
10
|
+
enqueueEvent(event) {
|
|
11
|
+
this.eventQueue = this.eventQueue.then(async () => {
|
|
12
|
+
if (event.type === 'tool') {
|
|
13
|
+
const previous = this.completedEdits.get(event.toolCallId);
|
|
14
|
+
if (event.kind === 'edit' || previous) {
|
|
15
|
+
const edit = { ...previous, ...event, status: event.status ?? previous?.status, fileChanges: event.fileChanges ?? previous?.fileChanges, kind: event.kind ?? previous?.kind, locations: event.locations ?? previous?.locations };
|
|
16
|
+
this.completedEdits.set(event.toolCallId, edit);
|
|
17
|
+
if (edit.status === 'completed' && previous?.status !== 'completed') {
|
|
18
|
+
const fileChanges = await this.snapshot?.changes(edit);
|
|
19
|
+
event = { ...edit, fileChanges: edit.fileChanges ?? fileChanges };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
this.handlers.onEvent(event);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
constructor(cleanSlateSessionId, connection, handlers, cwd) {
|
|
27
|
+
this.cleanSlateSessionId = cleanSlateSessionId;
|
|
28
|
+
this.connection = connection;
|
|
29
|
+
this.handlers = handlers;
|
|
30
|
+
this.cwd = cwd;
|
|
31
|
+
this.completedEdits = new Map();
|
|
32
|
+
this.cancelRequested = false;
|
|
33
|
+
this.eventQueue = Promise.resolve();
|
|
34
|
+
}
|
|
35
|
+
static async create(cleanSlateSessionId, cwd, launch, handlers) {
|
|
36
|
+
const agentProcess = new AcpProcess(launch, cwd);
|
|
37
|
+
let client;
|
|
38
|
+
let connection;
|
|
39
|
+
const approvalSnapshots = new Map();
|
|
40
|
+
try {
|
|
41
|
+
connection = await AcpConnection.create(agentProcess, {
|
|
42
|
+
onSessionUpdate: notification => {
|
|
43
|
+
if (notification.sessionId !== client?.externalSessionId) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
let update = notification.update;
|
|
47
|
+
if (update.sessionUpdate === 'tool_call_update' || update.sessionUpdate === 'tool_call') {
|
|
48
|
+
const snapshot = approvalSnapshots.get(update.toolCallId);
|
|
49
|
+
if (update.status === 'completed' || update.status === 'failed') {
|
|
50
|
+
approvalSnapshots.delete(update.toolCallId);
|
|
51
|
+
}
|
|
52
|
+
if (snapshot && update.status === 'completed') {
|
|
53
|
+
update = { ...snapshot, ...update, sessionUpdate: 'tool_call_update', content: [...(snapshot.content ?? []), ...(update.content ?? [])], rawInput: update.rawInput ?? snapshot.rawInput };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const event = mapAcpEvent(cleanSlateSessionId, update, launch.thoughtPresentation ?? 'reasoning');
|
|
57
|
+
if (notification.update.sessionUpdate === 'config_option_update' || notification.update.sessionUpdate === 'current_mode_update') {
|
|
58
|
+
handlers.onEvent({ type: 'controls', cleanSlateSessionId, controls: client.controls, models: client.models });
|
|
59
|
+
}
|
|
60
|
+
if (event) {
|
|
61
|
+
client.enqueueEvent(event);
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
requestPermission: request => {
|
|
65
|
+
if (request.sessionId !== client?.externalSessionId) {
|
|
66
|
+
return Promise.resolve({ outcome: { outcome: 'cancelled' } });
|
|
67
|
+
}
|
|
68
|
+
// A proposed edit is not a completed edit. Preserve its snapshot
|
|
69
|
+
// only for a later successful tool notification.
|
|
70
|
+
approvalSnapshots.set(request.toolCall.toolCallId, request.toolCall);
|
|
71
|
+
return handlers.requestPermission(request).then(response => {
|
|
72
|
+
if (response.outcome.outcome === 'cancelled') {
|
|
73
|
+
approvalSnapshots.delete(request.toolCall.toolCallId);
|
|
74
|
+
}
|
|
75
|
+
return response;
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
onError: error => handlers.onEvent({ type: 'status', cleanSlateSessionId, status: 'failed', detail: error.message })
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
await agentProcess.stop();
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
client = new AcpClient(cleanSlateSessionId, connection, handlers, cwd);
|
|
86
|
+
return client;
|
|
87
|
+
}
|
|
88
|
+
get models() { return this.connection.modelOptions; }
|
|
89
|
+
get controls() { return this.connection.controls; }
|
|
90
|
+
async selectModel(configId, value) {
|
|
91
|
+
if (!this.externalSessionId) {
|
|
92
|
+
throw new Error('Agent session is not ready.');
|
|
93
|
+
}
|
|
94
|
+
await this.connection.selectModel(this.externalSessionId, configId, value);
|
|
95
|
+
}
|
|
96
|
+
async start(cwd, existingSessionId, servers = []) {
|
|
97
|
+
if (existingSessionId) {
|
|
98
|
+
try {
|
|
99
|
+
// Loading may replay notifications before its response arrives.
|
|
100
|
+
this.externalSessionId = existingSessionId;
|
|
101
|
+
await this.connection.loadSession(existingSessionId, cwd, servers);
|
|
102
|
+
await this.eventQueue;
|
|
103
|
+
return existingSessionId;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
this.externalSessionId = undefined;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const response = await this.connection.newSession(cwd, servers);
|
|
110
|
+
this.externalSessionId = response.sessionId;
|
|
111
|
+
return response.sessionId;
|
|
112
|
+
}
|
|
113
|
+
async prompt(text, images) {
|
|
114
|
+
if (!this.externalSessionId) {
|
|
115
|
+
throw new Error('External agent session has not started.');
|
|
116
|
+
}
|
|
117
|
+
this.handlers.onEvent({ type: 'status', cleanSlateSessionId: this.cleanSlateSessionId, status: 'running' });
|
|
118
|
+
this.cancelRequested = false;
|
|
119
|
+
try {
|
|
120
|
+
this.completedEdits.clear();
|
|
121
|
+
this.snapshot = await ExternalFileSnapshots.capture(this.cwd);
|
|
122
|
+
if (this.cancelRequested) {
|
|
123
|
+
this.handlers.onEvent({ type: 'status', cleanSlateSessionId: this.cleanSlateSessionId, status: 'cancelled' });
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const response = await this.connection.prompt(this.externalSessionId, text, images);
|
|
127
|
+
await this.eventQueue;
|
|
128
|
+
const status = response.stopReason === 'cancelled' ? 'cancelled' : 'completed';
|
|
129
|
+
this.handlers.onEvent({ type: 'status', cleanSlateSessionId: this.cleanSlateSessionId, status });
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
await this.eventQueue.catch(() => undefined);
|
|
133
|
+
this.handlers.onEvent({ type: 'status', cleanSlateSessionId: this.cleanSlateSessionId, status: 'failed', detail: error instanceof Error ? error.message : String(error) });
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
this.snapshot = undefined;
|
|
138
|
+
this.completedEdits.clear();
|
|
139
|
+
this.eventQueue = Promise.resolve();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async cancel() {
|
|
143
|
+
this.cancelRequested = true;
|
|
144
|
+
if (this.externalSessionId) {
|
|
145
|
+
await this.connection.cancel(this.externalSessionId);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
dispose() {
|
|
149
|
+
return this.connection.dispose();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=acpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acpClient.js","sourceRoot":"","sources":["../../../../../src/node/externalAgents/transports/acp/acpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type RequestPermissionRequest, type RequestPermissionResponse, type SessionNotification, type ContentBlock } from '@agentclientprotocol/sdk';
|
|
2
|
+
import { AcpProcess } from './acpProcess.js';
|
|
3
|
+
export interface IAcpConnectionHandlers {
|
|
4
|
+
readonly onSessionUpdate: (notification: SessionNotification) => void;
|
|
5
|
+
readonly requestPermission: (request: RequestPermissionRequest) => Promise<RequestPermissionResponse>;
|
|
6
|
+
readonly onError: (error: Error) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function createAcpPromptContent(prompt: string, images?: readonly string[]): ContentBlock[];
|
|
9
|
+
export declare class AcpConnection {
|
|
10
|
+
private readonly process;
|
|
11
|
+
controls: NonNullable<import('../../../../externalAgents/externalAgentTypes.js').IExternalAgentSessionInfo['controls']>;
|
|
12
|
+
modelOptions: import('../../../../externalAgents/externalAgentTypes.js').IExternalAgentSessionInfo['models'];
|
|
13
|
+
private supportsImages;
|
|
14
|
+
private readModels;
|
|
15
|
+
selectModel(sessionId: string, configId: string, value: string): Promise<void>;
|
|
16
|
+
private readonly connection;
|
|
17
|
+
private readonly context;
|
|
18
|
+
private constructor();
|
|
19
|
+
static create(process: AcpProcess, handlers: IAcpConnectionHandlers): Promise<AcpConnection>;
|
|
20
|
+
newSession(cwd: string, mcpServers?: import('@agentclientprotocol/sdk').McpServer[]): Promise<{
|
|
21
|
+
sessionId: string;
|
|
22
|
+
}>;
|
|
23
|
+
loadSession(sessionId: string, cwd: string, mcpServers?: import('@agentclientprotocol/sdk').McpServer[]): Promise<void>;
|
|
24
|
+
private readModes;
|
|
25
|
+
prompt(sessionId: string, prompt: string, images?: readonly string[]): Promise<{
|
|
26
|
+
stopReason: string;
|
|
27
|
+
}>;
|
|
28
|
+
cancel(sessionId: string): Promise<void>;
|
|
29
|
+
dispose(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=acpConnection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acpConnection.d.ts","sourceRoot":"","sources":["../../../../../src/node/externalAgents/transports/acp/acpConnection.ts"],"names":[],"mappings":"AAMA,OAAO,EAON,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,eAAe,EAAE,CAAC,YAAY,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACtE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACtG,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,EAAE,CAUjG;AAED,qBAAa,aAAa;IAgCL,OAAO,CAAC,QAAQ,CAAC,OAAO;IA/B5C,QAAQ,EAAE,WAAW,CAAC,OAAO,kDAAkD,EAAE,yBAAyB,CAAC,UAAU,CAAC,CAAC,CAAM;IAC7H,YAAY,EAAE,OAAO,kDAAkD,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC7G,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,UAAU;IAcZ,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IAExC,OAAO;WAKM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC;IA+B5F,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAO,0BAA0B,EAAE,SAAS,EAAO,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAOxH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAO,0BAA0B,EAAE,SAAS,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjI,OAAO,CAAC,SAAS;IAKjB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAUhG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI9B"}
|