use-acp 0.1.2 → 0.1.4
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/components/streams.d.ts.map +1 -1
- package/dist/components/streams.js +39 -12
- package/dist/components/streams.js.map +1 -1
- package/dist/hooks/use-acp-client.d.ts.map +1 -1
- package/dist/hooks/use-acp-client.js +16 -14
- package/dist/hooks/use-acp-client.js.map +1 -1
- package/dist/state/atoms.d.ts +1 -1
- package/dist/state/atoms.d.ts.map +1 -1
- package/dist/state/atoms.js +1 -1
- package/dist/state/atoms.js.map +1 -1
- package/package.json +1 -1
|
@@ -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;;qBAsHsnzoC,CAAC;;;;;CAtH3lzoC,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,CAiF/E"}
|
|
@@ -46,21 +46,48 @@ export function createWebSocketReadableStream(ws) {
|
|
|
46
46
|
ws.close();
|
|
47
47
|
},
|
|
48
48
|
});
|
|
49
|
-
//
|
|
50
|
-
const
|
|
49
|
+
// Simple caching: buffer all chunks in memory
|
|
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;
|
|
51
58
|
const reader = stream.getReader();
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
+
}
|
|
58
69
|
}
|
|
70
|
+
finally {
|
|
71
|
+
reader.releaseLock();
|
|
72
|
+
}
|
|
73
|
+
})().catch(console.error);
|
|
74
|
+
};
|
|
75
|
+
const values = async function* () {
|
|
76
|
+
startReading();
|
|
77
|
+
let index = 0;
|
|
78
|
+
while (true) {
|
|
79
|
+
// Yield any chunks we have
|
|
80
|
+
while (index < chunks.length) {
|
|
81
|
+
yield chunks[index];
|
|
82
|
+
index++;
|
|
83
|
+
}
|
|
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));
|
|
59
89
|
}
|
|
60
|
-
|
|
61
|
-
reader.releaseLock();
|
|
62
|
-
}
|
|
63
|
-
return undefined;
|
|
90
|
+
return;
|
|
64
91
|
};
|
|
65
92
|
// Attach methods
|
|
66
93
|
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":"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","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 // Simple caching: buffer all chunks in memory\n const chunks: Uint8Array[] = [];\n let streamEnded = false;\n let readerStarted = false;\n\n // Start reading the stream once\n const startReading = () => {\n if (readerStarted) return;\n readerStarted = true;\n\n const reader = stream.getReader();\n (async () => {\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n streamEnded = true;\n break;\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n })().catch(console.error);\n };\n\n const values = async function* (): AsyncGenerator<Uint8Array, undefined, unknown> {\n startReading();\n let index = 0;\n\n while (true) {\n // Yield any chunks we have\n while (index < chunks.length) {\n yield chunks[index]!;\n index++;\n }\n\n // If stream ended, we're done\n if (streamEnded) break;\n\n // Wait a bit for more chunks\n await new Promise((resolve) => setTimeout(resolve, 10));\n }\n\n return;\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 +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,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,
|
|
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,CA0M7E"}
|
|
@@ -5,7 +5,8 @@ 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 {
|
|
8
|
+
const { wsUrl, autoConnect = true, reconnectAttempts = 3, reconnectDelay = 2000, clientOptions = {}, } = options;
|
|
9
|
+
const { getConnection, notifications, activeSessionId, agentCapabilities, setActiveSessionId, setConnection, setActiveConnection, addNotification, clearNotifications, } = useAcpStore();
|
|
9
10
|
// State
|
|
10
11
|
const [pendingPermission, setPendingPermission] = useState(null);
|
|
11
12
|
const [agent, setAgent] = useState(null);
|
|
@@ -43,23 +44,23 @@ export function useAcpClient(options) {
|
|
|
43
44
|
multiWsManagerRef.current = new MultiWebSocketManager({
|
|
44
45
|
onConnectionStateChange: handleConnectionStateChange,
|
|
45
46
|
onError: handleError,
|
|
46
|
-
reconnectAttempts:
|
|
47
|
-
reconnectDelay:
|
|
47
|
+
reconnectAttempts: reconnectAttempts,
|
|
48
|
+
reconnectDelay: reconnectDelay,
|
|
48
49
|
});
|
|
49
50
|
}
|
|
50
|
-
setActiveConnection(
|
|
51
|
-
const { readable, writable } = await multiWsManagerRef.current.connect(
|
|
51
|
+
setActiveConnection(wsUrl);
|
|
52
|
+
const { readable, writable } = await multiWsManagerRef.current.connect(wsUrl);
|
|
52
53
|
// Initialize the connection
|
|
53
54
|
const agent = new ClientSideConnection((agent) => {
|
|
54
55
|
// Initialize the ACP client
|
|
55
56
|
const acpClient = new AcpClient(agent, {
|
|
56
|
-
...
|
|
57
|
+
...clientOptions,
|
|
57
58
|
onRequestPermission: (params) => {
|
|
58
|
-
|
|
59
|
+
clientOptions?.onRequestPermission?.(params);
|
|
59
60
|
handleRequestPermission(params);
|
|
60
61
|
},
|
|
61
62
|
onSessionNotification: (params) => {
|
|
62
|
-
|
|
63
|
+
clientOptions?.onSessionNotification?.(params);
|
|
63
64
|
handleSessionNotification(params);
|
|
64
65
|
},
|
|
65
66
|
});
|
|
@@ -70,7 +71,8 @@ export function useAcpClient(options) {
|
|
|
70
71
|
on_initialize_response: (response) => {
|
|
71
72
|
const capabilities = response.agentCapabilities;
|
|
72
73
|
console.log("[acp] Agent capabilities", capabilities);
|
|
73
|
-
|
|
74
|
+
const connectionState = getConnection(wsUrl);
|
|
75
|
+
setConnection(wsUrl, connectionState.state, capabilities);
|
|
74
76
|
},
|
|
75
77
|
on_newSession_response: (response) => {
|
|
76
78
|
console.log("[acp] New session created", response);
|
|
@@ -98,7 +100,7 @@ export function useAcpClient(options) {
|
|
|
98
100
|
setAgent(listeningAgent);
|
|
99
101
|
});
|
|
100
102
|
const disconnect = useEventCallback((url) => {
|
|
101
|
-
const targetUrl = url ||
|
|
103
|
+
const targetUrl = url || wsUrl;
|
|
102
104
|
if (multiWsManagerRef.current) {
|
|
103
105
|
if (url) {
|
|
104
106
|
multiWsManagerRef.current.disconnect(url);
|
|
@@ -140,17 +142,17 @@ export function useAcpClient(options) {
|
|
|
140
142
|
// Auto-connect on mount if specified
|
|
141
143
|
// biome-ignore lint/correctness/useExhaustiveDependencies: Don't include connect/disconnect to avoid re-connecting on every render
|
|
142
144
|
useEffect(() => {
|
|
143
|
-
if (
|
|
144
|
-
connect().catch(console.error);
|
|
145
|
+
if (autoConnect) {
|
|
146
|
+
void connect().catch(console.error);
|
|
145
147
|
}
|
|
146
148
|
return () => {
|
|
147
149
|
disconnect();
|
|
148
150
|
};
|
|
149
|
-
}, [
|
|
151
|
+
}, [autoConnect, wsUrl]);
|
|
150
152
|
return {
|
|
151
153
|
connect,
|
|
152
154
|
disconnect,
|
|
153
|
-
connectionState,
|
|
155
|
+
connectionState: getConnection(wsUrl).state,
|
|
154
156
|
activeSessionId,
|
|
155
157
|
notifications: activeSessionId ? notifications[activeSessionId] || [] : [],
|
|
156
158
|
isSessionLoading,
|
|
@@ -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 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"]}
|
|
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"]}
|
package/dist/state/atoms.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ interface AcpState {
|
|
|
17
17
|
clearNotifications: (sessionId?: SessionId) => void;
|
|
18
18
|
getActiveNotifications: () => NotificationEvent[];
|
|
19
19
|
getActiveConnection: () => Connection | null;
|
|
20
|
-
getConnection: (url: ConnectionUrl) => Connection
|
|
20
|
+
getConnection: (url: ConnectionUrl) => Connection;
|
|
21
21
|
}
|
|
22
22
|
export declare const useAcpStore: import("zustand").UseBoundStore<import("zustand").StoreApi<AcpState>>;
|
|
23
23
|
export {};
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,CAAC;CACnD;AAED,eAAO,MAAM,WAAW,uEAiIrB,CAAC"}
|
package/dist/state/atoms.js
CHANGED
|
@@ -109,7 +109,7 @@ export const useAcpStore = create((set, get) => ({
|
|
|
109
109
|
},
|
|
110
110
|
getConnection: (url) => {
|
|
111
111
|
const { connections } = get();
|
|
112
|
-
return connections[url] || null;
|
|
112
|
+
return connections[url] || { url, state: { status: "disconnected" }, capabilities: null };
|
|
113
113
|
},
|
|
114
114
|
}));
|
|
115
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":"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
|
|
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"]}
|