use-acp 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/acp-client.d.ts +2 -2
- package/dist/client/acp-client.d.ts.map +1 -1
- package/dist/client/acp-client.js +3 -2
- package/dist/client/acp-client.js.map +1 -1
- package/dist/client/types.d.ts +1 -1
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js.map +1 -1
- package/dist/components/streams.d.ts.map +1 -1
- package/dist/components/streams.js +12 -39
- package/dist/components/streams.js.map +1 -1
- package/dist/hooks/use-acp-client.d.ts +3 -1
- package/dist/hooks/use-acp-client.d.ts.map +1 -1
- package/dist/hooks/use-acp-client.js +22 -5
- package/dist/hooks/use-acp-client.js.map +1 -1
- package/dist/state/atoms.d.ts +4 -1
- package/dist/state/atoms.d.ts.map +1 -1
- package/dist/state/atoms.js +19 -0
- package/dist/state/atoms.js.map +1 -1
- package/dist/state/types.d.ts +1 -1
- package/dist/state/types.d.ts.map +1 -1
- package/dist/state/types.js.map +1 -1
- package/dist/state/utils.d.ts +1 -1
- package/dist/state/utils.d.ts.map +1 -1
- package/dist/state/utils.js.map +1 -1
- package/dist/utils/never.js +1 -1
- package/dist/utils/never.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
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";
|
|
1
|
+
import type { Agent, AuthenticateRequest, CancelNotification, Client, InitializeRequest, InitializeResponse, LoadSessionRequest, LoadSessionResponse, NewSessionRequest, NewSessionResponse, PromptRequest, PromptResponse, ReadTextFileRequest, ReadTextFileResponse, RequestPermissionRequest, RequestPermissionResponse, SessionNotification, WriteTextFileRequest, WriteTextFileResponse } from "@zed-industries/agent-client-protocol/typescript/acp.js";
|
|
2
2
|
export interface AcpClientOptions {
|
|
3
3
|
onRequestPermission: (params: IdentifiedPermissionRequest) => void;
|
|
4
4
|
onSessionNotification: (params: SessionNotification) => void;
|
|
@@ -33,7 +33,7 @@ export declare class ListeningAgent implements Agent {
|
|
|
33
33
|
constructor(agent: Agent, callbacks: Partial<ListeningAgentCallbacks>);
|
|
34
34
|
initialize(params: InitializeRequest): Promise<InitializeResponse>;
|
|
35
35
|
newSession(params: NewSessionRequest): Promise<NewSessionResponse>;
|
|
36
|
-
loadSession(params: LoadSessionRequest): Promise<
|
|
36
|
+
loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse>;
|
|
37
37
|
authenticate(params: AuthenticateRequest): Promise<void>;
|
|
38
38
|
prompt(params: PromptRequest): Promise<PromptResponse>;
|
|
39
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,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,
|
|
1
|
+
{"version":3,"file":"acp-client.d.ts","sourceRoot":"","sources":["../../src/client/acp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,8 +68,9 @@ export class ListeningAgent {
|
|
|
68
68
|
async loadSession(params) {
|
|
69
69
|
this.callbacks.on_loadSession_start?.(params);
|
|
70
70
|
if (this.agent.loadSession) {
|
|
71
|
-
return this.agent.loadSession(params).then(() => {
|
|
72
|
-
this.callbacks.on_loadSession_response?.(
|
|
71
|
+
return this.agent.loadSession(params).then((response) => {
|
|
72
|
+
this.callbacks.on_loadSession_response?.(response, params);
|
|
73
|
+
return response;
|
|
73
74
|
});
|
|
74
75
|
}
|
|
75
76
|
throw new Error("Agent does not support loadSession capability");
|
|
@@ -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 LoadSessionResponse,\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/typescript/acp.js\";\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<LoadSessionResponse> {\n this.callbacks.on_loadSession_start?.(params);\n if (this.agent.loadSession) {\n return this.agent.loadSession(params).then((response) => {\n this.callbacks.on_loadSession_response?.(response, params);\n return response;\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"]}
|
package/dist/client/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SessionNotification, ToolCallContent } from "@zed-industries/agent-client-protocol";
|
|
1
|
+
import type { SessionNotification, ToolCallContent } from "@zed-industries/agent-client-protocol/typescript/acp.js";
|
|
2
2
|
export type SessionUpdate = SessionNotification["update"];
|
|
3
3
|
export type AgentMessageChunkNotification = Extract<SessionUpdate, {
|
|
4
4
|
sessionUpdate: "agent_message_chunk";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EAChB,MAAM,yDAAyD,CAAC;AAEjE,MAAM,MAAM,aAAa,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAE1D,MAAM,MAAM,6BAA6B,GAAG,OAAO,CACjD,aAAa,EACb;IAAE,aAAa,EAAE,qBAAqB,CAAA;CAAE,CACzC,CAAC;AACF,MAAM,MAAM,6BAA6B,GAAG,OAAO,CACjD,aAAa,EACb;IAAE,aAAa,EAAE,qBAAqB,CAAA;CAAE,CACzC,CAAC;AACF,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE;IAAE,aAAa,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AACnF,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,EAAE;IAAE,aAAa,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC;AAC3F,MAAM,MAAM,4BAA4B,GAAG,OAAO,CAChD,aAAa,EACb;IAAE,aAAa,EAAE,oBAAoB,CAAA;CAAE,CACxC,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACjF,MAAM,MAAM,mBAAmB,GAAG,6BAA6B,CAAC,SAAS,CAAC,CAAC;AAC3E,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC"}
|
package/dist/client/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n SessionNotification,\n ToolCallContent,\n} from \"@zed-industries/agent-client-protocol/typescript/acp.js\";\n\nexport type SessionUpdate = SessionNotification[\"update\"];\n\nexport type AgentMessageChunkNotification = Extract<\n SessionUpdate,\n { sessionUpdate: \"agent_message_chunk\" }\n>;\nexport type AgentThoughtChunkNotification = Extract<\n SessionUpdate,\n { sessionUpdate: \"agent_thought_chunk\" }\n>;\nexport type ToolCallStart = Extract<SessionUpdate, { sessionUpdate: \"tool_call\" }>;\nexport type ToolCallUpdate = Extract<SessionUpdate, { sessionUpdate: \"tool_call_update\" }>;\nexport type UserMessageChunkNotification = Extract<\n SessionUpdate,\n { sessionUpdate: \"user_message_chunk\" }\n>;\nexport type PlanNotification = Extract<SessionUpdate, { sessionUpdate: \"plan\" }>;\nexport type NotificationContent = AgentMessageChunkNotification[\"content\"];\nexport type ToolCallDiff = Extract<ToolCallContent, { type: \"diff\" }>;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../../src/components/streams.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtE,eAAO,MAAM,qBAAqB;;
|
|
1
|
+
{"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../../src/components/streams.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtE,eAAO,MAAM,qBAAqB;;qBAqF220oC,CAAC;;;;;CArFh10oC,CAAC;AAC/D,eAAO,MAAM,qBAAqB;;;CAA4B,CAAC;AAE/D,wBAAgB,kBAAkB,IAAI,OAAO,CAK5C;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc,CAAC,UAAU,CAAC;IACpE,MAAM,EAAE,MAAM,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,MAAM,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;CAC9E;AAED,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,SAAS,GAAG,cAAc,CAAC,UAAU,CAAC,CAcvF;AAED,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,SAAS,GAAG,kBAAkB,CAgD/E"}
|
|
@@ -46,48 +46,21 @@ export function createWebSocketReadableStream(ws) {
|
|
|
46
46
|
ws.close();
|
|
47
47
|
},
|
|
48
48
|
});
|
|
49
|
-
//
|
|
50
|
-
const chunks = [];
|
|
51
|
-
let streamEnded = false;
|
|
52
|
-
let readerStarted = false;
|
|
53
|
-
// Start reading the stream once
|
|
54
|
-
const startReading = () => {
|
|
55
|
-
if (readerStarted)
|
|
56
|
-
return;
|
|
57
|
-
readerStarted = true;
|
|
58
|
-
const reader = stream.getReader();
|
|
59
|
-
(async () => {
|
|
60
|
-
try {
|
|
61
|
-
while (true) {
|
|
62
|
-
const { value, done } = await reader.read();
|
|
63
|
-
if (done) {
|
|
64
|
-
streamEnded = true;
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
chunks.push(value);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
finally {
|
|
71
|
-
reader.releaseLock();
|
|
72
|
-
}
|
|
73
|
-
})().catch(console.error);
|
|
74
|
-
};
|
|
49
|
+
// Add .values() and [Symbol.asyncIterator]
|
|
75
50
|
const values = async function* () {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
51
|
+
const reader = stream.getReader();
|
|
52
|
+
try {
|
|
53
|
+
while (true) {
|
|
54
|
+
const { value, done } = await reader.read();
|
|
55
|
+
if (done)
|
|
56
|
+
break;
|
|
57
|
+
yield value;
|
|
83
58
|
}
|
|
84
|
-
// If stream ended, we're done
|
|
85
|
-
if (streamEnded)
|
|
86
|
-
break;
|
|
87
|
-
// Wait a bit for more chunks
|
|
88
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
89
59
|
}
|
|
90
|
-
|
|
60
|
+
finally {
|
|
61
|
+
reader.releaseLock();
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
91
64
|
};
|
|
92
65
|
// Attach methods
|
|
93
66
|
stream.values = values;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../../src/components/streams.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC,cAAc,CAAC;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC,cAAc,CAAC;AAE/D,MAAM,UAAU,kBAAkB;IAChC,OAAO,CACL,OAAO,UAAU,CAAC,cAAc,KAAK,WAAW;QAChD,OAAO,UAAU,CAAC,cAAc,KAAK,WAAW,CACjD,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,6BAA6B,CAAC,EAAa;IACzD,OAAO,IAAI,qBAAqB,CAAC;QAC/B,KAAK,CAAC,KAAiB;YACrB,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACrC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QACD,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;QACD,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,EAAa;IACzD,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAa;QACnD,KAAK,CAAC,UAAU;YACd,EAAE,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;gBACvB,IAAI,KAAK,CAAC,IAAI,YAAY,WAAW,EAAE,CAAC;oBACtC,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjD,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,YAAY,UAAU,EAAE,CAAC;oBAC5C,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;oBAClC,qDAAqD;oBACrD,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC,CAAC;YAEF,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;gBAChB,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC,CAAC;YAEF,EAAE,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;gBACrB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC,CAAC;QACJ,CAAC;QACD,MAAM;YACJ,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAuB,CAAC;IAEzB,
|
|
1
|
+
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../../src/components/streams.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC,cAAc,CAAC;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC,cAAc,CAAC;AAE/D,MAAM,UAAU,kBAAkB;IAChC,OAAO,CACL,OAAO,UAAU,CAAC,cAAc,KAAK,WAAW;QAChD,OAAO,UAAU,CAAC,cAAc,KAAK,WAAW,CACjD,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,6BAA6B,CAAC,EAAa;IACzD,OAAO,IAAI,qBAAqB,CAAC;QAC/B,KAAK,CAAC,KAAiB;YACrB,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACrC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QACD,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;QACD,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,EAAa;IACzD,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAa;QACnD,KAAK,CAAC,UAAU;YACd,EAAE,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;gBACvB,IAAI,KAAK,CAAC,IAAI,YAAY,WAAW,EAAE,CAAC;oBACtC,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjD,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,YAAY,UAAU,EAAE,CAAC;oBAC5C,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;oBAClC,qDAAqD;oBACrD,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC,CAAC;YAEF,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;gBAChB,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC,CAAC;YAEF,EAAE,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;gBACrB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC,CAAC;QACJ,CAAC;QACD,MAAM;YACJ,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAuB,CAAC;IAEzB,2CAA2C;IAC3C,MAAM,MAAM,GAAG,KAAK,SAAS,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAChB,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,iBAAiB;IACjB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;IAEtC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,6BAA6B;AAC7B,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;AACxF,CAAC","sourcesContent":["/**\n * Browser-compatible ReadableStream and WritableStream utilities\n * Uses native browser Streams API instead of Node.js streams\n */\nimport type { ReadableStream, WritableStream } from \"node:stream/web\";\n\nexport const BrowserReadableStream = globalThis.ReadableStream;\nexport const BrowserWritableStream = globalThis.WritableStream;\n\nexport function isStreamsSupported(): boolean {\n return (\n typeof globalThis.ReadableStream !== \"undefined\" &&\n typeof globalThis.WritableStream !== \"undefined\"\n );\n}\n\nexport interface NodeReadableStream extends ReadableStream<Uint8Array> {\n values: () => AsyncGenerator<Uint8Array, undefined, unknown>;\n [Symbol.asyncIterator]: () => AsyncGenerator<Uint8Array, undefined, unknown>;\n}\n\nexport function createWebSocketWritableStream(ws: WebSocket): WritableStream<Uint8Array> {\n return new BrowserWritableStream({\n write(chunk: Uint8Array) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(chunk);\n }\n },\n close() {\n ws.close();\n },\n abort() {\n ws.close();\n },\n });\n}\n\nexport function createWebSocketReadableStream(ws: WebSocket): NodeReadableStream {\n const stream = new BrowserReadableStream<Uint8Array>({\n start(controller) {\n ws.onmessage = (event) => {\n if (event.data instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(event.data));\n } else if (event.data instanceof Uint8Array) {\n controller.enqueue(event.data);\n } else {\n const encoder = new TextEncoder();\n // HACK append newline b/c of a bug in the ACP server\n controller.enqueue(encoder.encode(`${event.data}\\n`));\n }\n };\n\n ws.onclose = () => {\n controller.close();\n };\n\n ws.onerror = (error) => {\n controller.error(error);\n };\n },\n cancel() {\n ws.close();\n },\n }) as NodeReadableStream;\n\n // Add .values() and [Symbol.asyncIterator]\n const values = async function* () {\n const reader = stream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n yield value;\n }\n } finally {\n reader.releaseLock();\n }\n return undefined;\n };\n\n // Attach methods\n stream.values = values;\n stream[Symbol.asyncIterator] = values;\n\n return stream;\n}\n\n// Polyfill check and warning\nif (!isStreamsSupported()) {\n console.warn(\"Streams API not supported in this browser. Consider using a polyfill.\");\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Agent, type AgentCapabilities, type McpServer, type RequestPermissionResponse } from "@zed-industries/agent-client-protocol";
|
|
1
|
+
import { type Agent, type AgentCapabilities, type AvailableCommand, type McpServer, type RequestPermissionResponse, type SessionModeState } from "@zed-industries/agent-client-protocol/typescript/acp.js";
|
|
2
2
|
import { type AcpClientOptions, type IdentifiedPermissionRequest } from "../client/acp-client.js";
|
|
3
3
|
import type { ConnectionState, NotificationEvent, SessionId } from "../state/types.js";
|
|
4
4
|
export interface UseAcpClientOptions {
|
|
@@ -26,6 +26,8 @@ export interface UseAcpClientReturn {
|
|
|
26
26
|
rejectPermission: (error: Error) => void;
|
|
27
27
|
agent: Agent | null;
|
|
28
28
|
agentCapabilities: AgentCapabilities | null;
|
|
29
|
+
availableCommands: AvailableCommand[];
|
|
30
|
+
sessionMode: SessionModeState | null | undefined;
|
|
29
31
|
}
|
|
30
32
|
export declare function useAcpClient(options: UseAcpClientOptions): UseAcpClientReturn;
|
|
31
33
|
//# 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,EACV,KAAK,iBAAiB,
|
|
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,EACtB,KAAK,gBAAgB,EAErB,KAAK,SAAS,EACd,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EAEtB,MAAM,yDAAyD,CAAC;AAEjE,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;IAG5C,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAGtC,WAAW,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;CAClD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CA+N7E"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ClientSideConnection, } from "@zed-industries/agent-client-protocol";
|
|
1
|
+
import { ClientSideConnection, } from "@zed-industries/agent-client-protocol/typescript/acp.js";
|
|
2
2
|
import { useEffect, useRef, useState } from "react";
|
|
3
3
|
import { AcpClient, ListeningAgent, } from "../client/acp-client.js";
|
|
4
4
|
import { MultiWebSocketManager } from "../connection/websocket-manager.js";
|
|
@@ -6,11 +6,12 @@ import { useAcpStore } from "../state/atoms.js";
|
|
|
6
6
|
import { useEventCallback } from "./use-event-callback.js";
|
|
7
7
|
export function useAcpClient(options) {
|
|
8
8
|
const { wsUrl, autoConnect = true, reconnectAttempts = 3, reconnectDelay = 2000, clientOptions = {}, } = options;
|
|
9
|
-
const { getConnection, notifications, activeSessionId, agentCapabilities, setActiveSessionId, setConnection, setActiveConnection, addNotification, clearNotifications, } = useAcpStore();
|
|
9
|
+
const { getConnection, notifications, activeSessionId, agentCapabilities, sessionModes, setActiveModeId, setModeState, setActiveSessionId, setConnection, setActiveConnection, addNotification, clearNotifications, } = useAcpStore();
|
|
10
10
|
// State
|
|
11
11
|
const [pendingPermission, setPendingPermission] = useState(null);
|
|
12
12
|
const [agent, setAgent] = useState(null);
|
|
13
13
|
const [isSessionLoading, setIsSessionLoading] = useState(false);
|
|
14
|
+
const [availableCommands, setAvailableCommands] = useState([]);
|
|
14
15
|
// Refs
|
|
15
16
|
const multiWsManagerRef = useRef(null);
|
|
16
17
|
const acpClientRef = useRef(null);
|
|
@@ -35,6 +36,10 @@ export function useAcpClient(options) {
|
|
|
35
36
|
type: "session_notification",
|
|
36
37
|
data: notification,
|
|
37
38
|
});
|
|
39
|
+
// Handle available commands updates
|
|
40
|
+
if (notification.update.sessionUpdate === "available_commands_update") {
|
|
41
|
+
setAvailableCommands(notification.update.availableCommands);
|
|
42
|
+
}
|
|
38
43
|
});
|
|
39
44
|
const handleRequestPermission = useEventCallback((params) => {
|
|
40
45
|
setPendingPermission(params);
|
|
@@ -76,11 +81,15 @@ export function useAcpClient(options) {
|
|
|
76
81
|
},
|
|
77
82
|
on_newSession_response: (response) => {
|
|
78
83
|
console.log("[acp] New session created", response);
|
|
79
|
-
|
|
84
|
+
const sessionId = response.sessionId;
|
|
85
|
+
setActiveSessionId(sessionId);
|
|
86
|
+
setModeState(sessionId, response.modes);
|
|
80
87
|
},
|
|
81
|
-
on_loadSession_response: (
|
|
88
|
+
on_loadSession_response: (response, params) => {
|
|
82
89
|
console.log("[acp] Session resumed", params);
|
|
83
|
-
|
|
90
|
+
const sessionId = params.sessionId;
|
|
91
|
+
setActiveSessionId(sessionId);
|
|
92
|
+
setModeState(sessionId, response.modes);
|
|
84
93
|
},
|
|
85
94
|
on_prompt_start: (params) => {
|
|
86
95
|
for (const prompt of params.prompt) {
|
|
@@ -96,6 +105,11 @@ export function useAcpClient(options) {
|
|
|
96
105
|
});
|
|
97
106
|
}
|
|
98
107
|
},
|
|
108
|
+
on_setSessionMode_start: (params) => {
|
|
109
|
+
console.log("[acp] Session mode set", params);
|
|
110
|
+
const sessionId = params.sessionId;
|
|
111
|
+
setActiveModeId(sessionId, params.modeId);
|
|
112
|
+
},
|
|
99
113
|
});
|
|
100
114
|
setAgent(listeningAgent);
|
|
101
115
|
});
|
|
@@ -115,6 +129,7 @@ export function useAcpClient(options) {
|
|
|
115
129
|
}
|
|
116
130
|
if (!url) {
|
|
117
131
|
setPendingPermission(null);
|
|
132
|
+
setAvailableCommands([]);
|
|
118
133
|
// Reset session creation safeguards on full disconnect
|
|
119
134
|
sessionCreationInProgress.current = false;
|
|
120
135
|
lastProcessedSessionId.current = null;
|
|
@@ -162,6 +177,8 @@ export function useAcpClient(options) {
|
|
|
162
177
|
rejectPermission: rejectPermissionCallback,
|
|
163
178
|
agent: agent,
|
|
164
179
|
agentCapabilities,
|
|
180
|
+
sessionMode: activeSessionId ? sessionModes[activeSessionId] : null,
|
|
181
|
+
availableCommands,
|
|
165
182
|
};
|
|
166
183
|
}
|
|
167
184
|
//# 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 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 wsUrl,\n autoConnect = true,\n reconnectAttempts = 3,\n reconnectDelay = 2000,\n clientOptions = {},\n } = options;\n\n const {\n getConnection,\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: reconnectAttempts,\n reconnectDelay: reconnectDelay,\n });\n }\n\n setActiveConnection(wsUrl);\n const { readable, writable } = await multiWsManagerRef.current.connect(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 ...clientOptions,\n onRequestPermission: (params) => {\n clientOptions?.onRequestPermission?.(params);\n handleRequestPermission(params);\n },\n onSessionNotification: (params) => {\n 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 const connectionState = getConnection(wsUrl);\n setConnection(wsUrl, connectionState.state, 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 || 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 (autoConnect) {\n void connect().catch(console.error);\n }\n\n return () => {\n disconnect();\n };\n }, [autoConnect, wsUrl]);\n\n return {\n connect,\n disconnect,\n connectionState: getConnection(wsUrl).state,\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"]}
|
|
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 type AvailableCommand,\n ClientSideConnection,\n type McpServer,\n type RequestPermissionResponse,\n type SessionModeState,\n type SessionNotification,\n} from \"@zed-industries/agent-client-protocol/typescript/acp.js\";\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 // Slash commands support\n availableCommands: AvailableCommand[];\n\n // Session modes\n sessionMode: SessionModeState | null | undefined;\n}\n\nexport function useAcpClient(options: UseAcpClientOptions): UseAcpClientReturn {\n const {\n wsUrl,\n autoConnect = true,\n reconnectAttempts = 3,\n reconnectDelay = 2000,\n clientOptions = {},\n } = options;\n\n const {\n getConnection,\n notifications,\n activeSessionId,\n agentCapabilities,\n sessionModes,\n setActiveModeId,\n setModeState,\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 const [availableCommands, setAvailableCommands] = useState<AvailableCommand[]>([]);\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 // Handle available commands updates\n if (notification.update.sessionUpdate === \"available_commands_update\") {\n setAvailableCommands(notification.update.availableCommands);\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: reconnectAttempts,\n reconnectDelay: reconnectDelay,\n });\n }\n\n setActiveConnection(wsUrl);\n const { readable, writable } = await multiWsManagerRef.current.connect(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 ...clientOptions,\n onRequestPermission: (params) => {\n clientOptions?.onRequestPermission?.(params);\n handleRequestPermission(params);\n },\n onSessionNotification: (params) => {\n clientOptions?.onSessionNotification?.(params);\n handleSessionNotification(params);\n },\n });\n acpClientRef.current = acpClient;\n return acpClient;\n },\n writable,\n readable as ReadableStream<Uint8Array>,\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 const connectionState = getConnection(wsUrl);\n setConnection(wsUrl, connectionState.state, capabilities);\n },\n on_newSession_response: (response) => {\n console.log(\"[acp] New session created\", response);\n const sessionId = response.sessionId as SessionId;\n setActiveSessionId(sessionId);\n setModeState(sessionId, response.modes);\n },\n on_loadSession_response: (response, params) => {\n console.log(\"[acp] Session resumed\", params);\n const sessionId = params.sessionId as SessionId;\n setActiveSessionId(sessionId);\n setModeState(sessionId, response.modes);\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 on_setSessionMode_start: (params) => {\n console.log(\"[acp] Session mode set\", params);\n const sessionId = params.sessionId as SessionId;\n setActiveModeId(sessionId, params.modeId);\n },\n });\n\n setAgent(listeningAgent);\n });\n\n const disconnect = useEventCallback((url?: ConnectionUrl) => {\n const targetUrl = url || 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 setAvailableCommands([]);\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 (autoConnect) {\n void connect().catch(console.error);\n }\n\n return () => {\n disconnect();\n };\n }, [autoConnect, wsUrl]);\n\n return {\n connect,\n disconnect,\n connectionState: getConnection(wsUrl).state,\n activeSessionId,\n notifications: activeSessionId ? notifications[activeSessionId] || [] : [],\n isSessionLoading,\n clearNotifications,\n pendingPermission,\n resolvePermission,\n rejectPermission: rejectPermissionCallback,\n agent: agent,\n agentCapabilities,\n sessionMode: activeSessionId ? sessionModes[activeSessionId] : null,\n availableCommands,\n };\n}\n"]}
|
package/dist/state/atoms.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentCapabilities } from "@zed-industries/agent-client-protocol";
|
|
1
|
+
import type { AgentCapabilities, SessionModeId, SessionModeState } from "@zed-industries/agent-client-protocol/typescript/acp.js";
|
|
2
2
|
import type { Connection, ConnectionState, ConnectionUrl, NotificationEvent, NotificationEventData, SessionId } from "./types.js";
|
|
3
3
|
interface AcpState {
|
|
4
4
|
connections: Record<ConnectionUrl, Connection>;
|
|
@@ -7,12 +7,15 @@ interface AcpState {
|
|
|
7
7
|
agentCapabilities: AgentCapabilities | null;
|
|
8
8
|
activeSessionId: SessionId | null;
|
|
9
9
|
notifications: Record<SessionId, NotificationEvent[]>;
|
|
10
|
+
sessionModes: Record<SessionId, SessionModeState | null | undefined>;
|
|
10
11
|
setConnection: (url: ConnectionUrl, state: ConnectionState, capabilities?: AgentCapabilities | null) => void;
|
|
11
12
|
setActiveConnection: (url: ConnectionUrl | null) => void;
|
|
12
13
|
removeConnection: (url: ConnectionUrl) => void;
|
|
13
14
|
setConnectionState: (state: ConnectionState) => void;
|
|
14
15
|
setAgentCapabilities: (capabilities: AgentCapabilities | null) => void;
|
|
15
16
|
setActiveSessionId: (sessionId: SessionId | null) => void;
|
|
17
|
+
setActiveModeId: (sessionId: SessionId, modeId: SessionModeId | null | undefined) => void;
|
|
18
|
+
setModeState: (sessionId: SessionId, modeState: SessionModeState | null | undefined) => void;
|
|
16
19
|
addNotification: (notification: NotificationEventData) => void;
|
|
17
20
|
clearNotifications: (sessionId?: SessionId) => void;
|
|
18
21
|
getActiveNotifications: () => NotificationEvent[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atoms.d.ts","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"atoms.d.ts","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EACjB,MAAM,yDAAyD,CAAC;AAEjE,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;IACtD,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAGrE,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,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;IAC1F,YAAY,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;IAC7F,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,CAAC;CACnD;AAED,eAAO,MAAM,WAAW,uEAsJrB,CAAC"}
|
package/dist/state/atoms.js
CHANGED
|
@@ -9,6 +9,7 @@ export const useAcpStore = create((set, get) => ({
|
|
|
9
9
|
// Session state
|
|
10
10
|
activeSessionId: null,
|
|
11
11
|
notifications: {},
|
|
12
|
+
sessionModes: {},
|
|
12
13
|
// Connection management
|
|
13
14
|
setConnection: (url, state, capabilities) => {
|
|
14
15
|
set((prev) => ({
|
|
@@ -69,6 +70,24 @@ export const useAcpStore = create((set, get) => ({
|
|
|
69
70
|
setActiveSessionId: (sessionId) => {
|
|
70
71
|
set({ activeSessionId: sessionId });
|
|
71
72
|
},
|
|
73
|
+
setActiveModeId: (sessionId, modeId) => {
|
|
74
|
+
set((prev) => {
|
|
75
|
+
const prevMode = prev.sessionModes[sessionId];
|
|
76
|
+
return {
|
|
77
|
+
sessionModes: {
|
|
78
|
+
...prev.sessionModes,
|
|
79
|
+
[sessionId]: { ...prevMode, currentModeId: modeId },
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
setModeState: (sessionId, modeState) => {
|
|
85
|
+
set((prev) => {
|
|
86
|
+
return {
|
|
87
|
+
sessionModes: { ...prev.sessionModes, [sessionId]: modeState },
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
},
|
|
72
91
|
addNotification: (notification) => {
|
|
73
92
|
const current = get().notifications;
|
|
74
93
|
const sessionId = get().activeSessionId;
|
package/dist/state/atoms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atoms.js","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"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","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;\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] || { url, state: { status: \"disconnected\" }, capabilities: null };\n },\n}));\n"]}
|
|
1
|
+
{"version":3,"file":"atoms.js","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AgentCapabilities,\n SessionModeId,\n SessionModeState,\n} from \"@zed-industries/agent-client-protocol/typescript/acp.js\";\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 sessionModes: Record<SessionId, SessionModeState | null | undefined>;\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 setActiveModeId: (sessionId: SessionId, modeId: SessionModeId | null | undefined) => void;\n setModeState: (sessionId: SessionId, modeState: SessionModeState | null | undefined) => 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;\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 sessionModes: {},\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 setActiveModeId: (sessionId: SessionId, modeId: SessionModeId | null | undefined) => {\n set((prev) => {\n const prevMode = prev.sessionModes[sessionId];\n return {\n sessionModes: {\n ...prev.sessionModes,\n [sessionId]: { ...prevMode, currentModeId: modeId },\n },\n };\n });\n },\n\n setModeState: (sessionId: SessionId, modeState: SessionModeState | null | undefined) => {\n set((prev) => {\n return {\n sessionModes: { ...prev.sessionModes, [sessionId]: modeState },\n };\n });\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] || { url, state: { status: \"disconnected\" }, capabilities: null };\n },\n}));\n"]}
|
package/dist/state/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentCapabilities, SessionNotification } from "@zed-industries/agent-client-protocol";
|
|
1
|
+
import type { AgentCapabilities, SessionNotification } from "@zed-industries/agent-client-protocol/typescript/acp.js";
|
|
2
2
|
export type AgentId = string & {
|
|
3
3
|
__brand: "AgentId";
|
|
4
4
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,yDAAyD,CAAC;AAEjE,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 {
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n AgentCapabilities,\n SessionNotification,\n} from \"@zed-industries/agent-client-protocol/typescript/acp.js\";\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"]}
|
package/dist/state/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ToolCallUpdate } from "@zed-industries/agent-client-protocol";
|
|
1
|
+
import type { ToolCallUpdate } from "@zed-industries/agent-client-protocol/typescript/acp.js";
|
|
2
2
|
import type { NotificationEvent } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Group notifications by their type
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/state/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/state/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAC;AAG9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,EAAE,CAW5F;AAmBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAoBxE"}
|
package/dist/state/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/state/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,aAAkC;IACnE,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5C,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC;YAC3D,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,GAAqC,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;AAEvF,SAAS,UAAU,CAAC,CAAgC,EAAE,CAAoB;IACxE,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,IAAI,CAAC,CAAC,IAAI,KAAK,sBAAsB,IAAI,CAAC,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;QAC3E,yDAAyD;QACzD,IACE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;YAChD,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAChD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAuB;IACpD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA4B,CAAC;IAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1B,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,0BAA0B,CAAC,CAAC;QAC3D,OAAO;YACL,GAAG,KAAK;YACR,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM;YAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;YACxD,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SAC5B,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { ToolCallUpdate } from \"@zed-industries/agent-client-protocol\";\nimport type { SessionUpdate } from \"../client/types.js\";\nimport { invariant } from \"../utils/never.js\";\nimport type { NotificationEvent } from \"./types.js\";\n\n/**\n * Group notifications by their type\n */\nexport function groupNotifications(notifications: NotificationEvent[]): NotificationEvent[][] {\n const result: NotificationEvent[][] = [];\n for (const notification of notifications) {\n const lastGroup = result[result.length - 1];\n if (lastGroup && isSameType(lastGroup.at(0), notification)) {\n lastGroup.push(notification);\n } else {\n result.push([notification]);\n }\n }\n return result;\n}\n\nconst TOOL_TYPES: SessionUpdate[\"sessionUpdate\"][] = [\"tool_call\", \"tool_call_update\"];\n\nfunction isSameType(a: NotificationEvent | undefined, b: NotificationEvent): boolean {\n if (!a) return false;\n if (a.type === \"session_notification\" && b.type === \"session_notification\") {\n // Group tool calls together (may have multiple tool-ids)\n if (\n TOOL_TYPES.includes(a.data.update.sessionUpdate) &&\n TOOL_TYPES.includes(b.data.update.sessionUpdate)\n ) {\n return true;\n }\n return a.data.update.sessionUpdate === b.data.update.sessionUpdate;\n }\n return a.type === b.type;\n}\n\nexport function mergeToolCalls(calls: ToolCallUpdate[]): ToolCallUpdate[] {\n const map = new Map<string, ToolCallUpdate[]>();\n for (const call of calls) {\n if (!map.has(call.toolCallId)) {\n map.set(call.toolCallId, []);\n }\n map.get(call.toolCallId)?.push(call);\n }\n return Array.from(map.values()).map((calls) => {\n const first = calls.at(0);\n invariant(!!first?.toolCallId, \"Tool call ID is required\");\n return {\n ...first,\n toolCallId: first.toolCallId,\n status: calls.at(-1)?.status,\n rawOutput: Object.assign({}, ...calls.map((call) => call.rawOutput)),\n locations: calls.flatMap((call) => call.locations || []),\n content: calls.flatMap((call) => call.content || []),\n } satisfies ToolCallUpdate;\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/state/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToolCallUpdate } from \"@zed-industries/agent-client-protocol/typescript/acp.js\";\nimport type { SessionUpdate } from \"../client/types.js\";\nimport { invariant } from \"../utils/never.js\";\nimport type { NotificationEvent } from \"./types.js\";\n\n/**\n * Group notifications by their type\n */\nexport function groupNotifications(notifications: NotificationEvent[]): NotificationEvent[][] {\n const result: NotificationEvent[][] = [];\n for (const notification of notifications) {\n const lastGroup = result[result.length - 1];\n if (lastGroup && isSameType(lastGroup.at(0), notification)) {\n lastGroup.push(notification);\n } else {\n result.push([notification]);\n }\n }\n return result;\n}\n\nconst TOOL_TYPES: SessionUpdate[\"sessionUpdate\"][] = [\"tool_call\", \"tool_call_update\"];\n\nfunction isSameType(a: NotificationEvent | undefined, b: NotificationEvent): boolean {\n if (!a) return false;\n if (a.type === \"session_notification\" && b.type === \"session_notification\") {\n // Group tool calls together (may have multiple tool-ids)\n if (\n TOOL_TYPES.includes(a.data.update.sessionUpdate) &&\n TOOL_TYPES.includes(b.data.update.sessionUpdate)\n ) {\n return true;\n }\n return a.data.update.sessionUpdate === b.data.update.sessionUpdate;\n }\n return a.type === b.type;\n}\n\nexport function mergeToolCalls(calls: ToolCallUpdate[]): ToolCallUpdate[] {\n const map = new Map<string, ToolCallUpdate[]>();\n for (const call of calls) {\n if (!map.has(call.toolCallId)) {\n map.set(call.toolCallId, []);\n }\n map.get(call.toolCallId)?.push(call);\n }\n return Array.from(map.values()).map((calls) => {\n const first = calls.at(0);\n invariant(!!first?.toolCallId, \"Tool call ID is required\");\n return {\n ...first,\n toolCallId: first.toolCallId,\n status: calls.at(-1)?.status,\n rawOutput: Object.assign({}, ...calls.map((call) => call.rawOutput)),\n locations: calls.flatMap((call) => call.locations || []),\n content: calls.flatMap((call) => call.content || []),\n } satisfies ToolCallUpdate;\n });\n}\n"]}
|
package/dist/utils/never.js
CHANGED
package/dist/utils/never.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"never.js","sourceRoot":"","sources":["../../src/utils/never.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,KAAY;IACnC,
|
|
1
|
+
{"version":3,"file":"never.js","sourceRoot":"","sources":["../../src/utils/never.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,KAAY;IACnC,OAAO,CAAC,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAkB,EAAE,OAAe;IAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC","sourcesContent":["export function logNever(value: never): void {\n console.error(`Unexpected value: ${value}`);\n}\n\nexport function invariant(condition: boolean, message: string): asserts condition {\n if (!condition) {\n throw new Error(message);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "use-acp",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
]
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@zed-industries/agent-client-protocol": "^0.
|
|
66
|
+
"@zed-industries/agent-client-protocol": "^0.3.0",
|
|
67
67
|
"zustand": "^5.0.2"
|
|
68
68
|
},
|
|
69
69
|
"scripts": {
|