@witqq/agent-sdk 0.6.0 → 0.7.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 (122) hide show
  1. package/README.md +433 -6
  2. package/dist/auth/index.cjs +188 -1
  3. package/dist/auth/index.cjs.map +1 -1
  4. package/dist/auth/index.d.cts +154 -138
  5. package/dist/auth/index.d.ts +154 -138
  6. package/dist/auth/index.js +188 -2
  7. package/dist/auth/index.js.map +1 -1
  8. package/dist/backends/claude.cjs +341 -22
  9. package/dist/backends/claude.cjs.map +1 -1
  10. package/dist/backends/claude.d.cts +2 -1
  11. package/dist/backends/claude.d.ts +2 -1
  12. package/dist/backends/claude.js +341 -22
  13. package/dist/backends/claude.js.map +1 -1
  14. package/dist/backends/copilot.cjs +133 -25
  15. package/dist/backends/copilot.cjs.map +1 -1
  16. package/dist/backends/copilot.d.cts +2 -1
  17. package/dist/backends/copilot.d.ts +2 -1
  18. package/dist/backends/copilot.js +133 -25
  19. package/dist/backends/copilot.js.map +1 -1
  20. package/dist/backends/vercel-ai.cjs +66 -19
  21. package/dist/backends/vercel-ai.cjs.map +1 -1
  22. package/dist/backends/vercel-ai.d.cts +1 -1
  23. package/dist/backends/vercel-ai.d.ts +1 -1
  24. package/dist/backends/vercel-ai.js +66 -19
  25. package/dist/backends/vercel-ai.js.map +1 -1
  26. package/dist/chat/accumulator.cjs +147 -0
  27. package/dist/chat/accumulator.cjs.map +1 -0
  28. package/dist/chat/accumulator.d.cts +61 -0
  29. package/dist/chat/accumulator.d.ts +61 -0
  30. package/dist/chat/accumulator.js +145 -0
  31. package/dist/chat/accumulator.js.map +1 -0
  32. package/dist/chat/backends.cjs +3534 -0
  33. package/dist/chat/backends.cjs.map +1 -0
  34. package/dist/chat/backends.d.cts +62 -0
  35. package/dist/chat/backends.d.ts +62 -0
  36. package/dist/chat/backends.js +3501 -0
  37. package/dist/chat/backends.js.map +1 -0
  38. package/dist/chat/context.cjs +230 -0
  39. package/dist/chat/context.cjs.map +1 -0
  40. package/dist/chat/context.d.cts +167 -0
  41. package/dist/chat/context.d.ts +167 -0
  42. package/dist/chat/context.js +227 -0
  43. package/dist/chat/context.js.map +1 -0
  44. package/dist/chat/core.cjs +282 -0
  45. package/dist/chat/core.cjs.map +1 -0
  46. package/dist/chat/core.d.cts +435 -0
  47. package/dist/chat/core.d.ts +435 -0
  48. package/dist/chat/core.js +261 -0
  49. package/dist/chat/core.js.map +1 -0
  50. package/dist/chat/errors.cjs +251 -0
  51. package/dist/chat/errors.cjs.map +1 -0
  52. package/dist/chat/errors.d.cts +122 -0
  53. package/dist/chat/errors.d.ts +122 -0
  54. package/dist/chat/errors.js +243 -0
  55. package/dist/chat/errors.js.map +1 -0
  56. package/dist/chat/events.cjs +203 -0
  57. package/dist/chat/events.cjs.map +1 -0
  58. package/dist/chat/events.d.cts +241 -0
  59. package/dist/chat/events.d.ts +241 -0
  60. package/dist/chat/events.js +196 -0
  61. package/dist/chat/events.js.map +1 -0
  62. package/dist/chat/index.cjs +5359 -0
  63. package/dist/chat/index.cjs.map +1 -0
  64. package/dist/chat/index.d.cts +52 -0
  65. package/dist/chat/index.d.ts +52 -0
  66. package/dist/chat/index.js +5296 -0
  67. package/dist/chat/index.js.map +1 -0
  68. package/dist/chat/react.cjs +2739 -0
  69. package/dist/chat/react.cjs.map +1 -0
  70. package/dist/chat/react.d.cts +619 -0
  71. package/dist/chat/react.d.ts +619 -0
  72. package/dist/chat/react.js +2714 -0
  73. package/dist/chat/react.js.map +1 -0
  74. package/dist/chat/runtime.cjs +1030 -0
  75. package/dist/chat/runtime.cjs.map +1 -0
  76. package/dist/chat/runtime.d.cts +118 -0
  77. package/dist/chat/runtime.d.ts +118 -0
  78. package/dist/chat/runtime.js +1028 -0
  79. package/dist/chat/runtime.js.map +1 -0
  80. package/dist/chat/server.cjs +643 -0
  81. package/dist/chat/server.cjs.map +1 -0
  82. package/dist/chat/server.d.cts +287 -0
  83. package/dist/chat/server.d.ts +287 -0
  84. package/dist/chat/server.js +617 -0
  85. package/dist/chat/server.js.map +1 -0
  86. package/dist/chat/sessions.cjs +398 -0
  87. package/dist/chat/sessions.cjs.map +1 -0
  88. package/dist/chat/sessions.d.cts +239 -0
  89. package/dist/chat/sessions.d.ts +239 -0
  90. package/dist/chat/sessions.js +394 -0
  91. package/dist/chat/sessions.js.map +1 -0
  92. package/dist/chat/state.cjs +177 -0
  93. package/dist/chat/state.cjs.map +1 -0
  94. package/dist/chat/state.d.cts +92 -0
  95. package/dist/chat/state.d.ts +92 -0
  96. package/dist/chat/state.js +167 -0
  97. package/dist/chat/state.js.map +1 -0
  98. package/dist/chat/storage.cjs +240 -0
  99. package/dist/chat/storage.cjs.map +1 -0
  100. package/dist/chat/storage.d.cts +191 -0
  101. package/dist/chat/storage.d.ts +191 -0
  102. package/dist/chat/storage.js +236 -0
  103. package/dist/chat/storage.js.map +1 -0
  104. package/dist/errors-BDLbNu9w.d.cts +13 -0
  105. package/dist/errors-BDLbNu9w.d.ts +13 -0
  106. package/dist/in-process-transport-C2oPTYs6.d.ts +223 -0
  107. package/dist/in-process-transport-DG-w5G6k.d.cts +223 -0
  108. package/dist/index.cjs +25 -13
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.d.cts +32 -4
  111. package/dist/index.d.ts +32 -4
  112. package/dist/index.js +25 -13
  113. package/dist/index.js.map +1 -1
  114. package/dist/transport-D1OaUgRk.d.ts +67 -0
  115. package/dist/transport-DX1Nhm4N.d.cts +67 -0
  116. package/dist/types-Bh5AhqD-.d.ts +141 -0
  117. package/dist/types-CGF7AEX1.d.cts +141 -0
  118. package/dist/{types-BvwNzZCj.d.cts → types-CqvUAYxt.d.cts} +21 -3
  119. package/dist/{types-BvwNzZCj.d.ts → types-CqvUAYxt.d.ts} +21 -3
  120. package/dist/types-DLZzlJxt.d.ts +39 -0
  121. package/dist/types-tE0CXwBl.d.cts +39 -0
  122. package/package.json +149 -2
@@ -0,0 +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"]}
@@ -0,0 +1,287 @@
1
+ import { IChatRuntime } from './runtime.cjs';
2
+ import { W as WritableResponse$1 } from '../transport-DX1Nhm4N.cjs';
3
+ import { A as AuthToken, d as CopilotAuthToken, C as ClaudeAuthToken } from '../types-CGF7AEX1.cjs';
4
+ import './core.cjs';
5
+ import '../types-CqvUAYxt.cjs';
6
+ import 'zod';
7
+ import '../types-tE0CXwBl.cjs';
8
+ import './sessions.cjs';
9
+ import './storage.cjs';
10
+ import '../errors-BDLbNu9w.cjs';
11
+ import './context.cjs';
12
+
13
+ /**
14
+ * createChatHandler — maps RemoteChatRuntime contract endpoints to IChatRuntime calls.
15
+ *
16
+ * Implements all 10 routes from the RemoteChatRuntime server endpoint contract:
17
+ * - POST /sessions/create → runtime.createSession()
18
+ * - GET /sessions/{id} → runtime.getSession()
19
+ * - GET /sessions → runtime.listSessions()
20
+ * - DELETE /sessions/{id} → runtime.deleteSession()
21
+ * - POST /sessions/{id}/archive → runtime.archiveSession()
22
+ * - POST /send → runtime.send() via SSE
23
+ * - POST /abort → runtime.abort()
24
+ * - GET /models → runtime.listModels()
25
+ * - POST /backend/switch → runtime.switchBackend()
26
+ * - POST /model/switch → runtime.switchModel()
27
+ */
28
+
29
+ /** Minimal readable request interface (node:http IncomingMessage subset) */
30
+ interface ReadableRequest {
31
+ readonly method?: string;
32
+ readonly url?: string;
33
+ on(event: "data", listener: (chunk: Buffer | string) => void): void;
34
+ on(event: "end", listener: () => void): void;
35
+ }
36
+ /**
37
+ * Writable HTTP response interface for chat handler.
38
+ * Extends the transport's WritableResponse with setHeader() and body-accepting end().
39
+ */
40
+ interface WritableResponse extends WritableResponse$1 {
41
+ setHeader(name: string, value: string): void;
42
+ end(body?: string): void;
43
+ }
44
+ /** Configuration for createChatHandler */
45
+ interface ChatHandlerOptions {
46
+ /** Route prefix to strip from URL before matching. Default: "" (no prefix) */
47
+ prefix?: string;
48
+ /** Maximum request body size in bytes. Default: 1MB (1048576) */
49
+ maxBodySize?: number;
50
+ /** SSE heartbeat interval in milliseconds. 0 or undefined disables heartbeat. */
51
+ heartbeatMs?: number;
52
+ }
53
+ /**
54
+ * Create an HTTP request handler that maps RemoteChatRuntime contract
55
+ * endpoints to IChatRuntime method calls.
56
+ *
57
+ * @param runtime - The chat runtime instance to serve
58
+ * @param options - Handler configuration
59
+ * @returns Async request handler `(req, res) => Promise<void>`
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * const handler = createChatHandler(runtime, { prefix: "/api/chat" });
64
+ * http.createServer(async (req, res) => {
65
+ * if (req.url?.startsWith("/api/chat")) {
66
+ * await handler(req, res);
67
+ * return;
68
+ * }
69
+ * res.writeHead(404).end();
70
+ * });
71
+ * ```
72
+ */
73
+ declare function createChatHandler(runtime: IChatRuntime, options?: ChatHandlerOptions): (req: ReadableRequest, res: WritableResponse) => Promise<void>;
74
+
75
+ /**
76
+ * Token storage abstraction and default filesystem implementation.
77
+ */
78
+
79
+ /** Token storage interface for server-side token management */
80
+ interface ITokenStore {
81
+ /** Save a token for a provider. Overwrites if exists. */
82
+ save(provider: string, token: AuthToken): Promise<void>;
83
+ /** Load a previously saved token. Returns null if not found. */
84
+ load(provider: string): Promise<AuthToken | null>;
85
+ /** Remove a specific provider's token. */
86
+ clear(provider: string): Promise<void>;
87
+ /** Remove all stored tokens. */
88
+ clearAll(): Promise<void>;
89
+ /** List provider names that have saved tokens. */
90
+ list(): Promise<string[]>;
91
+ }
92
+ /** In-memory token store for testing and ephemeral use */
93
+ declare class InMemoryTokenStore implements ITokenStore {
94
+ private readonly tokens;
95
+ save(provider: string, token: AuthToken): Promise<void>;
96
+ load(provider: string): Promise<AuthToken | null>;
97
+ clear(provider: string): Promise<void>;
98
+ clearAll(): Promise<void>;
99
+ list(): Promise<string[]>;
100
+ }
101
+ /** Options for FileTokenStore */
102
+ interface FileTokenStoreOptions {
103
+ /** Directory to store token JSON files. Default: ".tokens" in cwd */
104
+ directory: string;
105
+ }
106
+ /** Filesystem-based token store using JSON files (one per provider) */
107
+ declare class FileTokenStore implements ITokenStore {
108
+ private readonly dir;
109
+ constructor(options: FileTokenStoreOptions);
110
+ save(provider: string, token: AuthToken): Promise<void>;
111
+ load(provider: string): Promise<AuthToken | null>;
112
+ clear(provider: string): Promise<void>;
113
+ clearAll(): Promise<void>;
114
+ list(): Promise<string[]>;
115
+ private filePath;
116
+ }
117
+
118
+ /**
119
+ * createAuthHandler — server-mediated authentication for all three backends.
120
+ *
121
+ * Routes:
122
+ * - POST /auth/start → Start auth flow (copilot device flow, claude OAuth, vercel-ai passthrough)
123
+ * - POST /auth/copilot/poll → Poll for Copilot device flow completion
124
+ * - POST /auth/claude/complete → Exchange Claude OAuth code for token
125
+ * - POST /auth/vercel/complete → Submit Vercel AI API key
126
+ * - GET /tokens/saved → List providers with saved tokens
127
+ * - POST /tokens/use → Load and activate a saved token
128
+ * - POST /tokens/clear → Clear all saved tokens and invoke onLogout
129
+ * - POST /auth/dispose → Clear pending flows and invoke onLogout
130
+ */
131
+
132
+ /** Auth provider names recognized by the handler */
133
+ type AuthProvider = "copilot" | "claude" | "vercel-ai";
134
+ /** Copilot auth class interface (matches CopilotAuth public API) */
135
+ interface ICopilotAuth {
136
+ startDeviceFlow(options?: {
137
+ scopes?: string;
138
+ signal?: AbortSignal;
139
+ }): Promise<{
140
+ userCode: string;
141
+ verificationUrl: string;
142
+ waitForToken: (signal?: AbortSignal) => Promise<CopilotAuthToken>;
143
+ }>;
144
+ }
145
+ /** Claude auth class interface (matches ClaudeAuth public API) */
146
+ interface IClaudeAuth {
147
+ startOAuthFlow(options?: {
148
+ redirectUri?: string;
149
+ scopes?: string;
150
+ }): {
151
+ authorizeUrl: string;
152
+ completeAuth: (codeOrUrl: string) => Promise<ClaudeAuthToken>;
153
+ };
154
+ }
155
+ /** Callback invoked after successful authentication */
156
+ type OnAuthCallback = (provider: AuthProvider, token: AuthToken) => void | Promise<void>;
157
+ /** Configuration for createAuthHandler */
158
+ interface AuthHandlerOptions {
159
+ /** Token storage implementation */
160
+ tokenStore: ITokenStore;
161
+ /** Factory for creating CopilotAuth instances */
162
+ createCopilotAuth?: () => ICopilotAuth;
163
+ /** Factory for creating ClaudeAuth instances */
164
+ createClaudeAuth?: () => IClaudeAuth;
165
+ /** Called after successful authentication for any provider */
166
+ onAuth?: OnAuthCallback;
167
+ /** Called when dispose/logout is requested */
168
+ onLogout?: () => void | Promise<void>;
169
+ /** Route prefix to strip from URL before matching. Default: "" */
170
+ prefix?: string;
171
+ /** Maximum request body size in bytes. Default: 1MB */
172
+ maxBodySize?: number;
173
+ }
174
+ /**
175
+ * Create an HTTP request handler for server-mediated authentication.
176
+ *
177
+ * @param options - Auth handler configuration (token store, auth factories, callbacks)
178
+ * @returns Async request handler `(req, res) => Promise<void>`
179
+ *
180
+ * @example
181
+ * ```ts
182
+ * import { CopilotAuth, ClaudeAuth } from "@witqq/agent-sdk/auth";
183
+ *
184
+ * const authHandler = createAuthHandler({
185
+ * tokenStore: new FileTokenStore({ directory: ".tokens" }),
186
+ * createCopilotAuth: () => new CopilotAuth(),
187
+ * createClaudeAuth: () => new ClaudeAuth(),
188
+ * onAuth: (provider, token) => {
189
+ * // Rebuild runtime with new credentials
190
+ * },
191
+ * });
192
+ * ```
193
+ */
194
+ declare function createAuthHandler(options: AuthHandlerOptions): (req: ReadableRequest, res: WritableResponse) => Promise<void>;
195
+
196
+ /**
197
+ * CORS middleware — standalone composable function.
198
+ * Returns true if it fully handled the request (OPTIONS preflight),
199
+ * false if the caller should continue processing.
200
+ */
201
+ /** Configuration for CORS middleware */
202
+ interface CorsOptions {
203
+ /** Allowed origins. Default: "*" (any origin) */
204
+ origin?: string | string[];
205
+ /** Allowed HTTP methods. Default: common REST methods */
206
+ methods?: string[];
207
+ /** Allowed request headers. Default: ["Content-Type"] */
208
+ headers?: string[];
209
+ /** Max age for preflight cache in seconds. Default: 86400 (24h) */
210
+ maxAge?: number;
211
+ }
212
+ /** Minimal request interface for CORS */
213
+ interface CorsRequest {
214
+ readonly method?: string;
215
+ readonly headers?: Record<string, string | string[] | undefined>;
216
+ }
217
+ /** Minimal response interface for CORS */
218
+ interface CorsResponse {
219
+ setHeader(name: string, value: string): void;
220
+ writeHead(statusCode: number): void;
221
+ end(): void;
222
+ }
223
+ /**
224
+ * Create a CORS middleware function.
225
+ *
226
+ * @returns A function that sets CORS headers and handles OPTIONS preflight.
227
+ * Returns `true` if the request was fully handled (preflight),
228
+ * `false` if the caller should continue processing.
229
+ */
230
+ declare function corsMiddleware(options?: CorsOptions): (req: CorsRequest, res: CorsResponse) => boolean;
231
+
232
+ /**
233
+ * createChatServer — one-call setup combining runtime, chat handler, auth handler, CORS,
234
+ * and static file serving into a single HTTP request handler.
235
+ *
236
+ * Routes:
237
+ * - CORS preflight (OPTIONS) on all paths
238
+ * - {chatPrefix}/* → createChatHandler routes
239
+ * - {authPrefix}/* → createAuthHandler routes (if tokenStore provided)
240
+ * - {staticPrefix}/* → static file serving (if staticDir provided)
241
+ * - Everything else → 404
242
+ */
243
+
244
+ /** Configuration for createChatServer */
245
+ interface ChatServerOptions {
246
+ /** The chat runtime instance to serve */
247
+ runtime: IChatRuntime;
248
+ /** Prefix for chat API routes. Default: "/api/chat" */
249
+ chatPrefix?: string;
250
+ /** Auth handler options. If provided, auth routes are mounted. */
251
+ auth?: AuthHandlerOptions;
252
+ /** Prefix for auth routes. Default: "/api/auth" */
253
+ authPrefix?: string;
254
+ /** CORS options. Pass false to disable CORS. Default: enabled with permissive settings */
255
+ cors?: CorsOptions | false;
256
+ /** Directory to serve static files from. Omit to disable static serving. */
257
+ staticDir?: string;
258
+ /** Prefix for static file routes. Default: "/" */
259
+ staticPrefix?: string;
260
+ /** Chat handler options (maxBodySize, etc.) */
261
+ chatHandlerOptions?: Omit<ChatHandlerOptions, "prefix">;
262
+ }
263
+ /** Request handler type returned by createChatServer */
264
+ type RequestHandler = (req: ReadableRequest, res: WritableResponse) => Promise<void>;
265
+ /**
266
+ * Create a combined HTTP request handler that routes to chat, auth, static, or 404.
267
+ *
268
+ * @param options - Server configuration
269
+ * @returns Async request handler
270
+ *
271
+ * @example
272
+ * ```ts
273
+ * import http from "node:http";
274
+ * import { createChatServer } from "@witqq/agent-sdk/chat/server";
275
+ *
276
+ * const handler = createChatServer({
277
+ * runtime,
278
+ * auth: { tokenStore },
279
+ * staticDir: "./public",
280
+ * });
281
+ *
282
+ * http.createServer(handler).listen(3000);
283
+ * ```
284
+ */
285
+ declare function createChatServer(options: ChatServerOptions): RequestHandler;
286
+
287
+ export { type AuthHandlerOptions, type AuthProvider, type ChatHandlerOptions, type ChatServerOptions, type CorsOptions, FileTokenStore, type FileTokenStoreOptions, type IClaudeAuth, type ICopilotAuth, type ITokenStore, InMemoryTokenStore, type OnAuthCallback, type ReadableRequest, type RequestHandler, type WritableResponse, corsMiddleware, createAuthHandler, createChatHandler, createChatServer };