use-acp 0.1.0 → 0.1.2
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/client/acp-client.d.ts +8 -6
- package/dist/client/acp-client.d.ts.map +1 -1
- package/dist/client/acp-client.js +18 -9
- package/dist/client/acp-client.js.map +1 -1
- package/dist/connection/websocket-manager.d.ts +24 -0
- package/dist/connection/websocket-manager.d.ts.map +1 -1
- package/dist/connection/websocket-manager.js +70 -0
- package/dist/connection/websocket-manager.js.map +1 -1
- package/dist/hooks/use-acp-client.d.ts +11 -3
- package/dist/hooks/use-acp-client.d.ts.map +1 -1
- package/dist/hooks/use-acp-client.js +85 -66
- package/dist/hooks/use-acp-client.js.map +1 -1
- package/dist/state/atoms.d.ts +15 -5
- package/dist/state/atoms.d.ts.map +1 -1
- package/dist/state/atoms.js +70 -3
- package/dist/state/atoms.js.map +1 -1
- package/dist/state/types.d.ts +13 -1
- package/dist/state/types.d.ts.map +1 -1
- package/dist/state/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { Agent, AuthenticateRequest, CancelNotification, Client, InitializeRequest, InitializeResponse, NewSessionRequest, NewSessionResponse, PromptRequest, PromptResponse, ReadTextFileRequest, ReadTextFileResponse, RequestPermissionRequest, RequestPermissionResponse, SessionNotification, WriteTextFileRequest, WriteTextFileResponse } from "@zed-industries/agent-client-protocol";
|
|
1
|
+
import type { Agent, AuthenticateRequest, CancelNotification, Client, InitializeRequest, InitializeResponse, LoadSessionRequest, NewSessionRequest, NewSessionResponse, PromptRequest, PromptResponse, ReadTextFileRequest, ReadTextFileResponse, RequestPermissionRequest, RequestPermissionResponse, SessionNotification, WriteTextFileRequest, WriteTextFileResponse } from "@zed-industries/agent-client-protocol";
|
|
2
2
|
export interface AcpClientOptions {
|
|
3
3
|
onRequestPermission: (params: IdentifiedPermissionRequest) => void;
|
|
4
4
|
onSessionNotification: (params: SessionNotification) => void;
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
readTextFile?: (params: ReadTextFileRequest) => Promise<ReadTextFileResponse>;
|
|
6
|
+
writeTextFile?: (params: WriteTextFileRequest) => Promise<WriteTextFileResponse>;
|
|
7
7
|
}
|
|
8
8
|
export interface IdentifiedPermissionRequest extends RequestPermissionRequest {
|
|
9
9
|
id: string;
|
|
@@ -21,17 +21,19 @@ export declare class AcpClient implements Client {
|
|
|
21
21
|
resolvePermission(permissionId: PermissionRequestId, response: RequestPermissionResponse): void;
|
|
22
22
|
rejectPermission(permissionId: PermissionRequestId, error: Error): void;
|
|
23
23
|
}
|
|
24
|
+
type RequiredAgent = Required<Agent>;
|
|
24
25
|
type ListeningAgentCallbacks = {
|
|
25
|
-
[K in keyof
|
|
26
|
+
[K in keyof RequiredAgent as `on_${string & K}_response`]: RequiredAgent[K] extends (...args: any[]) => infer R ? (response: Awaited<R>, request: Parameters<RequiredAgent[K]>[0]) => void : never;
|
|
26
27
|
} & {
|
|
27
|
-
[K in keyof
|
|
28
|
-
};
|
|
28
|
+
[K in keyof RequiredAgent as `on_${string & K}_start`]: RequiredAgent[K] extends (...args: any[]) => unknown ? (request: Parameters<RequiredAgent[K]>[0]) => void : never;
|
|
29
|
+
} & {};
|
|
29
30
|
export declare class ListeningAgent implements Agent {
|
|
30
31
|
private readonly agent;
|
|
31
32
|
private readonly callbacks;
|
|
32
33
|
constructor(agent: Agent, callbacks: Partial<ListeningAgentCallbacks>);
|
|
33
34
|
initialize(params: InitializeRequest): Promise<InitializeResponse>;
|
|
34
35
|
newSession(params: NewSessionRequest): Promise<NewSessionResponse>;
|
|
36
|
+
loadSession(params: LoadSessionRequest): Promise<void>;
|
|
35
37
|
authenticate(params: AuthenticateRequest): Promise<void>;
|
|
36
38
|
prompt(params: PromptRequest): Promise<PromptResponse>;
|
|
37
39
|
cancel(params: CancelNotification): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acp-client.d.ts","sourceRoot":"","sources":["../../src/client/acp-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,mBAAmB,EACnB,kBAAkB,EAClB,MAAM,EACN,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,uCAAuC,CAAC;AAG/C,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE,CAAC,MAAM,EAAE,2BAA2B,KAAK,IAAI,CAAC;IACnE,qBAAqB,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC7D,
|
|
1
|
+
{"version":3,"file":"acp-client.d.ts","sourceRoot":"","sources":["../../src/client/acp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,14 +11,14 @@ export class AcpClient {
|
|
|
11
11
|
this.options.onSessionNotification(params);
|
|
12
12
|
}
|
|
13
13
|
async writeTextFile(params) {
|
|
14
|
-
if (this.options.
|
|
15
|
-
return this.options.
|
|
14
|
+
if (this.options.writeTextFile) {
|
|
15
|
+
return this.options.writeTextFile(params);
|
|
16
16
|
}
|
|
17
17
|
throw new Error("Write text file handler not implemented");
|
|
18
18
|
}
|
|
19
19
|
async readTextFile(params) {
|
|
20
|
-
if (this.options.
|
|
21
|
-
return this.options.
|
|
20
|
+
if (this.options.readTextFile) {
|
|
21
|
+
return this.options.readTextFile(params);
|
|
22
22
|
}
|
|
23
23
|
throw new Error("Read text file handler not implemented");
|
|
24
24
|
}
|
|
@@ -54,34 +54,43 @@ export class ListeningAgent {
|
|
|
54
54
|
async initialize(params) {
|
|
55
55
|
this.callbacks.on_initialize_start?.(params);
|
|
56
56
|
return this.agent.initialize(params).then((response) => {
|
|
57
|
-
this.callbacks.on_initialize_response?.(response);
|
|
57
|
+
this.callbacks.on_initialize_response?.(response, params);
|
|
58
58
|
return response;
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
61
|
async newSession(params) {
|
|
62
62
|
this.callbacks.on_newSession_start?.(params);
|
|
63
63
|
return this.agent.newSession(params).then((response) => {
|
|
64
|
-
this.callbacks.on_newSession_response?.(response);
|
|
64
|
+
this.callbacks.on_newSession_response?.(response, params);
|
|
65
65
|
return response;
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
+
async loadSession(params) {
|
|
69
|
+
this.callbacks.on_loadSession_start?.(params);
|
|
70
|
+
if (this.agent.loadSession) {
|
|
71
|
+
return this.agent.loadSession(params).then(() => {
|
|
72
|
+
this.callbacks.on_loadSession_response?.(undefined, params);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
throw new Error("Agent does not support loadSession capability");
|
|
76
|
+
}
|
|
68
77
|
async authenticate(params) {
|
|
69
78
|
this.callbacks.on_authenticate_start?.(params);
|
|
70
79
|
return this.agent.authenticate(params).then(() => {
|
|
71
|
-
this.callbacks.on_authenticate_response?.(undefined);
|
|
80
|
+
this.callbacks.on_authenticate_response?.(undefined, params);
|
|
72
81
|
});
|
|
73
82
|
}
|
|
74
83
|
async prompt(params) {
|
|
75
84
|
this.callbacks.on_prompt_start?.(params);
|
|
76
85
|
return this.agent.prompt(params).then((response) => {
|
|
77
|
-
this.callbacks.on_prompt_response?.(response);
|
|
86
|
+
this.callbacks.on_prompt_response?.(response, params);
|
|
78
87
|
return response;
|
|
79
88
|
});
|
|
80
89
|
}
|
|
81
90
|
async cancel(params) {
|
|
82
91
|
this.callbacks.on_cancel_start?.(params);
|
|
83
92
|
return this.agent.cancel(params).then(() => {
|
|
84
|
-
this.callbacks.on_cancel_response?.(undefined);
|
|
93
|
+
this.callbacks.on_cancel_response?.(undefined, params);
|
|
85
94
|
});
|
|
86
95
|
}
|
|
87
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acp-client.js","sourceRoot":"","sources":["../../src/client/acp-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"acp-client.js","sourceRoot":"","sources":["../../src/client/acp-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Agent,\n AuthenticateRequest,\n CancelNotification,\n Client,\n InitializeRequest,\n InitializeResponse,\n LoadSessionRequest,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@zed-industries/agent-client-protocol\";\nimport { Deferred } from \"../utils/deferred.js\";\n\nexport interface AcpClientOptions {\n onRequestPermission: (params: IdentifiedPermissionRequest) => void;\n onSessionNotification: (params: SessionNotification) => void;\n readTextFile?: (params: ReadTextFileRequest) => Promise<ReadTextFileResponse>;\n writeTextFile?: (params: WriteTextFileRequest) => Promise<WriteTextFileResponse>;\n}\n\nexport interface IdentifiedPermissionRequest extends RequestPermissionRequest {\n id: string;\n}\n\nexport type PermissionRequestId = IdentifiedPermissionRequest[\"id\"];\n\nexport class AcpClient implements Client {\n public agent: Agent;\n private readonly options: AcpClientOptions;\n private readonly pendingPermissions = new Map<\n PermissionRequestId,\n Deferred<RequestPermissionResponse>\n >();\n\n constructor(agent: Agent, options: AcpClientOptions) {\n this.agent = agent;\n this.options = options;\n }\n\n async sessionUpdate(params: SessionNotification): Promise<void> {\n this.options.onSessionNotification(params);\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n if (this.options.writeTextFile) {\n return this.options.writeTextFile(params);\n }\n throw new Error(\"Write text file handler not implemented\");\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n if (this.options.readTextFile) {\n return this.options.readTextFile(params);\n }\n throw new Error(\"Read text file handler not implemented\");\n }\n\n async requestPermission(params: RequestPermissionRequest): Promise<RequestPermissionResponse> {\n const permissionId: PermissionRequestId = `${Date.now()}-${Math.random()}`;\n const deferred = new Deferred<RequestPermissionResponse>();\n\n this.pendingPermissions.set(permissionId, deferred);\n this.options.onRequestPermission({ ...params, id: permissionId });\n\n return deferred.promise;\n }\n\n resolvePermission(permissionId: PermissionRequestId, response: RequestPermissionResponse) {\n const deferred = this.pendingPermissions.get(permissionId);\n if (deferred) {\n this.pendingPermissions.delete(permissionId);\n deferred.resolve(response);\n }\n }\n\n rejectPermission(permissionId: PermissionRequestId, error: Error) {\n const deferred = this.pendingPermissions.get(permissionId);\n if (deferred) {\n this.pendingPermissions.delete(permissionId);\n deferred.reject(error);\n }\n }\n}\n\ntype RequiredAgent = Required<Agent>;\n\ntype ListeningAgentCallbacks = {\n [K in keyof RequiredAgent as `on_${string & K}_response`]: RequiredAgent[K] extends (\n // biome-ignore lint/suspicious/noExplicitAny: any for typing\n ...args: any[]\n ) => infer R\n ? (response: Awaited<R>, request: Parameters<RequiredAgent[K]>[0]) => void\n : never;\n} & {\n [K in keyof RequiredAgent as `on_${string & K}_start`]: RequiredAgent[K] extends (\n // biome-ignore lint/suspicious/noExplicitAny: any for typing\n ...args: any[]\n ) => unknown\n ? (request: Parameters<RequiredAgent[K]>[0]) => void\n : never;\n} & {};\n\nexport class ListeningAgent implements Agent {\n constructor(\n private readonly agent: Agent,\n private readonly callbacks: Partial<ListeningAgentCallbacks>,\n ) {}\n\n async initialize(params: InitializeRequest): Promise<InitializeResponse> {\n this.callbacks.on_initialize_start?.(params);\n return this.agent.initialize(params).then((response) => {\n this.callbacks.on_initialize_response?.(response, params);\n return response;\n });\n }\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n this.callbacks.on_newSession_start?.(params);\n return this.agent.newSession(params).then((response) => {\n this.callbacks.on_newSession_response?.(response, params);\n return response;\n });\n }\n\n async loadSession(params: LoadSessionRequest): Promise<void> {\n this.callbacks.on_loadSession_start?.(params);\n if (this.agent.loadSession) {\n return this.agent.loadSession(params).then(() => {\n this.callbacks.on_loadSession_response?.(undefined, params);\n });\n }\n throw new Error(\"Agent does not support loadSession capability\");\n }\n\n async authenticate(params: AuthenticateRequest): Promise<void> {\n this.callbacks.on_authenticate_start?.(params);\n return this.agent.authenticate(params).then(() => {\n this.callbacks.on_authenticate_response?.(undefined, params);\n });\n }\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n this.callbacks.on_prompt_start?.(params);\n return this.agent.prompt(params).then((response) => {\n this.callbacks.on_prompt_response?.(response, params);\n return response;\n });\n }\n async cancel(params: CancelNotification): Promise<void> {\n this.callbacks.on_cancel_start?.(params);\n return this.agent.cancel(params).then(() => {\n this.callbacks.on_cancel_response?.(undefined, params);\n });\n }\n}\n"]}
|
|
@@ -7,6 +7,26 @@ export interface WebSocketManagerOptions {
|
|
|
7
7
|
reconnectAttempts?: number;
|
|
8
8
|
reconnectDelay?: number;
|
|
9
9
|
}
|
|
10
|
+
export interface MultiWebSocketManagerOptions {
|
|
11
|
+
onConnectionStateChange: (state: ConnectionState, url: string) => void;
|
|
12
|
+
onError: (error: Error, url: string) => void;
|
|
13
|
+
reconnectAttempts?: number;
|
|
14
|
+
reconnectDelay?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class MultiWebSocketManager {
|
|
17
|
+
private managers;
|
|
18
|
+
private options;
|
|
19
|
+
private currentUrl;
|
|
20
|
+
constructor(options: MultiWebSocketManagerOptions);
|
|
21
|
+
connect(url: string): Promise<{
|
|
22
|
+
readable: NodeReadableStream;
|
|
23
|
+
writable: WritableStream<Uint8Array>;
|
|
24
|
+
}>;
|
|
25
|
+
disconnect(url?: string): void;
|
|
26
|
+
getCurrentUrl(): string | null;
|
|
27
|
+
getConnectionState(url?: string): ConnectionState["status"];
|
|
28
|
+
getActiveConnections(): string[];
|
|
29
|
+
}
|
|
10
30
|
export declare class WebSocketManager {
|
|
11
31
|
private ws;
|
|
12
32
|
private options;
|
|
@@ -23,5 +43,9 @@ export declare class WebSocketManager {
|
|
|
23
43
|
private attemptReconnect;
|
|
24
44
|
private updateConnectionState;
|
|
25
45
|
getConnectionState(): ConnectionState["status"];
|
|
46
|
+
getStreams(): {
|
|
47
|
+
readable: NodeReadableStream;
|
|
48
|
+
writable: WritableStream<Uint8Array>;
|
|
49
|
+
} | null;
|
|
26
50
|
}
|
|
27
51
|
//# sourceMappingURL=websocket-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-manager.d.ts","sourceRoot":"","sources":["../../src/connection/websocket-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,uBAAuB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,cAAc,CAA2C;gBAErD,OAAO,EAAE,uBAAuB;IAQtC,OAAO,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,kBAAkB,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;KAAE,CAAC;IAuDhG,UAAU;IAgBV,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,qBAAqB;IAI7B,kBAAkB,IAAI,eAAe,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"websocket-manager.d.ts","sourceRoot":"","sources":["../../src/connection/websocket-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,uBAAuB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,4BAA4B;IAC3C,uBAAuB,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,UAAU,CAAuB;gBAE7B,OAAO,EAAE,4BAA4B;IAI3C,OAAO,CACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,QAAQ,EAAE,kBAAkB,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;KAAE,CAAC;IA2BlF,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM;IAgBvB,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC;IAQ3D,oBAAoB,IAAI,MAAM,EAAE;CAKjC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,cAAc,CAA2C;gBAErD,OAAO,EAAE,uBAAuB;IAQtC,OAAO,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,kBAAkB,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;KAAE,CAAC;IAuDhG,UAAU;IAgBV,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,qBAAqB;IAI7B,kBAAkB,IAAI,eAAe,CAAC,QAAQ,CAAC;IAgB/C,UAAU,IAAI;QAAE,QAAQ,EAAE,kBAAkB,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;KAAE,GAAG,IAAI;CAS5F"}
|
|
@@ -1,4 +1,65 @@
|
|
|
1
1
|
import { createWebSocketReadableStream, createWebSocketWritableStream, } from "../components/streams.js";
|
|
2
|
+
export class MultiWebSocketManager {
|
|
3
|
+
managers = new Map();
|
|
4
|
+
options;
|
|
5
|
+
currentUrl = null;
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.options = options;
|
|
8
|
+
}
|
|
9
|
+
async connect(url) {
|
|
10
|
+
this.currentUrl = url;
|
|
11
|
+
let manager = this.managers.get(url);
|
|
12
|
+
if (manager) {
|
|
13
|
+
const state = manager.getConnectionState();
|
|
14
|
+
if (state === "connected") {
|
|
15
|
+
const streams = manager.getStreams();
|
|
16
|
+
if (streams) {
|
|
17
|
+
return streams;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
manager = new WebSocketManager({
|
|
23
|
+
url,
|
|
24
|
+
onConnectionStateChange: (state) => this.options.onConnectionStateChange(state, url),
|
|
25
|
+
onError: (error) => this.options.onError(error, url),
|
|
26
|
+
reconnectAttempts: this.options.reconnectAttempts,
|
|
27
|
+
reconnectDelay: this.options.reconnectDelay,
|
|
28
|
+
});
|
|
29
|
+
this.managers.set(url, manager);
|
|
30
|
+
}
|
|
31
|
+
return await manager.connect();
|
|
32
|
+
}
|
|
33
|
+
disconnect(url) {
|
|
34
|
+
if (url) {
|
|
35
|
+
const manager = this.managers.get(url);
|
|
36
|
+
if (manager) {
|
|
37
|
+
manager.disconnect();
|
|
38
|
+
this.managers.delete(url);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
for (const [managerUrl, manager] of this.managers.entries()) {
|
|
43
|
+
manager.disconnect();
|
|
44
|
+
this.managers.delete(managerUrl);
|
|
45
|
+
}
|
|
46
|
+
this.currentUrl = null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
getCurrentUrl() {
|
|
50
|
+
return this.currentUrl;
|
|
51
|
+
}
|
|
52
|
+
getConnectionState(url) {
|
|
53
|
+
const targetUrl = url || this.currentUrl;
|
|
54
|
+
if (!targetUrl)
|
|
55
|
+
return "disconnected";
|
|
56
|
+
const manager = this.managers.get(targetUrl);
|
|
57
|
+
return manager ? manager.getConnectionState() : "disconnected";
|
|
58
|
+
}
|
|
59
|
+
getActiveConnections() {
|
|
60
|
+
return Array.from(this.managers.keys()).filter((url) => this.managers.get(url)?.getConnectionState() === "connected");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
2
63
|
export class WebSocketManager {
|
|
3
64
|
ws = null;
|
|
4
65
|
options;
|
|
@@ -105,5 +166,14 @@ export class WebSocketManager {
|
|
|
105
166
|
return "error";
|
|
106
167
|
}
|
|
107
168
|
}
|
|
169
|
+
getStreams() {
|
|
170
|
+
if (this.readableStream && this.writableStream) {
|
|
171
|
+
return {
|
|
172
|
+
readable: this.readableStream,
|
|
173
|
+
writable: this.writableStream,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
108
178
|
}
|
|
109
179
|
//# sourceMappingURL=websocket-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-manager.js","sourceRoot":"","sources":["../../src/connection/websocket-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createWebSocketReadableStream,\n createWebSocketWritableStream,\n type NodeReadableStream,\n} from \"../components/streams.js\";\nimport type { ConnectionState } from \"../state/types.js\";\n\nexport interface WebSocketManagerOptions {\n url: string;\n onConnectionStateChange: (state: ConnectionState) => void;\n onError: (error: Error) => void;\n reconnectAttempts?: number;\n reconnectDelay?: number;\n}\n\nexport class WebSocketManager {\n private ws: WebSocket | null = null;\n private options: WebSocketManagerOptions;\n private reconnectCount = 0;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private readableStream: NodeReadableStream | null = null;\n private writableStream: WritableStream<Uint8Array> | null = null;\n\n constructor(options: WebSocketManagerOptions) {\n this.options = {\n reconnectAttempts: 3,\n reconnectDelay: 1000,\n ...options,\n };\n }\n\n async connect(): Promise<{ readable: NodeReadableStream; writable: WritableStream<Uint8Array> }> {\n this.updateConnectionState({ status: \"connecting\", url: this.options.url });\n\n try {\n this.ws = new WebSocket(this.options.url);\n\n return new Promise((resolve, reject) => {\n if (!this.ws) {\n reject(new Error(\"WebSocket not initialized\"));\n return;\n }\n\n this.ws.onopen = () => {\n this.reconnectCount = 0;\n this.updateConnectionState({ status: \"connected\", url: this.options.url });\n\n if (this.ws) {\n this.readableStream = createWebSocketReadableStream(this.ws);\n this.writableStream = createWebSocketWritableStream(this.ws);\n\n resolve({\n readable: this.readableStream,\n writable: this.writableStream,\n });\n }\n };\n\n this.ws.onerror = (_event) => {\n const error = new Error(\"WebSocket connection error\");\n this.options.onError(error);\n this.updateConnectionState({\n status: \"error\",\n error: error.message,\n url: this.options.url,\n });\n reject(error);\n };\n\n this.ws.onclose = () => {\n this.updateConnectionState({ status: \"disconnected\", url: this.options.url });\n this.attemptReconnect();\n };\n });\n } catch (error) {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n this.options.onError(errorObj);\n this.updateConnectionState({\n status: \"error\",\n error: errorObj.message,\n url: this.options.url,\n });\n throw errorObj;\n }\n }\n\n disconnect() {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.readableStream = null;\n this.writableStream = null;\n this.updateConnectionState({ status: \"disconnected\" });\n }\n\n private attemptReconnect() {\n if (this.reconnectCount < (this.options.reconnectAttempts || 3)) {\n this.reconnectCount++;\n this.reconnectTimer = setTimeout(async () => {\n try {\n await this.connect();\n } catch (_error) {\n // Error is already handled in connect method\n }\n }, this.options.reconnectDelay);\n }\n }\n\n private updateConnectionState(state: ConnectionState) {\n this.options.onConnectionStateChange(state);\n }\n\n getConnectionState(): ConnectionState[\"status\"] {\n if (!this.ws) return \"disconnected\";\n\n switch (this.ws.readyState) {\n case WebSocket.CONNECTING:\n return \"connecting\";\n case WebSocket.OPEN:\n return \"connected\";\n case WebSocket.CLOSING:\n case WebSocket.CLOSED:\n return \"disconnected\";\n default:\n return \"error\";\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"websocket-manager.js","sourceRoot":"","sources":["../../src/connection/websocket-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createWebSocketReadableStream,\n createWebSocketWritableStream,\n type NodeReadableStream,\n} from \"../components/streams.js\";\nimport type { ConnectionState } from \"../state/types.js\";\n\nexport interface WebSocketManagerOptions {\n url: string;\n onConnectionStateChange: (state: ConnectionState) => void;\n onError: (error: Error) => void;\n reconnectAttempts?: number;\n reconnectDelay?: number;\n}\n\nexport interface MultiWebSocketManagerOptions {\n onConnectionStateChange: (state: ConnectionState, url: string) => void;\n onError: (error: Error, url: string) => void;\n reconnectAttempts?: number;\n reconnectDelay?: number;\n}\n\nexport class MultiWebSocketManager {\n private managers = new Map<string, WebSocketManager>();\n private options: MultiWebSocketManagerOptions;\n private currentUrl: string | null = null;\n\n constructor(options: MultiWebSocketManagerOptions) {\n this.options = options;\n }\n\n async connect(\n url: string,\n ): Promise<{ readable: NodeReadableStream; writable: WritableStream<Uint8Array> }> {\n this.currentUrl = url;\n\n let manager = this.managers.get(url);\n\n if (manager) {\n const state = manager.getConnectionState();\n if (state === \"connected\") {\n const streams = manager.getStreams();\n if (streams) {\n return streams;\n }\n }\n } else {\n manager = new WebSocketManager({\n url,\n onConnectionStateChange: (state) => this.options.onConnectionStateChange(state, url),\n onError: (error) => this.options.onError(error, url),\n reconnectAttempts: this.options.reconnectAttempts,\n reconnectDelay: this.options.reconnectDelay,\n });\n this.managers.set(url, manager);\n }\n\n return await manager.connect();\n }\n\n disconnect(url?: string) {\n if (url) {\n const manager = this.managers.get(url);\n if (manager) {\n manager.disconnect();\n this.managers.delete(url);\n }\n } else {\n for (const [managerUrl, manager] of this.managers.entries()) {\n manager.disconnect();\n this.managers.delete(managerUrl);\n }\n this.currentUrl = null;\n }\n }\n\n getCurrentUrl(): string | null {\n return this.currentUrl;\n }\n\n getConnectionState(url?: string): ConnectionState[\"status\"] {\n const targetUrl = url || this.currentUrl;\n if (!targetUrl) return \"disconnected\";\n\n const manager = this.managers.get(targetUrl);\n return manager ? manager.getConnectionState() : \"disconnected\";\n }\n\n getActiveConnections(): string[] {\n return Array.from(this.managers.keys()).filter(\n (url) => this.managers.get(url)?.getConnectionState() === \"connected\",\n );\n }\n}\n\nexport class WebSocketManager {\n private ws: WebSocket | null = null;\n private options: WebSocketManagerOptions;\n private reconnectCount = 0;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private readableStream: NodeReadableStream | null = null;\n private writableStream: WritableStream<Uint8Array> | null = null;\n\n constructor(options: WebSocketManagerOptions) {\n this.options = {\n reconnectAttempts: 3,\n reconnectDelay: 1000,\n ...options,\n };\n }\n\n async connect(): Promise<{ readable: NodeReadableStream; writable: WritableStream<Uint8Array> }> {\n this.updateConnectionState({ status: \"connecting\", url: this.options.url });\n\n try {\n this.ws = new WebSocket(this.options.url);\n\n return new Promise((resolve, reject) => {\n if (!this.ws) {\n reject(new Error(\"WebSocket not initialized\"));\n return;\n }\n\n this.ws.onopen = () => {\n this.reconnectCount = 0;\n this.updateConnectionState({ status: \"connected\", url: this.options.url });\n\n if (this.ws) {\n this.readableStream = createWebSocketReadableStream(this.ws);\n this.writableStream = createWebSocketWritableStream(this.ws);\n\n resolve({\n readable: this.readableStream,\n writable: this.writableStream,\n });\n }\n };\n\n this.ws.onerror = (_event) => {\n const error = new Error(\"WebSocket connection error\");\n this.options.onError(error);\n this.updateConnectionState({\n status: \"error\",\n error: error.message,\n url: this.options.url,\n });\n reject(error);\n };\n\n this.ws.onclose = () => {\n this.updateConnectionState({ status: \"disconnected\", url: this.options.url });\n this.attemptReconnect();\n };\n });\n } catch (error) {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n this.options.onError(errorObj);\n this.updateConnectionState({\n status: \"error\",\n error: errorObj.message,\n url: this.options.url,\n });\n throw errorObj;\n }\n }\n\n disconnect() {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.readableStream = null;\n this.writableStream = null;\n this.updateConnectionState({ status: \"disconnected\" });\n }\n\n private attemptReconnect() {\n if (this.reconnectCount < (this.options.reconnectAttempts || 3)) {\n this.reconnectCount++;\n this.reconnectTimer = setTimeout(async () => {\n try {\n await this.connect();\n } catch (_error) {\n // Error is already handled in connect method\n }\n }, this.options.reconnectDelay);\n }\n }\n\n private updateConnectionState(state: ConnectionState) {\n this.options.onConnectionStateChange(state);\n }\n\n getConnectionState(): ConnectionState[\"status\"] {\n if (!this.ws) return \"disconnected\";\n\n switch (this.ws.readyState) {\n case WebSocket.CONNECTING:\n return \"connecting\";\n case WebSocket.OPEN:\n return \"connected\";\n case WebSocket.CLOSING:\n case WebSocket.CLOSED:\n return \"disconnected\";\n default:\n return \"error\";\n }\n }\n\n getStreams(): { readable: NodeReadableStream; writable: WritableStream<Uint8Array> } | null {\n if (this.readableStream && this.writableStream) {\n return {\n readable: this.readableStream,\n writable: this.writableStream,\n };\n }\n return null;\n }\n}\n"]}
|
|
@@ -1,23 +1,31 @@
|
|
|
1
|
-
import { type Agent, type RequestPermissionResponse } from "@zed-industries/agent-client-protocol";
|
|
2
|
-
import { type IdentifiedPermissionRequest } from "../client/acp-client.js";
|
|
3
|
-
import type { ConnectionState, NotificationEvent } from "../state/types.js";
|
|
1
|
+
import { type Agent, type AgentCapabilities, type McpServer, type RequestPermissionResponse } from "@zed-industries/agent-client-protocol";
|
|
2
|
+
import { type AcpClientOptions, type IdentifiedPermissionRequest } from "../client/acp-client.js";
|
|
3
|
+
import type { ConnectionState, NotificationEvent, SessionId } from "../state/types.js";
|
|
4
4
|
export interface UseAcpClientOptions {
|
|
5
5
|
wsUrl: string;
|
|
6
6
|
autoConnect?: boolean;
|
|
7
7
|
reconnectAttempts?: number;
|
|
8
8
|
reconnectDelay?: number;
|
|
9
|
+
clientOptions?: Partial<AcpClientOptions>;
|
|
9
10
|
initialSessionId?: string | null;
|
|
11
|
+
sessionParams?: {
|
|
12
|
+
cwd?: string;
|
|
13
|
+
mcpServers?: McpServer[];
|
|
14
|
+
};
|
|
10
15
|
}
|
|
11
16
|
export interface UseAcpClientReturn {
|
|
12
17
|
connect: () => Promise<void>;
|
|
13
18
|
disconnect: () => void;
|
|
14
19
|
connectionState: ConnectionState;
|
|
20
|
+
activeSessionId: SessionId | null;
|
|
15
21
|
notifications: NotificationEvent[];
|
|
16
22
|
clearNotifications: () => void;
|
|
23
|
+
isSessionLoading: boolean;
|
|
17
24
|
pendingPermission: IdentifiedPermissionRequest | null;
|
|
18
25
|
resolvePermission: (response: RequestPermissionResponse) => void;
|
|
19
26
|
rejectPermission: (error: Error) => void;
|
|
20
27
|
agent: Agent | null;
|
|
28
|
+
agentCapabilities: AgentCapabilities | null;
|
|
21
29
|
}
|
|
22
30
|
export declare function useAcpClient(options: UseAcpClientOptions): UseAcpClientReturn;
|
|
23
31
|
//# sourceMappingURL=use-acp-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-acp-client.d.ts","sourceRoot":"","sources":["../../src/hooks/use-acp-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"use-acp-client.d.ts","sourceRoot":"","sources":["../../src/hooks/use-acp-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,KAAK,EACV,KAAK,iBAAiB,EAEtB,KAAK,SAAS,EACd,KAAK,yBAAyB,EAE/B,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EAEjC,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EACV,eAAe,EAEf,iBAAiB,EACjB,SAAS,EACV,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,mBAAmB;IAElC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,aAAa,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAG1C,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IAEjC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IAGjC,eAAe,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAG1B,iBAAiB,EAAE,2BAA2B,GAAG,IAAI,CAAC;IACtD,iBAAiB,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACjE,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAGzC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC7C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAiM7E"}
|
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
import { ClientSideConnection, } from "@zed-industries/agent-client-protocol";
|
|
2
2
|
import { useEffect, useRef, useState } from "react";
|
|
3
3
|
import { AcpClient, ListeningAgent, } from "../client/acp-client.js";
|
|
4
|
-
import {
|
|
4
|
+
import { MultiWebSocketManager } from "../connection/websocket-manager.js";
|
|
5
5
|
import { useAcpStore } from "../state/atoms.js";
|
|
6
6
|
import { useEventCallback } from "./use-event-callback.js";
|
|
7
7
|
export function useAcpClient(options) {
|
|
8
|
-
const { connectionState, notifications, activeSessionId, setActiveSessionId,
|
|
8
|
+
const { connectionState, notifications, activeSessionId, agentCapabilities, setActiveSessionId, setConnection, setActiveConnection, addNotification, clearNotifications, } = useAcpStore();
|
|
9
9
|
// State
|
|
10
10
|
const [pendingPermission, setPendingPermission] = useState(null);
|
|
11
11
|
const [agent, setAgent] = useState(null);
|
|
12
|
+
const [isSessionLoading, setIsSessionLoading] = useState(false);
|
|
12
13
|
// Refs
|
|
13
|
-
const
|
|
14
|
+
const multiWsManagerRef = useRef(null);
|
|
14
15
|
const acpClientRef = useRef(null);
|
|
16
|
+
const lastProcessedSessionId = useRef(null);
|
|
17
|
+
const sessionCreationInProgress = useRef(false);
|
|
15
18
|
// Handlers
|
|
16
|
-
const handleConnectionStateChange = useEventCallback((state) => {
|
|
17
|
-
|
|
19
|
+
const handleConnectionStateChange = useEventCallback((state, url) => {
|
|
20
|
+
setConnection(url, state);
|
|
18
21
|
addNotification({
|
|
19
22
|
type: "connection_change",
|
|
20
23
|
data: state,
|
|
21
24
|
});
|
|
22
25
|
});
|
|
23
|
-
const handleError = useEventCallback((error) => {
|
|
26
|
+
const handleError = useEventCallback((error, _url) => {
|
|
24
27
|
addNotification({
|
|
25
28
|
type: "error",
|
|
26
29
|
data: error,
|
|
@@ -36,65 +39,85 @@ export function useAcpClient(options) {
|
|
|
36
39
|
setPendingPermission(params);
|
|
37
40
|
});
|
|
38
41
|
const connect = useEventCallback(async () => {
|
|
39
|
-
if (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
if (!multiWsManagerRef.current) {
|
|
43
|
+
multiWsManagerRef.current = new MultiWebSocketManager({
|
|
44
|
+
onConnectionStateChange: handleConnectionStateChange,
|
|
45
|
+
onError: handleError,
|
|
46
|
+
reconnectAttempts: options.reconnectAttempts,
|
|
47
|
+
reconnectDelay: options.reconnectDelay,
|
|
48
|
+
});
|
|
43
49
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// Initialize the connection
|
|
55
|
-
const agent = new ClientSideConnection((agent) => {
|
|
56
|
-
// Initialize the ACP client
|
|
57
|
-
const acpClient = new AcpClient(agent, {
|
|
58
|
-
onRequestPermission: handleRequestPermission,
|
|
59
|
-
onSessionNotification: handleSessionNotification,
|
|
60
|
-
});
|
|
61
|
-
acpClientRef.current = acpClient;
|
|
62
|
-
return acpClient;
|
|
63
|
-
}, writable, readable);
|
|
64
|
-
const listeningAgent = new ListeningAgent(agent, {
|
|
65
|
-
on_newSession_response: (response) => {
|
|
66
|
-
setActiveSessionId(response.sessionId);
|
|
50
|
+
setActiveConnection(options.wsUrl);
|
|
51
|
+
const { readable, writable } = await multiWsManagerRef.current.connect(options.wsUrl);
|
|
52
|
+
// Initialize the connection
|
|
53
|
+
const agent = new ClientSideConnection((agent) => {
|
|
54
|
+
// Initialize the ACP client
|
|
55
|
+
const acpClient = new AcpClient(agent, {
|
|
56
|
+
...options.clientOptions,
|
|
57
|
+
onRequestPermission: (params) => {
|
|
58
|
+
options.clientOptions?.onRequestPermission?.(params);
|
|
59
|
+
handleRequestPermission(params);
|
|
67
60
|
},
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
type: "session_notification",
|
|
72
|
-
data: {
|
|
73
|
-
sessionId: params.sessionId,
|
|
74
|
-
update: {
|
|
75
|
-
sessionUpdate: "user_message_chunk",
|
|
76
|
-
content: prompt,
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
}
|
|
61
|
+
onSessionNotification: (params) => {
|
|
62
|
+
options.clientOptions?.onSessionNotification?.(params);
|
|
63
|
+
handleSessionNotification(params);
|
|
81
64
|
},
|
|
82
65
|
});
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
66
|
+
acpClientRef.current = acpClient;
|
|
67
|
+
return acpClient;
|
|
68
|
+
}, writable, readable);
|
|
69
|
+
const listeningAgent = new ListeningAgent(agent, {
|
|
70
|
+
on_initialize_response: (response) => {
|
|
71
|
+
const capabilities = response.agentCapabilities;
|
|
72
|
+
console.log("[acp] Agent capabilities", capabilities);
|
|
73
|
+
setConnection(options.wsUrl, connectionState, capabilities);
|
|
74
|
+
},
|
|
75
|
+
on_newSession_response: (response) => {
|
|
76
|
+
console.log("[acp] New session created", response);
|
|
77
|
+
setActiveSessionId(response.sessionId);
|
|
78
|
+
},
|
|
79
|
+
on_loadSession_response: (_, params) => {
|
|
80
|
+
console.log("[acp] Session resumed", params);
|
|
81
|
+
setActiveSessionId(params.sessionId);
|
|
82
|
+
},
|
|
83
|
+
on_prompt_start: (params) => {
|
|
84
|
+
for (const prompt of params.prompt) {
|
|
85
|
+
addNotification({
|
|
86
|
+
type: "session_notification",
|
|
87
|
+
data: {
|
|
88
|
+
sessionId: params.sessionId,
|
|
89
|
+
update: {
|
|
90
|
+
sessionUpdate: "user_message_chunk",
|
|
91
|
+
content: prompt,
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
setAgent(listeningAgent);
|
|
89
99
|
});
|
|
90
|
-
const disconnect = useEventCallback(() => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
100
|
+
const disconnect = useEventCallback((url) => {
|
|
101
|
+
const targetUrl = url || options.wsUrl;
|
|
102
|
+
if (multiWsManagerRef.current) {
|
|
103
|
+
if (url) {
|
|
104
|
+
multiWsManagerRef.current.disconnect(url);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Disconnect the current URL specifically instead of all connections
|
|
108
|
+
multiWsManagerRef.current.disconnect(targetUrl);
|
|
109
|
+
multiWsManagerRef.current = null;
|
|
110
|
+
acpClientRef.current = null;
|
|
111
|
+
setAgent(null);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!url) {
|
|
115
|
+
setPendingPermission(null);
|
|
116
|
+
// Reset session creation safeguards on full disconnect
|
|
117
|
+
sessionCreationInProgress.current = false;
|
|
118
|
+
lastProcessedSessionId.current = null;
|
|
119
|
+
setIsSessionLoading(false);
|
|
94
120
|
}
|
|
95
|
-
acpClientRef.current = null;
|
|
96
|
-
setAgent(null);
|
|
97
|
-
setPendingPermission(null);
|
|
98
121
|
});
|
|
99
122
|
const resolvePermission = useEventCallback((response) => {
|
|
100
123
|
if (pendingPermission && acpClientRef.current) {
|
|
@@ -114,13 +137,6 @@ export function useAcpClient(options) {
|
|
|
114
137
|
}
|
|
115
138
|
setPendingPermission(null);
|
|
116
139
|
});
|
|
117
|
-
// Effects
|
|
118
|
-
// Update active session id if it changes externally
|
|
119
|
-
useEffect(() => {
|
|
120
|
-
if (options.initialSessionId) {
|
|
121
|
-
setActiveSessionId(options.initialSessionId);
|
|
122
|
-
}
|
|
123
|
-
}, [options.initialSessionId, setActiveSessionId]);
|
|
124
140
|
// Auto-connect on mount if specified
|
|
125
141
|
// biome-ignore lint/correctness/useExhaustiveDependencies: Don't include connect/disconnect to avoid re-connecting on every render
|
|
126
142
|
useEffect(() => {
|
|
@@ -135,12 +151,15 @@ export function useAcpClient(options) {
|
|
|
135
151
|
connect,
|
|
136
152
|
disconnect,
|
|
137
153
|
connectionState,
|
|
154
|
+
activeSessionId,
|
|
138
155
|
notifications: activeSessionId ? notifications[activeSessionId] || [] : [],
|
|
156
|
+
isSessionLoading,
|
|
139
157
|
clearNotifications,
|
|
140
158
|
pendingPermission,
|
|
141
159
|
resolvePermission,
|
|
142
160
|
rejectPermission: rejectPermissionCallback,
|
|
143
161
|
agent: agent,
|
|
162
|
+
agentCapabilities,
|
|
144
163
|
};
|
|
145
164
|
}
|
|
146
165
|
//# sourceMappingURL=use-acp-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-acp-client.js","sourceRoot":"","sources":["../../src/hooks/use-acp-client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type Agent,\n ClientSideConnection,\n type RequestPermissionResponse,\n type SessionNotification,\n} from \"@zed-industries/agent-client-protocol\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n AcpClient,\n type IdentifiedPermissionRequest,\n ListeningAgent,\n} from \"../client/acp-client.js\";\nimport { WebSocketManager } from \"../connection/websocket-manager.js\";\nimport { useAcpStore } from \"../state/atoms.js\";\nimport type { ConnectionState, NotificationEvent } from \"../state/types.js\";\nimport { useEventCallback } from \"./use-event-callback.js\";\n\nexport interface UseAcpClientOptions {\n // Connection management\n wsUrl: string;\n autoConnect?: boolean;\n reconnectAttempts?: number;\n reconnectDelay?: number;\n\n // Defaults\n initialSessionId?: string | null;\n}\n\nexport interface UseAcpClientReturn {\n // Connection management\n connect: () => Promise<void>;\n disconnect: () => void;\n connectionState: ConnectionState;\n\n // State management\n notifications: NotificationEvent[];\n clearNotifications: () => void;\n\n // Permission handling\n pendingPermission: IdentifiedPermissionRequest | null;\n resolvePermission: (response: RequestPermissionResponse) => void;\n rejectPermission: (error: Error) => void;\n\n // ACP connection\n agent: Agent | null;\n}\n\nexport function useAcpClient(options: UseAcpClientOptions): UseAcpClientReturn {\n const {\n connectionState,\n notifications,\n activeSessionId,\n setActiveSessionId,\n setConnectionState,\n addNotification,\n clearNotifications,\n } = useAcpStore();\n\n // State\n const [pendingPermission, setPendingPermission] = useState<IdentifiedPermissionRequest | null>(\n null,\n );\n const [agent, setAgent] = useState<Agent | null>(null);\n\n // Refs\n const wsManagerRef = useRef<WebSocketManager | null>(null);\n const acpClientRef = useRef<AcpClient | null>(null);\n\n // Handlers\n const handleConnectionStateChange = useEventCallback((state: ConnectionState) => {\n setConnectionState(state);\n addNotification({\n type: \"connection_change\",\n data: state,\n });\n });\n\n const handleError = useEventCallback((error: Error) => {\n addNotification({\n type: \"error\",\n data: error,\n });\n });\n\n const handleSessionNotification = useEventCallback((notification: SessionNotification) => {\n addNotification({\n type: \"session_notification\",\n data: notification,\n });\n });\n\n const handleRequestPermission = useEventCallback((params: IdentifiedPermissionRequest) => {\n setPendingPermission(params);\n });\n\n const connect = useEventCallback(async () => {\n if (\n wsManagerRef.current ||\n connectionState.status === \"connecting\" ||\n connectionState.status === \"connected\"\n ) {\n return;\n }\n\n const wsManager = new WebSocketManager({\n url: options.wsUrl,\n onConnectionStateChange: handleConnectionStateChange,\n onError: handleError,\n reconnectAttempts: options.reconnectAttempts,\n reconnectDelay: options.reconnectDelay,\n });\n\n wsManagerRef.current = wsManager;\n\n try {\n const { readable, writable } = await wsManager.connect();\n\n // Initialize the connection\n const agent = new ClientSideConnection(\n (agent) => {\n // Initialize the ACP client\n const acpClient = new AcpClient(agent, {\n onRequestPermission: handleRequestPermission,\n onSessionNotification: handleSessionNotification,\n });\n acpClientRef.current = acpClient;\n return acpClient;\n },\n writable,\n readable,\n );\n\n const listeningAgent: Agent = new ListeningAgent(agent, {\n on_newSession_response: (response) => {\n setActiveSessionId(response.sessionId);\n },\n on_prompt_start: (params) => {\n for (const prompt of params.prompt) {\n addNotification({\n type: \"session_notification\",\n data: {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\",\n content: prompt,\n },\n },\n });\n }\n },\n });\n\n setAgent(listeningAgent);\n } catch (error) {\n wsManagerRef.current = null;\n throw error;\n }\n });\n\n const disconnect = useEventCallback(() => {\n if (wsManagerRef.current) {\n wsManagerRef.current.disconnect();\n wsManagerRef.current = null;\n }\n\n acpClientRef.current = null;\n setAgent(null);\n setPendingPermission(null);\n });\n\n const resolvePermission = useEventCallback((response: RequestPermissionResponse) => {\n if (pendingPermission && acpClientRef.current) {\n const permissionId = pendingPermission.id;\n if (permissionId) {\n acpClientRef.current.resolvePermission(permissionId, response);\n }\n }\n setPendingPermission(null);\n });\n\n const rejectPermissionCallback = useEventCallback((error: Error) => {\n if (pendingPermission && acpClientRef.current) {\n const permissionId = pendingPermission.id;\n if (permissionId) {\n acpClientRef.current.rejectPermission(permissionId, error);\n }\n }\n setPendingPermission(null);\n });\n\n // Effects\n\n // Update active session id if it changes externally\n useEffect(() => {\n if (options.initialSessionId) {\n setActiveSessionId(options.initialSessionId);\n }\n }, [options.initialSessionId, setActiveSessionId]);\n\n // Auto-connect on mount if specified\n // biome-ignore lint/correctness/useExhaustiveDependencies: Don't include connect/disconnect to avoid re-connecting on every render\n useEffect(() => {\n if (options.autoConnect) {\n connect().catch(console.error);\n }\n\n return () => {\n disconnect();\n };\n }, [options.autoConnect]);\n\n return {\n connect,\n disconnect,\n connectionState,\n notifications: activeSessionId ? notifications[activeSessionId] || [] : [],\n clearNotifications,\n pendingPermission,\n resolvePermission,\n rejectPermission: rejectPermissionCallback,\n agent: agent,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-acp-client.js","sourceRoot":"","sources":["../../src/hooks/use-acp-client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type Agent,\n type AgentCapabilities,\n ClientSideConnection,\n type McpServer,\n type RequestPermissionResponse,\n type SessionNotification,\n} from \"@zed-industries/agent-client-protocol\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n AcpClient,\n type AcpClientOptions,\n type IdentifiedPermissionRequest,\n ListeningAgent,\n} from \"../client/acp-client.js\";\nimport { MultiWebSocketManager } from \"../connection/websocket-manager.js\";\nimport { useAcpStore } from \"../state/atoms.js\";\nimport type {\n ConnectionState,\n ConnectionUrl,\n NotificationEvent,\n SessionId,\n} from \"../state/types.js\";\nimport { useEventCallback } from \"./use-event-callback.js\";\n\nexport interface UseAcpClientOptions {\n // Connection management\n wsUrl: string;\n autoConnect?: boolean;\n reconnectAttempts?: number;\n reconnectDelay?: number;\n\n // Client options\n clientOptions?: Partial<AcpClientOptions>;\n\n // Session management\n initialSessionId?: string | null;\n sessionParams?: {\n cwd?: string;\n mcpServers?: McpServer[];\n };\n}\n\nexport interface UseAcpClientReturn {\n // Connection management\n connect: () => Promise<void>;\n disconnect: () => void;\n connectionState: ConnectionState;\n\n // State management\n activeSessionId: SessionId | null;\n notifications: NotificationEvent[];\n clearNotifications: () => void;\n isSessionLoading: boolean;\n\n // Permission handling\n pendingPermission: IdentifiedPermissionRequest | null;\n resolvePermission: (response: RequestPermissionResponse) => void;\n rejectPermission: (error: Error) => void;\n\n // ACP connection\n agent: Agent | null;\n agentCapabilities: AgentCapabilities | null;\n}\n\nexport function useAcpClient(options: UseAcpClientOptions): UseAcpClientReturn {\n const {\n connectionState,\n notifications,\n activeSessionId,\n agentCapabilities,\n setActiveSessionId,\n setConnection,\n setActiveConnection,\n addNotification,\n clearNotifications,\n } = useAcpStore();\n\n // State\n const [pendingPermission, setPendingPermission] = useState<IdentifiedPermissionRequest | null>(\n null,\n );\n const [agent, setAgent] = useState<Agent | null>(null);\n const [isSessionLoading, setIsSessionLoading] = useState(false);\n\n // Refs\n const multiWsManagerRef = useRef<MultiWebSocketManager | null>(null);\n const acpClientRef = useRef<AcpClient | null>(null);\n const lastProcessedSessionId = useRef<SessionId | null>(null);\n const sessionCreationInProgress = useRef<boolean>(false);\n\n // Handlers\n const handleConnectionStateChange = useEventCallback(\n (state: ConnectionState, url: ConnectionUrl) => {\n setConnection(url, state);\n addNotification({\n type: \"connection_change\",\n data: state,\n });\n },\n );\n\n const handleError = useEventCallback((error: Error, _url: ConnectionUrl) => {\n addNotification({\n type: \"error\",\n data: error,\n });\n });\n\n const handleSessionNotification = useEventCallback((notification: SessionNotification) => {\n addNotification({\n type: \"session_notification\",\n data: notification,\n });\n });\n\n const handleRequestPermission = useEventCallback((params: IdentifiedPermissionRequest) => {\n setPendingPermission(params);\n });\n\n const connect = useEventCallback(async () => {\n if (!multiWsManagerRef.current) {\n multiWsManagerRef.current = new MultiWebSocketManager({\n onConnectionStateChange: handleConnectionStateChange,\n onError: handleError,\n reconnectAttempts: options.reconnectAttempts,\n reconnectDelay: options.reconnectDelay,\n });\n }\n\n setActiveConnection(options.wsUrl);\n const { readable, writable } = await multiWsManagerRef.current.connect(options.wsUrl);\n\n // Initialize the connection\n const agent = new ClientSideConnection(\n (agent) => {\n // Initialize the ACP client\n const acpClient = new AcpClient(agent, {\n ...options.clientOptions,\n onRequestPermission: (params) => {\n options.clientOptions?.onRequestPermission?.(params);\n handleRequestPermission(params);\n },\n onSessionNotification: (params) => {\n options.clientOptions?.onSessionNotification?.(params);\n handleSessionNotification(params);\n },\n });\n acpClientRef.current = acpClient;\n return acpClient;\n },\n writable,\n readable,\n );\n\n const listeningAgent: Agent = new ListeningAgent(agent, {\n on_initialize_response: (response) => {\n const capabilities = response.agentCapabilities;\n console.log(\"[acp] Agent capabilities\", capabilities);\n setConnection(options.wsUrl, connectionState, capabilities);\n },\n on_newSession_response: (response) => {\n console.log(\"[acp] New session created\", response);\n setActiveSessionId(response.sessionId as SessionId);\n },\n on_loadSession_response: (_, params) => {\n console.log(\"[acp] Session resumed\", params);\n setActiveSessionId(params.sessionId as SessionId);\n },\n on_prompt_start: (params) => {\n for (const prompt of params.prompt) {\n addNotification({\n type: \"session_notification\",\n data: {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\",\n content: prompt,\n },\n },\n });\n }\n },\n });\n\n setAgent(listeningAgent);\n });\n\n const disconnect = useEventCallback((url?: ConnectionUrl) => {\n const targetUrl = url || options.wsUrl;\n\n if (multiWsManagerRef.current) {\n if (url) {\n multiWsManagerRef.current.disconnect(url);\n } else {\n // Disconnect the current URL specifically instead of all connections\n multiWsManagerRef.current.disconnect(targetUrl);\n multiWsManagerRef.current = null;\n acpClientRef.current = null;\n setAgent(null);\n }\n }\n\n if (!url) {\n setPendingPermission(null);\n // Reset session creation safeguards on full disconnect\n sessionCreationInProgress.current = false;\n lastProcessedSessionId.current = null;\n setIsSessionLoading(false);\n }\n });\n\n const resolvePermission = useEventCallback((response: RequestPermissionResponse) => {\n if (pendingPermission && acpClientRef.current) {\n const permissionId = pendingPermission.id;\n if (permissionId) {\n acpClientRef.current.resolvePermission(permissionId, response);\n }\n }\n setPendingPermission(null);\n });\n\n const rejectPermissionCallback = useEventCallback((error: Error) => {\n if (pendingPermission && acpClientRef.current) {\n const permissionId = pendingPermission.id;\n if (permissionId) {\n acpClientRef.current.rejectPermission(permissionId, error);\n }\n }\n setPendingPermission(null);\n });\n\n // Auto-connect on mount if specified\n // biome-ignore lint/correctness/useExhaustiveDependencies: Don't include connect/disconnect to avoid re-connecting on every render\n useEffect(() => {\n if (options.autoConnect) {\n connect().catch(console.error);\n }\n\n return () => {\n disconnect();\n };\n }, [options.autoConnect]);\n\n return {\n connect,\n disconnect,\n connectionState,\n activeSessionId,\n notifications: activeSessionId ? notifications[activeSessionId] || [] : [],\n isSessionLoading,\n clearNotifications,\n pendingPermission,\n resolvePermission,\n rejectPermission: rejectPermissionCallback,\n agent: agent,\n agentCapabilities,\n };\n}\n"]}
|
package/dist/state/atoms.d.ts
CHANGED
|
@@ -1,13 +1,23 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AgentCapabilities } from "@zed-industries/agent-client-protocol";
|
|
2
|
+
import type { Connection, ConnectionState, ConnectionUrl, NotificationEvent, NotificationEventData, SessionId } from "./types.js";
|
|
2
3
|
interface AcpState {
|
|
4
|
+
connections: Record<ConnectionUrl, Connection>;
|
|
5
|
+
activeConnectionUrl: ConnectionUrl | null;
|
|
3
6
|
connectionState: ConnectionState;
|
|
4
|
-
|
|
5
|
-
|
|
7
|
+
agentCapabilities: AgentCapabilities | null;
|
|
8
|
+
activeSessionId: SessionId | null;
|
|
9
|
+
notifications: Record<SessionId, NotificationEvent[]>;
|
|
10
|
+
setConnection: (url: ConnectionUrl, state: ConnectionState, capabilities?: AgentCapabilities | null) => void;
|
|
11
|
+
setActiveConnection: (url: ConnectionUrl | null) => void;
|
|
12
|
+
removeConnection: (url: ConnectionUrl) => void;
|
|
6
13
|
setConnectionState: (state: ConnectionState) => void;
|
|
7
|
-
|
|
14
|
+
setAgentCapabilities: (capabilities: AgentCapabilities | null) => void;
|
|
15
|
+
setActiveSessionId: (sessionId: SessionId | null) => void;
|
|
8
16
|
addNotification: (notification: NotificationEventData) => void;
|
|
9
|
-
clearNotifications: (sessionId?:
|
|
17
|
+
clearNotifications: (sessionId?: SessionId) => void;
|
|
10
18
|
getActiveNotifications: () => NotificationEvent[];
|
|
19
|
+
getActiveConnection: () => Connection | null;
|
|
20
|
+
getConnection: (url: ConnectionUrl) => Connection | null;
|
|
11
21
|
}
|
|
12
22
|
export declare const useAcpStore: import("zustand").UseBoundStore<import("zustand").StoreApi<AcpState>>;
|
|
13
23
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atoms.d.ts","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"atoms.d.ts","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,UAAU,QAAQ;IAEhB,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC/C,mBAAmB,EAAE,aAAa,GAAG,IAAI,CAAC;IAG1C,eAAe,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAG5C,eAAe,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAGtD,aAAa,EAAE,CACb,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,eAAe,EACtB,YAAY,CAAC,EAAE,iBAAiB,GAAG,IAAI,KACpC,IAAI,CAAC;IACV,mBAAmB,EAAE,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC;IACzD,gBAAgB,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IAG/C,kBAAkB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACrD,oBAAoB,EAAE,CAAC,YAAY,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;IAGvE,kBAAkB,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1D,eAAe,EAAE,CAAC,YAAY,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC/D,kBAAkB,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACpD,sBAAsB,EAAE,MAAM,iBAAiB,EAAE,CAAC;IAGlD,mBAAmB,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC;IAC7C,aAAa,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,UAAU,GAAG,IAAI,CAAC;CAC1D;AAED,eAAO,MAAM,WAAW,uEAiIrB,CAAC"}
|
package/dist/state/atoms.js
CHANGED
|
@@ -1,12 +1,70 @@
|
|
|
1
1
|
import { create } from "zustand";
|
|
2
2
|
export const useAcpStore = create((set, get) => ({
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
// Multi-connection state
|
|
4
|
+
connections: {},
|
|
5
|
+
activeConnectionUrl: null,
|
|
6
|
+
// Legacy state
|
|
7
|
+
connectionState: { status: "disconnected" },
|
|
8
|
+
agentCapabilities: null,
|
|
9
|
+
// Session state
|
|
6
10
|
activeSessionId: null,
|
|
7
11
|
notifications: {},
|
|
12
|
+
// Connection management
|
|
13
|
+
setConnection: (url, state, capabilities) => {
|
|
14
|
+
set((prev) => ({
|
|
15
|
+
connections: {
|
|
16
|
+
...prev.connections,
|
|
17
|
+
[url]: {
|
|
18
|
+
url,
|
|
19
|
+
state,
|
|
20
|
+
capabilities: capabilities ?? prev.connections[url]?.capabilities ?? null,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
// Update legacy state if this is the active connection
|
|
24
|
+
...(prev.activeConnectionUrl === url && {
|
|
25
|
+
connectionState: state,
|
|
26
|
+
agentCapabilities: capabilities ?? prev.connections[url]?.capabilities ?? null,
|
|
27
|
+
}),
|
|
28
|
+
}));
|
|
29
|
+
},
|
|
30
|
+
setActiveConnection: (url) => {
|
|
31
|
+
set((prev) => {
|
|
32
|
+
const activeConnection = url ? prev.connections[url] : null;
|
|
33
|
+
return {
|
|
34
|
+
activeConnectionUrl: url,
|
|
35
|
+
connectionState: activeConnection?.state ?? { status: "disconnected" },
|
|
36
|
+
agentCapabilities: activeConnection?.capabilities ?? null,
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
removeConnection: (url) => {
|
|
41
|
+
set((prev) => {
|
|
42
|
+
const newConnections = { ...prev.connections };
|
|
43
|
+
delete newConnections[url];
|
|
44
|
+
const newActiveUrl = prev.activeConnectionUrl === url ? null : prev.activeConnectionUrl;
|
|
45
|
+
const activeConnection = newActiveUrl ? newConnections[newActiveUrl] : null;
|
|
46
|
+
return {
|
|
47
|
+
connections: newConnections,
|
|
48
|
+
activeConnectionUrl: newActiveUrl,
|
|
49
|
+
connectionState: activeConnection?.state ?? { status: "disconnected" },
|
|
50
|
+
agentCapabilities: activeConnection?.capabilities ?? null,
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
// Legacy methods (for backward compatibility)
|
|
8
55
|
setConnectionState: (connectionState) => {
|
|
9
56
|
set({ connectionState });
|
|
57
|
+
const { activeConnectionUrl } = get();
|
|
58
|
+
if (activeConnectionUrl) {
|
|
59
|
+
get().setConnection(activeConnectionUrl, connectionState);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
setAgentCapabilities: (agentCapabilities) => {
|
|
63
|
+
set({ agentCapabilities });
|
|
64
|
+
const { activeConnectionUrl } = get();
|
|
65
|
+
if (activeConnectionUrl) {
|
|
66
|
+
get().setConnection(activeConnectionUrl, get().connectionState, agentCapabilities);
|
|
67
|
+
}
|
|
10
68
|
},
|
|
11
69
|
setActiveSessionId: (sessionId) => {
|
|
12
70
|
set({ activeSessionId: sessionId });
|
|
@@ -44,5 +102,14 @@ export const useAcpStore = create((set, get) => ({
|
|
|
44
102
|
const { activeSessionId, notifications } = get();
|
|
45
103
|
return activeSessionId ? notifications[activeSessionId] || [] : [];
|
|
46
104
|
},
|
|
105
|
+
// Getters
|
|
106
|
+
getActiveConnection: () => {
|
|
107
|
+
const { activeConnectionUrl, connections } = get();
|
|
108
|
+
return activeConnectionUrl ? connections[activeConnectionUrl] || null : null;
|
|
109
|
+
},
|
|
110
|
+
getConnection: (url) => {
|
|
111
|
+
const { connections } = get();
|
|
112
|
+
return connections[url] || null;
|
|
113
|
+
},
|
|
47
114
|
}));
|
|
48
115
|
//# sourceMappingURL=atoms.js.map
|
package/dist/state/atoms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atoms.js","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"atoms.js","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AA+CjC,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACzD,yBAAyB;IACzB,WAAW,EAAE,EAAE;IACf,mBAAmB,EAAE,IAAI;IAEzB,eAAe;IACf,eAAe,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;IAC3C,iBAAiB,EAAE,IAAI;IAEvB,gBAAgB;IAChB,eAAe,EAAE,IAAI;IACrB,aAAa,EAAE,EAAE;IAEjB,wBAAwB;IACxB,aAAa,EAAE,CACb,GAAkB,EAClB,KAAsB,EACtB,YAAuC,EACvC,EAAE;QACF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACb,WAAW,EAAE;gBACX,GAAG,IAAI,CAAC,WAAW;gBACnB,CAAC,GAAG,CAAC,EAAE;oBACL,GAAG;oBACH,KAAK;oBACL,YAAY,EAAE,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,YAAY,IAAI,IAAI;iBAC1E;aACF;YACD,uDAAuD;YACvD,GAAG,CAAC,IAAI,CAAC,mBAAmB,KAAK,GAAG,IAAI;gBACtC,eAAe,EAAE,KAAK;gBACtB,iBAAiB,EAAE,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,YAAY,IAAI,IAAI;aAC/E,CAAC;SACH,CAAC,CAAC,CAAC;IACN,CAAC;IAED,mBAAmB,EAAE,CAAC,GAAyB,EAAE,EAAE;QACjD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACX,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5D,OAAO;gBACL,mBAAmB,EAAE,GAAG;gBACxB,eAAe,EAAE,gBAAgB,EAAE,KAAK,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE;gBACtE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,IAAI,IAAI;aAC1D,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,EAAE,CAAC,GAAkB,EAAE,EAAE;QACvC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACX,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/C,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;YACxF,MAAM,gBAAgB,GAAG,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5E,OAAO;gBACL,WAAW,EAAE,cAAc;gBAC3B,mBAAmB,EAAE,YAAY;gBACjC,eAAe,EAAE,gBAAgB,EAAE,KAAK,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE;gBACtE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,IAAI,IAAI;aAC1D,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,8CAA8C;IAC9C,kBAAkB,EAAE,CAAC,eAAgC,EAAE,EAAE;QACvD,GAAG,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;QACzB,MAAM,EAAE,mBAAmB,EAAE,GAAG,GAAG,EAAE,CAAC;QACtC,IAAI,mBAAmB,EAAE,CAAC;YACxB,GAAG,EAAE,CAAC,aAAa,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,oBAAoB,EAAE,CAAC,iBAA2C,EAAE,EAAE;QACpE,GAAG,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC3B,MAAM,EAAE,mBAAmB,EAAE,GAAG,GAAG,EAAE,CAAC;QACtC,IAAI,mBAAmB,EAAE,CAAC;YACxB,GAAG,EAAE,CAAC,aAAa,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,kBAAkB,EAAE,CAAC,SAA2B,EAAE,EAAE;QAClD,GAAG,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,eAAe,EAAE,CAAC,YAAmC,EAAE,EAAE;QACvD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC;QACpC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,MAAM,eAAe,GAAsB;YACzC,GAAG,YAAY;YACf,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACpC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,MAAM,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG;YACd,GAAG,OAAO;YACV,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,oBAAoB,EAAE,eAAe,CAAC;SACxD,CAAC;QACF,GAAG,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,kBAAkB,EAAE,CAAC,SAAqB,EAAE,EAAE;QAC5C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC;YACpC,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1B,GAAG,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,sBAAsB,EAAE,GAAG,EAAE;QAC3B,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,GAAG,EAAE,CAAC;QACjD,OAAO,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,CAAC;IAED,UAAU;IACV,mBAAmB,EAAE,GAAG,EAAE;QACxB,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,GAAG,GAAG,EAAE,CAAC;QACnD,OAAO,mBAAmB,CAAC,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,CAAC;IAED,aAAa,EAAE,CAAC,GAAW,EAAE,EAAE;QAC7B,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAClC,CAAC;CACF,CAAC,CAAC,CAAC","sourcesContent":["import type { AgentCapabilities } from \"@zed-industries/agent-client-protocol\";\nimport { create } from \"zustand\";\nimport type {\n Connection,\n ConnectionState,\n ConnectionUrl,\n NotificationEvent,\n NotificationEventData,\n SessionId,\n} from \"./types.js\";\n\ninterface AcpState {\n // Multi-connection support\n connections: Record<ConnectionUrl, Connection>;\n activeConnectionUrl: ConnectionUrl | null;\n\n // Legacy single-connection interface (for backward compatibility)\n connectionState: ConnectionState;\n agentCapabilities: AgentCapabilities | null;\n\n // Session management\n activeSessionId: SessionId | null;\n notifications: Record<SessionId, NotificationEvent[]>;\n\n // Connection management\n setConnection: (\n url: ConnectionUrl,\n state: ConnectionState,\n capabilities?: AgentCapabilities | null,\n ) => void;\n setActiveConnection: (url: ConnectionUrl | null) => void;\n removeConnection: (url: ConnectionUrl) => void;\n\n // Legacy methods (for backward compatibility)\n setConnectionState: (state: ConnectionState) => void;\n setAgentCapabilities: (capabilities: AgentCapabilities | null) => void;\n\n // Session methods\n setActiveSessionId: (sessionId: SessionId | null) => void;\n addNotification: (notification: NotificationEventData) => void;\n clearNotifications: (sessionId?: SessionId) => void;\n getActiveNotifications: () => NotificationEvent[];\n\n // Getters\n getActiveConnection: () => Connection | null;\n getConnection: (url: ConnectionUrl) => Connection | null;\n}\n\nexport const useAcpStore = create<AcpState>((set, get) => ({\n // Multi-connection state\n connections: {},\n activeConnectionUrl: null,\n\n // Legacy state\n connectionState: { status: \"disconnected\" },\n agentCapabilities: null,\n\n // Session state\n activeSessionId: null,\n notifications: {},\n\n // Connection management\n setConnection: (\n url: ConnectionUrl,\n state: ConnectionState,\n capabilities?: AgentCapabilities | null,\n ) => {\n set((prev) => ({\n connections: {\n ...prev.connections,\n [url]: {\n url,\n state,\n capabilities: capabilities ?? prev.connections[url]?.capabilities ?? null,\n },\n },\n // Update legacy state if this is the active connection\n ...(prev.activeConnectionUrl === url && {\n connectionState: state,\n agentCapabilities: capabilities ?? prev.connections[url]?.capabilities ?? null,\n }),\n }));\n },\n\n setActiveConnection: (url: ConnectionUrl | null) => {\n set((prev) => {\n const activeConnection = url ? prev.connections[url] : null;\n return {\n activeConnectionUrl: url,\n connectionState: activeConnection?.state ?? { status: \"disconnected\" },\n agentCapabilities: activeConnection?.capabilities ?? null,\n };\n });\n },\n\n removeConnection: (url: ConnectionUrl) => {\n set((prev) => {\n const newConnections = { ...prev.connections };\n delete newConnections[url];\n const newActiveUrl = prev.activeConnectionUrl === url ? null : prev.activeConnectionUrl;\n const activeConnection = newActiveUrl ? newConnections[newActiveUrl] : null;\n return {\n connections: newConnections,\n activeConnectionUrl: newActiveUrl,\n connectionState: activeConnection?.state ?? { status: \"disconnected\" },\n agentCapabilities: activeConnection?.capabilities ?? null,\n };\n });\n },\n\n // Legacy methods (for backward compatibility)\n setConnectionState: (connectionState: ConnectionState) => {\n set({ connectionState });\n const { activeConnectionUrl } = get();\n if (activeConnectionUrl) {\n get().setConnection(activeConnectionUrl, connectionState);\n }\n },\n\n setAgentCapabilities: (agentCapabilities: AgentCapabilities | null) => {\n set({ agentCapabilities });\n const { activeConnectionUrl } = get();\n if (activeConnectionUrl) {\n get().setConnection(activeConnectionUrl, get().connectionState, agentCapabilities);\n }\n },\n\n setActiveSessionId: (sessionId: SessionId | null) => {\n set({ activeSessionId: sessionId });\n },\n\n addNotification: (notification: NotificationEventData) => {\n const current = get().notifications;\n const sessionId = get().activeSessionId;\n if (!sessionId) {\n return;\n }\n const newNotification: NotificationEvent = {\n ...notification,\n id: `${Date.now()}-${Math.random()}`,\n timestamp: Date.now(),\n };\n\n const sessionNotifications = current[sessionId] || [];\n const updated = {\n ...current,\n [sessionId]: [...sessionNotifications, newNotification],\n };\n set({ notifications: updated });\n },\n\n clearNotifications: (sessionId?: SessionId) => {\n if (sessionId) {\n const current = get().notifications;\n const updated = { ...current };\n delete updated[sessionId];\n set({ notifications: updated });\n } else {\n set({ notifications: {} });\n }\n },\n\n getActiveNotifications: () => {\n const { activeSessionId, notifications } = get();\n return activeSessionId ? notifications[activeSessionId] || [] : [];\n },\n\n // Getters\n getActiveConnection: () => {\n const { activeConnectionUrl, connections } = get();\n return activeConnectionUrl ? connections[activeConnectionUrl] || null : null;\n },\n\n getConnection: (url: string) => {\n const { connections } = get();\n return connections[url] || null;\n },\n}));\n"]}
|
package/dist/state/types.d.ts
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
|
-
import type { SessionNotification } from "@zed-industries/agent-client-protocol";
|
|
1
|
+
import type { AgentCapabilities, SessionNotification } from "@zed-industries/agent-client-protocol";
|
|
2
|
+
export type AgentId = string & {
|
|
3
|
+
__brand: "AgentId";
|
|
4
|
+
};
|
|
5
|
+
export type SessionId = string & {
|
|
6
|
+
__brand: "SessionId";
|
|
7
|
+
};
|
|
8
|
+
export type ConnectionUrl = string;
|
|
2
9
|
export interface ConnectionState {
|
|
3
10
|
status: "disconnected" | "connecting" | "connected" | "error";
|
|
4
11
|
error?: string;
|
|
5
12
|
url?: string;
|
|
6
13
|
}
|
|
14
|
+
export interface Connection {
|
|
15
|
+
url: string;
|
|
16
|
+
state: ConnectionState;
|
|
17
|
+
capabilities: AgentCapabilities | null;
|
|
18
|
+
}
|
|
7
19
|
export type NotificationEventData = {
|
|
8
20
|
type: "session_notification";
|
|
9
21
|
data: SessionNotification;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAEpG,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC;AACtD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAC1D,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AAEnC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,eAAe,CAAC;IACvB,YAAY,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,MAAM,qBAAqB,GAC7B;IACE,IAAI,EAAE,sBAAsB,CAAC;IAC7B,IAAI,EAAE,mBAAmB,CAAC;CAC3B,GACD;IACE,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,eAAe,CAAC;CACvB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,KAAK,CAAC;CACb,CAAC;AAEN,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,qBAAqB,CAAC"}
|
package/dist/state/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SessionNotification } from \"@zed-industries/agent-client-protocol\";\n\nexport interface ConnectionState {\n status: \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n error?: string;\n url?: string;\n}\n\nexport type NotificationEventData =\n | {\n type: \"session_notification\";\n data: SessionNotification;\n }\n | {\n type: \"connection_change\";\n data: ConnectionState;\n }\n | {\n type: \"error\";\n data: Error;\n };\n\nexport type NotificationEvent = {\n id: string;\n timestamp: number;\n} & NotificationEventData;\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentCapabilities, SessionNotification } from \"@zed-industries/agent-client-protocol\";\n\nexport type AgentId = string & { __brand: \"AgentId\" };\nexport type SessionId = string & { __brand: \"SessionId\" };\nexport type ConnectionUrl = string;\n\nexport interface ConnectionState {\n status: \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n error?: string;\n url?: string;\n}\n\nexport interface Connection {\n url: string;\n state: ConnectionState;\n capabilities: AgentCapabilities | null;\n}\n\nexport type NotificationEventData =\n | {\n type: \"session_notification\";\n data: SessionNotification;\n }\n | {\n type: \"connection_change\";\n data: ConnectionState;\n }\n | {\n type: \"error\";\n data: Error;\n };\n\nexport type NotificationEvent = {\n id: string;\n timestamp: number;\n} & NotificationEventData;\n"]}
|