@hypercli.com/sdk 0.9.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/README.md +629 -0
- package/dist/acp-driver.d.ts +72 -0
- package/dist/acp-driver.d.ts.map +1 -0
- package/dist/acp-driver.js +147 -0
- package/dist/acp-driver.js.map +1 -0
- package/dist/acp-pool.d.ts +70 -0
- package/dist/acp-pool.d.ts.map +1 -0
- package/dist/acp-pool.js +181 -0
- package/dist/acp-pool.js.map +1 -0
- package/dist/acp.d.ts +179 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +487 -0
- package/dist/acp.js.map +1 -0
- package/dist/agent-persona.d.ts +68 -0
- package/dist/agent-persona.d.ts.map +1 -0
- package/dist/agent-persona.js +78 -0
- package/dist/agent-persona.js.map +1 -0
- package/dist/agent-slots.d.ts +18 -0
- package/dist/agent-slots.d.ts.map +1 -0
- package/dist/agent-slots.js +24 -0
- package/dist/agent-slots.js.map +1 -0
- package/dist/agent-urls.d.ts +47 -0
- package/dist/agent-urls.d.ts.map +1 -0
- package/dist/agent-urls.js +178 -0
- package/dist/agent-urls.js.map +1 -0
- package/dist/agent.d.ts +482 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +926 -0
- package/dist/agent.js.map +1 -0
- package/dist/agents.d.ts +1452 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +4022 -0
- package/dist/agents.js.map +1 -0
- package/dist/billing.d.ts +72 -0
- package/dist/billing.d.ts.map +1 -0
- package/dist/billing.js +93 -0
- package/dist/billing.js.map +1 -0
- package/dist/browser-jobs.d.ts +24 -0
- package/dist/browser-jobs.d.ts.map +1 -0
- package/dist/browser-jobs.js +209 -0
- package/dist/browser-jobs.js.map +1 -0
- package/dist/browser.d.ts +41 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +57 -0
- package/dist/browser.js.map +1 -0
- package/dist/buzz-activity.d.ts +169 -0
- package/dist/buzz-activity.d.ts.map +1 -0
- package/dist/buzz-activity.js +844 -0
- package/dist/buzz-activity.js.map +1 -0
- package/dist/channels.d.ts +99 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +27 -0
- package/dist/channels.js.map +1 -0
- package/dist/chat-integrations.d.ts +44 -0
- package/dist/chat-integrations.d.ts.map +1 -0
- package/dist/chat-integrations.js +138 -0
- package/dist/chat-integrations.js.map +1 -0
- package/dist/client.d.ts +88 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +144 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +192 -0
- package/dist/config.js.map +1 -0
- package/dist/connectors.d.ts +80 -0
- package/dist/connectors.d.ts.map +1 -0
- package/dist/connectors.js +2 -0
- package/dist/connectors.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +26 -0
- package/dist/errors.js.map +1 -0
- package/dist/files.d.ts +60 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +128 -0
- package/dist/files.js.map +1 -0
- package/dist/http.d.ts +56 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +362 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/instances.d.ts +94 -0
- package/dist/instances.d.ts.map +1 -0
- package/dist/instances.js +197 -0
- package/dist/instances.js.map +1 -0
- package/dist/integrations.d.ts +111 -0
- package/dist/integrations.d.ts.map +1 -0
- package/dist/integrations.js +206 -0
- package/dist/integrations.js.map +1 -0
- package/dist/job/base.d.ts +86 -0
- package/dist/job/base.d.ts.map +1 -0
- package/dist/job/base.js +206 -0
- package/dist/job/base.js.map +1 -0
- package/dist/job/comfyui.d.ts +259 -0
- package/dist/job/comfyui.d.ts.map +1 -0
- package/dist/job/comfyui.js +1563 -0
- package/dist/job/comfyui.js.map +1 -0
- package/dist/job/gradio.d.ts +48 -0
- package/dist/job/gradio.d.ts.map +1 -0
- package/dist/job/gradio.js +90 -0
- package/dist/job/gradio.js.map +1 -0
- package/dist/job-codecs.d.ts +66 -0
- package/dist/job-codecs.d.ts.map +1 -0
- package/dist/job-codecs.js +132 -0
- package/dist/job-codecs.js.map +1 -0
- package/dist/jobs.d.ts +148 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +480 -0
- package/dist/jobs.js.map +1 -0
- package/dist/keys.d.ts +99 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +145 -0
- package/dist/keys.js.map +1 -0
- package/dist/logs.d.ts +54 -0
- package/dist/logs.d.ts.map +1 -0
- package/dist/logs.js +256 -0
- package/dist/logs.js.map +1 -0
- package/dist/managed-context.d.ts +20 -0
- package/dist/managed-context.d.ts.map +1 -0
- package/dist/managed-context.js +95 -0
- package/dist/managed-context.js.map +1 -0
- package/dist/mcp.d.ts +7 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +8 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +87 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +79 -0
- package/dist/memory.js.map +1 -0
- package/dist/models.d.ts +15 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +19 -0
- package/dist/models.js.map +1 -0
- package/dist/openclaw-control-ui-origin.d.ts +23 -0
- package/dist/openclaw-control-ui-origin.d.ts.map +1 -0
- package/dist/openclaw-control-ui-origin.js +53 -0
- package/dist/openclaw-control-ui-origin.js.map +1 -0
- package/dist/renders.d.ts +187 -0
- package/dist/renders.d.ts.map +1 -0
- package/dist/renders.js +360 -0
- package/dist/renders.js.map +1 -0
- package/dist/routines.d.ts +59 -0
- package/dist/routines.d.ts.map +1 -0
- package/dist/routines.js +135 -0
- package/dist/routines.js.map +1 -0
- package/dist/runners.d.ts +61 -0
- package/dist/runners.d.ts.map +1 -0
- package/dist/runners.js +127 -0
- package/dist/runners.js.map +1 -0
- package/dist/sessions.d.ts +280 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +292 -0
- package/dist/sessions.js.map +1 -0
- package/dist/skills.d.ts +170 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +2 -0
- package/dist/skills.js.map +1 -0
- package/dist/user.d.ts +78 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +143 -0
- package/dist/user.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/voice-session.d.ts +66 -0
- package/dist/voice-session.d.ts.map +1 -0
- package/dist/voice-session.js +366 -0
- package/dist/voice-session.js.map +1 -0
- package/dist/voice-transcription-session.d.ts +64 -0
- package/dist/voice-transcription-session.d.ts.map +1 -0
- package/dist/voice-transcription-session.js +228 -0
- package/dist/voice-transcription-session.js.map +1 -0
- package/dist/voice.d.ts +62 -0
- package/dist/voice.d.ts.map +1 -0
- package/dist/voice.js +134 -0
- package/dist/voice.js.map +1 -0
- package/dist/workspace-tomd.d.ts +61 -0
- package/dist/workspace-tomd.d.ts.map +1 -0
- package/dist/workspace-tomd.js +177 -0
- package/dist/workspace-tomd.js.map +1 -0
- package/dist/workspaces.d.ts +255 -0
- package/dist/workspaces.d.ts.map +1 -0
- package/dist/workspaces.js +653 -0
- package/dist/workspaces.js.map +1 -0
- package/package.json +115 -0
- package/runtime/config-require.browser.js +4 -0
- package/runtime/config-require.d.ts +2 -0
- package/runtime/config-require.node.js +8 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serializes original messages through CodingAgentAcpClient.prompt(), which
|
|
3
|
+
* waits for the native v1 terminal response. Commit precedes settlement.
|
|
4
|
+
* Cancelled completion pauses queued input until a new explicit submission;
|
|
5
|
+
* uncertain delivery or commit failure fences this driver without resending.
|
|
6
|
+
*/
|
|
7
|
+
import { type CodingAgentAcpClient, type ContentBlock } from './acp.js';
|
|
8
|
+
import type { AcpLease } from './acp-pool.js';
|
|
9
|
+
export type AcpTurnDriverState = 'idle' | 'submitted' | 'running';
|
|
10
|
+
/** Settlement of one turn covering a submitted message. */
|
|
11
|
+
export interface AcpTurnOutcome {
|
|
12
|
+
stopReason: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface AcpTurnBundle {
|
|
15
|
+
sessionId: string;
|
|
16
|
+
/** Text blocks from the single queued submission, in order. */
|
|
17
|
+
messages: string[];
|
|
18
|
+
/** The exact content blocks sent in `session/prompt`, including non-text content. */
|
|
19
|
+
blocks: ContentBlock[];
|
|
20
|
+
}
|
|
21
|
+
export interface AcpTurnDriverOptions {
|
|
22
|
+
sessionId: string;
|
|
23
|
+
/**
|
|
24
|
+
* Durable-commit hook run when the client's completion helper resolves.
|
|
25
|
+
* Window advance, submit-promise resolution, and the next bundle's flush
|
|
26
|
+
* all happen only after this resolves. Receives the stopReason verbatim
|
|
27
|
+
* (`end_turn`, `cancelled`, ...); cancelled turns commit normally — their
|
|
28
|
+
* bundled messages reached the model.
|
|
29
|
+
*/
|
|
30
|
+
commit: (stopReason: string | null) => Promise<void>;
|
|
31
|
+
/** Fired once per flush with the bundle going on the wire. */
|
|
32
|
+
onBundleOpen?: (bundle: AcpTurnBundle) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Prompt observation and commit failures fence this driver and reject all
|
|
35
|
+
* pending submissions. The window is retained; later submissions reject
|
|
36
|
+
* with the same failure without resending input.
|
|
37
|
+
*/
|
|
38
|
+
onError?: (error: Error) => void;
|
|
39
|
+
}
|
|
40
|
+
export declare class AcpTurnDriver {
|
|
41
|
+
private readonly client;
|
|
42
|
+
private readonly leaseRelease;
|
|
43
|
+
private readonly options;
|
|
44
|
+
private readonly window;
|
|
45
|
+
private state;
|
|
46
|
+
private inFlight;
|
|
47
|
+
private closed;
|
|
48
|
+
private failure;
|
|
49
|
+
constructor(source: CodingAgentAcpClient | AcpLease, options: AcpTurnDriverOptions);
|
|
50
|
+
get sessionId(): string;
|
|
51
|
+
/** `idle | submitted | running` — the per-leg turn state machine. */
|
|
52
|
+
get turnState(): AcpTurnDriverState;
|
|
53
|
+
/** Messages waiting in the pending window, including the in-flight bundle. */
|
|
54
|
+
get pendingCount(): number;
|
|
55
|
+
/** Queue one original message; a new explicit submission resumes paused input. */
|
|
56
|
+
submit(content: string | ContentBlock[]): Promise<AcpTurnOutcome>;
|
|
57
|
+
/**
|
|
58
|
+
* Stop consuming settlement and release the pool lease when this
|
|
59
|
+
* driver was built from one. A client passed directly is NOT closed.
|
|
60
|
+
* Outstanding `submit()` promises reject; an in-flight turn keeps running
|
|
61
|
+
* pod-side but its response is no longer consumed here (mirrors the py-sdk
|
|
62
|
+
* driver's close dropping its prompt waiter).
|
|
63
|
+
*/
|
|
64
|
+
close(): void;
|
|
65
|
+
private flush;
|
|
66
|
+
/** The correlated native prompt result settles the owned turn. */
|
|
67
|
+
private onPromptResponse;
|
|
68
|
+
private onPromptFailed;
|
|
69
|
+
private completeTurn;
|
|
70
|
+
private emitError;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=acp-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-driver.d.ts","sourceRoot":"","sources":["../src/acp-driver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,YAAY,EAClB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;AAElE,2DAA2D;AAC3D,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,qFAAqF;IACrF,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,8DAA8D;IAC9D,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/C;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AA8BD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAsB;gBAEzB,MAAM,EAAE,oBAAoB,GAAG,QAAQ,EAAE,OAAO,EAAE,oBAAoB;IAalF,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,qEAAqE;IACrE,IAAI,SAAS,IAAI,kBAAkB,CAElC;IAED,8EAA8E;IAC9E,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,kFAAkF;IAClF,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAUjE;;;;;;OAMG;IACH,KAAK,IAAI,IAAI;IAYb,OAAO,CAAC,KAAK;IAuBb,kEAAkE;IAClE,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,cAAc;YAUR,YAAY;IAiB1B,OAAO,CAAC,SAAS;CAOlB"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
function newTurnWaiter() {
|
|
2
|
+
let resolve;
|
|
3
|
+
let reject;
|
|
4
|
+
const promise = new Promise((res, rej) => {
|
|
5
|
+
resolve = res;
|
|
6
|
+
reject = rej;
|
|
7
|
+
});
|
|
8
|
+
// The promise is optional for callers; never let an ignored rejection trip
|
|
9
|
+
// the runtime's unhandled-rejection guard.
|
|
10
|
+
void promise.catch(() => { });
|
|
11
|
+
return { promise, resolve, reject };
|
|
12
|
+
}
|
|
13
|
+
function toError(error) {
|
|
14
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
15
|
+
}
|
|
16
|
+
export class AcpTurnDriver {
|
|
17
|
+
client;
|
|
18
|
+
leaseRelease = null;
|
|
19
|
+
options;
|
|
20
|
+
window = [];
|
|
21
|
+
state = 'idle';
|
|
22
|
+
inFlight = null;
|
|
23
|
+
closed = false;
|
|
24
|
+
failure = null;
|
|
25
|
+
constructor(source, options) {
|
|
26
|
+
// Duck-typed: an AcpLease carries `client` + `release`, the bare client
|
|
27
|
+
// does not. (Structural fakes therefore take the bare-client branch.)
|
|
28
|
+
if (typeof source.release === 'function' && source.client !== undefined) {
|
|
29
|
+
const lease = source;
|
|
30
|
+
this.client = lease.client;
|
|
31
|
+
this.leaseRelease = lease.release;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this.client = source;
|
|
35
|
+
}
|
|
36
|
+
this.options = options;
|
|
37
|
+
}
|
|
38
|
+
get sessionId() {
|
|
39
|
+
return this.options.sessionId;
|
|
40
|
+
}
|
|
41
|
+
/** `idle | submitted | running` — the per-leg turn state machine. */
|
|
42
|
+
get turnState() {
|
|
43
|
+
return this.state;
|
|
44
|
+
}
|
|
45
|
+
/** Messages waiting in the pending window, including the in-flight bundle. */
|
|
46
|
+
get pendingCount() {
|
|
47
|
+
return this.window.length;
|
|
48
|
+
}
|
|
49
|
+
/** Queue one original message; a new explicit submission resumes paused input. */
|
|
50
|
+
submit(content) {
|
|
51
|
+
if (this.closed)
|
|
52
|
+
return Promise.reject(new Error('AcpTurnDriver is closed'));
|
|
53
|
+
if (this.failure)
|
|
54
|
+
return Promise.reject(this.failure);
|
|
55
|
+
const blocks = typeof content === 'string' ? [{ type: 'text', text: content }] : content;
|
|
56
|
+
const waiter = newTurnWaiter();
|
|
57
|
+
this.window.push({ blocks: structuredClone(blocks), waiter });
|
|
58
|
+
this.flush();
|
|
59
|
+
return waiter.promise;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Stop consuming settlement and release the pool lease when this
|
|
63
|
+
* driver was built from one. A client passed directly is NOT closed.
|
|
64
|
+
* Outstanding `submit()` promises reject; an in-flight turn keeps running
|
|
65
|
+
* pod-side but its response is no longer consumed here (mirrors the py-sdk
|
|
66
|
+
* driver's close dropping its prompt waiter).
|
|
67
|
+
*/
|
|
68
|
+
close() {
|
|
69
|
+
if (this.closed)
|
|
70
|
+
return;
|
|
71
|
+
this.closed = true;
|
|
72
|
+
// Every in-flight bundle entry is still in the window (entries leave only
|
|
73
|
+
// on commit), so rejecting the whole window settles every live waiter.
|
|
74
|
+
const error = new Error('AcpTurnDriver is closed');
|
|
75
|
+
for (const entry of this.window)
|
|
76
|
+
entry.waiter.reject(error);
|
|
77
|
+
this.inFlight = null;
|
|
78
|
+
this.state = 'idle';
|
|
79
|
+
this.leaseRelease?.();
|
|
80
|
+
}
|
|
81
|
+
flush() {
|
|
82
|
+
if (this.closed || this.state !== 'idle' || this.window.length === 0 || this.inFlight !== null)
|
|
83
|
+
return;
|
|
84
|
+
const flight = this.window[0];
|
|
85
|
+
const blocks = structuredClone(flight.blocks);
|
|
86
|
+
const texts = blocks.filter((block) => block.type === 'text').map((block) => block.text);
|
|
87
|
+
this.state = 'submitted';
|
|
88
|
+
this.inFlight = flight;
|
|
89
|
+
const bundle = {
|
|
90
|
+
sessionId: this.options.sessionId,
|
|
91
|
+
messages: texts,
|
|
92
|
+
blocks,
|
|
93
|
+
};
|
|
94
|
+
try {
|
|
95
|
+
this.options.onBundleOpen?.(bundle);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error('AcpTurnDriver onBundleOpen listener threw', error);
|
|
99
|
+
}
|
|
100
|
+
this.client.prompt(this.options.sessionId, blocks).then((response) => this.onPromptResponse(flight, response), (error) => this.onPromptFailed(flight, error));
|
|
101
|
+
}
|
|
102
|
+
/** The correlated native prompt result settles the owned turn. */
|
|
103
|
+
onPromptResponse(flight, response) {
|
|
104
|
+
if (this.closed || this.inFlight !== flight)
|
|
105
|
+
return;
|
|
106
|
+
void this.completeTurn(flight, response.stopReason ?? null);
|
|
107
|
+
}
|
|
108
|
+
onPromptFailed(flight, error) {
|
|
109
|
+
if (this.closed || this.inFlight !== flight)
|
|
110
|
+
return;
|
|
111
|
+
// Delivery is uncertain. Retain the flight as a fence until the caller
|
|
112
|
+
// reconciles/closes this driver; later submissions must not resend it.
|
|
113
|
+
const failure = toError(error);
|
|
114
|
+
this.failure = failure;
|
|
115
|
+
for (const entry of this.window)
|
|
116
|
+
entry.waiter.reject(failure);
|
|
117
|
+
this.emitError(failure);
|
|
118
|
+
}
|
|
119
|
+
async completeTurn(flight, stopReason) {
|
|
120
|
+
try {
|
|
121
|
+
await this.options.commit(stopReason);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
// The runtime completed but persistence failed. Never resend its input.
|
|
125
|
+
this.onPromptFailed(flight, error);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (this.closed || this.inFlight !== flight)
|
|
129
|
+
return;
|
|
130
|
+
this.inFlight = null;
|
|
131
|
+
this.state = 'idle';
|
|
132
|
+
this.window.splice(0, 1);
|
|
133
|
+
const outcome = { stopReason };
|
|
134
|
+
flight.waiter.resolve(outcome);
|
|
135
|
+
if (stopReason !== 'cancelled')
|
|
136
|
+
this.flush();
|
|
137
|
+
}
|
|
138
|
+
emitError(error) {
|
|
139
|
+
try {
|
|
140
|
+
this.options.onError?.(error);
|
|
141
|
+
}
|
|
142
|
+
catch (listenerError) {
|
|
143
|
+
console.error('AcpTurnDriver onError listener threw', listenerError);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=acp-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-driver.js","sourceRoot":"","sources":["../src/acp-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyed connection pool for {@link CodingAgentAcpClient}.
|
|
3
|
+
*
|
|
4
|
+
* Callers choose keys for connections they want to share (for example, an
|
|
5
|
+
* agent ID or an agent/session pair). The pool hands out refcounted leases
|
|
6
|
+
* on a single connected client per key: concurrent `acquire()` calls dedupe onto one
|
|
7
|
+
* in-flight connect, the last `release()` closes the client, and a terminal
|
|
8
|
+
* self-close makes the pool forget the entry so the next `acquire()` dials
|
|
9
|
+
* fresh. Update fan-out across subscribers is handled by
|
|
10
|
+
* `client.addUpdateListener(...)`.
|
|
11
|
+
*
|
|
12
|
+
* Protocol-version awareness: negotiation happens per connection — every key
|
|
13
|
+
* negotiates independently — and the negotiated version is read off the
|
|
14
|
+
* lease's client (`lease.client.negotiatedProtocolVersion`; the client only
|
|
15
|
+
* speaks v1). Pool bookkeeping itself (refcounts, close discipline) is
|
|
16
|
+
* version-agnostic.
|
|
17
|
+
*/
|
|
18
|
+
import { CodingAgentAcpClient, type CodingAgentAcpConnectOptions } from './acp.js';
|
|
19
|
+
/** A live hold on a pooled connection. `release()` is idempotent per lease. */
|
|
20
|
+
export interface AcpLease {
|
|
21
|
+
client: CodingAgentAcpClient;
|
|
22
|
+
release(): void;
|
|
23
|
+
}
|
|
24
|
+
export declare class CodingAgentAcpPool {
|
|
25
|
+
private readonly connect;
|
|
26
|
+
private readonly connectOptions?;
|
|
27
|
+
private readonly entries;
|
|
28
|
+
constructor(options: {
|
|
29
|
+
/**
|
|
30
|
+
* Dial one connection for the key. Forward the optional second argument
|
|
31
|
+
* into the dial: its signal cancels pending initialization on pool teardown.
|
|
32
|
+
* Legacy factories that ignore it still have their acquisitions rejected
|
|
33
|
+
* and late clients closed, but must forward it to abort a pending socket.
|
|
34
|
+
*/
|
|
35
|
+
connect: (key: string, options?: CodingAgentAcpConnectOptions) => Promise<CodingAgentAcpClient>;
|
|
36
|
+
/** Per-key connect options; the pool chains its close bookkeeping into `onClose`. */
|
|
37
|
+
connectOptions?: (key: string) => CodingAgentAcpConnectOptions;
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* Take a lease on the connection for `key`, dialing on first use. All
|
|
41
|
+
* concurrent acquirers share one in-flight connect; each gets its own
|
|
42
|
+
* lease. A terminal client close may redial; explicit pool teardown rejects
|
|
43
|
+
* affected acquisitions instead of silently creating another connection.
|
|
44
|
+
*/
|
|
45
|
+
acquire(key: string): Promise<AcpLease>;
|
|
46
|
+
/** Live refcounts: per-key when `key` is given, pooled connections otherwise. */
|
|
47
|
+
size(key?: string): number;
|
|
48
|
+
/** Force-close the connection for `key` even with live leases and forget it. */
|
|
49
|
+
drop(key: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* Force-close every connection whose key starts with `prefix` and forget
|
|
52
|
+
* them. Pair with key builders that namespace sub-connections under a
|
|
53
|
+
* parent id (e.g. `agentId` / `agentId#sessionId`) so tearing down the
|
|
54
|
+
* parent reaps the pinned children too.
|
|
55
|
+
*/
|
|
56
|
+
dropPrefix(prefix: string): void;
|
|
57
|
+
/** Drop every pooled connection. */
|
|
58
|
+
close(): void;
|
|
59
|
+
private dial;
|
|
60
|
+
/**
|
|
61
|
+
* `terminate()` runs through `this.close()`, so shadowing it observes every
|
|
62
|
+
* close path — explicit, abort-driven, or a terminal bridge close code —
|
|
63
|
+
* without depending on the consumer threading connectOptions through.
|
|
64
|
+
*/
|
|
65
|
+
private wrapClose;
|
|
66
|
+
private handleClientClosed;
|
|
67
|
+
private releaseEntry;
|
|
68
|
+
private forget;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=acp-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-pool.d.ts","sourceRoot":"","sources":["../src/acp-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,oBAAoB,EAEpB,KAAK,4BAA4B,EAClC,MAAM,UAAU,CAAC;AAElB,+EAA+E;AAC/E,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,IAAI,IAAI,CAAC;CACjB;AAYD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGW;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAgD;IAChF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;gBAE5C,OAAO,EAAE;QACnB;;;;;WAKG;QACH,OAAO,EAAE,CACP,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,4BAA4B,KACnC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACnC,qFAAqF;QACrF,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,4BAA4B,CAAC;KAChE;IAKD;;;;;OAKG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA+B7C,iFAAiF;IACjF,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM;IAK1B,gFAAgF;IAChF,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAUvB;;;;;OAKG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMhC,oCAAoC;IACpC,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,IAAI;IA2CZ;;;;OAIG;IACH,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,MAAM;CAMf"}
|
package/dist/acp-pool.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyed connection pool for {@link CodingAgentAcpClient}.
|
|
3
|
+
*
|
|
4
|
+
* Callers choose keys for connections they want to share (for example, an
|
|
5
|
+
* agent ID or an agent/session pair). The pool hands out refcounted leases
|
|
6
|
+
* on a single connected client per key: concurrent `acquire()` calls dedupe onto one
|
|
7
|
+
* in-flight connect, the last `release()` closes the client, and a terminal
|
|
8
|
+
* self-close makes the pool forget the entry so the next `acquire()` dials
|
|
9
|
+
* fresh. Update fan-out across subscribers is handled by
|
|
10
|
+
* `client.addUpdateListener(...)`.
|
|
11
|
+
*
|
|
12
|
+
* Protocol-version awareness: negotiation happens per connection — every key
|
|
13
|
+
* negotiates independently — and the negotiated version is read off the
|
|
14
|
+
* lease's client (`lease.client.negotiatedProtocolVersion`; the client only
|
|
15
|
+
* speaks v1). Pool bookkeeping itself (refcounts, close discipline) is
|
|
16
|
+
* version-agnostic.
|
|
17
|
+
*/
|
|
18
|
+
import { CodingAgentAcpConnectionError, } from './acp.js';
|
|
19
|
+
export class CodingAgentAcpPool {
|
|
20
|
+
connect;
|
|
21
|
+
connectOptions;
|
|
22
|
+
entries = new Map();
|
|
23
|
+
constructor(options) {
|
|
24
|
+
this.connect = options.connect;
|
|
25
|
+
this.connectOptions = options.connectOptions;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Take a lease on the connection for `key`, dialing on first use. All
|
|
29
|
+
* concurrent acquirers share one in-flight connect; each gets its own
|
|
30
|
+
* lease. A terminal client close may redial; explicit pool teardown rejects
|
|
31
|
+
* affected acquisitions instead of silently creating another connection.
|
|
32
|
+
*/
|
|
33
|
+
async acquire(key) {
|
|
34
|
+
for (;;) {
|
|
35
|
+
let entry = this.entries.get(key);
|
|
36
|
+
if (entry && (entry.forgotten || entry.client?.closed === true)) {
|
|
37
|
+
this.forget(key, entry);
|
|
38
|
+
entry = undefined;
|
|
39
|
+
}
|
|
40
|
+
if (!entry) {
|
|
41
|
+
entry = this.dial(key);
|
|
42
|
+
this.entries.set(key, entry);
|
|
43
|
+
}
|
|
44
|
+
entry.refs += 1;
|
|
45
|
+
const client = await entry.promise;
|
|
46
|
+
if (entry.controller.signal.aborted)
|
|
47
|
+
throw entry.controller.signal.reason;
|
|
48
|
+
if (entry.forgotten || client.closed) {
|
|
49
|
+
entry.refs -= 1;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const current = entry;
|
|
53
|
+
let released = false;
|
|
54
|
+
return {
|
|
55
|
+
client,
|
|
56
|
+
release: () => {
|
|
57
|
+
if (released)
|
|
58
|
+
return;
|
|
59
|
+
released = true;
|
|
60
|
+
this.releaseEntry(key, current);
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Live refcounts: per-key when `key` is given, pooled connections otherwise. */
|
|
66
|
+
size(key) {
|
|
67
|
+
if (key !== undefined)
|
|
68
|
+
return this.entries.get(key)?.refs ?? 0;
|
|
69
|
+
return this.entries.size;
|
|
70
|
+
}
|
|
71
|
+
/** Force-close the connection for `key` even with live leases and forget it. */
|
|
72
|
+
drop(key) {
|
|
73
|
+
const entry = this.entries.get(key);
|
|
74
|
+
if (!entry)
|
|
75
|
+
return;
|
|
76
|
+
this.entries.delete(key);
|
|
77
|
+
entry.forgotten = true;
|
|
78
|
+
entry.controller.abort(new CodingAgentAcpConnectionError('ACP pool entry dropped'));
|
|
79
|
+
entry.dispose();
|
|
80
|
+
entry.client?.close();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Force-close every connection whose key starts with `prefix` and forget
|
|
84
|
+
* them. Pair with key builders that namespace sub-connections under a
|
|
85
|
+
* parent id (e.g. `agentId` / `agentId#sessionId`) so tearing down the
|
|
86
|
+
* parent reaps the pinned children too.
|
|
87
|
+
*/
|
|
88
|
+
dropPrefix(prefix) {
|
|
89
|
+
for (const key of [...this.entries.keys()]) {
|
|
90
|
+
if (key.startsWith(prefix))
|
|
91
|
+
this.drop(key);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** Drop every pooled connection. */
|
|
95
|
+
close() {
|
|
96
|
+
for (const key of [...this.entries.keys()])
|
|
97
|
+
this.drop(key);
|
|
98
|
+
}
|
|
99
|
+
dial(key) {
|
|
100
|
+
const entry = {
|
|
101
|
+
refs: 0,
|
|
102
|
+
client: null,
|
|
103
|
+
forgotten: false,
|
|
104
|
+
promise: null,
|
|
105
|
+
controller: new AbortController(),
|
|
106
|
+
dispose: () => { },
|
|
107
|
+
};
|
|
108
|
+
const base = this.connectOptions?.(key);
|
|
109
|
+
const signal = entry.controller.signal;
|
|
110
|
+
const cancelled = new Promise((_resolve, reject) => {
|
|
111
|
+
signal.addEventListener('abort', () => reject(signal.reason), { once: true });
|
|
112
|
+
});
|
|
113
|
+
const abort = () => entry.controller.abort(new CodingAgentAcpConnectionError('ACP pool connect aborted'));
|
|
114
|
+
base?.signal?.addEventListener('abort', abort, { once: true });
|
|
115
|
+
entry.dispose = () => base?.signal?.removeEventListener('abort', abort);
|
|
116
|
+
if (base?.signal?.aborted)
|
|
117
|
+
abort();
|
|
118
|
+
const options = {
|
|
119
|
+
...base,
|
|
120
|
+
signal,
|
|
121
|
+
onClose: (event) => {
|
|
122
|
+
this.handleClientClosed(key, entry);
|
|
123
|
+
base?.onClose?.(event);
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
const connecting = Promise.resolve().then(() => {
|
|
127
|
+
if (signal.aborted)
|
|
128
|
+
throw signal.reason;
|
|
129
|
+
return this.connect(key, options);
|
|
130
|
+
}).then((client) => {
|
|
131
|
+
entry.client = client;
|
|
132
|
+
this.wrapClose(key, entry, client);
|
|
133
|
+
if (entry.forgotten || signal.aborted || client.closed)
|
|
134
|
+
client.close();
|
|
135
|
+
return client;
|
|
136
|
+
});
|
|
137
|
+
entry.promise = Promise.race([connecting, cancelled]).catch((error) => {
|
|
138
|
+
entry.dispose();
|
|
139
|
+
this.forget(key, entry);
|
|
140
|
+
throw error;
|
|
141
|
+
});
|
|
142
|
+
return entry;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* `terminate()` runs through `this.close()`, so shadowing it observes every
|
|
146
|
+
* close path — explicit, abort-driven, or a terminal bridge close code —
|
|
147
|
+
* without depending on the consumer threading connectOptions through.
|
|
148
|
+
*/
|
|
149
|
+
wrapClose(key, entry, client) {
|
|
150
|
+
const original = client.close.bind(client);
|
|
151
|
+
client.close = () => {
|
|
152
|
+
const wasClosed = client.closed;
|
|
153
|
+
original();
|
|
154
|
+
if (!wasClosed)
|
|
155
|
+
this.handleClientClosed(key, entry);
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
handleClientClosed(key, entry) {
|
|
159
|
+
if (this.entries.get(key) !== entry)
|
|
160
|
+
return;
|
|
161
|
+
if (entry.client?.closed !== true)
|
|
162
|
+
return;
|
|
163
|
+
this.forget(key, entry);
|
|
164
|
+
}
|
|
165
|
+
releaseEntry(key, entry) {
|
|
166
|
+
if (entry.forgotten)
|
|
167
|
+
return;
|
|
168
|
+
entry.refs -= 1;
|
|
169
|
+
if (entry.refs > 0)
|
|
170
|
+
return;
|
|
171
|
+
this.drop(key);
|
|
172
|
+
}
|
|
173
|
+
forget(key, entry) {
|
|
174
|
+
if (this.entries.get(key) !== entry)
|
|
175
|
+
return;
|
|
176
|
+
this.entries.delete(key);
|
|
177
|
+
entry.forgotten = true;
|
|
178
|
+
entry.dispose();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=acp-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-pool.js","sourceRoot":"","sources":["../src/acp-pool.ts"],"names":[],"mappings":"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"}
|