noumen 0.1.0 → 0.3.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 (127) hide show
  1. package/README.md +846 -51
  2. package/dist/a2a/index.d.ts +148 -0
  3. package/dist/a2a/index.js +579 -0
  4. package/dist/a2a/index.js.map +1 -0
  5. package/dist/acp/index.d.ts +129 -0
  6. package/dist/acp/index.js +498 -0
  7. package/dist/acp/index.js.map +1 -0
  8. package/dist/agent-1nFVUP9E.d.ts +1332 -0
  9. package/dist/cache-DsRqxx6v.d.ts +38 -0
  10. package/dist/chunk-3HEYCV26.js +10 -0
  11. package/dist/chunk-3HEYCV26.js.map +1 -0
  12. package/dist/chunk-3SK5GCI6.js +75 -0
  13. package/dist/chunk-3SK5GCI6.js.map +1 -0
  14. package/dist/chunk-42PHHZUA.js +132 -0
  15. package/dist/chunk-42PHHZUA.js.map +1 -0
  16. package/dist/chunk-4HW6LN6D.js +10365 -0
  17. package/dist/chunk-4HW6LN6D.js.map +1 -0
  18. package/dist/chunk-4SQA2UCV.js +26 -0
  19. package/dist/chunk-4SQA2UCV.js.map +1 -0
  20. package/dist/chunk-5GEX6ZSB.js +179 -0
  21. package/dist/chunk-5GEX6ZSB.js.map +1 -0
  22. package/dist/chunk-5JN4SPI7.js +94 -0
  23. package/dist/chunk-5JN4SPI7.js.map +1 -0
  24. package/dist/chunk-AMYIJSAZ.js +57 -0
  25. package/dist/chunk-AMYIJSAZ.js.map +1 -0
  26. package/dist/chunk-BZSFUEWM.js +43 -0
  27. package/dist/chunk-BZSFUEWM.js.map +1 -0
  28. package/dist/chunk-CS6WNDCF.js +171 -0
  29. package/dist/chunk-CS6WNDCF.js.map +1 -0
  30. package/dist/chunk-D43BWEZA.js +346 -0
  31. package/dist/chunk-D43BWEZA.js.map +1 -0
  32. package/dist/chunk-DGUM43GV.js +11 -0
  33. package/dist/chunk-DGUM43GV.js.map +1 -0
  34. package/dist/chunk-EKOGVTBT.js +472 -0
  35. package/dist/chunk-EKOGVTBT.js.map +1 -0
  36. package/dist/chunk-HEQQQGK5.js +131 -0
  37. package/dist/chunk-HEQQQGK5.js.map +1 -0
  38. package/dist/chunk-HL6JCRZJ.js +3112 -0
  39. package/dist/chunk-HL6JCRZJ.js.map +1 -0
  40. package/dist/chunk-JACGEMTF.js +43 -0
  41. package/dist/chunk-JACGEMTF.js.map +1 -0
  42. package/dist/chunk-JX7CLUCV.js +21 -0
  43. package/dist/chunk-JX7CLUCV.js.map +1 -0
  44. package/dist/chunk-KXDB56YW.js +39 -0
  45. package/dist/chunk-KXDB56YW.js.map +1 -0
  46. package/dist/chunk-L3L3FG5T.js +16 -0
  47. package/dist/chunk-L3L3FG5T.js.map +1 -0
  48. package/dist/chunk-OGXNFXFA.js +196 -0
  49. package/dist/chunk-OGXNFXFA.js.map +1 -0
  50. package/dist/chunk-UVSSQBDY.js +192 -0
  51. package/dist/chunk-UVSSQBDY.js.map +1 -0
  52. package/dist/chunk-Y45R3PQL.js +684 -0
  53. package/dist/chunk-Y45R3PQL.js.map +1 -0
  54. package/dist/cli/index.d.ts +1 -0
  55. package/dist/cli/index.js +874 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/client/index.d.ts +64 -0
  58. package/dist/client/index.js +409 -0
  59. package/dist/client/index.js.map +1 -0
  60. package/dist/client-CRRO2376.js +10 -0
  61. package/dist/client-CRRO2376.js.map +1 -0
  62. package/dist/headless-FFU2DESQ.js +142 -0
  63. package/dist/headless-FFU2DESQ.js.map +1 -0
  64. package/dist/history-snip-64GYP4ZL.js +12 -0
  65. package/dist/history-snip-64GYP4ZL.js.map +1 -0
  66. package/dist/index.d.ts +1459 -422
  67. package/dist/index.js +398 -1757
  68. package/dist/index.js.map +1 -1
  69. package/dist/jsonrpc/index.d.ts +54 -0
  70. package/dist/jsonrpc/index.js +34 -0
  71. package/dist/jsonrpc/index.js.map +1 -0
  72. package/dist/lsp/index.d.ts +36 -0
  73. package/dist/lsp/index.js +16 -0
  74. package/dist/lsp/index.js.map +1 -0
  75. package/dist/lsp-PS3BWIHC.js +8 -0
  76. package/dist/lsp-PS3BWIHC.js.map +1 -0
  77. package/dist/manager-DLXK63XC.js +8 -0
  78. package/dist/manager-DLXK63XC.js.map +1 -0
  79. package/dist/mcp/index.d.ts +111 -0
  80. package/dist/mcp/index.js +105 -0
  81. package/dist/mcp/index.js.map +1 -0
  82. package/dist/mcp-auth-AEI2R4ZC.js +9 -0
  83. package/dist/mcp-auth-AEI2R4ZC.js.map +1 -0
  84. package/dist/provider-factory-KCLIF34X.js +20 -0
  85. package/dist/provider-factory-KCLIF34X.js.map +1 -0
  86. package/dist/providers/anthropic.d.ts +19 -0
  87. package/dist/providers/anthropic.js +35 -0
  88. package/dist/providers/anthropic.js.map +1 -0
  89. package/dist/providers/bedrock.d.ts +39 -0
  90. package/dist/providers/bedrock.js +56 -0
  91. package/dist/providers/bedrock.js.map +1 -0
  92. package/dist/providers/gemini.d.ts +17 -0
  93. package/dist/providers/gemini.js +262 -0
  94. package/dist/providers/gemini.js.map +1 -0
  95. package/dist/providers/ollama.d.ts +13 -0
  96. package/dist/providers/ollama.js +20 -0
  97. package/dist/providers/ollama.js.map +1 -0
  98. package/dist/providers/openai.d.ts +21 -0
  99. package/dist/providers/openai.js +9 -0
  100. package/dist/providers/openai.js.map +1 -0
  101. package/dist/providers/openrouter.d.ts +16 -0
  102. package/dist/providers/openrouter.js +24 -0
  103. package/dist/providers/openrouter.js.map +1 -0
  104. package/dist/providers/vertex.d.ts +42 -0
  105. package/dist/providers/vertex.js +67 -0
  106. package/dist/providers/vertex.js.map +1 -0
  107. package/dist/render-GRN4ZSSW.js +14 -0
  108. package/dist/render-GRN4ZSSW.js.map +1 -0
  109. package/dist/resolve-4JA2BBDA.js +14 -0
  110. package/dist/resolve-4JA2BBDA.js.map +1 -0
  111. package/dist/server/index.d.ts +143 -0
  112. package/dist/server/index.js +695 -0
  113. package/dist/server/index.js.map +1 -0
  114. package/dist/server-CHMxuWKq.d.ts +96 -0
  115. package/dist/spinner-OJNR6NFO.js +8 -0
  116. package/dist/spinner-OJNR6NFO.js.map +1 -0
  117. package/dist/types-2kTLUCnD.d.ts +107 -0
  118. package/dist/types-CD0rUKKT.d.ts +109 -0
  119. package/dist/types-LrU4LRmX.d.ts +575 -0
  120. package/dist/types-NIyVwQ4h.d.ts +109 -0
  121. package/dist/types-QwfylltH.d.ts +71 -0
  122. package/dist/types-RPKUTu1k.d.ts +645 -0
  123. package/dist/uuid-RVN2T26F.js +8 -0
  124. package/dist/uuid-RVN2T26F.js.map +1 -0
  125. package/dist/zod-7YXKWYMC.js +12 -0
  126. package/dist/zod-7YXKWYMC.js.map +1 -0
  127. package/package.json +141 -7
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/server/index.ts","../../src/server/session-state.ts","../../src/server/event-buffer.ts","../../src/server/ws-dispatch.ts"],"sourcesContent":["import { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { Agent } from \"../agent.js\";\nimport type { StreamEvent } from \"../session/types.js\";\nimport type { PermissionResponse } from \"../permissions/types.js\";\n\nimport {\n type SessionState,\n type ConnectionOverrides,\n DEFAULT_PENDING_TIMEOUT_MS,\n createSessionState,\n destroySession,\n reapIdleSessions,\n bridgePermission,\n bridgeUserInput,\n clearPendingPermissionTimer,\n clearPendingInputTimer,\n clearSseKeepalive,\n} from \"./session-state.js\";\n\nimport {\n MAX_EVENT_BUFFER,\n serializeEvent,\n pushEvent,\n getBufferedEventsAfter,\n writeSseEventRaw,\n} from \"./event-buffer.js\";\n\nimport {\n type WsWebSocket,\n type WsDispatchCallbacks,\n handleWsMessage as dispatchWsMessage,\n parseWsMessage,\n wsSend,\n} from \"./ws-dispatch.js\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SSE_KEEPALIVE_INTERVAL_MS = 15_000;\nconst MAX_BODY_BYTES = 1_048_576; // 1 MB\nconst SHUTDOWN_DRAIN_MS = 500;\nconst WS_PING_INTERVAL_MS = 30_000;\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface ServerOptions {\n port: number;\n host?: string;\n /** Enable WebSocket transport (default true). Requires `ws` peer dependency. */\n ws?: boolean;\n auth?: AuthConfig;\n /** Maximum number of concurrent sessions (default unlimited). */\n maxSessions?: number;\n /** Automatically clean up sessions idle longer than this (ms). No timeout by default. */\n idleTimeoutMs?: number;\n /** Called on every new connection; return overrides for the session. */\n onConnection?: (info: ConnectionInfo) => MaybePromise<ConnectionOverrides>;\n onError?: (err: Error) => void;\n /** Enable CORS for browser clients (default true). */\n cors?: boolean;\n /** Timeout for pending permission/input responses before rejecting (ms). Default 120000. */\n pendingTimeoutMs?: number;\n}\n\n/**\n * Options for `createRequestHandler()` — same as `ServerOptions` but without\n * `port` / `host` / `ws` since the caller owns the HTTP server.\n */\nexport interface RequestHandlerOptions {\n auth?: AuthConfig;\n maxSessions?: number;\n idleTimeoutMs?: number;\n onConnection?: (info: ConnectionInfo) => MaybePromise<ConnectionOverrides>;\n onError?: (err: Error) => void;\n cors?: boolean;\n pendingTimeoutMs?: number;\n}\n\nexport type AuthConfig =\n | { type: \"bearer\"; token: string }\n | { type: \"custom\"; verify: (req: IncomingMessage) => MaybePromise<AuthResult | null> };\n\nexport interface AuthResult {\n [key: string]: unknown;\n}\n\nexport interface ConnectionInfo {\n auth: AuthResult;\n remoteAddress?: string;\n}\n\n// Re-export types that consumers might need\nexport type { ConnectionOverrides, SessionState, BufferedEvent, PromiseResolver } from \"./session-state.js\";\n\ntype WsServer = {\n on(event: \"connection\", cb: (ws: WsWebSocket, req: IncomingMessage) => void): void;\n close(cb?: () => void): void;\n};\n\n// ---------------------------------------------------------------------------\n// NoumenServer\n// ---------------------------------------------------------------------------\n\nexport class NoumenServer {\n private code: Agent;\n private options: ServerOptions;\n private httpServer: ReturnType<typeof createHttpServer> | null = null;\n private wss: WsServer | null = null;\n private sessions = new Map<string, SessionState>();\n private idleTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(code: Agent, options: ServerOptions) {\n this.code = code;\n this.options = options;\n }\n\n async start(): Promise<void> {\n this.httpServer = createHttpServer((req, res) => this.handleRequest(req, res));\n\n if (this.options.ws !== false) {\n await this.initWebSocket();\n }\n\n this.ensureIdleReaper();\n\n return new Promise<void>((resolve, reject) => {\n const host = this.options.host ?? \"127.0.0.1\";\n this.httpServer!.listen(this.options.port, host, () => resolve());\n this.httpServer!.once(\"error\", reject);\n });\n }\n\n async stop(): Promise<void> {\n if (this.idleTimer) {\n clearInterval(this.idleTimer);\n this.idleTimer = null;\n }\n\n for (const session of this.sessions.values()) {\n session.abortController.abort();\n }\n await new Promise<void>((resolve) => setTimeout(resolve, SHUTDOWN_DRAIN_MS));\n\n for (const session of this.sessions.values()) {\n destroySession(this.sessions, session);\n }\n\n if (this.wss) {\n await new Promise<void>((resolve) => this.wss!.close(() => resolve()));\n this.wss = null;\n }\n\n if (this.httpServer) {\n if (typeof (this.httpServer as any).closeAllConnections === \"function\") {\n (this.httpServer as any).closeAllConnections();\n }\n await new Promise<void>((resolve, reject) =>\n this.httpServer!.close((err) => (err ? reject(err) : resolve())),\n );\n this.httpServer = null;\n }\n }\n\n getActiveSessions(): Map<string, { id: string; lastActivity: number; done: boolean }> {\n const result = new Map<string, { id: string; lastActivity: number; done: boolean }>();\n for (const [id, s] of this.sessions) {\n result.set(id, { id: s.id, lastActivity: s.lastActivity, done: s.done });\n }\n return result;\n }\n\n // -------------------------------------------------------------------------\n // WebSocket setup\n // -------------------------------------------------------------------------\n\n private async initWebSocket(): Promise<void> {\n let WsServerCtor: new (opts: { server: ReturnType<typeof createHttpServer> }) => WsServer;\n try {\n const ws = await import(\"ws\");\n WsServerCtor = (ws as any).WebSocketServer ?? (ws as any).default?.WebSocketServer;\n } catch {\n throw new Error(\n \"noumen/server: WebSocket support requires the 'ws' package. \" +\n \"Install it with: npm install ws\\n\" +\n \"Or disable WebSocket with { ws: false } in ServerOptions.\",\n );\n }\n\n this.wss = new WsServerCtor({ server: this.httpServer! });\n this.wss.on(\"connection\", (ws, req) => {\n this.handleWsConnection(ws, req).catch((err) =>\n this.options.onError?.(err instanceof Error ? err : new Error(String(err))),\n );\n });\n }\n\n /**\n * Handle an HTTP request. Used internally by `start()` and exposed for\n * `createRequestHandler()` so the same logic can be mounted on an\n * external Express / Fastify / Hono server.\n */\n async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n this.ensureIdleReaper();\n return this.handleHttp(req, res).catch((err) => {\n this.options.onError?.(err instanceof Error ? err : new Error(String(err)));\n if (!res.headersSent) jsonResponse(res, 500, { error: \"Internal server error\" });\n });\n }\n\n private idleReaperStarted = false;\n\n private ensureIdleReaper(): void {\n if (this.idleReaperStarted || !this.options.idleTimeoutMs) return;\n this.idleReaperStarted = true;\n const interval = Math.max(this.options.idleTimeoutMs / 2, 1000);\n this.idleTimer = setInterval(() => reapIdleSessions(this.sessions, this.options.idleTimeoutMs), interval);\n this.idleTimer.unref();\n }\n\n // -------------------------------------------------------------------------\n // HTTP routing\n // -------------------------------------------------------------------------\n\n private async handleHttp(req: IncomingMessage, res: ServerResponse): Promise<void> {\n if (this.options.cors !== false) {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, DELETE, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization, Last-Event-ID\");\n }\n\n const method = req.method ?? \"GET\";\n\n if (method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n const path = url.pathname;\n\n if (path === \"/health\" && method === \"GET\") {\n return jsonResponse(res, 200, { status: \"ok\", sessions: this.sessions.size });\n }\n\n if (this.options.auth) {\n const authResult = await this.authenticate(req);\n if (!authResult) {\n return jsonResponse(res, 401, { error: \"Unauthorized\" });\n }\n }\n\n if (path === \"/sessions\" && method === \"POST\") {\n return this.handleCreateSession(req, res);\n }\n\n if (path === \"/sessions\" && method === \"GET\") {\n return this.handleListSessions(res);\n }\n\n const sessionMatch = path.match(/^\\/sessions\\/([^/]+)(?:\\/(.+))?$/);\n if (sessionMatch) {\n const sessionId = sessionMatch[1];\n const sub = sessionMatch[2] ?? \"\";\n\n if (sub === \"events\" && method === \"GET\") return this.handleSseStream(sessionId, req, res);\n if (sub === \"permissions\" && method === \"POST\") return this.handlePermissionResponse(sessionId, req, res);\n if (sub === \"input\" && method === \"POST\") return this.handleInputResponse(sessionId, req, res);\n if (sub === \"messages\" && method === \"POST\") return this.handleSendMessage(sessionId, req, res);\n if (sub === \"\" && method === \"DELETE\") return this.handleDeleteSession(sessionId, res);\n }\n\n jsonResponse(res, 404, { error: \"Not found\" });\n }\n\n // -------------------------------------------------------------------------\n // Auth\n // -------------------------------------------------------------------------\n\n private async authenticate(req: IncomingMessage): Promise<AuthResult | null> {\n const auth = this.options.auth;\n if (!auth) return {};\n\n if (auth.type === \"bearer\") {\n const header = req.headers.authorization;\n if (header === `Bearer ${auth.token}`) return {};\n return null;\n }\n\n return auth.verify(req);\n }\n\n // -------------------------------------------------------------------------\n // REST handlers\n // -------------------------------------------------------------------------\n\n private async handleCreateSession(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const body = await readBody(req);\n const { prompt, sessionId: requestedId } = body as { prompt?: string; sessionId?: string };\n\n if (!prompt || typeof prompt !== \"string\") {\n return jsonResponse(res, 400, { error: \"Missing required field: prompt\" });\n }\n\n if (this.options.maxSessions && this.sessions.size >= this.options.maxSessions) {\n return jsonResponse(res, 429, { error: \"Maximum sessions reached\" });\n }\n\n const overrides = await this.resolveConnectionOverrides(req);\n const session = createSessionState(this.sessions, requestedId, overrides);\n\n this.runAgentSse(session, prompt, false);\n\n jsonResponse(res, 201, {\n sessionId: session.id,\n eventsUrl: `/sessions/${session.id}/events`,\n });\n }\n\n private handleListSessions(res: ServerResponse): void {\n const sessions = Array.from(this.sessions.values()).map((s) => ({\n id: s.id,\n lastActivity: s.lastActivity,\n done: s.done,\n }));\n jsonResponse(res, 200, sessions);\n }\n\n private handleSseStream(sessionId: string, req: IncomingMessage, res: ServerResponse): void {\n const session = this.sessions.get(sessionId);\n if (!session) return jsonResponse(res, 404, { error: \"Session not found\" });\n\n if (session.sseResponse) {\n const oldRes = session.sseResponse;\n writeSseEventRaw(oldRes, session.sequenceNum + 1, { type: \"subscriber_replaced\" });\n oldRes.end();\n clearSseKeepalive(session);\n session.sseResponse = null;\n }\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 const lastEventId = req.headers[\"last-event-id\"] as string | undefined;\n const resumeAfterSeq = lastEventId ? parseInt(lastEventId, 10) : 0;\n\n const eventsToReplay = getBufferedEventsAfter(session.eventBuffer, resumeAfterSeq);\n for (const buffered of eventsToReplay) {\n writeSseEventRaw(res, buffered.seq, serializeEvent(buffered.event));\n }\n session.eventBuffer = [];\n session.sseResponse = res;\n\n this.startSseKeepalive(session);\n\n res.on(\"close\", () => {\n if (session.sseResponse === res) {\n clearSseKeepalive(session);\n session.sseResponse = null;\n }\n });\n }\n\n private async handlePermissionResponse(\n sessionId: string,\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) return jsonResponse(res, 404, { error: \"Session not found\" });\n if (!session.pendingPermission) return jsonResponse(res, 409, { error: \"No pending permission request\" });\n\n const body = (await readBody(req)) as PermissionResponse;\n clearPendingPermissionTimer(session);\n session.pendingPermission.resolve(body);\n session.pendingPermission = null;\n jsonResponse(res, 200, { ok: true });\n }\n\n private async handleInputResponse(\n sessionId: string,\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) return jsonResponse(res, 404, { error: \"Session not found\" });\n if (!session.pendingInput) return jsonResponse(res, 409, { error: \"No pending input request\" });\n\n const body = (await readBody(req)) as { answer?: string };\n if (typeof body.answer !== \"string\") {\n return jsonResponse(res, 400, { error: \"Missing required field: answer\" });\n }\n\n clearPendingInputTimer(session);\n session.pendingInput.resolve(body.answer);\n session.pendingInput = null;\n jsonResponse(res, 200, { ok: true });\n }\n\n private async handleSendMessage(\n sessionId: string,\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) return jsonResponse(res, 404, { error: \"Session not found\" });\n if (!session.done) return jsonResponse(res, 409, { error: \"Session is still running\" });\n\n const body = (await readBody(req)) as { prompt?: string };\n if (!body.prompt || typeof body.prompt !== \"string\") {\n return jsonResponse(res, 400, { error: \"Missing required field: prompt\" });\n }\n\n session.done = false;\n session.abortController = new AbortController();\n this.runAgentSse(session, body.prompt, true);\n jsonResponse(res, 200, { ok: true });\n }\n\n private handleDeleteSession(sessionId: string, res: ServerResponse): void {\n const session = this.sessions.get(sessionId);\n if (!session) return jsonResponse(res, 404, { error: \"Session not found\" });\n destroySession(this.sessions, session);\n jsonResponse(res, 200, { ok: true });\n }\n\n // -------------------------------------------------------------------------\n // WebSocket handling\n // -------------------------------------------------------------------------\n\n private async handleWsConnection(ws: WsWebSocket, req: IncomingMessage): Promise<void> {\n if (this.options.auth) {\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n const tokenParam = url.searchParams.get(\"token\");\n if (tokenParam && this.options.auth.type === \"bearer\") {\n if (tokenParam !== this.options.auth.token) {\n ws.close();\n return;\n }\n } else {\n const authResult = await this.authenticate(req);\n if (!authResult) {\n ws.close();\n return;\n }\n }\n }\n\n const wsSessions = new Set<string>();\n\n let pongReceived = true;\n const pingTimer = setInterval(() => {\n if (!pongReceived) {\n ws.close();\n return;\n }\n pongReceived = false;\n try { ws.ping(); } catch { /* connection may already be closing */ }\n }, WS_PING_INTERVAL_MS);\n\n ws.on(\"pong\", () => { pongReceived = true; });\n\n const callbacks: WsDispatchCallbacks = {\n onRun: async (prompt, requestedSessionId) => {\n const overrides = await this.resolveConnectionOverrides(req);\n const session = createSessionState(this.sessions, requestedSessionId, overrides);\n wsSessions.add(session.id);\n this.runAgentWs(session, prompt, ws, false);\n return session.id;\n },\n onMessage: (sessionId, prompt) => {\n const session = this.sessions.get(sessionId);\n if (!session) { wsSend(ws, { type: \"error\", error: \"Session not found\" }); return; }\n if (!session.done) { wsSend(ws, { type: \"error\", error: \"Session is still running\" }); return; }\n session.done = false;\n session.abortController = new AbortController();\n this.runAgentWs(session, prompt, ws, true);\n },\n onPermissionResponse: (sessionId, response) => {\n const session = this.sessions.get(sessionId);\n if (!session?.pendingPermission) return;\n clearPendingPermissionTimer(session);\n session.pendingPermission.resolve(response);\n session.pendingPermission = null;\n },\n onInputResponse: (sessionId, answer) => {\n const session = this.sessions.get(sessionId);\n if (!session?.pendingInput) return;\n clearPendingInputTimer(session);\n session.pendingInput.resolve(answer);\n session.pendingInput = null;\n },\n onAbort: (sessionId) => {\n const session = this.sessions.get(sessionId);\n if (session) destroySession(this.sessions, session);\n },\n };\n\n ws.on(\"message\", async (raw) => {\n try {\n const msg = parseWsMessage(raw);\n if (!msg) { wsSend(ws, { type: \"error\", error: \"Invalid JSON\" }); return; }\n const result = await dispatchWsMessage(msg, {\n maxSessions: this.options.maxSessions,\n currentSessionCount: this.sessions.size,\n }, callbacks);\n if (result.type === \"error\") {\n wsSend(ws, { type: \"error\", error: result.error });\n } else if (result.type === \"session_created\") {\n wsSend(ws, { type: \"session_created\", sessionId: result.sessionId });\n }\n } catch (err) {\n wsSend(ws, { type: \"error\", error: String(err) });\n }\n });\n\n ws.on(\"close\", () => {\n clearInterval(pingTimer);\n for (const sid of wsSessions) {\n const session = this.sessions.get(sid);\n if (session) destroySession(this.sessions, session);\n }\n });\n\n ws.on(\"error\", () => {\n clearInterval(pingTimer);\n });\n }\n\n // -------------------------------------------------------------------------\n // Agent runners\n // -------------------------------------------------------------------------\n\n private async makeThread(session: SessionState, resume: boolean) {\n const timeoutMs = this.options.pendingTimeoutMs ?? DEFAULT_PENDING_TIMEOUT_MS;\n const handlers = {\n cwd: session.cwd,\n permissionHandler: (_req: import(\"../permissions/types.js\").PermissionRequest) =>\n bridgePermission(this.sessions, session.id, timeoutMs),\n userInputHandler: (_q: string) =>\n bridgeUserInput(this.sessions, session.id, timeoutMs),\n };\n\n return resume\n ? this.code.resumeThread(session.id, handlers)\n : this.code.createThread({ sessionId: session.id, ...handlers });\n }\n\n private runAgentSse(session: SessionState, prompt: string, resume: boolean): void {\n const run = async () => {\n try {\n const thread = await this.makeThread(session, resume);\n for await (const event of thread.run(prompt, { signal: session.abortController.signal })) {\n pushEvent(session, event);\n session.lastActivity = Date.now();\n }\n } catch (err) {\n if ((err as Error).name !== \"AbortError\") {\n pushEvent(session, {\n type: \"error\",\n error: err instanceof Error ? err : new Error(String(err)),\n });\n }\n } finally {\n session.done = true;\n }\n };\n run().catch((err) => this.options.onError?.(err instanceof Error ? err : new Error(String(err))));\n }\n\n private runAgentWs(session: SessionState, prompt: string, ws: WsWebSocket, resume: boolean): void {\n const run = async () => {\n try {\n const thread = await this.makeThread(session, resume);\n for await (const event of thread.run(prompt, { signal: session.abortController.signal })) {\n session.sequenceNum++;\n wsSend(ws, { ...serializeEvent(event), sessionId: session.id, seq: session.sequenceNum });\n session.lastActivity = Date.now();\n }\n } catch (err) {\n if ((err as Error).name !== \"AbortError\") {\n wsSend(ws, { type: \"error\", sessionId: session.id, error: String(err) });\n }\n } finally {\n session.done = true;\n }\n };\n run().catch((err) => this.options.onError?.(err instanceof Error ? err : new Error(String(err))));\n }\n\n private startSseKeepalive(session: SessionState): void {\n clearSseKeepalive(session);\n session.sseKeepaliveTimer = setInterval(() => {\n if (session.sseResponse && !session.sseResponse.destroyed) {\n session.sseResponse.write(\":keepalive\\n\\n\");\n }\n }, SSE_KEEPALIVE_INTERVAL_MS);\n session.sseKeepaliveTimer.unref();\n }\n\n private async resolveConnectionOverrides(req: IncomingMessage): Promise<ConnectionOverrides> {\n if (!this.options.onConnection) return {};\n const auth = (await this.authenticate(req)) ?? {};\n return this.options.onConnection({ auth, remoteAddress: req.socket.remoteAddress });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createServer(code: Agent, options: ServerOptions): NoumenServer {\n return new NoumenServer(code, options);\n}\n\n/**\n * Create a `(req, res)` handler that can be mounted on any Node HTTP\n * framework (Express, Fastify, Hono, bare `http.createServer`, etc.).\n *\n * ```ts\n * import express from \"express\";\n * import { createRequestHandler } from \"noumen/server\";\n *\n * const app = express();\n * app.use(\"/agent\", createRequestHandler(code, { auth: { type: \"bearer\", token: \"...\" } }));\n * ```\n *\n * WebSocket is not supported in middleware mode — use `createServer()` for WS.\n */\nexport function createRequestHandler(\n code: Agent,\n options?: RequestHandlerOptions,\n): (req: IncomingMessage, res: ServerResponse) => void {\n const serverOpts: ServerOptions = {\n port: 0,\n ws: false,\n ...options,\n };\n const server = new NoumenServer(code, serverOpts);\n return (req, res) => { server.handleRequest(req, res); };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction jsonResponse(res: ServerResponse, status: number, body: unknown): void {\n const json = JSON.stringify(body);\n res.writeHead(status, {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(json),\n });\n res.end(json);\n}\n\nfunction readBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n let totalBytes = 0;\n let rejected = false;\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => {\n if (rejected) return;\n totalBytes += chunk.length;\n if (totalBytes > MAX_BODY_BYTES) {\n rejected = true;\n req.destroy();\n reject(new Error(\"Request body too large\"));\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => {\n if (rejected) return;\n try {\n const raw = Buffer.concat(chunks).toString();\n resolve(raw ? JSON.parse(raw) : {});\n } catch (err) {\n reject(err);\n }\n });\n req.on(\"error\", (err) => {\n if (!rejected) reject(err);\n });\n });\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { ServerResponse } from \"node:http\";\nimport type { StreamEvent } from \"../session/types.js\";\nimport type { PermissionResponse } from \"../permissions/types.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PromiseResolver<T> {\n resolve: (value: T) => void;\n reject: (err: Error) => void;\n}\n\nexport interface BufferedEvent {\n seq: number;\n event: StreamEvent;\n}\n\nexport interface SessionState {\n id: string;\n abortController: AbortController;\n pendingPermission: PromiseResolver<PermissionResponse> | null;\n pendingInput: PromiseResolver<string> | null;\n pendingPermissionTimer: ReturnType<typeof setTimeout> | null;\n pendingInputTimer: ReturnType<typeof setTimeout> | null;\n lastActivity: number;\n sseResponse: ServerResponse | null;\n sseKeepaliveTimer: ReturnType<typeof setInterval> | null;\n eventBuffer: BufferedEvent[];\n sequenceNum: number;\n done: boolean;\n cwd?: string;\n}\n\nexport interface ConnectionOverrides {\n cwd?: string;\n}\n\nexport const DEFAULT_PENDING_TIMEOUT_MS = 120_000; // 2 minutes\n\n// ---------------------------------------------------------------------------\n// Session lifecycle\n// ---------------------------------------------------------------------------\n\nexport function createSessionState(\n sessions: Map<string, SessionState>,\n requestedId: string | undefined,\n overrides: ConnectionOverrides,\n): SessionState {\n if (requestedId && sessions.has(requestedId)) {\n throw new Error(`Session ${requestedId} already exists`);\n }\n const sessionId = requestedId ?? randomUUID();\n\n const session: SessionState = {\n id: sessionId,\n abortController: new AbortController(),\n pendingPermission: null,\n pendingInput: null,\n pendingPermissionTimer: null,\n pendingInputTimer: null,\n lastActivity: Date.now(),\n sseResponse: null,\n sseKeepaliveTimer: null,\n eventBuffer: [],\n sequenceNum: 0,\n done: false,\n cwd: overrides.cwd,\n };\n\n sessions.set(sessionId, session);\n return session;\n}\n\nexport function destroySession(\n sessions: Map<string, SessionState>,\n session: SessionState,\n): void {\n session.abortController.abort();\n clearSseKeepalive(session);\n clearPendingPermissionTimer(session);\n clearPendingInputTimer(session);\n if (session.pendingPermission) {\n session.pendingPermission.reject(new Error(\"Session aborted\"));\n session.pendingPermission = null;\n }\n if (session.pendingInput) {\n session.pendingInput.reject(new Error(\"Session aborted\"));\n session.pendingInput = null;\n }\n if (session.sseResponse) {\n session.sseResponse.end();\n session.sseResponse = null;\n }\n sessions.delete(session.id);\n}\n\nexport function reapIdleSessions(\n sessions: Map<string, SessionState>,\n timeoutMs: number | undefined,\n): void {\n if (!timeoutMs) return;\n const now = Date.now();\n for (const session of sessions.values()) {\n if (now - session.lastActivity > timeoutMs) {\n destroySession(sessions, session);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Permission / input bridging\n// ---------------------------------------------------------------------------\n\nexport function bridgePermission(\n sessions: Map<string, SessionState>,\n sessionId: string,\n timeoutMs: number,\n): Promise<PermissionResponse> {\n const session = sessions.get(sessionId);\n if (!session) return Promise.reject(new Error(\"Session not found\"));\n return new Promise<PermissionResponse>((resolve, reject) => {\n session.pendingPermission = { resolve, reject };\n session.pendingPermissionTimer = setTimeout(() => {\n session.pendingPermissionTimer = null;\n if (session.pendingPermission) {\n session.pendingPermission.reject(new Error(\"Permission request timed out\"));\n session.pendingPermission = null;\n }\n }, timeoutMs);\n });\n}\n\nexport function bridgeUserInput(\n sessions: Map<string, SessionState>,\n sessionId: string,\n timeoutMs: number,\n): Promise<string> {\n const session = sessions.get(sessionId);\n if (!session) return Promise.reject(new Error(\"Session not found\"));\n return new Promise<string>((resolve, reject) => {\n session.pendingInput = { resolve, reject };\n session.pendingInputTimer = setTimeout(() => {\n session.pendingInputTimer = null;\n if (session.pendingInput) {\n session.pendingInput.reject(new Error(\"User input request timed out\"));\n session.pendingInput = null;\n }\n }, timeoutMs);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Timer helpers\n// ---------------------------------------------------------------------------\n\nexport function clearPendingPermissionTimer(session: SessionState): void {\n if (session.pendingPermissionTimer) {\n clearTimeout(session.pendingPermissionTimer);\n session.pendingPermissionTimer = null;\n }\n}\n\nexport function clearPendingInputTimer(session: SessionState): void {\n if (session.pendingInputTimer) {\n clearTimeout(session.pendingInputTimer);\n session.pendingInputTimer = null;\n }\n}\n\nexport function clearSseKeepalive(session: SessionState): void {\n if (session.sseKeepaliveTimer) {\n clearInterval(session.sseKeepaliveTimer);\n session.sseKeepaliveTimer = null;\n }\n}\n","import type { ServerResponse } from \"node:http\";\nimport type { StreamEvent } from \"../session/types.js\";\nimport type { SessionState, BufferedEvent } from \"./session-state.js\";\n\nexport const MAX_EVENT_BUFFER = 1000;\n\n/**\n * Serialize a StreamEvent to a JSON-safe object. Error instances are\n * converted to `{ message, name }` since `JSON.stringify(new Error())`\n * produces `{}`.\n */\nexport function serializeEvent(event: StreamEvent): Record<string, unknown> {\n if (event.type === \"error\") {\n return { type: \"error\", error: { message: event.error.message, name: event.error.name } };\n }\n if (event.type === \"retry_exhausted\") {\n return { ...event, error: { message: event.error.message, name: event.error.name } };\n }\n if (event.type === \"retry_attempt\") {\n return { ...event, error: { message: event.error.message, name: event.error.name } };\n }\n return event as unknown as Record<string, unknown>;\n}\n\n/**\n * Push a stream event into the session's buffer, incrementing the sequence\n * number and writing to the live SSE response if one is attached.\n */\nexport function pushEvent(session: SessionState, event: StreamEvent): void {\n session.sequenceNum++;\n const seq = session.sequenceNum;\n\n if (session.eventBuffer.length >= MAX_EVENT_BUFFER) {\n session.eventBuffer.shift();\n }\n session.eventBuffer.push({ seq, event });\n\n if (session.sseResponse) {\n writeSseEventRaw(session.sseResponse, seq, serializeEvent(event));\n }\n}\n\n/**\n * Return buffered events whose sequence number is greater than `afterSeq`.\n */\nexport function getBufferedEventsAfter(\n buffer: BufferedEvent[],\n afterSeq: number,\n): BufferedEvent[] {\n if (!afterSeq) return [...buffer];\n return buffer.filter((e) => e.seq > afterSeq);\n}\n\nexport function writeSseEventRaw(\n res: ServerResponse,\n seq: number,\n data: Record<string, unknown>,\n): void {\n res.write(`id: ${seq}\\ndata: ${JSON.stringify(data)}\\n\\n`);\n}\n","import type { PermissionResponse } from \"../permissions/types.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type WsWebSocket = {\n on(event: \"message\", cb: (data: Buffer | string) => void): void;\n on(event: \"close\", cb: () => void): void;\n on(event: \"error\", cb: (err: Error) => void): void;\n on(event: \"pong\", cb: () => void): void;\n send(data: string): void;\n ping(): void;\n close(): void;\n readyState: number;\n};\n\nexport interface WsDispatchCallbacks {\n /** Start a new session with the given prompt, optional requested session ID. */\n onRun: (prompt: string, requestedSessionId: string | undefined) => Promise<string>;\n /** Send a follow-up message to an existing session. */\n onMessage: (sessionId: string, prompt: string) => void;\n /** Forward a permission response to a session. */\n onPermissionResponse: (sessionId: string, response: PermissionResponse) => void;\n /** Forward a user input response to a session. */\n onInputResponse: (sessionId: string, answer: string) => void;\n /** Abort/destroy a session. */\n onAbort: (sessionId: string) => void;\n}\n\nexport interface WsDispatchContext {\n maxSessions: number | undefined;\n currentSessionCount: number;\n}\n\nexport type WsDispatchResult =\n | { type: \"ok\" }\n | { type: \"error\"; error: string }\n | { type: \"session_created\"; sessionId: string }\n\n// ---------------------------------------------------------------------------\n// Parsing\n// ---------------------------------------------------------------------------\n\nexport function parseWsMessage(raw: Buffer | string): Record<string, unknown> | null {\n try {\n return JSON.parse(typeof raw === \"string\" ? raw : raw.toString());\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Dispatch\n// ---------------------------------------------------------------------------\n\nexport async function handleWsMessage(\n msg: Record<string, unknown>,\n ctx: WsDispatchContext,\n callbacks: WsDispatchCallbacks,\n): Promise<WsDispatchResult> {\n const msgType = msg.type as string;\n\n if (msgType === \"run\") {\n if (ctx.maxSessions && ctx.currentSessionCount >= ctx.maxSessions) {\n return { type: \"error\", error: \"Maximum sessions reached\" };\n }\n if (typeof msg.prompt !== \"string\" || !msg.prompt.trim()) {\n return { type: \"error\", error: \"Missing or empty prompt\" };\n }\n try {\n const sessionId = await callbacks.onRun(\n msg.prompt,\n msg.sessionId as string | undefined,\n );\n return { type: \"session_created\", sessionId };\n } catch (err) {\n return { type: \"error\", error: err instanceof Error ? err.message : String(err) };\n }\n }\n\n if (msgType === \"message\") {\n if (typeof msg.prompt !== \"string\" || !msg.prompt.trim()) {\n return { type: \"error\", error: \"Missing or empty prompt\" };\n }\n const sessionId = msg.sessionId as string;\n if (!sessionId) {\n return { type: \"error\", error: \"Missing sessionId\" };\n }\n callbacks.onMessage(sessionId, msg.prompt);\n return { type: \"ok\" };\n }\n\n if (msgType === \"permission_response\") {\n const sessionId = msg.sessionId as string;\n const { sessionId: _sid, type: _type, ...response } = msg;\n callbacks.onPermissionResponse(sessionId, response as unknown as PermissionResponse);\n return { type: \"ok\" };\n }\n\n if (msgType === \"input_response\") {\n const sessionId = msg.sessionId as string;\n callbacks.onInputResponse(sessionId, (msg.answer as string) ?? \"\");\n return { type: \"ok\" };\n }\n\n if (msgType === \"abort\") {\n const sessionId = msg.sessionId as string;\n if (sessionId) callbacks.onAbort(sessionId);\n return { type: \"ok\" };\n }\n\n return { type: \"ok\" };\n}\n\nexport function wsSend(ws: WsWebSocket, data: unknown): void {\n if (ws.readyState === 1) ws.send(JSON.stringify(data));\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,96 @@
1
+ import { T as Tool, g as ToolResult, h as ToolContext } from './types-RPKUTu1k.js';
2
+ import { T as TokenStorage, M as McpServerConfig } from './types-2kTLUCnD.js';
3
+
4
+ /**
5
+ * Normalize a server or tool name to be compatible with the API pattern
6
+ * ^[a-zA-Z0-9_-]{1,64}$. Replaces any invalid characters with underscores.
7
+ */
8
+ declare function normalizeNameForMCP(name: string): string;
9
+ declare function getMcpPrefix(serverName: string): string;
10
+ declare function buildMcpToolName(serverName: string, toolName: string): string;
11
+ /**
12
+ * Parse a fully-qualified MCP tool name back into server + tool components.
13
+ * Returns null if the string doesn't match the mcp__server__tool pattern.
14
+ */
15
+ declare function parseMcpToolName(fullName: string): {
16
+ serverName: string;
17
+ toolName: string;
18
+ } | null;
19
+
20
+ interface McpClientManagerOptions {
21
+ /**
22
+ * Default token storage used for servers that declare `oauth` config
23
+ * but no custom `authProvider`. Falls back to InMemoryTokenStorage.
24
+ */
25
+ tokenStorage?: TokenStorage;
26
+ /**
27
+ * Called when a server requires interactive OAuth and the user must
28
+ * visit an authorization URL. Passed through to NoumenOAuthProvider.
29
+ */
30
+ onAuthorizationUrl?: (url: string) => void | Promise<void>;
31
+ }
32
+ declare class McpClientManager {
33
+ private connections;
34
+ private serverConfigs;
35
+ private tokenStorage;
36
+ private onAuthorizationUrl?;
37
+ constructor(mcpServers: Record<string, McpServerConfig>, options?: McpClientManagerOptions);
38
+ connect(): Promise<void>;
39
+ private connectToServer;
40
+ /**
41
+ * Resolve an OAuthClientProvider for an HTTP or SSE server config.
42
+ * Returns null if the server doesn't require authentication.
43
+ */
44
+ private resolveAuthProvider;
45
+ getTools(): Promise<Tool[]>;
46
+ private mapMcpTool;
47
+ callTool(serverName: string, toolName: string, args: Record<string, unknown>, options?: {
48
+ timeoutMs?: number;
49
+ }): Promise<ToolResult>;
50
+ getConnectionStatus(): Array<{
51
+ name: string;
52
+ status: string;
53
+ toolCount?: number;
54
+ }>;
55
+ /**
56
+ * Returns server names that are in `needs-auth` status and require
57
+ * interactive OAuth before they can be used.
58
+ */
59
+ getServersNeedingAuth(): string[];
60
+ /**
61
+ * Reconnect a server by closing its existing connection and
62
+ * establishing a new one. Useful after completing OAuth.
63
+ */
64
+ reconnect(serverName: string): Promise<void>;
65
+ /**
66
+ * Trigger interactive OAuth for a `needs-auth` server, then reconnect.
67
+ * Runs the full MCP SDK auth orchestrator with a local callback server.
68
+ *
69
+ * Returns the authorization URL if the flow requires user interaction,
70
+ * or null if the server connected without browser auth (e.g. cached tokens).
71
+ */
72
+ performAuth(serverName: string, options?: {
73
+ signal?: AbortSignal;
74
+ }): Promise<{
75
+ authUrl?: string;
76
+ }>;
77
+ close(): Promise<void>;
78
+ }
79
+
80
+ interface McpServerOptions {
81
+ /** Additional tools beyond the 6 built-ins */
82
+ tools?: Tool[];
83
+ /** Context passed to tool.call() for all invocations */
84
+ toolContext: ToolContext;
85
+ /** Server name reported to clients */
86
+ name?: string;
87
+ /** Server version reported to clients */
88
+ version?: string;
89
+ }
90
+ /**
91
+ * Start an MCP server over stdio that exposes noumen's tools.
92
+ * This is the entry point for `noumen mcp` or similar CLI integrations.
93
+ */
94
+ declare function createMcpServer(opts: McpServerOptions): Promise<void>;
95
+
96
+ export { McpClientManager as M, type McpClientManagerOptions as a, type McpServerOptions as b, buildMcpToolName as c, createMcpServer as d, getMcpPrefix as g, normalizeNameForMCP as n, parseMcpToolName as p };
@@ -0,0 +1,8 @@
1
+ import {
2
+ startSpinner
3
+ } from "./chunk-KXDB56YW.js";
4
+ import "./chunk-DGUM43GV.js";
5
+ export {
6
+ startSpinner
7
+ };
8
+ //# sourceMappingURL=spinner-OJNR6NFO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,107 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { OAuthDiscoveryState, OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
3
+ import { OAuthTokens, OAuthClientInformationMixed, OAuthClientMetadata } from '@modelcontextprotocol/sdk/shared/auth.js';
4
+
5
+ /**
6
+ * Configuration for MCP server OAuth authentication.
7
+ * When provided on an HTTP or SSE server config, noumen will automatically
8
+ * create an OAuthClientProvider and wire it into the transport.
9
+ */
10
+ interface McpOAuthConfig {
11
+ /** Pre-registered client ID. Omit to use Dynamic Client Registration. */
12
+ clientId?: string;
13
+ /** Client secret for confidential clients. */
14
+ clientSecret?: string;
15
+ /** Space-separated OAuth scopes to request. */
16
+ scopes?: string;
17
+ /** Preferred local port for the OAuth callback server. */
18
+ callbackPort?: number;
19
+ /** Override URL for the authorization server metadata endpoint. */
20
+ authServerMetadataUrl?: string;
21
+ }
22
+ /**
23
+ * Persisted state for a single MCP server's OAuth session.
24
+ */
25
+ interface OAuthTokenData {
26
+ tokens?: OAuthTokens;
27
+ clientInformation?: OAuthClientInformationMixed;
28
+ codeVerifier?: string;
29
+ discoveryState?: OAuthDiscoveryState;
30
+ /** Epoch ms when the access token expires (computed from tokens.expires_in). */
31
+ expiresAt?: number;
32
+ }
33
+ /**
34
+ * Pluggable storage backend for OAuth tokens and session data.
35
+ * Consumers provide their own implementation (file, keychain, database, etc).
36
+ */
37
+ interface TokenStorage {
38
+ load(serverKey: string): Promise<OAuthTokenData | undefined>;
39
+ save(serverKey: string, data: OAuthTokenData): Promise<void>;
40
+ delete(serverKey: string): Promise<void>;
41
+ }
42
+ /**
43
+ * Options for creating a NoumenOAuthProvider.
44
+ */
45
+ interface OAuthProviderOptions {
46
+ storage: TokenStorage;
47
+ clientMetadata: OAuthClientMetadata;
48
+ /** Pre-registered client ID (skips Dynamic Client Registration). */
49
+ clientId?: string;
50
+ /** Client secret for confidential clients. */
51
+ clientSecret?: string;
52
+ /** Preferred local port for the callback server. */
53
+ callbackPort?: number;
54
+ /**
55
+ * Called when the user must visit an authorization URL.
56
+ * If not provided, the default behavior opens the system browser.
57
+ */
58
+ onAuthorizationUrl?: (url: string) => void | Promise<void>;
59
+ /** AbortSignal to cancel in-progress authorization flows. */
60
+ signal?: AbortSignal;
61
+ }
62
+
63
+ interface McpStdioServerConfig {
64
+ type?: "stdio";
65
+ command: string;
66
+ args?: string[];
67
+ env?: Record<string, string>;
68
+ }
69
+ interface McpHttpServerConfig {
70
+ type: "http";
71
+ url: string;
72
+ headers?: Record<string, string>;
73
+ /** OAuth configuration — noumen creates an auth provider automatically. */
74
+ oauth?: McpOAuthConfig;
75
+ /** Fully custom OAuthClientProvider — overrides `oauth` config when set. */
76
+ authProvider?: OAuthClientProvider;
77
+ }
78
+ interface McpSseServerConfig {
79
+ type: "sse";
80
+ url: string;
81
+ headers?: Record<string, string>;
82
+ /** OAuth configuration — noumen creates an auth provider automatically. */
83
+ oauth?: McpOAuthConfig;
84
+ /** Fully custom OAuthClientProvider — overrides `oauth` config when set. */
85
+ authProvider?: OAuthClientProvider;
86
+ }
87
+ interface McpWebSocketServerConfig {
88
+ type: "websocket";
89
+ url: string;
90
+ }
91
+ type McpServerConfig = McpStdioServerConfig | McpHttpServerConfig | McpSseServerConfig | McpWebSocketServerConfig;
92
+ interface McpConfig {
93
+ mcpServers: Record<string, McpServerConfig>;
94
+ }
95
+ interface McpConnection {
96
+ name: string;
97
+ client: Client | null;
98
+ status: "connected" | "failed" | "pending" | "needs-auth";
99
+ config: McpServerConfig;
100
+ cleanup: () => Promise<void>;
101
+ }
102
+ interface McpToolInfo {
103
+ serverName: string;
104
+ toolName: string;
105
+ }
106
+
107
+ export type { McpServerConfig as M, OAuthTokenData as O, TokenStorage as T, OAuthProviderOptions as a, McpConfig as b, McpConnection as c, McpHttpServerConfig as d, McpOAuthConfig as e, McpSseServerConfig as f, McpStdioServerConfig as g, McpToolInfo as h, McpWebSocketServerConfig as i };
@@ -0,0 +1,109 @@
1
+ type PermissionMode = "default" | "plan" | "acceptEdits" | "auto" | "bypassPermissions" | "dontAsk";
2
+ type PermissionBehavior = "allow" | "deny" | "ask";
3
+ type PermissionRuleSource = "user" | "project" | "session" | "policy";
4
+ /** Precedence order: policy > project > user > session. */
5
+ declare const RULE_SOURCE_PRECEDENCE: PermissionRuleSource[];
6
+ interface PermissionRule {
7
+ toolName: string;
8
+ ruleContent?: string;
9
+ behavior: PermissionBehavior;
10
+ /** Where this rule came from. Higher-precedence sources override lower ones. */
11
+ source?: PermissionRuleSource;
12
+ }
13
+ type PermissionUpdate = {
14
+ type: "addRules";
15
+ rules: PermissionRule[];
16
+ } | {
17
+ type: "removeRules";
18
+ toolName: string;
19
+ behavior?: PermissionBehavior;
20
+ } | {
21
+ type: "setMode";
22
+ mode: PermissionMode;
23
+ } | {
24
+ type: "addDirectories";
25
+ directories: string[];
26
+ } | {
27
+ type: "removeDirectories";
28
+ directories: string[];
29
+ };
30
+ interface PermissionAllowResult<Input extends Record<string, unknown> = Record<string, unknown>> {
31
+ behavior: "allow";
32
+ updatedInput?: Input;
33
+ reason?: string;
34
+ }
35
+ interface PermissionDenyResult {
36
+ behavior: "deny";
37
+ message: string;
38
+ reason?: string;
39
+ }
40
+ interface PermissionAskResult {
41
+ behavior: "ask";
42
+ message: string;
43
+ reason?: string;
44
+ suggestions?: PermissionRule[];
45
+ }
46
+ interface PermissionPassthroughResult {
47
+ behavior: "passthrough";
48
+ message: string;
49
+ reason?: string;
50
+ suggestions?: PermissionRule[];
51
+ }
52
+ /**
53
+ * What `Tool.checkPermissions` returns. Includes `passthrough` for tools that
54
+ * have no opinion and want the global pipeline to decide.
55
+ */
56
+ type PermissionResult<Input extends Record<string, unknown> = Record<string, unknown>> = PermissionAllowResult<Input> | PermissionDenyResult | PermissionAskResult | PermissionPassthroughResult;
57
+ /**
58
+ * Final decision after the pipeline resolves. No `passthrough` — always
59
+ * one of allow / deny / ask.
60
+ */
61
+ type PermissionDecision<Input extends Record<string, unknown> = Record<string, unknown>> = PermissionAllowResult<Input> | PermissionDenyResult | PermissionAskResult;
62
+ interface PermissionRequest {
63
+ toolName: string;
64
+ input: Record<string, unknown>;
65
+ message: string;
66
+ suggestions?: PermissionRule[];
67
+ isReadOnly: boolean;
68
+ isDestructive: boolean;
69
+ /** Abort signal from the session — handlers should stop promptly when fired. */
70
+ signal?: AbortSignal;
71
+ }
72
+ interface PermissionResponse {
73
+ allow: boolean;
74
+ updatedInput?: Record<string, unknown>;
75
+ feedback?: string;
76
+ addRules?: PermissionRule[];
77
+ }
78
+ type PermissionHandler = (request: PermissionRequest) => Promise<PermissionResponse>;
79
+ interface AutoModeConfig {
80
+ /** Custom system prompt for the classifier. When omitted, uses a default. */
81
+ classifierPrompt?: string;
82
+ /** Model to use for classification. When omitted, uses the thread's model. */
83
+ classifierModel?: string;
84
+ }
85
+ interface DenialTrackingConfig {
86
+ /** Max consecutive denials before fallback (default: 3). */
87
+ maxConsecutive?: number;
88
+ /** Max total denials before fallback (default: 20). */
89
+ maxTotal?: number;
90
+ }
91
+ interface PermissionConfig {
92
+ mode?: PermissionMode;
93
+ rules?: PermissionRule[];
94
+ handler?: PermissionHandler;
95
+ workingDirectories?: string[];
96
+ /** Called when a permission update is applied (for host-side persistence). */
97
+ onPermissionUpdate?: (update: PermissionUpdate) => void;
98
+ /** Configuration for auto mode classifier. */
99
+ autoMode?: AutoModeConfig;
100
+ /** Configuration for denial tracking limits. */
101
+ denialTracking?: DenialTrackingConfig;
102
+ }
103
+ interface PermissionContext {
104
+ mode: PermissionMode;
105
+ rules: PermissionRule[];
106
+ workingDirectories: string[];
107
+ }
108
+
109
+ export { type AutoModeConfig as A, type DenialTrackingConfig as D, type PermissionResponse as P, RULE_SOURCE_PRECEDENCE as R, type PermissionMode as a, type PermissionResult as b, type PermissionHandler as c, type PermissionConfig as d, type PermissionContext as e, type PermissionBehavior as f, type PermissionRule as g, type PermissionDecision as h, type PermissionUpdate as i, type PermissionAllowResult as j, type PermissionAskResult as k, type PermissionDenyResult as l, type PermissionPassthroughResult as m, type PermissionRequest as n, type PermissionRuleSource as o };