@witqq/agent-sdk 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +140 -34
  2. package/dist/{types-CqvUAYxt.d.cts → agent-CW9XbmG_.d.ts} +137 -102
  3. package/dist/{types-CqvUAYxt.d.ts → agent-DxY68NZL.d.cts} +137 -102
  4. package/dist/auth/index.cjs +72 -1
  5. package/dist/auth/index.cjs.map +1 -1
  6. package/dist/auth/index.d.cts +21 -154
  7. package/dist/auth/index.d.ts +21 -154
  8. package/dist/auth/index.js +72 -1
  9. package/dist/auth/index.js.map +1 -1
  10. package/dist/backends/claude.cjs +480 -261
  11. package/dist/backends/claude.cjs.map +1 -1
  12. package/dist/backends/claude.d.cts +3 -1
  13. package/dist/backends/claude.d.ts +3 -1
  14. package/dist/backends/claude.js +480 -261
  15. package/dist/backends/claude.js.map +1 -1
  16. package/dist/backends/copilot.cjs +329 -97
  17. package/dist/backends/copilot.cjs.map +1 -1
  18. package/dist/backends/copilot.d.cts +12 -4
  19. package/dist/backends/copilot.d.ts +12 -4
  20. package/dist/backends/copilot.js +329 -97
  21. package/dist/backends/copilot.js.map +1 -1
  22. package/dist/backends/vercel-ai.cjs +294 -61
  23. package/dist/backends/vercel-ai.cjs.map +1 -1
  24. package/dist/backends/vercel-ai.d.cts +3 -1
  25. package/dist/backends/vercel-ai.d.ts +3 -1
  26. package/dist/backends/vercel-ai.js +294 -61
  27. package/dist/backends/vercel-ai.js.map +1 -1
  28. package/dist/backends-BSrsBYFn.d.cts +39 -0
  29. package/dist/backends-BSrsBYFn.d.ts +39 -0
  30. package/dist/chat/accumulator.cjs +1 -1
  31. package/dist/chat/accumulator.cjs.map +1 -1
  32. package/dist/chat/accumulator.d.cts +5 -2
  33. package/dist/chat/accumulator.d.ts +5 -2
  34. package/dist/chat/accumulator.js +1 -1
  35. package/dist/chat/accumulator.js.map +1 -1
  36. package/dist/chat/backends.cjs +736 -746
  37. package/dist/chat/backends.cjs.map +1 -1
  38. package/dist/chat/backends.d.cts +10 -6
  39. package/dist/chat/backends.d.ts +10 -6
  40. package/dist/chat/backends.js +736 -725
  41. package/dist/chat/backends.js.map +1 -1
  42. package/dist/chat/context.cjs +50 -0
  43. package/dist/chat/context.cjs.map +1 -1
  44. package/dist/chat/context.d.cts +27 -3
  45. package/dist/chat/context.d.ts +27 -3
  46. package/dist/chat/context.js +50 -0
  47. package/dist/chat/context.js.map +1 -1
  48. package/dist/chat/core.cjs +25 -2
  49. package/dist/chat/core.cjs.map +1 -1
  50. package/dist/chat/core.d.cts +30 -381
  51. package/dist/chat/core.d.ts +30 -381
  52. package/dist/chat/core.js +24 -3
  53. package/dist/chat/core.js.map +1 -1
  54. package/dist/chat/errors.cjs +48 -26
  55. package/dist/chat/errors.cjs.map +1 -1
  56. package/dist/chat/errors.d.cts +6 -31
  57. package/dist/chat/errors.d.ts +6 -31
  58. package/dist/chat/errors.js +48 -25
  59. package/dist/chat/errors.js.map +1 -1
  60. package/dist/chat/events.cjs.map +1 -1
  61. package/dist/chat/events.d.cts +6 -2
  62. package/dist/chat/events.d.ts +6 -2
  63. package/dist/chat/events.js.map +1 -1
  64. package/dist/chat/index.cjs +1199 -1008
  65. package/dist/chat/index.cjs.map +1 -1
  66. package/dist/chat/index.d.cts +35 -10
  67. package/dist/chat/index.d.ts +35 -10
  68. package/dist/chat/index.js +1196 -987
  69. package/dist/chat/index.js.map +1 -1
  70. package/dist/chat/react/theme.css +2517 -0
  71. package/dist/chat/react.cjs +2003 -1153
  72. package/dist/chat/react.cjs.map +1 -1
  73. package/dist/chat/react.d.cts +590 -121
  74. package/dist/chat/react.d.ts +590 -121
  75. package/dist/chat/react.js +1984 -1151
  76. package/dist/chat/react.js.map +1 -1
  77. package/dist/chat/runtime.cjs +401 -186
  78. package/dist/chat/runtime.cjs.map +1 -1
  79. package/dist/chat/runtime.d.cts +92 -28
  80. package/dist/chat/runtime.d.ts +92 -28
  81. package/dist/chat/runtime.js +401 -186
  82. package/dist/chat/runtime.js.map +1 -1
  83. package/dist/chat/server.cjs +2234 -209
  84. package/dist/chat/server.cjs.map +1 -1
  85. package/dist/chat/server.d.cts +451 -90
  86. package/dist/chat/server.d.ts +451 -90
  87. package/dist/chat/server.js +2221 -210
  88. package/dist/chat/server.js.map +1 -1
  89. package/dist/chat/sessions.cjs +25 -43
  90. package/dist/chat/sessions.cjs.map +1 -1
  91. package/dist/chat/sessions.d.cts +37 -118
  92. package/dist/chat/sessions.d.ts +37 -118
  93. package/dist/chat/sessions.js +25 -43
  94. package/dist/chat/sessions.js.map +1 -1
  95. package/dist/chat/sqlite.cjs +441 -0
  96. package/dist/chat/sqlite.cjs.map +1 -0
  97. package/dist/chat/sqlite.d.cts +128 -0
  98. package/dist/chat/sqlite.d.ts +128 -0
  99. package/dist/chat/sqlite.js +435 -0
  100. package/dist/chat/sqlite.js.map +1 -0
  101. package/dist/chat/state.cjs +14 -1
  102. package/dist/chat/state.cjs.map +1 -1
  103. package/dist/chat/state.d.cts +5 -2
  104. package/dist/chat/state.d.ts +5 -2
  105. package/dist/chat/state.js +14 -1
  106. package/dist/chat/state.js.map +1 -1
  107. package/dist/chat/storage.cjs +19 -10
  108. package/dist/chat/storage.cjs.map +1 -1
  109. package/dist/chat/storage.d.cts +11 -5
  110. package/dist/chat/storage.d.ts +11 -5
  111. package/dist/chat/storage.js +19 -10
  112. package/dist/chat/storage.js.map +1 -1
  113. package/dist/errors-C-so0M4t.d.cts +33 -0
  114. package/dist/errors-C-so0M4t.d.ts +33 -0
  115. package/dist/errors-CmVvczxZ.d.cts +28 -0
  116. package/dist/errors-CmVvczxZ.d.ts +28 -0
  117. package/dist/{in-process-transport-C2oPTYs6.d.ts → in-process-transport-C1JnJGVR.d.ts} +28 -23
  118. package/dist/{in-process-transport-DG-w5G6k.d.cts → in-process-transport-C7DSqPyX.d.cts} +28 -23
  119. package/dist/index.cjs +340 -46
  120. package/dist/index.cjs.map +1 -1
  121. package/dist/index.d.cts +292 -123
  122. package/dist/index.d.ts +292 -123
  123. package/dist/index.js +334 -47
  124. package/dist/index.js.map +1 -1
  125. package/dist/provider-types-PTSlRPNB.d.cts +39 -0
  126. package/dist/provider-types-PTSlRPNB.d.ts +39 -0
  127. package/dist/refresh-manager-B81PpYBr.d.cts +153 -0
  128. package/dist/refresh-manager-Dlv_iNZi.d.ts +153 -0
  129. package/dist/testing.cjs +383 -0
  130. package/dist/testing.cjs.map +1 -0
  131. package/dist/testing.d.cts +132 -0
  132. package/dist/testing.d.ts +132 -0
  133. package/dist/testing.js +377 -0
  134. package/dist/testing.js.map +1 -0
  135. package/dist/token-store-CSUBgYwn.d.ts +48 -0
  136. package/dist/token-store-CuC4hB9Z.d.cts +48 -0
  137. package/dist/{transport-DX1Nhm4N.d.cts → transport-Cdh3M0tS.d.cts} +5 -4
  138. package/dist/{transport-D1OaUgRk.d.ts → transport-Ciap4PWK.d.ts} +5 -4
  139. package/dist/{types-CGF7AEX1.d.cts → types-4vbcmPTp.d.cts} +4 -2
  140. package/dist/{types-Bh5AhqD-.d.ts → types-BxggH0Yh.d.ts} +4 -2
  141. package/dist/types-DRgd_9R7.d.cts +363 -0
  142. package/dist/types-ajANVzf7.d.ts +363 -0
  143. package/package.json +31 -6
  144. package/dist/errors-BDLbNu9w.d.cts +0 -13
  145. package/dist/errors-BDLbNu9w.d.ts +0 -13
  146. package/dist/types-DLZzlJxt.d.ts +0 -39
  147. package/dist/types-tE0CXwBl.d.cts +0 -39
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/chat/backends/transport.ts","../../src/chat/server/handler.ts","../../src/chat/server/auth-handler.ts","../../src/chat/server/cors.ts","../../src/chat/server/chat-server.ts","../../src/chat/server/token-store.ts"],"names":["path","resolve","readBody","json","fs","mkdirSync","writeFileSync","readFileSync","unlinkSync","existsSync","readdirSync","join"],"mappings":"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","file":"server.cjs","sourcesContent":["/**\n * @witqq/agent-sdk/chat/backends/transport\n *\n * IChatTransport abstracts how ChatEvents are delivered to clients.\n * SSEChatTransport implements Server-Sent Events over HTTP.\n */\n\nimport type { ChatEvent } from \"../core.js\";\n\n// ─── IChatTransport Interface ──────────────────────────────────\n\n/**\n * Abstraction for delivering chat events to a client.\n * Implementations handle protocol details (SSE, WebSocket, etc.).\n */\nexport interface IChatTransport {\n /** Send a single chat event to the client */\n send(event: ChatEvent): void;\n\n /** Signal stream completion and close the connection */\n close(): void;\n\n /** Signal an error to the client */\n error(err: Error): void;\n\n /** Whether the transport is still open */\n readonly isOpen: boolean;\n}\n\n// ─── SSE Chat Transport ────────────────────────────────────────\n\n/** Writable HTTP response interface (Node.js http.ServerResponse subset) */\nexport interface WritableResponse {\n writeHead(statusCode: number, headers: Record<string, string>): void;\n write(chunk: string): boolean;\n end(): void;\n readonly writableEnded: boolean;\n}\n\n/** Minimal interface for detecting client disconnection */\nexport interface CloseDetectable {\n on(event: \"close\", listener: () => void): void;\n}\n\n/** Configuration options for SSEChatTransport */\nexport interface SSETransportOptions {\n /** Heartbeat interval in milliseconds. 0 or undefined disables heartbeat. */\n heartbeatMs?: number;\n /** Request object for detecting client disconnection (listens for 'close' event) */\n request?: CloseDetectable;\n}\n\n/**\n * Server-Sent Events transport for ChatEvent streaming.\n * Sends events as `data: JSON\\n\\n` lines with SSE headers.\n */\nexport class SSEChatTransport implements IChatTransport {\n private readonly res: WritableResponse;\n private _open: boolean;\n private _heartbeatTimer: ReturnType<typeof setInterval> | undefined;\n\n constructor(res: WritableResponse, options?: SSETransportOptions) {\n this.res = res;\n this._open = true;\n\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n\n // Close detection via request 'close' event\n if (options?.request) {\n options.request.on(\"close\", () => {\n this._cleanup();\n });\n }\n\n // Periodic heartbeat to keep connection alive\n const heartbeatMs = options?.heartbeatMs;\n if (heartbeatMs && heartbeatMs > 0) {\n this._heartbeatTimer = setInterval(() => {\n if (!this.isOpen) {\n this._clearHeartbeat();\n return;\n }\n this.res.write(\": heartbeat\\n\\n\");\n }, heartbeatMs);\n }\n }\n\n get isOpen(): boolean {\n return this._open && !this.res.writableEnded;\n }\n\n send(event: ChatEvent): void {\n if (!this.isOpen) return;\n this.res.write(`data: ${JSON.stringify(event)}\\n\\n`);\n }\n\n close(): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n this.res.write(`data: [DONE]\\n\\n`);\n this.res.end();\n }\n\n error(err: Error): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n const errorEvent: ChatEvent = {\n type: \"error\",\n error: err.message,\n recoverable: false,\n };\n this.res.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n this.res.end();\n }\n\n private _cleanup(): void {\n this._open = false;\n this._clearHeartbeat();\n }\n\n private _clearHeartbeat(): void {\n if (this._heartbeatTimer !== undefined) {\n clearInterval(this._heartbeatTimer);\n this._heartbeatTimer = undefined;\n }\n }\n}\n\n// ─── Helper: Stream Adapter Events to Transport ────────────────\n\n/**\n * Pipes an async iterable of ChatEvents into a transport.\n * Handles errors and ensures transport is closed on completion.\n *\n * @param events - Async iterable of ChatEvent (from adapter.streamMessage)\n * @param transport - Transport to send events through\n */\nexport async function streamToTransport(\n events: AsyncIterable<ChatEvent>,\n transport: IChatTransport,\n): Promise<void> {\n try {\n let accumulatedText = \"\";\n\n for await (const event of events) {\n if (!transport.isOpen) break;\n transport.send(event);\n\n if (event.type === \"message:delta\") {\n accumulatedText += event.text;\n }\n }\n\n if (transport.isOpen) {\n transport.send({ type: \"done\", finalOutput: accumulatedText || undefined });\n }\n transport.close();\n } catch (err) {\n transport.error(err instanceof Error ? err : new Error(String(err)));\n }\n}\n","/**\n * createChatHandler — maps RemoteChatRuntime contract endpoints to IChatRuntime calls.\n *\n * Implements all 10 routes from the RemoteChatRuntime server endpoint contract:\n * - POST /sessions/create → runtime.createSession()\n * - GET /sessions/{id} → runtime.getSession()\n * - GET /sessions → runtime.listSessions()\n * - DELETE /sessions/{id} → runtime.deleteSession()\n * - POST /sessions/{id}/archive → runtime.archiveSession()\n * - POST /send → runtime.send() via SSE\n * - POST /abort → runtime.abort()\n * - GET /models → runtime.listModels()\n * - POST /backend/switch → runtime.switchBackend()\n * - POST /model/switch → runtime.switchModel()\n */\n\nimport type { IChatRuntime } from \"../runtime.js\";\nimport type { SendMessageOptions } from \"../core.js\";\nimport { SSEChatTransport, streamToTransport } from \"../backends/transport.js\";\nimport type { WritableResponse as TransportWritableResponse, CloseDetectable } from \"../backends/transport.js\";\n\n// ─── Minimal HTTP interfaces (framework-agnostic) ──────────────\n\n/** Minimal readable request interface (node:http IncomingMessage subset) */\nexport interface ReadableRequest {\n readonly method?: string;\n readonly url?: string;\n on(event: \"data\", listener: (chunk: Buffer | string) => void): void;\n on(event: \"end\", listener: () => void): void;\n}\n\n/**\n * Writable HTTP response interface for chat handler.\n * Extends the transport's WritableResponse with setHeader() and body-accepting end().\n */\nexport interface WritableResponse extends TransportWritableResponse {\n setHeader(name: string, value: string): void;\n end(body?: string): void;\n}\n\n// ─── Options ───────────────────────────────────────────────────\n\n/** Configuration for createChatHandler */\nexport interface ChatHandlerOptions {\n /** Route prefix to strip from URL before matching. Default: \"\" (no prefix) */\n prefix?: string;\n /** Maximum request body size in bytes. Default: 1MB (1048576) */\n maxBodySize?: number;\n /** SSE heartbeat interval in milliseconds. 0 or undefined disables heartbeat. */\n heartbeatMs?: number;\n}\n\n// ─── Handler Factory ───────────────────────────────────────────\n\n/**\n * Create an HTTP request handler that maps RemoteChatRuntime contract\n * endpoints to IChatRuntime method calls.\n *\n * @param runtime - The chat runtime instance to serve\n * @param options - Handler configuration\n * @returns Async request handler `(req, res) => Promise<void>`\n *\n * @example\n * ```ts\n * const handler = createChatHandler(runtime, { prefix: \"/api/chat\" });\n * http.createServer(async (req, res) => {\n * if (req.url?.startsWith(\"/api/chat\")) {\n * await handler(req, res);\n * return;\n * }\n * res.writeHead(404).end();\n * });\n * ```\n */\nexport function createChatHandler(\n runtime: IChatRuntime,\n options?: ChatHandlerOptions,\n): (req: ReadableRequest, res: WritableResponse) => Promise<void> {\n const prefix = options?.prefix ?? \"\";\n const maxBodySize = options?.maxBodySize ?? 1_048_576; // 1MB default\n const heartbeatMs = options?.heartbeatMs;\n\n return async (req: ReadableRequest, res: WritableResponse): Promise<void> => {\n const url = req.url || \"\";\n const method = req.method || \"GET\";\n\n // Strip prefix to get the route path\n const rawPath = prefix ? url.slice(prefix.length) : url;\n const path = rawPath.split(\"?\")[0];\n\n // Route matching patterns\n const sessionMatch = path.match(/^\\/sessions\\/([^/]+)$/);\n const archiveMatch = path.match(/^\\/sessions\\/([^/]+)\\/archive$/);\n\n try {\n // POST /sessions/create\n if (method === \"POST\" && path === \"/sessions/create\") {\n const body = await readBody(req, maxBodySize);\n const session = await runtime.createSession({\n title: body.title as string || `Chat ${new Date().toLocaleTimeString()}`,\n config: body.config as { model: string; backend: string } || {\n model: runtime.currentModel || \"\",\n backend: runtime.currentBackend,\n },\n ...(body.tags ? { tags: body.tags as string[] } : {}),\n ...(body.custom ? { custom: body.custom as Record<string, unknown> } : {}),\n });\n json(res, session);\n return;\n }\n\n // POST /sessions/:id/archive (must be before GET/DELETE session match)\n if (method === \"POST\" && archiveMatch) {\n const id = decodeURIComponent(archiveMatch[1]);\n await runtime.archiveSession(id);\n json(res, { ok: true });\n return;\n }\n\n // GET /sessions/:id\n if (method === \"GET\" && sessionMatch) {\n const id = decodeURIComponent(sessionMatch[1]);\n const session = await runtime.getSession(id);\n if (!session) {\n json(res, { error: \"Not found\" }, 404);\n return;\n }\n json(res, session);\n return;\n }\n\n // DELETE /sessions/:id\n if (method === \"DELETE\" && sessionMatch) {\n const id = decodeURIComponent(sessionMatch[1]);\n await runtime.deleteSession(id);\n json(res, { ok: true });\n return;\n }\n\n // GET /sessions\n if (method === \"GET\" && path === \"/sessions\") {\n const sessions = await runtime.listSessions();\n json(res, sessions);\n return;\n }\n\n // POST /send (SSE stream)\n if (method === \"POST\" && path === \"/send\") {\n const body = await readBody(req, maxBodySize);\n const sessionId = body.sessionId as string;\n const message = (body.message || body.content) as string;\n\n if (!sessionId || !message) {\n json(res, { error: \"sessionId and message are required\" }, 400);\n return;\n }\n\n const transport = new SSEChatTransport(res, {\n heartbeatMs,\n request: req as unknown as CloseDetectable,\n });\n try {\n const opts: SendMessageOptions = {};\n if (body.model) opts.model = body.model as string;\n\n const stream = runtime.send(\n sessionId,\n message,\n Object.keys(opts).length > 0 ? opts : undefined,\n );\n await streamToTransport(stream, transport);\n } catch (err) {\n transport.error(err instanceof Error ? err : new Error(String(err)));\n }\n return;\n }\n\n // POST /abort\n if (method === \"POST\" && path === \"/abort\") {\n runtime.abort();\n json(res, { ok: true });\n return;\n }\n\n // GET /models\n if (method === \"GET\" && path === \"/models\") {\n const models = await runtime.listModels();\n json(res, models);\n return;\n }\n\n // POST /backend/switch\n if (method === \"POST\" && path === \"/backend/switch\") {\n const body = await readBody(req, maxBodySize);\n if (!body.backend || typeof body.backend !== \"string\") {\n json(res, { error: \"backend is required\" }, 400);\n return;\n }\n await runtime.switchBackend(body.backend as string);\n json(res, { ok: true });\n return;\n }\n\n // POST /model/switch\n if (method === \"POST\" && path === \"/model/switch\") {\n const body = await readBody(req, maxBodySize);\n if (!body.model || typeof body.model !== \"string\") {\n json(res, { error: \"model is required\" }, 400);\n return;\n }\n runtime.switchModel(body.model as string);\n json(res, { ok: true });\n return;\n }\n\n // No route matched\n json(res, { error: \"Not found\" }, 404);\n } catch (err) {\n if (err instanceof BodyParseError) {\n json(res, { error: err.message }, err.statusCode);\n } else {\n const message = err instanceof Error ? err.message : String(err);\n json(res, { error: message }, 500);\n }\n }\n };\n}\n\n// ─── Internal Helpers ──────────────────────────────────────────\n\n/** Error thrown by readBody with an HTTP status code */\nclass BodyParseError extends Error {\n readonly statusCode: number;\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = \"BodyParseError\";\n this.statusCode = statusCode;\n }\n}\n\nfunction readBody(req: ReadableRequest, maxSize: number): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n let body = \"\";\n let size = 0;\n let exceeded = false;\n req.on(\"data\", (chunk: Buffer | string) => {\n if (exceeded) return;\n const str = chunk.toString();\n size += Buffer.byteLength(str);\n if (size > maxSize) {\n exceeded = true;\n reject(new BodyParseError(\"Request body too large\", 413));\n return;\n }\n body += str;\n });\n req.on(\"end\", () => {\n if (exceeded) return;\n try {\n resolve(JSON.parse(body || \"{}\"));\n } catch {\n reject(new BodyParseError(\"Invalid JSON in request body\", 400));\n }\n });\n if (\"once\" in req && typeof (req as { once: unknown }).once === \"function\") {\n (req as { once(event: string, listener: () => void): void }).once(\"error\", () =>\n reject(new BodyParseError(\"Request error\", 500)),\n );\n }\n });\n}\n\nfunction json(res: WritableResponse, data: unknown, status = 200): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n","/**\n * createAuthHandler — server-mediated authentication for all three backends.\n *\n * Routes:\n * - POST /auth/start → Start auth flow (copilot device flow, claude OAuth, vercel-ai passthrough)\n * - POST /auth/copilot/poll → Poll for Copilot device flow completion\n * - POST /auth/claude/complete → Exchange Claude OAuth code for token\n * - POST /auth/vercel/complete → Submit Vercel AI API key\n * - GET /tokens/saved → List providers with saved tokens\n * - POST /tokens/use → Load and activate a saved token\n * - POST /tokens/clear → Clear all saved tokens and invoke onLogout\n * - POST /auth/dispose → Clear pending flows and invoke onLogout\n */\n\nimport type { ReadableRequest, WritableResponse } from \"./handler.js\";\nimport type { ITokenStore } from \"./token-store.js\";\nimport type { AuthToken, CopilotAuthToken, ClaudeAuthToken } from \"../../auth/types.js\";\n\n// Re-use readBody and json helpers via a local copy (handler.ts keeps them unexported).\n// We define local equivalents to avoid coupling internal handler helpers.\n\n// ─── Types ─────────────────────────────────────────────────────\n\n/** Auth provider names recognized by the handler */\nexport type AuthProvider = \"copilot\" | \"claude\" | \"vercel-ai\";\n\n/** Copilot auth class interface (matches CopilotAuth public API) */\nexport interface ICopilotAuth {\n startDeviceFlow(options?: {\n scopes?: string;\n signal?: AbortSignal;\n }): Promise<{\n userCode: string;\n verificationUrl: string;\n waitForToken: (signal?: AbortSignal) => Promise<CopilotAuthToken>;\n }>;\n}\n\n/** Claude auth class interface (matches ClaudeAuth public API) */\nexport interface IClaudeAuth {\n startOAuthFlow(options?: {\n redirectUri?: string;\n scopes?: string;\n }): {\n authorizeUrl: string;\n completeAuth: (codeOrUrl: string) => Promise<ClaudeAuthToken>;\n };\n}\n\n/** Callback invoked after successful authentication */\nexport type OnAuthCallback = (\n provider: AuthProvider,\n token: AuthToken,\n) => void | Promise<void>;\n\n/** Configuration for createAuthHandler */\nexport interface AuthHandlerOptions {\n /** Token storage implementation */\n tokenStore: ITokenStore;\n /** Factory for creating CopilotAuth instances */\n createCopilotAuth?: () => ICopilotAuth;\n /** Factory for creating ClaudeAuth instances */\n createClaudeAuth?: () => IClaudeAuth;\n /** Called after successful authentication for any provider */\n onAuth?: OnAuthCallback;\n /** Called when dispose/logout is requested */\n onLogout?: () => void | Promise<void>;\n /** Route prefix to strip from URL before matching. Default: \"\" */\n prefix?: string;\n /** Maximum request body size in bytes. Default: 1MB */\n maxBodySize?: number;\n}\n\n// ─── Internal State ────────────────────────────────────────────\n\ninterface PendingCopilotFlow {\n waitForToken: (signal?: AbortSignal) => Promise<CopilotAuthToken>;\n}\n\ninterface PendingClaudeFlow {\n completeAuth: (codeOrUrl: string) => Promise<ClaudeAuthToken>;\n}\n\n// ─── Handler Factory ───────────────────────────────────────────\n\n/**\n * Create an HTTP request handler for server-mediated authentication.\n *\n * @param options - Auth handler configuration (token store, auth factories, callbacks)\n * @returns Async request handler `(req, res) => Promise<void>`\n *\n * @example\n * ```ts\n * import { CopilotAuth, ClaudeAuth } from \"@witqq/agent-sdk/auth\";\n *\n * const authHandler = createAuthHandler({\n * tokenStore: new FileTokenStore({ directory: \".tokens\" }),\n * createCopilotAuth: () => new CopilotAuth(),\n * createClaudeAuth: () => new ClaudeAuth(),\n * onAuth: (provider, token) => {\n * // Rebuild runtime with new credentials\n * },\n * });\n * ```\n */\nexport function createAuthHandler(\n options: AuthHandlerOptions,\n): (req: ReadableRequest, res: WritableResponse) => Promise<void> {\n const { tokenStore, onAuth } = options;\n const prefix = options.prefix ?? \"\";\n const maxBodySize = options.maxBodySize ?? 1_048_576;\n\n // In-flight auth state (single-user pattern, same as demo)\n let pendingCopilot: PendingCopilotFlow | null = null;\n let pendingClaude: PendingClaudeFlow | null = null;\n\n return async (req: ReadableRequest, res: WritableResponse): Promise<void> => {\n const url = req.url || \"\";\n const method = req.method || \"GET\";\n const rawPath = prefix ? url.slice(prefix.length) : url;\n const path = rawPath.split(\"?\")[0];\n\n try {\n // POST /auth/start\n if (method === \"POST\" && path === \"/auth/start\") {\n const body = await readBody(req, maxBodySize);\n const provider = body.provider as string;\n\n if (!provider || !isValidProvider(provider)) {\n json(res, { error: \"provider is required (copilot, claude, vercel-ai)\" }, 400);\n return;\n }\n\n // Clear pending flows\n pendingCopilot = null;\n pendingClaude = null;\n\n if (provider === \"copilot\") {\n if (!options.createCopilotAuth) {\n json(res, { error: \"Copilot auth not configured\" }, 400);\n return;\n }\n const auth = options.createCopilotAuth();\n const flow = await auth.startDeviceFlow();\n pendingCopilot = { waitForToken: flow.waitForToken };\n json(res, { userCode: flow.userCode, verificationUrl: flow.verificationUrl });\n return;\n }\n\n if (provider === \"claude\") {\n if (!options.createClaudeAuth) {\n json(res, { error: \"Claude auth not configured\" }, 400);\n return;\n }\n const auth = options.createClaudeAuth();\n const flow = auth.startOAuthFlow();\n pendingClaude = { completeAuth: flow.completeAuth };\n json(res, { authorizeUrl: flow.authorizeUrl });\n return;\n }\n\n // vercel-ai: no server-side flow needed\n json(res, { ready: true });\n return;\n }\n\n // POST /auth/copilot/poll\n if (method === \"POST\" && path === \"/auth/copilot/poll\") {\n if (!pendingCopilot) {\n json(res, { error: \"No active Copilot flow\" }, 400);\n return;\n }\n const token = await pendingCopilot.waitForToken();\n pendingCopilot = null;\n await tokenStore.save(\"copilot\", token);\n if (onAuth) await onAuth(\"copilot\", token);\n json(res, { ok: true, login: token.login });\n return;\n }\n\n // POST /auth/claude/complete\n if (method === \"POST\" && path === \"/auth/claude/complete\") {\n if (!pendingClaude) {\n json(res, { error: \"No active Claude flow\" }, 400);\n return;\n }\n const body = await readBody(req, maxBodySize);\n const code = body.code as string;\n if (!code || typeof code !== \"string\") {\n json(res, { error: \"code is required\" }, 400);\n return;\n }\n const token = await pendingClaude.completeAuth(code);\n pendingClaude = null;\n await tokenStore.save(\"claude\", token);\n if (onAuth) await onAuth(\"claude\", token);\n json(res, { ok: true });\n return;\n }\n\n // POST /auth/vercel/complete\n if (method === \"POST\" && path === \"/auth/vercel/complete\") {\n const body = await readBody(req, maxBodySize);\n const apiKey = body.apiKey as string;\n if (!apiKey || typeof apiKey !== \"string\") {\n json(res, { error: \"apiKey is required\" }, 400);\n return;\n }\n const token: AuthToken = {\n accessToken: apiKey,\n tokenType: \"bearer\",\n obtainedAt: Date.now(),\n };\n // Preserve baseUrl in token for later restoration\n const storeToken = body.baseUrl\n ? { ...token, baseUrl: body.baseUrl as string }\n : token;\n await tokenStore.save(\"vercel-ai\", storeToken as AuthToken);\n if (onAuth) await onAuth(\"vercel-ai\", storeToken as AuthToken);\n json(res, { ok: true });\n return;\n }\n\n // GET /tokens/saved\n if (method === \"GET\" && path === \"/tokens/saved\") {\n const saved = await tokenStore.list();\n json(res, { saved });\n return;\n }\n\n // POST /tokens/use\n if (method === \"POST\" && path === \"/tokens/use\") {\n const body = await readBody(req, maxBodySize);\n const provider = body.provider as string;\n if (!provider || !isValidProvider(provider)) {\n json(res, { error: \"provider is required (copilot, claude, vercel-ai)\" }, 400);\n return;\n }\n const token = await tokenStore.load(provider);\n if (!token) {\n json(res, { error: `No saved token for ${provider}` }, 404);\n return;\n }\n if (onAuth) await onAuth(provider, token);\n json(res, { ok: true, provider });\n return;\n }\n\n // POST /tokens/clear\n if (method === \"POST\" && path === \"/tokens/clear\") {\n await tokenStore.clearAll();\n if (options.onLogout) await options.onLogout();\n json(res, { ok: true });\n return;\n }\n\n // POST /auth/dispose\n if (method === \"POST\" && path === \"/auth/dispose\") {\n pendingCopilot = null;\n pendingClaude = null;\n if (options.onLogout) await options.onLogout();\n json(res, { ok: true });\n return;\n }\n\n // No route matched\n json(res, { error: \"Not found\" }, 404);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n json(res, { error: message }, 500);\n }\n };\n}\n\n// ─── Internal Helpers ──────────────────────────────────────────\n\nfunction isValidProvider(p: string): p is AuthProvider {\n return p === \"copilot\" || p === \"claude\" || p === \"vercel-ai\";\n}\n\nfunction readBody(req: ReadableRequest, maxSize: number): Promise<Record<string, unknown>> {\n return new Promise((resolve) => {\n let body = \"\";\n let size = 0;\n let exceeded = false;\n req.on(\"data\", (chunk: Buffer | string) => {\n if (exceeded) return;\n const str = chunk.toString();\n size += Buffer.byteLength(str);\n if (size > maxSize) {\n exceeded = true;\n resolve({});\n return;\n }\n body += str;\n });\n req.on(\"end\", () => {\n if (exceeded) return;\n try {\n resolve(JSON.parse(body || \"{}\"));\n } catch {\n resolve({});\n }\n });\n if (\"once\" in req && typeof (req as { once: unknown }).once === \"function\") {\n (req as { once(event: string, listener: () => void): void }).once(\"error\", () => resolve({}));\n }\n });\n}\n\nfunction json(res: WritableResponse, data: unknown, status = 200): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n","/**\n * CORS middleware — standalone composable function.\n * Returns true if it fully handled the request (OPTIONS preflight),\n * false if the caller should continue processing.\n */\n\n/** Configuration for CORS middleware */\nexport interface CorsOptions {\n /** Allowed origins. Default: \"*\" (any origin) */\n origin?: string | string[];\n /** Allowed HTTP methods. Default: common REST methods */\n methods?: string[];\n /** Allowed request headers. Default: [\"Content-Type\"] */\n headers?: string[];\n /** Max age for preflight cache in seconds. Default: 86400 (24h) */\n maxAge?: number;\n}\n\n/** Minimal request interface for CORS */\ninterface CorsRequest {\n readonly method?: string;\n readonly headers?: Record<string, string | string[] | undefined>;\n}\n\n/** Minimal response interface for CORS */\ninterface CorsResponse {\n setHeader(name: string, value: string): void;\n writeHead(statusCode: number): void;\n end(): void;\n}\n\n/**\n * Create a CORS middleware function.\n *\n * @returns A function that sets CORS headers and handles OPTIONS preflight.\n * Returns `true` if the request was fully handled (preflight),\n * `false` if the caller should continue processing.\n */\nexport function corsMiddleware(options?: CorsOptions): (req: CorsRequest, res: CorsResponse) => boolean {\n const origin = options?.origin ?? \"*\";\n const methods = options?.methods ?? [\"GET\", \"POST\", \"DELETE\", \"OPTIONS\"];\n const headers = options?.headers ?? [\"Content-Type\"];\n const maxAge = options?.maxAge ?? 86400;\n\n const methodsValue = methods.join(\", \");\n const headersValue = headers.join(\", \");\n\n return (req: CorsRequest, res: CorsResponse): boolean => {\n // Determine origin header value per spec\n let originValue: string;\n if (Array.isArray(origin)) {\n const reqOrigin = typeof req.headers?.origin === \"string\" ? req.headers.origin : \"\";\n originValue = origin.includes(reqOrigin) ? reqOrigin : origin[0];\n res.setHeader(\"Vary\", \"Origin\");\n } else {\n originValue = origin;\n }\n res.setHeader(\"Access-Control-Allow-Origin\", originValue);\n res.setHeader(\"Access-Control-Allow-Methods\", methodsValue);\n res.setHeader(\"Access-Control-Allow-Headers\", headersValue);\n\n if (req.method === \"OPTIONS\") {\n res.setHeader(\"Access-Control-Max-Age\", String(maxAge));\n res.writeHead(204);\n res.end();\n return true;\n }\n\n return false;\n };\n}\n","/**\n * createChatServer — one-call setup combining runtime, chat handler, auth handler, CORS,\n * and static file serving into a single HTTP request handler.\n *\n * Routes:\n * - CORS preflight (OPTIONS) on all paths\n * - {chatPrefix}/* → createChatHandler routes\n * - {authPrefix}/* → createAuthHandler routes (if tokenStore provided)\n * - {staticPrefix}/* → static file serving (if staticDir provided)\n * - Everything else → 404\n */\n\nimport { createChatHandler } from \"./handler.js\";\nimport type { ReadableRequest, WritableResponse, ChatHandlerOptions } from \"./handler.js\";\nimport { createAuthHandler } from \"./auth-handler.js\";\nimport type { AuthHandlerOptions } from \"./auth-handler.js\";\nimport { corsMiddleware } from \"./cors.js\";\nimport type { CorsOptions } from \"./cors.js\";\nimport type { IChatRuntime } from \"../runtime.js\";\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\n// ─── Options ───────────────────────────────────────────────────\n\n/** Configuration for createChatServer */\nexport interface ChatServerOptions {\n /** The chat runtime instance to serve */\n runtime: IChatRuntime;\n\n /** Prefix for chat API routes. Default: \"/api/chat\" */\n chatPrefix?: string;\n\n /** Auth handler options. If provided, auth routes are mounted. */\n auth?: AuthHandlerOptions;\n\n /** Prefix for auth routes. Default: \"/api/auth\" */\n authPrefix?: string;\n\n /** CORS options. Pass false to disable CORS. Default: enabled with permissive settings */\n cors?: CorsOptions | false;\n\n /** Directory to serve static files from. Omit to disable static serving. */\n staticDir?: string;\n\n /** Prefix for static file routes. Default: \"/\" */\n staticPrefix?: string;\n\n /** Chat handler options (maxBodySize, etc.) */\n chatHandlerOptions?: Omit<ChatHandlerOptions, \"prefix\">;\n}\n\n// ─── MIME Types ────────────────────────────────────────────────\n\nconst MIME_TYPES: Record<string, string> = {\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".txt\": \"text/plain\",\n \".map\": \"application/json\",\n};\n\n// ─── Handler Factory ───────────────────────────────────────────\n\n/** Request handler type returned by createChatServer */\nexport type RequestHandler = (req: ReadableRequest, res: WritableResponse) => Promise<void>;\n\n/**\n * Create a combined HTTP request handler that routes to chat, auth, static, or 404.\n *\n * @param options - Server configuration\n * @returns Async request handler\n *\n * @example\n * ```ts\n * import http from \"node:http\";\n * import { createChatServer } from \"@witqq/agent-sdk/chat/server\";\n *\n * const handler = createChatServer({\n * runtime,\n * auth: { tokenStore },\n * staticDir: \"./public\",\n * });\n *\n * http.createServer(handler).listen(3000);\n * ```\n */\nexport function createChatServer(options: ChatServerOptions): RequestHandler {\n const chatPrefix = options.chatPrefix ?? \"/api/chat\";\n const authPrefix = options.authPrefix ?? \"/api/auth\";\n const staticPrefix = options.staticPrefix ?? \"/\";\n const staticDir = options.staticDir ? path.resolve(options.staticDir) : undefined;\n\n // Create sub-handlers\n const chatHandler = createChatHandler(options.runtime, {\n prefix: chatPrefix,\n ...options.chatHandlerOptions,\n });\n\n const authHandler = options.auth ? createAuthHandler(options.auth) : undefined;\n\n const cors = options.cors !== false\n ? corsMiddleware(options.cors)\n : undefined;\n\n return async (req: ReadableRequest, res: WritableResponse): Promise<void> => {\n const url = req.url || \"/\";\n const urlPath = url.split(\"?\")[0];\n\n // CORS preflight\n if (cors) {\n const corsReq = { method: req.method, headers: (req as unknown as Record<string, unknown>).headers as Record<string, string | string[] | undefined> };\n const corsRes = {\n setHeader: (name: string, value: string) => res.setHeader(name, value),\n writeHead: (statusCode: number) => res.writeHead(statusCode, {}),\n end: () => res.end(),\n };\n if (cors(corsReq, corsRes)) {\n return;\n }\n }\n\n // Chat routes\n if (urlPath.startsWith(chatPrefix + \"/\") || urlPath === chatPrefix) {\n await chatHandler(req, res);\n return;\n }\n\n // Auth routes\n if (authHandler && (urlPath.startsWith(authPrefix + \"/\") || urlPath === authPrefix)) {\n const authReq = Object.create(req, {\n url: { value: url.replace(authPrefix, \"\"), enumerable: true },\n });\n await authHandler(authReq, res);\n return;\n }\n\n // Static file serving\n if (staticDir && req.method === \"GET\" && urlPath.startsWith(staticPrefix)) {\n const relativePath = urlPath === staticPrefix || urlPath === staticPrefix + \"/\"\n ? \"/index.html\"\n : urlPath.slice(staticPrefix.length) || \"/index.html\";\n\n // Prevent directory traversal (include path.sep to block sibling-prefix attacks)\n const filePath = path.join(staticDir, relativePath);\n if (!filePath.startsWith(staticDir + path.sep) && filePath !== staticDir) {\n res.writeHead(403, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Forbidden\" }));\n return;\n }\n\n try {\n const stat = fs.statSync(filePath);\n if (stat.isFile()) {\n const ext = path.extname(filePath).toLowerCase();\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n const content = fs.readFileSync(filePath);\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Content-Length\": String(content.length),\n });\n res.write(content.toString());\n res.end();\n return;\n }\n } catch {\n // File not found — fall through to 404\n }\n }\n\n // 404\n json(res, 404, { error: \"Not found\" });\n };\n}\n\nfunction json(res: WritableResponse, status: number, body: unknown): void {\n const data = JSON.stringify(body);\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(data);\n}\n","/**\n * Token storage abstraction and default filesystem implementation.\n */\n\nimport type { AuthToken } from \"../../auth/types.js\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n// ─── Interface ─────────────────────────────────────────────────\n\n/** Token storage interface for server-side token management */\nexport interface ITokenStore {\n /** Save a token for a provider. Overwrites if exists. */\n save(provider: string, token: AuthToken): Promise<void>;\n /** Load a previously saved token. Returns null if not found. */\n load(provider: string): Promise<AuthToken | null>;\n /** Remove a specific provider's token. */\n clear(provider: string): Promise<void>;\n /** Remove all stored tokens. */\n clearAll(): Promise<void>;\n /** List provider names that have saved tokens. */\n list(): Promise<string[]>;\n}\n\n// ─── In-Memory Implementation ──────────────────────────────────\n\n/** In-memory token store for testing and ephemeral use */\nexport class InMemoryTokenStore implements ITokenStore {\n private readonly tokens = new Map<string, AuthToken>();\n\n async save(provider: string, token: AuthToken): Promise<void> {\n this.tokens.set(provider, { ...token });\n }\n\n async load(provider: string): Promise<AuthToken | null> {\n const t = this.tokens.get(provider);\n return t ? { ...t } : null;\n }\n\n async clear(provider: string): Promise<void> {\n this.tokens.delete(provider);\n }\n\n async clearAll(): Promise<void> {\n this.tokens.clear();\n }\n\n async list(): Promise<string[]> {\n return [...this.tokens.keys()];\n }\n}\n\n// ─── File System Implementation ────────────────────────────────\n\n/** Options for FileTokenStore */\nexport interface FileTokenStoreOptions {\n /** Directory to store token JSON files. Default: \".tokens\" in cwd */\n directory: string;\n}\n\n/** Filesystem-based token store using JSON files (one per provider) */\nexport class FileTokenStore implements ITokenStore {\n private readonly dir: string;\n\n constructor(options: FileTokenStoreOptions) {\n this.dir = options.directory;\n }\n\n async save(provider: string, token: AuthToken): Promise<void> {\n mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath(provider), JSON.stringify(token));\n }\n\n async load(provider: string): Promise<AuthToken | null> {\n try {\n const data = readFileSync(this.filePath(provider), \"utf-8\");\n return JSON.parse(data) as AuthToken;\n } catch {\n return null;\n }\n }\n\n async clear(provider: string): Promise<void> {\n try {\n unlinkSync(this.filePath(provider));\n } catch {\n // File may not exist\n }\n }\n\n async clearAll(): Promise<void> {\n if (!existsSync(this.dir)) return;\n for (const f of readdirSync(this.dir)) {\n if (f.endsWith(\"-token.json\")) {\n try {\n unlinkSync(join(this.dir, f));\n } catch {\n // Ignore individual file errors\n }\n }\n }\n }\n\n async list(): Promise<string[]> {\n if (!existsSync(this.dir)) return [];\n return readdirSync(this.dir)\n .filter(f => f.endsWith(\"-token.json\"))\n .map(f => f.replace(/-token\\.json$/, \"\"));\n }\n\n private filePath(provider: string): string {\n return join(this.dir, `${provider}-token.json`);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/chat/server/utils.ts","../../src/chat/server/routes/sessions.ts","../../src/chat/backends/transport.ts","../../src/errors.ts","../../src/chat/errors.ts","../../src/chat/server/request-context.ts","../../src/chat/server/routes/messages.ts","../../src/chat/server/routes/config.ts","../../src/chat/server/routes/providers.ts","../../src/chat/server/handler.ts","../../src/chat/server/auth-handler.ts","../../src/chat/server/cors.ts","../../src/chat/types.ts","../../src/chat/bridge.ts","../../src/chat/context.ts","../../src/chat/state.ts","../../src/chat/accumulator.ts","../../src/chat/watchdog.ts","../../src/chat/listener-set.ts","../../src/chat/runtime.ts","../../src/chat/server/chat-server.ts","../../src/chat/server/token-store.ts","../../src/chat/server/provider-handler.ts","../../src/chat/server/provider-store.ts","../../src/auth/refresh-manager.ts","../../src/chat/server/service-manager.ts","../../src/chat/server/adapter-pool.ts"],"names":["resolve","path","randomUUID","result","fs","mkdirSync","writeFileSync","readFileSync","unlinkSync","existsSync","readdirSync","join","delay"],"mappings":"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","file":"server.cjs","sourcesContent":["/**\n * Shared server utilities — readBody and JSON response helpers.\n */\n\nimport type { ReadableRequest, WritableResponse } from \"./handler.js\";\n\n/** Error thrown by readBody with an HTTP status code */\nexport class BodyParseError extends Error {\n readonly statusCode: number;\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = \"BodyParseError\";\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Read and parse JSON request body with size limit.\n * Throws BodyParseError on oversized, malformed, or errored requests.\n */\nexport function readBody(req: ReadableRequest, maxSize = 1_048_576): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n let body = \"\";\n let size = 0;\n let exceeded = false;\n req.on(\"data\", (chunk: Buffer | string) => {\n if (exceeded) return;\n const str = chunk.toString();\n size += Buffer.byteLength(str);\n if (size > maxSize) {\n exceeded = true;\n reject(new BodyParseError(\"Request body too large\", 413));\n return;\n }\n body += str;\n });\n req.on(\"end\", () => {\n if (exceeded) return;\n try {\n resolve(JSON.parse(body || \"{}\"));\n } catch {\n reject(new BodyParseError(\"Invalid JSON in request body\", 400));\n }\n });\n if (\"once\" in req && typeof (req as { once: unknown }).once === \"function\") {\n (req as { once(event: string, listener: () => void): void }).once(\"error\", () =>\n reject(new BodyParseError(\"Request error\", 500)),\n );\n }\n });\n}\n\n/** Send a JSON response with given status code. */\nexport function json(res: WritableResponse, data: unknown, status = 200): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n","/**\n * Session CRUD route handlers.\n *\n * Routes:\n * - POST /sessions/create → Create session\n * - GET /sessions/:id → Get session\n * - GET /sessions → List sessions\n * - DELETE /sessions/:id → Delete session\n * - GET /sessions/:id/context-stats → Get context window stats\n */\n\nimport type { RouteHandler } from \"./types.js\";\nimport { readBody, json } from \"../utils.js\";\n\nexport const sessionRoutes: RouteHandler = async (method, path, req, res, ctx) => {\n const { runtime, maxBodySize } = ctx;\n const sessionMatch = path.match(/^\\/sessions\\/([^/]+)$/);\n const contextStatsMatch = path.match(/^\\/sessions\\/([^/]+)\\/context-stats$/);\n\n // POST /sessions/create\n if (method === \"POST\" && path === \"/sessions/create\") {\n const body = await readBody(req, maxBodySize);\n const session = await runtime.createSession({\n title: body.title as string || `Chat ${new Date().toLocaleTimeString()}`,\n config: body.config as { model: string; backend: string } || {\n model: \"\",\n backend: \"\",\n },\n ...(body.tags ? { tags: body.tags as string[] } : {}),\n ...(body.custom ? { custom: body.custom as Record<string, unknown> } : {}),\n });\n json(res, session);\n return true;\n }\n\n // GET /sessions/:id/context-stats (must be before GET /sessions/:id)\n if (method === \"GET\" && contextStatsMatch) {\n const id = decodeURIComponent(contextStatsMatch[1]);\n const stats = await runtime.getContextStats(id);\n json(res, stats ?? null);\n return true;\n }\n\n // GET /sessions/:id\n if (method === \"GET\" && sessionMatch) {\n const id = decodeURIComponent(sessionMatch[1]);\n const session = await runtime.getSession(id);\n if (!session) {\n json(res, { error: \"Not found\" }, 404);\n return true;\n }\n json(res, session);\n return true;\n }\n\n // DELETE /sessions/:id\n if (method === \"DELETE\" && sessionMatch) {\n const id = decodeURIComponent(sessionMatch[1]);\n await runtime.deleteSession(id);\n json(res, { ok: true });\n return true;\n }\n\n // GET /sessions\n if (method === \"GET\" && path === \"/sessions\") {\n const sessions = await runtime.listSessions();\n json(res, sessions);\n return true;\n }\n\n return false;\n};\n","/**\n * @witqq/agent-sdk/chat/backends/transport\n *\n * IChatTransport abstracts how ChatEvents are delivered to clients.\n * SSEChatTransport implements Server-Sent Events over HTTP.\n */\n\nimport type { ChatEvent } from \"../core.js\";\n\n// ─── IChatTransport Interface ──────────────────────────────────\n\n/**\n * Abstraction for delivering chat events to a client.\n * Implementations handle protocol details (SSE, WebSocket, etc.).\n */\nexport interface IChatTransport {\n /** Send a single chat event to the client */\n send(event: ChatEvent): void;\n\n /** Signal stream completion and close the connection */\n close(): void;\n\n /** Signal an error to the client */\n error(err: Error): void;\n\n /** Whether the transport is still open */\n readonly isOpen: boolean;\n}\n\n// ─── SSE Chat Transport ────────────────────────────────────────\n\n/** Writable HTTP response interface — minimal type satisfied by Express, Fastify (raw), and Node http.ServerResponse without casts. */\nexport interface WritableResponse {\n writeHead(statusCode: number, headers?: Record<string, string | string[]>): unknown;\n setHeader(name: string, value: string): unknown;\n write(chunk: string): boolean;\n end(body?: string): unknown;\n readonly writableEnded: boolean;\n}\n\n/** Minimal interface for detecting client disconnection */\nexport interface CloseDetectable {\n on(event: \"close\", listener: () => void): void;\n}\n\n/** Configuration options for SSEChatTransport */\nexport interface SSETransportOptions {\n /** Heartbeat interval in milliseconds. 0 or undefined disables heartbeat. */\n heartbeatMs?: number;\n /** Request object for detecting client disconnection (listens for 'close' event) */\n request?: CloseDetectable;\n}\n\n/**\n * Server-Sent Events transport for ChatEvent streaming.\n * Sends events as `data: JSON\\n\\n` lines with SSE headers.\n */\nexport class SSEChatTransport implements IChatTransport {\n private readonly res: WritableResponse;\n private _open: boolean;\n private _heartbeatTimer: ReturnType<typeof setInterval> | undefined;\n\n constructor(res: WritableResponse, options?: SSETransportOptions) {\n this.res = res;\n this._open = true;\n\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n\n // Close detection via request 'close' event\n if (options?.request) {\n options.request.on(\"close\", () => {\n this._cleanup();\n });\n }\n\n // Periodic heartbeat to keep connection alive\n const heartbeatMs = options?.heartbeatMs;\n if (heartbeatMs && heartbeatMs > 0) {\n this._heartbeatTimer = setInterval(() => {\n if (!this.isOpen) {\n this._clearHeartbeat();\n return;\n }\n this.res.write(\": heartbeat\\n\\n\");\n }, heartbeatMs);\n }\n }\n\n get isOpen(): boolean {\n return this._open && !this.res.writableEnded;\n }\n\n send(event: ChatEvent): void {\n if (!this.isOpen) return;\n this.res.write(`data: ${JSON.stringify(event)}\\n\\n`);\n }\n\n close(): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n this.res.write(`data: [DONE]\\n\\n`);\n this.res.end();\n }\n\n error(err: Error): void {\n if (!this.isOpen) return;\n this._open = false;\n this._clearHeartbeat();\n const errorEvent: ChatEvent = {\n type: \"error\",\n error: err.message,\n recoverable: false,\n };\n this.res.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n this.res.end();\n }\n\n private _cleanup(): void {\n this._open = false;\n this._clearHeartbeat();\n }\n\n private _clearHeartbeat(): void {\n if (this._heartbeatTimer !== undefined) {\n clearInterval(this._heartbeatTimer);\n this._heartbeatTimer = undefined;\n }\n }\n}\n\n// ─── Helper: Stream Adapter Events to Transport ────────────────\n\n/**\n * Pipes an async iterable of ChatEvents into a transport.\n * Handles errors and ensures transport is closed on completion.\n *\n * @param events - Async iterable of ChatEvent (from adapter.streamMessage)\n * @param transport - Transport to send events through\n */\nexport async function streamToTransport(\n events: AsyncIterable<ChatEvent>,\n transport: IChatTransport,\n): Promise<void> {\n try {\n let accumulatedText = \"\";\n\n for await (const event of events) {\n if (!transport.isOpen) break;\n transport.send(event);\n\n if (event.type === \"message:delta\") {\n accumulatedText += event.text;\n }\n }\n\n if (transport.isOpen) {\n transport.send({ type: \"done\", finalOutput: accumulatedText || undefined });\n }\n transport.close();\n } catch (err) {\n transport.error(err instanceof Error ? err : new Error(String(err)));\n }\n}\n","import { ErrorCode } from \"./types/errors.js\";\n\n/** Options for constructing an AgentSDKError */\nexport interface AgentSDKErrorOptions extends ErrorOptions {\n /** Machine-readable error code */\n code?: string;\n /** Whether this error is retryable (default: false) */\n retryable?: boolean;\n /** HTTP status code hint (e.g. 401, 429, 500) */\n httpStatus?: number;\n}\n\n/** Base error class for agent-sdk.\n *\n * Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks\n * (works across separately bundled entry points where `instanceof` may fail). */\nexport class AgentSDKError extends Error {\n /** @internal Marker for cross-bundle identity checks */\n readonly _agentSDKError = true as const;\n /** Machine-readable error code. Prefer values from the ErrorCode enum. */\n readonly code?: string;\n /** Whether this error is safe to retry */\n readonly retryable: boolean;\n /** HTTP status code hint for error classification */\n readonly httpStatus?: number;\n\n constructor(message: string, options?: AgentSDKErrorOptions) {\n super(message, options);\n this.name = \"AgentSDKError\";\n this.code = options?.code;\n this.retryable = options?.retryable ?? false;\n this.httpStatus = options?.httpStatus;\n }\n\n /** Check if an error is an AgentSDKError (works across bundled copies) */\n static is(error: unknown): error is AgentSDKError {\n return (\n error instanceof Error &&\n \"_agentSDKError\" in error &&\n (error as AgentSDKError)._agentSDKError === true\n );\n }\n}\n\n/** Thrown when agent.run() is called while already running (M8 re-entrancy guard) */\nexport class ReentrancyError extends AgentSDKError {\n constructor() {\n super(\"Agent is already running. Await the current run before starting another.\", {\n code: ErrorCode.REENTRANCY,\n });\n this.name = \"ReentrancyError\";\n }\n}\n\n/** Thrown when an operation is attempted on a disposed agent/service */\nexport class DisposedError extends AgentSDKError {\n constructor(entity: string) {\n super(`${entity} has been disposed and cannot be used.`, {\n code: ErrorCode.DISPOSED,\n });\n this.name = \"DisposedError\";\n }\n}\n\n/** Thrown when a backend is not found in the registry */\nexport class BackendNotFoundError extends AgentSDKError {\n constructor(backend: string) {\n super(\n `Unknown backend: \"${backend}\". ` +\n `Built-in: copilot, claude, vercel-ai. ` +\n `Custom: use registerBackend() first.`,\n { code: ErrorCode.BACKEND_NOT_INSTALLED },\n );\n this.name = \"BackendNotFoundError\";\n }\n}\n\n/** Thrown when a backend is already registered */\nexport class BackendAlreadyRegisteredError extends AgentSDKError {\n constructor(backend: string) {\n super(`Backend \"${backend}\" is already registered. Use a different name or unregister first.`);\n this.name = \"BackendAlreadyRegisteredError\";\n }\n}\n\n/** Thrown when subprocess management fails */\nexport class SubprocessError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, { ...options, code: ErrorCode.DEPENDENCY_MISSING });\n this.name = \"SubprocessError\";\n }\n}\n\n/** Thrown when a required peer dependency is not installed */\nexport class DependencyError extends AgentSDKError {\n public readonly packageName: string;\n\n constructor(packageName: string) {\n super(`${packageName} is not installed. Install it: npm install ${packageName}`, {\n code: ErrorCode.DEPENDENCY_MISSING,\n });\n this.name = \"DependencyError\";\n this.packageName = packageName;\n }\n}\n\n/** Thrown when an agent run is aborted */\nexport class AbortError extends AgentSDKError {\n constructor() {\n super(\"Agent run was aborted.\", { code: ErrorCode.ABORTED });\n this.name = \"AbortError\";\n }\n}\n\n/** Thrown when a tool execution fails */\nexport class ToolExecutionError extends AgentSDKError {\n public readonly toolName: string;\n\n constructor(toolName: string, message: string, options?: ErrorOptions) {\n super(`Tool \"${toolName}\" failed: ${message}`, { ...options, code: ErrorCode.TOOL_EXECUTION });\n this.name = \"ToolExecutionError\";\n this.toolName = toolName;\n }\n}\n\n/** Thrown when a stream has no activity within the configured timeout */\nexport class ActivityTimeoutError extends AgentSDKError {\n constructor(timeoutMs: number) {\n super(`Stream activity timeout: no event received within ${timeoutMs}ms.`, {\n code: ErrorCode.TIMEOUT,\n retryable: true,\n });\n this.name = \"ActivityTimeoutError\";\n }\n}\n\n/** Thrown when structured output parsing fails */\nexport class StructuredOutputError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(`Structured output error: ${message}`, { ...options, code: ErrorCode.INVALID_RESPONSE });\n this.name = \"StructuredOutputError\";\n }\n}\n","/**\n * @witqq/agent-sdk/chat/errors\n *\n * Flat error taxonomy with unified ErrorCode enum, ChatError class,\n * pattern-matching classifier, retry strategies with exponential backoff.\n * Extends the existing AgentSDKError from @witqq/agent-sdk.\n */\n\nimport { AgentSDKError } from \"../errors.js\";\nimport { ErrorCode } from \"../types/errors.js\";\n\n// ─── Re-export ErrorCode ───────────────────────────────────────\n\nexport { ErrorCode };\n\n// ─── Error Options ─────────────────────────────────────────────\n\n/** Options for constructing a ChatError */\nexport interface ChatErrorOptions {\n /** Machine-readable error code */\n code: ErrorCode;\n /** Whether this error is retryable (default: false) */\n retryable?: boolean;\n /** Retry delay hint in milliseconds */\n retryAfter?: number;\n /** Original cause, if wrapping another error */\n cause?: unknown;\n}\n\n// ─── Unified Error Class ───────────────────────────────────────\n\n/** Unified error class for all chat SDK errors */\nexport class ChatError extends AgentSDKError {\n readonly code: ErrorCode;\n readonly retryable: boolean;\n readonly retryAfter?: number;\n readonly timestamp: string;\n\n constructor(message: string, options: ChatErrorOptions) {\n super(message, {\n cause: options.cause,\n code: options.code,\n retryable: options.retryable,\n });\n this.name = \"ChatError\";\n this.code = options.code;\n this.retryable = options.retryable ?? false;\n this.retryAfter = options.retryAfter;\n this.timestamp = new Date().toISOString();\n }\n}\n\n// ─── Classification ────────────────────────────────────────────\n\n/**\n * Classify an unknown thrown value into a ChatError with the appropriate code.\n * Pattern-matches against common error shapes:\n * - Already a ChatError → returned as-is\n * - Fetch/network errors (ECONNREFUSED, ETIMEDOUT, etc.)\n * - HTTP status codes (401→AUTH_INVALID, 429→RATE_LIMIT, 5xx→PROVIDER_ERROR)\n * - Timeout patterns\n * - Zod validation errors\n * - Context overflow patterns\n * - Unknown → wrapped as ChatError with PROVIDER_ERROR\n *\n * @param error - The thrown value to classify\n * @returns ChatError with appropriate error code and retryable flag\n */\nexport function classifyError(error: unknown): ChatError {\n if (error instanceof ChatError) {\n return error;\n }\n\n if (error instanceof Error) {\n const msg = error.message.toLowerCase();\n\n // Network errors\n if (isNetworkError(msg)) {\n return new ChatError(error.message, {\n code: ErrorCode.NETWORK,\n retryable: true,\n cause: error,\n });\n }\n\n // Timeout errors\n if (isTimeoutPattern(msg)) {\n return new ChatError(error.message, {\n code: ErrorCode.TIMEOUT,\n retryable: true,\n cause: error,\n });\n }\n\n // Zod validation errors\n if (isZodError(error)) {\n return new ChatError(error.message, {\n code: ErrorCode.INVALID_INPUT,\n retryable: false,\n cause: error,\n });\n }\n\n // HTTP status code errors\n const statusCode = extractStatusCode(error);\n if (statusCode !== null) {\n return classifyByStatusCode(statusCode, error);\n }\n\n // Context overflow patterns\n if (isContextOverflow(msg)) {\n return new ChatError(error.message, {\n code: ErrorCode.CONTEXT_OVERFLOW,\n retryable: false,\n cause: error,\n });\n }\n }\n\n // Unknown errors\n const message =\n error instanceof Error ? error.message : String(error);\n return new ChatError(message, {\n code: ErrorCode.PROVIDER_ERROR,\n retryable: false,\n cause: error,\n });\n}\n\n// ─── Classification Helpers ────────────────────────────────────\n\nconst NETWORK_PATTERNS = [\n \"econnrefused\",\n \"econnreset\",\n \"enotfound\",\n \"etimedout\",\n \"enetunreach\",\n \"epipe\",\n \"fetch failed\",\n \"network error\",\n \"network request failed\",\n \"failed to fetch\",\n \"dns lookup failed\",\n] as const;\n\nfunction isNetworkError(msg: string): boolean {\n return NETWORK_PATTERNS.some((p) => msg.includes(p));\n}\n\nfunction isTimeoutPattern(msg: string): boolean {\n return (\n msg.includes(\"timeout\") ||\n msg.includes(\"timed out\") ||\n msg.includes(\"deadline exceeded\") ||\n msg.includes(\"aborted due to timeout\")\n );\n}\n\nfunction isZodError(error: Error): boolean {\n return (\n error.name === \"ZodError\" ||\n (\"issues\" in error && Array.isArray((error as unknown as Record<string, unknown>).issues))\n );\n}\n\nfunction extractStatusCode(error: Error): number | null {\n const errRecord = error as unknown as Record<string, unknown>;\n if (typeof errRecord.status === \"number\") return errRecord.status;\n if (typeof errRecord.statusCode === \"number\") return errRecord.statusCode;\n\n // Check message for HTTP status codes\n const match = error.message.match(/\\b(4\\d{2}|5\\d{2})\\b/);\n return match ? parseInt(match[1], 10) : null;\n}\n\nfunction classifyByStatusCode(status: number, error: Error): ChatError {\n if (status === 401 || status === 403) {\n return new ChatError(error.message, {\n code: ErrorCode.AUTH_INVALID,\n retryable: false,\n cause: error,\n });\n }\n if (status === 429) {\n const retryAfterSeconds = extractRetryAfter(error);\n return new ChatError(error.message, {\n code: ErrorCode.RATE_LIMIT,\n retryable: true,\n retryAfter: retryAfterSeconds != null ? retryAfterSeconds * 1000 : undefined,\n cause: error,\n });\n }\n if (status >= 500) {\n return new ChatError(error.message, {\n code: ErrorCode.PROVIDER_ERROR,\n retryable: true,\n cause: error,\n });\n }\n // 4xx other than auth/rate-limit → invalid input\n if (status >= 400 && status < 500) {\n return new ChatError(error.message, {\n code: ErrorCode.INVALID_INPUT,\n retryable: false,\n cause: error,\n });\n }\n return new ChatError(error.message, {\n code: ErrorCode.NETWORK,\n retryable: true,\n cause: error,\n });\n}\n\nfunction extractRetryAfter(error: Error): number | undefined {\n const errRecord = error as unknown as Record<string, unknown>;\n if (typeof errRecord.retryAfter === \"number\") return errRecord.retryAfter;\n const match = error.message.match(/retry.after[:\\s]*(\\d+)/i);\n return match ? parseInt(match[1], 10) : undefined;\n}\n\nfunction isContextOverflow(msg: string): boolean {\n return (\n msg.includes(\"context length exceeded\") ||\n msg.includes(\"maximum context length\") ||\n msg.includes(\"context window\") ||\n msg.includes(\"token limit\") ||\n msg.includes(\"too many tokens\")\n );\n}\n\n// ─── Retry Strategy ────────────────────────────────────────────\n\n/** Strategy for computing retry delays */\nexport interface RetryStrategy {\n /** Return delay in ms for the given attempt (0-based), or null to stop */\n nextDelay(attempt: number, error: ChatError): number | null;\n}\n\n/** Options for ExponentialBackoffStrategy */\nexport interface ExponentialBackoffOptions {\n /** Base delay in ms (default: 1000) */\n baseMs?: number;\n /** Maximum delay in ms (default: 30000) */\n maxMs?: number;\n /** Maximum number of attempts (default: 3) */\n maxAttempts?: number;\n /** Jitter factor 0–1 (default: 0.1) */\n jitter?: number;\n}\n\n/** Exponential backoff with optional jitter */\nexport class ExponentialBackoffStrategy implements RetryStrategy {\n private readonly baseMs: number;\n private readonly maxMs: number;\n private readonly maxAttempts: number;\n private readonly jitter: number;\n\n constructor(options?: ExponentialBackoffOptions) {\n this.baseMs = options?.baseMs ?? 1000;\n this.maxMs = options?.maxMs ?? 30000;\n this.maxAttempts = options?.maxAttempts ?? 3;\n this.jitter = Math.max(0, Math.min(1, options?.jitter ?? 0.1));\n }\n\n nextDelay(attempt: number, error: ChatError): number | null {\n if (attempt >= this.maxAttempts) return null;\n if (!error.retryable) return null;\n\n // Rate-limit errors with retryAfter (already in ms) take priority\n if (error.code === ErrorCode.RATE_LIMIT && error.retryAfter) {\n return error.retryAfter;\n }\n\n const delay = Math.min(this.baseMs * Math.pow(2, attempt), this.maxMs);\n const jitterAmount = delay * this.jitter * (Math.random() * 2 - 1);\n return Math.max(0, Math.round(delay + jitterAmount));\n }\n}\n\n// ─── Retry Execution ───────────────────────────────────────────\n\n/** Options for withRetry execution */\nexport interface RetryOptions {\n /** Abort signal to cancel retries */\n signal?: AbortSignal;\n /** Called before each retry with the error and delay */\n onRetry?: (error: ChatError, attempt: number, delayMs: number) => void;\n}\n\n/**\n * Execute an async function with automatic retries using the provided strategy.\n * Respects ChatError.retryable and ChatError.retryAfter.\n * Classifies non-ChatError errors before deciding on retry.\n *\n * @param fn - Async function to execute\n * @param strategy - Retry strategy providing delay calculations\n * @param options - Optional abort signal and retry callback\n * @returns Result of fn on success\n * @throws ChatError when all retries exhausted or error is non-retryable\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n strategy: RetryStrategy,\n options?: RetryOptions,\n): Promise<T> {\n let attempt = 0;\n\n for (;;) {\n try {\n return await fn();\n } catch (raw) {\n const error = classifyError(raw);\n const delay = strategy.nextDelay(attempt, error);\n\n if (delay === null) {\n throw error;\n }\n\n if (options?.signal?.aborted) {\n throw error;\n }\n\n options?.onRetry?.(error, attempt, delay);\n\n await sleep(delay, options?.signal);\n attempt++;\n }\n }\n}\n\n/**\n * Type guard: check if an error is retryable\n * @param error - The error to check\n * @returns True if error is a retryable ChatError\n */\nexport function isRetryable(error: unknown): boolean {\n if (error instanceof ChatError) {\n return error.retryable;\n }\n const classified = classifyError(error);\n return classified.retryable;\n}\n\n// ─── Internal Helpers ──────────────────────────────────────────\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new ChatError(\"Retry aborted\", { code: ErrorCode.ABORTED }));\n return;\n }\n\n const timer = setTimeout(resolve, ms);\n\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new ChatError(\"Retry aborted\", { code: ErrorCode.ABORTED }));\n },\n { once: true },\n );\n });\n}\n","/**\n * Request context resolution — per-request credential + model lookup.\n *\n * Resolves a providerId into a RequestContext containing backend name,\n * credentials (AuthToken), and model identifier. This enables stateless\n * request handling where each request carries its own context.\n *\n * @example\n * ```ts\n * const ctx = await resolveRequestContext(\"my-copilot-provider\", {\n * providerStore,\n * tokenStore,\n * });\n * // ctx = { backend: \"copilot\", credentials: { accessToken: \"...\" }, model: \"gpt-5-mini\" }\n * ```\n */\n\nimport type { AuthToken } from \"../../auth/types.js\";\nimport type { IProviderStore, ProviderConfig } from \"../provider-types.js\";\nimport type { ITokenStore } from \"./token-store.js\";\nimport { ChatError } from \"../errors.js\";\nimport { ErrorCode } from \"../../types/errors.js\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\n/** Per-request context carrying backend, credentials, and model */\nexport interface RequestContext {\n /** Backend name (e.g. \"copilot\", \"claude\", \"vercel-ai\") */\n backend: string;\n /** Resolved authentication token */\n credentials: AuthToken;\n /** Model identifier from provider config */\n model: string;\n /** Original provider config for reference */\n provider: ProviderConfig;\n}\n\n/** Dependencies for context resolution */\nexport interface RequestContextDeps {\n /** Provider store to look up provider config */\n providerStore: IProviderStore;\n /** Token store to load credentials for the backend */\n tokenStore: ITokenStore;\n}\n\n// ─── Resolution ────────────────────────────────────────────────\n\n/**\n * Resolve a providerId into a full RequestContext.\n *\n * Flow: providerId → ProviderConfig (from providerStore) → AuthToken (from tokenStore) → RequestContext\n *\n * @throws ChatError with PROVIDER_NOT_FOUND if provider doesn't exist\n * @throws ChatError with AUTH_REQUIRED if no token found for the provider's backend\n */\nexport async function resolveRequestContext(\n providerId: string,\n deps: RequestContextDeps,\n): Promise<RequestContext> {\n // Step 1: Look up provider config\n const provider = await deps.providerStore.get(providerId);\n if (!provider) {\n throw new ChatError(`Provider \"${providerId}\" not found`, {\n code: ErrorCode.PROVIDER_NOT_FOUND,\n });\n }\n\n // Step 2: Load credentials for the backend\n const credentials = await deps.tokenStore.load(provider.backend);\n if (!credentials) {\n throw new ChatError(\n `Authentication required for backend \"${provider.backend}\"`,\n {\n code: ErrorCode.AUTH_REQUIRED,\n },\n );\n }\n\n return {\n backend: provider.backend,\n credentials,\n model: provider.model,\n provider,\n };\n}\n","/**\n * Message route handlers (send + abort).\n *\n * Routes:\n * - POST /send → Stream response via transport (SSE by default)\n * - POST /abort → Cancel in-flight stream\n */\n\nimport type { RuntimeSendOptions } from \"../../core.js\";\nimport type { RouteHandler } from \"./types.js\";\nimport { SSEChatTransport, streamToTransport } from \"../../backends/transport.js\";\nimport type { CloseDetectable } from \"../../backends/transport.js\";\nimport { readBody, json } from \"../utils.js\";\nimport { resolveRequestContext } from \"../request-context.js\";\nimport { ChatError } from \"../../errors.js\";\nimport { ErrorCode } from \"../../../types/errors.js\";\n\nexport const messageRoutes: RouteHandler = async (method, path, req, res, ctx) => {\n const { runtime, maxBodySize, heartbeatMs, hooks, transportFactory } = ctx;\n\n // POST /send (SSE stream)\n if (method === \"POST\" && path === \"/send\") {\n const body = await readBody(req, maxBodySize);\n const sessionId = body.sessionId as string;\n const message = (body.message || body.content) as string;\n\n if (!sessionId || !message) {\n json(res, { error: \"sessionId and message are required\" }, 400);\n return true;\n }\n\n // ── Provider-centric path ──\n // When providerStore + tokenStore configured, providerId is REQUIRED.\n let model: string | undefined;\n let reqBackend: string | undefined;\n let reqCredentials: import(\"../../../auth/types.js\").AuthToken | undefined;\n const hasProviderInfra = !!(ctx.providerStore && ctx.tokenStore);\n\n if (hasProviderInfra) {\n const providerId = body.providerId as string | undefined;\n if (!providerId || typeof providerId !== \"string\") {\n json(res, { error: \"providerId is required\" }, 400);\n return true;\n }\n try {\n const reqCtx = await resolveRequestContext(providerId, {\n providerStore: ctx.providerStore!,\n tokenStore: ctx.tokenStore!,\n });\n model = reqCtx.model;\n reqBackend = reqCtx.backend;\n reqCredentials = reqCtx.credentials;\n } catch (err) {\n if (err instanceof ChatError && err.code === ErrorCode.PROVIDER_NOT_FOUND) {\n json(res, { error: err.message }, 404);\n return true;\n }\n if (err instanceof ChatError && err.code === ErrorCode.AUTH_REQUIRED) {\n json(res, { error: err.message }, 401);\n return true;\n }\n throw err;\n }\n }\n\n // Model guard on send model override\n const bodyModel = body.model as string | undefined;\n if (hooks?.onModelSwitch && bodyModel && typeof bodyModel === \"string\") {\n try { await hooks.onModelSwitch(bodyModel); }\n catch (err) {\n json(res, { error: err instanceof Error ? err.message : String(err) }, 403);\n return true;\n }\n }\n\n // Before-send hook\n if (hooks?.onBeforeSend) {\n try { await hooks.onBeforeSend(sessionId, message); }\n catch (err) {\n json(res, { error: err instanceof Error ? err.message : String(err) }, 403);\n return true;\n }\n }\n\n // Resolve model: explicit from body → provider context → 400\n model = bodyModel || model;\n if (!model) {\n json(res, { error: \"model is required (via body.model or providerId)\" }, 400);\n return true;\n }\n\n const transport = transportFactory\n ? transportFactory(req, res)\n : new SSEChatTransport(res, {\n heartbeatMs,\n request: req as unknown as CloseDetectable,\n });\n try {\n if (!reqBackend || !reqCredentials) {\n json(res, { error: \"backend and credentials are required (configure providerStore + tokenStore)\" }, 400);\n return true;\n }\n const opts: RuntimeSendOptions = { model, backend: reqBackend, credentials: reqCredentials };\n const stream = runtime.send(sessionId, message, opts);\n await streamToTransport(stream, transport);\n } catch (err) {\n transport.error(err instanceof Error ? err : new Error(String(err)));\n }\n return true;\n }\n\n // POST /abort\n if (method === \"POST\" && path === \"/abort\") {\n runtime.abort();\n json(res, { ok: true });\n return true;\n }\n\n return false;\n};\n","/**\n * Configuration route handlers (model/backend/provider switching, listing).\n *\n * Routes:\n * - GET /models → List available models\n * - GET /backends → List available backends\n * - POST /model/switch → Switch active model (handler state)\n * - POST /provider/switch → Switch provider (resolves backend + model)\n */\n\nimport type { RouteHandler } from \"./types.js\";\nimport { readBody, json } from \"../utils.js\";\n\nexport const configRoutes: RouteHandler = async (method, path, req, res, ctx) => {\n const { runtime, maxBodySize, hooks, providerStore } = ctx;\n\n // GET /models\n if (method === \"GET\" && path === \"/models\") {\n // Try pool-based listing first; if empty, bootstrap from first provider's credentials\n let models = await runtime.listModels();\n if (models.length === 0 && providerStore && ctx.tokenStore) {\n const providers = await providerStore.list();\n for (const p of providers) {\n const token = await ctx.tokenStore.load(p.backend);\n if (token) {\n models = await runtime.listModels({ backend: p.backend, credentials: token });\n break;\n }\n }\n }\n if (hooks?.filterModels) models = hooks.filterModels(models);\n json(res, models);\n return true;\n }\n\n // GET /backends\n if (method === \"GET\" && path === \"/backends\") {\n const backends = await runtime.listBackends();\n json(res, backends);\n return true;\n }\n\n // POST /model/switch (validation only — model is resolved per-request, not stored)\n if (method === \"POST\" && path === \"/model/switch\") {\n const body = await readBody(req, maxBodySize);\n if (!body.model || typeof body.model !== \"string\") {\n json(res, { error: \"model is required\" }, 400);\n return true;\n }\n if (hooks?.onModelSwitch) {\n try { await hooks.onModelSwitch(body.model as string); }\n catch (err) {\n json(res, { error: err instanceof Error ? err.message : String(err) }, 403);\n return true;\n }\n }\n json(res, { ok: true });\n return true;\n }\n\n // POST /provider/switch (validation only — provider is resolved per-request via providerId in /send)\n if (method === \"POST\" && path === \"/provider/switch\") {\n const body = await readBody(req, maxBodySize);\n if (!body.providerId || typeof body.providerId !== \"string\") {\n json(res, { error: \"providerId is required\" }, 400);\n return true;\n }\n if (!providerStore) {\n json(res, { error: \"No provider store configured\" }, 400);\n return true;\n }\n const provider = await providerStore.get(body.providerId as string);\n if (!provider) {\n json(res, { error: `Provider \"${body.providerId}\" not found` }, 404);\n return true;\n }\n if (hooks?.onProviderSwitch) {\n try {\n await hooks.onProviderSwitch({ providerId: body.providerId as string, backend: provider.backend });\n } catch (err) {\n json(res, { error: err instanceof Error ? err.message : String(err) }, 400);\n return true;\n }\n }\n json(res, { ok: true });\n return true;\n }\n\n return false;\n};\n","/**\n * Provider CRUD route handlers.\n *\n * Routes:\n * - GET /providers → List all providers\n * - GET /providers/:id → Get single provider\n * - POST /providers → Create provider\n * - PUT /providers/:id → Update provider\n * - DELETE /providers/:id → Delete provider\n */\n\nimport type { ProviderConfig } from \"../provider-store.js\";\nimport type { RouteHandler } from \"./types.js\";\nimport { readBody, json } from \"../utils.js\";\nimport { randomUUID } from \"node:crypto\";\n\nexport const providerRoutes: RouteHandler = async (method, path, req, res, ctx) => {\n const { providerStore, maxBodySize } = ctx;\n if (!providerStore) return false;\n\n const idMatch = path.match(/^\\/providers\\/([^/]+)$/);\n\n // GET /providers\n if (method === \"GET\" && path === \"/providers\") {\n const providers = await providerStore.list();\n json(res, providers);\n return true;\n }\n\n // GET /providers/:id\n if (method === \"GET\" && idMatch) {\n const id = decodeURIComponent(idMatch[1]);\n const provider = await providerStore.get(id);\n if (!provider) {\n json(res, { error: \"Provider not found\" }, 404);\n return true;\n }\n json(res, provider);\n return true;\n }\n\n // POST /providers\n if (method === \"POST\" && path === \"/providers\") {\n const body = await readBody(req, maxBodySize);\n const backend = body.backend as string;\n const model = body.model as string;\n const label = body.label as string;\n if (!backend || typeof backend !== \"string\") {\n json(res, { error: \"backend is required\" }, 400);\n return true;\n }\n if (!model || typeof model !== \"string\") {\n json(res, { error: \"model is required\" }, 400);\n return true;\n }\n if (!label || typeof label !== \"string\") {\n json(res, { error: \"label is required\" }, 400);\n return true;\n }\n const config: ProviderConfig = {\n id: randomUUID(),\n backend,\n model,\n label,\n createdAt: Date.now(),\n };\n await providerStore.create(config);\n json(res, config, 201);\n return true;\n }\n\n // PUT /providers/:id\n if (method === \"PUT\" && idMatch) {\n const id = decodeURIComponent(idMatch[1]);\n const existing = await providerStore.get(id);\n if (!existing) {\n json(res, { error: \"Provider not found\" }, 404);\n return true;\n }\n const body = await readBody(req, maxBodySize);\n const changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">> = {};\n if (body.backend && typeof body.backend === \"string\") changes.backend = body.backend;\n if (body.model && typeof body.model === \"string\") changes.model = body.model;\n if (body.label && typeof body.label === \"string\") changes.label = body.label;\n await providerStore.update(id, changes);\n const updated = await providerStore.get(id);\n json(res, updated);\n return true;\n }\n\n // DELETE /providers/:id\n if (method === \"DELETE\" && idMatch) {\n const id = decodeURIComponent(idMatch[1]);\n await providerStore.delete(id);\n json(res, { ok: true });\n return true;\n }\n\n return false;\n};\n","/**\n * createChatHandler — maps RemoteChatClient contract endpoints to IChatRuntime calls.\n *\n * Routes are delegated to composable route modules in ./routes/.\n * This file is a thin router (~90 lines) that assembles modules and handles errors.\n */\n\nimport type { IChatRuntime } from \"../runtime.js\";\nimport type { IChatTransport, WritableResponse } from \"../backends/transport.js\";\nimport type { IProviderStore } from \"./provider-store.js\";\nimport type { ITokenStore } from \"./token-store.js\";\nimport type { ModelInfo } from \"../../types.js\";\nimport { json, BodyParseError } from \"./utils.js\";\nimport { sessionRoutes, messageRoutes, configRoutes, providerRoutes } from \"./routes/index.js\";\nimport type { RouteContext, RouteHandler, HandlerState } from \"./routes/types.js\";\n\n// ─── Minimal HTTP interfaces (framework-agnostic) ──────────────\n\n/** Minimal readable request interface (node:http IncomingMessage subset) */\nexport interface ReadableRequest {\n readonly method?: string;\n readonly url?: string;\n on(event: \"data\", listener: (chunk: Buffer | string) => void): unknown;\n on(event: \"end\", listener: () => void): unknown;\n}\n\n// Re-export WritableResponse from transport\nexport type { WritableResponse } from \"../backends/transport.js\";\n\n// ─── Options ───────────────────────────────────────────────────\n\n/**\n * Server-side hooks for customizing chat handler behavior.\n * Consolidates filter, guard, and lifecycle callbacks into a single interface.\n */\nexport interface ChatServerHooks {\n /** Filter the model list before returning to client. */\n filterModels?(models: ModelInfo[]): ModelInfo[];\n /** Validate model selection on /model/switch and /send model override. Throw to reject. */\n onModelSwitch?(model: string): void | Promise<void>;\n /** Called before provider switch. Receives providerId and resolved backend name. Throw to reject. */\n onProviderSwitch?(info: { providerId: string; backend: string }): void | Promise<void>;\n /** Called before backend switch. Throw to reject. */\n onBackendSwitch?(backend: string): void | Promise<void>;\n /** Called before sending a message. Throw to reject. */\n onBeforeSend?(sessionId: string, message: string): void | Promise<void>;\n /** Global error handler for unhandled route errors. */\n onError?(error: Error, context: { route: string; method: string }): void;\n}\n\n/**\n * Factory for creating a chat transport for a /send request.\n * Return an IChatTransport instance that will receive the event stream.\n * Default: SSEChatTransport.\n */\nexport type TransportFactory = (req: ReadableRequest, res: WritableResponse) => IChatTransport;\n\n/** Configuration for createChatHandler */\nexport interface ChatHandlerOptions {\n /** Route prefix to strip from URL before matching. Default: \"\" (no prefix) */\n prefix?: string;\n /** Maximum request body size in bytes. Default: 1MB (1048576) */\n maxBodySize?: number;\n /** SSE heartbeat interval in milliseconds. 0 or undefined disables heartbeat. */\n heartbeatMs?: number;\n /** Optional provider store for provider CRUD routes. */\n providerStore?: IProviderStore;\n /** Optional token store for resolveRequestContext in /send. */\n tokenStore?: ITokenStore;\n /** Consolidated server hooks. */\n hooks?: ChatServerHooks;\n /** Custom transport factory for /send endpoint. Default: SSEChatTransport. */\n transportFactory?: TransportFactory;\n}\n\n// ─── Route pipeline ────────────────────────────────────────────\n\nconst ROUTE_PIPELINE: readonly RouteHandler[] = [\n sessionRoutes,\n messageRoutes,\n configRoutes,\n providerRoutes,\n];\n\n// ─── Handler Factory ───────────────────────────────────────────\n\n/**\n * Create an HTTP request handler that maps RemoteChatClient contract\n * endpoints to IChatRuntime method calls.\n *\n * Routes are handled by composable route modules (sessions, messages, config, providers).\n * Model state is managed in a shared HandlerState object.\n */\nexport function createChatHandler(\n runtime: IChatRuntime,\n options?: ChatHandlerOptions,\n): (req: ReadableRequest, res: WritableResponse) => Promise<void> {\n const prefix = options?.prefix ?? \"\";\n\n const state: HandlerState = {};\n\n const ctx: RouteContext = {\n runtime,\n maxBodySize: options?.maxBodySize ?? 1_048_576,\n heartbeatMs: options?.heartbeatMs,\n hooks: options?.hooks,\n providerStore: options?.providerStore,\n tokenStore: options?.tokenStore,\n transportFactory: options?.transportFactory,\n state,\n };\n\n return async (req: ReadableRequest, res: WritableResponse): Promise<void> => {\n const url = req.url || \"\";\n const method = req.method || \"GET\";\n const rawPath = prefix ? url.slice(prefix.length) : url;\n const path = rawPath.split(\"?\")[0];\n\n try {\n for (const route of ROUTE_PIPELINE) {\n if (await route(method, path, req, res, ctx)) return;\n }\n json(res, { error: \"Not found\" }, 404);\n } catch (err) {\n if (err instanceof BodyParseError) {\n json(res, { error: err.message }, err.statusCode);\n } else {\n const message = err instanceof Error ? err.message : String(err);\n if (ctx.hooks?.onError) {\n ctx.hooks.onError(err instanceof Error ? err : new Error(message), { route: path, method });\n }\n json(res, { error: message }, 500);\n }\n }\n };\n}\n\n// Re-export route types for consumers who build custom route modules\nexport type { RouteContext, RouteHandler, HandlerState } from \"./routes/types.js\";\n","/**\n * createAuthHandler — server-mediated authentication for all three backends.\n *\n * Routes:\n * - POST /auth/start → Start auth flow (copilot device flow, claude OAuth, vercel-ai passthrough)\n * - POST /auth/copilot/poll → Poll for Copilot device flow completion\n * - POST /auth/claude/complete → Exchange Claude OAuth code for token\n * - POST /auth/vercel/complete → Submit Vercel AI API key\n * - GET /tokens/saved → List providers with saved tokens\n * - POST /tokens/use → Load and activate a saved token\n * - POST /tokens/clear → Clear all saved tokens and invoke onLogout\n * - POST /auth/dispose → Clear pending flows and invoke onLogout\n */\n\nimport type { ReadableRequest, WritableResponse } from \"./handler.js\";\nimport type { ITokenStore } from \"./token-store.js\";\nimport type { AuthToken, CopilotAuthToken, ClaudeAuthToken } from \"../../auth/types.js\";\nimport { readBody, json, BodyParseError } from \"./utils.js\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\n/** Auth provider names recognized by the handler */\nexport type AuthProvider = \"copilot\" | \"claude\" | \"vercel-ai\";\n\n/** Copilot auth class interface (matches CopilotAuth public API) */\nexport interface ICopilotAuth {\n startDeviceFlow(options?: {\n scopes?: string;\n signal?: AbortSignal;\n }): Promise<{\n userCode: string;\n verificationUrl: string;\n waitForToken: (signal?: AbortSignal) => Promise<CopilotAuthToken>;\n }>;\n}\n\n/** Claude auth class interface (matches ClaudeAuth public API) */\nexport interface IClaudeAuth {\n startOAuthFlow(options?: {\n redirectUri?: string;\n scopes?: string;\n }): {\n authorizeUrl: string;\n completeAuth: (codeOrUrl: string) => Promise<ClaudeAuthToken>;\n };\n}\n\n/** Callback invoked after successful authentication */\nexport type OnAuthCallback = (\n provider: AuthProvider,\n token: AuthToken,\n) => void | Promise<void>;\n\n/** Configuration for createAuthHandler */\nexport interface AuthHandlerOptions {\n /** Token storage implementation */\n tokenStore: ITokenStore;\n /** Factory for creating CopilotAuth instances */\n createCopilotAuth?: () => ICopilotAuth;\n /** Factory for creating ClaudeAuth instances */\n createClaudeAuth?: () => IClaudeAuth;\n /** Called after successful authentication for any provider */\n onAuth?: OnAuthCallback;\n /** Called when dispose/logout is requested */\n onLogout?: () => void | Promise<void>;\n /** Route prefix to strip from URL before matching. Default: \"\" */\n prefix?: string;\n /** Maximum request body size in bytes. Default: 1MB */\n maxBodySize?: number;\n}\n\n// ─── Internal State ────────────────────────────────────────────\n\ninterface PendingCopilotFlow {\n waitForToken: (signal?: AbortSignal) => Promise<CopilotAuthToken>;\n}\n\ninterface PendingClaudeFlow {\n completeAuth: (codeOrUrl: string) => Promise<ClaudeAuthToken>;\n}\n\n// ─── Handler Factory ───────────────────────────────────────────\n\n/**\n * Create an HTTP request handler for server-mediated authentication.\n *\n * @param options - Auth handler configuration (token store, auth factories, callbacks)\n * @returns Async request handler `(req, res) => Promise<void>`\n *\n * @example\n * ```ts\n * import { CopilotAuth, ClaudeAuth } from \"@witqq/agent-sdk/auth\";\n *\n * const authHandler = createAuthHandler({\n * tokenStore: new FileTokenStore({ directory: \".tokens\" }),\n * createCopilotAuth: () => new CopilotAuth(),\n * createClaudeAuth: () => new ClaudeAuth(),\n * onAuth: (provider, token) => {\n * // Rebuild runtime with new credentials\n * },\n * });\n * ```\n */\nexport function createAuthHandler(\n options: AuthHandlerOptions,\n): (req: ReadableRequest, res: WritableResponse) => Promise<void> {\n const { tokenStore, onAuth } = options;\n const prefix = options.prefix ?? \"\";\n const maxBodySize = options.maxBodySize ?? 1_048_576;\n\n // In-flight auth state (single-user pattern, same as demo)\n let pendingCopilot: PendingCopilotFlow | null = null;\n let pendingClaude: PendingClaudeFlow | null = null;\n\n return async (req: ReadableRequest, res: WritableResponse): Promise<void> => {\n const url = req.url || \"\";\n const method = req.method || \"GET\";\n const rawPath = prefix ? url.slice(prefix.length) : url;\n const path = rawPath.split(\"?\")[0];\n\n try {\n // POST /auth/start\n if (method === \"POST\" && path === \"/auth/start\") {\n const body = await readBody(req, maxBodySize);\n const provider = body.provider as string;\n\n if (!provider || !isValidProvider(provider)) {\n json(res, { error: \"provider is required (copilot, claude, vercel-ai)\" }, 400);\n return;\n }\n\n // Clear pending flows\n pendingCopilot = null;\n pendingClaude = null;\n\n if (provider === \"copilot\") {\n if (!options.createCopilotAuth) {\n json(res, { error: \"Copilot auth not configured\" }, 400);\n return;\n }\n const auth = options.createCopilotAuth();\n const flow = await auth.startDeviceFlow();\n pendingCopilot = { waitForToken: flow.waitForToken };\n json(res, { userCode: flow.userCode, verificationUrl: flow.verificationUrl });\n return;\n }\n\n if (provider === \"claude\") {\n if (!options.createClaudeAuth) {\n json(res, { error: \"Claude auth not configured\" }, 400);\n return;\n }\n const auth = options.createClaudeAuth();\n const flow = auth.startOAuthFlow();\n pendingClaude = { completeAuth: flow.completeAuth };\n json(res, { authorizeUrl: flow.authorizeUrl });\n return;\n }\n\n // vercel-ai: no server-side flow needed\n json(res, { ready: true });\n return;\n }\n\n // POST /auth/copilot/poll\n if (method === \"POST\" && path === \"/auth/copilot/poll\") {\n if (!pendingCopilot) {\n json(res, { error: \"No active Copilot flow\" }, 400);\n return;\n }\n const token = await pendingCopilot.waitForToken();\n pendingCopilot = null;\n await tokenStore.save(\"copilot\", token);\n if (onAuth) await onAuth(\"copilot\", token);\n json(res, { ok: true, login: token.login });\n return;\n }\n\n // POST /auth/claude/complete\n if (method === \"POST\" && path === \"/auth/claude/complete\") {\n if (!pendingClaude) {\n json(res, { error: \"No active Claude flow\" }, 400);\n return;\n }\n const body = await readBody(req, maxBodySize);\n const code = body.code as string;\n if (!code || typeof code !== \"string\") {\n json(res, { error: \"code is required\" }, 400);\n return;\n }\n const token = await pendingClaude.completeAuth(code);\n pendingClaude = null;\n await tokenStore.save(\"claude\", token);\n if (onAuth) await onAuth(\"claude\", token);\n json(res, { ok: true });\n return;\n }\n\n // POST /auth/vercel/complete\n if (method === \"POST\" && path === \"/auth/vercel/complete\") {\n const body = await readBody(req, maxBodySize);\n const apiKey = body.apiKey as string;\n if (!apiKey || typeof apiKey !== \"string\") {\n json(res, { error: \"apiKey is required\" }, 400);\n return;\n }\n const token: AuthToken = {\n accessToken: apiKey,\n tokenType: \"bearer\",\n obtainedAt: Date.now(),\n };\n // Preserve baseUrl in token for later restoration\n const storeToken = body.baseUrl\n ? { ...token, baseUrl: body.baseUrl as string }\n : token;\n await tokenStore.save(\"vercel-ai\", storeToken as AuthToken);\n if (onAuth) await onAuth(\"vercel-ai\", storeToken as AuthToken);\n json(res, { ok: true });\n return;\n }\n\n // GET /tokens/saved\n if (method === \"GET\" && path === \"/tokens/saved\") {\n const saved = await tokenStore.list();\n json(res, { saved });\n return;\n }\n\n // POST /tokens/use\n if (method === \"POST\" && path === \"/tokens/use\") {\n const body = await readBody(req, maxBodySize);\n const provider = body.provider as string;\n if (!provider || !isValidProvider(provider)) {\n json(res, { error: \"provider is required (copilot, claude, vercel-ai)\" }, 400);\n return;\n }\n const token = await tokenStore.load(provider);\n if (!token) {\n json(res, { error: `No saved token for ${provider}` }, 404);\n return;\n }\n if (onAuth) await onAuth(provider, token);\n json(res, { ok: true, provider });\n return;\n }\n\n // POST /tokens/clear\n if (method === \"POST\" && path === \"/tokens/clear\") {\n await tokenStore.clearAll();\n if (options.onLogout) await options.onLogout();\n json(res, { ok: true });\n return;\n }\n\n // POST /auth/dispose\n if (method === \"POST\" && path === \"/auth/dispose\") {\n pendingCopilot = null;\n pendingClaude = null;\n if (options.onLogout) await options.onLogout();\n json(res, { ok: true });\n return;\n }\n\n // No route matched\n json(res, { error: \"Not found\" }, 404);\n } catch (err) {\n if (err instanceof BodyParseError) {\n json(res, { error: err.message }, err.statusCode);\n } else {\n const message = err instanceof Error ? err.message : String(err);\n json(res, { error: message }, 500);\n }\n }\n };\n}\n\n// ─── Internal Helpers ──────────────────────────────────────────\n\nfunction isValidProvider(p: string): p is AuthProvider {\n return p === \"copilot\" || p === \"claude\" || p === \"vercel-ai\";\n}\n","/**\n * CORS middleware — standalone composable function.\n * Returns true if it fully handled the request (OPTIONS preflight),\n * false if the caller should continue processing.\n */\n\n/** Configuration for CORS middleware */\nexport interface CorsOptions {\n /** Allowed origins. Default: \"*\" (any origin) */\n origin?: string | string[];\n /** Allowed HTTP methods. Default: common REST methods */\n methods?: string[];\n /** Allowed request headers. Default: [\"Content-Type\"] */\n headers?: string[];\n /** Max age for preflight cache in seconds. Default: 86400 (24h) */\n maxAge?: number;\n}\n\n/** Minimal request interface for CORS */\ninterface CorsRequest {\n readonly method?: string;\n readonly headers?: Record<string, string | string[] | undefined>;\n}\n\n/** Minimal response interface for CORS */\ninterface CorsResponse {\n setHeader(name: string, value: string): void;\n writeHead(statusCode: number, headers?: Record<string, string>): unknown;\n end(): void;\n}\n\n/**\n * Create a CORS middleware function.\n *\n * @returns A function that sets CORS headers and handles OPTIONS preflight.\n * Returns `true` if the request was fully handled (preflight),\n * `false` if the caller should continue processing.\n */\nexport function corsMiddleware(options?: CorsOptions): (req: CorsRequest, res: CorsResponse) => boolean {\n const origin = options?.origin ?? \"*\";\n const methods = options?.methods ?? [\"GET\", \"POST\", \"DELETE\", \"OPTIONS\"];\n const headers = options?.headers ?? [\"Content-Type\"];\n const maxAge = options?.maxAge ?? 86400;\n\n const methodsValue = methods.join(\", \");\n const headersValue = headers.join(\", \");\n\n return (req: CorsRequest, res: CorsResponse): boolean => {\n // Determine origin header value per spec\n let originValue: string;\n if (Array.isArray(origin)) {\n const reqOrigin = typeof req.headers?.origin === \"string\" ? req.headers.origin : \"\";\n originValue = origin.includes(reqOrigin) ? reqOrigin : origin[0];\n res.setHeader(\"Vary\", \"Origin\");\n } else {\n originValue = origin;\n }\n res.setHeader(\"Access-Control-Allow-Origin\", originValue);\n res.setHeader(\"Access-Control-Allow-Methods\", methodsValue);\n res.setHeader(\"Access-Control-Allow-Headers\", headersValue);\n\n if (req.method === \"OPTIONS\") {\n res.setHeader(\"Access-Control-Max-Age\", String(maxAge));\n res.writeHead(204);\n res.end();\n return true;\n }\n\n return false;\n };\n}\n","/**\n * @witqq/agent-sdk — Chat domain types\n *\n * All type definitions and interfaces for the chat layer.\n * Pure types + ChatId generation (tightly coupled to branded type).\n */\n\nimport type { UsageData, ToolDefinition, ErrorCode } from \"../types.js\";\nimport type { AuthToken } from \"../auth/types.js\";\n\n// ─── Unique ID ─────────────────────────────────────────────────\n\n/** Branded type for unique identifiers */\nexport type ChatId = string & { readonly __brand: \"ChatId\" };\n\n/**\n * Generate a new unique ChatId (crypto.randomUUID-based)\n * @returns Branded ChatId string\n */\nexport function createChatId(): ChatId {\n return crypto.randomUUID() as ChatId;\n}\n\n/** UUID v4 pattern for ChatId validation */\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Cast a string to ChatId with UUID format validation.\n * Use this instead of manual `as ChatId` type assertions.\n *\n * @param value - String to validate and cast\n * @returns Branded ChatId\n * @throws {TypeError} If value is not a valid UUID v4 format\n */\nexport function toChatId(value: string): ChatId {\n if (!UUID_RE.test(value)) {\n throw new TypeError(`Invalid ChatId: \"${value}\" is not a valid UUID`);\n }\n return value as ChatId;\n}\n\n/**\n * Accepts either a plain string or branded ChatId for API convenience.\n * Use this in public API signatures so consumers don't need `as ChatId` casts.\n */\nexport type ChatIdLike = string | ChatId;\n\n// ─── Status Types ──────────────────────────────────────────────\n\n/** Lifecycle status of a message part (text, reasoning, etc.) */\nexport type PartStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n/** Lifecycle status of a tool call within a message */\nexport type ToolCallStatus = \"pending\" | \"running\" | \"requires_approval\" | \"complete\" | \"error\" | \"denied\";\n/** Lifecycle status of an entire message */\nexport type MessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\";\n/** Lifecycle status of a chat session */\nexport type SessionStatus = \"active\";\n/** Lifecycle status of the chat runtime */\nexport type RuntimeStatus = \"idle\" | \"streaming\" | \"error\" | \"disposed\";\n\n// ─── Message Parts (union) ─────────────────────────────────────\n\n/** Plain text content part */\nexport interface TextPart { type: \"text\"; text: string; status: PartStatus; }\n/** Model reasoning/thinking content part */\nexport interface ReasoningPart { type: \"reasoning\"; text: string; status: PartStatus; }\n/** Tool invocation part with call ID, arguments, optional result */\nexport interface ToolCallPart { type: \"tool_call\"; toolCallId: string; name: string; args: unknown; result?: unknown; status: ToolCallStatus; error?: string; }\n/** Source reference part (URL citation) */\nexport interface SourcePart { type: \"source\"; url: string; title?: string; status: PartStatus; }\n/** File attachment part (base64-encoded data) */\nexport interface FilePart { type: \"file\"; name: string; mimeType: string; data: string; status: PartStatus; }\n/** Union of all message part types */\nexport type MessagePart = TextPart | ReasoningPart | ToolCallPart | SourcePart | FilePart;\n\n// ─── Chat Message ──────────────────────────────────────────────\n\n/** Role of message author */\nexport type ChatRole = \"user\" | \"assistant\" | \"system\";\n\n/** Metadata attached to messages — useful preset for the TMetadata generic */\nexport interface ChatMessageMetadata {\n model?: string;\n backend?: string;\n usage?: UsageData;\n isSummary?: boolean;\n estimatedTokens?: number;\n custom?: Record<string, unknown>;\n}\n\n/** Message status */\nexport type ChatMessageStatus = MessageStatus;\n\n/** A single chat message — the fundamental unit of conversation */\nexport interface ChatMessage<TMetadata = unknown> {\n id: ChatId;\n role: ChatRole;\n parts: MessagePart[];\n metadata?: TMetadata;\n createdAt: string;\n updatedAt?: string;\n status: MessageStatus;\n}\n\n// ─── Supporting Types ──────────────────────────────────────────\n\n// ─── Chat Session ──────────────────────────────────────────────\n\n/** Session configuration snapshot */\nexport interface ChatSessionConfig {\n model: string;\n backend: string;\n systemPrompt?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Session metadata tracking usage statistics and custom extensions.\n *\n * Updated automatically by session stores on each `addMessage()` call.\n * The generic `TCustom` parameter allows type-safe application-specific\n * metadata via the `custom` field.\n *\n * @typeParam TCustom - Shape of the `custom` field (defaults to `Record<string, unknown>`)\n */\nexport interface ChatSessionMetadata<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n /** Number of messages in the session (updated by session store) */\n messageCount: number;\n /** Total token count across all messages in the session */\n totalTokens: number;\n /** Optional tags for session categorization and filtering */\n tags?: string[];\n /** Application-specific metadata — typed via the TCustom generic parameter */\n custom?: TCustom;\n}\n\n/** Chat session — a conversation with ordered messages (pure serializable data) */\nexport interface ChatSession<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n id: ChatId;\n title?: string;\n messages: ChatMessage[];\n config: ChatSessionConfig;\n metadata: ChatSessionMetadata<TCustom>;\n status: SessionStatus;\n createdAt: string;\n updatedAt: string;\n backendSessionId?: string;\n}\n\n/**\n * Reactive wrapper around ChatSession — provides subscribe/getSnapshot for\n * React useSyncExternalStore integration and lastMessage convenience getter.\n * Session stores may optionally return ObservableSession instances.\n */\nexport interface ObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>\n extends ChatSession<TCustom> {\n /** Subscribe to session changes (for React useSyncExternalStore) */\n subscribe(callback: () => void): () => void;\n /** Get immutable snapshot of session state (for React useSyncExternalStore) */\n getSnapshot(): ChatSession<TCustom>;\n /** Last message in the session */\n readonly lastMessage: ChatMessage | undefined;\n}\n\n/** Lightweight session info for listing (without full message array) */\nexport interface SessionInfo {\n id: ChatId;\n title?: string;\n status: SessionStatus;\n messageCount: number;\n lastMessage?: ChatMessage;\n createdAt: string;\n updatedAt: string;\n}\n\n// ─── Chat Events ───────────────────────────────────────────────\n\n/** Events emitted during chat operation */\nexport type ChatEvent =\n | { type: \"message:start\"; messageId: ChatId; role: ChatRole }\n | { type: \"message:delta\"; messageId: ChatId; text: string }\n | { type: \"message:complete\"; messageId: ChatId; message: ChatMessage }\n | {\n type: \"tool:start\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n }\n | {\n type: \"tool:complete\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError?: boolean;\n }\n | { type: \"thinking:start\"; messageId: ChatId }\n | { type: \"thinking:delta\"; messageId: ChatId; text: string }\n | { type: \"thinking:end\"; messageId: ChatId }\n | {\n type: \"permission:request\";\n messageId: ChatId;\n toolName: string;\n toolArgs: Record<string, unknown>;\n }\n | {\n type: \"permission:response\";\n messageId: ChatId;\n toolName: string;\n allowed: boolean;\n }\n | {\n type: \"usage\";\n promptTokens: number;\n completionTokens: number;\n model?: string;\n }\n | { type: \"session:created\"; sessionId: ChatId }\n | { type: \"session:updated\"; sessionId: ChatId }\n | {\n type: \"error\";\n error: string;\n recoverable: boolean;\n code?: ErrorCode;\n messageId?: ChatId;\n }\n | { type: \"typing:start\" }\n | { type: \"typing:end\" }\n | { type: \"heartbeat\" }\n | { type: \"done\"; finalOutput?: string };\n\n/** All possible ChatEvent type strings */\nexport type ChatEventType = ChatEvent[\"type\"];\n\n// ─── Chat Middleware ───────────────────────────────────────────\n\n/** Context passed to ChatMiddleware hooks */\nexport interface ChatMiddlewareContext {\n sessionId: ChatId;\n signal: AbortSignal;\n}\n\n/** Runtime-level middleware for the send/receive lifecycle.\n * Different from EventMiddleware which operates at the event bus level. */\nexport interface ChatMiddleware {\n /** Transform message before sending to backend. Return null to reject the send. */\n onBeforeSend?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | null | Promise<ChatMessage | null>;\n /** Transform/intercept stream events */\n onEvent?(event: ChatEvent, context: ChatMiddlewareContext): ChatEvent | null | Promise<ChatEvent | null>;\n /** Transform completed message after receiving from backend */\n onAfterReceive?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | Promise<ChatMessage>;\n /** Intercept errors — return null to suppress, return error to propagate */\n onError?(error: Error, context: ChatMiddlewareContext): Error | null | Promise<Error | null>;\n}\n\n// ─── Chat Provider Abstraction ─────────────────────────────────\n\n/** Options for sending a message to a provider */\nexport interface SendMessageOptions {\n signal?: AbortSignal;\n /** Model to use for this request. Required for server-side runtime.send(). */\n model?: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n context?: Record<string, unknown>;\n /** Additional tools to include in this request */\n tools?: ToolDefinition[];\n}\n\n/** Options for runtime.send() — requires backend routing info */\nexport interface RuntimeSendOptions {\n /** Backend to route this request to (key in backends map) */\n backend: string;\n /** Authentication credentials for the backend factory */\n credentials: AuthToken;\n /** Model to use for this request */\n model: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n /** Abort signal */\n signal?: AbortSignal;\n /** Request-scoped context */\n context?: Record<string, unknown>;\n /** Additional tools */\n tools?: ToolDefinition[];\n}\n\n/**\n * @deprecated IChatProvider has been inlined into IChatBackend.\n * Import IChatBackend from \"@witqq/agent-sdk/chat/backends\" instead.\n * Kept as type alias for backward compatibility.\n */\nexport type IChatProvider = import(\"./backends/types.js\").IChatBackend;\n\n// ─── Factory Functions ─────────────────────────────────────────\n\n/**\n * Create a simple text ChatMessage.\n *\n * @param text - Message text content\n * @param role - Message role (default: \"user\")\n * @returns A complete ChatMessage with a single TextPart\n */\nexport function createTextMessage(text: string, role: ChatRole = \"user\"): ChatMessage {\n return {\n id: createChatId(),\n role,\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n status: \"complete\",\n };\n}\n\n/** Type guard: checks if a session has reactive API (subscribe/getSnapshot) */\nexport function isObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>(\n session: ChatSession<TCustom>,\n): session is ObservableSession<TCustom> {\n return \"subscribe\" in session && typeof (session as ObservableSession<TCustom>).subscribe === \"function\"\n && \"getSnapshot\" in session && typeof (session as ObservableSession<TCustom>).getSnapshot === \"function\";\n}\n","/**\n * @witqq/agent-sdk — AgentEvent ↔ ChatEvent bridge\n */\n\nimport type { AgentEvent, JSONValue } from \"../types.js\";\nimport type { ChatId, ChatEvent } from \"./types.js\";\n\n/**\n * Map a single AgentEvent to a ChatEvent (or null if no mapping)\n */\nexport function agentEventToChatEvent(\n event: AgentEvent,\n messageId: ChatId,\n): ChatEvent | null {\n switch (event.type) {\n case \"text_delta\":\n return { type: \"message:delta\", messageId, text: event.text };\n case \"thinking_start\":\n return { type: \"thinking:start\", messageId };\n case \"thinking_delta\":\n return { type: \"thinking:delta\", messageId, text: event.text };\n case \"thinking_end\":\n return { type: \"thinking:end\", messageId };\n case \"tool_call_start\":\n return {\n type: \"tool:start\",\n messageId,\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args as Record<string, unknown>,\n };\n case \"tool_call_end\":\n return {\n type: \"tool:complete\",\n messageId,\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n result: event.result,\n };\n case \"permission_request\":\n return {\n type: \"permission:request\",\n messageId,\n toolName: event.request.toolName,\n toolArgs: event.request.toolArgs,\n };\n case \"permission_response\":\n return {\n type: \"permission:response\",\n messageId,\n toolName: event.toolName,\n allowed: event.decision.allowed,\n };\n case \"usage_update\":\n return {\n type: \"usage\",\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n model: event.model,\n };\n case \"error\":\n return {\n type: \"error\",\n error: event.error,\n recoverable: event.recoverable,\n code: event.code,\n messageId,\n };\n case \"heartbeat\":\n return { type: \"heartbeat\" };\n case \"ask_user\":\n case \"ask_user_response\":\n case \"session_info\":\n case \"done\":\n return null;\n default:\n return null;\n }\n}\n\n/**\n * Convert AgentEvent async iterable to ChatEvent async iterable\n */\nexport async function* adaptAgentEvents(\n events: AsyncIterable<AgentEvent>,\n messageId: ChatId,\n): AsyncIterable<ChatEvent> {\n for await (const event of events) {\n const chatEvent = agentEventToChatEvent(event, messageId);\n if (chatEvent !== null) {\n yield chatEvent;\n }\n }\n}\n\n/**\n * Map a ChatEvent back to an AgentEvent for accumulator consumption.\n * Returns null for events that don't map to accumulator-relevant AgentEvents.\n */\nexport function chatEventToAgentEvent(event: ChatEvent): AgentEvent | null {\n switch (event.type) {\n case \"message:delta\":\n return { type: \"text_delta\", text: event.text };\n case \"thinking:start\":\n return { type: \"thinking_start\" };\n case \"thinking:delta\":\n return { type: \"thinking_delta\", text: event.text };\n case \"thinking:end\":\n return { type: \"thinking_end\" };\n case \"tool:start\":\n return {\n type: \"tool_call_start\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args as JSONValue,\n };\n case \"tool:complete\":\n return {\n type: \"tool_call_end\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n result: event.result as JSONValue,\n };\n case \"error\":\n return { type: \"error\", error: event.error, recoverable: event.recoverable, code: event.code };\n default:\n return null;\n }\n}\n","/**\n * @witqq/agent-sdk/chat/context\n *\n * Context window manager for selecting which messages fit within a token budget.\n * Stateless: takes messages in, returns trimmed messages out.\n * Three overflow strategies: truncate-oldest, sliding-window, summarize-placeholder.\n */\n\nimport type { ChatMessage, MessagePart } from \"./core.js\";\n\n// ─── Token Estimation ──────────────────────────────────────────\n\n/**\n * Options for token estimation.\n */\nexport interface TokenEstimationOptions {\n /**\n * Characters per token ratio.\n * Lower = more conservative (fewer messages fit).\n * @default 4\n */\n charsPerToken?: number;\n}\n\n/**\n * Estimate token count for a single chat message.\n * Uses character-based heuristic: `Math.ceil(charCount / charsPerToken)`.\n *\n * Counts:\n * - Text content (string or text parts)\n * - Serialized tool calls and tool results\n * - Thinking blocks\n * - Role overhead (~4 tokens)\n *\n * @param message - Chat message to estimate\n * @param options - Estimation options\n * @returns Estimated token count\n *\n * @example\n * ```typescript\n * const tokens = estimateTokens(message);\n * const conservative = estimateTokens(message, { charsPerToken: 3 });\n * ```\n */\nexport function estimateTokens(\n message: ChatMessage,\n options?: TokenEstimationOptions,\n): number {\n const ratio = options?.charsPerToken ?? 4;\n let charCount = 0;\n\n // Role overhead\n charCount += message.role.length + 4;\n\n // Parts\n for (const part of message.parts) {\n charCount += estimatePartChars(part);\n }\n\n return Math.ceil(charCount / ratio);\n}\n\nfunction estimatePartChars(part: MessagePart): number {\n switch (part.type) {\n case \"text\":\n return part.text.length;\n case \"reasoning\":\n return part.text.length;\n case \"tool_call\":\n return JSON.stringify(part.args).length + part.name.length + 20 +\n (part.result !== undefined ? JSON.stringify(part.result).length : 0);\n case \"source\":\n return (part.title?.length ?? 0) + part.url.length + 10;\n case \"file\":\n return part.name.length + part.data.length + 20;\n }\n}\n\n// ─── Overflow Strategies ───────────────────────────────────────\n\n/** Overflow strategy type */\nexport type OverflowStrategy =\n | \"truncate-oldest\"\n | \"sliding-window\"\n | \"summarize-placeholder\";\n\n// ─── Context Window Configuration ──────────────────────────────\n\n/**\n * Async summarizer function for the summarize-placeholder strategy.\n * Receives removed messages and returns a summary string.\n * When configured, replaces the static placeholder text with actual summary.\n */\nexport type ContextSummarizer = (removedMessages: readonly ChatMessage[]) => Promise<string>;\n\n/**\n * Configuration for the context window manager.\n */\nexport interface ContextWindowConfig {\n /** Maximum token budget for the context window */\n maxTokens: number;\n\n /**\n * Tokens reserved for system prompt and response generation.\n * Subtracted from maxTokens to get available budget.\n * @default 0\n */\n reservedTokens?: number;\n\n /**\n * Strategy for handling overflow when messages exceed budget.\n * @default \"truncate-oldest\"\n */\n strategy?: OverflowStrategy;\n\n /**\n * Token estimation options.\n */\n estimation?: TokenEstimationOptions;\n\n /**\n * Optional async summarizer for the summarize-placeholder strategy.\n * When provided, replaces the static placeholder with a generated summary.\n * Falls back to static placeholder if summarizer throws.\n */\n summarizer?: ContextSummarizer;\n}\n\n// ─── Context Window Result ─────────────────────────────────────\n\n/**\n * Result of context window trimming.\n */\nexport interface ContextWindowResult {\n /** Messages that fit within the budget */\n messages: ChatMessage[];\n /** Total estimated tokens for included messages */\n totalTokens: number;\n /** Number of messages removed */\n removedCount: number;\n /** Whether any messages were truncated */\n wasTruncated: boolean;\n}\n\n// ─── Context Stats ─────────────────────────────────────────────\n\n/**\n * Context usage statistics for a session.\n * Returned by `IChatRuntime.getContextStats()`.\n *\n * When real usage data is available (after the first API response),\n * `realPromptTokens` and `realCompletionTokens` contain actual token counts.\n * `modelContextWindow` is the model's context window from `listModels()`.\n */\nexport interface ContextStats {\n /** Estimated total tokens in the trimmed context (heuristic, kept for backward compat) */\n totalTokens: number;\n /** Number of messages removed by trimming */\n removedCount: number;\n /** Whether context was truncated */\n wasTruncated: boolean;\n /** Available token budget (maxTokens − reservedTokens) */\n availableBudget: number;\n /** Real prompt tokens from the last API response (undefined before first response) */\n realPromptTokens?: number;\n /** Real completion tokens from the last API response (undefined before first response) */\n realCompletionTokens?: number;\n /** Model's context window in tokens from listModels() (undefined if not available) */\n modelContextWindow?: number;\n}\n\n// ─── Context Window Manager ────────────────────────────────────\n\n/**\n * Stateless context window manager.\n * Takes messages and returns the subset that fits within a token budget.\n *\n * @example\n * ```typescript\n * const manager = new ContextWindowManager({\n * maxTokens: 4096,\n * reservedTokens: 500,\n * strategy: \"sliding-window\",\n * });\n *\n * const result = manager.fitMessages(messages);\n * // result.messages — trimmed to fit budget\n * // result.totalTokens — estimated token usage\n * // result.wasTruncated — whether messages were removed\n * ```\n */\nexport class ContextWindowManager {\n private readonly config: Required<\n Pick<ContextWindowConfig, \"maxTokens\" | \"reservedTokens\" | \"strategy\">\n > &\n Pick<ContextWindowConfig, \"estimation\" | \"summarizer\">;\n\n constructor(config: ContextWindowConfig) {\n this.config = {\n maxTokens: config.maxTokens,\n reservedTokens: config.reservedTokens ?? 0,\n strategy: config.strategy ?? \"truncate-oldest\",\n estimation: config.estimation,\n summarizer: config.summarizer,\n };\n }\n\n /** Available token budget after reserving tokens */\n get availableBudget(): number {\n return Math.max(0, this.config.maxTokens - this.config.reservedTokens);\n }\n\n /**\n * Estimate tokens for a single message.\n * @param message - Message to estimate\n * @returns Estimated token count\n */\n estimateMessageTokens(message: ChatMessage): number {\n return estimateTokens(message, this.config.estimation);\n }\n\n /**\n * Fit messages within the token budget using the configured strategy.\n * @param messages - All messages to consider\n * @returns Result with fitted messages and metadata\n */\n fitMessages(messages: readonly ChatMessage[]): ContextWindowResult {\n if (messages.length === 0) {\n return { messages: [], totalTokens: 0, removedCount: 0, wasTruncated: false };\n }\n\n const budget = this.availableBudget;\n\n // Calculate tokens for each message\n const tokenCounts = messages.map((m) => this.estimateMessageTokens(m));\n const totalTokens = tokenCounts.reduce((a, b) => a + b, 0);\n\n // All messages fit\n if (totalTokens <= budget) {\n return {\n messages: [...messages],\n totalTokens,\n removedCount: 0,\n wasTruncated: false,\n };\n }\n\n switch (this.config.strategy) {\n case \"truncate-oldest\":\n return this.truncateOldest(messages, tokenCounts, budget);\n case \"sliding-window\":\n return this.slidingWindow(messages, tokenCounts, budget);\n case \"summarize-placeholder\":\n return this.summarizePlaceholder(messages, tokenCounts, budget);\n }\n }\n\n /**\n * Async variant of fitMessages that supports async summarization.\n * When strategy is \"summarize-placeholder\" and a summarizer is configured,\n * calls the summarizer with removed messages and replaces the placeholder text.\n * Falls back to static placeholder if summarizer throws.\n * For other strategies, behaves identically to fitMessages().\n */\n async fitMessagesAsync(messages: readonly ChatMessage[]): Promise<ContextWindowResult> {\n const result = this.fitMessages(messages);\n\n // Only enhance if summarize-placeholder strategy, messages were removed, and summarizer is configured\n if (\n this.config.strategy !== \"summarize-placeholder\" ||\n !result.wasTruncated ||\n !this.config.summarizer\n ) {\n return result;\n }\n\n // Find removed messages (those in original but not in result)\n const keptIds = new Set(result.messages.map(m => m.id));\n const removed = messages.filter(m => !keptIds.has(m.id));\n if (removed.length === 0) return result;\n\n // Call async summarizer, fall back to static placeholder on error\n let summaryText: string;\n try {\n summaryText = await this.config.summarizer(removed);\n } catch {\n return result; // Keep static placeholder on summarizer failure\n }\n\n // Replace placeholder text with summarizer output\n const updatedMessages = result.messages.map(m => {\n if ((m.metadata as Record<string, unknown>)?.isSummary === true) {\n return {\n ...m,\n parts: [{ type: \"text\" as const, text: summaryText, status: \"complete\" as const }],\n };\n }\n return m;\n });\n\n return { ...result, messages: updatedMessages };\n }\n\n /**\n * Trim messages using real token usage data from the previous API call.\n * Uses average-based algorithm: `avgTokensPerMessage = lastPromptTokens / messageCount`.\n * Removes oldest non-system messages until freed budget brings usage under modelContextWindow.\n *\n * @param messages - All messages in the session\n * @param lastPromptTokens - Real prompt tokens from the last API response\n * @param modelContextWindow - Model's total context window size in tokens\n * @returns Result with fitted messages and metadata\n */\n fitMessagesWithUsage(\n messages: readonly ChatMessage[],\n lastPromptTokens: number,\n modelContextWindow: number,\n ): ContextWindowResult {\n if (messages.length === 0) {\n return { messages: [], totalTokens: 0, removedCount: 0, wasTruncated: false };\n }\n\n const budget = modelContextWindow - this.config.reservedTokens;\n if (budget <= 0 || lastPromptTokens <= budget) {\n return {\n messages: [...messages],\n totalTokens: lastPromptTokens,\n removedCount: 0,\n wasTruncated: false,\n };\n }\n\n // Average tokens per message from real data\n const avgTokensPerMessage = lastPromptTokens / messages.length;\n\n // How many tokens we need to free\n const tokensToFree = lastPromptTokens - budget;\n // How many messages to remove (ceil to be safe)\n const messagesToRemove = Math.ceil(tokensToFree / avgTokensPerMessage);\n\n // Separate system and non-system messages\n const systemIndices: number[] = [];\n const nonSystemIndices: number[] = [];\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"system\") {\n systemIndices.push(i);\n } else {\n nonSystemIndices.push(i);\n }\n }\n\n // Remove oldest non-system messages (from the beginning of conversation)\n const removableCount = Math.min(messagesToRemove, nonSystemIndices.length);\n const removedIndices = new Set(nonSystemIndices.slice(0, removableCount));\n\n const result: ChatMessage[] = [];\n for (let i = 0; i < messages.length; i++) {\n if (!removedIndices.has(i)) {\n result.push(messages[i]);\n }\n }\n\n // Estimate new total: proportional reduction\n const estimatedTokens = Math.round(\n lastPromptTokens * (result.length / messages.length),\n );\n\n return {\n messages: result,\n totalTokens: estimatedTokens,\n removedCount: removableCount,\n wasTruncated: removableCount > 0,\n };\n }\n\n /**\n * Truncate oldest: keeps system messages, removes oldest non-system messages first.\n * Always keeps the most recent user message.\n */\n private truncateOldest(\n messages: readonly ChatMessage[],\n tokenCounts: number[],\n budget: number,\n ): ContextWindowResult {\n // Separate system messages (always kept) and non-system\n const systemIndices: number[] = [];\n const nonSystemIndices: number[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"system\") {\n systemIndices.push(i);\n } else {\n nonSystemIndices.push(i);\n }\n }\n\n // System messages cost\n let usedTokens = systemIndices.reduce(\n (sum, i) => sum + tokenCounts[i],\n 0,\n );\n\n // If system messages alone exceed budget, still include them\n // (caller should configure reservedTokens properly)\n\n // Try to fit non-system from newest to oldest\n const includedNonSystem: number[] = [];\n for (let i = nonSystemIndices.length - 1; i >= 0; i--) {\n const idx = nonSystemIndices[i];\n if (usedTokens + tokenCounts[idx] <= budget) {\n includedNonSystem.unshift(idx);\n usedTokens += tokenCounts[idx];\n }\n }\n\n // Build result preserving original order\n const includedSet = new Set([...systemIndices, ...includedNonSystem]);\n const result: ChatMessage[] = [];\n let resultTokens = 0;\n for (let i = 0; i < messages.length; i++) {\n if (includedSet.has(i)) {\n result.push(messages[i]);\n resultTokens += tokenCounts[i];\n }\n }\n\n return {\n messages: result,\n totalTokens: resultTokens,\n removedCount: messages.length - result.length,\n wasTruncated: true,\n };\n }\n\n /**\n * Sliding window: keeps the most recent messages that fit within budget.\n */\n private slidingWindow(\n messages: readonly ChatMessage[],\n tokenCounts: number[],\n budget: number,\n ): ContextWindowResult {\n const result: ChatMessage[] = [];\n let usedTokens = 0;\n\n // Walk from newest to oldest\n for (let i = messages.length - 1; i >= 0; i--) {\n if (usedTokens + tokenCounts[i] <= budget) {\n result.unshift(messages[i]);\n usedTokens += tokenCounts[i];\n } else {\n break;\n }\n }\n\n return {\n messages: result,\n totalTokens: usedTokens,\n removedCount: messages.length - result.length,\n wasTruncated: true,\n };\n }\n\n /**\n * Summarize placeholder: replaces truncated messages with a placeholder,\n * preserving system messages and recent context.\n */\n private summarizePlaceholder(\n messages: readonly ChatMessage[],\n tokenCounts: number[],\n budget: number,\n ): ContextWindowResult {\n // First, identify system messages and recent messages\n const systemMessages: { msg: ChatMessage; tokens: number }[] = [];\n const nonSystem: { msg: ChatMessage; tokens: number; idx: number }[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"system\") {\n systemMessages.push({ msg: messages[i], tokens: tokenCounts[i] });\n } else {\n nonSystem.push({ msg: messages[i], tokens: tokenCounts[i], idx: i });\n }\n }\n\n // System message cost\n let usedTokens = systemMessages.reduce((s, m) => s + m.tokens, 0);\n\n // Placeholder costs ~20 tokens\n const placeholderTokens = 20;\n usedTokens += placeholderTokens;\n\n // Fit recent non-system messages from newest\n const recentKept: typeof nonSystem = [];\n for (let i = nonSystem.length - 1; i >= 0; i--) {\n if (usedTokens + nonSystem[i].tokens <= budget) {\n recentKept.unshift(nonSystem[i]);\n usedTokens += nonSystem[i].tokens;\n } else {\n break;\n }\n }\n\n const removedCount =\n messages.length -\n systemMessages.length -\n recentKept.length;\n\n // Build result: system messages, placeholder, recent messages\n const result: ChatMessage[] = [];\n\n // System messages first\n for (const sm of systemMessages) {\n result.push(sm.msg);\n }\n\n // Placeholder if messages were removed\n if (removedCount > 0) {\n result.push({\n id: \"context-placeholder\" as ChatMessage[\"id\"],\n role: \"system\",\n parts: [{ type: \"text\", text: `[${removedCount} earlier message${removedCount === 1 ? \"\" : \"s\"} omitted for context window]`, status: \"complete\" as const }],\n metadata: { isSummary: true },\n createdAt: new Date().toISOString(),\n status: \"complete\",\n });\n }\n\n // Recent messages\n for (const m of recentKept) {\n result.push(m.msg);\n }\n\n return {\n messages: result,\n totalTokens: usedTokens,\n removedCount,\n wasTruncated: true,\n };\n }\n}\n","/**\n * @witqq/agent-sdk/chat/state\n *\n * Validated state machines for runtime, message, and tool-call lifecycles.\n * Generic StateMachine<S> with declarative transition maps.\n */\n\nimport type { RuntimeStatus, MessageStatus, ToolCallStatus } from \"./core.js\";\nimport { ChatError, ErrorCode } from \"./errors.js\";\n\n// ─── Generic State Machine ─────────────────────────────────────\n\n/** Map of allowed transitions: current state → set of valid next states */\nexport type TransitionMap<S extends string> = Readonly<Record<S, readonly S[]>>;\n\n/**\n * Generic validated state machine.\n * Enforces that every transition is declared in the transition map.\n * Throws ChatError(INVALID_TRANSITION) on illegal moves.\n */\nexport class StateMachine<S extends string> {\n private _current: S;\n\n constructor(\n readonly initial: S,\n readonly transitions: TransitionMap<S>,\n ) {\n this._current = initial;\n }\n\n /** Current state */\n get current(): S {\n return this._current;\n }\n\n /**\n * Check whether transitioning to `next` is allowed from current state\n * @param next - Target state to check\n * @returns True if transition is allowed\n */\n canTransition(next: S): boolean {\n const allowed = this.transitions[this._current];\n return allowed !== undefined && allowed.includes(next);\n }\n\n /**\n * Transition to `next` state.\n * @throws ChatError(INVALID_TRANSITION) if the transition is not allowed\n */\n transition(next: S): void {\n if (!this.canTransition(next)) {\n throw new ChatError(\n `Invalid transition: ${this._current} → ${next}`,\n { code: ErrorCode.INVALID_TRANSITION },\n );\n }\n this._current = next;\n }\n\n /** Reset to initial state */\n reset(): void {\n this._current = this.initial;\n }\n}\n\n// ─── Transition Maps ───────────────────────────────────────────\n\n/** Allowed transitions for RuntimeStatus (idle → streaming/disposed, etc.) */\nexport const RUNTIME_TRANSITIONS: TransitionMap<RuntimeStatus> = {\n idle: [\"streaming\", \"disposed\"],\n streaming: [\"idle\", \"error\", \"disposed\"],\n error: [\"idle\", \"disposed\"],\n disposed: [],\n};\n\n/** Allowed transitions for MessageStatus (pending → streaming → complete, etc.) */\nexport const MESSAGE_TRANSITIONS: TransitionMap<MessageStatus> = {\n pending: [\"streaming\", \"error\", \"cancelled\"],\n streaming: [\"complete\", \"error\", \"cancelled\"],\n complete: [],\n error: [],\n cancelled: [],\n};\n\n/** Allowed transitions for ToolCallStatus (pending → running → complete, etc.) */\nexport const TOOL_CALL_TRANSITIONS: TransitionMap<ToolCallStatus> = {\n pending: [\"running\", \"requires_approval\", \"error\"],\n running: [\"complete\", \"error\"],\n requires_approval: [\"running\", \"denied\", \"error\"],\n complete: [],\n error: [],\n denied: [],\n};\n\n// ─── Pre-configured Factories ──────────────────────────────────\n\n/** Create a RuntimeStatus state machine starting at \"idle\" */\nexport function createRuntimeStateMachine(): StateMachine<RuntimeStatus> {\n return new StateMachine<RuntimeStatus>(\"idle\", RUNTIME_TRANSITIONS);\n}\n\n/** Create a MessageStatus state machine starting at \"pending\" */\nexport function createMessageStateMachine(): StateMachine<MessageStatus> {\n return new StateMachine<MessageStatus>(\"pending\", MESSAGE_TRANSITIONS);\n}\n\n/** Create a ToolCallStatus state machine starting at \"pending\" */\nexport function createToolCallStateMachine(): StateMachine<ToolCallStatus> {\n return new StateMachine<ToolCallStatus>(\"pending\", TOOL_CALL_TRANSITIONS);\n}\n\n// ─── Reentrancy Guard ──────────────────────────────────────────\n\n/**\n * Guards against concurrent send() calls in a chat runtime.\n * acquire() before work, release() after (use try/finally).\n * Throws ChatError(REENTRANCY) if already acquired.\n */\nexport class ChatReentrancyGuard {\n private _acquired = false;\n\n /** Whether the guard is currently held */\n get isAcquired(): boolean {\n return this._acquired;\n }\n\n /**\n * Acquire the guard. Throws if already acquired.\n * @throws ChatError with code REENTRANCY\n */\n acquire(): void {\n if (this._acquired) {\n throw new ChatError(\n \"Concurrent operation detected: a send is already in progress\",\n { code: ErrorCode.REENTRANCY },\n );\n }\n this._acquired = true;\n }\n\n /** Release the guard. Safe to call even if not acquired. */\n release(): void {\n this._acquired = false;\n }\n}\n\n// ─── Abort Controller ──────────────────────────────────────────\n\n/**\n * Abort controller with external signal linking.\n * Wraps an AbortController and optionally links an external AbortSignal\n * so aborting either side cancels the operation.\n */\nexport class ChatAbortController {\n private readonly _controller: AbortController;\n private readonly _onExternalAbort?: () => void;\n private readonly _externalSignal?: AbortSignal;\n\n constructor(externalSignal?: AbortSignal) {\n this._controller = new AbortController();\n this._externalSignal = externalSignal;\n\n if (externalSignal) {\n // If external signal already aborted, abort immediately\n if (externalSignal.aborted) {\n this._controller.abort(externalSignal.reason);\n } else {\n // Link: external abort → our controller\n this._onExternalAbort = () => {\n this._controller.abort(externalSignal.reason);\n };\n externalSignal.addEventListener(\"abort\", this._onExternalAbort, { once: true });\n }\n }\n }\n\n /** The AbortSignal for this controller */\n get signal(): AbortSignal {\n return this._controller.signal;\n }\n\n /** Whether the operation has been aborted */\n get isAborted(): boolean {\n return this._controller.signal.aborted;\n }\n\n /**\n * Abort the operation.\n * @param reason - Optional abort reason\n */\n abort(reason?: unknown): void {\n this._controller.abort(reason);\n }\n\n /** Clean up external signal listener to prevent memory leaks */\n dispose(): void {\n if (this._onExternalAbort && this._externalSignal) {\n this._externalSignal.removeEventListener(\"abort\", this._onExternalAbort);\n }\n }\n}\n","/**\n * @witqq/agent-sdk/chat/accumulator\n *\n * MessageAccumulator converts a stream of AgentEvent objects into a ChatMessage\n * with correct MessagePart array. Handles text, reasoning, and tool call\n * accumulation with proper status transitions.\n */\n\nimport type { AgentEvent } from \"../types.js\";\nimport type { ChatMessage, ChatId, MessagePart, TextPart, ReasoningPart, ToolCallPart } from \"./core.js\";\nimport { createChatId } from \"./core.js\";\n\n/**\n * Converts a stream of AgentEvent objects into a complete ChatMessage.\n * Tracks text, reasoning, and tool call parts with proper status transitions.\n *\n * @example\n * ```typescript\n * const acc = new MessageAccumulator();\n * for await (const event of agentEvents) {\n * acc.apply(event);\n * renderMessage(acc.snapshot()); // in-progress UI update\n * }\n * const message = acc.finalize();\n * ```\n */\nexport class MessageAccumulator {\n private readonly messageId: ChatId;\n private readonly parts: MessagePart[] = [];\n private status: \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\" = \"pending\";\n private currentTextPart: TextPart | null = null;\n private currentReasoningPart: ReasoningPart | null = null;\n private toolCallParts = new Map<string, ToolCallPart>();\n private _finalized = false;\n\n constructor(messageId?: ChatId) {\n this.messageId = messageId ?? createChatId();\n }\n\n /** Get current message ID */\n get id(): ChatId { return this.messageId; }\n\n /**\n * Apply an AgentEvent to accumulate into the message\n * @param event - AgentEvent to process\n * @throws Error if accumulator is already finalized\n */\n apply(event: AgentEvent): void {\n if (this._finalized) throw new Error(\"Cannot apply events to finalized accumulator\");\n\n if (this.status === \"pending\") {\n this.status = \"streaming\";\n }\n\n switch (event.type) {\n case \"text_delta\":\n this.handleTextDelta(event.text);\n break;\n case \"thinking_start\":\n this.finalizeCurrentText();\n this.currentReasoningPart = { type: \"reasoning\", text: \"\", status: \"streaming\" };\n this.parts.push(this.currentReasoningPart);\n break;\n case \"thinking_delta\":\n if (this.currentReasoningPart) {\n this.currentReasoningPart.text += event.text;\n }\n break;\n case \"thinking_end\":\n if (this.currentReasoningPart) {\n this.currentReasoningPart.status = \"complete\";\n this.currentReasoningPart = null;\n }\n break;\n case \"tool_call_start\": {\n this.finalizeCurrentText();\n const toolPart: ToolCallPart = {\n type: \"tool_call\",\n toolCallId: event.toolCallId,\n name: event.toolName,\n args: event.args,\n status: \"running\",\n };\n this.toolCallParts.set(event.toolCallId, toolPart);\n this.parts.push(toolPart);\n break;\n }\n case \"tool_call_end\": {\n const existing = this.toolCallParts.get(event.toolCallId);\n if (existing) {\n existing.result = event.result;\n existing.status = \"complete\";\n }\n break;\n }\n case \"error\":\n this.status = \"error\";\n break;\n case \"done\":\n break;\n // Other events (heartbeat, ask_user, etc.) — ignore\n }\n }\n\n private handleTextDelta(text: string): void {\n if (!this.currentTextPart) {\n this.currentTextPart = { type: \"text\", text: \"\", status: \"streaming\" };\n this.parts.push(this.currentTextPart);\n }\n this.currentTextPart.text += text;\n }\n\n private finalizeCurrentText(): void {\n if (this.currentTextPart) {\n this.currentTextPart.status = \"complete\";\n this.currentTextPart = null;\n }\n }\n\n /**\n * Get a snapshot of the current accumulated message (for streaming UI)\n * @returns ChatMessage with current parts and \"streaming\" status\n */\n snapshot(): ChatMessage {\n const now = new Date().toISOString();\n return {\n id: this.messageId,\n role: \"assistant\",\n parts: this.parts.map(p => ({ ...p })),\n status: this.status === \"pending\" ? \"pending\" : \"streaming\",\n createdAt: now,\n updatedAt: now,\n };\n }\n\n /**\n * Finalize the accumulator and return the complete ChatMessage\n * @returns Completed ChatMessage with all parts finalized\n * @throws Error if accumulator is already finalized\n */\n finalize(): ChatMessage {\n if (this._finalized) throw new Error(\"Accumulator already finalized\");\n this._finalized = true;\n\n // Finalize any open parts\n this.finalizeCurrentText();\n if (this.currentReasoningPart) {\n this.currentReasoningPart.status = \"complete\";\n this.currentReasoningPart = null;\n }\n\n // Mark incomplete tool calls as error\n for (const [, toolPart] of this.toolCallParts) {\n if (toolPart.status === \"running\" || toolPart.status === \"pending\") {\n toolPart.status = \"error\";\n }\n }\n\n // Set final message status\n if (this.status !== \"error\" && this.status !== \"cancelled\") {\n this.status = \"complete\";\n }\n\n const now = new Date().toISOString();\n return {\n id: this.messageId,\n role: \"assistant\",\n parts: this.parts,\n status: this.status,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n /** Check if the accumulator has been finalized */\n get finalized(): boolean { return this._finalized; }\n}\n","/**\n * @witqq/agent-sdk - Stream Watchdog\n *\n * Activity-based timeout wrapper for async event streams.\n * Aborts the stream if no events arrive within a configurable inactivity window.\n * Timer resets on each received event.\n */\n\nimport { ChatError, ErrorCode } from \"./errors.js\";\n\n// ─── Configuration ─────────────────────────────────────────────\n\n/** Stream watchdog configuration */\nexport interface StreamWatchdogConfig {\n /** Maximum inactivity time in milliseconds before aborting the stream */\n timeoutMs: number;\n /** AbortSignal to link with (watchdog aborts when this signal fires) */\n signal?: AbortSignal;\n}\n\n// ─── Watchdog Implementation ───────────────────────────────────\n\n/**\n * Wraps an async iterable with an activity timeout.\n * If no event arrives within `timeoutMs`, the stream is aborted with a ChatError.\n * The timer resets after each received event.\n *\n * Uses Promise.race() so even if the source iterator is stuck on an\n * unresolvable promise, the timeout fires and aborts iteration.\n *\n * @example\n * ```ts\n * const watched = withStreamWatchdog(adapter.streamMessage(session, msg), {\n * timeoutMs: 30000,\n * signal: abortController.signal,\n * });\n *\n * for await (const event of watched) {\n * // Each event resets the 30s inactivity timer\n * }\n * ```\n */\nexport async function* withStreamWatchdog<T>(\n source: AsyncIterable<T>,\n config: StreamWatchdogConfig,\n): AsyncGenerator<T> {\n const { timeoutMs, signal } = config;\n\n const iterator = source[Symbol.asyncIterator]();\n let aborted = false;\n\n // Link external abort signal\n if (signal?.aborted) {\n iterator.return?.();\n return;\n }\n\n const onAbort = (): void => {\n aborted = true;\n iterator.return?.();\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n try {\n while (true) {\n if (aborted) break;\n\n // Race iterator.next() against a cancellable inactivity timeout.\n // The timeout is cleared when iterator.next() wins, preventing\n // unhandled promise rejections from orphaned setTimeout callbacks.\n const timeout = new CancellableTimeout<T>(timeoutMs);\n try {\n const result = await Promise.race([\n iterator.next(),\n timeout.promise,\n ]);\n timeout.cancel();\n\n if (result.done) break;\n yield result.value;\n } catch (err) {\n timeout.cancel();\n throw err;\n }\n }\n } finally {\n signal?.removeEventListener(\"abort\", onAbort);\n iterator.return?.();\n }\n}\n\n/** Timeout that can be cancelled to prevent unhandled rejections */\nclass CancellableTimeout<T> {\n readonly promise: Promise<IteratorResult<T>>;\n private _timer: ReturnType<typeof setTimeout> | undefined;\n private _cancelled = false;\n\n constructor(ms: number) {\n this.promise = new Promise<IteratorResult<T>>((_, reject) => {\n this._timer = setTimeout(() => {\n if (!this._cancelled) {\n reject(\n new ChatError(\n `Stream timed out after ${ms}ms of inactivity`,\n { code: ErrorCode.TIMEOUT },\n ),\n );\n }\n }, ms);\n });\n // Prevent unhandled rejection when cancelled\n this.promise.catch(() => {});\n }\n\n cancel(): void {\n this._cancelled = true;\n if (this._timer !== undefined) {\n clearTimeout(this._timer);\n this._timer = undefined;\n }\n }\n}\n","/**\n * Generic listener set utility for subscribe/notify patterns.\n *\n * Encapsulates the recurring pattern of:\n * - Set<callback> storage\n * - add(callback) → unsubscribe function\n * - notify(...args) with try/catch per listener\n * - clear() for disposal\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class ListenerSet<T extends (...args: any[]) => void> {\n private readonly _listeners = new Set<T>();\n\n /** Add a listener. Returns an unsubscribe function. */\n add(callback: T): () => void {\n this._listeners.add(callback);\n return () => { this._listeners.delete(callback); };\n }\n\n /** Notify all listeners with the given arguments. Errors are isolated per listener. */\n notify(...args: Parameters<T>): void {\n for (const cb of this._listeners) {\n try { cb(...args); } catch { /* listener errors must not propagate */ }\n }\n }\n\n /** Remove all listeners. */\n clear(): void {\n this._listeners.clear();\n }\n\n /** Current number of listeners. */\n get size(): number {\n return this._listeners.size;\n }\n}\n","/**\n * @witqq/agent-sdk/chat/runtime\n *\n * Unified chat runtime orchestrator. Creates a fully-wired runtime instance\n * from a configuration object, managing backend adapters, sessions, context\n * trimming, streaming, and middleware in a single facade.\n *\n * Usage:\n * ```typescript\n * import { createChatRuntime } from \"@witqq/agent-sdk/chat/runtime\";\n * const runtime = createChatRuntime({ backends: { ... }, sessionStore, ... });\n * const session = await runtime.createSession({ config: { model: \"gpt-4\", backend: \"copilot\" } });\n * for await (const event of runtime.send(session.id, \"Hello\")) { ... }\n * ```\n */\n\nimport type {\n ChatEvent,\n ChatId,\n ChatIdLike,\n ChatMessage,\n ChatMiddleware,\n ChatMiddlewareContext,\n ChatSession,\n ChatSessionConfig,\n RuntimeStatus,\n SendMessageOptions,\n RuntimeSendOptions,\n} from \"./core.js\";\nimport { createChatId, toChatId, chatEventToAgentEvent } from \"./core.js\";\nimport type { IChatBackend } from \"./backends/types.js\";\nimport type { IChatSessionStore, CreateSessionOptions, SessionListOptions } from \"./sessions.js\";\nimport type { ContextWindowConfig, ContextStats } from \"./context.js\";\nimport { ContextWindowManager } from \"./context.js\";\nimport {\n StateMachine,\n RUNTIME_TRANSITIONS,\n ChatReentrancyGuard,\n ChatAbortController,\n} from \"./state.js\";\nimport { ChatError, ErrorCode } from \"./errors.js\";\nimport { MessageAccumulator } from \"./accumulator.js\";\nimport { withStreamWatchdog } from \"./watchdog.js\";\nimport { ListenerSet } from \"./listener-set.js\";\nimport type { ToolDefinition, ToolContext } from \"../types.js\";\nimport type { ModelInfo } from \"../types.js\";\nimport type { AuthToken } from \"../auth/types.js\";\nimport type { ProviderConfig } from \"./provider-types.js\";\n\n// ─── Runtime Configuration ─────────────────────────────────────\n\n/** Factory function that creates a backend adapter on demand */\nexport type BackendAdapterFactory = (credentials: AuthToken) => IChatBackend | Promise<IChatBackend>;\n\n/** Configuration for creating a chat runtime via createChatRuntime() */\nexport interface ChatRuntimeOptions {\n /** Map of backend name → adapter factory (lazy creation on first use) */\n backends: Record<string, BackendAdapterFactory>;\n /** Default backend name (must be a key in `backends`) */\n defaultBackend: string;\n /** Session store for persistence */\n sessionStore: IChatSessionStore;\n /** Context window configuration (optional) */\n context?: ContextWindowConfig;\n /** Middleware pipeline (optional, applied in order) */\n middleware?: ChatMiddleware[];\n /** Retry configuration for pre-stream connection errors */\n retryConfig?: StreamRetryConfig;\n /**\n * Stream inactivity timeout in milliseconds (optional).\n * When set, aborts the stream if no events arrive within this window.\n * Timer resets after each received event.\n */\n streamTimeoutMs?: number;\n /**\n * Called when context trimming removes messages.\n * Use for archiving, logging, or analytics.\n */\n onContextTrimmed?: (sessionId: ChatIdLike, removedMessages: ChatMessage[]) => void;\n /**\n * Initial tools to register on the runtime.\n * Equivalent to calling `registerTool()` for each tool after creation.\n */\n tools?: ToolDefinition[];\n}\n\n/** Retry configuration for pre-stream failures (renamed to avoid clash with agent-level RetryConfig) */\nexport interface StreamRetryConfig {\n /** Maximum number of attempts (default: 1 = no retry) */\n maxAttempts: number;\n /** Delay between retries in milliseconds */\n delayMs: number;\n}\n\n/** @deprecated Use StreamRetryConfig */\nexport type RetryConfig = StreamRetryConfig;\n\n// ─── Backend Discovery ─────────────────────────────────────────\n\n/** Information about a registered backend */\nexport interface BackendInfo {\n /** Backend name (key in backends map) */\n name: string;\n}\n\n// ─── Provider CRUD Interface ───────────────────────────────────\n\n/**\n * Provider CRUD operations — separated per Interface Segregation Principle.\n * Implemented by IChatClient (which needs provider management for UI).\n * Not required on IChatRuntime (providers are a handler-layer concern).\n */\nexport interface IProviderClient {\n listProviders(): Promise<ProviderConfig[]>;\n createProvider(config: Omit<ProviderConfig, \"id\" | \"createdAt\">): Promise<ProviderConfig>;\n updateProvider(id: string, changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">>): Promise<void>;\n deleteProvider(id: string): Promise<void>;\n}\n\n// ─── IChatClient Interface (client-side remote) ────────────────\n\n/** Callback for provider selection changes */\nexport type SelectionChangeCallback = (providerId: string | null) => void;\n\n/**\n * Client-side interface for interacting with a remote chat server.\n * Fully self-contained — no shared base with IChatRuntime.\n * Extends IProviderClient for provider CRUD (ISP).\n * Used by React components and remote clients.\n *\n * @typeParam TMetadata - Type-level convenience for message metadata.\n * NOT enforced at the storage boundary — session stores always use `unknown`.\n * Consumers are responsible for metadata shape consistency.\n */\nexport interface IChatClient<TMetadata extends Record<string, unknown> = Record<string, unknown>>\n extends IProviderClient {\n\n // ── Lifecycle ──\n readonly status: RuntimeStatus;\n dispose(): Promise<void>;\n\n // ── Sessions ──\n createSession(options: CreateSessionOptions<TMetadata>): Promise<ChatSession<TMetadata>>;\n getSession(id: ChatIdLike): Promise<ChatSession<TMetadata> | null>;\n listSessions(options?: SessionListOptions): Promise<ChatSession<TMetadata>[]>;\n deleteSession(id: ChatIdLike): Promise<void>;\n\n // ── Client-side session state ──\n switchSession(id: ChatIdLike): Promise<ChatSession<TMetadata>>;\n readonly activeSessionId: ChatId | null;\n\n // ── Messaging ──\n /**\n * Send a message. Options are optional — the server handler resolves\n * model and backend from provider selection state.\n * Compare with IChatRuntime.send() where RuntimeSendOptions is required.\n */\n send(sessionId: ChatIdLike, message: string, options?: SendMessageOptions): AsyncIterable<ChatEvent>;\n\n // ── Messaging control ──\n abort(): void;\n\n // ── Provider Selection (local client state) ──\n selectProvider(providerId: string): void;\n readonly selectedProviderId: string | null;\n onSelectionChange(callback: SelectionChangeCallback): () => void;\n\n // ── Subscriptions ──\n onSessionChange(callback: () => void): () => void;\n\n // ── Discovery ──\n listModels(): Promise<ModelInfo[]>;\n listBackends(): Promise<BackendInfo[]>;\n\n // ── Context Stats ──\n getContextStats(sessionId: ChatIdLike): Promise<ContextStats | null>;\n}\n\n// ─── IChatRuntime Interface (server-only) ──────────────────────\n\n/**\n * Server-side chat runtime. Fully self-contained — no shared base with IChatClient.\n * Manages backend adapters, tools, middleware, and context trimming.\n * Does NOT include client-facing provider CRUD or selection — those are\n * handled by the server handler layer.\n *\n * @typeParam TMetadata - Type-level convenience for message metadata.\n * NOT enforced at the storage boundary — session stores always use `unknown`.\n * Casts in `ChatRuntime.createSession()`/`getSession()` are intentionally unsafe\n * to provide typed access. Consumers are responsible for metadata shape consistency.\n */\nexport interface IChatRuntime<TMetadata extends Record<string, unknown> = Record<string, unknown>> {\n\n // ── Lifecycle ──\n readonly status: RuntimeStatus;\n dispose(): Promise<void>;\n\n // ── Sessions ──\n createSession(options: CreateSessionOptions<TMetadata>): Promise<ChatSession<TMetadata>>;\n getSession(id: ChatIdLike): Promise<ChatSession<TMetadata> | null>;\n listSessions(options?: SessionListOptions): Promise<ChatSession<TMetadata>[]>;\n deleteSession(id: ChatIdLike): Promise<void>;\n\n // ── Messaging ──\n /**\n * Send a message. RuntimeSendOptions is required on the server — the caller\n * (usually a handler) must supply backend, model, and credentials.\n * Compare with IChatClient.send() where options are optional.\n */\n send(sessionId: ChatIdLike, message: string, options: RuntimeSendOptions): AsyncIterable<ChatEvent>;\n \n // ── Messaging control ──\n abort(): void;\n\n // ── Subscriptions ──\n onSessionChange(callback: () => void): () => void;\n\n // ── Discovery ──\n listModels(options?: { backend?: string; credentials?: AuthToken }): Promise<ModelInfo[]>;\n listBackends(): Promise<BackendInfo[]>;\n\n // ── Tools ──\n registerTool(tool: ToolDefinition): void;\n removeTool(name: string): void;\n readonly registeredTools: ReadonlyMap<string, ToolDefinition>;\n\n // ── Middleware ──\n use(middleware: ChatMiddleware): void;\n removeMiddleware(middleware: ChatMiddleware): void;\n\n // ── Context Stats ──\n getContextStats(sessionId: ChatIdLike): Promise<ContextStats | null>;\n}\n\n// ─── ChatRuntime Implementation ────────────────────────────────\n\nclass ChatRuntime<TMetadata extends Record<string, unknown> = Record<string, unknown>> implements IChatRuntime<TMetadata> {\n private readonly _state: StateMachine<RuntimeStatus>;\n private readonly _guard: ChatReentrancyGuard;\n private readonly _backends: Record<string, BackendAdapterFactory>;\n private readonly _sessionStore: IChatSessionStore;\n private readonly _contextConfig?: ContextWindowConfig;\n private readonly _middleware: ChatMiddleware[];\n private readonly _tools = new Map<string, ToolDefinition>();\n private readonly _retryConfig?: StreamRetryConfig;\n private readonly _contextStats = new Map<ChatId, ContextStats>();\n private readonly _sessionUsage = new Map<ChatId, { promptTokens: number; completionTokens: number }>();\n private readonly _modelContextWindows = new Map<string, number>();\n private readonly _onContextTrimmed?: (sessionId: ChatIdLike, removedMessages: ChatMessage[]) => void;\n private readonly _streamTimeoutMs?: number;\n private readonly _sessionListeners = new ListenerSet<() => void>();\n\n private readonly _adapterPool = new Map<string, IChatBackend>();\n private readonly _defaultBackend: string;\n private _abortController: ChatAbortController | null = null;\n\n constructor(options: ChatRuntimeOptions) {\n this._state = new StateMachine<RuntimeStatus>(\"idle\", RUNTIME_TRANSITIONS);\n this._guard = new ChatReentrancyGuard();\n this._backends = options.backends;\n this._defaultBackend = options.defaultBackend;\n this._sessionStore = options.sessionStore;\n this._contextConfig = options.context;\n this._middleware = [...(options.middleware ?? [])];\n this._retryConfig = options.retryConfig;\n this._onContextTrimmed = options.onContextTrimmed;\n this._streamTimeoutMs = options.streamTimeoutMs;\n\n if (!options.backends[options.defaultBackend]) {\n throw new ChatError(\n `Default backend \"${options.defaultBackend}\" not found in backends map`,\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n // Register initial tools if provided\n if (options.tools) {\n for (const tool of options.tools) {\n this._tools.set(tool.name, tool);\n }\n }\n }\n\n // ── Lifecycle ──────────────────────────────────────────────\n\n get status(): RuntimeStatus {\n return this._state.current;\n }\n\n async dispose(): Promise<void> {\n if (this._state.current === \"disposed\") return;\n\n // Abort any in-flight send\n this._abortController?.abort(\"Runtime disposed\");\n this._abortController?.dispose();\n this._abortController = null;\n\n // Direct transition to disposed from any state (streaming→disposed now valid)\n this._state.transition(\"disposed\");\n\n // Dispose all adapters in pool\n for (const adapter of this._adapterPool.values()) {\n try { await adapter.dispose(); } catch { /* best-effort */ }\n }\n this._adapterPool.clear();\n }\n\n // ── Sessions ───────────────────────────────────────────────\n\n async createSession(options: CreateSessionOptions<TMetadata>): Promise<ChatSession<TMetadata>> {\n this.assertNotDisposed();\n const config: ChatSessionConfig = {\n model: options.config?.model ?? \"\",\n backend: options.config?.backend ?? this._defaultBackend,\n ...options.config,\n };\n const session = await this._sessionStore.createSession({ ...options, config });\n this._notifySessionChange();\n // TMetadata safety: session store uses unknown metadata. Cast is intentional —\n // consumers control metadata shape via TMetadata generic at compile time.\n return session as ChatSession<TMetadata>;\n }\n\n async getSession(id: ChatIdLike): Promise<ChatSession<TMetadata> | null> {\n this.assertNotDisposed();\n const cid = toChatId(id);\n return this._sessionStore.getSession(cid) as Promise<ChatSession<TMetadata> | null>;\n }\n\n async listSessions(options?: SessionListOptions): Promise<ChatSession<TMetadata>[]> {\n this.assertNotDisposed();\n return this._sessionStore.listSessions(options) as Promise<ChatSession<TMetadata>[]>;\n }\n\n async deleteSession(id: ChatIdLike): Promise<void> {\n this.assertNotDisposed();\n const cid = toChatId(id);\n const session = await this._sessionStore.getSession(cid);\n if (!session) return;\n\n await this._sessionStore.deleteSession(cid);\n this._contextStats.delete(cid);\n this._sessionUsage.delete(cid);\n this._notifySessionChange();\n }\n\n // ── Messaging ──────────────────────────────────────────────\n\n async *send(\n sessionId: ChatIdLike,\n message: string,\n options: RuntimeSendOptions,\n ): AsyncIterable<ChatEvent> {\n this.validateSendInput(message, options);\n this._guard.acquire();\n\n const cid = toChatId(sessionId);\n this._abortController = new ChatAbortController(options?.signal);\n\n try {\n if (this._state.current === \"error\") {\n this._state.transition(\"idle\");\n }\n this._state.transition(\"streaming\");\n\n await this.loadSession(cid);\n const mwCtx: ChatMiddlewareContext = {\n sessionId: cid,\n signal: this._abortController.signal,\n };\n\n const userMessage = await this.applyBeforeSendMiddleware(\n this.createUserMessage(message), mwCtx,\n );\n if (userMessage === null) {\n // Middleware rejected the send — transition back to idle silently\n this._state.transition(\"idle\");\n return;\n }\n const updatedSession = await this.persistAndReload(cid, userMessage);\n const sessionForAdapter = await this.trimSessionContext(cid, updatedSession, options.model);\n\n const stream = await this.prepareEventStream(\n cid, sessionForAdapter, updatedSession, message, options,\n );\n\n const accumulator = new MessageAccumulator();\n const eventSource = this._streamTimeoutMs\n ? withStreamWatchdog(stream, { timeoutMs: this._streamTimeoutMs, signal: this._abortController.signal })\n : stream;\n\n for await (const event of eventSource) {\n if (this._abortController.isAborted) break;\n this.feedAccumulator(accumulator, event);\n\n // Capture real usage data from usage events\n if (event.type === \"usage\") {\n this._sessionUsage.set(cid, {\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n });\n this.updateContextStatsWithUsage(cid, event.promptTokens, event.completionTokens, options);\n }\n\n const processed = await this.applyOnEventMiddleware(event, mwCtx);\n if (processed) yield processed;\n }\n\n if (this._state.current === \"disposed\") return;\n\n await this.finalizeAssistantMessage(cid, accumulator, mwCtx);\n\n this._state.transition(\"idle\");\n } catch (error) {\n const result = await this.handleSendError(error, cid);\n if (result !== null) throw result;\n // null = error suppressed by middleware, exit silently\n } finally {\n this._guard.release();\n this._abortController?.dispose();\n this._abortController = null;\n }\n }\n\n // ── Send Pipeline Stages ──────────────────────────────────────\n\n /** Stage 1: Validate send inputs (message content + required fields). */\n private validateSendInput(message: string, options: RuntimeSendOptions): void {\n this.assertNotDisposed();\n\n if (!message || message.trim().length === 0) {\n throw new ChatError(\"Message cannot be empty\", { code: ErrorCode.INVALID_INPUT });\n }\n\n if (!options.model) {\n throw new ChatError(\n \"options.model is required — caller must specify which model to use\",\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n if (!options.backend) {\n throw new ChatError(\n \"options.backend is required — caller must specify which backend to use\",\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n if (!options.credentials) {\n throw new ChatError(\n \"options.credentials is required — caller must provide authentication credentials\",\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n }\n\n /** Stage 2: Load session from store. */\n private async loadSession(cid: ChatId): Promise<ChatSession> {\n const session = await this._sessionStore.getSession(cid);\n if (!session) {\n throw new ChatError(\n `Session \"${cid}\" not found`,\n { code: ErrorCode.SESSION_NOT_FOUND },\n );\n }\n return session;\n }\n\n /** Stage 3: Apply onBeforeSend middleware pipeline. Returns null if middleware rejected the send. */\n private async applyBeforeSendMiddleware(\n userMessage: ChatMessage,\n ctx: ChatMiddlewareContext,\n ): Promise<ChatMessage | null> {\n let msg: ChatMessage | null = userMessage;\n for (const mw of this._middleware) {\n if (mw.onBeforeSend && msg) {\n msg = await mw.onBeforeSend(msg, ctx);\n if (msg === null) return null;\n }\n }\n return msg;\n }\n\n /** Stage 4: Persist user message and reload session with full history. */\n private async persistAndReload(cid: ChatId, userMessage: ChatMessage): Promise<ChatSession> {\n await this._sessionStore.appendMessage(cid, userMessage);\n return (await this._sessionStore.getSession(cid))!;\n }\n\n /** Stage 5: Auto-trim context window if configured. Returns session snapshot for adapter. */\n private async trimSessionContext(cid: ChatId, session: ChatSession, model?: string): Promise<ChatSession> {\n if (!this._contextConfig) return session;\n\n const ctxManager = new ContextWindowManager(this._contextConfig);\n const lastUsage = this._sessionUsage.get(cid);\n const modelContextWindow = model ? this._modelContextWindows.get(model) : undefined;\n\n // When real usage data is available, use average-based trimming\n if (lastUsage && modelContextWindow) {\n const result = ctxManager.fitMessagesWithUsage(\n session.messages,\n lastUsage.promptTokens,\n modelContextWindow,\n );\n\n this._contextStats.set(cid, {\n totalTokens: result.totalTokens,\n removedCount: result.removedCount,\n wasTruncated: result.wasTruncated,\n availableBudget: Math.max(0, modelContextWindow - result.totalTokens),\n realPromptTokens: lastUsage.promptTokens,\n realCompletionTokens: lastUsage.completionTokens,\n modelContextWindow,\n });\n\n if (result.wasTruncated && this._onContextTrimmed) {\n const keptIds = new Set(result.messages.map(m => m.id));\n const removed = session.messages.filter(m => !keptIds.has(m.id));\n if (removed.length > 0) {\n try { this._onContextTrimmed(cid, removed); } catch { /* swallow user callback errors */ }\n }\n }\n\n return { ...session, messages: result.messages };\n }\n\n // First message (no prior usage data): skip trimming, rely on model's large context window\n // Still use heuristic-based trimming as safety net via fitMessagesAsync\n const result = await ctxManager.fitMessagesAsync(session.messages);\n\n this._contextStats.set(cid, {\n totalTokens: result.totalTokens,\n removedCount: result.removedCount,\n wasTruncated: result.wasTruncated,\n availableBudget: ctxManager.availableBudget,\n modelContextWindow,\n });\n\n if (result.wasTruncated && this._onContextTrimmed) {\n const keptIds = new Set(result.messages.map(m => m.id));\n const removed = session.messages.filter(m => !keptIds.has(m.id));\n if (removed.length > 0) {\n try { this._onContextTrimmed(cid, removed); } catch { /* swallow user callback errors */ }\n }\n }\n\n return { ...session, messages: result.messages };\n }\n\n /** Update context stats with real usage data from a usage event. */\n private updateContextStatsWithUsage(\n cid: ChatId,\n promptTokens: number,\n completionTokens: number,\n options: RuntimeSendOptions,\n ): void {\n const modelContextWindow = options.model\n ? this._modelContextWindows.get(options.model)\n : undefined;\n\n const existing = this._contextStats.get(cid);\n this._contextStats.set(cid, {\n totalTokens: promptTokens,\n removedCount: existing?.removedCount ?? 0,\n wasTruncated: existing?.wasTruncated ?? false,\n availableBudget: modelContextWindow\n ? Math.max(0, modelContextWindow - promptTokens)\n : (existing?.availableBudget ?? 0),\n realPromptTokens: promptTokens,\n realCompletionTokens: completionTokens,\n modelContextWindow,\n });\n }\n\n /** Stage 6: Prepare event stream — adapter with retry, tool injection. */\n private async prepareEventStream(\n cid: ChatId,\n sessionForAdapter: ChatSession,\n fullSession: ChatSession,\n message: string,\n options: RuntimeSendOptions,\n ): Promise<AsyncIterable<ChatEvent>> {\n const adapter = await this.getOrCreateAdapterWithRetry(options.backend, options.credentials);\n\n const runtimeTools = this._tools.size > 0\n ? this.injectToolContext([...this._tools.values()], {\n sessionId: cid as string,\n custom: fullSession.metadata?.custom as Record<string, unknown> | undefined,\n })\n : undefined;\n\n const streamOptions: SendMessageOptions = {\n signal: this._abortController!.signal,\n model: options.model,\n systemPrompt: options.systemPrompt,\n tools: runtimeTools,\n };\n\n return this.createStreamWithRetry(\n adapter, sessionForAdapter, message, streamOptions,\n options.backend, options.credentials,\n );\n }\n\n /** Stage 7: Apply onEvent middleware pipeline (sequential transform/suppress). */\n private async applyOnEventMiddleware(\n event: ChatEvent,\n ctx: ChatMiddlewareContext,\n ): Promise<ChatEvent | null> {\n let processed: ChatEvent | null = event;\n for (const mw of this._middleware) {\n if (mw.onEvent && processed) {\n processed = await mw.onEvent(processed, ctx);\n }\n }\n return processed;\n }\n\n /** Stage 8: Finalize accumulator, apply afterReceive middleware, persist assistant message. */\n private async finalizeAssistantMessage(\n cid: ChatId,\n accumulator: MessageAccumulator,\n ctx: ChatMiddlewareContext,\n ): Promise<void> {\n let assistantMessage = accumulator.finalize();\n\n for (const mw of this._middleware) {\n if (mw.onAfterReceive) {\n assistantMessage = await mw.onAfterReceive(assistantMessage, ctx);\n }\n }\n\n await this._sessionStore.appendMessage(cid, assistantMessage);\n this._notifySessionChange();\n }\n\n /** Stage 9: Error handling — apply onError middleware, transition state. Returns null if suppressed. */\n private async handleSendError(error: unknown, cid: ChatId): Promise<Error | null> {\n let processedError = error instanceof Error ? error : new Error(String(error));\n const ctx: ChatMiddlewareContext = {\n sessionId: cid,\n signal: this._abortController?.signal ?? new AbortController().signal,\n };\n\n for (const mw of this._middleware) {\n if (mw.onError) {\n const result = await mw.onError(processedError, ctx);\n if (result === null) {\n if (this._state.canTransition(\"idle\")) {\n this._state.transition(\"idle\");\n }\n return null;\n }\n processedError = result;\n }\n }\n\n if (this._state.canTransition(\"error\")) {\n this._state.transition(\"error\");\n }\n return processedError;\n }\n\n abort(): void {\n this._abortController?.abort(\"User abort\");\n }\n\n // ── Backend / Model ────────────────────────────────────────\n\n async listModels(options?: { backend?: string; credentials?: AuthToken }): Promise<ModelInfo[]> {\n this.assertNotDisposed();\n let models: ModelInfo[] = [];\n // Use existing adapter from pool if available\n const firstAdapter = [...this._adapterPool.values()][0];\n if (firstAdapter) {\n try { models = await firstAdapter.listModels(); } catch { return []; }\n } else if (options?.backend && options?.credentials) {\n // Pool empty — try to create adapter from provided credentials\n try {\n const adapter = await this.getOrCreateAdapter(options.backend, options.credentials);\n models = await adapter.listModels();\n } catch { return []; }\n }\n // Cache context windows for models that provide them\n for (const model of models) {\n if (model.contextWindow != null) {\n this._modelContextWindows.set(model.id, model.contextWindow);\n }\n }\n return models;\n }\n\n async listBackends(): Promise<BackendInfo[]> {\n this.assertNotDisposed();\n return Object.keys(this._backends).map((name) => ({ name }));\n }\n\n // ── Tools ──────────────────────────────────────────────────\n\n get registeredTools(): ReadonlyMap<string, ToolDefinition> {\n return this._tools;\n }\n\n registerTool(tool: ToolDefinition): void {\n this.assertNotDisposed();\n this._tools.set(tool.name, tool);\n }\n\n removeTool(name: string): void {\n this.assertNotDisposed();\n this._tools.delete(name);\n }\n\n // ── Middleware ──────────────────────────────────────────────\n\n use(middleware: ChatMiddleware): void {\n this.assertNotDisposed();\n this._middleware.push(middleware);\n }\n\n removeMiddleware(middleware: ChatMiddleware): void {\n this.assertNotDisposed();\n const idx = this._middleware.indexOf(middleware);\n if (idx >= 0) this._middleware.splice(idx, 1);\n }\n\n // ── Context Stats ─────────────────────────────────────────\n\n async getContextStats(sessionId: ChatIdLike): Promise<ContextStats | null> {\n const cid = toChatId(sessionId);\n return this._contextStats.get(cid) ?? null;\n }\n\n // ── Session Subscription ──────────────────────────────────\n\n onSessionChange(callback: () => void): () => void {\n return this._sessionListeners.add(callback);\n }\n\n private _notifySessionChange(): void {\n this._sessionListeners.notify();\n }\n\n // ── Private Helpers ────────────────────────────────────────\n\n private async getOrCreateAdapter(backend: string, credentials: AuthToken): Promise<IChatBackend> {\n const key = this.getPoolKey(backend, credentials);\n const existing = this._adapterPool.get(key);\n if (existing) return existing;\n\n // Dispose stale adapters for same backend with different credentials\n for (const [oldKey, oldAdapter] of this._adapterPool) {\n if (oldKey.startsWith(backend + \":\")) {\n try { await oldAdapter.dispose(); } catch { /* best-effort */ }\n this._adapterPool.delete(oldKey);\n }\n }\n\n const factory = this._backends[backend];\n if (!factory) {\n throw new ChatError(\n `Backend \"${backend}\" not found`,\n { code: ErrorCode.INVALID_INPUT },\n );\n }\n\n const adapter = await factory(credentials);\n\n this._adapterPool.set(key, adapter);\n return adapter;\n }\n\n private getPoolKey(backend: string, credentials: AuthToken): string {\n const token = credentials.accessToken;\n const hash = token.length > 16 ? token.slice(0, 8) + token.slice(-8) : token;\n return `${backend}:${hash}`;\n }\n\n /** Wrap each tool's execute to inject ToolContext as 2nd argument */\n private injectToolContext(tools: ToolDefinition[], context: ToolContext): ToolDefinition[] {\n return tools.map(tool => ({\n ...tool,\n execute: (params: unknown) => tool.execute(params, context),\n }));\n }\n\n /** Map ChatEvent to AgentEvent for MessageAccumulator */\n private feedAccumulator(acc: MessageAccumulator, event: ChatEvent): void {\n const agentEvent = chatEventToAgentEvent(event);\n if (agentEvent) acc.apply(agentEvent);\n }\n\n private createUserMessage(text: string): ChatMessage {\n return {\n id: createChatId(),\n role: \"user\",\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n status: \"complete\",\n };\n }\n\n private assertNotDisposed(): void {\n if (this._state.current === \"disposed\") {\n throw new ChatError(\n \"Runtime is disposed\",\n { code: ErrorCode.DISPOSED },\n );\n }\n }\n\n /** Get or create adapter with retry on connection errors */\n private async getOrCreateAdapterWithRetry(backend: string, credentials: AuthToken): Promise<IChatBackend> {\n const maxAttempts = this._retryConfig?.maxAttempts ?? 1;\n const delayMs = this._retryConfig?.delayMs ?? 0;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await this.getOrCreateAdapter(backend, credentials);\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n if (attempt < maxAttempts) {\n // Remove cached adapter so next attempt creates fresh\n const key = this.getPoolKey(backend, credentials);\n const old = this._adapterPool.get(key);\n if (old) { try { await old.dispose(); } catch { /* best-effort */ } }\n this._adapterPool.delete(key);\n await delay(delayMs);\n }\n }\n }\n\n throw lastError!;\n }\n\n /**\n * Create stream with retry for pre-stream connection errors.\n * Tries to get the first event from the stream; if that fails,\n * retries with a fresh adapter. Once first event is received,\n * the stream is committed (no more retries).\n */\n private async createStreamWithRetry(\n adapter: IChatBackend,\n session: ChatSession,\n message: string,\n options: SendMessageOptions | undefined,\n backend: string,\n credentials: AuthToken,\n ): Promise<AsyncIterable<ChatEvent>> {\n const maxAttempts = this._retryConfig?.maxAttempts ?? 1;\n const delayMs = this._retryConfig?.delayMs ?? 0;\n let lastError: Error | undefined;\n let currentAdapter = adapter;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const stream = currentAdapter.streamMessage(session, message, options);\n const iterator = (stream as AsyncIterable<ChatEvent>)[Symbol.asyncIterator]();\n const first = await iterator.next();\n\n // First event received — stream is live. Wrap remaining into iterable.\n return (async function* () {\n if (!first.done) yield first.value;\n while (true) {\n const next = await iterator.next();\n if (next.done) break;\n yield next.value;\n }\n })();\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n if (attempt < maxAttempts) {\n // Dispose failed adapter before creating fresh one\n try { await currentAdapter.dispose(); } catch { /* best-effort */ }\n const key = this.getPoolKey(backend, credentials);\n this._adapterPool.delete(key);\n await delay(delayMs);\n currentAdapter = await this.getOrCreateAdapter(backend, credentials);\n }\n }\n }\n\n throw lastError!;\n }\n}\n\n// ─── Helpers ───────────────────────────────────────────────────\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ─── Factory ───────────────────────────────────────────────────\n\n/**\n * Create a fully-wired chat runtime from configuration.\n *\n * @param options - Runtime configuration (backends, session store, context, middleware)\n * @returns IChatRuntime instance ready to use\n *\n * @example\n * ```typescript\n * import { createChatRuntime } from \"@witqq/agent-sdk/chat/runtime\";\n * import { InMemorySessionStore } from \"@witqq/agent-sdk/chat/sessions\";\n *\n * const runtime = createChatRuntime({\n * backends: {\n * copilot: () => new CopilotAdapter({ agentConfig: { model: \"gpt-4\" } }),\n * },\n * defaultBackend: \"copilot\",\n * sessionStore: new InMemorySessionStore(),\n * });\n * ```\n */\nexport function createChatRuntime<TMetadata extends Record<string, unknown> = Record<string, unknown>>(\n options: ChatRuntimeOptions,\n): IChatRuntime<TMetadata> {\n return new ChatRuntime<TMetadata>(options);\n}\n","/**\n * createChatServer — one-call setup combining runtime, chat handler, auth handler, CORS,\n * and static file serving into a single HTTP request handler.\n *\n * Routes:\n * - CORS preflight (OPTIONS) on all paths\n * - {chatPrefix}/* → createChatHandler routes\n * - {authPrefix}/* → createAuthHandler routes (if tokenStore provided)\n * - {staticPrefix}/* → static file serving (if staticDir provided)\n * - Everything else → 404\n */\n\nimport { createChatHandler } from \"./handler.js\";\nimport type { ReadableRequest, WritableResponse, ChatHandlerOptions, ChatServerHooks } from \"./handler.js\";\nimport { createAuthHandler } from \"./auth-handler.js\";\nimport type { AuthHandlerOptions } from \"./auth-handler.js\";\nimport type { ProviderHandlerOptions } from \"./provider-handler.js\";\nimport type { IProviderStore } from \"./provider-store.js\";\nimport { corsMiddleware } from \"./cors.js\";\nimport type { CorsOptions } from \"./cors.js\";\nimport type { IChatRuntime, ChatRuntimeOptions } from \"../runtime.js\";\nimport { createChatRuntime } from \"../runtime.js\";\nimport { json } from \"./utils.js\";\nimport type { ServiceManager } from \"./service-manager.js\";\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\n// ─── Options ───────────────────────────────────────────────────\n\n/**\n * Configuration for auto-creating a ChatRuntime from options.\n * Alternative to providing a pre-built IChatRuntime instance.\n * Uses the same shape as ChatRuntimeOptions from the runtime module.\n */\nexport type ChatRuntimeConfig = ChatRuntimeOptions;\n\n/** Configuration for createChatServer */\nexport interface ChatServerOptions {\n /** Pre-built runtime instance. Either `runtime` or `runtimeConfig` must be provided. */\n runtime?: IChatRuntime;\n\n /** Config to auto-create a runtime. Used when `runtime` is not provided. */\n runtimeConfig?: ChatRuntimeConfig;\n\n /** Server-side hooks for customizing handler behavior. */\n hooks?: ChatServerHooks;\n\n /** Prefix for chat API routes. Default: \"/api/chat\" */\n chatPrefix?: string;\n\n /** Auth handler options. If provided, auth routes are mounted. */\n auth?: AuthHandlerOptions;\n\n /** Prefix for auth routes. Default: \"/api/auth\" */\n authPrefix?: string;\n\n /** CORS options. Pass false to disable CORS. Default: enabled with permissive settings */\n cors?: CorsOptions | false;\n\n /** Directory to serve static files from. Omit to disable static serving. */\n staticDir?: string;\n\n /** Prefix for static file routes. Default: \"/\" */\n staticPrefix?: string;\n\n /** Provider handler options. If provided, provider routes are mounted. */\n providers?: ProviderHandlerOptions;\n\n /** Prefix for provider routes. Default: \"/api/providers\" */\n providerPrefix?: string;\n\n /** Chat handler options (maxBodySize, etc.) */\n chatHandlerOptions?: Omit<ChatHandlerOptions, \"prefix\">;\n\n /**\n * Path for the health check endpoint. Default: \"/api/health\".\n * Set to `false` to disable. Returns `{ ok: true }`.\n */\n healthPath?: string | false;\n\n /**\n * Auto-create a default provider when a backend authenticates for the first time.\n *\n * - `true` — uses built-in default models per backend\n * - `Record<string, string>` — custom backend→model mapping (e.g. `{ copilot: \"gpt-5-mini\" }`)\n * - `false` / omitted — disabled\n *\n * Requires both `auth` and `providers` to be configured.\n */\n autoCreateProviders?: boolean | Record<string, string>;\n\n /**\n * Service lifecycle manager. When provided with `auth`, automatically wires:\n * - `onAuth` → `serviceManager.handleAuth(backend, token)` (creates/caches service)\n * - `onLogout` → `serviceManager.handleLogout()` (disposes all services)\n *\n * User's own `onAuth`/`onLogout` callbacks in `auth` are still called first.\n */\n serviceManager?: ServiceManager;\n}\n\n// ─── MIME Types ────────────────────────────────────────────────\n\n/** Default model per backend for auto-created providers */\nexport const DEFAULT_PROVIDER_MODELS: Record<string, string> = {\n copilot: \"gpt-5-mini\",\n claude: \"claude-sonnet-4-5-20250514\",\n \"vercel-ai\": \"gpt-4.1-mini\",\n};\n\nconst MIME_TYPES: Record<string, string> = {\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".txt\": \"text/plain\",\n \".map\": \"application/json\",\n};\n\n// ─── Handler Factory ───────────────────────────────────────────\n\n/** Request handler type returned by createChatServer */\nexport type RequestHandler = (req: ReadableRequest, res: WritableResponse) => Promise<void>;\n\n/**\n * Create a combined HTTP request handler that routes to chat, auth, static, or 404.\n *\n * @param options - Server configuration\n * @returns Async request handler\n *\n * @example\n * ```ts\n * import http from \"node:http\";\n * import { createChatServer } from \"@witqq/agent-sdk/chat/server\";\n *\n * const handler = createChatServer({\n * runtime,\n * auth: { tokenStore },\n * staticDir: \"./public\",\n * });\n *\n * http.createServer(handler).listen(3000);\n * ```\n */\nexport function createChatServer(options: ChatServerOptions): RequestHandler {\n // Resolve runtime: use provided instance or create from config\n const runtime: IChatRuntime = options.runtime\n ?? (options.runtimeConfig ? createChatRuntime(options.runtimeConfig) : (() => {\n throw new Error(\"Either `runtime` or `runtimeConfig` must be provided to createChatServer\");\n })());\n\n const chatPrefix = options.chatPrefix ?? \"/api/chat\";\n const authPrefix = options.authPrefix ?? \"/api/auth\";\n const staticPrefix = options.staticPrefix ?? \"/\";\n const staticDir = options.staticDir ? path.resolve(options.staticDir) : undefined;\n const healthPath = options.healthPath !== false ? (options.healthPath ?? \"/api/health\") : undefined;\n\n // Auto-create providers on auth + wire ServiceManager\n const authOptions = wrapAuthWithServiceManager(\n wrapAuthWithAutoProviders(options),\n options.serviceManager,\n );\n\n // Create sub-handlers\n const chatHandler = createChatHandler(runtime, {\n prefix: chatPrefix,\n providerStore: options.providers?.providerStore,\n hooks: options.hooks,\n ...options.chatHandlerOptions,\n });\n\n const authHandler = authOptions ? createAuthHandler(authOptions) : undefined;\n // Provider routes are served via chatHandler (at chatPrefix/providers/*).\n // The standalone providerHandler is available for direct use but not mounted here\n // to avoid duplicate CRUD routes.\n\n const cors = options.cors !== false\n ? corsMiddleware(options.cors)\n : undefined;\n\n return async (req: ReadableRequest, res: WritableResponse): Promise<void> => {\n const url = req.url || \"/\";\n const urlPath = url.split(\"?\")[0];\n\n // CORS preflight\n if (cors) {\n const corsReq = { method: req.method, headers: (req as unknown as Record<string, unknown>).headers as Record<string, string | string[] | undefined> };\n const corsRes = {\n setHeader: (name: string, value: string) => res.setHeader(name, value),\n writeHead: (statusCode: number) => res.writeHead(statusCode, {}),\n end: () => res.end(),\n };\n if (cors(corsReq, corsRes)) {\n return;\n }\n }\n\n // Health check\n if (healthPath && urlPath === healthPath) {\n json(res, { ok: true }, 200);\n return;\n }\n\n // Chat routes\n if (urlPath.startsWith(chatPrefix + \"/\") || urlPath === chatPrefix) {\n await chatHandler(req, res);\n return;\n }\n\n // Auth routes\n if (authHandler && (urlPath.startsWith(authPrefix + \"/\") || urlPath === authPrefix)) {\n const authReq = Object.create(req, {\n url: { value: url.replace(authPrefix, \"\"), enumerable: true },\n });\n await authHandler(authReq, res);\n return;\n }\n\n // Static file serving\n if (staticDir && req.method === \"GET\" && urlPath.startsWith(staticPrefix)) {\n const relativePath = urlPath === staticPrefix || urlPath === staticPrefix + \"/\"\n ? \"/index.html\"\n : urlPath.slice(staticPrefix.length) || \"/index.html\";\n\n // Prevent directory traversal (include path.sep to block sibling-prefix attacks)\n const filePath = path.join(staticDir, relativePath);\n if (!filePath.startsWith(staticDir + path.sep) && filePath !== staticDir) {\n res.writeHead(403, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Forbidden\" }));\n return;\n }\n\n try {\n const stat = fs.statSync(filePath);\n if (stat.isFile()) {\n const ext = path.extname(filePath).toLowerCase();\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n const content = fs.readFileSync(filePath);\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Content-Length\": String(content.length),\n });\n res.write(content.toString());\n res.end();\n return;\n }\n } catch {\n // File not found — fall through to 404\n }\n }\n\n // 404\n json(res, { error: \"Not found\" }, 404);\n };\n}\n\n/**\n * Wrap auth options to auto-create a default provider on first authentication.\n * Returns the (possibly-modified) auth options or undefined if auth is not configured.\n */\nfunction wrapAuthWithAutoProviders(options: ChatServerOptions): AuthHandlerOptions | undefined {\n if (!options.auth) return undefined;\n if (!options.autoCreateProviders || !options.providers) return options.auth;\n\n const providerStore: IProviderStore = options.providers.providerStore;\n const modelMap = typeof options.autoCreateProviders === \"object\"\n ? options.autoCreateProviders\n : DEFAULT_PROVIDER_MODELS;\n\n const userOnAuth = options.auth.onAuth;\n\n const wrappedOnAuth: AuthHandlerOptions[\"onAuth\"] = async (backend, token) => {\n // Call user's onAuth first\n if (userOnAuth) await userOnAuth(backend, token);\n\n // Auto-create default provider if none exists for this backend\n try {\n const existing = await providerStore.list();\n const hasBackend = existing.some(p => p.backend === backend);\n if (!hasBackend) {\n const model = modelMap[backend] ?? \"default\";\n const label = `${backend.charAt(0).toUpperCase() + backend.slice(1)} ${model}`;\n await providerStore.create({\n id: crypto.randomUUID(),\n backend,\n model,\n label,\n createdAt: Date.now(),\n });\n }\n } catch {\n // Silently ignore — provider auto-creation is best-effort\n }\n };\n\n return { ...options.auth, onAuth: wrappedOnAuth };\n}\n\n/**\n * Wrap auth options to auto-wire ServiceManager lifecycle callbacks.\n * ServiceManager.handleAuth() is called after user's onAuth.\n * ServiceManager.handleLogout() is called after user's onLogout.\n */\nfunction wrapAuthWithServiceManager(\n authOptions: AuthHandlerOptions | undefined,\n serviceManager: ServiceManager | undefined,\n): AuthHandlerOptions | undefined {\n if (!authOptions || !serviceManager) return authOptions;\n\n const userOnAuth = authOptions.onAuth;\n const userOnLogout = authOptions.onLogout;\n\n return {\n ...authOptions,\n onAuth: async (backend, token) => {\n if (userOnAuth) await userOnAuth(backend, token);\n await serviceManager.handleAuth(backend, token);\n },\n onLogout: async () => {\n if (userOnLogout) await userOnLogout();\n await serviceManager.handleLogout();\n },\n };\n}\n","/**\n * Token storage abstraction and default filesystem implementation.\n */\n\nimport type { AuthToken } from \"../../auth/types.js\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n// ─── Interface ─────────────────────────────────────────────────\n\n/** Token storage interface for server-side token management */\nexport interface ITokenStore {\n /** Save a token for a provider. Overwrites if exists. */\n save(provider: string, token: AuthToken): Promise<void>;\n /** Load a previously saved token. Returns null if not found. */\n load(provider: string): Promise<AuthToken | null>;\n /** Remove a specific provider's token. */\n clear(provider: string): Promise<void>;\n /** Remove all stored tokens. */\n clearAll(): Promise<void>;\n /** List provider names that have saved tokens. */\n list(): Promise<string[]>;\n /** Release any resources held by this store (optional). */\n dispose?(): Promise<void>;\n}\n\n// ─── In-Memory Implementation ──────────────────────────────────\n\n/** In-memory token store for testing and ephemeral use */\nexport class InMemoryTokenStore implements ITokenStore {\n private readonly tokens = new Map<string, AuthToken>();\n\n async save(provider: string, token: AuthToken): Promise<void> {\n this.tokens.set(provider, { ...token });\n }\n\n async load(provider: string): Promise<AuthToken | null> {\n const t = this.tokens.get(provider);\n return t ? { ...t } : null;\n }\n\n async clear(provider: string): Promise<void> {\n this.tokens.delete(provider);\n }\n\n async clearAll(): Promise<void> {\n this.tokens.clear();\n }\n\n async list(): Promise<string[]> {\n return [...this.tokens.keys()];\n }\n}\n\n// ─── File System Implementation ────────────────────────────────\n\n/** Options for FileTokenStore */\nexport interface FileTokenStoreOptions {\n /** Directory to store token JSON files. Default: \".tokens\" in cwd */\n directory: string;\n}\n\n/** Filesystem-based token store using JSON files (one per provider) */\nexport class FileTokenStore implements ITokenStore {\n private readonly dir: string;\n\n constructor(options: FileTokenStoreOptions) {\n this.dir = options.directory;\n }\n\n async save(provider: string, token: AuthToken): Promise<void> {\n mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath(provider), JSON.stringify(token));\n }\n\n async load(provider: string): Promise<AuthToken | null> {\n try {\n const data = readFileSync(this.filePath(provider), \"utf-8\");\n return JSON.parse(data) as AuthToken;\n } catch {\n return null;\n }\n }\n\n async clear(provider: string): Promise<void> {\n try {\n unlinkSync(this.filePath(provider));\n } catch {\n // File may not exist\n }\n }\n\n async clearAll(): Promise<void> {\n if (!existsSync(this.dir)) return;\n for (const f of readdirSync(this.dir)) {\n if (f.endsWith(\"-token.json\")) {\n try {\n unlinkSync(join(this.dir, f));\n } catch {\n // Ignore individual file errors\n }\n }\n }\n }\n\n async list(): Promise<string[]> {\n if (!existsSync(this.dir)) return [];\n return readdirSync(this.dir)\n .filter(f => f.endsWith(\"-token.json\"))\n .map(f => f.replace(/-token\\.json$/, \"\"));\n }\n\n private filePath(provider: string): string {\n return join(this.dir, `${provider}-token.json`);\n }\n}\n","/**\n * createProviderHandler — CRUD handler for provider configurations.\n *\n * Routes (prefix already stripped by chat-server):\n * - GET /providers → List all providers\n * - GET /providers/{id} → Get single provider\n * - POST /providers → Create provider\n * - PUT /providers/{id} → Update provider\n * - DELETE /providers/{id} → Delete provider\n */\n\nimport type { ReadableRequest, WritableResponse } from \"./handler.js\";\nimport type { IProviderStore, ProviderConfig } from \"./provider-store.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { readBody, json } from \"./utils.js\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\n/** Configuration for createProviderHandler */\nexport interface ProviderHandlerOptions {\n /** Provider storage implementation */\n providerStore: IProviderStore;\n}\n\n// ─── Handler Factory ───────────────────────────────────────────\n\n/**\n * Create an HTTP request handler for provider CRUD operations.\n *\n * @param options - Provider handler configuration\n * @returns Async request handler `(req, res) => Promise<void>`\n */\nexport function createProviderHandler(\n options: ProviderHandlerOptions,\n): (req: ReadableRequest, res: WritableResponse) => Promise<void> {\n const { providerStore } = options;\n\n return async (req: ReadableRequest, res: WritableResponse): Promise<void> => {\n const url = req.url || \"\";\n const method = req.method || \"GET\";\n const path = url.split(\"?\")[0];\n\n const idMatch = path.match(/^\\/providers\\/([^/]+)$/);\n\n try {\n // GET /providers\n if (method === \"GET\" && path === \"/providers\") {\n const providers = await providerStore.list();\n json(res, providers);\n return;\n }\n\n // GET /providers/:id\n if (method === \"GET\" && idMatch) {\n const id = decodeURIComponent(idMatch[1]);\n const provider = await providerStore.get(id);\n if (!provider) {\n json(res, { error: \"Provider not found\" }, 404);\n return;\n }\n json(res, provider);\n return;\n }\n\n // POST /providers\n if (method === \"POST\" && path === \"/providers\") {\n const body = await readBody(req);\n const backend = body.backend as string;\n const model = body.model as string;\n const label = body.label as string;\n\n if (!backend || typeof backend !== \"string\") {\n json(res, { error: \"backend is required\" }, 400);\n return;\n }\n if (!model || typeof model !== \"string\") {\n json(res, { error: \"model is required\" }, 400);\n return;\n }\n if (!label || typeof label !== \"string\") {\n json(res, { error: \"label is required\" }, 400);\n return;\n }\n\n const config: ProviderConfig = {\n id: randomUUID(),\n backend,\n model,\n label,\n createdAt: Date.now(),\n };\n await providerStore.create(config);\n json(res, config, 201);\n return;\n }\n\n // PUT /providers/:id\n if (method === \"PUT\" && idMatch) {\n const id = decodeURIComponent(idMatch[1]);\n const existing = await providerStore.get(id);\n if (!existing) {\n json(res, { error: \"Provider not found\" }, 404);\n return;\n }\n\n const body = await readBody(req);\n const changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">> = {};\n if (body.backend && typeof body.backend === \"string\") changes.backend = body.backend;\n if (body.model && typeof body.model === \"string\") changes.model = body.model;\n if (body.label && typeof body.label === \"string\") changes.label = body.label;\n\n await providerStore.update(id, changes);\n const updated = await providerStore.get(id);\n json(res, updated);\n return;\n }\n\n // DELETE /providers/:id\n if (method === \"DELETE\" && idMatch) {\n const id = decodeURIComponent(idMatch[1]);\n await providerStore.delete(id);\n json(res, { ok: true });\n return;\n }\n\n // No route matched\n json(res, { error: \"Not found\" }, 404);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n json(res, { error: message }, 500);\n }\n };\n}\n","/**\n * Provider storage default implementations.\n *\n * Types (ProviderConfig, IProviderStore) are defined in ../provider-types.ts\n * and re-exported here for backward compatibility.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ProviderConfig, IProviderStore } from \"../provider-types.js\";\n\n// Re-export types for backward compatibility\nexport type { ProviderConfig, IProviderStore } from \"../provider-types.js\";\n\n// ─── In-Memory Implementation ──────────────────────────────────\n\n/** In-memory provider store for testing and ephemeral use */\nexport class InMemoryProviderStore implements IProviderStore {\n private readonly providers = new Map<string, ProviderConfig>();\n\n async create(config: ProviderConfig): Promise<void> {\n const id = config.id || randomUUID();\n this.providers.set(id, { ...config, id });\n }\n\n async get(id: string): Promise<ProviderConfig | null> {\n const p = this.providers.get(id);\n return p ? { ...p } : null;\n }\n\n async update(id: string, changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">>): Promise<void> {\n const existing = this.providers.get(id);\n if (!existing) {\n throw new Error(`Provider \"${id}\" not found`);\n }\n this.providers.set(id, { ...existing, ...changes, id: existing.id, createdAt: existing.createdAt });\n }\n\n async delete(id: string): Promise<void> {\n this.providers.delete(id);\n }\n\n async list(): Promise<ProviderConfig[]> {\n return [...this.providers.values()].map(p => ({ ...p }));\n }\n}\n\n// ─── File System Implementation ────────────────────────────────\n\n/** Options for FileProviderStore */\nexport interface FileProviderStoreOptions {\n /** Directory to store provider JSON files */\n directory: string;\n}\n\n/** Filesystem-based provider store using JSON files (one per provider) */\nexport class FileProviderStore implements IProviderStore {\n private readonly dir: string;\n\n constructor(options: FileProviderStoreOptions) {\n this.dir = options.directory;\n }\n\n async create(config: ProviderConfig): Promise<void> {\n const id = config.id || randomUUID();\n const data = { ...config, id };\n mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath(id), JSON.stringify(data));\n }\n\n async get(id: string): Promise<ProviderConfig | null> {\n try {\n const data = readFileSync(this.filePath(id), \"utf-8\");\n return JSON.parse(data) as ProviderConfig;\n } catch {\n return null;\n }\n }\n\n async update(id: string, changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">>): Promise<void> {\n const existing = await this.get(id);\n if (!existing) {\n throw new Error(`Provider \"${id}\" not found`);\n }\n const updated = { ...existing, ...changes, id: existing.id, createdAt: existing.createdAt };\n writeFileSync(this.filePath(id), JSON.stringify(updated));\n }\n\n async delete(id: string): Promise<void> {\n try {\n unlinkSync(this.filePath(id));\n } catch {\n // File may not exist\n }\n }\n\n async list(): Promise<ProviderConfig[]> {\n if (!existsSync(this.dir)) return [];\n return readdirSync(this.dir)\n .filter(f => f.endsWith(\"-provider.json\"))\n .map(f => {\n try {\n const data = readFileSync(join(this.dir, f), \"utf-8\");\n return JSON.parse(data) as ProviderConfig;\n } catch {\n return null;\n }\n })\n .filter((p): p is ProviderConfig => p !== null);\n }\n\n private filePath(id: string): string {\n return join(this.dir, `${id}-provider.json`);\n }\n}\n","/**\n * Automatic background token refresh manager.\n *\n * Schedules token refresh at a configurable threshold before expiry\n * (default 80% of token lifetime). Emits events on refresh, failure,\n * and token expiry. Handles retry on failure and clean disposal.\n *\n * When all retries are exhausted but the token hasn't expired yet,\n * the manager waits until the token's expiry time and then starts\n * a fresh retry cycle. This continues until refresh succeeds or\n * the token expires.\n *\n * @example Basic usage\n * ```ts\n * import { TokenRefreshManager } from \"@witqq/agent-sdk/auth\";\n *\n * const manager = new TokenRefreshManager({\n * token: claudeToken,\n * refresh: (rt) => claudeAuth.refreshToken(rt),\n * });\n * manager.on(\"refreshed\", (newToken) => { tokenStore.save(\"claude\", newToken); });\n * manager.on(\"error\", (err) => { console.error(\"Refresh failed:\", err); });\n * manager.start();\n * // ...later\n * manager.dispose();\n * ```\n *\n * @example Integration with createAuthHandler\n * ```ts\n * import { TokenRefreshManager } from \"@witqq/agent-sdk/auth\";\n * import { createAuthHandler } from \"@witqq/agent-sdk/chat/server\";\n * import type { ClaudeAuthToken } from \"@witqq/agent-sdk/auth\";\n *\n * let refreshManager: TokenRefreshManager | undefined;\n *\n * const authHandler = createAuthHandler({\n * tokenStore,\n * onAuth: (provider, token) => {\n * // Clean up previous manager\n * refreshManager?.dispose();\n * refreshManager = undefined;\n *\n * if (provider === \"claude\" && token.expiresIn) {\n * refreshManager = new TokenRefreshManager({\n * token,\n * refresh: (t) =>\n * claudeAuth.refreshToken((t as ClaudeAuthToken).refreshToken),\n * });\n * refreshManager.on(\"refreshed\", (newToken) => {\n * tokenStore.save(\"claude\", newToken);\n * });\n * refreshManager.on(\"expired\", () => {\n * console.warn(\"Claude token expired — re-authentication required\");\n * });\n * refreshManager.start();\n * }\n * },\n * });\n * ```\n */\n\nimport type { AuthToken } from \"./types.js\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\n/** Events emitted by TokenRefreshManager */\nexport interface TokenRefreshEvents {\n /** Emitted when token was successfully refreshed */\n refreshed: (token: AuthToken) => void;\n /** Emitted when refresh attempt failed (may retry) */\n error: (error: Error, attempt: number) => void;\n /** Emitted when token expired and could not be refreshed */\n expired: () => void;\n /** Emitted when manager is disposed */\n disposed: () => void;\n}\n\n/** Configuration for TokenRefreshManager */\nexport interface TokenRefreshOptions {\n /** Current token with expiresIn and obtainedAt */\n token: AuthToken;\n /**\n * Function that performs the actual token refresh.\n * Receives the current token and returns a new one.\n */\n refresh: (token: AuthToken) => Promise<AuthToken>;\n /**\n * Fraction of token lifetime at which to trigger refresh (0-1).\n * Default: 0.8 (refresh at 80% of lifetime, i.e. with 20% remaining)\n */\n refreshThreshold?: number;\n /**\n * Maximum retry attempts on refresh failure. Default: 3\n */\n maxRetries?: number;\n /**\n * Base delay between retries in ms. Exponential backoff applied. Default: 1000\n */\n retryDelayMs?: number;\n /**\n * Minimum schedule delay in ms (prevents scheduling in the past). Default: 1000\n */\n minDelayMs?: number;\n}\n\ntype EventName = keyof TokenRefreshEvents;\ntype ListenerMap = { [K in EventName]: Set<TokenRefreshEvents[K]> };\n\n// ─── Manager ───────────────────────────────────────────────────\n\n/**\n * Background token refresh manager with event emission and retry logic.\n *\n * Lifecycle: `new` → `start()` → (auto-refreshes) → `stop()` or `dispose()`\n */\nexport class TokenRefreshManager {\n private currentToken: AuthToken;\n private readonly refreshFn: (token: AuthToken) => Promise<AuthToken>;\n private readonly threshold: number;\n private readonly maxRetries: number;\n private readonly retryDelayMs: number;\n private readonly minDelayMs: number;\n\n private timerId: ReturnType<typeof setTimeout> | null = null;\n private running = false;\n private disposed = false;\n\n private readonly listeners: ListenerMap = {\n refreshed: new Set(),\n error: new Set(),\n expired: new Set(),\n disposed: new Set(),\n };\n\n constructor(options: TokenRefreshOptions) {\n this.currentToken = { ...options.token };\n this.refreshFn = options.refresh;\n this.threshold = options.refreshThreshold ?? 0.8;\n this.maxRetries = options.maxRetries ?? 3;\n this.retryDelayMs = options.retryDelayMs ?? 1000;\n this.minDelayMs = options.minDelayMs ?? 1000;\n }\n\n /** Register an event listener */\n on<K extends EventName>(event: K, listener: TokenRefreshEvents[K]): this {\n // TypeScript can't narrow Set type from generic key — safe because ListenerMap enforces per-event types\n this.listeners[event].add(listener as never);\n return this;\n }\n\n /** Remove an event listener */\n off<K extends EventName>(event: K, listener: TokenRefreshEvents[K]): this {\n // TypeScript can't narrow Set type from generic key — safe because ListenerMap enforces per-event types\n this.listeners[event].delete(listener as never);\n return this;\n }\n\n /** Current token managed by this instance */\n get token(): AuthToken {\n return { ...this.currentToken };\n }\n\n /** Whether the manager is currently running */\n get isRunning(): boolean {\n return this.running;\n }\n\n /** Whether the manager has been disposed */\n get isDisposed(): boolean {\n return this.disposed;\n }\n\n /**\n * Start automatic refresh scheduling.\n * If the token is already expired, emits \"expired\" immediately.\n * If the token has no expiresIn, does nothing (long-lived token).\n */\n start(): void {\n if (this.disposed) return;\n if (this.running) return;\n this.running = true;\n this.schedule();\n }\n\n /** Stop automatic refresh (can be restarted with start()) */\n stop(): void {\n this.running = false;\n this.clearTimer();\n }\n\n /**\n * Update the managed token (e.g. after manual refresh).\n * Reschedules automatic refresh if running.\n */\n updateToken(token: AuthToken): void {\n if (this.disposed) return;\n this.currentToken = { ...token };\n if (this.running) {\n this.clearTimer();\n this.schedule();\n }\n }\n\n /** Stop and clean up all resources */\n dispose(): void {\n if (this.disposed) return;\n this.stop();\n this.disposed = true;\n this.emit(\"disposed\");\n // Clear all listeners\n for (const set of Object.values(this.listeners)) {\n (set as Set<unknown>).clear();\n }\n }\n\n // ─── Private ──────────────────────────────────────────────────\n\n private schedule(): void {\n if (!this.running || this.disposed) return;\n\n const delayMs = this.computeRefreshDelay();\n\n if (delayMs === null) {\n // No expiresIn → long-lived token, nothing to schedule\n return;\n }\n\n if (delayMs <= 0) {\n // Past refresh point (or expired) — attempt refresh via timer to keep async chain clean\n this.timerId = setTimeout(() => {\n this.timerId = null;\n if (!this.running || this.disposed) return;\n void this.performRefresh();\n }, 0);\n return;\n }\n\n this.timerId = setTimeout(() => {\n this.timerId = null;\n if (!this.running || this.disposed) return;\n void this.performRefresh();\n }, Math.max(delayMs, this.minDelayMs));\n }\n\n private async performRefresh(attempt = 1): Promise<void> {\n if (!this.running || this.disposed) return;\n\n try {\n const newToken = await this.refreshFn(this.currentToken);\n if (!this.running || this.disposed) return;\n this.currentToken = { ...newToken };\n this.emit(\"refreshed\", newToken);\n this.schedule();\n } catch (err) {\n if (!this.running || this.disposed) return;\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit(\"error\", error, attempt);\n\n if (attempt < this.maxRetries) {\n const delay = this.retryDelayMs * Math.pow(2, attempt - 1);\n this.timerId = setTimeout(() => {\n this.timerId = null;\n if (!this.running || this.disposed) return;\n void this.performRefresh(attempt + 1);\n }, delay);\n } else {\n // All retries exhausted\n if (this.isTokenExpired()) {\n this.running = false;\n this.emit(\"expired\");\n } else {\n // Token not yet expired — wait until expiry time and start fresh retry cycle\n const expiresIn = this.currentToken.expiresIn;\n if (expiresIn == null) return; // invariant: unreachable from schedule() which checks expiresIn\n const expiresAt = this.currentToken.obtainedAt + expiresIn * 1000;\n const waitMs = Math.max(expiresAt - Date.now(), this.minDelayMs);\n this.timerId = setTimeout(() => {\n this.timerId = null;\n if (!this.running || this.disposed) return;\n void this.performRefresh();\n }, waitMs);\n }\n }\n }\n }\n\n private computeRefreshDelay(): number | null {\n if (this.currentToken.expiresIn == null) return null;\n\n const lifetimeMs = this.currentToken.expiresIn * 1000;\n const refreshAtMs = this.currentToken.obtainedAt + lifetimeMs * this.threshold;\n const now = Date.now();\n const delay = refreshAtMs - now;\n\n // Return raw delay — caller decides whether to clamp or treat as immediate\n return delay;\n }\n\n private isTokenExpired(): boolean {\n if (this.currentToken.expiresIn == null) return false;\n const expiresAt = this.currentToken.obtainedAt + this.currentToken.expiresIn * 1000;\n return Date.now() >= expiresAt;\n }\n\n private clearTimer(): void {\n if (this.timerId !== null) {\n clearTimeout(this.timerId);\n this.timerId = null;\n }\n }\n\n private emit<K extends EventName>(event: K, ...args: Parameters<TokenRefreshEvents[K]>): void {\n for (const listener of this.listeners[event]) {\n try {\n (listener as (...a: unknown[]) => void)(...args);\n } catch {\n // Listener errors should not crash the manager\n }\n }\n }\n}\n","/**\n * ServiceManager — manages IAgentService lifecycle (create, cache, dispose).\n *\n * Reduces boilerplate in apps that need to create/dispose services on auth events.\n * Pass to createChatServer to auto-wire onAuth/onLogout callbacks.\n *\n * @example\n * ```ts\n * const sm = new ServiceManager({\n * createService: (backend, token) =>\n * createAgentService(backend, { apiKey: token.accessToken }),\n * });\n *\n * // Manual usage:\n * await sm.handleAuth(\"copilot\", token);\n * const service = sm.getService(\"copilot\");\n *\n * // Or auto-wired via createChatServer:\n * createChatServer({ serviceManager: sm, auth: { tokenStore }, ... });\n * ```\n */\n\nimport type { AuthToken } from \"../../auth/types.js\";\nimport { TokenRefreshManager } from \"../../auth/refresh-manager.js\";\nimport type { TokenRefreshOptions } from \"../../auth/refresh-manager.js\";\n\n/** Minimal IAgentService interface (avoids importing from main package) */\nexport interface ManagedService {\n dispose(): Promise<void> | void;\n}\n\n/** Callback for building a token refresh function per backend */\nexport type RefreshFactory = (backend: string) => ((token: AuthToken) => Promise<AuthToken>) | undefined;\n\n/** Configuration for ServiceManager */\nexport interface ServiceManagerOptions {\n /**\n * Factory to create a service for a backend.\n * Called on every auth event (old service is disposed first).\n */\n createService: (backend: string, token: AuthToken) => ManagedService | Promise<ManagedService>;\n /**\n * Optional factory returning a refresh function per backend.\n * If provided and the token has expiresIn, a TokenRefreshManager is started.\n * On refresh → the stored token is updated and the service is recreated.\n * On expiry → handleLogout() for that backend is called.\n */\n refreshFactory?: RefreshFactory;\n /** Override TokenRefreshManager options (threshold, retries, etc.) */\n refreshOptions?: Partial<Pick<TokenRefreshOptions, \"refreshThreshold\" | \"maxRetries\" | \"retryDelayMs\">>;\n /** Called when a token expires (before logout). */\n onTokenExpired?: (backend: string) => void;\n}\n\n/**\n * Manages IAgentService lifecycle: create, cache, and dispose on re-auth or logout.\n * Optionally starts background token refresh when `refreshFactory` is configured.\n */\nexport class ServiceManager {\n private readonly _services = new Map<string, ManagedService>();\n private readonly _refreshManagers = new Map<string, TokenRefreshManager>();\n private readonly _options: ServiceManagerOptions;\n\n constructor(options: ServiceManagerOptions) {\n this._options = options;\n }\n\n /**\n * Handle auth event: dispose old service (if any) and create new one.\n * If the token is refreshable and refreshFactory is configured, starts a\n * TokenRefreshManager that auto-refreshes and recreates the service.\n */\n async handleAuth(backend: string, token: AuthToken): Promise<ManagedService> {\n // Stop any existing refresh manager for this backend\n this._stopRefreshManager(backend);\n\n // Dispose existing service for this backend\n const old = this._services.get(backend);\n if (old) {\n try { await old.dispose(); } catch { /* best-effort */ }\n }\n\n // Create and cache new service\n const service = await this._options.createService(backend, token);\n this._services.set(backend, service);\n\n // Start token refresh if applicable\n this._startRefreshManager(backend, token);\n\n return service;\n }\n\n /**\n * Handle logout: dispose all services, stop all refresh managers, clear cache.\n */\n async handleLogout(): Promise<void> {\n // Stop all refresh managers first (collect keys to avoid mutation during iteration)\n for (const backend of [...this._refreshManagers.keys()]) {\n this._stopRefreshManager(backend);\n }\n\n for (const [, service] of this._services) {\n try { await service.dispose(); } catch { /* best-effort */ }\n }\n this._services.clear();\n }\n\n /**\n * Dispose the ServiceManager — stops all refresh managers and disposes all services.\n */\n async dispose(): Promise<void> {\n await this.handleLogout();\n }\n\n /** Get cached service for a backend (undefined if not authenticated). */\n getService(backend: string): ManagedService | undefined {\n return this._services.get(backend);\n }\n\n /** Check if a service exists for the given backend. */\n hasService(backend: string): boolean {\n return this._services.has(backend);\n }\n\n /** Get all backend names with active services. */\n get activeBackends(): string[] {\n return [...this._services.keys()];\n }\n\n /** Get active refresh manager for a backend (for testing/introspection). */\n getRefreshManager(backend: string): TokenRefreshManager | undefined {\n return this._refreshManagers.get(backend);\n }\n\n // ── Private ─────────────────────────────────────────────────\n\n private _startRefreshManager(backend: string, token: AuthToken): void {\n if (!this._options.refreshFactory) return;\n if (token.expiresIn == null) return; // long-lived token, no refresh needed\n\n const refreshFn = this._options.refreshFactory(backend);\n if (!refreshFn) return;\n\n const manager = new TokenRefreshManager({\n token,\n refresh: refreshFn,\n refreshThreshold: this._options.refreshOptions?.refreshThreshold,\n maxRetries: this._options.refreshOptions?.maxRetries,\n retryDelayMs: this._options.refreshOptions?.retryDelayMs,\n });\n\n manager.on(\"refreshed\", (newToken: AuthToken) => {\n // Recreate service with fresh token (fire-and-forget)\n void this._recreateService(backend, newToken);\n });\n\n manager.on(\"expired\", () => {\n this._options.onTokenExpired?.(backend);\n // Dispose the expired backend's service\n void this._logoutBackend(backend);\n });\n\n this._refreshManagers.set(backend, manager);\n manager.start();\n }\n\n private _stopRefreshManager(backend: string): void {\n const manager = this._refreshManagers.get(backend);\n if (manager) {\n manager.dispose();\n this._refreshManagers.delete(backend);\n }\n }\n\n private async _recreateService(backend: string, token: AuthToken): Promise<void> {\n const old = this._services.get(backend);\n if (old) {\n try { await old.dispose(); } catch { /* best-effort */ }\n }\n\n try {\n const service = await this._options.createService(backend, token);\n this._services.set(backend, service);\n } catch {\n // Service creation failed after refresh — leave backend without service\n this._services.delete(backend);\n }\n }\n\n private async _logoutBackend(backend: string): Promise<void> {\n this._stopRefreshManager(backend);\n const service = this._services.get(backend);\n if (service) {\n try { await service.dispose(); } catch { /* best-effort */ }\n this._services.delete(backend);\n }\n }\n}\n","/**\n * AdapterPool — lazy adapter creation with concurrent dedup and eviction.\n *\n * Replaces the pattern where ServiceManager + backend factories create adapters\n * eagerly on auth. AdapterPool creates adapters on first use, keyed by backend name.\n *\n * Key properties:\n * - Lazy: adapters created on first getAdapter() call\n * - Concurrent dedup: multiple concurrent getAdapter() calls for same backend share one creation\n * - Never cache failures: if factory throws, next call retries\n * - Eviction: evict(backend) disposes cached adapter (e.g. on token rotation)\n *\n * @example\n * ```ts\n * const pool = new AdapterPool({\n * factory: async (backend) => {\n * const token = await tokenStore.load(backend);\n * const service = createAgentService(backend, { apiKey: token.accessToken });\n * return new VercelAIChatAdapter({ agentConfig: { ... }, agentService: service });\n * },\n * });\n *\n * const adapter = await pool.getAdapter(\"vercel-ai\");\n * // On token rotation:\n * await pool.evict(\"vercel-ai\");\n * ```\n */\n\n/** Minimal adapter interface (avoids importing full IChatBackend) */\nexport interface PooledAdapter {\n dispose(): Promise<void> | void;\n}\n\n/** Factory function to create an adapter for a given backend */\nexport type AdapterFactory<T extends PooledAdapter = PooledAdapter> =\n (backend: string) => Promise<T>;\n\n/** Configuration for AdapterPool */\nexport interface AdapterPoolOptions<T extends PooledAdapter = PooledAdapter> {\n /** Factory to create an adapter for a backend. Called lazily on first getAdapter(). */\n factory: AdapterFactory<T>;\n}\n\n/**\n * Lazy adapter pool with concurrent dedup and eviction.\n * Thread-safe: concurrent getAdapter() calls for the same backend share a single creation promise.\n */\nexport class AdapterPool<T extends PooledAdapter = PooledAdapter> {\n private readonly _cached = new Map<string, T>();\n private readonly _pending = new Map<string, Promise<T>>();\n private readonly _factory: AdapterFactory<T>;\n private _disposed = false;\n\n constructor(options: AdapterPoolOptions<T>) {\n this._factory = options.factory;\n }\n\n /**\n * Get or create an adapter for the given backend.\n * Concurrent calls for the same backend share one creation promise.\n * Failed creations are NOT cached — next call retries.\n */\n async getAdapter(backend: string): Promise<T> {\n if (this._disposed) {\n throw new Error(\"AdapterPool is disposed\");\n }\n\n // Return cached adapter if available\n const cached = this._cached.get(backend);\n if (cached) return cached;\n\n // Join pending creation if in flight\n const pending = this._pending.get(backend);\n if (pending) return pending;\n\n // Start new creation with dedup\n const promise = this._create(backend);\n this._pending.set(backend, promise);\n\n try {\n const adapter = await promise;\n this._cached.set(backend, adapter);\n return adapter;\n } finally {\n // Always clean up pending — whether success or failure\n this._pending.delete(backend);\n }\n }\n\n /**\n * Evict (dispose and remove) the cached adapter for a backend.\n * Use after token rotation to force re-creation on next getAdapter().\n */\n async evict(backend: string): Promise<void> {\n const cached = this._cached.get(backend);\n if (cached) {\n this._cached.delete(backend);\n try { await cached.dispose(); } catch { /* best-effort */ }\n }\n }\n\n /** Check if a backend has a cached adapter. */\n has(backend: string): boolean {\n return this._cached.has(backend);\n }\n\n /** Get all backend names with cached adapters. */\n get activeBackends(): string[] {\n return [...this._cached.keys()];\n }\n\n /** Dispose all cached adapters and mark pool as unusable. */\n async dispose(): Promise<void> {\n this._disposed = true;\n const backends = [...this._cached.keys()];\n for (const backend of backends) {\n await this.evict(backend);\n }\n }\n\n private async _create(backend: string): Promise<T> {\n return this._factory(backend);\n }\n}\n"]}