@beeos-ai/bma-executor-sdk 0.0.0-stage → 0.4.0

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/dist/agent.js ADDED
@@ -0,0 +1,478 @@
1
+ // Agent capability, executor side: a complete local agent served over the
2
+ // executor protocol. The SDK owns turn.start/input/cancel, session.close,
3
+ // event ids and sequences, ACK tracking and resend after reconnect,
4
+ // interactions, and the session.status_running / status_idle events that
5
+ // frame every turn. Mirrors go/executor agent.go.
6
+ import { JsonRpcErrorCode, } from './generated/executor.js';
7
+ import { AgentSessionClosedError, ClientStoppedError, deferred, RpcError } from './errors.js';
8
+ const RESEND_DELAY_MS = 200;
9
+ const CLOSE_FLUSH_WAIT_MS = 30_000;
10
+ class DeadlineExceeded extends Error {
11
+ constructor() {
12
+ super('turn deadline_ms exceeded');
13
+ }
14
+ }
15
+ /** An unbounded async queue with one consumer. */
16
+ class InputQueue {
17
+ items = [];
18
+ waiter;
19
+ ended = false;
20
+ push(item) {
21
+ if (this.waiter) {
22
+ const waiter = this.waiter;
23
+ this.waiter = undefined;
24
+ waiter.resolve({ value: item, done: false });
25
+ }
26
+ else
27
+ this.items.push(item);
28
+ }
29
+ end() {
30
+ this.ended = true;
31
+ this.waiter?.resolve({ value: undefined, done: true });
32
+ this.waiter = undefined;
33
+ }
34
+ next() {
35
+ const item = this.items.shift();
36
+ if (item !== undefined)
37
+ return Promise.resolve({ value: item, done: false });
38
+ if (this.ended)
39
+ return Promise.resolve({ value: undefined, done: true });
40
+ this.waiter = deferred();
41
+ return this.waiter.promise;
42
+ }
43
+ [Symbol.asyncIterator]() {
44
+ return { next: () => this.next() };
45
+ }
46
+ }
47
+ /** The handle runTurn uses to talk to the platform. */
48
+ export class AgentTurn {
49
+ session;
50
+ params;
51
+ ended = false;
52
+ abort = new AbortController();
53
+ done = deferred();
54
+ seen = new Set();
55
+ queue = new InputQueue();
56
+ constructor(session, params) {
57
+ this.session = session;
58
+ this.params = params;
59
+ this.seen.add(params.input_id);
60
+ }
61
+ get sessionId() {
62
+ return this.session.id;
63
+ }
64
+ get turnId() {
65
+ return this.params.turn_id;
66
+ }
67
+ /** turn.input messages in arrival order; the iteration ends with the turn. */
68
+ get inputs() {
69
+ return this.queue;
70
+ }
71
+ /** @internal */
72
+ pushInput(input) {
73
+ this.queue.push(input);
74
+ }
75
+ /** @internal */
76
+ finish() {
77
+ this.ended = true;
78
+ this.queue.end();
79
+ }
80
+ /** A fresh event id, for a message streamed with delta before emitWithId. */
81
+ newEventId() {
82
+ return this.session.newEventId();
83
+ }
84
+ /**
85
+ * Queues one durable event and returns its id. Delivery is asynchronous,
86
+ * ordered and at-least-once; the platform deduplicates by event id.
87
+ */
88
+ emit(event) {
89
+ return this.emitWithId(this.newEventId(), event);
90
+ }
91
+ emitWithId(eventId, event) {
92
+ if (this.ended)
93
+ throw new Error('turn already ended');
94
+ this.session.enqueue(this.params.turn_id, eventId, event);
95
+ return eventId;
96
+ }
97
+ /** Streams a transient preview of the durable event eventId; dropped while disconnected, never resent. */
98
+ delta(eventId, eventType, index, text) {
99
+ const params = {
100
+ session_id: this.session.id,
101
+ turn_id: this.params.turn_id,
102
+ event_id: eventId,
103
+ event_type: eventType,
104
+ index,
105
+ text,
106
+ };
107
+ try {
108
+ this.session.host.notify('session.event_delta', params);
109
+ }
110
+ catch (error) {
111
+ this.session.host.log('debug', 'session.event_delta dropped', error);
112
+ }
113
+ }
114
+ /** Resolves once every event emitted so far is acknowledged. */
115
+ flush(signal) {
116
+ return this.session.flush(signal);
117
+ }
118
+ /**
119
+ * Asks the platform for an approval or an answer and waits for
120
+ * interaction.response. It flushes first so the platform already has the
121
+ * agent.tool_use the request references. When signal aborts or expires_at
122
+ * passes, it withdraws the interaction with interaction.cancel; an expiry
123
+ * resolves with outcome expired, which the agent must treat as a deny.
124
+ */
125
+ async requestInteraction(request, signal) {
126
+ const session = this.session;
127
+ const params = {
128
+ ...request,
129
+ session_id: session.id,
130
+ turn_id: this.params.turn_id,
131
+ interaction_id: request.interaction_id || `int_${this.newEventId().slice(4)}`,
132
+ };
133
+ const answer = deferred();
134
+ session.pending.set(params.interaction_id, answer);
135
+ try {
136
+ await this.flush(signal);
137
+ await session.callUntilConnected(() => session.host.call('interaction.request', params), signal);
138
+ const waits = [answer.promise];
139
+ let timer;
140
+ if (params.expires_at) {
141
+ const at = Date.parse(params.expires_at);
142
+ if (Number.isNaN(at))
143
+ throw new Error(`invalid expires_at ${params.expires_at}`);
144
+ waits.push(new Promise((resolve) => {
145
+ timer = setTimeout(() => {
146
+ void session.withdraw(params.interaction_id, 'expired');
147
+ resolve({ session_id: session.id, interaction_id: params.interaction_id, outcome: 'expired' });
148
+ }, at - Date.now());
149
+ }));
150
+ }
151
+ if (signal) {
152
+ waits.push(new Promise((_resolve, reject) => {
153
+ const onAbort = () => {
154
+ void session.withdraw(params.interaction_id, 'turn_canceled');
155
+ reject(signal.reason);
156
+ };
157
+ if (signal.aborted)
158
+ onAbort();
159
+ else
160
+ signal.addEventListener('abort', onAbort, { once: true });
161
+ }));
162
+ }
163
+ try {
164
+ return await Promise.race(waits);
165
+ }
166
+ finally {
167
+ clearTimeout(timer);
168
+ }
169
+ }
170
+ finally {
171
+ session.pending.delete(params.interaction_id);
172
+ }
173
+ }
174
+ /** Withdraws an open interaction, for example one the user answered locally (resolved_locally). */
175
+ cancelInteraction(interactionId, reason) {
176
+ return this.session.withdraw(interactionId, reason);
177
+ }
178
+ }
179
+ /** One platform session on this executor: its outbox of durable events and at most one running turn. */
180
+ class AgentSession {
181
+ host;
182
+ id;
183
+ nextSequence = 1;
184
+ nextId = 0;
185
+ outbox = [];
186
+ wake = deferred();
187
+ drained = deferred();
188
+ closed = false;
189
+ turn;
190
+ results = new Map();
191
+ pending = new Map();
192
+ answered = new Set();
193
+ constructor(host, id) {
194
+ this.host = host;
195
+ this.id = id;
196
+ this.drained.resolve();
197
+ void this.sendLoop();
198
+ }
199
+ newEventId() {
200
+ return `evt_${this.id}_${++this.nextId}`;
201
+ }
202
+ enqueue(turnId, eventId, event) {
203
+ if (this.closed)
204
+ throw new AgentSessionClosedError();
205
+ const params = {
206
+ session_id: this.id,
207
+ turn_id: turnId,
208
+ event_id: eventId,
209
+ sequence: this.nextSequence++,
210
+ event: event,
211
+ };
212
+ if (this.outbox.length === 0)
213
+ this.drained = deferred();
214
+ this.outbox.push({ params });
215
+ this.signal();
216
+ }
217
+ signal() {
218
+ this.wake.resolve();
219
+ }
220
+ async flush(signal) {
221
+ if (!signal)
222
+ return this.drained.promise;
223
+ await Promise.race([
224
+ this.drained.promise,
225
+ new Promise((_resolve, reject) => {
226
+ if (signal.aborted)
227
+ reject(signal.reason);
228
+ signal.addEventListener('abort', () => reject(signal.reason), { once: true });
229
+ }),
230
+ ]);
231
+ }
232
+ /**
233
+ * Delivers the outbox head first, one event at a time, so the platform sees
234
+ * every session in sequence order. A transport failure keeps the event and
235
+ * waits for the next registration: the resend after reconnect.
236
+ */
237
+ async sendLoop() {
238
+ for (;;) {
239
+ const head = this.outbox[0];
240
+ if (!head) {
241
+ if (this.closed || this.host.stopSignal.aborted)
242
+ return;
243
+ this.wake = deferred();
244
+ await this.wake.promise;
245
+ continue;
246
+ }
247
+ try {
248
+ await this.callUntilConnected(() => this.host.call('session.event', head.params));
249
+ }
250
+ catch (error) {
251
+ if (this.host.stopSignal.aborted)
252
+ return;
253
+ // A permanent rejection cannot be fixed by resending; surface it instead of blocking the session.
254
+ this.host.log('error', `session.event ${head.params.event_id} rejected`, error);
255
+ }
256
+ this.outbox.shift();
257
+ if (this.outbox.length === 0)
258
+ this.drained.resolve();
259
+ }
260
+ }
261
+ /** Retries call across disconnects; only transport failures, executor_busy and retryable errors are retried. */
262
+ async callUntilConnected(call, signal) {
263
+ for (;;) {
264
+ const registered = this.host.nextRegistration();
265
+ try {
266
+ return await call();
267
+ }
268
+ catch (error) {
269
+ if (error instanceof RpcError && error.data?.retryable !== true && error.code !== JsonRpcErrorCode.ExecutorBusy)
270
+ throw error;
271
+ if (error instanceof ClientStoppedError || this.host.stopSignal.aborted)
272
+ throw error;
273
+ }
274
+ const waits = [registered];
275
+ if (this.host.connected())
276
+ waits.push(new Promise((resolve) => setTimeout(resolve, RESEND_DELAY_MS)));
277
+ const stop = signal ?? this.host.stopSignal;
278
+ waits.push(new Promise((_resolve, reject) => {
279
+ if (stop.aborted)
280
+ reject(stop.reason);
281
+ stop.addEventListener('abort', () => reject(stop.reason), { once: true });
282
+ }));
283
+ if (signal) {
284
+ const stopped = this.host.stopSignal;
285
+ waits.push(new Promise((_resolve, reject) => stopped.addEventListener('abort', () => reject(stopped.reason), { once: true })));
286
+ }
287
+ await Promise.race(waits);
288
+ }
289
+ }
290
+ async withdraw(interactionId, reason) {
291
+ this.answered.add(interactionId);
292
+ const params = { session_id: this.id, interaction_id: interactionId, reason };
293
+ try {
294
+ await this.callUntilConnected(() => this.host.call('interaction.cancel', params), AbortSignal.timeout(CLOSE_FLUSH_WAIT_MS));
295
+ }
296
+ catch (error) {
297
+ this.host.log('warn', `interaction.cancel for ${interactionId} failed`, error);
298
+ }
299
+ }
300
+ }
301
+ /** @internal Routes agent methods for one ExecutorClient. */
302
+ export class AgentRuntime {
303
+ host;
304
+ handler;
305
+ capability;
306
+ sessions = new Map();
307
+ constructor(host, handler, capability) {
308
+ this.host = host;
309
+ this.handler = handler;
310
+ this.capability = capability;
311
+ }
312
+ /** Handles an agent method; undefined for every other method. */
313
+ dispatch(method, params) {
314
+ switch (method) {
315
+ case 'turn.start':
316
+ return this.turnStart(params);
317
+ case 'turn.input':
318
+ return this.turnInput(params);
319
+ case 'turn.cancel':
320
+ return Promise.resolve(this.turnCancel(params));
321
+ case 'session.close':
322
+ return this.sessionClose(params);
323
+ case 'interaction.response':
324
+ return Promise.resolve(this.interactionResponse(params));
325
+ default:
326
+ return undefined;
327
+ }
328
+ }
329
+ session(id, create) {
330
+ const existing = this.sessions.get(id);
331
+ if (existing || !create)
332
+ return existing;
333
+ const max = this.capability.max_sessions ?? 0;
334
+ if (max > 0 && this.sessions.size >= max)
335
+ throw new RpcError(JsonRpcErrorCode.ExecutorBusy, 'executor_busy');
336
+ const session = new AgentSession(this.host, id);
337
+ this.sessions.set(id, session);
338
+ this.host.addSession(id);
339
+ return session;
340
+ }
341
+ async turnStart(params) {
342
+ if (!params?.session_id || !params.turn_id || !params.input?.length) {
343
+ throw new RpcError(JsonRpcErrorCode.InvalidParams, 'session_id, turn_id and input are required');
344
+ }
345
+ const session = this.session(params.session_id, true);
346
+ const recorded = session.results.get(params.turn_id);
347
+ if (recorded)
348
+ return recorded;
349
+ if (session.turn)
350
+ throw new RpcError(JsonRpcErrorCode.Conflict, 'a turn is already running; use turn.input');
351
+ const turn = new AgentTurn(session, params);
352
+ session.turn = turn; // reserve the session before openTurn
353
+ let result;
354
+ try {
355
+ result = await this.handler.openTurn(params);
356
+ if (!result.accepted)
357
+ throw new RpcError(JsonRpcErrorCode.ExecutorBusy, 'turn not accepted');
358
+ }
359
+ catch (error) {
360
+ session.turn = undefined;
361
+ throw error;
362
+ }
363
+ result = { ...result, turn_id: params.turn_id };
364
+ session.results.set(params.turn_id, result);
365
+ setImmediate(() => void this.runTurn(session, turn));
366
+ return result;
367
+ }
368
+ async runTurn(session, turn) {
369
+ const turnId = turn.params.turn_id;
370
+ const onStop = () => turn.abort.abort(new ClientStoppedError());
371
+ this.host.stopSignal.addEventListener('abort', onStop, { once: true });
372
+ const deadline = turn.params.deadline_ms && turn.params.deadline_ms > 0
373
+ ? setTimeout(() => turn.abort.abort(new DeadlineExceeded()), turn.params.deadline_ms)
374
+ : undefined;
375
+ try {
376
+ session.enqueue(turnId, session.newEventId(), { type: 'session.status_running' });
377
+ let failure;
378
+ try {
379
+ await this.handler.runTurn(turn, turn.abort.signal);
380
+ }
381
+ catch (error) {
382
+ failure = error;
383
+ }
384
+ turn.finish();
385
+ let outcome = 'completed';
386
+ if (turn.abort.signal.reason instanceof DeadlineExceeded) {
387
+ outcome = 'failed';
388
+ session.enqueue(turnId, session.newEventId(), {
389
+ type: 'session.error',
390
+ error: { type: 'timeout', message: 'turn deadline_ms exceeded' },
391
+ });
392
+ }
393
+ else if (turn.abort.signal.aborted) {
394
+ outcome = 'canceled';
395
+ }
396
+ else if (failure !== undefined) {
397
+ outcome = 'failed';
398
+ session.enqueue(turnId, session.newEventId(), {
399
+ type: 'session.error',
400
+ error: { type: 'agent_error', message: failure instanceof Error ? failure.message : String(failure) },
401
+ });
402
+ }
403
+ session.enqueue(turnId, session.newEventId(), {
404
+ type: 'session.status_idle',
405
+ stop_reason: { type: 'end_turn' },
406
+ turn_outcome: outcome,
407
+ });
408
+ }
409
+ catch (error) {
410
+ this.host.log('warn', `turn ${turnId} ended after session.close`, error);
411
+ }
412
+ finally {
413
+ clearTimeout(deadline);
414
+ this.host.stopSignal.removeEventListener('abort', onStop);
415
+ if (session.turn === turn)
416
+ session.turn = undefined;
417
+ turn.done.resolve();
418
+ }
419
+ }
420
+ async turnInput(params) {
421
+ const session = this.session(params.session_id, false);
422
+ if (!session)
423
+ throw new RpcError(JsonRpcErrorCode.SessionNotActive, 'session_not_active');
424
+ const turn = session.turn;
425
+ if (!turn || turn.params.turn_id !== params.turn_id || turn.ended) {
426
+ throw new RpcError(JsonRpcErrorCode.Conflict, 'turn is not running; start a new turn');
427
+ }
428
+ if (turn.seen.has(params.input_id))
429
+ return { accepted: true };
430
+ turn.seen.add(params.input_id);
431
+ turn.pushInput(params);
432
+ return { accepted: true };
433
+ }
434
+ turnCancel(params) {
435
+ const turn = this.session(params.session_id, false)?.turn;
436
+ if (!turn || turn.params.turn_id !== params.turn_id || turn.ended)
437
+ return { canceled: false };
438
+ turn.abort.abort(new Error('turn.cancel'));
439
+ return { canceled: true };
440
+ }
441
+ async sessionClose(params) {
442
+ const session = this.session(params.session_id, false);
443
+ if (!session)
444
+ return { closed: false };
445
+ const turn = session.turn;
446
+ if (turn) {
447
+ turn.abort.abort(new Error('session.close'));
448
+ await turn.done.promise;
449
+ }
450
+ try {
451
+ await session.flush(AbortSignal.timeout(CLOSE_FLUSH_WAIT_MS));
452
+ }
453
+ catch (error) {
454
+ this.host.log('warn', `session.close: events of ${session.id} still unacknowledged`, error);
455
+ }
456
+ await this.handler.closeSession(session.id, params.reason);
457
+ session.closed = true;
458
+ session.signal();
459
+ this.sessions.delete(session.id);
460
+ this.host.removeSession(session.id);
461
+ void session
462
+ .callUntilConnected(() => this.host.sessionEnded({ session_id: session.id, reason: params.reason }), AbortSignal.timeout(CLOSE_FLUSH_WAIT_MS))
463
+ .catch((error) => this.host.log('warn', `session.ended for ${session.id} failed`, error));
464
+ return { closed: true };
465
+ }
466
+ interactionResponse(params) {
467
+ const session = this.session(params.session_id, false);
468
+ if (!session)
469
+ return { accepted: false };
470
+ const waiter = session.pending.get(params.interaction_id);
471
+ if (!waiter || session.answered.has(params.interaction_id))
472
+ return { accepted: false };
473
+ session.answered.add(params.interaction_id);
474
+ waiter.resolve(params);
475
+ return { accepted: true };
476
+ }
477
+ }
478
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ import { ChannelScope, ConnectionState, type Ack, type Capabilities, type ExecutorDrainParams, type ExecutorDrainResult, type ExecutorInfo, type ExecutorLoad, type ExecutorRegisterResult, type ExecutorTokenResponse, type SessionAssignParams, type SessionAssignResult, type SessionEndedParams, type SessionEventParams, type SessionEventResult, type SessionReadyParams, type SessionStatusParams, type SessionStopParams, type SessionStopResult, type ToolCallParams, type ToolProgressParams, type ToolResultParams, type AgentCapability } from './generated/executor.js';
2
+ import { type AgentHandler } from './agent.js';
3
+ import { type Logger } from './rpc.js';
4
+ import { FrameChannel, type Conn } from './transport.js';
5
+ export declare const DEFAULT_BASE_URL = "https://api.bma.beeos.ai";
6
+ export declare const DEFAULT_REQUEST_TIMEOUT_MS = 30000;
7
+ export declare const DEFAULT_MAX_RECONNECT_ATTEMPTS = 10;
8
+ export declare const DEFAULT_RECONNECT_BASE_DELAY_MS = 500;
9
+ export declare const DEFAULT_TOOL_RESULT_RETRY_ATTEMPTS = 5;
10
+ export declare const DEFAULT_TOOL_RESULT_RETRY_BASE_DELAY_MS = 250;
11
+ /** Close codes after which the executor must not reconnect (1008 policy, 4002 revoked, 4003 protocol, 4004 replaced, 4005 drained). */
12
+ export declare function isTerminalCloseCode(code: number): boolean;
13
+ /** Which channel to open: the control channel, or one MCP channel of a session. */
14
+ export interface ChannelTarget {
15
+ channel: ChannelScope;
16
+ sessionId?: string;
17
+ serverKey?: string;
18
+ }
19
+ /** Opens a channel. Called again for every reconnect and every MCP channel. */
20
+ export type Dialer = (target: ChannelTarget) => Promise<Conn>;
21
+ export type TokenSource = () => Promise<Pick<ExecutorTokenResponse, 'token' | 'ws_url'> & Partial<ExecutorTokenResponse>>;
22
+ /** A TokenSource for a harness reached directly: ws://127.0.0.1, unix:///path.sock or npipe:////./pipe/<name>. */
23
+ export declare function staticToken(wsUrl: string, token?: string): TokenSource;
24
+ export interface WebSocketDialerOptions {
25
+ environmentId: string;
26
+ executor: ExecutorInfo;
27
+ /** POST {baseUrl}/v1/executors/token with environmentKey, unless tokenSource is set. */
28
+ baseUrl?: string;
29
+ environmentKey?: string;
30
+ tokenSource?: TokenSource;
31
+ /** Overrides the ws_url of the token response. */
32
+ wsUrl?: string;
33
+ protocols?: string[];
34
+ fetch?: typeof fetch;
35
+ }
36
+ export declare function channelUrl(rawUrl: string, target: ChannelTarget): string;
37
+ /** The cloud dialer: token bootstrap, then an outbound WebSocket with the bearer token. */
38
+ export declare function webSocketDialer(options: WebSocketDialerOptions): Dialer;
39
+ /** What a tool handler returns; the client fills in session_id and tool_call_id. */
40
+ export type ToolResult = Omit<ToolResultParams, 'session_id' | 'tool_call_id'>;
41
+ export interface ToolContext {
42
+ /** Aborted by tool.cancel, deadline_ms, or stop(). */
43
+ signal: AbortSignal;
44
+ /** Sends tool.progress for this call (best-effort). */
45
+ progress(message: string): void;
46
+ }
47
+ export type ToolCallHandler = (call: ToolCallParams, context: ToolContext) => Promise<ToolResult>;
48
+ export type SessionAssignHandler = (params: SessionAssignParams) => Promise<SessionAssignResult>;
49
+ export type SessionStopHandler = (params: SessionStopParams) => Promise<SessionStopResult>;
50
+ export type DrainHandler = (params: ExecutorDrainParams) => Promise<ExecutorDrainResult>;
51
+ export type RequestHandler = (params: unknown) => unknown;
52
+ export interface ExecutorClientOptions extends Omit<WebSocketDialerOptions, 'environmentKey' | 'tokenSource'> {
53
+ environmentKey?: string;
54
+ tokenSource?: TokenSource;
55
+ capabilities?: Capabilities;
56
+ /** Replaces the WebSocket dialer, for example listenExecutor().dialer or Harness.inProcessDialer. */
57
+ dialer?: Dialer;
58
+ /** false for a connection that cannot be redialed (an accepted local connection). */
59
+ reconnect?: boolean;
60
+ requestTimeoutMs?: number;
61
+ /** Overrides the interval returned by executor.register. */
62
+ heartbeatIntervalMs?: number;
63
+ heartbeatLoad?: () => ExecutorLoad | undefined;
64
+ maxReconnectAttempts?: number;
65
+ reconnectBaseDelayMs?: number;
66
+ random?: () => number;
67
+ /** Total tool.result attempts including the first; 1 disables retries. */
68
+ toolResultRetryAttempts?: number;
69
+ toolResultRetryBaseDelayMs?: number;
70
+ /**
71
+ * Called when a tool result was not accepted after all retries or the error
72
+ * is not retryable. Persist it and replay it with the same tool_call_id.
73
+ */
74
+ onToolResultLost?: (result: ToolResultParams, error: unknown) => void;
75
+ onLog?: Logger;
76
+ }
77
+ /** An executor client. One client is one logical executor connection to one harness. */
78
+ export declare class ExecutorClient {
79
+ private readonly options;
80
+ private readonly dialer;
81
+ private peer?;
82
+ private currentState;
83
+ private stopped;
84
+ private readonly stopController;
85
+ private registerResult?;
86
+ private currentConnectionId;
87
+ private currentExecutorId;
88
+ private heartbeatIntervalMs;
89
+ private heartbeatTimer?;
90
+ private reconnectAttempts;
91
+ private readonly sessions;
92
+ private readonly completedToolResults;
93
+ private readonly seenToolCalls;
94
+ private readonly running;
95
+ private readonly tools;
96
+ private toolCallHandler?;
97
+ private sessionAssignHandler?;
98
+ private sessionStopHandler?;
99
+ private drainHandler?;
100
+ private readonly requestHandlers;
101
+ private readonly notificationHandlers;
102
+ private registration;
103
+ private agent?;
104
+ constructor(options: ExecutorClientOptions);
105
+ get state(): ConnectionState;
106
+ get executorId(): string;
107
+ get connectionId(): string;
108
+ /** The negotiated protocol of the current connection. */
109
+ get protocol(): string | undefined;
110
+ get activeSessions(): string[];
111
+ /** Registers the handler for every tool without a handleTool handler. */
112
+ onToolCall(handler: ToolCallHandler): void;
113
+ /** Registers the handler for one tool name (bash, read, ..., or a custom name). */
114
+ handleTool(name: string, handler: ToolCallHandler): void;
115
+ onSessionAssign(handler: SessionAssignHandler): void;
116
+ onSessionStop(handler: SessionStopHandler): void;
117
+ onDrain(handler: DrainHandler): void;
118
+ /** Registers a handler for another harness-to-executor request (process.*, terminal.*, skill.install). */
119
+ onRequest(method: string, handler: RequestHandler): void;
120
+ onNotification(method: string, handler: (params: unknown) => void): void;
121
+ /** Advertises the agent capability and serves turn.*, session.close and interaction.response. Call before start. */
122
+ serveAgent(handler: AgentHandler, capability?: Omit<AgentCapability, 'enabled'>): void;
123
+ /** Dials, registers and starts heartbeats. */
124
+ start(): Promise<ExecutorRegisterResult>;
125
+ /** Sends executor.close, closes the channel and stops reconnecting. */
126
+ stop(reason?: string): void;
127
+ /** Sends a request on the control channel. */
128
+ call<T = unknown>(method: string, params: unknown): Promise<T>;
129
+ /** Sends a notification on the control channel. */
130
+ notify(method: string, params: unknown): void;
131
+ /** Reports that the session is prepared; call after workspace and MCP setup. */
132
+ sessionReady(params: SessionReadyParams): Promise<Ack>;
133
+ /** Reports that every process and MCP server of the session stopped. */
134
+ sessionEnded(params: SessionEndedParams): Promise<Ack>;
135
+ /** session.event for a tool executor (v1 shape, without agent fields). */
136
+ sessionEvent(params: SessionEventParams): Promise<SessionEventResult>;
137
+ sessionStatus(params: SessionStatusParams): void;
138
+ toolProgress(params: ToolProgressParams): void;
139
+ /** Replaces the advertised capabilities; they are also sent on every re-register. */
140
+ updateCapabilities(capabilities: Capabilities): void;
141
+ /**
142
+ * Sends tool.result once per tool_call_id, retrying retryable failures with
143
+ * exponential backoff. A repeat for an accepted id resolves without a frame.
144
+ */
145
+ reportToolResult(params: ToolResultParams): Promise<Ack>;
146
+ /** Opens the raw MCP channel for one session.assign mcp_servers entry. */
147
+ openMcpChannel(sessionId: string, serverKey: string): Promise<FrameChannel>;
148
+ private registeredCapabilities;
149
+ private resumeState;
150
+ private connect;
151
+ private disconnected;
152
+ private scheduleReconnect;
153
+ private reconnect;
154
+ private scheduleHeartbeat;
155
+ private heartbeat;
156
+ private dispatchRequest;
157
+ private dispatchNotification;
158
+ private assignSession;
159
+ private stopSession;
160
+ private drain;
161
+ /** Accepts a tool.call at most once per tool_call_id; a resent call is acknowledged and ignored. */
162
+ private acceptToolCall;
163
+ private cancelToolCall;
164
+ private runToolCall;
165
+ private toolResultRetryDelay;
166
+ private random;
167
+ private log;
168
+ private agentHost;
169
+ }
170
+ export declare function retryableToolResultError(error: unknown): boolean;