aemeathcli 1.0.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 +607 -0
- package/dist/App-P4MYD4QY.js +2719 -0
- package/dist/App-P4MYD4QY.js.map +1 -0
- package/dist/api-key-fallback-YQQBOQIL.js +11 -0
- package/dist/api-key-fallback-YQQBOQIL.js.map +1 -0
- package/dist/chunk-4IJD72YB.js +184 -0
- package/dist/chunk-4IJD72YB.js.map +1 -0
- package/dist/chunk-6PDJ45T4.js +325 -0
- package/dist/chunk-6PDJ45T4.js.map +1 -0
- package/dist/chunk-CARHU3DO.js +562 -0
- package/dist/chunk-CARHU3DO.js.map +1 -0
- package/dist/chunk-CGEV3ARR.js +80 -0
- package/dist/chunk-CGEV3ARR.js.map +1 -0
- package/dist/chunk-CS5X3BWX.js +27 -0
- package/dist/chunk-CS5X3BWX.js.map +1 -0
- package/dist/chunk-CYQNBB25.js +44 -0
- package/dist/chunk-CYQNBB25.js.map +1 -0
- package/dist/chunk-DAHGLHNR.js +657 -0
- package/dist/chunk-DAHGLHNR.js.map +1 -0
- package/dist/chunk-H66O5Z2V.js +305 -0
- package/dist/chunk-H66O5Z2V.js.map +1 -0
- package/dist/chunk-HCIHOHLX.js +322 -0
- package/dist/chunk-HCIHOHLX.js.map +1 -0
- package/dist/chunk-HMJRPNPZ.js +1031 -0
- package/dist/chunk-HMJRPNPZ.js.map +1 -0
- package/dist/chunk-I5PZ4JTS.js +119 -0
- package/dist/chunk-I5PZ4JTS.js.map +1 -0
- package/dist/chunk-IYW62KKR.js +255 -0
- package/dist/chunk-IYW62KKR.js.map +1 -0
- package/dist/chunk-JAXXTYID.js +51 -0
- package/dist/chunk-JAXXTYID.js.map +1 -0
- package/dist/chunk-LSOYPSAT.js +183 -0
- package/dist/chunk-LSOYPSAT.js.map +1 -0
- package/dist/chunk-MFBHNWGV.js +416 -0
- package/dist/chunk-MFBHNWGV.js.map +1 -0
- package/dist/chunk-MXZSI3AY.js +311 -0
- package/dist/chunk-MXZSI3AY.js.map +1 -0
- package/dist/chunk-NBR3GHMT.js +72 -0
- package/dist/chunk-NBR3GHMT.js.map +1 -0
- package/dist/chunk-O3ZF22SW.js +246 -0
- package/dist/chunk-O3ZF22SW.js.map +1 -0
- package/dist/chunk-SUSJPZU2.js +181 -0
- package/dist/chunk-SUSJPZU2.js.map +1 -0
- package/dist/chunk-TEVZS4FA.js +310 -0
- package/dist/chunk-TEVZS4FA.js.map +1 -0
- package/dist/chunk-UY2SYSEZ.js +211 -0
- package/dist/chunk-UY2SYSEZ.js.map +1 -0
- package/dist/chunk-WAHVZH7V.js +260 -0
- package/dist/chunk-WAHVZH7V.js.map +1 -0
- package/dist/chunk-WPP3PEDE.js +234 -0
- package/dist/chunk-WPP3PEDE.js.map +1 -0
- package/dist/chunk-Y5XVD2CD.js +1610 -0
- package/dist/chunk-Y5XVD2CD.js.map +1 -0
- package/dist/chunk-YL5XFHR3.js +56 -0
- package/dist/chunk-YL5XFHR3.js.map +1 -0
- package/dist/chunk-ZGOHARPV.js +122 -0
- package/dist/chunk-ZGOHARPV.js.map +1 -0
- package/dist/claude-adapter-QMLFMSP3.js +6 -0
- package/dist/claude-adapter-QMLFMSP3.js.map +1 -0
- package/dist/claude-login-5WELXPKT.js +324 -0
- package/dist/claude-login-5WELXPKT.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +703 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-login-7HHLJHBF.js +164 -0
- package/dist/codex-login-7HHLJHBF.js.map +1 -0
- package/dist/config-store-W6FBCQAQ.js +6 -0
- package/dist/config-store-W6FBCQAQ.js.map +1 -0
- package/dist/executor-6RIKIGXK.js +4 -0
- package/dist/executor-6RIKIGXK.js.map +1 -0
- package/dist/gemini-adapter-6JIHZ7WI.js +6 -0
- package/dist/gemini-adapter-6JIHZ7WI.js.map +1 -0
- package/dist/gemini-login-ZZLYC3J6.js +346 -0
- package/dist/gemini-login-ZZLYC3J6.js.map +1 -0
- package/dist/index.d.ts +2210 -0
- package/dist/index.js +1419 -0
- package/dist/index.js.map +1 -0
- package/dist/kimi-adapter-JN4HFFHU.js +6 -0
- package/dist/kimi-adapter-JN4HFFHU.js.map +1 -0
- package/dist/kimi-login-CZPS63NK.js +149 -0
- package/dist/kimi-login-CZPS63NK.js.map +1 -0
- package/dist/native-cli-adapters-OLW3XX57.js +6 -0
- package/dist/native-cli-adapters-OLW3XX57.js.map +1 -0
- package/dist/ollama-adapter-OJQ3FKWK.js +6 -0
- package/dist/ollama-adapter-OJQ3FKWK.js.map +1 -0
- package/dist/openai-adapter-XU46EN7B.js +6 -0
- package/dist/openai-adapter-XU46EN7B.js.map +1 -0
- package/dist/registry-4KD24ZC3.js +6 -0
- package/dist/registry-4KD24ZC3.js.map +1 -0
- package/dist/registry-H7B3AHPQ.js +5 -0
- package/dist/registry-H7B3AHPQ.js.map +1 -0
- package/dist/server-manager-PTGBHCLS.js +5 -0
- package/dist/server-manager-PTGBHCLS.js.map +1 -0
- package/dist/session-manager-ECEEACGY.js +12 -0
- package/dist/session-manager-ECEEACGY.js.map +1 -0
- package/dist/team-manager-HC4XGCFY.js +11 -0
- package/dist/team-manager-HC4XGCFY.js.map +1 -0
- package/dist/tmux-manager-GPYZ3WQH.js +6 -0
- package/dist/tmux-manager-GPYZ3WQH.js.map +1 -0
- package/dist/tools-TSMXMHIF.js +6 -0
- package/dist/tools-TSMXMHIF.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mcp/client.ts","../src/mcp/server-manager.ts"],"names":[],"mappings":"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","file":"chunk-MFBHNWGV.js","sourcesContent":["/**\n * MCP client per PRD section 11.1\n * Wraps @modelcontextprotocol/sdk Client with typed, transport-agnostic interface.\n * Supports stdio (local servers) and Streamable HTTP (remote servers).\n */\n\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { ServerConnectionError, ToolCallError } from \"../types/errors.js\";\n\n// ── Exported Types ──────────────────────────────────────────────────────\n\nexport interface IMCPToolSchema {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: Readonly<Record<string, unknown>>;\n}\n\nexport interface IMCPCallResult {\n readonly content: string;\n readonly isError: boolean;\n}\n\nexport interface IMCPResource {\n readonly uri: string;\n readonly name: string;\n readonly description: string;\n readonly mimeType: string;\n}\n\n// ── Transport Configuration ─────────────────────────────────────────────\n\nexport interface IStdioTransportConfig {\n readonly type: \"stdio\";\n readonly command: string;\n readonly args: readonly string[];\n readonly env?: Readonly<Record<string, string>>;\n}\n\nexport interface IHttpTransportConfig {\n readonly type: \"streamable-http\";\n readonly url: string;\n}\n\nexport type MCPTransportConfig = IStdioTransportConfig | IHttpTransportConfig;\n\n// ── Client Options ──────────────────────────────────────────────────────\n\nexport interface IMCPClientOptions {\n readonly serverName: string;\n readonly transport: MCPTransportConfig;\n readonly connectionTimeoutMs?: number;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst CLIENT_NAME = \"aemeathcli\";\nconst CLIENT_VERSION = \"1.0.0\";\n\n// ── Content Helpers ─────────────────────────────────────────────────────\n\ninterface IContentItem {\n readonly type: string;\n readonly text?: string;\n}\n\nfunction extractText(content: unknown): string {\n if (!Array.isArray(content)) {\n return \"No output\";\n }\n const parts: string[] = [];\n for (const item of content as ReadonlyArray<IContentItem>) {\n if (item.type === \"text\" && typeof item.text === \"string\") {\n parts.push(item.text);\n }\n }\n return parts.length > 0 ? parts.join(\"\\n\") : \"No output\";\n}\n\n// ── MCPClient ───────────────────────────────────────────────────────────\n\nexport class MCPClient {\n private client: Client | undefined;\n private connected = false;\n private readonly serverName: string;\n private readonly transportConfig: MCPTransportConfig;\n private readonly connectionTimeoutMs: number;\n\n constructor(options: IMCPClientOptions) {\n this.serverName = options.serverName;\n this.transportConfig = options.transport;\n this.connectionTimeoutMs = options.connectionTimeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n get isConnected(): boolean {\n return this.connected;\n }\n\n get name(): string {\n return this.serverName;\n }\n\n /** Establish connection to the MCP server. */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n logger.info({ server: this.serverName }, \"Connecting to MCP server\");\n\n try {\n this.client = new Client(\n { name: CLIENT_NAME, version: CLIENT_VERSION },\n { capabilities: { sampling: {} } },\n );\n\n await this.connectWithTimeout();\n this.connected = true;\n logger.info({ server: this.serverName }, \"Connected to MCP server\");\n } catch (error: unknown) {\n this.connected = false;\n this.client = undefined;\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(this.serverName, msg);\n }\n }\n\n /** Gracefully close the MCP connection. */\n async disconnect(): Promise<void> {\n if (!this.connected || !this.client) {\n return;\n }\n\n logger.info({ server: this.serverName }, \"Disconnecting from MCP server\");\n\n try {\n await this.client.close();\n } catch (error: unknown) {\n logger.warn({ server: this.serverName, error }, \"Error during MCP disconnect\");\n } finally {\n this.connected = false;\n this.client = undefined;\n }\n }\n\n /** Disconnect then reconnect to the server. */\n async reconnect(): Promise<void> {\n await this.disconnect();\n await this.connect();\n }\n\n /** List all tools exposed by this MCP server. */\n async listTools(): Promise<readonly IMCPToolSchema[]> {\n const client = this.requireConnected();\n\n try {\n const result = await client.listTools();\n return result.tools.map((tool) => ({\n name: tool.name,\n description: tool.description ?? \"\",\n inputSchema: (tool.inputSchema ?? {}) as Readonly<Record<string, unknown>>,\n }));\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(this.serverName, `listTools failed: ${msg}`);\n }\n }\n\n /** Call a tool on this MCP server with the given arguments. */\n async callTool(\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<IMCPCallResult> {\n const client = this.requireConnected();\n\n try {\n const result = await client.callTool({ name: toolName, arguments: args });\n return {\n content: extractText(result.content),\n isError: result.isError === true,\n };\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ToolCallError(toolName, msg);\n }\n }\n\n /** List resources exposed by this MCP server. */\n async listResources(): Promise<readonly IMCPResource[]> {\n const client = this.requireConnected();\n\n try {\n const result = await client.listResources();\n return result.resources.map((r) => ({\n uri: r.uri,\n name: r.name ?? r.uri,\n description: \"\",\n mimeType: r.mimeType ?? \"application/octet-stream\",\n }));\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(\n this.serverName,\n `listResources failed: ${msg}`,\n );\n }\n }\n\n /** Read a specific resource by URI. */\n async readResource(uri: string): Promise<string> {\n const client = this.requireConnected();\n\n try {\n const result = await client.readResource({ uri });\n return extractText(result.contents);\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(\n this.serverName,\n `readResource(${uri}) failed: ${msg}`,\n );\n }\n }\n\n // ── Private Helpers ─────────────────────────────────────────────────\n\n private async connectWithTimeout(): Promise<void> {\n const client = this.client;\n if (!client) {\n throw new Error(\"Client not initialised\");\n }\n\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\n setTimeout(\n () =>\n reject(\n new Error(\n `Connection timed out after ${this.connectionTimeoutMs}ms`,\n ),\n ),\n this.connectionTimeoutMs,\n );\n });\n\n if (this.transportConfig.type === \"stdio\") {\n const transport = new StdioClientTransport({\n command: this.transportConfig.command,\n args: [...this.transportConfig.args],\n ...(this.transportConfig.env !== undefined\n ? { env: { ...this.transportConfig.env } }\n : {}),\n });\n await Promise.race([client.connect(transport), timeoutPromise]);\n return;\n }\n\n if (this.transportConfig.type === \"streamable-http\") {\n const { StreamableHTTPClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\n );\n const transport = new StreamableHTTPClientTransport(\n new URL(this.transportConfig.url),\n );\n await Promise.race([client.connect(transport as Transport), timeoutPromise]);\n return;\n }\n\n // Exhaustiveness guard\n const _exhaustive: never = this.transportConfig;\n throw new ServerConnectionError(\n this.serverName,\n `Unknown transport type: ${JSON.stringify(_exhaustive)}`,\n );\n }\n\n private requireConnected(): Client {\n if (!this.connected || !this.client) {\n throw new ServerConnectionError(this.serverName, \"Not connected\");\n }\n return this.client;\n }\n}\n","/**\n * MCP server lifecycle manager per PRD section 11.1\n * Manages multiple MCP server connections: start, stop, health-check, restart, rate-limit.\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport { ServerConnectionError } from \"../types/errors.js\";\nimport { MCPClient } from \"./client.js\";\nimport type { IMCPClientOptions, IMCPToolSchema, IStdioTransportConfig } from \"./client.js\";\nimport type { IMCPConfig, IMCPServerConfig } from \"../types/config.js\";\n\n// ── Server State ────────────────────────────────────────────────────────\n\ntype ServerStatus = \"stopped\" | \"connecting\" | \"connected\" | \"error\";\n\ninterface IServerEntry {\n readonly client: MCPClient;\n status: ServerStatus;\n lastHealthCheck: number;\n consecutiveFailures: number;\n readonly rateLimit: IRateLimitState;\n}\n\n// ── Rate Limiting ───────────────────────────────────────────────────────\n\ninterface IRateLimitState {\n callTimestamps: number[];\n maxCallsPerMinute: number;\n}\n\nexport interface IRateLimitConfig {\n readonly maxCallsPerMinute: number;\n}\n\n// ── Manager Options ─────────────────────────────────────────────────────\n\nexport interface IServerManagerOptions {\n readonly connectionTimeoutMs?: number;\n readonly healthCheckIntervalMs?: number;\n readonly maxConsecutiveFailures?: number;\n readonly defaultRateLimit?: IRateLimitConfig | undefined;\n readonly rateLimits?: Readonly<Record<string, IRateLimitConfig>> | undefined;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst DEFAULT_HEALTH_INTERVAL_MS = 60_000;\nconst DEFAULT_MAX_FAILURES = 3;\nconst DEFAULT_MAX_CALLS_PER_MINUTE = 60;\nconst RATE_LIMIT_WINDOW_MS = 60_000;\n\n// ── MCPServerManager ────────────────────────────────────────────────────\n\nexport class MCPServerManager {\n private readonly servers = new Map<string, IServerEntry>();\n private readonly options: Required<\n Pick<IServerManagerOptions, \"connectionTimeoutMs\" | \"healthCheckIntervalMs\" | \"maxConsecutiveFailures\">\n > & Pick<IServerManagerOptions, \"defaultRateLimit\" | \"rateLimits\">;\n private healthCheckTimer: ReturnType<typeof setInterval> | undefined;\n\n constructor(options?: IServerManagerOptions) {\n this.options = {\n connectionTimeoutMs: options?.connectionTimeoutMs ?? 30_000,\n healthCheckIntervalMs: options?.healthCheckIntervalMs ?? DEFAULT_HEALTH_INTERVAL_MS,\n maxConsecutiveFailures: options?.maxConsecutiveFailures ?? DEFAULT_MAX_FAILURES,\n defaultRateLimit: options?.defaultRateLimit,\n rateLimits: options?.rateLimits,\n };\n }\n\n /** Start all servers defined in the MCP config. */\n async startAll(config: IMCPConfig): Promise<void> {\n const entries = Object.entries(config.mcpServers);\n if (entries.length === 0) {\n logger.info(\"No MCP servers configured\");\n return;\n }\n\n logger.info({ count: entries.length }, \"Starting MCP servers\");\n\n const results = await Promise.allSettled(\n entries.map(([name, serverConfig]) => this.startServer(name, serverConfig)),\n );\n\n let successCount = 0;\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n successCount++;\n }\n }\n\n logger.info(\n { total: entries.length, connected: successCount },\n \"MCP server startup complete\",\n );\n\n this.startHealthChecks();\n }\n\n /** Start a single MCP server by name and config. */\n async startServer(name: string, serverConfig: IMCPServerConfig): Promise<void> {\n if (this.servers.has(name)) {\n logger.warn({ server: name }, \"MCP server already registered, stopping first\");\n await this.stopServer(name);\n }\n\n logger.info({ server: name, command: serverConfig.command }, \"Starting MCP server\");\n\n const transportConfig: IStdioTransportConfig = {\n type: \"stdio\",\n command: serverConfig.command,\n args: [...serverConfig.args],\n ...(serverConfig.env !== undefined ? { env: { ...serverConfig.env } } : {}),\n };\n\n const clientOptions: IMCPClientOptions = {\n serverName: name,\n transport: transportConfig,\n connectionTimeoutMs: this.options.connectionTimeoutMs,\n };\n\n const client = new MCPClient(clientOptions);\n const maxCalls = this.getMaxCallsPerMinute(name);\n\n const entry: IServerEntry = {\n client,\n status: \"connecting\",\n lastHealthCheck: Date.now(),\n consecutiveFailures: 0,\n rateLimit: { callTimestamps: [], maxCallsPerMinute: maxCalls },\n };\n\n this.servers.set(name, entry);\n\n try {\n await client.connect();\n entry.status = \"connected\";\n logger.info({ server: name }, \"MCP server connected\");\n } catch (error: unknown) {\n entry.status = \"error\";\n entry.consecutiveFailures = 1;\n const msg = error instanceof Error ? error.message : String(error);\n logger.error({ server: name, error: msg }, \"Failed to start MCP server\");\n throw new ServerConnectionError(name, msg);\n }\n }\n\n /** Stop a single server by name. */\n async stopServer(name: string): Promise<void> {\n const entry = this.servers.get(name);\n if (!entry) {\n return;\n }\n\n logger.info({ server: name }, \"Stopping MCP server\");\n\n try {\n await entry.client.disconnect();\n } catch (error: unknown) {\n logger.warn({ server: name, error }, \"Error stopping MCP server\");\n }\n\n entry.status = \"stopped\";\n this.servers.delete(name);\n }\n\n /** Stop all managed servers and clean up. */\n async stopAll(): Promise<void> {\n this.stopHealthChecks();\n\n const names = [...this.servers.keys()];\n logger.info({ count: names.length }, \"Stopping all MCP servers\");\n\n await Promise.allSettled(names.map((name) => this.stopServer(name)));\n }\n\n /** Get a connected client by server name. */\n getClient(name: string): MCPClient | undefined {\n const entry = this.servers.get(name);\n if (!entry || entry.status !== \"connected\") {\n return undefined;\n }\n return entry.client;\n }\n\n /** Get all connected server names. */\n getConnectedServers(): readonly string[] {\n const connected: string[] = [];\n for (const [name, entry] of this.servers) {\n if (entry.status === \"connected\") {\n connected.push(name);\n }\n }\n return connected;\n }\n\n /** Get the status of a server. */\n getServerStatus(name: string): ServerStatus | undefined {\n return this.servers.get(name)?.status;\n }\n\n /** List tools from a specific server (with rate-limit check). */\n async listServerTools(name: string): Promise<readonly IMCPToolSchema[]> {\n const entry = this.requireServer(name);\n this.checkRateLimit(entry, name);\n return entry.client.listTools();\n }\n\n /** Check rate limit before allowing a call to the given server. Throws on exceeded. */\n checkRateLimitFor(name: string): void {\n const entry = this.requireServer(name);\n this.checkRateLimit(entry, name);\n }\n\n /** Record a tool call for rate-limiting purposes. */\n recordCall(name: string): void {\n const entry = this.servers.get(name);\n if (entry) {\n entry.rateLimit.callTimestamps.push(Date.now());\n }\n }\n\n // ── Health Checking ─────────────────────────────────────────────────\n\n private startHealthChecks(): void {\n this.stopHealthChecks();\n\n this.healthCheckTimer = setInterval(() => {\n void this.runHealthChecks();\n }, this.options.healthCheckIntervalMs);\n\n // Prevent the timer from keeping the process alive\n if (typeof this.healthCheckTimer === \"object\" && \"unref\" in this.healthCheckTimer) {\n this.healthCheckTimer.unref();\n }\n }\n\n private stopHealthChecks(): void {\n if (this.healthCheckTimer !== undefined) {\n clearInterval(this.healthCheckTimer);\n this.healthCheckTimer = undefined;\n }\n }\n\n private async runHealthChecks(): Promise<void> {\n for (const [name, entry] of this.servers) {\n if (entry.status === \"stopped\") {\n continue;\n }\n\n try {\n await entry.client.listTools();\n entry.status = \"connected\";\n entry.consecutiveFailures = 0;\n entry.lastHealthCheck = Date.now();\n } catch {\n entry.consecutiveFailures++;\n entry.status = \"error\";\n logger.warn(\n { server: name, failures: entry.consecutiveFailures },\n \"MCP health check failed\",\n );\n\n if (entry.consecutiveFailures >= this.options.maxConsecutiveFailures) {\n logger.info({ server: name }, \"Attempting MCP server restart\");\n void this.restartServer(name, entry);\n }\n }\n }\n }\n\n private async restartServer(name: string, entry: IServerEntry): Promise<void> {\n try {\n await entry.client.reconnect();\n entry.status = \"connected\";\n entry.consecutiveFailures = 0;\n logger.info({ server: name }, \"MCP server restarted successfully\");\n } catch (error: unknown) {\n entry.status = \"error\";\n const msg = error instanceof Error ? error.message : String(error);\n logger.error({ server: name, error: msg }, \"MCP server restart failed\");\n }\n }\n\n // ── Rate Limiting ─────────────────────────────────────────────────\n\n private checkRateLimit(entry: IServerEntry, serverName: string): void {\n const now = Date.now();\n const windowStart = now - RATE_LIMIT_WINDOW_MS;\n\n // Prune timestamps outside the window\n entry.rateLimit.callTimestamps = entry.rateLimit.callTimestamps.filter(\n (ts) => ts > windowStart,\n );\n\n if (entry.rateLimit.callTimestamps.length >= entry.rateLimit.maxCallsPerMinute) {\n throw new ServerConnectionError(\n serverName,\n `Rate limit exceeded: ${entry.rateLimit.maxCallsPerMinute} calls/minute`,\n );\n }\n }\n\n private getMaxCallsPerMinute(serverName: string): number {\n const perServer = this.options.rateLimits?.[serverName];\n if (perServer) {\n return perServer.maxCallsPerMinute;\n }\n return this.options.defaultRateLimit?.maxCallsPerMinute ?? DEFAULT_MAX_CALLS_PER_MINUTE;\n }\n\n // ── Helpers ───────────────────────────────────────────────────────\n\n private requireServer(name: string): IServerEntry {\n const entry = this.servers.get(name);\n if (!entry || entry.status !== \"connected\") {\n throw new ServerConnectionError(name, \"Server not connected\");\n }\n return entry;\n }\n}\n"]}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
|
|
2
|
+
import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-ZGOHARPV.js';
|
|
3
|
+
import { logger } from './chunk-JAXXTYID.js';
|
|
4
|
+
|
|
5
|
+
// src/providers/kimi-adapter.ts
|
|
6
|
+
var PROVIDER_NAME = "kimi";
|
|
7
|
+
var DEFAULT_BASE_URL = "https://api.moonshot.cn/v1";
|
|
8
|
+
var KIMI_MODELS = ["kimi-for-coding"];
|
|
9
|
+
var CHARS_PER_TOKEN_ESTIMATE = 4;
|
|
10
|
+
function convertMessages(messages) {
|
|
11
|
+
return messages.map((msg) => ({
|
|
12
|
+
role: msg.role,
|
|
13
|
+
content: msg.content
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
function convertTools(tools) {
|
|
17
|
+
if (tools === void 0 || tools.length === 0) {
|
|
18
|
+
return void 0;
|
|
19
|
+
}
|
|
20
|
+
return tools.map((tool) => {
|
|
21
|
+
const properties = {};
|
|
22
|
+
const required = [];
|
|
23
|
+
for (const param of tool.parameters) {
|
|
24
|
+
const prop = {
|
|
25
|
+
type: param.type,
|
|
26
|
+
description: param.description
|
|
27
|
+
};
|
|
28
|
+
if (param.enum !== void 0) {
|
|
29
|
+
prop["enum"] = param.enum;
|
|
30
|
+
}
|
|
31
|
+
properties[param.name] = prop;
|
|
32
|
+
if (param.required) {
|
|
33
|
+
required.push(param.name);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
type: "function",
|
|
38
|
+
function: {
|
|
39
|
+
name: tool.name,
|
|
40
|
+
description: tool.description,
|
|
41
|
+
parameters: { type: "object", properties, required }
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function computeCost(modelInfo, inputTokens, outputTokens) {
|
|
47
|
+
return inputTokens / 1e6 * modelInfo.inputPricePerMToken + outputTokens / 1e6 * modelInfo.outputPricePerMToken;
|
|
48
|
+
}
|
|
49
|
+
async function handleResponseError(response, model) {
|
|
50
|
+
const body = await response.text();
|
|
51
|
+
if (response.status === 401 || response.status === 403) {
|
|
52
|
+
throw new AuthenticationError(PROVIDER_NAME, body);
|
|
53
|
+
}
|
|
54
|
+
if (response.status === 429) {
|
|
55
|
+
const retryHeader = response.headers.get("retry-after");
|
|
56
|
+
const retryMs = retryHeader !== null ? parseInt(retryHeader, 10) * 1e3 : 6e4;
|
|
57
|
+
throw new RateLimitError(PROVIDER_NAME, retryMs);
|
|
58
|
+
}
|
|
59
|
+
if (response.status === 404) {
|
|
60
|
+
throw new ModelNotFoundError(model);
|
|
61
|
+
}
|
|
62
|
+
throw new Error(`Kimi API error (${response.status}): ${body}`);
|
|
63
|
+
}
|
|
64
|
+
var KimiAdapter = class {
|
|
65
|
+
name = PROVIDER_NAME;
|
|
66
|
+
supportedModels = KIMI_MODELS;
|
|
67
|
+
baseUrl;
|
|
68
|
+
apiKey;
|
|
69
|
+
constructor(options) {
|
|
70
|
+
this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;
|
|
71
|
+
this.apiKey = options?.apiKey ?? process.env["MOONSHOT_API_KEY"] ?? "";
|
|
72
|
+
}
|
|
73
|
+
async chat(request) {
|
|
74
|
+
const modelInfo = this.getModelInfo(request.model);
|
|
75
|
+
const messages = convertMessages(request.messages);
|
|
76
|
+
const tools = convertTools(request.tools);
|
|
77
|
+
if (request.system !== void 0) {
|
|
78
|
+
messages.unshift({ role: "system", content: request.system });
|
|
79
|
+
}
|
|
80
|
+
const body = {
|
|
81
|
+
model: request.model,
|
|
82
|
+
messages,
|
|
83
|
+
max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,
|
|
84
|
+
stream: false
|
|
85
|
+
};
|
|
86
|
+
if (request.temperature !== void 0) {
|
|
87
|
+
body["temperature"] = request.temperature;
|
|
88
|
+
}
|
|
89
|
+
if (tools !== void 0) {
|
|
90
|
+
body["tools"] = tools;
|
|
91
|
+
}
|
|
92
|
+
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
93
|
+
method: "POST",
|
|
94
|
+
headers: {
|
|
95
|
+
"Content-Type": "application/json",
|
|
96
|
+
Authorization: `Bearer ${this.apiKey}`
|
|
97
|
+
},
|
|
98
|
+
body: JSON.stringify(body)
|
|
99
|
+
});
|
|
100
|
+
if (!response.ok) {
|
|
101
|
+
await handleResponseError(response, request.model);
|
|
102
|
+
}
|
|
103
|
+
const data = await response.json();
|
|
104
|
+
const choice = data.choices[0];
|
|
105
|
+
if (choice === void 0) {
|
|
106
|
+
throw new Error("Kimi API returned empty choices");
|
|
107
|
+
}
|
|
108
|
+
const toolCalls = extractToolCalls(choice);
|
|
109
|
+
const inputTokens = data.usage.prompt_tokens;
|
|
110
|
+
const outputTokens = data.usage.completion_tokens;
|
|
111
|
+
const usage = {
|
|
112
|
+
inputTokens,
|
|
113
|
+
outputTokens,
|
|
114
|
+
totalTokens: inputTokens + outputTokens,
|
|
115
|
+
costUsd: computeCost(modelInfo, inputTokens, outputTokens)
|
|
116
|
+
};
|
|
117
|
+
const responseMessage = {
|
|
118
|
+
id: data.id,
|
|
119
|
+
role: "assistant",
|
|
120
|
+
content: choice.message.content ?? "",
|
|
121
|
+
model: request.model,
|
|
122
|
+
provider: PROVIDER_NAME,
|
|
123
|
+
toolCalls: toolCalls.length > 0 ? toolCalls : void 0,
|
|
124
|
+
tokenUsage: usage,
|
|
125
|
+
createdAt: /* @__PURE__ */ new Date()
|
|
126
|
+
};
|
|
127
|
+
return {
|
|
128
|
+
id: data.id,
|
|
129
|
+
model: request.model,
|
|
130
|
+
provider: PROVIDER_NAME,
|
|
131
|
+
message: responseMessage,
|
|
132
|
+
usage,
|
|
133
|
+
finishReason: mapFinishReason(choice.finish_reason)
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
async *stream(request) {
|
|
137
|
+
const modelInfo = this.getModelInfo(request.model);
|
|
138
|
+
const messages = convertMessages(request.messages);
|
|
139
|
+
const tools = convertTools(request.tools);
|
|
140
|
+
if (request.system !== void 0) {
|
|
141
|
+
messages.unshift({ role: "system", content: request.system });
|
|
142
|
+
}
|
|
143
|
+
const body = {
|
|
144
|
+
model: request.model,
|
|
145
|
+
messages,
|
|
146
|
+
max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,
|
|
147
|
+
stream: true
|
|
148
|
+
};
|
|
149
|
+
if (request.temperature !== void 0) {
|
|
150
|
+
body["temperature"] = request.temperature;
|
|
151
|
+
}
|
|
152
|
+
if (tools !== void 0) {
|
|
153
|
+
body["tools"] = tools;
|
|
154
|
+
}
|
|
155
|
+
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
156
|
+
method: "POST",
|
|
157
|
+
headers: {
|
|
158
|
+
"Content-Type": "application/json",
|
|
159
|
+
Authorization: `Bearer ${this.apiKey}`
|
|
160
|
+
},
|
|
161
|
+
body: JSON.stringify(body)
|
|
162
|
+
});
|
|
163
|
+
if (!response.ok) {
|
|
164
|
+
await handleResponseError(response, request.model);
|
|
165
|
+
}
|
|
166
|
+
if (response.body === null) {
|
|
167
|
+
yield { type: "error", error: "Kimi API returned empty stream body" };
|
|
168
|
+
yield { type: "done" };
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
yield* this.parseSSEStream(response.body, modelInfo);
|
|
173
|
+
yield { type: "done" };
|
|
174
|
+
} catch (error) {
|
|
175
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
176
|
+
logger.error({ error: errMsg, model: request.model }, "Kimi stream error");
|
|
177
|
+
yield { type: "error", error: errMsg };
|
|
178
|
+
yield { type: "done" };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async countTokens(text, _model) {
|
|
182
|
+
return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);
|
|
183
|
+
}
|
|
184
|
+
getModelInfo(model) {
|
|
185
|
+
const info = SUPPORTED_MODELS[model];
|
|
186
|
+
if (info === void 0 || info.provider !== PROVIDER_NAME) {
|
|
187
|
+
throw new ModelNotFoundError(model);
|
|
188
|
+
}
|
|
189
|
+
return info;
|
|
190
|
+
}
|
|
191
|
+
async listAvailableModels() {
|
|
192
|
+
if (!this.apiKey) return [...this.supportedModels];
|
|
193
|
+
try {
|
|
194
|
+
const response = await fetch(`${this.baseUrl}/models`, {
|
|
195
|
+
headers: { Authorization: `Bearer ${this.apiKey}` },
|
|
196
|
+
signal: AbortSignal.timeout(5e3)
|
|
197
|
+
});
|
|
198
|
+
if (!response.ok) return [...this.supportedModels];
|
|
199
|
+
const data = await response.json();
|
|
200
|
+
const models = data.data.map((m) => m.id).sort();
|
|
201
|
+
return models.length > 0 ? models : [...this.supportedModels];
|
|
202
|
+
} catch {
|
|
203
|
+
return [...this.supportedModels];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async *parseSSEStream(body, modelInfo) {
|
|
207
|
+
const reader = body.getReader();
|
|
208
|
+
const decoder = new TextDecoder();
|
|
209
|
+
let buffer = "";
|
|
210
|
+
try {
|
|
211
|
+
for (; ; ) {
|
|
212
|
+
const { done, value } = await reader.read();
|
|
213
|
+
if (done) {
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
buffer += decoder.decode(value, { stream: true });
|
|
217
|
+
const lines = buffer.split("\n");
|
|
218
|
+
buffer = lines.pop() ?? "";
|
|
219
|
+
for (const line of lines) {
|
|
220
|
+
const trimmed = line.trim();
|
|
221
|
+
if (trimmed === "" || trimmed === "data: [DONE]") {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (!trimmed.startsWith("data: ")) {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
const jsonStr = trimmed.slice(6);
|
|
228
|
+
let parsed;
|
|
229
|
+
try {
|
|
230
|
+
parsed = JSON.parse(jsonStr);
|
|
231
|
+
} catch {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const delta = parsed.choices?.[0]?.delta;
|
|
235
|
+
if (delta?.content !== void 0 && delta.content !== "") {
|
|
236
|
+
yield { type: "text", content: delta.content };
|
|
237
|
+
}
|
|
238
|
+
if (delta?.tool_calls !== void 0) {
|
|
239
|
+
for (const tc of delta.tool_calls) {
|
|
240
|
+
if (tc.id !== void 0 && tc.function?.name !== void 0) {
|
|
241
|
+
let args = {};
|
|
242
|
+
if (tc.function.arguments !== void 0) {
|
|
243
|
+
try {
|
|
244
|
+
args = JSON.parse(tc.function.arguments);
|
|
245
|
+
} catch {
|
|
246
|
+
args = {};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const toolCall = {
|
|
250
|
+
id: tc.id,
|
|
251
|
+
name: tc.function.name,
|
|
252
|
+
arguments: args
|
|
253
|
+
};
|
|
254
|
+
yield { type: "tool_call", toolCall };
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (parsed.usage !== void 0) {
|
|
259
|
+
const inTok = parsed.usage.prompt_tokens;
|
|
260
|
+
const outTok = parsed.usage.completion_tokens;
|
|
261
|
+
yield {
|
|
262
|
+
type: "usage",
|
|
263
|
+
usage: {
|
|
264
|
+
inputTokens: inTok,
|
|
265
|
+
outputTokens: outTok,
|
|
266
|
+
totalTokens: inTok + outTok,
|
|
267
|
+
costUsd: computeCost(modelInfo, inTok, outTok)
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
} finally {
|
|
274
|
+
reader.releaseLock();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
function extractToolCalls(choice) {
|
|
279
|
+
if (choice.message.tool_calls === void 0 || choice.message.tool_calls.length === 0) {
|
|
280
|
+
return [];
|
|
281
|
+
}
|
|
282
|
+
return choice.message.tool_calls.map((tc) => {
|
|
283
|
+
let args = {};
|
|
284
|
+
try {
|
|
285
|
+
args = JSON.parse(tc.function.arguments);
|
|
286
|
+
} catch {
|
|
287
|
+
args = {};
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
id: tc.id,
|
|
291
|
+
name: tc.function.name,
|
|
292
|
+
arguments: args
|
|
293
|
+
};
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
function mapFinishReason(reason) {
|
|
297
|
+
switch (reason) {
|
|
298
|
+
case "stop":
|
|
299
|
+
return "stop";
|
|
300
|
+
case "tool_calls":
|
|
301
|
+
return "tool_calls";
|
|
302
|
+
case "length":
|
|
303
|
+
return "max_tokens";
|
|
304
|
+
default:
|
|
305
|
+
return "stop";
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export { KimiAdapter };
|
|
310
|
+
//# sourceMappingURL=chunk-MXZSI3AY.js.map
|
|
311
|
+
//# sourceMappingURL=chunk-MXZSI3AY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/kimi-adapter.ts"],"names":[],"mappings":"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","file":"chunk-MXZSI3AY.js","sourcesContent":["/**\n * Kimi (Moonshot) adapter — custom HTTP per PRD section 7.1\n * Uses OpenAI-compatible API format via fetch().\n * Supports Kimi Code (kimi-for-coding)\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport {\n AuthenticationError,\n RateLimitError,\n ModelNotFoundError,\n} from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\nimport type {\n IChatRequest,\n IChatResponse,\n IChatMessage,\n IStreamChunk,\n IToolCall,\n IToolDefinition,\n ITokenUsage,\n} from \"../types/message.js\";\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\n\nconst PROVIDER_NAME: ProviderName = \"kimi\";\nconst DEFAULT_BASE_URL = \"https://api.moonshot.cn/v1\";\n\nconst KIMI_MODELS: readonly string[] = [\"kimi-for-coding\"] as const;\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\n\ninterface OpenAIMessage { role: string; content: string }\ninterface OpenAITool { type: \"function\"; function: { name: string; description: string; parameters: Record<string, unknown> } }\ninterface OpenAIToolCallRef { id: string; type: string; function: { name: string; arguments: string } }\ninterface OpenAIChoice {\n index: number;\n message: { role: string; content: string | null; tool_calls?: readonly OpenAIToolCallRef[] };\n finish_reason: string;\n}\ninterface OpenAIUsage { prompt_tokens: number; completion_tokens: number; total_tokens: number }\ninterface OpenAIChatResponse { id: string; choices: OpenAIChoice[]; usage: OpenAIUsage }\n\nfunction convertMessages(messages: readonly IChatMessage[]): OpenAIMessage[] {\n return messages.map((msg) => ({\n role: msg.role,\n content: msg.content,\n }));\n}\n\nfunction convertTools(tools: readonly IToolDefinition[] | undefined): OpenAITool[] | undefined {\n if (tools === undefined || tools.length === 0) {\n return undefined;\n }\n return tools.map((tool) => {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const param of tool.parameters) {\n const prop: Record<string, unknown> = {\n type: param.type,\n description: param.description,\n };\n if (param.enum !== undefined) {\n prop[\"enum\"] = param.enum;\n }\n properties[param.name] = prop;\n if (param.required) {\n required.push(param.name);\n }\n }\n return {\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: { type: \"object\", properties, required },\n },\n };\n });\n}\n\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\n return (\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\n );\n}\n\nasync function handleResponseError(response: Response, model: string): Promise<never> {\n const body = await response.text();\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError(PROVIDER_NAME, body);\n }\n if (response.status === 429) {\n const retryHeader = response.headers.get(\"retry-after\");\n const retryMs = retryHeader !== null ? parseInt(retryHeader, 10) * 1000 : 60_000;\n throw new RateLimitError(PROVIDER_NAME, retryMs);\n }\n if (response.status === 404) {\n throw new ModelNotFoundError(model);\n }\n throw new Error(`Kimi API error (${response.status}): ${body}`);\n}\n\nexport class KimiAdapter implements IModelProvider {\n readonly name = PROVIDER_NAME;\n readonly supportedModels = KIMI_MODELS;\n\n private readonly baseUrl: string;\n private readonly apiKey: string;\n\n constructor(options?: IProviderOptions) {\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;\n this.apiKey = options?.apiKey ?? process.env[\"MOONSHOT_API_KEY\"] ?? \"\";\n }\n\n async chat(request: IChatRequest): Promise<IChatResponse> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = convertMessages(request.messages);\n const tools = convertTools(request.tools);\n\n if (request.system !== undefined) {\n messages.unshift({ role: \"system\", content: request.system });\n }\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages,\n max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n stream: false,\n };\n if (request.temperature !== undefined) {\n body[\"temperature\"] = request.temperature;\n }\n if (tools !== undefined) {\n body[\"tools\"] = tools;\n }\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n await handleResponseError(response, request.model);\n }\n\n const data = (await response.json()) as OpenAIChatResponse;\n const choice = data.choices[0];\n if (choice === undefined) {\n throw new Error(\"Kimi API returned empty choices\");\n }\n\n const toolCalls = extractToolCalls(choice);\n const inputTokens = data.usage.prompt_tokens;\n const outputTokens = data.usage.completion_tokens;\n\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\n };\n\n const responseMessage: IChatMessage = {\n id: data.id,\n role: \"assistant\",\n content: choice.message.content ?? \"\",\n model: request.model,\n provider: PROVIDER_NAME,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n tokenUsage: usage,\n createdAt: new Date(),\n };\n\n return {\n id: data.id,\n model: request.model,\n provider: PROVIDER_NAME,\n message: responseMessage,\n usage,\n finishReason: mapFinishReason(choice.finish_reason),\n };\n }\n\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = convertMessages(request.messages);\n const tools = convertTools(request.tools);\n\n if (request.system !== undefined) {\n messages.unshift({ role: \"system\", content: request.system });\n }\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages,\n max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n stream: true,\n };\n if (request.temperature !== undefined) {\n body[\"temperature\"] = request.temperature;\n }\n if (tools !== undefined) {\n body[\"tools\"] = tools;\n }\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n await handleResponseError(response, request.model);\n }\n\n if (response.body === null) {\n yield { type: \"error\", error: \"Kimi API returned empty stream body\" };\n yield { type: \"done\" };\n return;\n }\n\n try {\n yield* this.parseSSEStream(response.body, modelInfo);\n yield { type: \"done\" };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error({ error: errMsg, model: request.model }, \"Kimi stream error\");\n yield { type: \"error\", error: errMsg };\n yield { type: \"done\" };\n }\n }\n\n async countTokens(text: string, _model: string): Promise<number> {\n return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);\n }\n\n getModelInfo(model: string): IModelInfo {\n const info = SUPPORTED_MODELS[model];\n if (info === undefined || info.provider !== PROVIDER_NAME) {\n throw new ModelNotFoundError(model);\n }\n return info;\n }\n\n async listAvailableModels(): Promise<readonly string[]> {\n if (!this.apiKey) return [...this.supportedModels];\n\n try {\n const response = await fetch(`${this.baseUrl}/models`, {\n headers: { Authorization: `Bearer ${this.apiKey}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!response.ok) return [...this.supportedModels];\n\n const data = (await response.json()) as { data: Array<{ id: string }> };\n const models = data.data.map((m) => m.id).sort();\n return models.length > 0 ? models : [...this.supportedModels];\n } catch {\n return [...this.supportedModels];\n }\n }\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n modelInfo: IModelInfo,\n ): AsyncIterable<IStreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed === \"data: [DONE]\") {\n continue;\n }\n if (!trimmed.startsWith(\"data: \")) {\n continue;\n }\n\n const jsonStr = trimmed.slice(6);\n let parsed: {\n choices?: Array<{\n delta?: {\n content?: string;\n tool_calls?: Array<{\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n }>;\n usage?: OpenAIUsage;\n };\n\n try {\n parsed = JSON.parse(jsonStr) as typeof parsed;\n } catch {\n continue;\n }\n\n const delta = parsed.choices?.[0]?.delta;\n if (delta?.content !== undefined && delta.content !== \"\") {\n yield { type: \"text\", content: delta.content };\n }\n\n if (delta?.tool_calls !== undefined) {\n for (const tc of delta.tool_calls) {\n if (tc.id !== undefined && tc.function?.name !== undefined) {\n let args: Record<string, unknown> = {};\n if (tc.function.arguments !== undefined) {\n try {\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n args = {};\n }\n }\n const toolCall: IToolCall = {\n id: tc.id,\n name: tc.function.name,\n arguments: args,\n };\n yield { type: \"tool_call\", toolCall };\n }\n }\n }\n\n if (parsed.usage !== undefined) {\n const inTok = parsed.usage.prompt_tokens;\n const outTok = parsed.usage.completion_tokens;\n yield {\n type: \"usage\",\n usage: {\n inputTokens: inTok,\n outputTokens: outTok,\n totalTokens: inTok + outTok,\n costUsd: computeCost(modelInfo, inTok, outTok),\n },\n };\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\nfunction extractToolCalls(choice: OpenAIChoice): IToolCall[] {\n if (choice.message.tool_calls === undefined || choice.message.tool_calls.length === 0) {\n return [];\n }\n return choice.message.tool_calls.map((tc) => {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n args = {};\n }\n return {\n id: tc.id,\n name: tc.function.name,\n arguments: args,\n };\n });\n}\n\nfunction mapFinishReason(\n reason: string,\n): \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\" {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"tool_calls\":\n return \"tool_calls\";\n case \"length\":\n return \"max_tokens\";\n default:\n return \"stop\";\n }\n}\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { homedir } from 'os';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
4
|
+
|
|
5
|
+
// src/utils/pathResolver.ts
|
|
6
|
+
var AEMEATHCLI_HOME = join(homedir(), ".aemeathcli");
|
|
7
|
+
function getAemeathHome() {
|
|
8
|
+
return process.env["AEMEATHCLI_HOME"] ?? AEMEATHCLI_HOME;
|
|
9
|
+
}
|
|
10
|
+
function getConfigDir() {
|
|
11
|
+
return getAemeathHome();
|
|
12
|
+
}
|
|
13
|
+
function getConfigPath() {
|
|
14
|
+
return join(getConfigDir(), "config.json");
|
|
15
|
+
}
|
|
16
|
+
function getDatabaseDir() {
|
|
17
|
+
return join(getAemeathHome(), "db");
|
|
18
|
+
}
|
|
19
|
+
function getDatabasePath() {
|
|
20
|
+
return join(getDatabaseDir(), "aemeathcli.db");
|
|
21
|
+
}
|
|
22
|
+
function getLogDir() {
|
|
23
|
+
return join(getAemeathHome(), "logs");
|
|
24
|
+
}
|
|
25
|
+
function getCredentialsPath() {
|
|
26
|
+
return join(getAemeathHome(), "credentials.enc");
|
|
27
|
+
}
|
|
28
|
+
function getUserSkillsDir() {
|
|
29
|
+
return join(getAemeathHome(), "skills");
|
|
30
|
+
}
|
|
31
|
+
function getTeamsDir() {
|
|
32
|
+
return join(getAemeathHome(), "teams");
|
|
33
|
+
}
|
|
34
|
+
function getTasksDir() {
|
|
35
|
+
return join(getAemeathHome(), "tasks");
|
|
36
|
+
}
|
|
37
|
+
function getProjectConfigDir(projectRoot) {
|
|
38
|
+
return join(projectRoot, ".aemeathcli");
|
|
39
|
+
}
|
|
40
|
+
function getProjectConfigPath(projectRoot) {
|
|
41
|
+
return join(getProjectConfigDir(projectRoot), "config.json");
|
|
42
|
+
}
|
|
43
|
+
function getProjectSkillsDir(projectRoot) {
|
|
44
|
+
return join(getProjectConfigDir(projectRoot), "skills");
|
|
45
|
+
}
|
|
46
|
+
function getIPCSocketDir() {
|
|
47
|
+
const tmpDir = process.env["TMPDIR"] ?? "/tmp";
|
|
48
|
+
return join(tmpDir, `aemeathcli-${process.getuid?.() ?? "user"}`);
|
|
49
|
+
}
|
|
50
|
+
function getIPCSocketPath(sessionId) {
|
|
51
|
+
return join(getIPCSocketDir(), `${sessionId}.sock`);
|
|
52
|
+
}
|
|
53
|
+
function ensureDirectory(dirPath, mode) {
|
|
54
|
+
if (!existsSync(dirPath)) {
|
|
55
|
+
mkdirSync(dirPath, { recursive: true, mode: mode ?? 493 });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function ensureSecureDirectory(dirPath) {
|
|
59
|
+
ensureDirectory(dirPath, 448);
|
|
60
|
+
}
|
|
61
|
+
function initializeDirectories() {
|
|
62
|
+
ensureSecureDirectory(getAemeathHome());
|
|
63
|
+
ensureDirectory(getDatabaseDir());
|
|
64
|
+
ensureSecureDirectory(getLogDir());
|
|
65
|
+
ensureDirectory(getUserSkillsDir());
|
|
66
|
+
ensureDirectory(getTeamsDir());
|
|
67
|
+
ensureDirectory(getTasksDir());
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { ensureDirectory, ensureSecureDirectory, getAemeathHome, getConfigPath, getCredentialsPath, getDatabaseDir, getDatabasePath, getIPCSocketDir, getIPCSocketPath, getProjectConfigPath, getProjectSkillsDir, getTasksDir, getTeamsDir, getUserSkillsDir, initializeDirectories };
|
|
71
|
+
//# sourceMappingURL=chunk-NBR3GHMT.js.map
|
|
72
|
+
//# sourceMappingURL=chunk-NBR3GHMT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/pathResolver.ts"],"names":[],"mappings":";;;;;AAWA,IAAM,eAAA,GAAkB,IAAA,CAAK,OAAA,EAAQ,EAAG,aAAa,CAAA;AAE9C,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA,IAAK,eAAA;AAC3C;AAEO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,cAAA,EAAe;AACxB;AAEO,SAAS,aAAA,GAAwB;AACtC,EAAA,OAAO,IAAA,CAAK,YAAA,EAAa,EAAG,aAAa,CAAA;AAC3C;AAEO,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,IAAI,CAAA;AACpC;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,eAAe,CAAA;AAC/C;AAEO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,MAAM,CAAA;AACtC;AAEO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,iBAAiB,CAAA;AACjD;AAMO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,QAAQ,CAAA;AACxC;AAEO,SAAS,WAAA,GAAsB;AACpC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,OAAO,CAAA;AACvC;AAEO,SAAS,WAAA,GAAsB;AACpC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,OAAO,CAAA;AACvC;AAIO,SAAS,oBAAoB,WAAA,EAA6B;AAC/D,EAAA,OAAO,IAAA,CAAK,aAAa,aAAa,CAAA;AACxC;AAEO,SAAS,qBAAqB,WAAA,EAA6B;AAChE,EAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,WAAW,CAAA,EAAG,aAAa,CAAA;AAC7D;AAEO,SAAS,oBAAoB,WAAA,EAA6B;AAC/D,EAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,WAAW,CAAA,EAAG,QAAQ,CAAA;AACxD;AAYO,SAAS,eAAA,GAA0B;AACxC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAA;AACxC,EAAA,OAAO,KAAK,MAAA,EAAQ,CAAA,WAAA,EAAc,QAAQ,MAAA,IAAS,IAAK,MAAM,CAAA,CAAE,CAAA;AAClE;AAEO,SAAS,iBAAiB,SAAA,EAA2B;AAC1D,EAAA,OAAO,IAAA,CAAK,eAAA,EAAgB,EAAG,CAAA,EAAG,SAAS,CAAA,KAAA,CAAO,CAAA;AACpD;AAIO,SAAS,eAAA,CAAgB,SAAiB,IAAA,EAAqB;AACpE,EAAA,IAAI,CAAC,UAAA,CAAW,OAAO,CAAA,EAAG;AACxB,IAAA,SAAA,CAAU,SAAS,EAAE,SAAA,EAAW,MAAM,IAAA,EAAM,IAAA,IAAQ,KAAO,CAAA;AAAA,EAC7D;AACF;AAEO,SAAS,sBAAsB,OAAA,EAAuB;AAC3D,EAAA,eAAA,CAAgB,SAAS,GAAK,CAAA;AAChC;AAEO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,qBAAA,CAAsB,gBAAgB,CAAA;AACtC,EAAA,eAAA,CAAgB,gBAAgB,CAAA;AAChC,EAAA,qBAAA,CAAsB,WAAW,CAAA;AACjC,EAAA,eAAA,CAAgB,kBAAkB,CAAA;AAClC,EAAA,eAAA,CAAgB,aAAa,CAAA;AAC7B,EAAA,eAAA,CAAgB,aAAa,CAAA;AAC/B","file":"chunk-NBR3GHMT.js","sourcesContent":["/**\n * Safe path handling per PRD section 15.7 item 5\n * NO hardcoded paths — use path.join(), os.homedir(), XDG Base Directory\n */\n\nimport { homedir } from \"node:os\";\nimport { join, resolve, dirname } from \"node:path\";\nimport { existsSync, mkdirSync } from \"node:fs\";\n\n// ── XDG-inspired directory layout ────────────────────────────────────────\n\nconst AEMEATHCLI_HOME = join(homedir(), \".aemeathcli\");\n\nexport function getAemeathHome(): string {\n return process.env[\"AEMEATHCLI_HOME\"] ?? AEMEATHCLI_HOME;\n}\n\nexport function getConfigDir(): string {\n return getAemeathHome();\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport function getDatabaseDir(): string {\n return join(getAemeathHome(), \"db\");\n}\n\nexport function getDatabasePath(): string {\n return join(getDatabaseDir(), \"aemeathcli.db\");\n}\n\nexport function getLogDir(): string {\n return join(getAemeathHome(), \"logs\");\n}\n\nexport function getCredentialsPath(): string {\n return join(getAemeathHome(), \"credentials.enc\");\n}\n\nexport function getMCPConfigPath(): string {\n return join(getAemeathHome(), \"mcp.json\");\n}\n\nexport function getUserSkillsDir(): string {\n return join(getAemeathHome(), \"skills\");\n}\n\nexport function getTeamsDir(): string {\n return join(getAemeathHome(), \"teams\");\n}\n\nexport function getTasksDir(): string {\n return join(getAemeathHome(), \"tasks\");\n}\n\n// ── Project-level paths ──────────────────────────────────────────────────\n\nexport function getProjectConfigDir(projectRoot: string): string {\n return join(projectRoot, \".aemeathcli\");\n}\n\nexport function getProjectConfigPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"config.json\");\n}\n\nexport function getProjectSkillsDir(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"skills\");\n}\n\nexport function getProjectMCPConfigPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"mcp.json\");\n}\n\nexport function getProjectAgentsPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"AGENTS.md\");\n}\n\n// ── Socket paths (PRD section 14.5) ──────────────────────────────────────\n\nexport function getIPCSocketDir(): string {\n const tmpDir = process.env[\"TMPDIR\"] ?? \"/tmp\";\n return join(tmpDir, `aemeathcli-${process.getuid?.() ?? \"user\"}`);\n}\n\nexport function getIPCSocketPath(sessionId: string): string {\n return join(getIPCSocketDir(), `${sessionId}.sock`);\n}\n\n// ── Directory Initialization ─────────────────────────────────────────────\n\nexport function ensureDirectory(dirPath: string, mode?: number): void {\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true, mode: mode ?? 0o755 });\n }\n}\n\nexport function ensureSecureDirectory(dirPath: string): void {\n ensureDirectory(dirPath, 0o700);\n}\n\nexport function initializeDirectories(): void {\n ensureSecureDirectory(getAemeathHome());\n ensureDirectory(getDatabaseDir());\n ensureSecureDirectory(getLogDir());\n ensureDirectory(getUserSkillsDir());\n ensureDirectory(getTeamsDir());\n ensureDirectory(getTasksDir());\n}\n\n// ── Project Root Detection ───────────────────────────────────────────────\n\nexport function findProjectRoot(startDir?: string): string {\n let currentDir = startDir ?? process.cwd();\n\n while (currentDir !== dirname(currentDir)) {\n if (existsSync(join(currentDir, \".git\"))) {\n return currentDir;\n }\n if (existsSync(join(currentDir, \".aemeathcli\"))) {\n return currentDir;\n }\n if (existsSync(join(currentDir, \"package.json\"))) {\n return currentDir;\n }\n currentDir = dirname(currentDir);\n }\n\n // Fallback to cwd\n return process.cwd();\n}\n"]}
|