use-acp 0.2.5 → 0.2.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-manager.d.ts","sourceRoot":"","sources":["../../src/connection/websocket-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,uBAAuB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,4BAA4B;IAC3C,uBAAuB,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,UAAU,CAAuB;gBAE7B,OAAO,EAAE,4BAA4B;IAI3C,OAAO,CACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,QAAQ,EAAE,kBAAkB,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;KAAE,CAAC;IA2BlF,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM;IAgBvB,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC;IAQ3D,oBAAoB,IAAI,MAAM,EAAE;CAKjC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,cAAc,CAA2C;gBAErD,OAAO,EAAE,uBAAuB;IAQtC,OAAO,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,kBAAkB,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;KAAE,CAAC;IAuDhG,UAAU;IAgBV,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,qBAAqB;IAI7B,kBAAkB,IAAI,eAAe,CAAC,QAAQ,CAAC;IAgB/C,UAAU,IAAI;QAAE,QAAQ,EAAE,kBAAkB,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;KAAE,GAAG,IAAI;CAS5F"}
1
+ {"version":3,"file":"websocket-manager.d.ts","sourceRoot":"","sources":["../../src/connection/websocket-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,uBAAuB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,4BAA4B;IAC3C,uBAAuB,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,UAAU,CAAuB;gBAE7B,OAAO,EAAE,4BAA4B;IAI3C,OAAO,CACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,QAAQ,EAAE,kBAAkB,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;KAAE,CAAC;IA2BlF,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM;IAgBvB,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC;IAQ3D,oBAAoB,IAAI,MAAM,EAAE;CAKjC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,cAAc,CAA2C;gBAErD,OAAO,EAAE,uBAAuB;IAQtC,OAAO,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,kBAAkB,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;KAAE,CAAC;IAuDhG,UAAU;IAgBV,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,qBAAqB;IAI7B,kBAAkB,IAAI,eAAe,CAAC,QAAQ,CAAC;IAgB/C,UAAU,IAAI;QAAE,QAAQ,EAAE,kBAAkB,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;KAAE,GAAG,IAAI;CAS5F"}
@@ -136,7 +136,8 @@ export class WebSocketManager {
136
136
  this.updateConnectionState({ status: "disconnected" });
137
137
  }
138
138
  attemptReconnect() {
139
- if (this.reconnectCount < (this.options.reconnectAttempts || 3)) {
139
+ const maxAttempts = this.options.reconnectAttempts ?? 3;
140
+ if (this.reconnectCount < maxAttempts) {
140
141
  this.reconnectCount++;
141
142
  this.reconnectTimer = setTimeout(async () => {
142
143
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-manager.js","sourceRoot":"","sources":["../../src/connection/websocket-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createWebSocketReadableStream,\n createWebSocketWritableStream,\n type NodeReadableStream,\n} from \"../components/streams.js\";\nimport type { ConnectionState } from \"../state/types.js\";\n\nexport interface WebSocketManagerOptions {\n url: string;\n onConnectionStateChange: (state: ConnectionState) => void;\n onError: (error: Error) => void;\n reconnectAttempts?: number;\n reconnectDelay?: number;\n}\n\nexport interface MultiWebSocketManagerOptions {\n onConnectionStateChange: (state: ConnectionState, url: string) => void;\n onError: (error: Error, url: string) => void;\n reconnectAttempts?: number;\n reconnectDelay?: number;\n}\n\nexport class MultiWebSocketManager {\n private managers = new Map<string, WebSocketManager>();\n private options: MultiWebSocketManagerOptions;\n private currentUrl: string | null = null;\n\n constructor(options: MultiWebSocketManagerOptions) {\n this.options = options;\n }\n\n async connect(\n url: string,\n ): Promise<{ readable: NodeReadableStream; writable: WritableStream<Uint8Array> }> {\n this.currentUrl = url;\n\n let manager = this.managers.get(url);\n\n if (manager) {\n const state = manager.getConnectionState();\n if (state === \"connected\") {\n const streams = manager.getStreams();\n if (streams) {\n return streams;\n }\n }\n } else {\n manager = new WebSocketManager({\n url,\n onConnectionStateChange: (state) => this.options.onConnectionStateChange(state, url),\n onError: (error) => this.options.onError(error, url),\n reconnectAttempts: this.options.reconnectAttempts,\n reconnectDelay: this.options.reconnectDelay,\n });\n this.managers.set(url, manager);\n }\n\n return await manager.connect();\n }\n\n disconnect(url?: string) {\n if (url) {\n const manager = this.managers.get(url);\n if (manager) {\n manager.disconnect();\n this.managers.delete(url);\n }\n } else {\n for (const [managerUrl, manager] of this.managers.entries()) {\n manager.disconnect();\n this.managers.delete(managerUrl);\n }\n this.currentUrl = null;\n }\n }\n\n getCurrentUrl(): string | null {\n return this.currentUrl;\n }\n\n getConnectionState(url?: string): ConnectionState[\"status\"] {\n const targetUrl = url || this.currentUrl;\n if (!targetUrl) return \"disconnected\";\n\n const manager = this.managers.get(targetUrl);\n return manager ? manager.getConnectionState() : \"disconnected\";\n }\n\n getActiveConnections(): string[] {\n return Array.from(this.managers.keys()).filter(\n (url) => this.managers.get(url)?.getConnectionState() === \"connected\",\n );\n }\n}\n\nexport class WebSocketManager {\n private ws: WebSocket | null = null;\n private options: WebSocketManagerOptions;\n private reconnectCount = 0;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private readableStream: NodeReadableStream | null = null;\n private writableStream: WritableStream<Uint8Array> | null = null;\n\n constructor(options: WebSocketManagerOptions) {\n this.options = {\n reconnectAttempts: 3,\n reconnectDelay: 1000,\n ...options,\n };\n }\n\n async connect(): Promise<{ readable: NodeReadableStream; writable: WritableStream<Uint8Array> }> {\n this.updateConnectionState({ status: \"connecting\", url: this.options.url });\n\n try {\n this.ws = new WebSocket(this.options.url);\n\n return new Promise((resolve, reject) => {\n if (!this.ws) {\n reject(new Error(\"WebSocket not initialized\"));\n return;\n }\n\n this.ws.onopen = () => {\n this.reconnectCount = 0;\n this.updateConnectionState({ status: \"connected\", url: this.options.url });\n\n if (this.ws) {\n this.readableStream = createWebSocketReadableStream(this.ws);\n this.writableStream = createWebSocketWritableStream(this.ws);\n\n resolve({\n readable: this.readableStream,\n writable: this.writableStream,\n });\n }\n };\n\n this.ws.onerror = (_event) => {\n const error = new Error(\"WebSocket connection error\");\n this.options.onError(error);\n this.updateConnectionState({\n status: \"error\",\n error: error.message,\n url: this.options.url,\n });\n reject(error);\n };\n\n this.ws.onclose = () => {\n this.updateConnectionState({ status: \"disconnected\", url: this.options.url });\n this.attemptReconnect();\n };\n });\n } catch (error) {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n this.options.onError(errorObj);\n this.updateConnectionState({\n status: \"error\",\n error: errorObj.message,\n url: this.options.url,\n });\n throw errorObj;\n }\n }\n\n disconnect() {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.readableStream = null;\n this.writableStream = null;\n this.updateConnectionState({ status: \"disconnected\" });\n }\n\n private attemptReconnect() {\n if (this.reconnectCount < (this.options.reconnectAttempts || 3)) {\n this.reconnectCount++;\n this.reconnectTimer = setTimeout(async () => {\n try {\n await this.connect();\n } catch (_error) {\n // Error is already handled in connect method\n }\n }, this.options.reconnectDelay);\n }\n }\n\n private updateConnectionState(state: ConnectionState) {\n this.options.onConnectionStateChange(state);\n }\n\n getConnectionState(): ConnectionState[\"status\"] {\n if (!this.ws) return \"disconnected\";\n\n switch (this.ws.readyState) {\n case WebSocket.CONNECTING:\n return \"connecting\";\n case WebSocket.OPEN:\n return \"connected\";\n case WebSocket.CLOSING:\n case WebSocket.CLOSED:\n return \"disconnected\";\n default:\n return \"error\";\n }\n }\n\n getStreams(): { readable: NodeReadableStream; writable: WritableStream<Uint8Array> } | null {\n if (this.readableStream && this.writableStream) {\n return {\n readable: this.readableStream,\n writable: this.writableStream,\n };\n }\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"websocket-manager.js","sourceRoot":"","sources":["../../src/connection/websocket-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createWebSocketReadableStream,\n createWebSocketWritableStream,\n type NodeReadableStream,\n} from \"../components/streams.js\";\nimport type { ConnectionState } from \"../state/types.js\";\n\nexport interface WebSocketManagerOptions {\n url: string;\n onConnectionStateChange: (state: ConnectionState) => void;\n onError: (error: Error) => void;\n reconnectAttempts?: number;\n reconnectDelay?: number;\n}\n\nexport interface MultiWebSocketManagerOptions {\n onConnectionStateChange: (state: ConnectionState, url: string) => void;\n onError: (error: Error, url: string) => void;\n reconnectAttempts?: number;\n reconnectDelay?: number;\n}\n\nexport class MultiWebSocketManager {\n private managers = new Map<string, WebSocketManager>();\n private options: MultiWebSocketManagerOptions;\n private currentUrl: string | null = null;\n\n constructor(options: MultiWebSocketManagerOptions) {\n this.options = options;\n }\n\n async connect(\n url: string,\n ): Promise<{ readable: NodeReadableStream; writable: WritableStream<Uint8Array> }> {\n this.currentUrl = url;\n\n let manager = this.managers.get(url);\n\n if (manager) {\n const state = manager.getConnectionState();\n if (state === \"connected\") {\n const streams = manager.getStreams();\n if (streams) {\n return streams;\n }\n }\n } else {\n manager = new WebSocketManager({\n url,\n onConnectionStateChange: (state) => this.options.onConnectionStateChange(state, url),\n onError: (error) => this.options.onError(error, url),\n reconnectAttempts: this.options.reconnectAttempts,\n reconnectDelay: this.options.reconnectDelay,\n });\n this.managers.set(url, manager);\n }\n\n return await manager.connect();\n }\n\n disconnect(url?: string) {\n if (url) {\n const manager = this.managers.get(url);\n if (manager) {\n manager.disconnect();\n this.managers.delete(url);\n }\n } else {\n for (const [managerUrl, manager] of this.managers.entries()) {\n manager.disconnect();\n this.managers.delete(managerUrl);\n }\n this.currentUrl = null;\n }\n }\n\n getCurrentUrl(): string | null {\n return this.currentUrl;\n }\n\n getConnectionState(url?: string): ConnectionState[\"status\"] {\n const targetUrl = url || this.currentUrl;\n if (!targetUrl) return \"disconnected\";\n\n const manager = this.managers.get(targetUrl);\n return manager ? manager.getConnectionState() : \"disconnected\";\n }\n\n getActiveConnections(): string[] {\n return Array.from(this.managers.keys()).filter(\n (url) => this.managers.get(url)?.getConnectionState() === \"connected\",\n );\n }\n}\n\nexport class WebSocketManager {\n private ws: WebSocket | null = null;\n private options: WebSocketManagerOptions;\n private reconnectCount = 0;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private readableStream: NodeReadableStream | null = null;\n private writableStream: WritableStream<Uint8Array> | null = null;\n\n constructor(options: WebSocketManagerOptions) {\n this.options = {\n reconnectAttempts: 3,\n reconnectDelay: 1000,\n ...options,\n };\n }\n\n async connect(): Promise<{ readable: NodeReadableStream; writable: WritableStream<Uint8Array> }> {\n this.updateConnectionState({ status: \"connecting\", url: this.options.url });\n\n try {\n this.ws = new WebSocket(this.options.url);\n\n return new Promise((resolve, reject) => {\n if (!this.ws) {\n reject(new Error(\"WebSocket not initialized\"));\n return;\n }\n\n this.ws.onopen = () => {\n this.reconnectCount = 0;\n this.updateConnectionState({ status: \"connected\", url: this.options.url });\n\n if (this.ws) {\n this.readableStream = createWebSocketReadableStream(this.ws);\n this.writableStream = createWebSocketWritableStream(this.ws);\n\n resolve({\n readable: this.readableStream,\n writable: this.writableStream,\n });\n }\n };\n\n this.ws.onerror = (_event) => {\n const error = new Error(\"WebSocket connection error\");\n this.options.onError(error);\n this.updateConnectionState({\n status: \"error\",\n error: error.message,\n url: this.options.url,\n });\n reject(error);\n };\n\n this.ws.onclose = () => {\n this.updateConnectionState({ status: \"disconnected\", url: this.options.url });\n this.attemptReconnect();\n };\n });\n } catch (error) {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n this.options.onError(errorObj);\n this.updateConnectionState({\n status: \"error\",\n error: errorObj.message,\n url: this.options.url,\n });\n throw errorObj;\n }\n }\n\n disconnect() {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.readableStream = null;\n this.writableStream = null;\n this.updateConnectionState({ status: \"disconnected\" });\n }\n\n private attemptReconnect() {\n const maxAttempts = this.options.reconnectAttempts ?? 3;\n if (this.reconnectCount < maxAttempts) {\n this.reconnectCount++;\n this.reconnectTimer = setTimeout(async () => {\n try {\n await this.connect();\n } catch (_error) {\n // Error is already handled in connect method\n }\n }, this.options.reconnectDelay);\n }\n }\n\n private updateConnectionState(state: ConnectionState) {\n this.options.onConnectionStateChange(state);\n }\n\n getConnectionState(): ConnectionState[\"status\"] {\n if (!this.ws) return \"disconnected\";\n\n switch (this.ws.readyState) {\n case WebSocket.CONNECTING:\n return \"connecting\";\n case WebSocket.OPEN:\n return \"connected\";\n case WebSocket.CLOSING:\n case WebSocket.CLOSED:\n return \"disconnected\";\n default:\n return \"error\";\n }\n }\n\n getStreams(): { readable: NodeReadableStream; writable: WritableStream<Uint8Array> } | null {\n if (this.readableStream && this.writableStream) {\n return {\n readable: this.readableStream,\n writable: this.writableStream,\n };\n }\n return null;\n }\n}\n"]}
@@ -20,7 +20,7 @@ export interface UseAcpClientReturn {
20
20
  activeSessionId: SessionId | null;
21
21
  setActiveSessionId: (sessionId: SessionId | null) => void;
22
22
  notifications: NotificationEvent[];
23
- clearNotifications: () => void;
23
+ clearNotifications: (sessionId?: SessionId) => void;
24
24
  isSessionLoading: boolean;
25
25
  pendingPermission: IdentifiedPermissionRequest | null;
26
26
  resolvePermission: (response: RequestPermissionResponse) => void;
@@ -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,EACtB,KAAK,gBAAgB,EAErB,KAAK,SAAS,EAEd,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EAEtB,MAAM,0BAA0B,CAAC;AAElC,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,kBAAkB,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1D,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,CAuO7E"}
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,EAEd,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EAEtB,MAAM,0BAA0B,CAAC;AAElC,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,kBAAkB,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1D,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,kBAAkB,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACpD,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,CAuO7E"}
@@ -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 type AvailableCommand,\n ClientSideConnection,\n type McpServer,\n ndJsonStream,\n type RequestPermissionResponse,\n type SessionModeState,\n type SessionNotification,\n} from \"@agentclientprotocol/sdk\";\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 setActiveSessionId: (sessionId: SessionId | null) => void;\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 onRpcError: (error) => {\n clientOptions?.onRpcError?.(error);\n handleError(error, wsUrl);\n },\n });\n acpClientRef.current = acpClient;\n return acpClient;\n },\n ndJsonStream(writable, 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 on_rpc_error: (error) => handleError(error, wsUrl),\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.deferredId;\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.deferredId;\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 // Reset the active session id as the connection is being established\n setActiveSessionId(null);\n\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 setActiveSessionId,\n resolvePermission,\n rejectPermission: rejectPermissionCallback,\n agent: agent,\n agentCapabilities,\n sessionMode: activeSessionId ? sessionModes[activeSessionId] : null,\n availableCommands,\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 ndJsonStream,\n type RequestPermissionResponse,\n type SessionModeState,\n type SessionNotification,\n} from \"@agentclientprotocol/sdk\";\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 setActiveSessionId: (sessionId: SessionId | null) => void;\n notifications: NotificationEvent[];\n clearNotifications: (sessionId?: SessionId) => 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 onRpcError: (error) => {\n clientOptions?.onRpcError?.(error);\n handleError(error, wsUrl);\n },\n });\n acpClientRef.current = acpClient;\n return acpClient;\n },\n ndJsonStream(writable, 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 on_rpc_error: (error) => handleError(error, wsUrl),\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.deferredId;\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.deferredId;\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 // Reset the active session id as the connection is being established\n setActiveSessionId(null);\n\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 setActiveSessionId,\n resolvePermission,\n rejectPermission: rejectPermissionCallback,\n agent: agent,\n agentCapabilities,\n sessionMode: activeSessionId ? sessionModes[activeSessionId] : null,\n availableCommands,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"atoms.d.ts","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEnG,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"}
1
+ {"version":3,"file":"atoms.d.ts","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEnG,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,uEA8JrB,CAAC"}
@@ -90,7 +90,14 @@ export const useAcpStore = create((set, get) => ({
90
90
  },
91
91
  addNotification: (notification) => {
92
92
  const current = get().notifications;
93
- const sessionId = get().activeSessionId;
93
+ // We prefer using the sessionId from the notification itself, because it may not be the same as the activeSessionId.
94
+ let sessionId;
95
+ if (notification.type === "session_notification" && notification.data?.sessionId) {
96
+ sessionId = notification.data.sessionId;
97
+ }
98
+ else {
99
+ sessionId = get().activeSessionId;
100
+ }
94
101
  if (!sessionId) {
95
102
  return;
96
103
  }
@@ -1 +1 @@
1
- {"version":3,"file":"atoms.js","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentCapabilities, SessionModeId, SessionModeState } from \"@agentclientprotocol/sdk\";\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"]}
1
+ {"version":3,"file":"atoms.js","sourceRoot":"","sources":["../../src/state/atoms.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentCapabilities, SessionModeId, SessionModeState } from \"@agentclientprotocol/sdk\";\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\n // We prefer using the sessionId from the notification itself, because it may not be the same as the activeSessionId.\n let sessionId: SessionId | null;\n if (notification.type === \"session_notification\" && notification.data?.sessionId) {\n sessionId = notification.data.sessionId as SessionId;\n } else {\n sessionId = get().activeSessionId;\n }\n\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/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.2.5",
4
+ "version": "0.2.6",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -11,6 +11,17 @@
11
11
  "type": "git",
12
12
  "url": "https://github.com/marimo-team/use-acp"
13
13
  },
14
+ "scripts": {
15
+ "dev": "vite",
16
+ "typecheck": "tsc --noEmit",
17
+ "lint": "biome check --write",
18
+ "test": "vitest",
19
+ "demo": "vite build",
20
+ "build": "tsc",
21
+ "prepublishOnly": "pnpm run typecheck && pnpm run test && pnpm run build",
22
+ "release": "pnpm version",
23
+ "pre-commit": "lint-staged"
24
+ },
14
25
  "keywords": [
15
26
  "acp",
16
27
  "agents",
@@ -65,15 +76,5 @@
65
76
  "dependencies": {
66
77
  "@agentclientprotocol/sdk": "^0.4.9",
67
78
  "zustand": "^5.0.2"
68
- },
69
- "scripts": {
70
- "dev": "vite",
71
- "typecheck": "tsc --noEmit",
72
- "lint": "biome check --write",
73
- "test": "vitest",
74
- "demo": "vite build",
75
- "build": "tsc",
76
- "release": "pnpm version",
77
- "pre-commit": "lint-staged"
78
79
  }
79
- }
80
+ }