noumen 0.2.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.
- package/README.md +95 -16
- package/dist/a2a/index.d.ts +5 -5
- package/dist/a2a/index.js +3 -3
- package/dist/a2a/index.js.map +1 -1
- package/dist/acp/index.d.ts +5 -5
- package/dist/acp/index.js +4 -4
- package/dist/acp/index.js.map +1 -1
- package/dist/{agent-BrkbZyOT.d.ts → agent-1nFVUP9E.d.ts} +319 -15
- package/dist/{cache-DVqaCX8v.d.ts → cache-DsRqxx6v.d.ts} +1 -1
- package/dist/{chunk-BGG2E6JD.js → chunk-3HEYCV26.js} +1 -1
- package/dist/chunk-3SK5GCI6.js +75 -0
- package/dist/chunk-3SK5GCI6.js.map +1 -0
- package/dist/{chunk-NBDFQYUZ.js → chunk-4HW6LN6D.js} +4784 -2411
- package/dist/chunk-4HW6LN6D.js.map +1 -0
- package/dist/{chunk-7ZMN7XJE.js → chunk-5JN4SPI7.js} +6 -6
- package/dist/chunk-5JN4SPI7.js.map +1 -0
- package/dist/{chunk-CPFHEPW4.js → chunk-CS6WNDCF.js} +73 -41
- package/dist/chunk-CS6WNDCF.js.map +1 -0
- package/dist/chunk-EKOGVTBT.js +472 -0
- package/dist/chunk-EKOGVTBT.js.map +1 -0
- package/dist/{chunk-KY6ZPWHO.js → chunk-HEQQQGK5.js} +47 -28
- package/dist/chunk-HEQQQGK5.js.map +1 -0
- package/dist/{chunk-QTJ7VTJY.js → chunk-HL6JCRZJ.js} +1599 -481
- package/dist/chunk-HL6JCRZJ.js.map +1 -0
- package/dist/chunk-L3L3FG5T.js +16 -0
- package/dist/chunk-L3L3FG5T.js.map +1 -0
- package/dist/cli/index.js +36 -30
- package/dist/cli/index.js.map +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/{headless-Q7XHHZIW.js → headless-FFU2DESQ.js} +3 -4
- package/dist/headless-FFU2DESQ.js.map +1 -0
- package/dist/index.d.ts +218 -68
- package/dist/index.js +37 -23
- package/dist/lsp/index.d.ts +4 -4
- package/dist/mcp/index.d.ts +5 -5
- package/dist/mcp/index.js +2 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/{provider-factory-34MSWJZ3.js → provider-factory-KCLIF34X.js} +2 -2
- package/dist/providers/anthropic.d.ts +2 -2
- package/dist/providers/anthropic.js +5 -3
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/bedrock.d.ts +2 -2
- package/dist/providers/bedrock.js +5 -3
- package/dist/providers/bedrock.js.map +1 -1
- package/dist/providers/gemini.d.ts +2 -1
- package/dist/providers/gemini.js +133 -95
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/ollama.d.ts +13 -0
- package/dist/{ollama-YNXAYP3R.js → providers/ollama.js} +6 -4
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +4 -1
- package/dist/providers/openai.js +2 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.js +2 -1
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/providers/vertex.d.ts +4 -2
- package/dist/providers/vertex.js +6 -3
- package/dist/providers/vertex.js.map +1 -1
- package/dist/{resolve-XM52G7YE.js → resolve-4JA2BBDA.js} +2 -2
- package/dist/server/index.d.ts +35 -20
- package/dist/server/index.js +276 -207
- package/dist/server/index.js.map +1 -1
- package/dist/{server-Cg1yWGaV.d.ts → server-CHMxuWKq.d.ts} +1 -1
- package/dist/{types-DwdzmXfs.d.ts → types-CD0rUKKT.d.ts} +2 -0
- package/dist/{types-3c88cRKH.d.ts → types-LrU4LRmX.d.ts} +28 -0
- package/dist/{types-CwKKucOF.d.ts → types-RPKUTu1k.d.ts} +27 -2
- package/dist/uuid-RVN2T26F.js +8 -0
- package/dist/uuid-RVN2T26F.js.map +1 -0
- package/dist/zod-7YXKWYMC.js +12 -0
- package/dist/zod-7YXKWYMC.js.map +1 -0
- package/package.json +19 -13
- package/dist/chunk-2ZTGQLYK.js +0 -356
- package/dist/chunk-2ZTGQLYK.js.map +0 -1
- package/dist/chunk-7ZMN7XJE.js.map +0 -1
- package/dist/chunk-CPFHEPW4.js.map +0 -1
- package/dist/chunk-KY6ZPWHO.js.map +0 -1
- package/dist/chunk-NBDFQYUZ.js.map +0 -1
- package/dist/chunk-QTJ7VTJY.js.map +0 -1
- package/dist/headless-Q7XHHZIW.js.map +0 -1
- package/dist/ollama-YNXAYP3R.js.map +0 -1
- /package/dist/{chunk-BGG2E6JD.js.map → chunk-3HEYCV26.js.map} +0 -0
- /package/dist/{provider-factory-34MSWJZ3.js.map → provider-factory-KCLIF34X.js.map} +0 -0
- /package/dist/{resolve-XM52G7YE.js.map → resolve-4JA2BBDA.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/providers/gemini.ts"],"sourcesContent":["import { GoogleGenAI } from \"@google/genai\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { ChatMessage, ContentPart } from \"../session/types.js\";\n\nexport interface GeminiProviderOptions {\n apiKey: string;\n model?: string;\n}\n\ninterface GeminiContent {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\ninterface GeminiPart {\n text?: string;\n thought?: boolean;\n inlineData?: { mimeType: string; data: string };\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: {\n name: string;\n response: { result: unknown };\n };\n}\n\nexport class GeminiProvider implements AIProvider {\n private client: GoogleGenAI;\n private defaultModel: string;\n\n constructor(opts: GeminiProviderOptions) {\n this.client = new GoogleGenAI({ apiKey: opts.apiKey });\n this.defaultModel = opts.model ?? \"gemini-2.5-flash\";\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const { contents, systemInstruction } = this.convertMessages(\n params.system,\n params.messages,\n );\n\n const tools = params.tools?.length\n ? [\n {\n functionDeclarations: params.tools.map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters as Record<string, unknown>,\n })),\n },\n ]\n : undefined;\n\n const thinkingEnabled =\n params.thinking?.type === \"enabled\" &&\n (params.thinking as { budgetTokens: number }).budgetTokens > 0;\n const thinkingBudget = thinkingEnabled\n ? (params.thinking as { type: \"enabled\"; budgetTokens: number }).budgetTokens\n : 0;\n\n const config: Record<string, unknown> = {\n systemInstruction: systemInstruction || undefined,\n maxOutputTokens: params.max_tokens,\n temperature: params.temperature,\n tools,\n };\n\n if (thinkingEnabled) {\n config.thinkingConfig = { thinkingBudget: thinkingBudget };\n }\n\n if (params.outputFormat?.type === \"json_schema\") {\n config.responseSchema = params.outputFormat.schema;\n config.responseMimeType = \"application/json\";\n } else if (params.outputFormat?.type === \"json_object\") {\n config.responseMimeType = \"application/json\";\n }\n\n const stream = await this.client.models.generateContentStream({\n model: params.model ?? this.defaultModel,\n contents,\n config,\n });\n\n let chunkIndex = 0;\n let toolCallIndex = 0;\n let lastUsage: ChatStreamChunk[\"usage\"] | undefined;\n\n for await (const chunk of stream) {\n const chunkId = `gemini-${chunkIndex++}`;\n const model = params.model ?? this.defaultModel;\n\n const meta = chunk.usageMetadata as\n | { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number; thoughtsTokenCount?: number }\n | undefined;\n if (meta) {\n const prompt = meta.promptTokenCount ?? 0;\n const completion = meta.candidatesTokenCount ?? 0;\n lastUsage = {\n prompt_tokens: prompt,\n completion_tokens: completion,\n total_tokens: meta.totalTokenCount ?? (prompt + completion),\n thinking_tokens: meta.thoughtsTokenCount || undefined,\n };\n }\n\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) continue;\n\n const parts = candidates[0].content?.parts as GeminiPart[] | undefined;\n if (!parts) continue;\n\n for (const part of parts) {\n if (part.thought && part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { thinking_content: part.text },\n finish_reason: null,\n },\n ],\n };\n continue;\n }\n\n if (part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { content: part.text },\n finish_reason: null,\n },\n ],\n };\n }\n\n if (part.functionCall) {\n const fc = part.functionCall;\n const tcId = `gemini-tc-${toolCallIndex}`;\n const idx = toolCallIndex++;\n\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: {\n tool_calls: [\n {\n index: idx,\n id: tcId,\n type: \"function\" as const,\n function: {\n name: fc.name,\n arguments: JSON.stringify(fc.args ?? {}),\n },\n },\n ],\n },\n finish_reason: null,\n },\n ],\n };\n }\n }\n\n const finishReason = candidates[0].finishReason;\n if (finishReason && finishReason !== \"FINISH_REASON_UNSPECIFIED\") {\n let mapped: string;\n if (finishReason === \"STOP\") {\n mapped = toolCallIndex > 0 ? \"tool_calls\" : \"stop\";\n } else if (finishReason === \"MAX_TOKENS\") {\n mapped = \"length\";\n } else if (finishReason === \"SAFETY\" || finishReason === \"RECITATION\") {\n mapped = \"content_filter\";\n } else {\n mapped = \"stop\";\n }\n\n yield {\n id: chunkId,\n model,\n choices: [{ index: 0, delta: {}, finish_reason: mapped }],\n usage: lastUsage,\n };\n }\n }\n }\n\n private static contentPartsToGemini(parts: ContentPart[]): GeminiPart[] {\n return parts.map((part) => {\n if (part.type === \"text\") {\n return { text: part.text };\n }\n if (part.type === \"image\") {\n return { inlineData: { mimeType: part.media_type, data: part.data } };\n }\n // image_url — Gemini doesn't natively support URL references as inlineData;\n // pass it as text with the URL. Consumers should prefer base64 ImageContent.\n return { text: `[image: ${part.url}]` };\n });\n }\n\n private convertMessages(\n systemPrompt: string | undefined,\n messages: ChatMessage[],\n ): { contents: GeminiContent[]; systemInstruction: string | undefined } {\n const contents: GeminiContent[] = [];\n\n const toolCallIdToName = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n toolCallIdToName.set(tc.id, tc.function.name);\n }\n }\n }\n\n let pendingFunctionResponses: GeminiPart[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n continue;\n }\n\n if (msg.role === \"user\") {\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n pendingFunctionResponses = [];\n }\n if (Array.isArray(msg.content)) {\n const parts = GeminiProvider.contentPartsToGemini(msg.content as ContentPart[]);\n contents.push({ role: \"user\", parts });\n } else {\n contents.push({ role: \"user\", parts: [{ text: msg.content as string }] });\n }\n } else if (msg.role === \"assistant\") {\n const parts: GeminiPart[] = [];\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n // malformed\n }\n parts.push({\n functionCall: { name: tc.function.name, args },\n });\n }\n }\n if (parts.length > 0) {\n contents.push({ role: \"model\", parts });\n }\n } else if (msg.role === \"tool\") {\n const fnName =\n toolCallIdToName.get(msg.tool_call_id) ?? msg.tool_call_id;\n const resultValue = Array.isArray(msg.content)\n ? (msg.content as ContentPart[])\n .filter((p): p is Extract<ContentPart, { type: \"text\" }> => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : msg.content;\n pendingFunctionResponses.push({\n functionResponse: {\n name: fnName,\n response: { result: resultValue },\n },\n });\n }\n }\n\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n }\n\n return { contents, systemInstruction: systemPrompt };\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/providers/gemini.ts"],"sourcesContent":["import { GoogleGenAI } from \"@google/genai\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport { ChatStreamError } from \"./types.js\";\nimport type { ChatMessage, ContentPart } from \"../session/types.js\";\n\nexport interface GeminiProviderOptions {\n apiKey: string;\n model?: string;\n baseURL?: string;\n}\n\ninterface GeminiContent {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\ninterface GeminiPart {\n text?: string;\n thought?: boolean;\n inlineData?: { mimeType: string; data: string };\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: {\n name: string;\n response: { result: unknown };\n };\n}\n\nexport class GeminiProvider implements AIProvider {\n private client: GoogleGenAI;\n private defaultModel: string;\n\n constructor(opts: GeminiProviderOptions) {\n const clientOpts: Record<string, unknown> = { apiKey: opts.apiKey };\n if (opts.baseURL) clientOpts.httpOptions = { baseUrl: opts.baseURL };\n this.client = new GoogleGenAI(clientOpts as ConstructorParameters<typeof GoogleGenAI>[0]);\n this.defaultModel = opts.model ?? \"gemini-2.5-flash\";\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const { contents, systemInstruction } = this.convertMessages(\n params.system,\n params.messages,\n );\n\n const tools = params.tools?.length\n ? [\n {\n functionDeclarations: params.tools.map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters as Record<string, unknown>,\n })),\n },\n ]\n : undefined;\n\n const thinkingEnabled =\n params.thinking?.type === \"enabled\" &&\n (params.thinking as { budgetTokens: number }).budgetTokens > 0;\n const thinkingBudget = thinkingEnabled\n ? (params.thinking as { type: \"enabled\"; budgetTokens: number }).budgetTokens\n : 0;\n\n const config: Record<string, unknown> = {\n systemInstruction: systemInstruction || undefined,\n maxOutputTokens: params.max_tokens,\n temperature: params.temperature,\n tools,\n };\n\n if (thinkingEnabled) {\n config.thinkingConfig = { thinkingBudget: thinkingBudget };\n }\n\n if (params.outputFormat?.type === \"json_schema\") {\n config.responseSchema = params.outputFormat.schema;\n config.responseMimeType = \"application/json\";\n } else if (params.outputFormat?.type === \"json_object\") {\n config.responseMimeType = \"application/json\";\n }\n\n if (params.signal) {\n (config as Record<string, unknown>).httpOptions = {\n ...((config as Record<string, unknown>).httpOptions as Record<string, unknown> ?? {}),\n signal: params.signal,\n };\n }\n\n try {\n const stream = await this.client.models.generateContentStream({\n model: params.model ?? this.defaultModel,\n contents,\n config,\n });\n\n let chunkIndex = 0;\n let toolCallIndex = 0;\n let responseHasToolCalls = false;\n let finishReasonSeen = false;\n let lastUsage: ChatStreamChunk[\"usage\"] | undefined;\n\n for await (const chunk of stream) {\n const chunkId = `gemini-${chunkIndex++}`;\n const model = params.model ?? this.defaultModel;\n\n const meta = chunk.usageMetadata as\n | { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number; thoughtsTokenCount?: number }\n | undefined;\n if (meta) {\n const prompt = meta.promptTokenCount ?? 0;\n const completion = meta.candidatesTokenCount ?? 0;\n lastUsage = {\n prompt_tokens: prompt,\n completion_tokens: completion,\n total_tokens: meta.totalTokenCount ?? (prompt + completion),\n thinking_tokens: meta.thoughtsTokenCount || undefined,\n };\n }\n\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) continue;\n\n const parts = candidates[0].content?.parts as GeminiPart[] | undefined;\n\n if (parts) {\n for (const part of parts) {\n if (part.thought && part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { thinking_content: part.text },\n finish_reason: null,\n },\n ],\n };\n continue;\n }\n\n if (part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { content: part.text },\n finish_reason: null,\n },\n ],\n };\n }\n\n if (part.functionCall) {\n const fc = part.functionCall;\n const tcId = `gemini-tc-${toolCallIndex}`;\n const idx = toolCallIndex++;\n responseHasToolCalls = true;\n\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: {\n tool_calls: [\n {\n index: idx,\n id: tcId,\n type: \"function\" as const,\n function: {\n name: fc.name,\n arguments: JSON.stringify(fc.args ?? {}),\n },\n },\n ],\n },\n finish_reason: null,\n },\n ],\n };\n }\n }\n }\n\n const finishReason = candidates[0].finishReason;\n if (finishReason && finishReason !== \"FINISH_REASON_UNSPECIFIED\") {\n let mapped: string;\n if (finishReason === \"STOP\") {\n mapped = responseHasToolCalls ? \"tool_calls\" : \"stop\";\n } else if (finishReason === \"MAX_TOKENS\") {\n mapped = \"length\";\n } else if (\n finishReason === \"SAFETY\" || finishReason === \"RECITATION\" ||\n finishReason === \"BLOCKLIST\" || finishReason === \"PROHIBITED_CONTENT\" ||\n finishReason === \"SPII\" || finishReason === \"MALFORMED_FUNCTION_CALL\"\n ) {\n mapped = \"content_filter\";\n } else {\n mapped = \"stop\";\n }\n\n finishReasonSeen = true;\n yield {\n id: chunkId,\n model,\n choices: [{ index: 0, delta: {}, finish_reason: mapped }],\n usage: lastUsage,\n };\n }\n }\n\n if (!finishReasonSeen && chunkIndex > 0) {\n throw new ChatStreamError(\"Gemini stream ended without finish reason\", {\n cause: new Error(\"incomplete_stream\"),\n });\n }\n } catch (err: unknown) {\n if (err instanceof ChatStreamError) throw err;\n const apiErr = err as { status?: number; statusCode?: number; code?: number };\n const status = apiErr.status ?? apiErr.statusCode ?? apiErr.code;\n throw new ChatStreamError(\n err instanceof Error ? err.message : String(err),\n {\n status: typeof status === \"number\" ? status : undefined,\n cause: err,\n },\n );\n }\n }\n\n private static contentPartsToGemini(parts: ContentPart[]): GeminiPart[] {\n return parts.map((part) => {\n if (part.type === \"text\") {\n return { text: part.text };\n }\n if (part.type === \"image\") {\n return { inlineData: { mimeType: part.media_type, data: part.data } };\n }\n // image_url — Gemini doesn't natively support URL references as inlineData;\n // pass it as text with the URL. Consumers should prefer base64 ImageContent.\n return { text: `[image: ${part.url}]` };\n });\n }\n\n private convertMessages(\n systemPrompt: string | undefined,\n messages: ChatMessage[],\n ): { contents: GeminiContent[]; systemInstruction: string | undefined } {\n const contents: GeminiContent[] = [];\n\n const toolCallIdToName = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n toolCallIdToName.set(tc.id, tc.function.name);\n }\n }\n }\n\n let pendingFunctionResponses: GeminiPart[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n continue;\n }\n\n if (msg.role === \"user\") {\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n pendingFunctionResponses = [];\n }\n if (Array.isArray(msg.content)) {\n const parts = GeminiProvider.contentPartsToGemini(msg.content as ContentPart[]);\n contents.push({ role: \"user\", parts });\n } else {\n contents.push({ role: \"user\", parts: [{ text: msg.content as string }] });\n }\n } else if (msg.role === \"assistant\") {\n const parts: GeminiPart[] = [];\n if (msg.thinking_content) {\n parts.push({ text: msg.thinking_content, thought: true });\n }\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n // malformed\n }\n parts.push({\n functionCall: { name: tc.function.name, args },\n });\n }\n }\n if (parts.length === 0) {\n parts.push({ text: \"\" });\n }\n contents.push({ role: \"model\", parts });\n } else if (msg.role === \"tool\") {\n const fnName =\n toolCallIdToName.get(msg.tool_call_id) ?? msg.tool_call_id;\n const resultValue = Array.isArray(msg.content)\n ? (msg.content as ContentPart[])\n .filter((p): p is Extract<ContentPart, { type: \"text\" }> => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : msg.content;\n pendingFunctionResponses.push({\n functionResponse: {\n name: fnName,\n response: { result: resultValue },\n },\n });\n }\n }\n\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n }\n\n return { contents, systemInstruction: systemPrompt };\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OpenAIProvider } from './openai.js';
|
|
2
|
+
import '../types-LrU4LRmX.js';
|
|
3
|
+
|
|
4
|
+
interface OllamaProviderOptions {
|
|
5
|
+
/** Ollama server URL. Defaults to http://localhost:11434/v1. */
|
|
6
|
+
baseURL?: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
}
|
|
9
|
+
declare class OllamaProvider extends OpenAIProvider {
|
|
10
|
+
constructor(opts?: OllamaProviderOptions);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { OllamaProvider, type OllamaProviderOptions };
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
OpenAIProvider
|
|
3
|
-
} from "
|
|
4
|
-
import "
|
|
3
|
+
} from "../chunk-CS6WNDCF.js";
|
|
4
|
+
import "../chunk-L3L3FG5T.js";
|
|
5
|
+
import "../chunk-DGUM43GV.js";
|
|
5
6
|
|
|
6
7
|
// src/providers/ollama.ts
|
|
7
8
|
var OllamaProvider = class extends OpenAIProvider {
|
|
8
9
|
constructor(opts = {}) {
|
|
9
10
|
super({
|
|
10
11
|
baseURL: opts.baseURL ?? "http://localhost:11434/v1",
|
|
11
|
-
model: opts.model ?? "qwen2.5-coder:32b"
|
|
12
|
+
model: opts.model ?? "qwen2.5-coder:32b",
|
|
13
|
+
compatMode: true
|
|
12
14
|
});
|
|
13
15
|
}
|
|
14
16
|
};
|
|
15
17
|
export {
|
|
16
18
|
OllamaProvider
|
|
17
19
|
};
|
|
18
|
-
//# sourceMappingURL=ollama
|
|
20
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/providers/ollama.ts"],"sourcesContent":["import { OpenAIProvider } from \"./openai.js\";\n\nexport interface OllamaProviderOptions {\n /** Ollama server URL. Defaults to http://localhost:11434/v1. */\n baseURL?: string;\n model?: string;\n}\n\nexport class OllamaProvider extends OpenAIProvider {\n constructor(opts: OllamaProviderOptions = {}) {\n super({\n baseURL: opts.baseURL ?? \"http://localhost:11434/v1\",\n model: opts.model ?? \"qwen2.5-coder:32b\",\n compatMode: true,\n });\n }\n}\n"],"mappings":";;;;;;;AAQO,IAAM,iBAAN,cAA6B,eAAe;AAAA,EACjD,YAAY,OAA8B,CAAC,GAAG;AAC5C,UAAM;AAAA,MACJ,SAAS,KAAK,WAAW;AAAA,MACzB,OAAO,KAAK,SAAS;AAAA,MACrB,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-
|
|
1
|
+
import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-LrU4LRmX.js';
|
|
2
2
|
|
|
3
3
|
interface OpenAIProviderOptions {
|
|
4
4
|
apiKey?: string;
|
|
5
5
|
baseURL?: string;
|
|
6
6
|
model?: string;
|
|
7
7
|
defaultHeaders?: Record<string, string | undefined>;
|
|
8
|
+
/** When true, omits `stream_options` that some OpenAI-compatible endpoints don't support. */
|
|
9
|
+
compatMode?: boolean;
|
|
8
10
|
}
|
|
9
11
|
declare class OpenAIProvider implements AIProvider {
|
|
10
12
|
private client;
|
|
11
13
|
private defaultModel;
|
|
14
|
+
protected compatMode: boolean;
|
|
12
15
|
constructor(opts: OpenAIProviderOptions);
|
|
13
16
|
chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
|
|
14
17
|
private static contentPartsToOpenAI;
|
package/dist/providers/openai.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/providers/openrouter.ts"],"sourcesContent":["import { OpenAIProvider } from \"./openai.js\";\n\nexport interface OpenRouterProviderOptions {\n apiKey: string;\n model?: string;\n /** Displayed on openrouter.ai rankings. Sent as the `X-Title` header. */\n appName?: string;\n /** Used for openrouter.ai rankings. Sent as the `HTTP-Referer` header. */\n appUrl?: string;\n}\n\nexport class OpenRouterProvider extends OpenAIProvider {\n constructor(opts: OpenRouterProviderOptions) {\n super({\n apiKey: opts.apiKey,\n baseURL: \"https://openrouter.ai/api/v1\",\n model: opts.model ?? \"anthropic/claude-opus-4.6\",\n defaultHeaders: {\n ...(opts.appName ? { \"X-Title\": opts.appName } : {}),\n ...(opts.appUrl ? { \"HTTP-Referer\": opts.appUrl } : {}),\n },\n });\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/providers/openrouter.ts"],"sourcesContent":["import { OpenAIProvider } from \"./openai.js\";\n\nexport interface OpenRouterProviderOptions {\n apiKey: string;\n model?: string;\n /** Displayed on openrouter.ai rankings. Sent as the `X-Title` header. */\n appName?: string;\n /** Used for openrouter.ai rankings. Sent as the `HTTP-Referer` header. */\n appUrl?: string;\n}\n\nexport class OpenRouterProvider extends OpenAIProvider {\n constructor(opts: OpenRouterProviderOptions) {\n super({\n apiKey: opts.apiKey,\n baseURL: \"https://openrouter.ai/api/v1\",\n model: opts.model ?? \"anthropic/claude-opus-4.6\",\n defaultHeaders: {\n ...(opts.appName ? { \"X-Title\": opts.appName } : {}),\n ...(opts.appUrl ? { \"HTTP-Referer\": opts.appUrl } : {}),\n },\n });\n }\n}\n"],"mappings":";;;;;;;AAWO,IAAM,qBAAN,cAAiC,eAAe;AAAA,EACrD,YAAY,MAAiC;AAC3C,UAAM;AAAA,MACJ,QAAQ,KAAK;AAAA,MACb,SAAS;AAAA,MACT,OAAO,KAAK,SAAS;AAAA,MACrB,gBAAgB;AAAA,QACd,GAAI,KAAK,UAAU,EAAE,WAAW,KAAK,QAAQ,IAAI,CAAC;AAAA,QAClD,GAAI,KAAK,SAAS,EAAE,gBAAgB,KAAK,OAAO,IAAI,CAAC;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-
|
|
2
|
-
import { C as CacheControlConfig } from '../cache-
|
|
1
|
+
import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-LrU4LRmX.js';
|
|
2
|
+
import { C as CacheControlConfig } from '../cache-DsRqxx6v.js';
|
|
3
3
|
|
|
4
4
|
interface VertexAnthropicProviderOptions {
|
|
5
5
|
/** GCP project ID. If omitted, inferred from application default credentials. */
|
|
@@ -16,6 +16,8 @@ interface VertexAnthropicProviderOptions {
|
|
|
16
16
|
model?: string;
|
|
17
17
|
/** Cache control config (same as AnthropicProvider). */
|
|
18
18
|
cacheControl?: CacheControlConfig;
|
|
19
|
+
/** Custom base URL for the Vertex API endpoint. */
|
|
20
|
+
baseURL?: string;
|
|
19
21
|
/**
|
|
20
22
|
* Pre-constructed AnthropicVertex client. When provided, all other
|
|
21
23
|
* connection options are ignored. Useful for testing or advanced setups.
|
package/dist/providers/vertex.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
streamAnthropicChat
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-EKOGVTBT.js";
|
|
4
|
+
import "../chunk-HEQQQGK5.js";
|
|
5
|
+
import "../chunk-L3L3FG5T.js";
|
|
5
6
|
import {
|
|
6
7
|
__require
|
|
7
8
|
} from "../chunk-DGUM43GV.js";
|
|
@@ -41,9 +42,11 @@ var VertexAnthropicProvider = class {
|
|
|
41
42
|
}
|
|
42
43
|
const args = {
|
|
43
44
|
region: opts.region ?? "us-east5",
|
|
44
|
-
googleAuth
|
|
45
|
+
googleAuth,
|
|
46
|
+
maxRetries: 0
|
|
45
47
|
};
|
|
46
48
|
if (opts.projectId) args.projectId = opts.projectId;
|
|
49
|
+
if (opts.baseURL) args.baseURL = opts.baseURL;
|
|
47
50
|
this.client = new AnthropicVertex(args);
|
|
48
51
|
}
|
|
49
52
|
this.defaultModel = opts.model ?? "claude-opus-4.6";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/providers/vertex.ts"],"sourcesContent":["import type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { CacheControlConfig } from \"./cache.js\";\nimport { streamAnthropicChat, type AnthropicStreamClient } from \"./anthropic-shared.js\";\n\nexport interface VertexAnthropicProviderOptions {\n /** GCP project ID. If omitted, inferred from application default credentials. */\n projectId?: string;\n /** GCP region (default: us-east5). */\n region?: string;\n /**\n * A `GoogleAuth` instance or any object with a compatible `getClient()` method.\n * If omitted, the provider creates one using application default credentials.\n * Requires `google-auth-library` as a peer dependency.\n */\n googleAuth?: unknown;\n /** Model ID in Vertex format (default: claude-opus-4.6). */\n model?: string;\n /** Cache control config (same as AnthropicProvider). */\n cacheControl?: CacheControlConfig;\n /**\n * Pre-constructed AnthropicVertex client. When provided, all other\n * connection options are ignored. Useful for testing or advanced setups.\n */\n client?: unknown;\n}\n\n/**\n * Anthropic provider routed through Google Cloud Vertex AI.\n *\n * Requires `@anthropic-ai/vertex-sdk` as an optional peer dependency.\n * If `googleAuth` is not provided, also requires `google-auth-library`.\n * Install with: `pnpm add @anthropic-ai/vertex-sdk google-auth-library`\n */\nexport class VertexAnthropicProvider implements AIProvider {\n private client: AnthropicStreamClient;\n private defaultModel: string;\n private cacheConfig: CacheControlConfig | undefined;\n\n constructor(opts: VertexAnthropicProviderOptions) {\n if (opts.client) {\n this.client = opts.client as AnthropicStreamClient;\n } else {\n let AnthropicVertex: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n AnthropicVertex = require(\"@anthropic-ai/vertex-sdk\").AnthropicVertex;\n } catch {\n throw new Error(\n \"VertexAnthropicProvider requires @anthropic-ai/vertex-sdk. \" +\n \"Install it with: pnpm add @anthropic-ai/vertex-sdk\",\n );\n }\n\n let googleAuth = opts.googleAuth;\n if (!googleAuth) {\n let GoogleAuth: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n GoogleAuth = require(\"google-auth-library\").GoogleAuth;\n } catch {\n throw new Error(\n \"VertexAnthropicProvider requires google-auth-library when googleAuth is not provided. \" +\n \"Install it with: pnpm add google-auth-library\",\n );\n }\n const authArgs: Record<string, unknown> = {\n scopes: [\"https://www.googleapis.com/auth/cloud-platform\"],\n };\n if (opts.projectId) authArgs.projectId = opts.projectId;\n googleAuth = new GoogleAuth(authArgs);\n }\n\n const args: Record<string, unknown> = {\n region: opts.region ?? \"us-east5\",\n googleAuth,\n };\n if (opts.projectId) args.projectId = opts.projectId;\n\n this.client = new AnthropicVertex(args) as unknown as AnthropicStreamClient;\n }\n\n this.defaultModel = opts.model ?? \"claude-opus-4.6\";\n this.cacheConfig = opts.cacheControl;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n yield* streamAnthropicChat(\n this.client,\n params,\n this.defaultModel,\n this.cacheConfig,\n );\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/providers/vertex.ts"],"sourcesContent":["import type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { CacheControlConfig } from \"./cache.js\";\nimport { streamAnthropicChat, type AnthropicStreamClient } from \"./anthropic-shared.js\";\n\nexport interface VertexAnthropicProviderOptions {\n /** GCP project ID. If omitted, inferred from application default credentials. */\n projectId?: string;\n /** GCP region (default: us-east5). */\n region?: string;\n /**\n * A `GoogleAuth` instance or any object with a compatible `getClient()` method.\n * If omitted, the provider creates one using application default credentials.\n * Requires `google-auth-library` as a peer dependency.\n */\n googleAuth?: unknown;\n /** Model ID in Vertex format (default: claude-opus-4.6). */\n model?: string;\n /** Cache control config (same as AnthropicProvider). */\n cacheControl?: CacheControlConfig;\n /** Custom base URL for the Vertex API endpoint. */\n baseURL?: string;\n /**\n * Pre-constructed AnthropicVertex client. When provided, all other\n * connection options are ignored. Useful for testing or advanced setups.\n */\n client?: unknown;\n}\n\n/**\n * Anthropic provider routed through Google Cloud Vertex AI.\n *\n * Requires `@anthropic-ai/vertex-sdk` as an optional peer dependency.\n * If `googleAuth` is not provided, also requires `google-auth-library`.\n * Install with: `pnpm add @anthropic-ai/vertex-sdk google-auth-library`\n */\nexport class VertexAnthropicProvider implements AIProvider {\n private client: AnthropicStreamClient;\n private defaultModel: string;\n private cacheConfig: CacheControlConfig | undefined;\n\n constructor(opts: VertexAnthropicProviderOptions) {\n if (opts.client) {\n this.client = opts.client as AnthropicStreamClient;\n } else {\n let AnthropicVertex: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n AnthropicVertex = require(\"@anthropic-ai/vertex-sdk\").AnthropicVertex;\n } catch {\n throw new Error(\n \"VertexAnthropicProvider requires @anthropic-ai/vertex-sdk. \" +\n \"Install it with: pnpm add @anthropic-ai/vertex-sdk\",\n );\n }\n\n let googleAuth = opts.googleAuth;\n if (!googleAuth) {\n let GoogleAuth: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n GoogleAuth = require(\"google-auth-library\").GoogleAuth;\n } catch {\n throw new Error(\n \"VertexAnthropicProvider requires google-auth-library when googleAuth is not provided. \" +\n \"Install it with: pnpm add google-auth-library\",\n );\n }\n const authArgs: Record<string, unknown> = {\n scopes: [\"https://www.googleapis.com/auth/cloud-platform\"],\n };\n if (opts.projectId) authArgs.projectId = opts.projectId;\n googleAuth = new GoogleAuth(authArgs);\n }\n\n const args: Record<string, unknown> = {\n region: opts.region ?? \"us-east5\",\n googleAuth,\n maxRetries: 0,\n };\n if (opts.projectId) args.projectId = opts.projectId;\n if (opts.baseURL) args.baseURL = opts.baseURL;\n\n this.client = new AnthropicVertex(args) as unknown as AnthropicStreamClient;\n }\n\n this.defaultModel = opts.model ?? \"claude-opus-4.6\";\n this.cacheConfig = opts.cacheControl;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n yield* streamAnthropicChat(\n this.client,\n params,\n this.defaultModel,\n this.cacheConfig,\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAuCO,IAAM,0BAAN,MAAoD;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAsC;AAChD,QAAI,KAAK,QAAQ;AACf,WAAK,SAAS,KAAK;AAAA,IACrB,OAAO;AACL,UAAI;AACJ,UAAI;AAEF,0BAAkB,UAAQ,0BAA0B,EAAE;AAAA,MACxD,QAAQ;AACN,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AAEA,UAAI,aAAa,KAAK;AACtB,UAAI,CAAC,YAAY;AACf,YAAI;AACJ,YAAI;AAEF,uBAAa,UAAQ,qBAAqB,EAAE;AAAA,QAC9C,QAAQ;AACN,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AACA,cAAM,WAAoC;AAAA,UACxC,QAAQ,CAAC,gDAAgD;AAAA,QAC3D;AACA,YAAI,KAAK,UAAW,UAAS,YAAY,KAAK;AAC9C,qBAAa,IAAI,WAAW,QAAQ;AAAA,MACtC;AAEA,YAAM,OAAgC;AAAA,QACpC,QAAQ,KAAK,UAAU;AAAA,QACvB;AAAA,QACA,YAAY;AAAA,MACd;AACA,UAAI,KAAK,UAAW,MAAK,YAAY,KAAK;AAC1C,UAAI,KAAK,QAAS,MAAK,UAAU,KAAK;AAEtC,WAAK,SAAS,IAAI,gBAAgB,IAAI;AAAA,IACxC;AAEA,SAAK,eAAe,KAAK,SAAS;AAClC,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
SUPPORTED_PROVIDERS,
|
|
4
4
|
detectProvider,
|
|
5
5
|
resolveProvider
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-5JN4SPI7.js";
|
|
7
7
|
import "./chunk-DGUM43GV.js";
|
|
8
8
|
export {
|
|
9
9
|
DEFAULT_MODELS,
|
|
@@ -11,4 +11,4 @@ export {
|
|
|
11
11
|
detectProvider,
|
|
12
12
|
resolveProvider
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=resolve-
|
|
14
|
+
//# sourceMappingURL=resolve-4JA2BBDA.js.map
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,14 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { A as Agent } from '../agent-
|
|
3
|
-
import '../types-
|
|
4
|
-
import '../types-
|
|
5
|
-
import '../types-
|
|
6
|
-
import '../cache-
|
|
1
|
+
import { ServerResponse, IncomingMessage } from 'node:http';
|
|
2
|
+
import { A as Agent } from '../agent-1nFVUP9E.js';
|
|
3
|
+
import { S as StreamEvent } from '../types-LrU4LRmX.js';
|
|
4
|
+
import { P as PermissionResponse } from '../types-CD0rUKKT.js';
|
|
5
|
+
import '../types-RPKUTu1k.js';
|
|
6
|
+
import '../cache-DsRqxx6v.js';
|
|
7
7
|
import '../types-2kTLUCnD.js';
|
|
8
8
|
import '@modelcontextprotocol/sdk/client/index.js';
|
|
9
9
|
import '@modelcontextprotocol/sdk/client/auth.js';
|
|
10
10
|
import '@modelcontextprotocol/sdk/shared/auth.js';
|
|
11
11
|
|
|
12
|
+
interface PromiseResolver<T> {
|
|
13
|
+
resolve: (value: T) => void;
|
|
14
|
+
reject: (err: Error) => void;
|
|
15
|
+
}
|
|
16
|
+
interface BufferedEvent {
|
|
17
|
+
seq: number;
|
|
18
|
+
event: StreamEvent;
|
|
19
|
+
}
|
|
20
|
+
interface SessionState {
|
|
21
|
+
id: string;
|
|
22
|
+
abortController: AbortController;
|
|
23
|
+
pendingPermission: PromiseResolver<PermissionResponse> | null;
|
|
24
|
+
pendingInput: PromiseResolver<string> | null;
|
|
25
|
+
pendingPermissionTimer: ReturnType<typeof setTimeout> | null;
|
|
26
|
+
pendingInputTimer: ReturnType<typeof setTimeout> | null;
|
|
27
|
+
lastActivity: number;
|
|
28
|
+
sseResponse: ServerResponse | null;
|
|
29
|
+
sseKeepaliveTimer: ReturnType<typeof setInterval> | null;
|
|
30
|
+
eventBuffer: BufferedEvent[];
|
|
31
|
+
sequenceNum: number;
|
|
32
|
+
done: boolean;
|
|
33
|
+
cwd?: string;
|
|
34
|
+
}
|
|
35
|
+
interface ConnectionOverrides {
|
|
36
|
+
cwd?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
12
39
|
type MaybePromise<T> = T | Promise<T>;
|
|
13
40
|
interface ServerOptions {
|
|
14
41
|
port: number;
|
|
@@ -55,9 +82,7 @@ interface ConnectionInfo {
|
|
|
55
82
|
auth: AuthResult;
|
|
56
83
|
remoteAddress?: string;
|
|
57
84
|
}
|
|
58
|
-
|
|
59
|
-
cwd?: string;
|
|
60
|
-
}
|
|
85
|
+
|
|
61
86
|
declare class NoumenServer {
|
|
62
87
|
private code;
|
|
63
88
|
private options;
|
|
@@ -92,20 +117,10 @@ declare class NoumenServer {
|
|
|
92
117
|
private handleSendMessage;
|
|
93
118
|
private handleDeleteSession;
|
|
94
119
|
private handleWsConnection;
|
|
95
|
-
private handleWsMessage;
|
|
96
|
-
private createSessionState;
|
|
97
120
|
private makeThread;
|
|
98
121
|
private runAgentSse;
|
|
99
122
|
private runAgentWs;
|
|
100
|
-
private emitSseEvent;
|
|
101
|
-
private bridgePermission;
|
|
102
|
-
private bridgeUserInput;
|
|
103
123
|
private startSseKeepalive;
|
|
104
|
-
private clearSseKeepalive;
|
|
105
|
-
private clearPendingPermissionTimer;
|
|
106
|
-
private clearPendingInputTimer;
|
|
107
|
-
private destroySession;
|
|
108
|
-
private reapIdleSessions;
|
|
109
124
|
private resolveConnectionOverrides;
|
|
110
125
|
}
|
|
111
126
|
declare function createServer(code: Agent, options: ServerOptions): NoumenServer;
|
|
@@ -125,4 +140,4 @@ declare function createServer(code: Agent, options: ServerOptions): NoumenServer
|
|
|
125
140
|
*/
|
|
126
141
|
declare function createRequestHandler(code: Agent, options?: RequestHandlerOptions): (req: IncomingMessage, res: ServerResponse) => void;
|
|
127
142
|
|
|
128
|
-
export { type AuthConfig, type AuthResult, type ConnectionInfo, type ConnectionOverrides, NoumenServer, type RequestHandlerOptions, type ServerOptions, createRequestHandler, createServer };
|
|
143
|
+
export { type AuthConfig, type AuthResult, type BufferedEvent, type ConnectionInfo, type ConnectionOverrides, NoumenServer, type PromiseResolver, type RequestHandlerOptions, type ServerOptions, type SessionState, createRequestHandler, createServer };
|