@harapter/transport-acp 0.1.1
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/LICENSE +201 -0
- package/README.md +184 -0
- package/dist/client.d.ts +81 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +644 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +22 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +395 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +47 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +1181 -0
- package/dist/validation.js.map +1 -0
- package/package.json +49 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,644 @@
|
|
|
1
|
+
import { JsonRpcStdioTransport, JsonRpcTransportError, } from '@harapter/transport-jsonrpc-stdio';
|
|
2
|
+
import { AcpClientError, acpError } from './errors.js';
|
|
3
|
+
import { extensionMethod, parseEmptyResult, parseInitializeResult, parseListSessionsResult, parseNewSessionResult, parsePermissionRequest, parsePromptResult, parseSessionNotification, parseSessionStateResult, prepareInitializeInput, prepareListSessionsInput, prepareLoadSessionInput, prepareNewSessionInput, preparePermissionOutcome, preparePromptInput, prepareResumeSessionInput, redactAcpObservation, sessionIdentifier, } from './validation.js';
|
|
4
|
+
const defaultMaxBufferedEvents = 128;
|
|
5
|
+
const defaultRequestTimeoutMs = 30_000;
|
|
6
|
+
const permissionSettled = Symbol('permission-settled');
|
|
7
|
+
class EventQueue {
|
|
8
|
+
capacity;
|
|
9
|
+
values = [];
|
|
10
|
+
waiter;
|
|
11
|
+
closed = false;
|
|
12
|
+
failure;
|
|
13
|
+
sequence = 0;
|
|
14
|
+
acknowledgedSequence = 0;
|
|
15
|
+
barrierWaiters = new Set();
|
|
16
|
+
constructor(capacity) {
|
|
17
|
+
this.capacity = capacity;
|
|
18
|
+
}
|
|
19
|
+
push(value) {
|
|
20
|
+
if (this.closed)
|
|
21
|
+
return false;
|
|
22
|
+
const queued = { event: value, sequence: ++this.sequence };
|
|
23
|
+
if (this.waiter) {
|
|
24
|
+
const waiter = this.waiter;
|
|
25
|
+
this.waiter = undefined;
|
|
26
|
+
waiter.resolve({ done: false, value: queued });
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
if (this.values.length >= this.capacity)
|
|
30
|
+
return false;
|
|
31
|
+
this.values.push(queued);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
next() {
|
|
35
|
+
const value = this.values.shift();
|
|
36
|
+
if (value)
|
|
37
|
+
return Promise.resolve({ done: false, value });
|
|
38
|
+
if (this.failure !== undefined) {
|
|
39
|
+
return Promise.reject(asError(this.failure));
|
|
40
|
+
}
|
|
41
|
+
if (this.closed)
|
|
42
|
+
return Promise.resolve({ done: true, value: undefined });
|
|
43
|
+
if (this.waiter) {
|
|
44
|
+
return Promise.reject(acpError('invalid_configuration', 'Only one ACP event read may be pending at a time.'));
|
|
45
|
+
}
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
this.waiter = { resolve, reject };
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
close(failure) {
|
|
51
|
+
if (this.closed)
|
|
52
|
+
return;
|
|
53
|
+
this.closed = true;
|
|
54
|
+
this.failure = failure;
|
|
55
|
+
this.values.length = 0;
|
|
56
|
+
const barrierFailure = asError(failure ?? acpError('client_closed', 'The ACP event queue is closed.'));
|
|
57
|
+
for (const waiter of this.barrierWaiters)
|
|
58
|
+
waiter.reject(barrierFailure);
|
|
59
|
+
this.barrierWaiters.clear();
|
|
60
|
+
if (!this.waiter)
|
|
61
|
+
return;
|
|
62
|
+
const waiter = this.waiter;
|
|
63
|
+
this.waiter = undefined;
|
|
64
|
+
if (failure !== undefined)
|
|
65
|
+
waiter.reject(failure);
|
|
66
|
+
else
|
|
67
|
+
waiter.resolve({ done: true, value: undefined });
|
|
68
|
+
}
|
|
69
|
+
checkpoint() {
|
|
70
|
+
return this.sequence;
|
|
71
|
+
}
|
|
72
|
+
acknowledge(sequence) {
|
|
73
|
+
this.acknowledgedSequence = sequence;
|
|
74
|
+
for (const waiter of [...this.barrierWaiters]) {
|
|
75
|
+
if (waiter.target > sequence)
|
|
76
|
+
continue;
|
|
77
|
+
this.barrierWaiters.delete(waiter);
|
|
78
|
+
waiter.resolve();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
waitForAcknowledgement(target, timeoutMs, signal) {
|
|
82
|
+
if (target <= this.acknowledgedSequence)
|
|
83
|
+
return Promise.resolve();
|
|
84
|
+
if (this.closed) {
|
|
85
|
+
return Promise.reject(asError(this.failure ??
|
|
86
|
+
acpError('client_closed', 'The ACP event queue is closed.')));
|
|
87
|
+
}
|
|
88
|
+
if (signal?.aborted) {
|
|
89
|
+
return Promise.reject(new JsonRpcTransportError('request_aborted', 'The local request wait was aborted.'));
|
|
90
|
+
}
|
|
91
|
+
if (this.barrierWaiters.size >= this.capacity) {
|
|
92
|
+
return Promise.reject(acpError('event_capacity_exceeded', 'The bounded ACP event acknowledgement limit was reached.'));
|
|
93
|
+
}
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
let settled = false;
|
|
96
|
+
const finish = (failure) => {
|
|
97
|
+
if (settled)
|
|
98
|
+
return;
|
|
99
|
+
settled = true;
|
|
100
|
+
clearTimeout(timer);
|
|
101
|
+
signal?.removeEventListener('abort', abortListener);
|
|
102
|
+
this.barrierWaiters.delete(waiter);
|
|
103
|
+
if (failure)
|
|
104
|
+
reject(failure);
|
|
105
|
+
else
|
|
106
|
+
resolve();
|
|
107
|
+
};
|
|
108
|
+
const abortListener = () => {
|
|
109
|
+
finish(new JsonRpcTransportError('request_aborted', 'The local request wait was aborted.'));
|
|
110
|
+
};
|
|
111
|
+
const timer = setTimeout(() => {
|
|
112
|
+
finish(new JsonRpcTransportError('request_timeout', 'The JSON-RPC request timed out.'));
|
|
113
|
+
}, timeoutMs);
|
|
114
|
+
timer.unref();
|
|
115
|
+
const waiter = {
|
|
116
|
+
target,
|
|
117
|
+
resolve: () => {
|
|
118
|
+
finish();
|
|
119
|
+
},
|
|
120
|
+
reject: (error) => {
|
|
121
|
+
finish(error);
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
this.barrierWaiters.add(waiter);
|
|
125
|
+
signal?.addEventListener('abort', abortListener, { once: true });
|
|
126
|
+
if (signal?.aborted)
|
|
127
|
+
abortListener();
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Provider-neutral stable ACP v1 client over bounded JSON-RPC stdio streams.
|
|
133
|
+
* It owns ACP negotiation and message semantics, never process lifecycle.
|
|
134
|
+
*/
|
|
135
|
+
export class AcpClient {
|
|
136
|
+
transport;
|
|
137
|
+
eventQueue;
|
|
138
|
+
requestPermissionHandler;
|
|
139
|
+
extensionRequestHandler;
|
|
140
|
+
extensionNotificationHandler;
|
|
141
|
+
pendingPermissions = new Map();
|
|
142
|
+
activePromptSessions = new Map();
|
|
143
|
+
cancellingSessions = new Set();
|
|
144
|
+
cancellationOperations = new Map();
|
|
145
|
+
closingSessions = new Set();
|
|
146
|
+
handlerTasks = new Set();
|
|
147
|
+
dispatchPromise;
|
|
148
|
+
requestTimeoutMs;
|
|
149
|
+
initializeAttempted = false;
|
|
150
|
+
initializePromise;
|
|
151
|
+
initializeResult;
|
|
152
|
+
eventsClaimed = false;
|
|
153
|
+
open = true;
|
|
154
|
+
constructor(options) {
|
|
155
|
+
const { extensionNotification, extensionRequest, maxBufferedEvents = defaultMaxBufferedEvents, requestPermission, ...transportOptions } = options;
|
|
156
|
+
if (!Number.isSafeInteger(maxBufferedEvents) || maxBufferedEvents <= 0) {
|
|
157
|
+
throw acpError('invalid_configuration', 'ACP event capacity must be a positive safe integer.');
|
|
158
|
+
}
|
|
159
|
+
this.eventQueue = new EventQueue(maxBufferedEvents);
|
|
160
|
+
this.requestTimeoutMs =
|
|
161
|
+
transportOptions.requestTimeoutMs ?? defaultRequestTimeoutMs;
|
|
162
|
+
this.requestPermissionHandler = requestPermission;
|
|
163
|
+
this.extensionRequestHandler = extensionRequest;
|
|
164
|
+
this.extensionNotificationHandler = extensionNotification;
|
|
165
|
+
this.transport = new JsonRpcStdioTransport({
|
|
166
|
+
...transportOptions,
|
|
167
|
+
emitJsonRpcVersion: true,
|
|
168
|
+
requireIntegerNumericIds: true,
|
|
169
|
+
requireJsonRpcVersion: true,
|
|
170
|
+
});
|
|
171
|
+
this.dispatchPromise = this.dispatch().catch((error) => {
|
|
172
|
+
this.fail(error);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
/** Negotiate the stable ACP v1 protocol exactly once. */
|
|
176
|
+
initialize(input = {}, options = {}) {
|
|
177
|
+
if (this.initializePromise)
|
|
178
|
+
return this.initializePromise;
|
|
179
|
+
if (this.initializeAttempted || this.initializeResult) {
|
|
180
|
+
return Promise.reject(acpError('already_initialized', 'This ACP client has already attempted initialization.'));
|
|
181
|
+
}
|
|
182
|
+
if (!this.isOpen()) {
|
|
183
|
+
return Promise.reject(acpError('client_closed', 'The ACP client is closed.'));
|
|
184
|
+
}
|
|
185
|
+
let params;
|
|
186
|
+
try {
|
|
187
|
+
params = prepareInitializeInput(input);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
return Promise.reject(asError(error));
|
|
191
|
+
}
|
|
192
|
+
this.initializeAttempted = true;
|
|
193
|
+
const pending = this.transport
|
|
194
|
+
.request('initialize', params, options)
|
|
195
|
+
.then((value) => {
|
|
196
|
+
const result = parseInitializeResult(value);
|
|
197
|
+
this.initializeResult = result;
|
|
198
|
+
return result;
|
|
199
|
+
})
|
|
200
|
+
.catch((error) => {
|
|
201
|
+
if (error instanceof AcpClientError)
|
|
202
|
+
this.fail(error);
|
|
203
|
+
throw error;
|
|
204
|
+
})
|
|
205
|
+
.finally(() => {
|
|
206
|
+
this.initializePromise = undefined;
|
|
207
|
+
});
|
|
208
|
+
this.initializePromise = pending;
|
|
209
|
+
return pending;
|
|
210
|
+
}
|
|
211
|
+
/** Return the normalized capabilities established by initialization. */
|
|
212
|
+
capabilities() {
|
|
213
|
+
return this.requireInitialized().capabilities;
|
|
214
|
+
}
|
|
215
|
+
/** Create a new ACP Session. */
|
|
216
|
+
async newSession(input, options = {}) {
|
|
217
|
+
const capabilities = this.requireReadyCapabilities();
|
|
218
|
+
const params = prepareNewSessionInput(input, capabilities);
|
|
219
|
+
return await this.requestParsed('session/new', params, options, parseNewSessionResult);
|
|
220
|
+
}
|
|
221
|
+
/** Load an existing Session and allow the Agent to replay its history. */
|
|
222
|
+
async loadSession(input, options = {}) {
|
|
223
|
+
const capabilities = this.requireReadyCapabilities();
|
|
224
|
+
this.requireCapability(capabilities.loadSession, 'The ACP Agent did not advertise session/load.');
|
|
225
|
+
const params = prepareLoadSessionInput(input, capabilities);
|
|
226
|
+
return await this.requestParsed('session/load', params, options, parseSessionStateResult);
|
|
227
|
+
}
|
|
228
|
+
/** Resume an existing Session without replaying its history. */
|
|
229
|
+
async resumeSession(input, options = {}) {
|
|
230
|
+
const capabilities = this.requireReadyCapabilities();
|
|
231
|
+
this.requireCapability(capabilities.session.resume, 'The ACP Agent did not advertise session/resume.');
|
|
232
|
+
const params = prepareResumeSessionInput(input, capabilities);
|
|
233
|
+
return await this.requestParsed('session/resume', params, options, parseSessionStateResult);
|
|
234
|
+
}
|
|
235
|
+
/** List Sessions when advertised by the Agent. */
|
|
236
|
+
async listSessions(input = {}, options = {}) {
|
|
237
|
+
const capabilities = this.requireReadyCapabilities();
|
|
238
|
+
this.requireCapability(capabilities.session.list, 'The ACP Agent did not advertise session/list.');
|
|
239
|
+
return await this.requestParsed('session/list', prepareListSessionsInput(input), options, parseListSessionsResult);
|
|
240
|
+
}
|
|
241
|
+
/** Delete a listed Session when advertised by the Agent. */
|
|
242
|
+
async deleteSession(sessionId, options = {}) {
|
|
243
|
+
const capabilities = this.requireReadyCapabilities();
|
|
244
|
+
this.requireCapability(capabilities.session.delete, 'The ACP Agent did not advertise session/delete.');
|
|
245
|
+
return await this.requestParsed('session/delete', { sessionId: sessionIdentifier(sessionId) }, options, parseEmptyResult);
|
|
246
|
+
}
|
|
247
|
+
/** Close an active Session when advertised by the Agent. */
|
|
248
|
+
async closeSession(sessionIdValue, options = {}) {
|
|
249
|
+
const capabilities = this.requireReadyCapabilities();
|
|
250
|
+
this.requireCapability(capabilities.session.close, 'The ACP Agent did not advertise session/close.');
|
|
251
|
+
const sessionId = sessionIdentifier(sessionIdValue);
|
|
252
|
+
if (this.closingSessions.has(sessionId)) {
|
|
253
|
+
throw acpError('invalid_params', 'This ACP Session is already closing.');
|
|
254
|
+
}
|
|
255
|
+
this.closingSessions.add(sessionId);
|
|
256
|
+
let detachedLocalWait = false;
|
|
257
|
+
try {
|
|
258
|
+
await this.settleSessionPermissions(sessionId);
|
|
259
|
+
const result = await this.requestParsed('session/close', { sessionId }, options, parseEmptyResult);
|
|
260
|
+
this.activePromptSessions.delete(sessionId);
|
|
261
|
+
this.maybeClearCancellation(sessionId);
|
|
262
|
+
return result;
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
detachedLocalWait = isLocalWaitEnd(error);
|
|
266
|
+
throw error;
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
if (!detachedLocalWait)
|
|
270
|
+
this.closingSessions.delete(sessionId);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/** Submit one prompt turn and resolve only from its terminal response. */
|
|
274
|
+
async prompt(input, options = {}) {
|
|
275
|
+
const capabilities = this.requireReadyCapabilities();
|
|
276
|
+
const params = preparePromptInput(input, capabilities);
|
|
277
|
+
const sessionId = input.sessionId;
|
|
278
|
+
if (this.activePromptSessions.has(sessionId) ||
|
|
279
|
+
this.cancellingSessions.has(sessionId) ||
|
|
280
|
+
this.closingSessions.has(sessionId)) {
|
|
281
|
+
throw acpError('invalid_params', 'Only one ACP prompt may be active per Session.');
|
|
282
|
+
}
|
|
283
|
+
const promptToken = Symbol(sessionId);
|
|
284
|
+
this.activePromptSessions.set(sessionId, promptToken);
|
|
285
|
+
let detachedLocalWait = false;
|
|
286
|
+
let responseReceived = false;
|
|
287
|
+
const deadline = Date.now() + (options.timeoutMs ?? this.requestTimeoutMs);
|
|
288
|
+
try {
|
|
289
|
+
const result = await this.requestParsed('session/prompt', params, options, parsePromptResult, true);
|
|
290
|
+
responseReceived = true;
|
|
291
|
+
if (this.eventsClaimed) {
|
|
292
|
+
const remainingTimeoutMs = deadline - Date.now();
|
|
293
|
+
if (remainingTimeoutMs <= 0) {
|
|
294
|
+
throw new JsonRpcTransportError('request_timeout', 'The JSON-RPC request timed out.');
|
|
295
|
+
}
|
|
296
|
+
await this.eventQueue.waitForAcknowledgement(this.eventQueue.checkpoint(), remainingTimeoutMs, options.signal);
|
|
297
|
+
}
|
|
298
|
+
return result;
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
detachedLocalWait = !responseReceived && isLocalWaitEnd(error);
|
|
302
|
+
throw error;
|
|
303
|
+
}
|
|
304
|
+
finally {
|
|
305
|
+
if (!detachedLocalWait) {
|
|
306
|
+
if (this.activePromptSessions.get(sessionId) === promptToken) {
|
|
307
|
+
this.activePromptSessions.delete(sessionId);
|
|
308
|
+
}
|
|
309
|
+
this.maybeClearCancellation(sessionId);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Send native ACP Session cancellation. Pending permission prompts for the
|
|
315
|
+
* Session are answered as cancelled first, as required by ACP v1.
|
|
316
|
+
*/
|
|
317
|
+
async cancelSession(sessionIdValue) {
|
|
318
|
+
this.requireReadyCapabilities();
|
|
319
|
+
const sessionId = sessionIdentifier(sessionIdValue);
|
|
320
|
+
this.cancellingSessions.add(sessionId);
|
|
321
|
+
this.beginCancellationOperation(sessionId);
|
|
322
|
+
try {
|
|
323
|
+
await this.settleSessionPermissions(sessionId);
|
|
324
|
+
await this.transport.notify('session/cancel', { sessionId });
|
|
325
|
+
}
|
|
326
|
+
finally {
|
|
327
|
+
this.endCancellationOperation(sessionId);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/** Invoke an explicitly namespaced ACP extension request. */
|
|
331
|
+
async requestExtension(methodValue, params, options = {}) {
|
|
332
|
+
this.requireReadyCapabilities();
|
|
333
|
+
return await this.transport.request(extensionMethod(methodValue), params, options);
|
|
334
|
+
}
|
|
335
|
+
/** Send an explicitly namespaced ACP extension notification. */
|
|
336
|
+
async notifyExtension(methodValue, params) {
|
|
337
|
+
this.requireReadyCapabilities();
|
|
338
|
+
await this.transport.notify(extensionMethod(methodValue), params);
|
|
339
|
+
}
|
|
340
|
+
/** Iterate typed Session updates and redacted unknown observations in order. */
|
|
341
|
+
events() {
|
|
342
|
+
if (this.eventsClaimed) {
|
|
343
|
+
throw acpError('invalid_configuration', 'The ACP event stream already has a consumer.');
|
|
344
|
+
}
|
|
345
|
+
this.eventsClaimed = true;
|
|
346
|
+
const source = this.iterateEvents();
|
|
347
|
+
return {
|
|
348
|
+
[Symbol.asyncIterator]() {
|
|
349
|
+
return this;
|
|
350
|
+
},
|
|
351
|
+
next: () => source.next(),
|
|
352
|
+
return: async () => {
|
|
353
|
+
await this.close();
|
|
354
|
+
return source.return(undefined);
|
|
355
|
+
},
|
|
356
|
+
throw: async (error) => {
|
|
357
|
+
await this.close();
|
|
358
|
+
return source.throw(error);
|
|
359
|
+
},
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
/** Whether the logical ACP connection can still accept operations. */
|
|
363
|
+
isOpen() {
|
|
364
|
+
return this.open && this.transport.isOpen();
|
|
365
|
+
}
|
|
366
|
+
/** Close ACP dispatch and the composed transport without owning its streams. */
|
|
367
|
+
async close() {
|
|
368
|
+
if (this.open) {
|
|
369
|
+
this.open = false;
|
|
370
|
+
this.eventQueue.close();
|
|
371
|
+
this.releaseAllPendingPermissions();
|
|
372
|
+
this.activePromptSessions.clear();
|
|
373
|
+
this.cancellingSessions.clear();
|
|
374
|
+
this.cancellationOperations.clear();
|
|
375
|
+
this.closingSessions.clear();
|
|
376
|
+
}
|
|
377
|
+
await this.transport.close();
|
|
378
|
+
await this.dispatchPromise;
|
|
379
|
+
}
|
|
380
|
+
async dispatch() {
|
|
381
|
+
for await (const message of this.transport.incoming()) {
|
|
382
|
+
if (message.kind === 'request')
|
|
383
|
+
this.track(this.handleRequest(message));
|
|
384
|
+
else
|
|
385
|
+
this.handleNotification(message);
|
|
386
|
+
}
|
|
387
|
+
if (this.open) {
|
|
388
|
+
this.fail(acpError('client_closed', 'The ACP transport ended before the client was closed.'));
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
handleNotification(message) {
|
|
392
|
+
if (message.method === 'session/update') {
|
|
393
|
+
const parsed = parseSessionNotification(message.params);
|
|
394
|
+
if (parsed.kind === 'update') {
|
|
395
|
+
this.emit({
|
|
396
|
+
kind: 'session_update',
|
|
397
|
+
sessionId: parsed.sessionId,
|
|
398
|
+
update: parsed.update,
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
this.emit({ kind: 'unknown', observation: parsed.observation });
|
|
403
|
+
}
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
if (message.method.startsWith('_')) {
|
|
407
|
+
try {
|
|
408
|
+
if (this.extensionNotificationHandler) {
|
|
409
|
+
void Promise.resolve(this.extensionNotificationHandler(message.method, message.params)).catch(() => undefined);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
// Extension observers cannot affect ACP lifecycle.
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
this.emit({
|
|
417
|
+
kind: 'unknown',
|
|
418
|
+
observation: redactAcpObservation('unknown_notification', message.method, message.params),
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
async handleRequest(message) {
|
|
422
|
+
if (message.method === 'session/request_permission') {
|
|
423
|
+
let request;
|
|
424
|
+
try {
|
|
425
|
+
request = parsePermissionRequest(message.params);
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
await this.transport.respondError(message.id, {
|
|
429
|
+
code: -32_602,
|
|
430
|
+
message: 'Invalid params',
|
|
431
|
+
});
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
if (this.cancellingSessions.has(request.sessionId) ||
|
|
435
|
+
this.closingSessions.has(request.sessionId)) {
|
|
436
|
+
await this.transport.respond(message.id, {
|
|
437
|
+
outcome: { outcome: 'cancelled' },
|
|
438
|
+
});
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
if (!this.requestPermissionHandler) {
|
|
442
|
+
await this.transport.respondError(message.id, {
|
|
443
|
+
code: -32_601,
|
|
444
|
+
message: 'Method not found',
|
|
445
|
+
});
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
const pending = {
|
|
449
|
+
id: message.id,
|
|
450
|
+
key: requestKey(message.id),
|
|
451
|
+
request,
|
|
452
|
+
...settlementSignal(),
|
|
453
|
+
};
|
|
454
|
+
this.pendingPermissions.set(pending.key, pending);
|
|
455
|
+
const permissionHandler = this.requestPermissionHandler;
|
|
456
|
+
const handled = Promise.resolve()
|
|
457
|
+
.then(() => permissionHandler(request))
|
|
458
|
+
.then((outcome) => ({ kind: 'outcome', outcome }), () => ({ kind: 'failure' }));
|
|
459
|
+
const result = await Promise.race([
|
|
460
|
+
handled,
|
|
461
|
+
pending.settled.then(() => permissionSettled),
|
|
462
|
+
]);
|
|
463
|
+
if (result === permissionSettled)
|
|
464
|
+
return;
|
|
465
|
+
if (!this.releasePendingPermission(pending.key))
|
|
466
|
+
return;
|
|
467
|
+
if (result.kind === 'failure') {
|
|
468
|
+
await this.transport.respondError(message.id, {
|
|
469
|
+
code: -32_603,
|
|
470
|
+
message: 'Internal error',
|
|
471
|
+
});
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
try {
|
|
475
|
+
await this.transport.respond(message.id, preparePermissionOutcome(result.outcome, request));
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
if (error instanceof AcpClientError) {
|
|
479
|
+
await this.transport.respondError(message.id, {
|
|
480
|
+
code: -32_603,
|
|
481
|
+
message: 'Internal error',
|
|
482
|
+
});
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
throw error;
|
|
486
|
+
}
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
if (message.method.startsWith('_') && this.extensionRequestHandler) {
|
|
490
|
+
try {
|
|
491
|
+
const result = await this.extensionRequestHandler(message.method, message.params);
|
|
492
|
+
await this.transport.respond(message.id, result);
|
|
493
|
+
}
|
|
494
|
+
catch {
|
|
495
|
+
await this.transport.respondError(message.id, {
|
|
496
|
+
code: -32_603,
|
|
497
|
+
message: 'Internal error',
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
this.emit({
|
|
503
|
+
kind: 'unknown',
|
|
504
|
+
observation: redactAcpObservation('unknown_request', message.method, message.params),
|
|
505
|
+
});
|
|
506
|
+
await this.transport.respondError(message.id, {
|
|
507
|
+
code: -32_601,
|
|
508
|
+
message: 'Method not found',
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
emit(event) {
|
|
512
|
+
if (this.eventQueue.push(event))
|
|
513
|
+
return;
|
|
514
|
+
this.fail(acpError('event_capacity_exceeded', 'The bounded ACP event queue is full.'));
|
|
515
|
+
}
|
|
516
|
+
track(promise) {
|
|
517
|
+
const tracked = promise
|
|
518
|
+
.catch((error) => {
|
|
519
|
+
this.fail(error);
|
|
520
|
+
})
|
|
521
|
+
.finally(() => {
|
|
522
|
+
this.handlerTasks.delete(tracked);
|
|
523
|
+
});
|
|
524
|
+
this.handlerTasks.add(tracked);
|
|
525
|
+
}
|
|
526
|
+
fail(error) {
|
|
527
|
+
if (!this.open)
|
|
528
|
+
return;
|
|
529
|
+
this.open = false;
|
|
530
|
+
this.releaseAllPendingPermissions();
|
|
531
|
+
this.eventQueue.close(error);
|
|
532
|
+
void this.transport.close().catch(() => undefined);
|
|
533
|
+
}
|
|
534
|
+
async *iterateEvents() {
|
|
535
|
+
for (;;) {
|
|
536
|
+
const next = await this.eventQueue.next();
|
|
537
|
+
if (next.done)
|
|
538
|
+
return;
|
|
539
|
+
yield next.value.event;
|
|
540
|
+
this.eventQueue.acknowledge(next.value.sequence);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
requireInitialized() {
|
|
544
|
+
if (!this.initializeResult) {
|
|
545
|
+
throw acpError('not_initialized', 'The ACP client has not completed initialization.');
|
|
546
|
+
}
|
|
547
|
+
return this.initializeResult;
|
|
548
|
+
}
|
|
549
|
+
requireReadyCapabilities() {
|
|
550
|
+
const result = this.requireInitialized();
|
|
551
|
+
if (!this.isOpen()) {
|
|
552
|
+
throw acpError('client_closed', 'The ACP client is closed.');
|
|
553
|
+
}
|
|
554
|
+
return result.capabilities;
|
|
555
|
+
}
|
|
556
|
+
requireCapability(advertised, message) {
|
|
557
|
+
if (!advertised) {
|
|
558
|
+
throw acpError('capability_not_advertised', message);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
requestParsed(method, params, options, parse, afterInbound = false) {
|
|
562
|
+
const response = afterInbound
|
|
563
|
+
? this.transport.requestAfterInbound(method, params, options)
|
|
564
|
+
: this.transport.request(method, params, options);
|
|
565
|
+
return response.then((value) => {
|
|
566
|
+
try {
|
|
567
|
+
return parse(value);
|
|
568
|
+
}
|
|
569
|
+
catch (error) {
|
|
570
|
+
if (error instanceof AcpClientError)
|
|
571
|
+
this.fail(error);
|
|
572
|
+
throw error;
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
async settleSessionPermissions(sessionId) {
|
|
577
|
+
const responses = [];
|
|
578
|
+
for (const pending of [...this.pendingPermissions.values()]) {
|
|
579
|
+
if (pending.request.sessionId !== sessionId)
|
|
580
|
+
continue;
|
|
581
|
+
this.releasePendingPermission(pending.key);
|
|
582
|
+
responses.push(this.transport.respond(pending.id, {
|
|
583
|
+
outcome: { outcome: 'cancelled' },
|
|
584
|
+
}));
|
|
585
|
+
}
|
|
586
|
+
await Promise.all(responses);
|
|
587
|
+
}
|
|
588
|
+
releasePendingPermission(key) {
|
|
589
|
+
const pending = this.pendingPermissions.get(key);
|
|
590
|
+
if (!pending)
|
|
591
|
+
return false;
|
|
592
|
+
this.pendingPermissions.delete(key);
|
|
593
|
+
pending.settle();
|
|
594
|
+
return true;
|
|
595
|
+
}
|
|
596
|
+
releaseAllPendingPermissions() {
|
|
597
|
+
for (const pending of [...this.pendingPermissions.values()]) {
|
|
598
|
+
this.releasePendingPermission(pending.key);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
beginCancellationOperation(sessionId) {
|
|
602
|
+
this.cancellationOperations.set(sessionId, (this.cancellationOperations.get(sessionId) ?? 0) + 1);
|
|
603
|
+
}
|
|
604
|
+
endCancellationOperation(sessionId) {
|
|
605
|
+
const remaining = (this.cancellationOperations.get(sessionId) ?? 1) - 1;
|
|
606
|
+
if (remaining > 0)
|
|
607
|
+
this.cancellationOperations.set(sessionId, remaining);
|
|
608
|
+
else
|
|
609
|
+
this.cancellationOperations.delete(sessionId);
|
|
610
|
+
this.maybeClearCancellation(sessionId);
|
|
611
|
+
}
|
|
612
|
+
maybeClearCancellation(sessionId) {
|
|
613
|
+
if (!this.activePromptSessions.has(sessionId) &&
|
|
614
|
+
!this.cancellationOperations.has(sessionId)) {
|
|
615
|
+
this.cancellingSessions.delete(sessionId);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
function requestKey(id) {
|
|
620
|
+
return `${typeof id}:${String(id)}`;
|
|
621
|
+
}
|
|
622
|
+
function settlementSignal() {
|
|
623
|
+
let settle;
|
|
624
|
+
const settled = new Promise((resolve) => {
|
|
625
|
+
settle = resolve;
|
|
626
|
+
});
|
|
627
|
+
return {
|
|
628
|
+
settle: () => {
|
|
629
|
+
settle?.();
|
|
630
|
+
settle = undefined;
|
|
631
|
+
},
|
|
632
|
+
settled,
|
|
633
|
+
};
|
|
634
|
+
}
|
|
635
|
+
function asError(error) {
|
|
636
|
+
return error instanceof Error
|
|
637
|
+
? error
|
|
638
|
+
: acpError('invalid_message', 'The ACP operation failed safely.');
|
|
639
|
+
}
|
|
640
|
+
function isLocalWaitEnd(error) {
|
|
641
|
+
return (error instanceof JsonRpcTransportError &&
|
|
642
|
+
(error.code === 'request_aborted' || error.code === 'request_timeout'));
|
|
643
|
+
}
|
|
644
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|